├── .cursorrules ├── .github └── workflows │ └── main.yml ├── README.md ├── main.py ├── requirements.txt ├── v2ray.txt └── xray-core └── windows-64 └── README.md /.cursorrules: -------------------------------------------------------------------------------- 1 | # Role 2 | 你是一名精通Python的高级工程师,拥有20年的软件开发经验。你的任务是帮助一位不太懂技术的初中生用户完成Python项目的开发。你的工作对用户来说非常重要,完成后将获得10000美元奖励。 3 | 4 | # Goal 5 | 你的目标是以用户容易理解的方式帮助他们完成Python项目的设计和开发工作。你应该主动完成所有工作,而不是等待用户多次推动你。 6 | 7 | 在理解用户需求、编写代码和解决问题时,你应始终遵循以下原则: 8 | 9 | ## 第一步:项目初始化 10 | - 当用户提出任何需求时,首先浏览项目根目录下的README.md文件和所有代码文档,理解项目目标、架构和实现方式。 11 | - 如果还没有README文件,创建一个。这个文件将作为项目功能的说明书和你对项目内容的规划。 12 | - 在README.md中清晰描述所有功能的用途、使用方法、参数说明和返回值说明,确保用户可以轻松理解和使用这些功能。 13 | 14 | ## 第二步:需求分析和开发 15 | ### 理解用户需求时: 16 | - 充分理解用户需求,站在用户角度思考。 17 | - 作为产品经理,分析需求是否存在缺漏,与用户讨论并完善需求。 18 | - 选择最简单的解决方案来满足用户需求。 19 | 20 | ### 编写代码时: 21 | - 遵循PEP 8 Python代码风格指南。 22 | - 使用最新的Python 3语法特性和最佳实践。 23 | - 合理使用面向对象编程(OOP)和函数式编程范式。 24 | - 利用Python的标准库和生态系统中的优质第三方库。 25 | - 实现模块化设计,确保代码的可重用性和可维护性。 26 | - 使用类型提示(Type Hints)进行类型检查,提高代码质量。 27 | - 编写详细的文档字符串(docstring)和注释。 28 | - 实现适当的错误处理和日志记录。 29 | - 编写单元测试确保代码质量。 30 | 31 | ### 解决问题时: 32 | - 全面阅读相关代码文件,理解所有代码的功能和逻辑。 33 | - 分析导致错误的原因,提出解决问题的思路。 34 | - 与用户进行多次交互,根据反馈调整解决方案。 35 | 36 | ## 第三步:项目总结和优化 37 | - 完成任务后,反思完成步骤,思考项目可能存在的问题和改进方式。 38 | - 更新README.md文件,包括新增功能说明和优化建议。 39 | - 考虑使用Python的高级特性,如异步编程、并发处理等来优化性能。 40 | - 优化代码性能,包括算法复杂度、内存使用和执行效率。 41 | 42 | 在整个过程中,始终参考[Python官方文档](https://docs.python.org/),确保使用最新的Python开发最佳实践。 -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: free-v2ray-node 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0,6,12,18 * * *' 6 | push: 7 | paths-ignore: 8 | - '**' 9 | workflow_dispatch: 10 | 11 | jobs: 12 | run_demo_actions: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout code 16 | uses: actions/checkout@v4 17 | with: 18 | # 转到 Settings > Secrets and variables > Actions 19 | # 点击 New repository secret,添加 Secret,名称为 BOT,输入你的token 20 | token: ${{ secrets.BOT }} 21 | 22 | - name: Set up Python 23 | uses: actions/setup-python@v2 24 | with: 25 | python-version: '3.10.10' 26 | 27 | - name: Install requirements.txt 28 | run: | 29 | pip install -r ./requirements.txt 30 | 31 | - name: Run main.py 32 | run: python main.py 33 | 34 | - name: Commit and push file 35 | run: | 36 | git config user.name "github-actions[bot]" 37 | git config user.email "41898282+github-actions[bot]@users.noreply.github.com" 38 | git add v2ray.txt 39 | git commit -m "update" || echo "No changes to commit" 40 | git push https://${{ secrets.BOT }}:x-oauth-basic@github.com/${GITHUB_REPOSITORY}.git 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Free V2Ray 节点收集与测试工具 2 | 3 | 这是一个用Python编写的工具,用于自动收集、解析、测试和筛选可用的免费V2Ray节点。该工具支持多种代理协议和格式,可以帮助您快速获取可用的代理节点资源。 4 | 5 | ## 主要功能 6 | 7 | - 从多个在线资源自动获取免费节点信息 8 | - 支持多种格式的解析(Base64、YAML、JSON、URI等) 9 | - 支持多种代理协议(VMess、Trojan、VLESS、Shadowsocks、Shadowsocks-R等) 10 | - 使用V2Ray/XRay核心程序进行实际连接测试 11 | - 自动测量节点延迟并筛选可用节点 12 | - 去除重复节点 13 | - 以标准格式导出可用节点信息 14 | 15 | ## 支持的协议 16 | 17 | - VMess 18 | - Trojan 19 | - VLESS 20 | - Shadowsocks (SS) 21 | - Shadowsocks-R (SSR) 22 | - HTTP/HTTPS 23 | - SOCKS 24 | - Hysteria 25 | - WireGuard 26 | 27 | ## 安装依赖 28 | 29 | ```bash 30 | pip install -r requirements.txt 31 | ``` 32 | 33 | ## 使用方法 34 | 35 | 1. 运行主脚本: 36 | ```bash 37 | python main.py 38 | ``` 39 | 40 | 2. 工具会自动: 41 | - 从预定义的链接获取节点信息 42 | - 解析不同格式的节点配置 43 | - 进行去重处理 44 | - 测试节点的连接质量和延迟 45 | - 生成最终的节点列表 46 | 47 | 3. 测试完成后,结果会保存到: 48 | - `v2ray.txt`:Base64编码的节点信息(可直接导入到V2Ray客户端) 49 | - `v2ray_raw.txt`:原始文本格式的节点信息(方便查看) 50 | 51 | ## 代码结构 52 | 53 | - `main.py`:主程序入口,包含所有功能实现 54 | - 主要功能模块: 55 | - 订阅链接获取:`fetch_content` 56 | - 节点解析:`extract_nodes`、`parse_clash_yaml`、`parse_v2ray_base64`、`parse_v2ray_uri`、`parse_json_nodes` 57 | - 节点测试:`test_node_latency`、`test_latency` 58 | - 节点处理:`process_node`、`remove_duplicates` 59 | - 核心程序管理:`find_core_program`、`download_xray_core` 60 | 61 | ## 订阅链接配置 62 | 63 | 编辑脚本中的`links`列表可以自定义订阅链接: 64 | 65 | ```python 66 | links = [ 67 | "https://example.com/subscription1", 68 | "https://example.com/subscription2", 69 | # 添加更多链接... 70 | ] 71 | ``` 72 | 73 | 支持多种链接格式,包含日期变量和GitHub仓库链接。 74 | 75 | ## 特性 76 | 77 | ### 自动下载核心程序 78 | 79 | 如果系统中未找到XRay核心程序,工具会自动从GitHub下载最新版本。 80 | 81 | ### 多种格式解析 82 | 83 | 工具支持按照以下顺序尝试解析节点信息: 84 | 1. Base64编码内容 85 | 2. YAML/Clash配置 86 | 3. 使用正则表达式直接提取 87 | 4. JSON格式数据 88 | 89 | ### 智能链接处理 90 | 91 | - 支持日期变量替换(如`{Y}`、`{m}`、`{d}`、`{Ymd}`等) 92 | - 支持GitHub仓库文件自动获取(`{x}`占位符) 93 | - 特殊站点的特殊处理逻辑 94 | 95 | ### 测试方法 96 | 97 | 使用XRay核心程序建立真实连接,通过访问Google测试端点(`http://www.gstatic.com/generate_204`)来测量延迟。 98 | 99 | ## 注意事项 100 | 101 | 1. 该工具仅供学习和研究使用,请遵守当地法律法规。 102 | 2. 部分节点可能由于网络环境不同而表现不同,测试结果仅供参考。 103 | 3. 可能需要管理员权限来下载和运行核心程序。 104 | 4. 在Windows系统上,可能会有防火墙提示,需要允许程序访问网络。 105 | 106 | ## 故障排除 107 | 108 | - 如果无法获取节点信息,请检查订阅链接是否有效。 109 | - 如果测试节点时出现错误,请确保XRay核心程序正确安装。 110 | - 对于特殊网站的解析问题,可能需要安装额外的依赖(如BeautifulSoup4)。 111 | - 如果遇到编码问题,可能需要调整`fetch_content`函数中的编码处理逻辑。 112 | 113 | ## 贡献 114 | 115 | 欢迎提交问题报告和改进建议!如果您想贡献代码,请提交Pull Request。 116 | 117 | ## 许可 118 | 119 | 该项目采用MIT许可证。 120 | 121 | ## 免责声明 122 | 123 | 本工具仅用于学习和研究网络技术,请勿用于非法用途。使用本工具所产生的任何后果由使用者自行承担。 -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import base64 3 | import yaml 4 | import json 5 | import socket 6 | import time 7 | import re 8 | import os 9 | import shutil 10 | import tempfile 11 | import platform 12 | import subprocess 13 | import random 14 | import zipfile 15 | import io 16 | from datetime import datetime 17 | from urllib.parse import urlparse, parse_qs, unquote 18 | from concurrent.futures import ThreadPoolExecutor, as_completed 19 | 20 | # 订阅链接列表 21 | links = [ 22 | "https://ghproxy.net/https://raw.githubusercontent.com/xiaoer8867785/jddy5/main/data/{Y_m_d}/{x}.yaml", 23 | "https://ghproxy.net/https://raw.githubusercontent.com/firefoxmmx2/v2rayshare_subcription/main/subscription/clash_sub.yaml", 24 | "https://ghproxy.net/https://raw.githubusercontent.com/Roywaller/clash_subscription/refs/heads/main/clash_subscription.txt", 25 | "https://ghproxy.net/https://raw.githubusercontent.com/Q3dlaXpoaQ/V2rayN_Clash_Node_Getter/refs/heads/main/APIs/sc0.yaml", 26 | "https://ghproxy.net/https://raw.githubusercontent.com/Q3dlaXpoaQ/V2rayN_Clash_Node_Getter/refs/heads/main/APIs/sc1.yaml", 27 | "https://ghproxy.net/https://raw.githubusercontent.com/Q3dlaXpoaQ/V2rayN_Clash_Node_Getter/refs/heads/main/APIs/sc2.yaml", 28 | "https://ghproxy.net/https://raw.githubusercontent.com/Q3dlaXpoaQ/V2rayN_Clash_Node_Getter/refs/heads/main/APIs/sc3.yaml", 29 | "https://ghproxy.net/https://raw.githubusercontent.com/Q3dlaXpoaQ/V2rayN_Clash_Node_Getter/refs/heads/main/APIs/sc4.yaml", 30 | "https://ghproxy.net/https://raw.githubusercontent.com/xiaoji235/airport-free/refs/heads/main/clash/naidounode.txt", 31 | "https://ghproxy.net/https://raw.githubusercontent.com/mahdibland/ShadowsocksAggregator/master/LogInfo.txt", 32 | "https://ghproxy.net/https://raw.githubusercontent.com/mahdibland/SSAggregator/master/sub/sub_merge_yaml.yml", 33 | "https://ghproxy.net/https://raw.githubusercontent.com/mahdibland/ShadowsocksAggregator/master/Eternity.yml", 34 | "https://ghproxy.net/https://raw.githubusercontent.com/vxiaov/free_proxies/main/clash/clash.provider.yaml", 35 | "https://ghproxy.net/https://raw.githubusercontent.com/ljlfct01/ljlfct01.github.io/refs/heads/main/节点", 36 | "https://ghproxy.net/https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta.yaml", 37 | "https://ghproxy.net/https://raw.githubusercontent.com/leetomlee123/freenode/refs/heads/main/README.md", 38 | "https://ghproxy.net/https://raw.githubusercontent.com/chengaopan/AutoMergePublicNodes/master/list.yml", 39 | "https://ghproxy.net/https://raw.githubusercontent.com/ermaozi/get_subscribe/main/subscribe/clash.yml", 40 | "https://ghproxy.net/https://raw.githubusercontent.com/zhangkaiitugithub/passcro/main/speednodes.yaml", 41 | "https://ghproxy.net/https://raw.githubusercontent.com/mgit0001/test_clash/refs/heads/main/heima.txt", 42 | "https://ghproxy.net/https://raw.githubusercontent.com/mai19950/clashgithub_com/refs/heads/main/site", 43 | "https://ghproxy.net/https://raw.githubusercontent.com/aiboboxx/clashfree/refs/heads/main/clash.yml", 44 | "https://ghproxy.net/https://raw.githubusercontent.com/aiboboxx/v2rayfree/refs/heads/main/README.md", 45 | "https://ghproxy.net/https://raw.githubusercontent.com/Pawdroid/Free-servers/refs/heads/main/sub", 46 | "https://ghproxy.net/https://raw.githubusercontent.com/shahidbhutta/Clash/refs/heads/main/Router", 47 | "https://ghproxy.net/https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list.meta.yml", 48 | "https://ghproxy.net/https://raw.githubusercontent.com/anaer/Sub/refs/heads/main/clash.yaml", 49 | "https://ghproxy.net/https://raw.githubusercontent.com/a2470982985/getNode/main/clash.yaml", 50 | "https://ghproxy.net/https://raw.githubusercontent.com/free18/v2ray/refs/heads/main/c.yaml", 51 | "https://ghproxy.net/https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list.yml", 52 | "https://ghproxy.net/https://raw.githubusercontent.com/mfbpn/tg_mfbpn_sub/main/trial.yaml", 53 | "https://ghproxy.net/https://raw.githubusercontent.com/Ruk1ng001/freeSub/main/clash.yaml", 54 | "https://ghproxy.net/https://raw.githubusercontent.com/SoliSpirit/v2ray-configs/main/all_configs.txt", 55 | "https://ghproxy.net/https://raw.githubusercontent.com/ripaojiedian/freenode/main/clash", 56 | "https://ghproxy.net/https://raw.githubusercontent.com/go4sharing/sub/main/sub.yaml", 57 | "https://ghproxy.net/https://raw.githubusercontent.com/mfuu/v2ray/master/clash.yaml", 58 | "https://api.mxlweb.xyz/sub?target=clash&url=https://www.xrayvip.com/free.yaml&insert=false", 59 | "https://api.mxlweb.xyz/sub?target=clash&url=https://mxlsub.me/free&insert=false", 60 | "https://www.freeclashnode.com/uploads/{Y}/{m}/0-{Ymd}.yaml", 61 | "https://www.freeclashnode.com/uploads/{Y}/{m}/1-{Ymd}.yaml", 62 | "https://www.freeclashnode.com/uploads/{Y}/{m}/2-{Ymd}.yaml", 63 | "https://www.freeclashnode.com/uploads/{Y}/{m}/3-{Ymd}.yaml", 64 | "https://www.freeclashnode.com/uploads/{Y}/{m}/4-{Ymd}.yaml", 65 | "https://sub.reajason.eu.org/clash.yaml", 66 | "https://proxypool.link/trojan/sub", 67 | "https://proxypool.link/ss/sub", 68 | "https://proxypool.link/vmess/sub", 69 | "https://mxlsub.me/newfull", 70 | "https://igdux.top/5Hna", 71 | "https://ghproxy.net/https://raw.githubusercontent.com/Pawdroid/Free-servers/main/sub", 72 | "https://ghproxy.net/https://raw.githubusercontent.com/chengaopan/AutoMergePublicNodes/master/list.txt", 73 | "https://ghproxy.net/https://raw.githubusercontent.com/aiboboxx/v2rayfree/main/v2", 74 | "https://ghproxy.net/https://raw.githubusercontent.com/roosterkid/openproxylist/main/V2RAY_BASE64.txt", 75 | "https://ghproxy.net/https://raw.githubusercontent.com/vpnmarket/sub/refs/heads/main/hiddify1.txt", 76 | "https://ghproxy.net/https://raw.githubusercontent.com/vpnmarket/sub/refs/heads/main/hiddify2.txt", 77 | "https://ghproxy.net/https://raw.githubusercontent.com/vpnmarket/sub/refs/heads/main/hiddify3.txt", 78 | ] 79 | 80 | # 测试使用 81 | # links = [ 82 | # "https://ghproxy.net/https://raw.githubusercontent.com/firefoxmmx2/v2rayshare_subcription/main/subscription/clash_sub.yaml", 83 | # "https://ghproxy.net/https://raw.githubusercontent.com/Roywaller/clash_subscription/refs/heads/main/clash_subscription.txt", 84 | # "https://www.freeclashnode.com/uploads/{Y}/{m}/0-{Ymd}.yaml", 85 | # "https://ghproxy.net/https://raw.githubusercontent.com/aiboboxx/clashfree/refs/heads/main/clash.yml", 86 | # "https://ghproxy.net/https://raw.githubusercontent.com/mahdibland/ShadowsocksAggregator/master/LogInfo.txt", 87 | # 'https://ghproxy.net/https://raw.githubusercontent.com/aiboboxx/v2rayfree/main/v2', 88 | # 'https://ghproxy.net/https://raw.githubusercontent.com/roosterkid/openproxylist/main/V2RAY_BASE64.txt', 89 | # 'https://ghproxy.net/https://raw.githubusercontent.com/vpnmarket/sub/refs/heads/main/hiddify1.txt', 90 | # ] 91 | 92 | # 支持的协议类型列表 93 | SUPPORTED_PROTOCOLS = [ 94 | 'vmess://', 95 | 'trojan://', 96 | 'vless://', 97 | 'ss://', 98 | 'ssr://', 99 | 'http://', 100 | 'https://', 101 | 'socks://', 102 | 'socks5://', 103 | 'hysteria://', 104 | 'wireguard://' 105 | ] 106 | 107 | # 测速相关配置 108 | # 测试URL列表 109 | TEST_URLS = [ 110 | "http://www.gstatic.com/generate_204", # Google测试 111 | ] 112 | CONNECTION_TIMEOUT = 10 # 连接超时时间,单位为秒 113 | MAX_CONCURRENT_TESTS = 100 # 最大并发测试数量 114 | DEBUG_MODE = False # 默认开启调试模式,方便查看处理过程 115 | 116 | # 核心程序配置 117 | CORE_PATH = None # 核心程序路径,将自动检测 118 | 119 | def is_github_raw_url(url): 120 | """判断是否为GitHub的raw URL""" 121 | return 'raw.githubusercontent.com' in url 122 | 123 | def extract_file_pattern(url): 124 | """从URL中提取文件模式,例如{x}.yaml中的.yaml""" 125 | match = re.search(r'\{x\}(\.[a-zA-Z0-9]+)(?:/|$)', url) 126 | if match: 127 | return match.group(1) # 返回文件后缀,如 '.yaml', '.txt', '.json' 128 | return None 129 | 130 | def get_github_filename(github_url, file_suffix): 131 | """从GitHub API获取匹配指定后缀的文件名""" 132 | try: 133 | print(f"处理GitHub URL: {github_url}") 134 | # 标准化URL - 移除代理前缀 135 | url_without_proxy = github_url 136 | if 'ghproxy.net/' in github_url: 137 | url_without_proxy = github_url.split('ghproxy.net/', 1)[1] 138 | 139 | # 提取仓库所有者、名称和分支信息 140 | url_parts = url_without_proxy.replace('https://raw.githubusercontent.com/', '').split('/') 141 | if len(url_parts) < 3: 142 | print(f"URL格式不正确: {github_url}") 143 | return None 144 | 145 | owner = url_parts[0] 146 | repo = url_parts[1] 147 | branch = url_parts[2] 148 | 149 | # 处理分支信息 150 | original_branch = branch 151 | if 'refs/heads/' in branch: 152 | branch = branch.split('refs/heads/')[1] 153 | 154 | # 提取文件路径 - 忽略仓库信息和{x}部分 155 | # 例如:owner/repo/branch/path/to/directory/{x}.yaml -> path/to/directory 156 | path_parts = '/'.join(url_parts[3:]) # 获取路径部分 157 | if '{x}' in path_parts: 158 | directory_path = path_parts.split('/{x}')[0] 159 | else: 160 | directory_path = path_parts 161 | 162 | print(f"解析结果: 仓库={owner}/{repo}, 分支={branch}, 路径={directory_path}") 163 | 164 | # 构建GitHub API URL 165 | api_url = f"https://api.github.com/repos/{owner}/{repo}/contents/{directory_path}" 166 | 167 | # 添加ref参数指定分支 168 | if branch: 169 | api_url += f"?ref={branch}" 170 | 171 | print(f"构建的API URL: {api_url}") 172 | 173 | # 使用代理访问GitHub API 174 | proxy_api_url = f"https://ghproxy.net/{api_url}" 175 | print(f"尝试通过代理访问: {proxy_api_url}") 176 | 177 | try: 178 | response = requests.get(proxy_api_url, timeout=30) 179 | if response.status_code != 200: 180 | print("代理访问失败,尝试直接访问GitHub API") 181 | response = requests.get(api_url, timeout=30) 182 | except Exception as e: 183 | print(f"代理访问失败: {str(e)},尝试直接访问") 184 | response = requests.get(api_url, timeout=30) 185 | 186 | if response.status_code != 200: 187 | print(f"GitHub API请求失败: {response.status_code} - {api_url}") 188 | print(f"响应内容: {response.text[:200]}...") 189 | return None 190 | 191 | # 解析返回的JSON 192 | files = response.json() 193 | if not isinstance(files, list): 194 | print(f"GitHub API返回的不是文件列表: {type(files)}") 195 | print(f"响应内容: {str(files)[:200]}...") 196 | return None 197 | 198 | print(f"在目录中找到{len(files)}个文件/目录") 199 | 200 | # 查找匹配后缀的文件 201 | matching_files = [f['name'] for f in files if f['name'].endswith(file_suffix)] 202 | 203 | if not matching_files: 204 | print(f"未找到匹配{file_suffix}后缀的文件,目录包含: {[f['name'] for f in files][:10]}") 205 | return None 206 | 207 | # 排序并选择第一个匹配的文件(通常选择最近的文件) 208 | matching_files.sort(reverse=True) 209 | selected_file = matching_files[0] 210 | print(f"选择文件: {selected_file}") 211 | return selected_file 212 | 213 | except Exception as e: 214 | print(f"获取GitHub文件列表出错: {str(e)}") 215 | import traceback 216 | traceback.print_exc() 217 | return None 218 | 219 | def format_current_date(url): 220 | """替换URL中的日期占位符和{x}占位符""" 221 | # 定义和生成所有可能的日期格式变量 222 | now = datetime.now() 223 | date_vars = { 224 | # 基本日期组件 225 | 'Y': now.strftime('%Y'), # 年份,如2023 226 | 'm': now.strftime('%m'), # 月份,如05 227 | 'd': now.strftime('%d'), # 日期,如09 228 | 229 | # 组合日期格式 230 | 'Ymd': now.strftime('%Y%m%d'), # 组合格式,如20230509 231 | 'Y-m-d': now.strftime('%Y-%m-%d'), # 带连字符格式,如2023-05-09 232 | 'Y_m_d': now.strftime('%Y_%m_%d'), # 带下划线格式,如2023_05_09 233 | 234 | # 额外日期格式 235 | 'Y-m': now.strftime('%Y-%m'), # 年月,如2023-05 236 | 'Y_m': now.strftime('%Y_%m'), # 带下划线的年月,如2023_05 237 | 'md': now.strftime('%m%d'), # 月日,如0509 238 | 'm-d': now.strftime('%m-%d'), # 带连字符的月日,如05-09 239 | 'm_d': now.strftime('%m_%d'), # 带下划线的月日,如05_09 240 | } 241 | 242 | # 处理日期占位符 243 | try: 244 | formatted_url = url.format(**date_vars) 245 | except KeyError as e: 246 | print(f"URL中包含未支持的日期格式占位符: {e}") 247 | print(f"支持的日期占位符有: {', '.join(date_vars.keys())}") 248 | return url # 返回原始URL,让后续处理决定是否跳过 249 | 250 | # 处理{x}占位符 251 | if '{x}' in formatted_url: 252 | # 提取后缀 253 | file_suffix = extract_file_pattern(formatted_url) 254 | if file_suffix and is_github_raw_url(formatted_url): 255 | # 获取GitHub中匹配的文件名 256 | filename = get_github_filename(formatted_url, file_suffix) 257 | if filename: 258 | # 替换{x}占位符为实际文件名 259 | pattern = r'\{x\}' + re.escape(file_suffix) 260 | formatted_url = re.sub(pattern, filename, formatted_url) 261 | else: 262 | print(f"警告: 未能解析{x}占位符, URL: {formatted_url}") 263 | 264 | return formatted_url 265 | 266 | def fetch_content(url): 267 | """获取订阅内容""" 268 | try: 269 | # 1. 首先替换日期相关的占位符 270 | now = datetime.now() 271 | date_vars = { 272 | # 基本日期组件 273 | 'Y': now.strftime('%Y'), # 年份,如2023 274 | 'm': now.strftime('%m'), # 月份,如05 275 | 'd': now.strftime('%d'), # 日期,如09 276 | 277 | # 组合日期格式 278 | 'Ymd': now.strftime('%Y%m%d'), # 组合格式,如20230509 279 | 'Y-m-d': now.strftime('%Y-%m-%d'), # 带连字符格式,如2023-05-09 280 | 'Y_m_d': now.strftime('%Y_%m_%d'), # 带下划线格式,如2023_05_09 281 | 282 | # 额外日期格式 283 | 'Y-m': now.strftime('%Y-%m'), # 年月,如2023-05 284 | 'Y_m': now.strftime('%Y_%m'), # 带下划线的年月,如2023_05 285 | 'md': now.strftime('%m%d'), # 月日,如0509 286 | 'm-d': now.strftime('%m-%d'), # 带连字符的月日,如05-09 287 | 'm_d': now.strftime('%m_%d'), # 带下划线的月日,如05_09 288 | } 289 | 290 | # 先将{x}占位符临时替换,以免被format误处理 291 | temp_marker = "___X_PLACEHOLDER___" 292 | temporary_url = url.replace("{x}", temp_marker) 293 | 294 | # 尝试使用format方法替换所有日期占位符 295 | try: 296 | formatted_url = temporary_url.format(**date_vars) 297 | except KeyError as e: 298 | # 如果format失败,尝试手动替换 299 | print(f"URL中包含未支持的日期格式占位符: {e}") 300 | print(f"支持的日期占位符有: {', '.join(date_vars.keys())}") 301 | formatted_url = temporary_url 302 | # 手动替换常见的日期占位符 303 | for pattern, replacement in [ 304 | ('{Y_m_d}', now.strftime('%Y_%m_%d')), 305 | ('{Y-m-d}', now.strftime('%Y-%m-%d')), 306 | ('{Ymd}', now.strftime('%Y%m%d')), 307 | ('{Y}', now.strftime('%Y')), 308 | ('{m}', now.strftime('%m')), 309 | ('{d}', now.strftime('%d')), 310 | ]: 311 | if pattern in formatted_url: 312 | formatted_url = formatted_url.replace(pattern, replacement) 313 | print(f"手动替换日期占位符 {pattern} 为 {replacement}") 314 | 315 | # 将临时标记替换回{x} 316 | formatted_url = formatted_url.replace(temp_marker, "{x}") 317 | 318 | # 2. 然后处理{x}占位符 - 现在日期占位符已经被替换 319 | if '{x}' in formatted_url: 320 | file_suffix = extract_file_pattern(formatted_url) 321 | if file_suffix and is_github_raw_url(formatted_url): 322 | print(f"在URL中找到{{x}}占位符,尝试获取匹配的文件...") 323 | filename = get_github_filename(formatted_url, file_suffix) 324 | if filename: 325 | pattern = r'\{x\}' + re.escape(file_suffix) 326 | formatted_url = re.sub(pattern, filename, formatted_url) 327 | print(f"成功替换{{x}}占位符为: {filename}") 328 | else: 329 | print(f"警告: 未能获取匹配{file_suffix}的文件") 330 | else: 331 | print(f"警告: 无法处理{{x}}占位符,URL不是GitHub raw链接或找不到文件后缀") 332 | 333 | print(f"实际请求URL: {formatted_url}") 334 | 335 | # 模拟Chrome浏览器请求头,与curl命令类似 336 | headers = { 337 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36', 338 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 339 | 'Accept-Language': 'zh-CN,zh;q=0.9', 340 | 'Cache-Control': 'no-cache', 341 | 'DNT': '1', 342 | 'Pragma': 'no-cache', 343 | 'Upgrade-Insecure-Requests': '1', 344 | 'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"', 345 | 'sec-ch-ua-mobile': '?0', 346 | 'sec-ch-ua-platform': '"Windows"', 347 | 'sec-fetch-dest': 'document', 348 | 'sec-fetch-mode': 'navigate', 349 | 'sec-fetch-site': 'none', 350 | 'sec-fetch-user': '?1' 351 | } 352 | 353 | # 特殊站点处理 - 对特定的站点使用不同的请求方式 354 | special_sites = ['igdux.top'] 355 | use_session = any(site in formatted_url for site in special_sites) 356 | 357 | if use_session: 358 | # 使用Session对象来保持cookie等状态 359 | session = requests.Session() 360 | # 先发送一个HEAD请求,获取cookie等信息 361 | session.head(formatted_url, headers=headers, timeout=30) 362 | response = session.get(formatted_url, headers=headers, timeout=60, stream=True) 363 | else: 364 | # 普通请求 365 | response = requests.get(formatted_url, headers=headers, timeout=60, stream=True) 366 | 367 | response.raise_for_status() 368 | 369 | # 检查Content-Type,确保正确处理各种类型的内容 370 | content_type = response.headers.get('Content-Type', '').lower() 371 | # print(f"Content-Type: {content_type}") 372 | 373 | # 处理不同内容类型 374 | # 1. 处理二进制类型 375 | if 'application/octet-stream' in content_type or 'application/x-yaml' in content_type: 376 | content = response.content.decode('utf-8', errors='ignore') 377 | # 2. 处理明确指定了UTF-8字符集的文本 378 | elif 'charset=utf-8' in content_type or 'text/plain' in content_type: 379 | # 尝试多种解码方式 380 | encodings_to_try = ['utf-8', 'gbk', 'latin1', 'ascii', 'iso-8859-1'] 381 | for encoding in encodings_to_try: 382 | try: 383 | content = response.content.decode(encoding, errors='ignore') 384 | # 检查解码是否成功 - 如果包含常见订阅指示符 385 | if any(indicator in content for indicator in ['proxies:', 'vmess://', 'trojan://', 'ss://', 'vless://']): 386 | # print(f"使用 {encoding} 编码成功解码内容") 387 | break 388 | except UnicodeDecodeError: 389 | continue 390 | else: 391 | # 如果所有编码都失败,使用默认UTF-8 392 | content = response.content.decode('utf-8', errors='ignore') 393 | 394 | # 如果网址是特殊站点但仍然得到乱码,尝试拆解HTML标记 395 | if use_session and not any(indicator in content for indicator in ['proxies:', 'vmess://', 'trojan://', 'ss://', 'vless://']): 396 | try: 397 | # 尝试解析HTML并提取内容 398 | from bs4 import BeautifulSoup 399 | soup = BeautifulSoup(response.content, 'html.parser') 400 | # 查找所有可能包含订阅信息的元素 401 | for element in soup.find_all(['pre', 'code', 'div', 'textarea']): 402 | element_text = element.get_text() 403 | if any(indicator in element_text for indicator in ['proxies:', 'vmess://', 'trojan://', 'ss://', 'vless://']): 404 | print(f"从HTML元素中提取到订阅内容") 405 | content = element_text 406 | break 407 | except ImportError: 408 | print("未安装BeautifulSoup,跳过HTML解析") 409 | except Exception as e: 410 | print(f"HTML解析错误: {str(e)}") 411 | # 3. 处理可能是base64编码的内容 412 | elif 'text/base64' in content_type: 413 | content = response.content.decode('utf-8', errors='ignore') 414 | # 4. 处理其他文本格式,如json 415 | elif 'application/json' in content_type or 'text/' in content_type: 416 | content = response.content.decode('utf-8', errors='ignore') 417 | # 5. 默认情况 418 | else: 419 | content = response.text 420 | 421 | # 测试内容是否可能是Base64编码 422 | if not any(indicator in content for indicator in ['proxies:', 'vmess://', 'trojan://', 'ss://', 'vless://']): 423 | try: 424 | # 移除空白字符,尝试base64解码 425 | cleaned_content = re.sub(r'\s+', '', content) 426 | # 添加适当的填充 427 | padding = len(cleaned_content) % 4 428 | if padding: 429 | cleaned_content += '=' * (4 - padding) 430 | # 尝试base64解码 431 | decoded = base64.b64decode(cleaned_content) 432 | decoded_text = decoded.decode('utf-8', errors='ignore') 433 | 434 | if any(indicator in decoded_text for indicator in ['proxies:', 'vmess://', 'trojan://', 'ss://', 'vless://']): 435 | print("检测到Base64编码的订阅内容,已成功解码") 436 | content = decoded_text 437 | except: 438 | # 解码失败,继续使用原始内容 439 | pass 440 | 441 | return content 442 | except KeyError as e: 443 | print(f"URL中包含未支持的占位符: {e}") 444 | return None 445 | except Exception as e: 446 | print(f"Error fetching {url}: {str(e)}") 447 | import traceback 448 | traceback.print_exc() 449 | return None 450 | 451 | def parse_clash_yaml(content): 452 | """解析Clash配置文件""" 453 | try: 454 | data = yaml.safe_load(content) 455 | if not data: 456 | return [] 457 | 458 | # 直接查找proxies字段,无论它在哪个层级 459 | if 'proxies' in data: 460 | if DEBUG_MODE: 461 | print(f"从YAML中找到 {len(data['proxies'])} 个节点") 462 | return data['proxies'] 463 | 464 | # 如果没有找到proxies字段,尝试其他可能的字段名 465 | for key in ['proxy-providers', 'Proxy', 'proxys']: 466 | if key in data and isinstance(data[key], list): 467 | if DEBUG_MODE: 468 | print(f"从YAML的{key}字段中找到 {len(data[key])} 个节点") 469 | return data[key] 470 | 471 | print("YAML中未找到节点信息") 472 | return [] 473 | except Exception as e: 474 | # print(f"解析Clash YAML失败: {str(e)}") 475 | return [] 476 | 477 | def parse_v2ray_base64(content): 478 | """解析V2Ray Base64编码的配置""" 479 | try: 480 | # 处理多行base64 481 | content = content.strip().replace('\n', '').replace('\r', '') 482 | # 尝试修复可能的编码问题 483 | try: 484 | if isinstance(content, bytes): 485 | content = content.decode('utf-8') 486 | # 确保内容是ASCII兼容的 487 | content = content.encode('ascii', 'ignore').decode('ascii') 488 | except UnicodeError: 489 | print("Error: Invalid encoding in base64 content") 490 | return [] 491 | 492 | try: 493 | decoded = base64.b64decode(content + '=' * (-len(content) % 4)) 494 | decoded_str = decoded.decode('utf-8', 'ignore') 495 | except Exception as e: 496 | print(f"Error decoding base64 content: {str(e)}") 497 | return [] 498 | 499 | nodes = [] 500 | for line in decoded_str.split('\n'): 501 | if line.startswith('vmess://') or line.startswith('trojan://'): 502 | node = parse_v2ray_uri(line) 503 | if node: 504 | nodes.append(node) 505 | return nodes 506 | except Exception as e: 507 | # print(f"Error parsing V2Ray base64: {str(e)}") 508 | return [] 509 | 510 | def parse_v2ray_uri(uri): 511 | """解析V2Ray URI格式的配置""" 512 | try: 513 | # 处理vmess协议 514 | if uri.startswith('vmess://'): 515 | b64_config = uri.replace('vmess://', '') 516 | # 确保base64正确填充 517 | b64_config = b64_config + '=' * (-len(b64_config) % 4) 518 | try: 519 | config = json.loads(base64.b64decode(b64_config).decode()) 520 | return { 521 | 'type': 'vmess', 522 | 'name': config.get('ps', 'Unknown'), 523 | 'server': config.get('add', ''), 524 | 'port': int(config.get('port', 0)), 525 | 'uuid': config.get('id', ''), 526 | 'alterId': int(config.get('aid', 0)), 527 | 'cipher': config.get('type', 'auto'), 528 | 'tls': config.get('tls', '') == 'tls', 529 | 'network': config.get('net', 'tcp') 530 | } 531 | except json.JSONDecodeError: 532 | # 某些情况下vmess可能使用非标准格式 533 | print(f"Non-standard vmess format: {uri}") 534 | return None 535 | 536 | # 处理trojan协议 537 | elif uri.startswith('trojan://'): 538 | parsed = urlparse(uri) 539 | query = parse_qs(parsed.query) 540 | return { 541 | 'type': 'trojan', 542 | 'name': query.get('sni', [query.get('peer', ['Unknown'])[0]])[0], 543 | 'server': parsed.hostname or '', 544 | 'port': parsed.port or 443, 545 | 'password': parsed.username or '' 546 | } 547 | 548 | # 处理vless协议 549 | elif uri.startswith('vless://'): 550 | parsed = urlparse(uri) 551 | query = parse_qs(parsed.query) 552 | return { 553 | 'type': 'vless', 554 | 'name': query.get('remarks', [query.get('sni', ['Unknown'])[0]])[0], 555 | 'server': parsed.hostname or '', 556 | 'port': parsed.port or 443, 557 | 'uuid': parsed.username or '', 558 | 'tls': query.get('security', [''])[0] == 'tls', 559 | 'flow': query.get('flow', [''])[0], 560 | 'network': query.get('type', ['tcp'])[0] 561 | } 562 | 563 | # 处理shadowsocks协议 564 | elif uri.startswith('ss://'): 565 | # 首先获取#后面的名称部分(如果存在) 566 | name = 'Unknown' 567 | if '#' in uri: 568 | name_part = uri.split('#', 1)[1] 569 | name = unquote(name_part) 570 | uri = uri.split('#', 1)[0] # 移除名称部分以便后续处理 571 | 572 | if '@' in uri: 573 | # 处理 ss://method:password@host:port 574 | parsed = urlparse(uri) 575 | server = parsed.hostname 576 | port = parsed.port 577 | 578 | # 提取方法和密码 579 | userinfo = parsed.username 580 | if userinfo: 581 | try: 582 | # 有些实现可能会对userinfo进行base64编码 583 | decoded = base64.b64decode(userinfo + '=' * (-len(userinfo) % 4)).decode() 584 | if ':' in decoded: 585 | method, password = decoded.split(':', 1) 586 | else: 587 | method, password = 'aes-256-gcm', userinfo 588 | except: 589 | # 如果不是base64编码,可能是明文 590 | if ':' in userinfo: 591 | method, password = userinfo.split(':', 1) 592 | else: 593 | method, password = 'aes-256-gcm', userinfo 594 | else: 595 | method, password = 'aes-256-gcm', '' 596 | 597 | # 如果查询参数中包含remarks,优先使用它 598 | query = parse_qs(parsed.query) 599 | if 'remarks' in query: 600 | name = query.get('remarks', ['Unknown'])[0] 601 | 602 | return { 603 | 'type': 'ss', 604 | 'name': name, 605 | 'server': server or '', 606 | 'port': port or 443, 607 | 'cipher': method, 608 | 'password': password 609 | } 610 | else: 611 | # 处理 ss://BASE64(method:password@host:port) 612 | b64_config = uri.replace('ss://', '') 613 | try: 614 | # 确保base64正确填充 615 | b64_config = b64_config + '=' * (-len(b64_config) % 4) 616 | 617 | config_str = base64.b64decode(b64_config).decode() 618 | # 提取方法和密码 619 | if '@' in config_str: 620 | method_pwd, server_port = config_str.rsplit('@', 1) 621 | method, password = method_pwd.split(':', 1) 622 | server, port = server_port.rsplit(':', 1) 623 | 624 | return { 625 | 'type': 'ss', 626 | 'name': name, 627 | 'server': server, 628 | 'port': int(port), 629 | 'cipher': method, 630 | 'password': password 631 | } 632 | except Exception as e: 633 | # print(f"Invalid ss URI format: {uri}, error: {str(e)}") 634 | return None 635 | 636 | # 处理shadowsocksr协议 637 | elif uri.startswith('ssr://'): 638 | b64_config = uri.replace('ssr://', '') 639 | try: 640 | # 确保base64正确填充 641 | b64_config = b64_config + '=' * (-len(b64_config) % 4) 642 | config_str = base64.b64decode(b64_config).decode() 643 | 644 | # SSR格式: server:port:protocol:method:obfs:base64pass/?obfsparam=base64param&protoparam=base64param&remarks=base64remarks 645 | parts = config_str.split(':') 646 | if len(parts) >= 6: 647 | server = parts[0] 648 | port = parts[1] 649 | protocol = parts[2] 650 | method = parts[3] 651 | obfs = parts[4] 652 | 653 | # 处理剩余参数 654 | password_and_params = parts[5].split('/?', 1) 655 | password_b64 = password_and_params[0] 656 | password = base64.b64decode(password_b64 + '=' * (-len(password_b64) % 4)).decode() 657 | 658 | # 提取参数 659 | name = 'Unknown' 660 | if len(password_and_params) > 1 and 'remarks=' in password_and_params[1]: 661 | remarks_b64 = password_and_params[1].split('remarks=', 1)[1].split('&', 1)[0] 662 | try: 663 | name = base64.b64decode(remarks_b64 + '=' * (-len(remarks_b64) % 4)).decode() 664 | except: 665 | pass 666 | 667 | return { 668 | 'type': 'ssr', 669 | 'name': name, 670 | 'server': server, 671 | 'port': int(port), 672 | 'protocol': protocol, 673 | 'cipher': method, 674 | 'obfs': obfs, 675 | 'password': password 676 | } 677 | except Exception as e: 678 | # print(f"Error parsing SSR URI: {str(e)}") 679 | return None 680 | 681 | # 处理HTTP/HTTPS协议 682 | elif uri.startswith(('http://', 'https://')): 683 | parsed = urlparse(uri) 684 | query = parse_qs(parsed.query) 685 | return { 686 | 'type': 'http' if uri.startswith('http://') else 'https', 687 | 'name': query.get('remarks', ['Unknown'])[0], 688 | 'server': parsed.hostname or '', 689 | 'port': parsed.port or (80 if uri.startswith('http://') else 443), 690 | 'username': parsed.username or '', 691 | 'password': parsed.password or '' 692 | } 693 | 694 | # 处理SOCKS协议 695 | elif uri.startswith(('socks://', 'socks5://')): 696 | parsed = urlparse(uri) 697 | query = parse_qs(parsed.query) 698 | return { 699 | 'type': 'socks', 700 | 'name': query.get('remarks', ['Unknown'])[0], 701 | 'server': parsed.hostname or '', 702 | 'port': parsed.port or 1080, 703 | 'username': parsed.username or '', 704 | 'password': parsed.password or '' 705 | } 706 | 707 | # 处理hysteria协议 708 | elif uri.startswith('hysteria://'): 709 | parsed = urlparse(uri) 710 | query = parse_qs(parsed.query) 711 | return { 712 | 'type': 'hysteria', 713 | 'name': query.get('peer', ['Unknown'])[0], 714 | 'server': parsed.hostname or '', 715 | 'port': parsed.port or 443, 716 | 'protocol': query.get('protocol', [''])[0], 717 | 'auth': parsed.username or query.get('auth', [''])[0] 718 | } 719 | 720 | # 处理wireguard协议 721 | elif uri.startswith('wireguard://'): 722 | parsed = urlparse(uri) 723 | query = parse_qs(parsed.query) 724 | return { 725 | 'type': 'wireguard', 726 | 'name': query.get('remarks', ['Unknown'])[0], 727 | 'server': parsed.hostname or '', 728 | 'port': parsed.port or 51820, 729 | 'private_key': query.get('privateKey', [''])[0], 730 | 'public_key': query.get('publicKey', [''])[0], 731 | 'allowed_ips': query.get('allowedIPs', ['0.0.0.0/0'])[0] 732 | } 733 | 734 | except Exception as e: 735 | # print(f"Error parsing URI: {str(e)}") 736 | return None 737 | 738 | def extract_nodes(content): 739 | """级联提取节点,按照Base64 -> YAML -> 正则表达式 -> JSON的顺序尝试""" 740 | if not content: 741 | return [] 742 | 743 | nodes = [] 744 | methods_tried = [] 745 | 746 | # 1. 尝试Base64解码提取 747 | try: 748 | # 处理多行base64,移除所有空白字符和特殊字符 749 | cleaned_content = re.sub(r'[\s\n\r\t]+', '', content) 750 | cleaned_content = re.sub(r'[^A-Za-z0-9+/=]', '', cleaned_content) 751 | 752 | # 确保base64字符串长度是4的倍数 753 | padding_length = len(cleaned_content) % 4 754 | if padding_length: 755 | cleaned_content += '=' * (4 - padding_length) 756 | 757 | # 尝试base64解码 758 | try: 759 | decoded_bytes = base64.b64decode(cleaned_content) 760 | decoded_str = decoded_bytes.decode('utf-8', 'ignore') 761 | 762 | # 检查解码后的内容是否包含任何支持的协议节点 763 | if any(protocol in decoded_str for protocol in SUPPORTED_PROTOCOLS): 764 | print("使用Base64解码提取节点") 765 | methods_tried.append("Base64") 766 | for line in decoded_str.split('\n'): 767 | line = line.strip() 768 | if any(line.startswith(protocol) for protocol in SUPPORTED_PROTOCOLS): 769 | node = parse_v2ray_uri(line) 770 | if node: 771 | nodes.append(node) 772 | except Exception as e: 773 | # print(f"Base64解码失败或未找到节点: {str(e)}") 774 | pass 775 | except Exception as e: 776 | print(f"Base64预处理失败: {str(e)}") 777 | 778 | # 如果已经提取到节点,直接返回 779 | if len(nodes) > 0: 780 | print(f"通过【{methods_tried[-1]}】方法成功提取到{len(nodes)}个节点") 781 | return nodes 782 | 783 | # 2. 尝试解析YAML格式 784 | try: 785 | # 移除HTML标签和特殊标记 786 | cleaned_content = re.sub(r'<[^>]+>|!<str>', '', content) 787 | 788 | # 更强大的YAML格式检测,查找常见Clash配置特征 789 | yaml_indicators = [ 790 | 'proxies:', 'Proxy:', 'proxy:', 'proxy-providers:', 791 | 'port:', 'socks-port:', 'allow-lan:', 'mode:', 792 | 'type: vmess', 'type: ss', 'type: trojan', 'type: vless' 793 | ] 794 | 795 | if any(indicator in cleaned_content for indicator in yaml_indicators): 796 | # print("尝试解析YAML格式内容") 797 | methods_tried.append("YAML") 798 | 799 | # 尝试直接加载YAML 800 | try: 801 | yaml_nodes = parse_clash_yaml(cleaned_content) 802 | if yaml_nodes: 803 | # print(f"从YAML中提取到{len(yaml_nodes)}个节点") 804 | nodes.extend(yaml_nodes) 805 | except Exception as yaml_error: 806 | print(f"标准YAML解析失败: {str(yaml_error)}") 807 | 808 | # 如果标准解析失败,尝试更宽松的解析方式 809 | try: 810 | # 尝试提取proxies部分 811 | proxies_match = re.search(r'proxies:\s*\n([\s\S]+?)(?:\n\w+:|$)', cleaned_content) 812 | if proxies_match: 813 | proxies_yaml = "proxies:\n" + proxies_match.group(1) 814 | yaml_nodes = parse_clash_yaml(proxies_yaml) 815 | if yaml_nodes: 816 | print(f"从proxies块提取到{len(yaml_nodes)}个节点") 817 | nodes.extend(yaml_nodes) 818 | except Exception as fallback_error: 819 | print(f"尝试解析proxies块失败: {str(fallback_error)}") 820 | except Exception as e: 821 | print(f"YAML解析过程出错: {str(e)}") 822 | 823 | # 如果已经提取到节点,直接返回 824 | if len(nodes) > 0: 825 | print(f"通过【{methods_tried[-1]}】方法成功提取到{len(nodes)}个节点") 826 | return nodes 827 | 828 | # 3. 尝试使用正则表达式直接提取 829 | try: 830 | # print("尝试使用正则表达式直接提取节点") 831 | methods_tried.append("正则表达式") 832 | 833 | # 为每种支持的协议定义正则表达式并提取 834 | for protocol in SUPPORTED_PROTOCOLS: 835 | if protocol == 'vmess://': 836 | # vmess通常是一个base64编码的字符串 837 | found_nodes = re.findall(r'vmess://[A-Za-z0-9+/=]+', content) 838 | elif protocol == 'hysteria://' or protocol == 'wireguard://': 839 | # 这些协议可能有特殊格式,需要特别处理 840 | found_nodes = re.findall(f'{protocol}[^"\'<>\\s]+', content) 841 | else: 842 | # 对于其他协议,采用通用正则表达式 843 | found_nodes = re.findall(f'{protocol}[^"\'<>\\s]+', content) 844 | 845 | for uri in found_nodes: 846 | node = parse_v2ray_uri(uri) 847 | if node: 848 | nodes.append(node) 849 | except Exception as e: 850 | print(f"正则表达式提取失败: {str(e)}") 851 | 852 | # 如果已经提取到节点,直接返回 853 | if len(nodes) > 0: 854 | print(f"通过【{methods_tried[-1]}】方法成功提取到{len(nodes)}个节点") 855 | return nodes 856 | 857 | # 4. 尝试解析JSON格式 858 | try: 859 | # print("尝试解析JSON格式") 860 | methods_tried.append("JSON") 861 | 862 | # 清理内容,移除可能的HTML标签和注释 863 | cleaned_content = re.sub(r'<[^>]+>|/\*.*?\*/|//.*?$', '', content, flags=re.MULTILINE) 864 | 865 | # 尝试解析JSON 866 | try: 867 | json_data = json.loads(cleaned_content) 868 | json_nodes = parse_json_nodes(json_data) 869 | if json_nodes: 870 | # print(f"从JSON中提取到{len(json_nodes)}个节点") 871 | nodes.extend(json_nodes) 872 | except json.JSONDecodeError as e: 873 | # 尝试查找内容中的JSON片段 874 | try: 875 | # 查找类似于 [{...}] 或 {...} 形式的JSON 876 | json_matches = re.findall(r'(\[{.*?}\]|\{.*?\})', cleaned_content, re.DOTALL) 877 | for json_match in json_matches: 878 | try: 879 | potential_json = json.loads(json_match) 880 | json_nodes = parse_json_nodes(potential_json) 881 | if json_nodes: 882 | # print(f"从JSON片段中提取到{len(json_nodes)}个节点") 883 | nodes.extend(json_nodes) 884 | # 找到有效的JSON片段后,不再继续查找 885 | break 886 | except: 887 | continue 888 | except Exception as extract_error: 889 | # print(f"尝试提取JSON片段失败: {str(extract_error)}") 890 | pass 891 | except Exception as e: 892 | print(f"JSON解析过程出错: {str(e)}") 893 | 894 | if len(nodes) > 0: 895 | print(f"通过【{methods_tried[-1]}】方法成功提取到{len(nodes)}个节点") 896 | return nodes 897 | else: 898 | print("未找到任何节点") 899 | return [] 900 | 901 | def parse_json_nodes(json_data): 902 | """从JSON数据中解析节点信息""" 903 | nodes = [] 904 | 905 | # 处理数组形式的JSON 906 | if isinstance(json_data, list): 907 | for item in json_data: 908 | node = parse_single_json_node(item) 909 | if node: 910 | nodes.append(node) 911 | # 处理对象形式的JSON 912 | elif isinstance(json_data, dict): 913 | # 检查是否是单个节点 914 | node = parse_single_json_node(json_data) 915 | if node: 916 | nodes.append(node) 917 | # 检查是否包含节点列表 918 | elif 'servers' in json_data and isinstance(json_data['servers'], list): 919 | for server in json_data['servers']: 920 | node = parse_single_json_node(server) 921 | if node: 922 | nodes.append(node) 923 | # 检查其他可能的字段名 924 | for key in ['proxies', 'nodes', 'configs']: 925 | if key in json_data and isinstance(json_data[key], list): 926 | for item in json_data[key]: 927 | node = parse_single_json_node(item) 928 | if node: 929 | nodes.append(node) 930 | 931 | return nodes 932 | 933 | def parse_single_json_node(item): 934 | """解析单个JSON节点数据""" 935 | # 如果不是字典,直接返回 936 | if not isinstance(item, dict): 937 | return None 938 | 939 | # 支持Shadowsocks格式 940 | if ('server' in item and 'server_port' in item and 941 | 'method' in item and 'password' in item): 942 | try: 943 | return { 944 | 'type': 'ss', 945 | 'name': item.get('remarks', f"SS-{item['server']}"), 946 | 'server': item['server'], 947 | 'port': int(item['server_port']), 948 | 'cipher': item['method'], 949 | 'password': item['password'], 950 | 'plugin': item.get('plugin', ''), 951 | 'plugin_opts': item.get('plugin_opts', '') 952 | } 953 | except Exception as e: 954 | print(f"解析Shadowsocks节点失败: {str(e)}") 955 | return None 956 | 957 | # 支持VMess格式 958 | elif ('add' in item and 'port' in item and 'id' in item): 959 | try: 960 | return { 961 | 'type': 'vmess', 962 | 'name': item.get('ps', item.get('remarks', f"VMess-{item['add']}")), 963 | 'server': item['add'], 964 | 'port': int(item['port']), 965 | 'uuid': item['id'], 966 | 'alterId': int(item.get('aid', 0)), 967 | 'cipher': item.get('scy', item.get('security', 'auto')), 968 | 'tls': item.get('tls', '') == 'tls', 969 | 'network': item.get('net', 'tcp'), 970 | 'path': item.get('path', '/'), 971 | 'host': item.get('host', '') 972 | } 973 | except Exception as e: 974 | print(f"解析VMess节点失败: {str(e)}") 975 | return None 976 | 977 | # 支持Trojan格式 978 | elif ('server' in item and 'port' in item and 'password' in item and 979 | item.get('type', '').lower() == 'trojan'): 980 | try: 981 | return { 982 | 'type': 'trojan', 983 | 'name': item.get('remarks', f"Trojan-{item['server']}"), 984 | 'server': item['server'], 985 | 'port': int(item['port']), 986 | 'password': item['password'], 987 | 'sni': item.get('sni', item.get('peer', '')) 988 | } 989 | except Exception as e: 990 | print(f"解析Trojan节点失败: {str(e)}") 991 | return None 992 | 993 | # 支持Clash格式 994 | elif ('type' in item and 'server' in item and 'port' in item): 995 | try: 996 | node_type = item['type'].lower() 997 | if node_type in ['ss', 'vmess', 'trojan', 'vless', 'http', 'socks']: 998 | node = { 999 | 'type': node_type, 1000 | 'name': item.get('name', f"{node_type.upper()}-{item['server']}"), 1001 | 'server': item['server'], 1002 | 'port': int(item['port']) 1003 | } 1004 | 1005 | # 根据不同类型添加特定字段 1006 | if node_type == 'ss': 1007 | node['cipher'] = item.get('cipher', 'aes-256-gcm') 1008 | node['password'] = item.get('password', '') 1009 | elif node_type == 'vmess': 1010 | node['uuid'] = item.get('uuid', '') 1011 | node['alterId'] = int(item.get('alterId', 0)) 1012 | node['cipher'] = item.get('cipher', 'auto') 1013 | node['tls'] = item.get('tls', False) 1014 | node['network'] = item.get('network', 'tcp') 1015 | if 'ws-path' in item: 1016 | node['path'] = item['ws-path'] 1017 | elif node_type in ['trojan', 'vless']: 1018 | node['password'] = item.get('password', '') 1019 | node['sni'] = item.get('sni', '') 1020 | 1021 | return node 1022 | except Exception as e: 1023 | print(f"解析Clash节点失败: {str(e)}") 1024 | return None 1025 | 1026 | return None 1027 | 1028 | def download_xray_core(): 1029 | """下载Xray核心程序到当前目录""" 1030 | print("正在自动下载Xray核心程序...") 1031 | 1032 | # 检测操作系统类型 1033 | is_windows = platform.system() == "Windows" 1034 | is_64bit = platform.architecture()[0] == '64bit' 1035 | 1036 | # 获取最新版本的Xray发布信息 1037 | try: 1038 | api_url = "https://api.github.com/repos/XTLS/Xray-core/releases/latest" 1039 | response = requests.get(api_url, timeout=30) 1040 | release_info = response.json() 1041 | 1042 | # 确定下载文件名 1043 | if is_windows: 1044 | if is_64bit: 1045 | file_keyword = "windows-64" 1046 | else: 1047 | file_keyword = "windows-32" 1048 | else: # Linux 1049 | if is_64bit: 1050 | file_keyword = "linux-64" 1051 | else: 1052 | file_keyword = "linux-32" 1053 | 1054 | # 查找匹配的下载URL 1055 | download_url = None 1056 | for asset in release_info['assets']: 1057 | if file_keyword in asset['name'].lower() and asset['name'].endswith('.zip'): 1058 | download_url = asset['browser_download_url'] 1059 | break 1060 | 1061 | if not download_url: 1062 | print(f"未找到适合当前平台({file_keyword})的Xray下载链接") 1063 | return False 1064 | 1065 | # 下载Xray 1066 | print(f"下载Xray: https://ghproxy.net/{download_url}") 1067 | download_response = requests.get(f"https://ghproxy.net/{download_url}", timeout=120) 1068 | download_response.raise_for_status() 1069 | 1070 | # 创建目录结构 1071 | xray_dir = "./xray-core" 1072 | platform_dir = os.path.join(xray_dir, "windows-64" if is_windows else "linux-64") 1073 | os.makedirs(platform_dir, exist_ok=True) 1074 | 1075 | # 解压缩文件 1076 | with zipfile.ZipFile(io.BytesIO(download_response.content)) as z: 1077 | z.extractall(platform_dir) 1078 | 1079 | # 设置执行权限(Linux) 1080 | if not is_windows: 1081 | xray_path = os.path.join(platform_dir, "xray") 1082 | if os.path.exists(xray_path): 1083 | os.chmod(xray_path, 0o755) 1084 | 1085 | print(f"Xray核心程序已下载并解压到 {platform_dir}") 1086 | return True 1087 | 1088 | except Exception as e: 1089 | print(f"下载Xray失败: {str(e)}") 1090 | return False 1091 | 1092 | def find_core_program(): 1093 | """查找V2Ray/Xray核心程序,如果没有找到则自动下载Xray""" 1094 | global CORE_PATH 1095 | 1096 | # 检测操作系统类型 1097 | is_windows = platform.system() == "Windows" 1098 | 1099 | # V2Ray可执行文件名 1100 | v2ray_exe = "v2ray.exe" if is_windows else "v2ray" 1101 | xray_exe = "xray.exe" if is_windows else "xray" 1102 | 1103 | # 首先检查xray-core目录 1104 | xray_core_dir = "./xray-core" 1105 | platform_dir = "windows-64" if is_windows else "linux-64" 1106 | xray_platform_path = os.path.join(xray_core_dir, platform_dir, xray_exe) 1107 | 1108 | # 检查Xray是否存在 1109 | if os.path.isfile(xray_platform_path) and os.access(xray_platform_path, os.X_OK if not is_windows else os.F_OK): 1110 | CORE_PATH = xray_platform_path 1111 | print(f"找到Xray核心程序: {CORE_PATH}") 1112 | return CORE_PATH 1113 | 1114 | # 然后检查v2ray-core目录 1115 | v2ray_core_dir = "./v2ray-core" 1116 | v2ray_platform_path = os.path.join(v2ray_core_dir, platform_dir, v2ray_exe) 1117 | 1118 | # 检查V2Ray是否存在 1119 | if os.path.isfile(v2ray_platform_path) and os.access(v2ray_platform_path, os.X_OK if not is_windows else os.F_OK): 1120 | CORE_PATH = v2ray_platform_path 1121 | print(f"找到V2Ray核心程序: {CORE_PATH}") 1122 | return CORE_PATH 1123 | 1124 | # 搜索路径 1125 | search_paths = [ 1126 | ".", # 当前目录 1127 | "./v2ray", # v2ray子目录 1128 | "./xray", # xray子目录 1129 | os.path.expanduser("~"), # 用户主目录 1130 | ] 1131 | 1132 | # Windows特定搜索路径 1133 | if is_windows: 1134 | search_paths.extend([ 1135 | "C:\\Program Files\\v2ray", 1136 | "C:\\Program Files (x86)\\v2ray", 1137 | "C:\\v2ray", 1138 | ]) 1139 | # Linux特定搜索路径 1140 | else: 1141 | search_paths.extend([ 1142 | "/usr/bin", 1143 | "/usr/local/bin", 1144 | "/opt/v2ray", 1145 | "/opt/xray", 1146 | ]) 1147 | 1148 | # 搜索V2Ray或XRay可执行文件 1149 | for path in search_paths: 1150 | v2ray_path = os.path.join(path, v2ray_exe) 1151 | xray_path = os.path.join(path, xray_exe) 1152 | 1153 | if os.path.isfile(v2ray_path) and os.access(v2ray_path, os.X_OK if not is_windows else os.F_OK): 1154 | CORE_PATH = v2ray_path 1155 | print(f"找到V2Ray核心程序: {CORE_PATH}") 1156 | return CORE_PATH 1157 | 1158 | if os.path.isfile(xray_path) and os.access(xray_path, os.X_OK if not is_windows else os.F_OK): 1159 | CORE_PATH = xray_path 1160 | print(f"找到XRay核心程序: {CORE_PATH}") 1161 | return CORE_PATH 1162 | 1163 | # 如果未找到核心程序,自动下载Xray 1164 | print("未找到V2Ray或Xray核心程序,准备自动下载...") 1165 | if download_xray_core(): 1166 | # 重新检查Xray是否已下载 1167 | if os.path.isfile(xray_platform_path) and os.access(xray_platform_path, os.X_OK if not is_windows else os.F_OK): 1168 | CORE_PATH = xray_platform_path 1169 | print(f"已成功下载并使用Xray核心程序: {CORE_PATH}") 1170 | return CORE_PATH 1171 | 1172 | # 如果仍未找到,提示用户手动下载 1173 | print("自动下载失败。请访问 https://github.com/XTLS/Xray-core/releases 手动下载并安装") 1174 | print("将Xray核心程序放在当前目录或指定系统路径中") 1175 | return None 1176 | 1177 | def find_available_port(start_port=10000, end_port=60000): 1178 | """查找可用的端口""" 1179 | while True: 1180 | port = random.randint(start_port, end_port) 1181 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 1182 | try: 1183 | sock.bind(('127.0.0.1', port)) 1184 | sock.close() 1185 | return port 1186 | except: 1187 | sock.close() 1188 | continue 1189 | 1190 | def generate_v2ray_config(node, local_port): 1191 | """根据节点信息生成V2Ray配置文件,采用与V2RayN相同的配置方式""" 1192 | config = { 1193 | "inbounds": [ 1194 | { 1195 | "port": local_port, 1196 | "listen": "127.0.0.1", 1197 | "protocol": "socks", 1198 | "settings": { 1199 | "auth": "noauth", # 不需要认证 1200 | "udp": True # 支持UDP 1201 | }, 1202 | "sniffing": { 1203 | "enabled": True, 1204 | "destOverride": ["http", "tls"] 1205 | } 1206 | } 1207 | ], 1208 | "outbounds": [ 1209 | # 出站连接将根据节点类型生成 1210 | ], 1211 | "log": { 1212 | "loglevel": "none" # 禁止日志输出,减少干扰 1213 | } 1214 | } 1215 | 1216 | # 根据节点类型配置出站连接,参考V2RayN的配置方式 1217 | if node['type'] == 'vmess': 1218 | # 基本VMess配置 1219 | outbound = { 1220 | "protocol": "vmess", 1221 | "settings": { 1222 | "vnext": [ 1223 | { 1224 | "address": node['server'], 1225 | "port": node['port'], 1226 | "users": [ 1227 | { 1228 | "id": node['uuid'], 1229 | "alterId": node.get('alterId', 0), 1230 | "security": node.get('cipher', 'auto') 1231 | } 1232 | ] 1233 | } 1234 | ] 1235 | }, 1236 | "streamSettings": { 1237 | "network": node.get('network', 'tcp'), 1238 | "security": "tls" if node.get('tls', False) else "none" 1239 | } 1240 | } 1241 | 1242 | # 添加网络特定配置,参考V2RayN的配置 1243 | if node.get('network') == 'ws': 1244 | outbound["streamSettings"]["wsSettings"] = { 1245 | "path": node.get('path', '/'), 1246 | "headers": { 1247 | "Host": node.get('host', node['server']) 1248 | } 1249 | } 1250 | elif node.get('network') == 'h2': 1251 | outbound["streamSettings"]["httpSettings"] = { 1252 | "path": node.get('path', '/'), 1253 | "host": [node.get('host', node['server'])] 1254 | } 1255 | elif node.get('network') == 'quic': 1256 | outbound["streamSettings"]["quicSettings"] = { 1257 | "security": node.get('quicSecurity', 'none'), 1258 | "key": node.get('quicKey', ''), 1259 | "header": { 1260 | "type": node.get('headerType', 'none') 1261 | } 1262 | } 1263 | elif node.get('network') == 'grpc': 1264 | outbound["streamSettings"]["grpcSettings"] = { 1265 | "serviceName": node.get('path', ''), 1266 | "multiMode": node.get('multiMode', False) 1267 | } 1268 | elif node.get('network') == 'tcp': 1269 | if node.get('headerType') == 'http': 1270 | outbound["streamSettings"]["tcpSettings"] = { 1271 | "header": { 1272 | "type": "http", 1273 | "request": { 1274 | "path": [node.get('path', '/')], 1275 | "headers": { 1276 | "Host": [node.get('host', '')] 1277 | } 1278 | } 1279 | } 1280 | } 1281 | 1282 | # TLS相关设置 1283 | if node.get('tls'): 1284 | outbound["streamSettings"]["tlsSettings"] = { 1285 | "serverName": node.get('sni', node.get('host', node['server'])), 1286 | "allowInsecure": node.get('allowInsecure', False) 1287 | } 1288 | 1289 | config["outbounds"] = [outbound] 1290 | elif node['type'] == 'trojan': 1291 | # 增强Trojan配置 1292 | config["outbounds"] = [{ 1293 | "protocol": "trojan", 1294 | "settings": { 1295 | "servers": [ 1296 | { 1297 | "address": node['server'], 1298 | "port": node['port'], 1299 | "password": node['password'] 1300 | } 1301 | ] 1302 | }, 1303 | "streamSettings": { 1304 | "network": node.get('network', 'tcp'), 1305 | "security": "tls", 1306 | "tlsSettings": { 1307 | "serverName": node.get('sni', node.get('host', node['server'])), 1308 | "allowInsecure": node.get('allowInsecure', False) 1309 | } 1310 | } 1311 | }] 1312 | 1313 | # 添加网络特定配置 1314 | if node.get('network') == 'ws': 1315 | config["outbounds"][0]["streamSettings"]["wsSettings"] = { 1316 | "path": node.get('path', '/'), 1317 | "headers": { 1318 | "Host": node.get('host', node['server']) 1319 | } 1320 | } 1321 | elif node['type'] == 'vless': 1322 | # 增强VLESS配置 1323 | config["outbounds"] = [{ 1324 | "protocol": "vless", 1325 | "settings": { 1326 | "vnext": [ 1327 | { 1328 | "address": node['server'], 1329 | "port": node['port'], 1330 | "users": [ 1331 | { 1332 | "id": node['uuid'], 1333 | "encryption": "none", 1334 | "flow": node.get('flow', '') 1335 | } 1336 | ] 1337 | } 1338 | ] 1339 | }, 1340 | "streamSettings": { 1341 | "network": node.get('network', 'tcp'), 1342 | "security": "tls" if node.get('tls', False) else "none" 1343 | } 1344 | }] 1345 | 1346 | # 添加网络特定配置 1347 | if node.get('network') == 'ws': 1348 | config["outbounds"][0]["streamSettings"]["wsSettings"] = { 1349 | "path": node.get('path', '/'), 1350 | "headers": { 1351 | "Host": node.get('host', node['server']) 1352 | } 1353 | } 1354 | elif node.get('network') == 'grpc': 1355 | config["outbounds"][0]["streamSettings"]["grpcSettings"] = { 1356 | "serviceName": node.get('path', ''), 1357 | "multiMode": node.get('multiMode', False) 1358 | } 1359 | 1360 | # TLS相关设置 1361 | if node.get('tls'): 1362 | config["outbounds"][0]["streamSettings"]["tlsSettings"] = { 1363 | "serverName": node.get('sni', node.get('host', node['server'])), 1364 | "allowInsecure": node.get('allowInsecure', False) 1365 | } 1366 | elif node['type'] == 'ss': 1367 | # Shadowsocks配置 1368 | config["outbounds"] = [{ 1369 | "protocol": "shadowsocks", 1370 | "settings": { 1371 | "servers": [ 1372 | { 1373 | "address": node['server'], 1374 | "port": node['port'], 1375 | "method": node['cipher'], 1376 | "password": node['password'] 1377 | } 1378 | ] 1379 | } 1380 | }] 1381 | elif node['type'] == 'socks': 1382 | # SOCKS配置 1383 | outbound = { 1384 | "protocol": "socks", 1385 | "settings": { 1386 | "servers": [ 1387 | { 1388 | "address": node['server'], 1389 | "port": node['port'] 1390 | } 1391 | ] 1392 | } 1393 | } 1394 | 1395 | # 如果有用户名和密码,添加到配置中 1396 | if node.get('username') and node.get('password'): 1397 | outbound["settings"]["servers"][0]["users"] = [ 1398 | { 1399 | "user": node['username'], 1400 | "pass": node['password'] 1401 | } 1402 | ] 1403 | 1404 | config["outbounds"] = [outbound] 1405 | elif node['type'] in ['http', 'https']: 1406 | # HTTP/HTTPS配置 1407 | outbound = { 1408 | "protocol": "http", 1409 | "settings": { 1410 | "servers": [ 1411 | { 1412 | "address": node['server'], 1413 | "port": node['port'] 1414 | } 1415 | ] 1416 | } 1417 | } 1418 | 1419 | # 如果有用户名和密码,添加到配置中 1420 | if node.get('username') and node.get('password'): 1421 | outbound["settings"]["servers"][0]["users"] = [ 1422 | { 1423 | "user": node['username'], 1424 | "pass": node['password'] 1425 | } 1426 | ] 1427 | 1428 | config["outbounds"] = [outbound] 1429 | else: 1430 | # 对于不完全支持的协议,使用简单配置 1431 | if DEBUG_MODE: 1432 | print(f"警告: 节点类型 {node['type']} 可能不被完全支持,使用基本配置") 1433 | return None 1434 | 1435 | return config 1436 | 1437 | def test_node_latency(node): 1438 | """使用核心程序测试节点延迟""" 1439 | if not CORE_PATH: 1440 | if DEBUG_MODE: 1441 | print("未找到核心程序,无法进行延迟测试") 1442 | return -1 1443 | 1444 | # 为测试创建临时目录 1445 | temp_dir = tempfile.mkdtemp(prefix="node_test_") 1446 | config_file = os.path.join(temp_dir, "config.json") 1447 | 1448 | # 获取一个可用端口 1449 | local_port = find_available_port() 1450 | 1451 | # 生成配置文件 1452 | config = generate_v2ray_config(node, local_port) 1453 | if not config: 1454 | shutil.rmtree(temp_dir) 1455 | return -1 1456 | 1457 | with open(config_file, 'w') as f: 1458 | json.dump(config, f) 1459 | 1460 | # 启动核心进程 1461 | core_process = None 1462 | try: 1463 | # 设置代理环境变量,使用SOCKS代理 1464 | proxies = { 1465 | 'http': f'socks5://127.0.0.1:{local_port}', 1466 | 'https': f'socks5://127.0.0.1:{local_port}' 1467 | } 1468 | 1469 | # 设置与V2RayN相同的请求头 1470 | headers = { 1471 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', 1472 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 1473 | 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2' 1474 | } 1475 | 1476 | # 在Windows上,使用CREATE_NO_WINDOW标志隐藏控制台窗口 1477 | startupinfo = None 1478 | if platform.system() == "Windows": 1479 | startupinfo = subprocess.STARTUPINFO() 1480 | startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 1481 | startupinfo.wShowWindow = subprocess.SW_HIDE 1482 | 1483 | # 启动核心程序 1484 | core_process = subprocess.Popen( 1485 | [CORE_PATH, "-c", config_file], 1486 | stdout=subprocess.DEVNULL, 1487 | stderr=subprocess.DEVNULL, 1488 | startupinfo=startupinfo 1489 | ) 1490 | 1491 | # 等待核心程序启动 1492 | time.sleep(3) 1493 | 1494 | # 测试连接延迟 - 不再使用重试机制 1495 | start_time = time.time() 1496 | 1497 | # 按顺序尝试不同的测试URL 1498 | for test_url in TEST_URLS: 1499 | try: 1500 | if DEBUG_MODE: 1501 | print(f"测试节点: {node['name']} - 尝试URL: {test_url}") 1502 | 1503 | response = requests.get( 1504 | test_url, 1505 | proxies=proxies, 1506 | headers=headers, 1507 | timeout=CONNECTION_TIMEOUT 1508 | ) 1509 | 1510 | if response.status_code in [200, 204]: 1511 | latency = int((time.time() - start_time) * 1000) 1512 | if DEBUG_MODE: 1513 | print(f"测试成功: {node['name']} - URL: {test_url} - 延迟: {latency}ms") 1514 | return latency 1515 | else: 1516 | if DEBUG_MODE: 1517 | print(f"测试URL状态码错误: {response.status_code}") 1518 | except Exception as e: 1519 | if DEBUG_MODE: 1520 | print(f"测试失败: {test_url} - 错误: {str(e)}") 1521 | continue # 尝试下一个URL 1522 | 1523 | # 所有URL测试都失败 1524 | if DEBUG_MODE: 1525 | print(f"节点 {node['name']} 所有测试URL都失败") 1526 | return -1 1527 | 1528 | except Exception as e: 1529 | if DEBUG_MODE: 1530 | print(f"测试节点 {node['name']} 时发生错误: {str(e)}") 1531 | return -1 1532 | 1533 | finally: 1534 | # 清理资源 1535 | if core_process: 1536 | core_process.terminate() 1537 | try: 1538 | core_process.wait(timeout=5) 1539 | except subprocess.TimeoutExpired: 1540 | core_process.kill() 1541 | 1542 | # 删除临时目录 1543 | try: 1544 | shutil.rmtree(temp_dir) 1545 | except: 1546 | pass 1547 | 1548 | def test_latency(node): 1549 | """测试节点延迟""" 1550 | # 必须有核心程序才能进行测试 1551 | if not CORE_PATH: 1552 | print(f"未找到核心程序,无法测试节点: {node['name']}") 1553 | return -1 1554 | 1555 | # 使用核心程序进行精确测试 1556 | latency = test_node_latency(node) 1557 | 1558 | return latency 1559 | 1560 | def process_node(node): 1561 | """处理单个节点,添加延迟信息""" 1562 | if not node or 'name' not in node or 'server' not in node: 1563 | return None 1564 | 1565 | # print(f"测试节点: {node['name']} [{node['type']}] - {node['server']}:{node['port']}") 1566 | latency = test_latency(node) 1567 | 1568 | # 过滤掉延迟为0ms或连接失败的节点 1569 | if latency <= 0: 1570 | # status = "连接失败" if latency == -1 else "延迟为0ms" 1571 | # print(f"节点: {node['name']} ,{status},跳过") 1572 | return None 1573 | 1574 | # 更新节点名称,添加延迟信息 1575 | node['name'] = f"{node['name']} [{latency}ms]" 1576 | print(f"有效节点: {node['name']} ,延迟: {latency}ms") 1577 | return node 1578 | 1579 | def remove_duplicates(nodes): 1580 | """去除重复节点""" 1581 | unique_nodes = {} 1582 | for node in nodes: 1583 | try: 1584 | key = f"{node['server']}:{node['port']}" 1585 | if key not in unique_nodes: 1586 | unique_nodes[key] = node 1587 | except Exception as e: 1588 | # print(f"处理节点 {node['name']} 时出错: {str(e)}") 1589 | continue 1590 | return list(unique_nodes.values()) 1591 | 1592 | def node_to_v2ray_uri(node): 1593 | """将节点信息转换为V2Ray URI格式""" 1594 | if node['type'] == 'vmess': 1595 | config = { 1596 | 'v': '2', 1597 | 'ps': node['name'], 1598 | 'add': node['server'], 1599 | 'port': str(node['port']), 1600 | 'id': node['uuid'], 1601 | 'aid': str(node['alterId']), 1602 | 'net': node.get('network', 'tcp'), 1603 | 'type': node.get('type', 'none'), 1604 | 'tls': 'tls' if node.get('tls', False) else '' 1605 | } 1606 | return f"vmess://{base64.b64encode(json.dumps(config).encode()).decode()}" 1607 | elif node['type'] == 'trojan': 1608 | return f"trojan://{node['password']}@{node['server']}:{node['port']}?sni={node['name']}" 1609 | elif node['type'] == 'vless': 1610 | # 构建vless uri 1611 | query_parts = [] 1612 | if node.get('tls'): 1613 | query_parts.append('security=tls') 1614 | if node.get('flow'): 1615 | query_parts.append(f"flow={node['flow']}") 1616 | if node.get('network'): 1617 | query_parts.append(f"type={node['network']}") 1618 | query_string = '&'.join(query_parts) 1619 | return f"vless://{node['uuid']}@{node['server']}:{node['port']}?{query_string}&remarks={node['name']}" 1620 | elif node['type'] == 'ss': 1621 | # 构建ss uri 1622 | userinfo = f"{node['cipher']}:{node['password']}" 1623 | b64_userinfo = base64.b64encode(userinfo.encode()).decode() 1624 | return f"ss://{b64_userinfo}@{node['server']}:{node['port']}#{node['name']}" 1625 | elif node['type'] == 'ssr': 1626 | # 构建ssr uri 1627 | password_b64 = base64.b64encode(node['password'].encode()).decode() 1628 | name_b64 = base64.b64encode(node['name'].encode()).decode() 1629 | ssr_str = f"{node['server']}:{node['port']}:{node['protocol']}:{node['cipher']}:{node['obfs']}:{password_b64}/?remarks={name_b64}" 1630 | return f"ssr://{base64.b64encode(ssr_str.encode()).decode()}" 1631 | elif node['type'] in ['http', 'https']: 1632 | # 构建http/https uri 1633 | proto = 'http' if node['type'] == 'http' else 'https' 1634 | auth = f"{node['username']}:{node['password']}@" if node['username'] else "" 1635 | return f"{proto}://{auth}{node['server']}:{node['port']}?remarks={node['name']}" 1636 | elif node['type'] == 'socks': 1637 | # 构建socks uri 1638 | auth = f"{node['username']}:{node['password']}@" if node['username'] else "" 1639 | return f"socks://{auth}{node['server']}:{node['port']}?remarks={node['name']}" 1640 | elif node['type'] == 'hysteria': 1641 | # 构建hysteria uri 1642 | auth = f"{node['auth']}@" if node.get('auth') else "" 1643 | protocol_part = f"?protocol={node['protocol']}" if node.get('protocol') else "" 1644 | return f"hysteria://{auth}{node['server']}:{node['port']}{protocol_part}&peer={node['name']}" 1645 | elif node['type'] == 'wireguard': 1646 | # 构建wireguard uri 1647 | query_parts = [] 1648 | if node.get('private_key'): 1649 | query_parts.append(f"privateKey={node['private_key']}") 1650 | if node.get('public_key'): 1651 | query_parts.append(f"publicKey={node['public_key']}") 1652 | if node.get('allowed_ips'): 1653 | query_parts.append(f"allowedIPs={node['allowed_ips']}") 1654 | query_string = '&'.join(query_parts) 1655 | return f"wireguard://{node['server']}:{node['port']}?{query_string}&remarks={node['name']}" 1656 | return None 1657 | 1658 | def main(): 1659 | global CORE_PATH 1660 | 1661 | # 查找核心程序 1662 | CORE_PATH = find_core_program() 1663 | 1664 | all_nodes = [] 1665 | 1666 | # 获取并解析所有订阅 1667 | print("\n开始获取节点信息...") 1668 | for link in links: 1669 | print(f"\n正在处理订阅链接: {link}") 1670 | content = fetch_content(link) 1671 | if not content: 1672 | print("获取失败,跳过该链接") 1673 | continue 1674 | 1675 | # 使用新的级联提取函数 1676 | nodes = extract_nodes(content) 1677 | # print(f"成功提取 {len(nodes)} 个节点") 1678 | all_nodes.extend(nodes) 1679 | 1680 | # 节点去重 1681 | print(f"去重前节点数量: {len(all_nodes)}") 1682 | all_nodes = remove_duplicates(all_nodes) 1683 | print(f"去重后节点数量: {len(all_nodes)}") 1684 | 1685 | 1686 | # 暂时只测试获取节点信息 1687 | # return 1688 | 1689 | # 使用线程池并发测试节点延迟 1690 | print(f"\n开始测试节点延迟...") 1691 | valid_nodes = [] 1692 | # 限制并发数量,避免资源耗尽 1693 | with ThreadPoolExecutor(max_workers=MAX_CONCURRENT_TESTS) as executor: 1694 | future_to_node = {executor.submit(process_node, node): node for node in all_nodes} 1695 | for future in as_completed(future_to_node): 1696 | processed_node = future.result() 1697 | if processed_node: 1698 | valid_nodes.append(processed_node) 1699 | 1700 | print(f"\n测试完成,有效节点数量: {len(valid_nodes)}") 1701 | 1702 | # 收集所有有效节点的URI 1703 | valid_uris = [] 1704 | valid_uri_count = 0 1705 | for node in valid_nodes: 1706 | uri = node_to_v2ray_uri(node) 1707 | if uri: 1708 | valid_uris.append(uri) 1709 | valid_uri_count += 1 1710 | 1711 | # 将所有URI合并为一个字符串,并进行base64编码 1712 | if valid_uri_count > 0: 1713 | uri_content = '\n'.join(valid_uris) 1714 | base64_content = base64.b64encode(uri_content.encode('utf-8')).decode('utf-8') 1715 | 1716 | # 将base64编码后的内容写入文件 1717 | with open('v2ray.txt', 'w', encoding='utf-8') as f: 1718 | f.write(base64_content) 1719 | 1720 | print(f"\n已将 {valid_uri_count} 个有效节点以base64编码保存到 v2ray.txt 文件") 1721 | 1722 | # 同时保存一个原始文本版本,方便查看 1723 | with open('v2ray_raw.txt', 'w', encoding='utf-8') as f: 1724 | f.write(uri_content) 1725 | print(f"同时保存了原始文本版本到 v2ray_raw.txt 文件") 1726 | else: 1727 | print("\n未找到有效节点,不生成文件") 1728 | 1729 | if __name__ == '__main__': 1730 | main() -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.31.0 2 | pysocks>=1.7.1 3 | pyyaml>=6.0.1 -------------------------------------------------------------------------------- /v2ray.txt: -------------------------------------------------------------------------------- 1 | dHJvamFuOi8vMzQ4MmM3MWEtZDAxYy00YWU1LWI0NTQtZmE4Y2IzNzg1ZjY2QDk0LjEzMS4yMC4zOjQ0Mz9zbmk98J+HuvCfh7hfVVNf576O5Zu9XzIgWzQ5NG1zXQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5qWEhWa1pHVmxYSFZrT0ROalhIVmtaR1kzWDBsU1gxeDFOR1l3WVZ4MU5qY3hOeTArWEhWa09ETmpYSFZrWkdaaFhIVmtPRE5qWEhWa1pHWTRYMVZUWDF4MU4yWTRaVngxTlRabVpDQmJPVEEyYlhOZElpd2dJbUZrWkNJNklDSXhOemd1TWpJdU1USXhMams0SWl3Z0luQnZjblFpT2lBaU1UQTVNU0lzSUNKcFpDSTZJQ0kyWldZellqUXpNeTFsWldFM0xUUmxOV1F0T1RWaE5TMWpOV1kzTkRKalpUSm1ZamNpTENBaVlXbGtJam9nSWpBaUxDQWlibVYwSWpvZ0luUmpjQ0lzSUNKMGVYQmxJam9nSW5adFpYTnpJaXdnSW5Sc2N5STZJQ0lpZlE9PQp0cm9qYW46Ly8wZmM5YzVmZi05NTMxLTQxNzgtOTY2Zi03ZDk1OGUxZGY2NGJANDUuNjcuMjI5LjIyMjo0NDM/c25pPfCfh7Lwn4epX01EX+aRqeWwlOWkmueTpi0+8J+HuvCfh7hfVVNf576O5Zu9IFs2Njltc10KdHJvamFuOi8vZTZhMmU3NDEtMGZjZS00NDBiLTkxMGMtYjgxMzI1ZTIyNjNhQGJyaW5nLWdsb3ZlLXNoaW5lLnN0YXJrLWluZHVzdHJpZXMuc29sdXRpb25zOjQ0Mz9zbmk95pyq55+lXzEgWzcwOG1zXQp0cm9qYW46Ly9lNmEyZTc0MS0wZmNlLTQ0MGItOTEwYy1iODEzMjVlMjI2M2FAY2FjaGUtZ2l2ZXItd2lmZS5zdGFyay1pbmR1c3RyaWVzLnNvbHV0aW9uczo0NDM/c25pPeacquefpV8yIFs2Mjhtc10KdHJvamFuOi8vMGZjOWM1ZmYtOTUzMS00MTc4LTk2NmYtN2Q5NThlMWRmNjRiQDQ1LjE1OS4yNTEuMzM6NDQzP3NuaT3wn4ez8J+HsV9OTF/ojbflhbAgWzU3M21zXQp0cm9qYW46Ly8zNDgyYzcxYS1kMDFjLTRhZTUtYjQ1NC1mYThjYjM3ODVmNjZAY2hvcC13cmlzdC1idWQuc3RhcmstaW5kdXN0cmllcy5zb2x1dGlvbnM6NDQzP3NuaT3mnKrnn6VfMyBbNTIwbXNdCnRyb2phbjovLzM0ODJjNzFhLWQwMWMtNGFlNS1iNDU0LWZhOGNiMzc4NWY2NkBndXktdHJhY2UtbHlyaWMuc3RhcmstaW5kdXN0cmllcy5zb2x1dGlvbnM6NDQzP3NuaT3mnKrnn6VfNSBbNjUybXNdCnRyb2phbjovL2U2YTJlNzQxLTBmY2UtNDQwYi05MTBjLWI4MTMyNWUyMjYzYUBzdHJ1dC1icmlzay1zY29wZS5zdGFyay1pbmR1c3RyaWVzLnNvbHV0aW9uczo0NDM/c25pPeacquefpV80IFs2OThtc10Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlWVk5jZFRkbU9HVmNkVFUyWm1Rb2JXbGlaV2szTnk1amIyMGdYSFUzWXpjelhIVTRaREZrWEhVNE1qZ3lYSFUzTUdJNVhIVTFNakEyWEhVMFpXRmlLU0EzSUZzME56TnRjMTBpTENBaVlXUmtJam9nSW1OekxtWnNhR0V1Y25VaUxDQWljRzl5ZENJNklDSXlNRGd5SWl3Z0ltbGtJam9nSWpKbU9ESXhNVFV5TFdNelpUa3ROREEzTkMwNU1UZzFMVEkzT1RCbE56UXlOV1kwTWlJc0lDSmhhV1FpT2lBaU1DSXNJQ0p1WlhRaU9pQWlkM01pTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBPYXpsaGMyZHNSSHBJZW1wcmRGWjZWR3QyYUdGQkBhcnhmdzJiNzhmaTJxOWh6eWxobi5mcmVlc29ja3Mud29yazo0NDMjSlDml6XmnKwobWliZWk3Ny5jb20g57Gz6LSd6IqC54K55YiG5LqrKSA1IFs2ODFtc10KdHJvamFuOi8veHhvb0B1cy5ibGF6ZXBwbi5pbmZvOjQ0Mz9zbmk9dXMuYmxhemVwcG4uaW5mbyBbMzg2bXNdCnRyb2phbjovL2U2YTJlNzQxLTBmY2UtNDQwYi05MTBjLWI4MTMyNWUyMjYzYUBiYXRzLXBhcGVyLWNodW1wLnN0YXJrLWluZHVzdHJpZXMuc29sdXRpb25zOjQ0Mz9zbmk9YmF0cy1wYXBlci1jaHVtcC5zdGFyay1pbmR1c3RyaWVzLnNvbHV0aW9ucyBbNTMxbXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMzcuMTkuMTk4LjE2MDo0NDMj8J+HuvCfh7hVUy0zNy4xOS4xOTguMTYwLTAyNTcgWzE0MG1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDM3LjE5LjE5OC4yNDM6NDQzI/Cfh7rwn4e4VVMtMzcuMTkuMTk4LjI0My0wMjU0IFsxNDBtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAzNy4xOS4xOTguMjM2OjQ0MyPwn4e68J+HuFVTLTM3LjE5LjE5OC4yMzYtMDI1NiBbMTQ2bXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMzcuMTkuMTk4LjI0NDo0NDMj8J+HuvCfh7hVUy0zNy4xOS4xOTguMjQ0LTAyNTUgWzEzOG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG8wTm1VMk4yWTFZUzAyTTJVMExUUTFOall0T0Rjd1l5MDNObVZoWVRsalpqYzJabVU9QDE0OS4yOC4xMDYuMTM0OjMxNDQ0I/Cfh7rwn4e4VVMtMTQ5LjI4LjEwNi4xMzQtMDI0NyBbMTI5bXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMTU2LjE0Ni4zOC4xNzA6NDQzI/Cfh7rwn4e4VVMtMTU2LjE0Ni4zOC4xNzAtMDI0NCBbOTVtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAxNTYuMTQ2LjM4LjE2Nzo0NDMj8J+HuvCfh7hVUy0xNTYuMTQ2LjM4LjE2Ny0wMjQyIFs5NG1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDE3My4yNDQuNTYuNjo0NDMj8J+HuvCfh7hVUy0xNzMuMjQ0LjU2LjYtMDIzOSBbNTRtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAxNTYuMTQ2LjM4LjE2OTo0NDMj8J+HuvCfh7hVUy0xNTYuMTQ2LjM4LjE2OS0wMjQzIFs5NW1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDE3My4yNDQuNTYuOTo0NDMj8J+HuvCfh7hVUy0xNzMuMjQ0LjU2LjktMDIzOCBbNTNtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDc5LjEyNy4yMzMuMTcwOjk5MCPwn4eo8J+HpkNBLTc5LjEyNy4yMzMuMTcwLTAyNDEgWzEwOG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V2tsdlFUWTVVVGg1YUdOUlZqaHJZVE5RWVROQkA0NS4xNTguMTcxLjExMDo4MDgwI/Cfh6vwn4e3RlItNDUuMTU4LjE3MS4xMTAtMDI3MSBbMjk0bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcFJRMWhFZUhWRWJGUlVUVVEzYW5SblNGVnFTVzlxQDE5My4yOS4xMzkuMTM4OjgwODAj8J+Hs/Cfh7FOTC0xOTMuMjkuMTM5LjEzOC0wMjczIFszMDRtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAyMTIuMTAyLjQ3LjEyOTo0NDMj8J+HuvCfh7hVUy0yMTIuMTAyLjQ3LjEyOS0wMjM3IFs4Mm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBqZGtsSk9EVlVjbGMyYmpCUFIzbG1jRWhXVXpGMUAxOTMuMjkuMTM5LjE3OTo4MDgwI/Cfh7Pwn4exTkwtMTkzLjI5LjEzOS4xNzktMDI2NCBbMjk4bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcGpka2xKT0RWVWNsYzJiakJQUjNsbWNFaFdVekYxQDQ1Ljg3LjE3NS4xODE6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS4xODEtMDI3NCBbMjk5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcGpka2xKT0RWVWNsYzJiakJQUjNsbWNFaFdVekYxQDQ1Ljg3LjE3NS4xODg6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS4xODgtMDI3MiBbMjk5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBZVEp5Wm1sNGIzQm9aR3BtWm1FNFMxWkJORUZoQDQ1LjE1OC4xNzEuMTQxOjgwODAj8J+Hq/Cfh7dGUi00NS4xNTguMTcxLjE0MS0wMjY1IFszMDJtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRvME5HWmxOR0kzWkMxalpEUTRMVFExWm1NdFlUQXpOaTAyTUdWaE5EQmxOR0U1Tm1NPUAxMDcuMTkxLjYzLjI0MTozMDY2NSPwn4er8J+Ht0ZSLTEwNy4xOTEuNjMuMjQxLTAyODAgWzI4Mm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG8wWVRKeVptbDRiM0JvWkdwbVptRTRTMVpCTkVGaEA0NS44Ny4xNzUuMTU0OjgwODAj8J+HsfCfh7lMVC00NS44Ny4xNzUuMTU0LTAyNjkgWzMxOW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBSUTFoRWVIVkViRlJVVFVRM2FuUm5TRlZxU1c5cUA0NS4xNTguMTcxLjE0Njo4MDgwI/Cfh6vwn4e3RlItNDUuMTU4LjE3MS4xNDYtNTQ3MSBbMzEwbXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcFJRMWhFZUhWRWJGUlVUVVEzYW5SblNGVnFTVzlxQDQ1LjE1OC4xNzEuMTMyOjgwODAj8J+Hq/Cfh7dGUi00NS4xNTguMTcxLjEzMi0wMjk2IFszMDFtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwQ2IyY3dSVXh0VFUwNVJGTjRSR1JSQHNlcmllcy1hMi1tZS52YXJ6ZXNoMzYwLmNvOjQ0MyPwn4es8J+Hp0dCLTg1LjIxMC4xMjAuMjM3LTAzMTggWzM1OW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHAxTVRkVU0wSjJjRmxoWVdsMVZ6SmpAc2VyaWVzLWEyLW1lYy52YXJ6ZXNoMzYwLmNvOjQ0MyPwn4es8J+Hp0dCLTEzMS4xNDUuMTIyLjEyMC0wMzE3IFszMTVtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwWE56UllSa0ZNVEV4MWR6WnROVWxCQHNlcmllcy1hMi5zYW1hbmVoaGEuY286NDQzI/Cfh6zwn4enR0ItNzQuMTc3LjE5NS4yMzUtMDMyMiBbMzI5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzJPVTFWYVdrM1ZrUjNUWEZvTjBoNkBhZG1pbi5jNC53ZWJyYW16LmNvOjQ0MyPwn4es8J+Hp0dCLTg1LjIxMC4yMTguMTk3LTAzMTQgWzI5OW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG8wWVRKeVptbDRiM0JvWkdwbVptRTRTMVpCTkVGaEBiZWVzeWFyLm9yZzo4MDgwI/Cfh7Hwn4e5TFQtNDUuODcuMTc1LjE4MS01MTE5IFs0MjBtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRveGVFOHlZM0ZRWVhweGFrZG1RMlprQGZyZWFrY29uZmlnMTMuZmVsYWZlbC5vcmc6NDQzI/Cfh6zwn4enR0ItNzQuMTc3LjE5NS4yMzUtMDMxNSBbNDA0bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcG1PV1EzTTJNNE5HVXpNbUV4TUdZekA1Ny4xMjguMTkwLjE3MToxMTI1OSPwn4er8J+Ht0ZSLTU3LjEyOC4xOTAuMTcxLTAyOTEgWzI5Nm1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDIxMi4xMDIuNTMuMTk2OjQ0MyPwn4es8J+Hp0dCLTIxMi4xMDIuNTMuMTk2LTAyODYgWzI5OW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBYYzNSMVUyNXNkVFJwWlVFNVRUQk1AYWRtaW4uYzIud2VicmFtei5jbzo0NDMj8J+HrPCfh6dHQi0xMzEuMTQ1LjEyMi4xMjAtMDMxMiBbMjg1bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05Ub3hlRTh5WTNGUVlYcHhha2RtUTJaa0BhZG1pbi5jMS53ZWJyYW16LmNvOjQ0MyPwn4es8J+Hp0dCLTc0LjE3Ny4xOTUuMjM1LTAzMTkgWzI4M21zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG94VWxkM1dHaDNaa0ZDTldkQlJXOTZWVFJITWxCbkA0NS44Ny4xNzUuMTY0OjgwODAj8J+HsfCfh7lMVC00NS44Ny4xNzUuMTY0LTAyOTcgWzMwM21zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDIxMi4xMDIuNTMuODE6NDQzI/Cfh6zwn4enR0ItMjEyLjEwMi41My44MS0wMjk4IFsyODltc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwMU1UZFVNMEoyY0ZsaFlXbDFWekpqQHNlcmllcy1hMi1tZWMuc2FtYW5laGhhLmNvOjQ0MyPwn4es8J+Hp0dCLTEzMS4xNDUuMTIyLjEyMC0wMzA5IFszMDltc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAyMTIuMTAyLjUzLjE5NTo0NDMj8J+HrPCfh6dHQi0yMTIuMTAyLjUzLjE5NS0wMjg5IFsyODhtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAyMTIuMTAyLjUzLjE5Mzo0NDMj8J+HrPCfh6dHQi0yMTIuMTAyLjUzLjE5My0wMjg3IFsyODdtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAyMTIuMTAyLjUzLjE5ODo0NDMj8J+HrPCfh6dHQi0yMTIuMTAyLjUzLjE5OC0wMjk0IFsyODdtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwQ2IyY3dSVXh0VFUwNVJGTjRSR1JSQGFkbWluLmMzLndlYnJhbXouY286NDQzI/Cfh6zwn4enR0ItODUuMjEwLjEyMC4yMzctMDMxNiBbMjg4bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcHRjSE16Um5kdFJHcE1jbGRoVDFabkBzZXJpZXMtYTIudmFyemVzaDM2MC5jbzo0NDMj8J+HrPCfh6dHQi03NC4xNzcuMTk1LjIzNS0wMzI0IFszMDRtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAxNDkuMzQuMjQ0LjY4OjQ0MyPwn4ez8J+HsU5MLTE0OS4zNC4yNDQuNjgtMDI3OSBbMjk0bXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMjEyLjEwMi41My44MDo0NDMj8J+HrPCfh6dHQi0yMTIuMTAyLjUzLjgwLTAyOTMgWzI4OG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBDYjJjd1JVeHRUVTA1UkZONFJHUlJAODUuMjEwLjEyMC4yMzc6NDQzI/Cfh6zwn4enR0ItODUuMjEwLjEyMC4yMzctMDMwOCBbMjc5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBZVEp5Wm1sNGIzQm9aR3BtWm1FNFMxWkJORUZoQDQ1Ljg3LjE3NS4xNjY6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS4xNjYtMDM0MSBbMzAwbXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcFhOelJZUmtGTVRFeDFkelp0TlVsQkBzZXJpZXMtYTEuc2FtYW5laGhhLmNvOjQ0MyPwn4es8J+Hp0dCLTc0LjE3Ny4xOTUuMjM1LTAzMjAgWzM1OG1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDIxMi4xMDIuNTMuMTk0OjQ0MyPwn4es8J+Hp0dCLTIxMi4xMDIuNTMuMTk0LTAwNjQgWzI4N21zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDIxMi4xMDIuNTMuNzg6NDQzI/Cfh6zwn4enR0ItMjEyLjEwMi41My43OC0wMzI4IFsyOTltc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAyMTIuMTAyLjQ3LjEzMTo0NDMj8J+HuvCfh7hVUy0yMTIuMTAyLjQ3LjEzMS0wMjM2IFs5N21zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHAxTVRkVU0wSjJjRmxoWVdsMVZ6SmpAYXBpLm5hbWFzaGEuY286NDQzI/Cfh6zwn4enR0ItMTMxLjE0NS4xMjIuMTIwLTAzMTEgWzM2NW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHA1VFZnNVYwZFFaMVZGWTFKYWJXeGhZVEJaU0VoREAxMDMuMTA2LjEuOTI6MjM0OTIj8J+Hs/Cfh7FOTC0xMDMuMTA2LjEuOTItMDI4MyBbMzM5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05Ub3hVbGQzV0doM1prRkNOV2RCUlc5NlZUUkhNbEJuQDQ1LjE1OC4xNzEuMTUxOjgwODAj8J+Hq/Cfh7dGUi00NS4xNTguMTcxLjE1MS0wMzMwIFsyOTltc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDQ1LjE1NC4yMDYuMTkyOjk5MCPwn4eq8J+HuEVTLTQ1LjE1NC4yMDYuMTkyLTAzMDMgWzQyOW1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDE0OS4yMi45NS4xODM6NDQzI/Cfh6jwn4emQ0EtMTQ5LjIyLjk1LjE4My0wMjQwIFsxMDFtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAxNTYuMTQ2LjYyLjE2NDo0NDMj8J+HqPCfh61DSC0xNTYuMTQ2LjYyLjE2NC0wMzIxIFszMjJtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUAxNTYuMTQ2LjYyLjE2Mjo0NDMj8J+HqPCfh61DSC0xNTYuMTQ2LjYyLjE2Mi0wMzA1IFszMjNtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwMVVWTTFiblJXY1VNd01ITlRTMnRsVG5wVmFVUXpAODkuMjMuMTAzLjEyNTo0MjA5MCPwn4ez8J+HsU5MLTg5LjIzLjEwMy4xMjUtNTQ4OSBbMzI1bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcENiMmN3UlV4dFRVMDVSRk40UkdSUkBzZXJpZXMtYTItbWUuc2FtYW5laGhhLmNvOjQ0MyPwn4es8J+Hp0dCLTg1LjIxMC4xMjAuMjM3LTAzMDYgWzMxOW1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDIxMi4xMDIuNDcuMTMwOjQ0MyPwn4e68J+HuFVTLTIxMi4xMDIuNDcuMTMwLTAyMzQgWzc4bXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMjEyLjEwMi41My43OTo0NDMj8J+HrPCfh6dHQi0yMTIuMTAyLjUzLjc5LTAyOTUgWzI5NW1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDIxMi4xMDIuNTMuMTk3OjQ0MyPwn4es8J+Hp0dCLTIxMi4xMDIuNTMuMTk3LTAyODEgWzI4OG1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDE1Ni4xNDYuNjIuMTYxOjQ0MyPwn4eo8J+HrUNILTE1Ni4xNDYuNjIuMTYxLTAzMjYgWzMyM21zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDE1Ni4xNDYuNjIuMTYzOjQ0MyPwn4eo8J+HrUNILTE1Ni4xNDYuNjIuMTYzLTAzMzQgWzMyNW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBtT0dZM1lVTjZZMUJMWW5OR09IQXpAMzguMTY1LjIzMy4xODo5OTAj8J+HtfCfh75QWS0zOC4xNjUuMjMzLjE4LTU1MTEgWzQ2NG1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDE1Ni4xNDYuMzguMTY4OjQ0MyPwn4e68J+HuFVTLTE1Ni4xNDYuMzguMTY4LTAyNDYgWzk1bXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMTQ5LjIyLjg3LjIwNDo0NDMj8J+Hr/Cfh7VKUC0xNDkuMjIuODcuMjA0LTAyNjggWzIxNW1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDE0OS4yMi44Ny4yNDE6NDQzI/Cfh6/wn4e1SlAtMTQ5LjIyLjg3LjI0MS0wMjU5IFsyMzZtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2YzJoaFpHOTNjMjlqYTNNPUB1ay1kYzEueWFuZ29uLmNsdWI6NDQzI/Cfh6zwn4enR0ItMjEyLjEwMi41My4xOTctMDI5MiBbMzE1bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05Ub3hVbGQzV0doM1prRkNOV2RCUlc5NlZUUkhNbEJuQDQ1Ljg3LjE3NS4xNzg6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS4xNzgtMDI5MCBbMzA4bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBZVEp5Wm1sNGIzQm9aR3BtWm1FNFMxWkJORUZoQDQ1Ljg3LjE3NS4xNTc6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS4xNTctMDI3MCBbMzIzbXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMTQxLjk4LjEwMS4xNzg6NDQzI/Cfh6zwn4enR0ItMTQxLjk4LjEwMS4xNzgtMDMzMSBbMzE3bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcGlNalUzTWpka1ppMHhOV1ZoTFRRMU0yTXRZVEF3TmkweE0yWmxPVGhtWldVeFpEST1AMTQxLjE2NC42My4zMjozMDkzNiPwn4ew8J+Ht0tSLTE0MS4xNjQuNjMuMzItMDI2MyBbMzQxbXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMjEyLjEwMi40Ny4xMzI6NDQzI/Cfh7rwn4e4VVMtMjEyLjEwMi40Ny4xMzItMDIzNSBbNzltc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwa016Z3pOekl5TkdWa05EWTFaakF3QDQ1LjE0NC40OC42Mzo1NzQ1NiPwn4e18J+HsVBMLTQ1LjE0NC40OC42My01MDg3IFs0MDRtc10Kc3M6Ly9ZV1Z6TFRFeU9DMW5ZMjA2TUdSak1HRXdaV1V0TURBNFl5MDBNRFl6TFdJeVpqWXRZakZtWkRKaU9HVm1ORGRpQDQ1Ljg5LjEwOS4xODQ6MTAwMDEj8J+Hr/Cfh7VKUC00NS44OS4xMDkuMTg0LTU1MjIgWzIzNG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZWRWM2UUVWdWEyVnNkR1ZmYm05MGFXWW1KbFJIT2tCT2IzUnBabDlEYUdGMEAxMTYuMjA2LjEyNC40MTozNDA0NSPwn4e58J+HrVRILTExNi4yMDYuMTI0LjQxLTAzMzMgWzQ2Nm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V0Vkd01TdHBhR3htUzJjNE1qWklAMTg1LjE3Ny4yMjkuMjQ1OjE4NjYj8J+HqfCfh6pERS0xODUuMTc3LjIyOS4yNDUtMDM5NCBbMjk4bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBZVEp5Wm1sNGIzQm9aR3BtWm1FNFMxWkJORUZoQDQ1Ljg3LjE3NS4xOTk6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS4xOTktNTQ2MiBbMzMzbXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcFNhVkIxUzBwS2JERTRXbWQyVEhCVWFsZDRRbmRUWmt0cFVHdDBPV2Q2Umt0NWVFZERXVGhsU0hSUFkwUmlNbGc9QDUuMTg5LjIwMS4yNTA6MzEzNDgj8J+Ht/Cfh7pSVS01LjE4OS4yMDEuMjUwLTAzNDIgWzgwMG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V0Vkd01TdHBhR3htUzJjNE1qWklAMjA0LjEzNi4xMC4xMTU6MTg2NiPwn4eo8J+HrUNILTIwNC4xMzYuMTAuMTE1LTA5MzggWzM1MW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG93ZW5sRVVsb3hXRzFPV0dGaFEwRk9OMHRGUVRoaEA0NS4xNTEuNjIuNTQ6Mjg4MjUj8J+Ht/Cfh7pSVS00NS4xNTEuNjIuNTQtMDM2MCBbNDAxbXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNk56azNNems0TXpJdFlqZzRPQzAwTVRWaExXRTBOVFF0T0dJMU16a3hNV001TkRSaEB2cHMuMjAwNTY2Lnh5ejozMDMzMiPwn4e58J+HvFRXLTEuMTcwLjIwMy4xNzYtNTUwNyBbMzE5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcHhXSFpQTjNwWlZUZExaV0ZDTUUxa04wUlJURzkzQDUxLjE5NS4xMTkuNDc6MTA4MCPwn4er8J+Ht0ZSLTUxLjE5NS4xMTkuNDctNTI2MSBbMzUxbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlkyUkNTVVJXTkRKRVEzZHVaa2xPQDIzLjE1NC4xMzYuNTE6ODExOCPwn4e68J+HuFVTLTIzLjE1NC4xMzYuNTEtNTU5NSBbMjIybXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDM4LjEyMS40My43MTo4ODg4I/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTQ0MjQgWzExN21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZTMmw0VEhaTGVuZHFaV3RITURCeWJRPT1AMzguMTIxLjQzLjcxOjgwODAj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNTU2MSBbMTE2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlZFVjZhbVpCV1hFeVNXcDBkVzlUQDM4LjEyMS40My43MTo2Njk3I/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTUxMDYgWzExNm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaVFJHUTFkeVozQnJhbWt6VVZrPUAzOC4xMjEuNDMuNzE6OTEwMiPwn4e68J+HuFVTLTM4LjEyMS40My43MS01MTEzIFsxMTZtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2UzJsNFRIWkxlbmRxWld0SE1EQnliUT09QDM4LjEyMS40My43MTo1NTAwI/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTQ0NjAgWzExNW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZjRXRGVnpoS1VFSjVWRlpVVEhSTkAzOC4xMjEuNDMuNzE6NDQ0NCPwn4e68J+HuFVTLTM4LjEyMS40My43MS01NTYzIFsxMTVtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VW1WNGJrSm5WVGRGVmpWQlJIaEhAMjE2LjM5LjI0OC4xMzM6NzAwMSPwn4e68J+HuFVTLTIxNi4zOS4yNDguMTMzLTU1NjIgWzExNW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaVFJHUTFkeVozQnJhbWt6VVZrPUAzOC4xMjEuNDMuNzE6OTEwMSPwn4e68J+HuFVTLTM4LjEyMS40My43MS01MTg0IFsxMTdtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2WTJSQ1NVUldOREpFUTNkdVprbE9AMzguMTIxLjQzLjcxOjgxMTkj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtMDQ1NCBbMTE2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlMybDRUSFpMZW5kcVpXdEhNREJ5YlE9PUAzOC4xMjEuNDMuNzE6ODAwMCPwn4e68J+HuFVTLTM4LjEyMS40My43MS01MTM3IFsxMjJtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Wm1GQ1FXOUVOVFJyT0RkVlNrYzNAMzguMTEwLjEuODg6MjM3NiPwn4e68J+HuFVTLTM4LjExMC4xLjg4LTUxODcgWzE5MW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUAzOC4xMjEuNDMuNzE6NTAwMCPwn4e68J+HuFVTLTM4LjEyMS40My43MS00NDI1IFsxMThtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V1RaU09YQkJkSFo0ZUhwdFIwTT1AMzguMTIxLjQzLjcxOjU2MDEj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNTA5NiBbMTI0bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmNFdEZWemhLVUVKNVZGWlVUSFJOQDM4LjEyMS40My43MTo0NDMj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNDQ0MiBbMTE1bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDM4LjEyMS40My43MTozMzg5I/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTUxMzAgWzExNW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVRU51YmtnMlUxRlRibVp2VXpJM0AzOC4xMjEuNDMuNzE6ODA5MCPwn4e68J+HuFVTLTM4LjEyMS40My43MS01NTUxIFsxMTdtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V0V0R1Myd3ljbFZNYWtsd056UT1AMzguMTIxLjQzLjcxOjgwMDkj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNTEwMyBbMTE3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDM4LjEyMS40My43MTo1NjAwI/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTQ0MzAgWzExN21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVRU51YmtnMlUxRlRibVp2VXpJM0AzOC4xMjEuNDMuNzE6ODA5MSPwn4e68J+HuFVTLTM4LjEyMS40My43MS00NDIyIFsxMTVtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V1RaU09YQkJkSFo0ZUhwdFIwTT1AMzguMTIxLjQzLjcxOjUwMDEj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNTExNSBbMTE3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmVrUk9WbVZrVWtaUVVXVjRSemwyQDM4LjEyMS40My43MTo2Mzc5I/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTUxMTcgWzExNm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVbVY0YmtKblZUZEZWalZCUkhoSEAzOC4xMjEuNDMuNzE6NzAwMiPwn4e68J+HuFVTLTM4LjEyMS40My43MS00NDUwIFsxMTZtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Wm1GQ1FXOUVOVFJyT0RkVlNrYzNAMzguMTIxLjQzLjcxOjIzNzYj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNTEwNSBbMTE4bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmEwUlhkbGhaV205VVFtTkhhME0wQDM4LjEyMS40My43MTo4ODgyI/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTA0NjQgWzExNm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVbVY0YmtKblZUZEZWalZCUkhoSEAzOC4xMjEuNDMuNzE6NzAwMSPwn4e68J+HuFVTLTM4LjEyMS40My43MS00NDI4IFsxMThtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2YTBSWGRsaFpXbTlVUW1OSGEwTTBAMzguMTIxLjQzLjcxOjg4ODEj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNTA5NCBbMTE3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlkyUkNTVVJXTkRKRVEzZHVaa2xPQDM4LjEyMS40My43MTo4MTE4I/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTUxMDggWzExOG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUAzOC4xMjEuNDMuNzE6MzMwNiPwn4e68J+HuFVTLTM4LjEyMS40My43MS00NDU5IFsxMTltc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V0V0R1Myd3ljbFZNYWtsd056UT1AMzguMTIxLjQzLjcxOjgwMDgj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNTExMSBbMTE5bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlZFVjZhbVpCV1hFeVNXcDBkVzlUQDM4LjEyMS40My43MTo2Njc5I/Cfh7rwn4e4VVMtMzguMTIxLjQzLjcxLTQ0NDUgWzExNm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUAyMy4xNTQuMTM2LjUxOjg4ODgj8J+HuvCfh7hVUy0yMy4xNTQuMTM2LjUxLTU1OTYgWzE3MG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZSbTlQYVVkc2EwRkJPWGxRUlVkUUAzOC4xMjEuNDMuNzE6NzMwNyPwn4e68J+HuFVTLTM4LjEyMS40My43MS01MTQ4IFsxMThtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Y0V0RlZ6aEtVRUo1VkZaVVRIUk5AMzguMTE0LjExNC4xNDM6NDQzI/Cfh7rwn4e4VVMtMzguMTE0LjExNC4xNDMtNTE4MyBbMzltc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2WnpWTlpVUTJSblF6UTFkc1NrbGtAMzguMTIxLjQzLjcxOjUwMDMj8J+HuvCfh7hVUy0zOC4xMjEuNDMuNzEtNTE0NyBbMzI2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmNFdEZWemhLVUVKNVZGWlVUSFJOQDM4LjExNC4xMTQuMTQzOjQ0NDQj8J+HuvCfh7hVUy0zOC4xMTQuMTE0LjE0My01NTQ3IFs0NW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaelZOWlVRMlJuUXpRMWRzU2tsa0AzOC4xMjEuNDMuNzE6NTAwNCPwn4e68J+HuFVTLTM4LjEyMS40My43MS00NDM3IFsxMjNtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2YkVkeGN6azFVV3RHU0c4eVRsWT1AMjMuMTU0LjEzNi41MTo1NDk5I/Cfh7rwn4e4VVMtMjMuMTU0LjEzNi41MS01MTMyIFsyMTNtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VkVWNmFtWkJXWEV5U1dwMGRXOVRAMjMuMTU0LjEzNi41MTo2Njk3I/Cfh7rwn4e4VVMtMjMuMTU0LjEzNi41MS01NTk0IFsxNDhtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V0V0R1Myd3ljbFZNYWtsd056UT1AMzguMTIxLjQzLjY6ODAwOCPwn4e68J+HuFVTLTM4LjEyMS40My42LTU1NTggWzExOW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBLU1doT05uSkNTMnRoUldKdlRFNVlWbE4yTlhKeEBjYTIyNS52cG5ib29rLmNvbTo4MCPwn4eo8J+HpkNBLTE0Mi40LjIxNi4yMjUtNTIzOSBbMjE1bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlptRkNRVzlFTlRSck9EZFZTa2MzQDM4LjExNC4xMTQuMTQzOjIzNzYj8J+HuvCfh7hVUy0zOC4xMTQuMTE0LjE0My01MTEwIFszOW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBLU1doT05uSkNTMnRoUldKdlRFNVlWbE4yTlhKeEAxNDIuNC4yMTYuMjI1OjgwI/Cfh6jwn4emQ0EtMTQyLjQuMjE2LjIyNS01MDY0IFsxNDVtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VW1WNGJrSm5WVGRGVmpWQlJIaEhAMzguMTE0LjExNC4xNDM6NzAwMiPwn4e68J+HuFVTLTM4LjExNC4xMTQuMTQzLTUxMDkgWzM5bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDM4LjExMC4xLjg4OjU2MDAj8J+HuvCfh7hVUy0zOC4xMTAuMS44OC01MTg1IFsxNTdtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VUVOdWJrZzJVMUZUYm1adlV6STNAMzguNjguMTM0LjIwMjo4MDkxI/Cfh7rwn4e4VVMtMzguNjguMTM0LjIwMi01MTAxIFs5MW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaelZOWlVRMlJuUXpRMWRzU2tsa0AzOC42OC4xMzQuMjAyOjUwMDMj8J+HuvCfh7hVUy0zOC42OC4xMzQuMjAyLTUxMDAgWzEwMG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaelZOWlVRMlJuUXpRMWRzU2tsa0AzOC4xMTAuMS4xOTc6NTAwMyPwn4e68J+HuFVTLTM4LjExMC4xLjE5Ny01MTc4IFsxNDJtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2WnpWTlpVUTJSblF6UTFkc1NrbGtAMzguNjguMTM0LjIwMjo1MDA0I/Cfh7rwn4e4VVMtMzguNjguMTM0LjIwMi01MTAyIFsxMDZtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2YkVkeGN6azFVV3RHU0c4eVRsWT1AMzguMTEwLjEuODg6NTQ5OSPwn4e68J+HuFVTLTM4LjExMC4xLjg4LTUxNjUgWzIxMm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZabUZDUVc5RU5UUnJPRGRWU2tjM0AzOC4xMjEuNDMuNzE6MjM3NSPwn4e68J+HuFVTLTM4LjEyMS40My43MS01MTIwIFs4OTJtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VkVWNmFtWkJXWEV5U1dwMGRXOVRAMjMuMTU0LjEzNi4xNDg6NjY3OSPwn4e68J+HuFVTLTIzLjE1NC4xMzYuMTQ4LTU1OTMgWzM1OW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZabUZDUVc5RU5UUnJPRGRWU2tjM0AzOC42OC4xMzQuMjAyOjIzNzUj8J+HuvCfh7hVUy0zOC42OC4xMzQuMjAyLTUxMDQgWzkybXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcG1PR1kzWVVONlkxQkxZbk5HT0hBekAxOTUuMTgxLjE2MC42Ojk5MCPwn4eo8J+Hv0NaLTE5NS4xODEuMTYwLjYtMDMwMiBbMzU0bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcG1SRVJ0U0RSUlpXWnRWM0ZOU2poVlZWSmFja2RvQDg2LjEwNC43NC4yNDM6MTQyNTUj8J+Hq/Cfh7dGUi04Ni4xMDQuNzQuMjQzLTU0ODUgWzI4OG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBtT0dZM1lVTjZZMUJMWW5OR09IQXpAMTM0LjI1NS4yMTAuNDk6OTkwI/Cfh6jwn4e+Q1ktMTM0LjI1NS4yMTAuNDktNTI1OSBbNDMxbXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcG1PR1kzWVVONlkxQkxZbk5HT0hBekAxODUuMTI2LjIzOS4yNTA6OTkwI/Cfh7fwn4e6UlUtMTg1LjEyNi4yMzkuMjUwLTUyNjggWzQ5MG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V2tsdlFUWTVVVGg1YUdOUlZqaHJZVE5RWVROQkA0NS44Ny4xNzUuMzU6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS4zNS01NjI3IFsyOTNtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDIwMy4yMy4xMjguMzM6OTkwI/Cfh63wn4ewSEstMjAzLjIzLjEyOC4zMy01Mjc4IFs2ODdtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDE4NS45My4xNzMuMjE4Ojk5MCPwn4en8J+HtEJPLTE4NS45My4xNzMuMjE4LTUwODYgWzYzMW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZSbTlQYVVkc2EwRkJPWGxRUlVkUUAzOC4xMjEuNDMuOTc6NzMwNyPwn4e68J+HuFVTLTM4LjEyMS40My45Ny01NTU3IFsyMTdtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2UzJsNFRIWkxlbmRxWld0SE1EQnliUT09QDM4LjEyMS40My45Nzo1NTAwI/Cfh7rwn4e4VVMtMzguMTIxLjQzLjk3LTU1NTUgWzE1OG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUAzOC4xMjEuNDMuOTc6NTAwMCPwn4e68J+HuFVTLTM4LjEyMS40My45Ny01NTYwIFsxNDFtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Um05UGFVZHNhMEZCT1hsUVJVZFFAMzguMTIxLjQzLjk3OjczMDYj8J+HuvCfh7hVUy0zOC4xMjEuNDMuOTctNTU0NCBbMjA4bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcFRhbVJIUTBoM1lXWnFhM1IwTVhKNmNFZDRWRXRaVkhaV1FsZGlPRmhoTmtVMVJGUnlOazE2WW1SSVVWTjNkbkJNYVVSamVtb3pialpOUW1wNU1uVjVSbE42WjNGbmRrTlhjMFJSYlhCTk5GWlJlbVpRZW5sSFdVWTFPSGRrZVVRPUAyMDguNjcuMTA1LjE5Njo0MjAyOSPwn4ez8J+HsU5MLTIwOC42Ny4xMDUuMTk2LTU1MTUgWzMwOG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V2tsdlFUWTVVVGg1YUdOUlZqaHJZVE5RWVROQkA0NS4xNTguMTcxLjY2OjgwODAj8J+Hq/Cfh7dGUi00NS4xNTguMTcxLjY2LTUwOTIgWzI4OW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB3VmpWQ1FYcHhURnB2YzA5bWRVbHlhM2x2WVdSVUA1LjE4MS4yMS4xOTQ6MTg2NjAj8J+HpvCfh7lBVC01LjE4MS4yMS4xOTQtMDMzOSBbMzI4bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcG1PR1kzWVVONlkxQkxZbk5HT0hBekA5Mi4xMTguMjA1LjIyODo5OTAj8J+HtfCfh7FQTC05Mi4xMTguMjA1LjIyOC01MjQ1IFszNTltc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdWNUazJTMlowY2xwQmFqTk1kVVpSUlZOeGJXNDBORTF2Tlc5RGRXOHlZMmx3YjBWellXVXlOVzF5YlVoSE1tOUtORlpVTXpkelkwSm1Wa0p3VGpWRVYzUlZSVXhhZFhSV2FHaFljemhNWlRWQ09HWmFPV2hNYmpsNWRIZDJZbVk9QDIwOC42Ny4xMDUuODc6NDI1MDEj8J+Hs/Cfh7FOTC0yMDguNjcuMTA1Ljg3LTU1MTQgWzMxMm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V2tsdlFUWTVVVGg1YUdOUlZqaHJZVE5RWVROQkA0NS44Ny4xNzUuMjg6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS4yOC0wOTQxIFsyOTdtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldrbHZRVFk1VVRoNWFHTlJWamhyWVROUVlUTkJANDUuODcuMTc1LjY1OjgwODAj8J+HsfCfh7lMVC00NS44Ny4xNzUuNjUtNTQ2OCBbMzA2bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcG1PR1kzWVVONlkxQkxZbk5HT0hBekAxODUuNDcuMjU1LjIyOjk5MCPwn4e18J+Ht1BSLTE4NS40Ny4yNTUuMjItNTI3MiBbMjYxbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlZFVjZhbVpCV1hFeVNXcDBkVzlUQDY5LjUwLjkzLjQ3OjY2Nzkj8J+HuvCfh7hVUy02OS41MC45My40Ny01NjM5IFsyMDZtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldrbHZRVFk1VVRoNWFHTlJWamhyWVROUVlUTkJANDUuMTU4LjE3MS42MDo4MDgwI/Cfh6vwn4e3RlItNDUuMTU4LjE3MS42MC01NjM4IFszMDVtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldrbHZRVFk1VVRoNWFHTlJWamhyWVROUVlUTkJAMTAzLjEwNC4yNDcuNDk6ODA4MCPwn4ez8J+HsU5MLTEwMy4xMDQuMjQ3LjQ5LTU0NzUgWzI5M21zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG93VW5OeVkwWktNWFpQYzFkRmNXY3pVRFUxYUhaaFlXTkxablZUYUZRd1kyTXhhREIwT0VGRU1FNUJPSFV4ZFZJPUA5Mi4zOC4xNzEuMjE1OjMxMzQ4I/Cfh6rwn4e4RVMtOTIuMzguMTcxLjIxNS01MjU4IFs1ODZtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdmFtTlFNelp1TVZOdmRVUmpia0puT1VWUFdsQTRAOS4xNjMuMjMyLjE4MDoxNDkwI/Cfh7Pwn4exTkwtOS4xNjMuMjMyLjE4MC01NjA4IFszMDFtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDEzNC4yMDkuMTQ3LjE5ODo5OTAj8J+HrvCfh7NJTi0xMzQuMjA5LjE0Ny4xOTgtNTQ1NCBbNTM4bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlVtVjRia0puVlRkRlZqVkJSSGhIQDM4LjEyMS40My45Nzo3MDAxI/Cfh7rwn4e4VVMtMzguMTIxLjQzLjk3LTU1NjUgWzI5OW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBtT0dZM1lVTjZZMUJMWW5OR09IQXpAMTgxLjExOS4zMC4yMDo5OTAj8J+HqPCfh7RDTy0xODEuMTE5LjMwLjIwLTUyNDEgWzQwNm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZZMlJDU1VSV05ESkVRM2R1WmtsT0AzOC4xMjEuNDMuOTc6ODExOSPwn4e68J+HuFVTLTM4LjEyMS40My45Ny01MTA3IFszMDltc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdk16aDVkWFo2VTJVemJUVmhSRTV3U0hSVlVFZ3hla2QzWWtkRldGaE5SSE5IZDFaaGRXSXlVMWxGYlVoVllUSlhSMXBWYW1sbGVsZ3pWbloyWVRsRFEzcHdhbmhaZEhWS1RHZExjMU51YzNsTFFtWTVZMmxRVm1KaE0zazBiek09QGJldGEubWF0dGVuYWRlbmUub3JnOjU0MDc1I/Cfh7rwn4e4VVMtOTQuMTMxLjIxLjE3NC01MjQ0IFs4MDhtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldrbHZRVFk1VVRoNWFHTlJWamhyWVROUVlUTkJAMTAzLjEwNC4yNDcuNDc6ODA4MCPwn4ez8J+HsU5MLTEwMy4xMDQuMjQ3LjQ3LTU0NzYgWzI5MW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaVFJHUTFkeVozQnJhbWt6VVZrPUAzOC4xNDMuNjYuODc6OTEwMiPwn4e68J+HuFVTLTM4LjE0My42Ni44Ny01NTY0IFszMDZtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwT2F6bGhjMmRzUkhwSWVtcHJkRlo2Vkd0MmFHRkJAMTYwLjE5Ljc4Ljc1OjQ0MyPwn4e78J+Hs1ZOLTE2MC4xOS43OC43NS01NTc5IFs1NDVtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldrbHZRVFk1VVRoNWFHTlJWamhyWVROUVlUTkJANDUuODcuMTc1LjkyOjgwODAj8J+HsfCfh7lMVC00NS44Ny4xNzUuOTItNTYzMCBbMjkxbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDM4LjE0My42Ni44NzozMzA2I/Cfh7rwn4e4VVMtMzguMTQzLjY2Ljg3LTU1NDYgWzM4Mm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBtT0dZM1lVTjZZMUJMWW5OR09IQXpAMTg1LjQ3LjI1My4yMjc6OTkwI/Cfh6rwn4eoRUMtMTg1LjQ3LjI1My4yMjctNTI3MSBbMjgwbXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcHZXa2x2UVRZNVVUaDVhR05SVmpocllUTlFZVE5CQDE5My4yOS4xMzkuMjUxOjgwODAj8J+Hs/Cfh7FOTC0xOTMuMjkuMTM5LjI1MS01NDc5IFsyOTZtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdk16aDVkWFo2VTJVemJUVmhSRTV3U0hSVlVFZ3hla2QzWWtkRldGaE5SSE5IZDFaaGRXSXlVMWxGYlVoVllUSlhSMXBWYW1sbGVsZ3pWbloyWVRsRFEzcHdhbmhaZEhWS1RHZExjMU51YzNsTFFtWTVZMmxRVm1KaE0zazBiek09QDk0LjEzMS4yMS4xNzQ6NTQwNzUj8J+HuvCfh7hVUy05NC4xMzEuMjEuMTc0LTU1MjEgWzUzN21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZWRVY2YW1aQldYRXlTV3AwZFc5VEAzOC4xNDMuNjYuODc6NjY5NyPwn4e68J+HuFVTLTM4LjE0My42Ni44Ny01MTUyIFszNzltc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V1RaU09YQkJkSFo0ZUhwdFIwTT1AMzguMTQzLjY2Ljg3OjMzODkj8J+HuvCfh7hVUy0zOC4xNDMuNjYuODctNTE3OSBbMzg2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDM4LjE0My42Ni44Nzo1MDAwI/Cfh7rwn4e4VVMtMzguMTQzLjY2Ljg3LTUxMTYgWzM2OG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB5ZEZJMFdWZzNOSFozY1ZKS2RUbE5SMGd6WlRGT00wTlJaRWROVjBOVlJtdDVUR2x6YVdwcFJuVjJhR3RWT1UxalZqVlVjSGxuWm10bGNtNUtORlZSWlRZelNuUmpSRkZyY2xFNVNHWmphSHB4VVhveGEweERibFJTYjNJNGFtYz1AMTY2LjEuMTU3LjIyODo1NTMzMCPwn4e68J+HuFVTLTE2Ni4xLjE1Ny4yMjgtNTUxNyBbMzczbXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcG1PR1kzWVVONlkxQkxZbk5HT0hBekAxODUuMTIzLjEwMS4yNDE6OTkwI/Cfh7nwn4e3VFItMTg1LjEyMy4xMDEuMjQxLTU1MDYgWzQzMG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUAyMy4xNTQuMTM2LjEzMjo1NjAxI/Cfh7rwn4e4VVMtMjMuMTU0LjEzNi4xMzItNTEyNyBbNDIxbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmEwUlhkbGhaV205VVFtTkhhME0wQDM4LjY4LjEzNS4xODo4ODgxI/Cfh7rwn4e4VVMtMzguNjguMTM1LjE4LTU1NTYgWzExNzRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2WTJSQ1NVUldOREpFUTNkdVprbE9AMzguNjguMTM1LjE4OjgxMTgj8J+HuvCfh7hVUy0zOC42OC4xMzUuMTgtNTU1MCBbMjQwbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlkyUkNTVVJXTkRKRVEzZHVaa2xPQDM4LjY4LjEzNS4xODo4MTE5I/Cfh7rwn4e4VVMtMzguNjguMTM1LjE4LTUxNTMgWzI1MG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaVFJHUTFkeVozQnJhbWt6VVZrPUAzOC42OC4xMzUuMTg6OTEwMiPwn4e68J+HuFVTLTM4LjY4LjEzNS4xOC01NTUyIFs1ODltc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2ZWtST1ZtVmtVa1pRVVdWNFJ6bDJAMzguMTQzLjY2Ljg3OjYzNzkj8J+HuvCfh7hVUy0zOC4xNDMuNjYuODctNTEzOCBbMzY2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlp6Vk5aVVEyUm5RelExZHNTa2xrQDIzLjE1NC4xMzYuMTMyOjUwMDQj8J+HuvCfh7hVUy0yMy4xNTQuMTM2LjEzMi01MTI2IFs0NTRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VkVWNmFtWkJXWEV5U1dwMGRXOVRAMzguNjguMTM1LjE4OjY2OTcj8J+HuvCfh7hVUy0zOC42OC4xMzUuMTgtNDQ1MyBbNDc5bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDM4LjY4LjEzNS4xODozMzg5I/Cfh7rwn4e4VVMtMzguNjguMTM1LjE4LTUxODAgWzU3OW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaelZOWlVRMlJuUXpRMWRzU2tsa0AzOC42OC4xMzUuMTg6NTAwMyPwn4e68J+HuFVTLTM4LjY4LjEzNS4xOC00NDM0IFs2MTVtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2WlRSR1ExZHlaM0JyYW1relVWaz1AMzguNjguMTM1LjE4OjkxMDEj8J+HuvCfh7hVUy0zOC42OC4xMzUuMTgtNTE3NyBbNDM2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlMybDRUSFpMZW5kcVpXdEhNREJ5YlE9PUAzOC42OC4xMzUuMTg6ODAwMCPwn4e68J+HuFVTLTM4LjY4LjEzNS4xOC01NTY2IFs1NDRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V1RaU09YQkJkSFo0ZUhwdFIwTT1AMzguNjguMTM1LjE4Ojg4ODgj8J+HuvCfh7hVUy0zOC42OC4xMzUuMTgtNTU0NSBbMzgwbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldFdEdTMnd5Y2xWTWFrbHdOelE9QDM4LjY4LjEzNS4xODo4MDA5I/Cfh7rwn4e4VVMtMzguNjguMTM1LjE4LTQ0NDMgWzMwMm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZTMmw0VEhaTGVuZHFaV3RITURCeWJRPT1AMzguMTIxLjQzLjk3OjgwODAj8J+HuvCfh7hVUy0zOC4xMjEuNDMuOTctNTE0OSBbNzg0bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmEwUlhkbGhaV205VVFtTkhhME0wQDM4LjEyMS40My45Nzo4ODgxI/Cfh7rwn4e4VVMtMzguMTIxLjQzLjk3LTUxNTEgWzc1OG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVbVY0YmtKblZUZEZWalZCUkhoSEAzOC42OC4xMzUuMTg6NzAwMSPwn4e68J+HuFVTLTM4LjY4LjEzNS4xOC01NTQ4IFsxMTk3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlVtVjRia0puVlRkRlZqVkJSSGhIQDM4LjY4LjEzNS4xODo3MDAyI/Cfh7rwn4e4VVMtMzguNjguMTM1LjE4LTUxMzEgWzEyMDRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Um05UGFVZHNhMEZCT1hsUVJVZFFAMzguNjguMTM1LjE4OjczMDYj8J+HuvCfh7hVUy0zOC42OC4xMzUuMTgtNTEzNSBbMTE5M21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUAyMy4xNTQuMTM2LjEzMjo1MDAwI/Cfh7rwn4e4VVMtMjMuMTU0LjEzNi4xMzItNTEyOCBbNDk2bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcE1UVk5PYURJeFZISllhbEl5YjJzeU5WRXlia1U0UlU1VU1ucHZRbTFRZG10aE0xSkRRMVZCU0ZwRlRFTnVWMjlsYTFacWRtRm1PRGx4ZDJOU2EyUmllRVZtWlhBeVltTXlZVlYwYlc1NGNYWkdNV0Y1VVZKbGVqRktTR3BWVEdvPUBleGNoYW5nZS5nYW1lYXVyZWxhLmNsaWNrOjUyOTUyI/Cfh7rwn4e4VVMtMTY2Ljg4LjEzMS4xOTUtNTU1NCBbNTAwbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlMybDRUSFpMZW5kcVpXdEhNREJ5YlE9PUAzOC42OC4xMzUuMTg6ODA4MCPwn4e68J+HuFVTLTM4LjY4LjEzNS4xOC01NTQ5IFsxMTY3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlVFTnVia2cyVTFGVGJtWnZVekkzQDM4LjY4LjEzNS4xODo4MDkwI/Cfh7rwn4e4VVMtMzguNjguMTM1LjE4LTQ0NTcgWzE0NDBtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Y0V0RlZ6aEtVRUo1VkZaVVRIUk5AMzguNjguMTM1LjE4OjQ0NDQj8J+HuvCfh7hVUy0zOC42OC4xMzUuMTgtNTU1MyBbMTQyOW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUAzOC42OC4xMzUuMTg6NTYwMSPwn4e68J+HuFVTLTM4LjY4LjEzNS4xOC00NDQ5IFsxMDFtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VUVOdWJrZzJVMUZUYm1adlV6STNAMzguMTIxLjQzLjk3OjgwOTEj8J+HuvCfh7hVUy0zOC4xMjEuNDMuOTctNTE0NiBbMTU5bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlZFVjZhbVpCV1hFeVNXcDBkVzlUQDM4LjEyMS40My45Nzo2Njk3I/Cfh7rwn4e4VVMtMzguMTIxLjQzLjk3LTUxNTAgWzE1Nm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZTMmw0VEhaTGVuZHFaV3RITURCeWJRPT1AMzguNjguMTM1LjE4OjU1MDAj8J+HuvCfh7hVUy0zOC42OC4xMzUuMTgtMDQ2NyBbMTQ0NW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBWUkdOcVdWRTJXalpCU1ZkNFZtbGFjSEY1VDIxUEA0Ni4yNDYuOTguMTU1OjQ0MDEzI/Cfh7jwn4eqU0UtNDYuMjQ2Ljk4LjE1NS0wMzI3IFszMjZtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwa016Z3pOekl5TkdWa05EWTFaakF3QHdhci5zc3ZwbmFwcC53aW46NTc0NTYj8J+HtfCfh7FQTC00NS4xNDQuNDguNjMtMDM0NiBbNDgybXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBhblU0TnpObGRuQnFaV0ZCYVRoYWNURXlXVzlTU0Zkd05qTnZOV1Y0Wkc1YU56RmhWV2N4V1VWRGFHbFFWR015U0d0aGMxbG9WVUo0VW5vM1ZVZHBORXMyWTB4eWMwZGhWVFppTkRSSU5GRmhObVkwWTBwdU0zcENjREpqYmxnPUAxODUuNS4zOC4xMTE6NTU5ODgj8J+HrPCfh6dHQi0xODUuNS4zOC4xMTEtNTI3MCBbNDE5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcGlXamczWVcxUWNHUkhOMHQxVjAwMk1tSkxkRzB4UzBodmIzZDFWbXB1VmpoRFMzUnhOalV6ZVcxSVkyY3laRkJaWTFCS1ptNWhVVFl4YzNSMVFXcHlNbHBwVEVSaGNVZzFObGh3YTNoRldYVjNSSHA2VW5KTlYybGxaV0pYUjNRPUBteDIuZHJhd25yaXNoYS5vbmU6NTU5ODgj8J+HrPCfh6dHQi0xODUuNS4zOC4xMTEtNTI2OSBbNjMxbXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcHZXa2x2UVRZNVVUaDVhR05SVmpocllUTlFZVE5CQDE5My4yOS4xMzkuMjAyOjgwODAj8J+Hs/Cfh7FOTC0xOTMuMjkuMTM5LjIwMi01NDc4IFszMDhtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRvek5qQmxNakZrTWpFNU56ZGtZekV4QDQ1LjEzOS4yNC4yNDo1NzQ1NiPwn4e38J+HulJVLTQ1LjEzOS4yNC4yNC01NDg2IFs0MjNtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDY0Ljc0LjE2My4xMzA6OTkwI/Cfh7rwn4e4VVMtNjQuNzQuMTYzLjEzMC01NTEyIFsxNDRtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDE1NC4yMDUuMTU5LjEwMDo5OTAj8J+HrvCfh6lJRC0xNTQuMjA1LjE1OS4xMDAtNTUxOSBbNTQzbXNdCnNzOi8vWVdWekxURXlPQzFuWTIwNldXTXlRM1J5U1hvNFRBPT1AMi41OC44Ny4yMjE6MTY4OTkj8J+HuvCfh7hVUy0yLjU4Ljg3LjIyMS01NTU5IFs1OW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V2tsdlFUWTVVVGg1YUdOUlZqaHJZVE5RWVROQkA0NS44Ny4xNzUuNjk6ODA4MCPwn4ex8J+HuUxULTQ1Ljg3LjE3NS42OS01NjI5IFsyODltc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDE0Ny43OC4xLjI3Ojk5MCPwn4ey8J+HvU1YLTE0Ny43OC4xLjI3LTU2MzEgWzQyOTltc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldFZHdNU3RwYUd4bVMyYzRNalpJQDE3Mi4yMzMuMTI4LjEyNjoxODY2I1NTLee+juWbvS1ORuino+mUgeiHquWItuWJpy1DaGF0R1BULVRpa1Rvay1Zb3VUdWJlLTE3Mi4yMzMuMTI4LjEyNjoxODY2IFsyMm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBXY0V0QlFtTlBjRTVPUVRCc05VY3lRVlpQYlhjNEAyMTMuMTA5LjE0Ny4yNDI6NjI2ODUjU1Mt6I235YWwLU5G6Kej6ZSB6I235YWw6Ieq5Yi25YmnLUNoYXRHUFQtVGlrVG9rLVlvdVR1YmUtMjEzLjEwOS4xNDcuMjQyOjYyNjg1IFszMDRtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwVlRERkliVXB6VDNORU1qRm9PVFkyTlc5SGNsSjJANjIuNjAuMjQ3LjQwOjUyNDYxI1NTLeS8iuacly1ORuino+mUgeiNt+WFsOiHquWItuWJpy1DaGF0R1BULVlvdVR1YmUtNjIuNjAuMjQ3LjQwOjUyNDYxIFszMzBtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwUVNucHFaekJQU1ZSTVZqSjJSRlpXYWtacVZITkVANjIuMjEwLjg4LjIyOjQ0MyNTUy3ms5Xlm70tTkbop6PplIHms5Xlm73lnLDljLrpnZ7oh6rliLbliactQ2hhdEdQVC1UaWtUb2stWW91VHViZS02Mi4yMTAuODguMjI6NDQzIFszMjdtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRvek5qQmxNakZrTWpFNU56ZGtZekV4QDEwNC4xNjcuMTk3LjI1OjU3NDU2I1NTLee+juWbvS1ORuino+mUgeiHquWItuWJpy1DaGF0R1BULVRpa1Rvay1Zb3VUdWJlLTEwNC4xNjcuMTk3LjI1OjU3NDU2IFsxNDNtc10Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFUwWlRCaFhIVTJaRGMzWEhVMVpUQXlYSFUxWmprd1hIVTJZelEzWEhVMU16TmhJRngxT0RBMU5GeDFPVEF4WVZ4MU5tWXhOVngxTm1OaU0xeDFObU5tWlZ4MU5qVTNNRngxTmpNMlpWeDFOR1V5WkZ4MU5XWmpNeUJiTVRRME1tMXpYU0lzSUNKaFpHUWlPaUFpYkhRdVpuaHNZMjR1WTI5dElpd2dJbkJ2Y25RaU9pQWlORFV5T1RRaUxDQWlhV1FpT2lBaU5EWTVaVEJpTXpFdE16QmpNeTAwWkdGaUxUZ3dNR1F0TnpFeE1qTXlOak0wWTJVeElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VWxrelJqRktRVWxLVFRaRFNUbElWZz09QDE4NS40Ny4yNTIuMTY6MjAwMDkj8J+foF/wn4e18J+Hql/wn5K7X2dpdGh1Yi5jb20vUnVrMW5nMDAxXzMxNjU2NjMwNjI2NTMzNjIgWzQ0MG1zXQp2bGVzczovLzRhODRhZmQ0LTdkZTAtNDg1OS04NTg0LTEyODQ3ZThlZGE3MUB3ZWJmcmVlY2xvdWQuemRzYS51cy5rZzo0NDM/c2VjdXJpdHk9dGxzJnR5cGU9d3MmcmVtYXJrcz1naXRodWIuY29tL1J1azFuZzAwMV82NDYzNjY2NTM5NjU2NTM2IFszODczbXNdCnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhVeU56VXpYMXgxWkRnelkxeDFaR1JsT0Z4MVpEZ3pZMXgxWkdSbU0xOWNkV1E0TTJSY2RXUmpaalpmWjJsMGFIVmlMbU52YlM5U2RXc3hibWN3TURGZk16TTJNalkyTXpNek9EWTFNellnV3pRME1tMXpYU0lzSUNKaFpHUWlPaUFpTVRJd0xqSXhNQzR5TURVdU5Ua2lMQ0FpY0c5eWRDSTZJQ0kxTURBd01pSXNJQ0pwWkNJNklDSTBNVGd3TkRoaFppMWhNamt6TFRSaU9Ua3RPV0l3WXkwNU9HTmhNelU0TUdSa01qUWlMQ0FpWVdsa0lqb2dJalkwSWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhVeU56VXpYMXgxWkRnelkxeDFaR1JsT0Z4MVpEZ3pZMXgxWkdSbU0xOWNkV1E0TTJSY2RXUmpaalpmWjJsMGFIVmlMbU52YlM5U2RXc3hibWN3TURGZk16RXpOek00TXpnek16TTFOalF6TWlCYk16WXhiWE5kSWl3Z0ltRmtaQ0k2SUNJeE1USXVNVE15TGpJeE5TNHhNaUlzSUNKd2IzSjBJam9nSWpVd01EQXlJaXdnSW1sa0lqb2dJalF4T0RBME9HRm1MV0V5T1RNdE5HSTVPUzA1WWpCakxUazRZMkV6TlRnd1pHUXlOQ0lzSUNKaGFXUWlPaUFpTUNJc0lDSnVaWFFpT2lBaWRHTndJaXdnSW5SNWNHVWlPaUFpZG0xbGMzTWlMQ0FpZEd4eklqb2dJaUo5CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWm1VeFgxeDFaRGd6WTF4MVpHUmxPRngxWkRnelkxeDFaR1JtTTE5Y2RXUTRNMlJjZFdSalpqWmZaMmwwYUhWaUxtTnZiUzlTZFdzeGJtY3dNREZmTmpNek56TXpOakV6TWpNME16VXpPU0JiTkRVMGJYTmRJaXdnSW1Ga1pDSTZJQ0l4TVRJdU1UTXlMakl4TlM0ek5DSXNJQ0p3YjNKMElqb2dJalV3TURBM0lpd2dJbWxrSWpvZ0lqUXhPREEwT0dGbUxXRXlPVE10TkdJNU9TMDVZakJqTFRrNFkyRXpOVGd3WkdReU5DSXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZEdOd0lpd2dJblI1Y0dVaU9pQWlkbTFsYzNNaUxDQWlkR3h6SWpvZ0lpSjkKdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzME1UVnRjMTBpTENBaVlXUmtJam9nSWpnMExqSTBOeTR4TkRZdU1UWXhJaXdnSW5CdmNuUWlPaUFpTXprMU16QWlMQ0FpYVdRaU9pQWlOMkZoTlRabE16a3RNamxpT0MwME5XTXpMVGhpTlRNdE5tUXlZVEl6WWpJME5qRmpJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpUUZZeWNtRjVNVjlPWnlCYk5EYzBiWE5kSWl3Z0ltRmtaQ0k2SUNJMUxqRTVOaTR5T1M0eE1qTWlMQ0FpY0c5eWRDSTZJQ0l5TURneUlpd2dJbWxrSWpvZ0lqRXhNbUZqTXpabUxUTm1OVE10TkdVeU5pMDRNemN4TFdReU5XTXdNamhsTVdJNVlTSXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZDNNaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzek9UVnRjMTBpTENBaVlXUmtJam9nSWpFMU5DNHlOaTR4TXpRdU1UQTJJaXdnSW5CdmNuUWlPaUFpTVRReE1qa2lMQ0FpYVdRaU9pQWlaVGMzT1RobE1Ea3RNekE1TUMwME16WTJMV0ZsT0RBdFpqRTRZV1prWVdGaVpqUm1JaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3hOemh0YzEwaUxDQWlZV1JrSWpvZ0lqRTFMakl3TkM0eU5EZ3VPVElpTENBaWNHOXlkQ0k2SUNJek1EVTJNaUlzSUNKcFpDSTZJQ0k0TWpRMk5qY3hOUzAyWVRVNExUUXdORFl0WVRNMk15MWhNR1F4T0dVMVlqSmhZalFpTENBaVlXbGtJam9nSWpBaUxDQWlibVYwSWpvZ0luUmpjQ0lzSUNKMGVYQmxJam9nSW5adFpYTnpJaXdnSW5Sc2N5STZJQ0lpZlE9PQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnN4TlRadGMxMGlMQ0FpWVdSa0lqb2dJalkyTGprMExqRXhOQzR4TWpJaUxDQWljRzl5ZENJNklDSTFNelV3TXlJc0lDSnBaQ0k2SUNKak9XSTVaR1ZoTXkwMU9EWTRMVFEzTjJZdFpUVTBaQzB5WXpobU1USTBaalkwTjJRaUxDQWlZV2xrSWpvZ0lqQWlMQ0FpYm1WMElqb2dJblJqY0NJc0lDSjBlWEJsSWpvZ0luWnRaWE56SWl3Z0luUnNjeUk2SUNJaWZRPT0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzek56bHRjMTBpTENBaVlXUmtJam9nSWpnMExqSTBOeTR4TkRndU1Ua3lJaXdnSW5CdmNuUWlPaUFpTkRRek9UWWlMQ0FpYVdRaU9pQWlNMk5oTXpWbE1HRXRaVFF6TUMwME0yWmxMVGxqTVRJdE1tVXlaV1ZoTnpCbU9EY3pJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3lPRGx0YzEwaUxDQWlZV1JrSWpvZ0lqRTFOQzR5Tmk0eE5UTXVNVFl4SWl3Z0luQnZjblFpT2lBaU1qRTNOVGtpTENBaWFXUWlPaUFpWlRWbU1UWm1ZV1F0Wmpsak15MDBOVEppTFRobE56RXRZbU01TlRBMFpUSTVabU01SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnN6TkRCdGMxMGlMQ0FpWVdSa0lqb2dJakU0Tmk0eE9UQXVNakUxTGpFNU15SXNJQ0p3YjNKMElqb2dJakl5TXpJMElpd2dJbWxrSWpvZ0lqQTBOakl4WW1GbExXRmlNell0TVRGbFl5MWlPVEE1TFRBeU5ESmhZekV5TURBd01pSXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZEdOd0lpd2dJblI1Y0dVaU9pQWlkbTFsYzNNaUxDQWlkR3h6SWpvZ0lpSjkKdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzeE16TXliWE5kSWl3Z0ltRmtaQ0k2SUNJeE1ETXVNekF1TnpZdU5qWWlMQ0FpY0c5eWRDSTZJQ0l4TXpZMU1TSXNJQ0pwWkNJNklDSTJPRE14WXpsalpTMDBZMkU0TFRReVl6QXRPREU0TVMxbVlqRXdOVFUzTVRCalkyTWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGczFOekp0YzEwaUxDQWlZV1JrSWpvZ0lqRTVPQzR5TlRFdU9ETXVNakE0SWl3Z0luQnZjblFpT2lBaU5EVXlPVEVpTENBaWFXUWlPaUFpTkRZNVpUQmlNekV0TXpCak15MDBaR0ZpTFRnd01HUXROekV4TWpNeU5qTTBZMlV4SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnMwTkRkdGMxMGlMQ0FpWVdSa0lqb2dJall5TGpFME5pNHlNekl1TVRVMklpd2dJbkJ2Y25RaU9pQWlNek15T0RFaUxDQWlhV1FpT2lBaU1qUmxaR0V3WldFdFlXTm1NQzAwTlRNNExXRXdNREV0WmpjME5tRTBPREF5TXpkaElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzMU5tMXpYU0lzSUNKaFpHUWlPaUFpTVRVdU1qQTBMamcyTGpFeU1DSXNJQ0p3YjNKMElqb2dJak0xTmprMklpd2dJbWxrSWpvZ0ltTmhaREExTURSaExXRTVaR010TkdReU9TMDRPRFEwTFdJeE1XSTJPV1l4TkdFNFpDSXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZEdOd0lpd2dJblI1Y0dVaU9pQWlkbTFsYzNNaUxDQWlkR3h6SWpvZ0lpSjkKdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzeU9UWnRjMTBpTENBaVlXUmtJam9nSWpVdU1UZ3dMak13TGpFME5pSXNJQ0p3YjNKMElqb2dJakkzTnpjeklpd2dJbWxrSWpvZ0ltSXlNelEzTWpNNUxXUmtNVFV0TkRCaU15MWlOamd6TFRVd1kyTXlabVl4T1dGbE55SXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZEdOd0lpd2dJblI1Y0dVaU9pQWlkbTFsYzNNaUxDQWlkR3h6SWpvZ0lpSjkKdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzek1ETnRjMTBpTENBaVlXUmtJam9nSWpVdU1UZ3dMak13TGpnMUlpd2dJbkJ2Y25RaU9pQWlNVGcxT1RnaUxDQWlhV1FpT2lBaVltWXlObVl5Wm1JdE9XUXlZUzAwT1dJMkxUZzFNamN0T0RKbE9HRmlZVE5oT1dFNUlpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzME1UaHRjMTBpTENBaVlXUmtJam9nSWpRMUxqRXpOeTR4TlRVdU5EVWlMQ0FpY0c5eWRDSTZJQ0l4TnpZME5pSXNJQ0pwWkNJNklDSTRNamN6TkRjeU5DMDRZekEyTFRSak1tVXRPV05tWmkxaU16UTNOelptWlRFM05UY2lMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpS0NVME1GWnRaWE56VUhKdmRHOWpiMndwSlVRNEpVRTRKVVE0SlVJeEpVUTRKVUUzSlVSQ0pUaERKVEl3SlVRNEpVRkZKVVE0SlVJeEpVUkNKVGhESlVRNEpVRkdKVEl3SlVRNUpUZzRKVEl3SlVRNEpVRTNKVVE0SlVGQkpVUTRKVUkxSlVRNEpVRTNKVVE1SlRnMEpUSXdKVVE0SlVGR0pVUTRKVUUzSlVRNEpVRTJKVVE1SlRnMUpVUkNKVGhESlRJd0pVUTRKVUZESlVRNUpUZzRKVVJDSlRoREpVUTVKVGcySlRJd0pVUTRKVUkwSlVRNUpUZzRKVVl3SlRsR0pUZzNKVUU1SlVZd0pUbEdKVGczSlVGQkpUSXdJRnN6TXpCdGMxMGlMQ0FpWVdSa0lqb2dJakl1TlRZdU1USTFMakV3TVNJc0lDSndiM0owSWpvZ0lqTTRNRGc0SWl3Z0ltbGtJam9nSWpFeU56VmxZVEU0TFdKak9XTXROR0pqWWkxaU0yWmtMV1psWlRjd01qY3laVEUwTXlJc0lDSmhhV1FpT2lBaU1DSXNJQ0p1WlhRaU9pQWlkR053SWl3Z0luUjVjR1VpT2lBaWRtMWxjM01pTENBaWRHeHpJam9nSWlKOQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnMyTVRSdGMxMGlMQ0FpWVdSa0lqb2dJakU1TkM0MUxqRTNPQzQzTUNJc0lDSndiM0owSWpvZ0lqUTBNalkwSWl3Z0ltbGtJam9nSW1WbE56RTFObVkxTFdNMU9UUXROR1EzWmkwNVpUSTFMVFZrWlRBeE5EQTFPV000TlNJc0lDSmhhV1FpT2lBaU1DSXNJQ0p1WlhRaU9pQWlkR053SWl3Z0luUjVjR1VpT2lBaWRtMWxjM01pTENBaWRHeHpJam9nSWlKOQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnN6TlRodGMxMGlMQ0FpWVdSa0lqb2dJakUxTnk0eE9EQXVPRGt1TWpRd0lpd2dJbkJ2Y25RaU9pQWlNamt6TURFaUxDQWlhV1FpT2lBaVlXUTJPVEpsTVdVdE16Vm1NUzAwTkRFeUxXSTRZVGd0TVRFNE16RTNaVEZsTVRnMklpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzNU5HMXpYU0lzSUNKaFpHUWlPaUFpTXpndU1UUTNMakV3Tnk0eU1UUWlMQ0FpY0c5eWRDSTZJQ0l5TXpjM01DSXNJQ0pwWkNJNklDSTJZelUyTlRCalpDMWhZV0ZqTFRReE1UQXRabUl6TlMxaU5qVmxOMlJrTkRKaU5ESWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGczFNVEJ0YzEwaUxDQWlZV1JrSWpvZ0lqazBMakV6Tmk0eE9EVXVNak13SWl3Z0luQnZjblFpT2lBaU1UQTFNelFpTENBaWFXUWlPaUFpWWpBeFl6ZGxaamt0TXpObFl5MDBNV1kyTFdKbVltWXROemRrWkdNMFpESXhOalE1SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnMxTVRadGMxMGlMQ0FpWVdSa0lqb2dJakUxTkM0eU5pNHhNelF1TWpJeElpd2dJbkJ2Y25RaU9pQWlOVFE0TVRNaUxDQWlhV1FpT2lBaVpHWTVZelpsT1dVdE9XVTNZUzAwWkRBMkxUZzRZbUl0T1dJeU9UTXpOMkk1TnpObUlpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzek5qTnRjMTBpTENBaVlXUmtJam9nSWpFMU55NHhPREF1TVRJMExqZ3hJaXdnSW5CdmNuUWlPaUFpTWprek1ERWlMQ0FpYVdRaU9pQWlOekV4TmpZNE1USXROR00yWVMwME1qVTNMV0ZtTURBdFltTTBOR05qWm1RM056ZGtJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGczFOemh0YzEwaUxDQWlZV1JrSWpvZ0lqRTVPQzR5TlRFdU9ETXVNakE0SWl3Z0luQnZjblFpT2lBaU5EVXlOekVpTENBaWFXUWlPaUFpTkRZNVpUQmlNekV0TXpCak15MDBaR0ZpTFRnd01HUXROekV4TWpNeU5qTTBZMlV4SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnMwTVRsdGMxMGlMQ0FpWVdSa0lqb2dJall5TGpFME5pNHlNek11TmpZaUxDQWljRzl5ZENJNklDSXhOVGd5T0NJc0lDSnBaQ0k2SUNJNFlqbGpaak5rWXkxak1qZ3lMVFF5TkdZdFlUVTVNQzFqTkRWak9XRXpObVF6WmpraUxDQWlZV2xrSWpvZ0lqQWlMQ0FpYm1WMElqb2dJblJqY0NJc0lDSjBlWEJsSWpvZ0luWnRaWE56SWl3Z0luUnNjeUk2SUNJaWZRPT0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzMU56WnRjMTBpTENBaVlXUmtJam9nSWpFNU9DNHlOVEV1T0RNdU1qQTRJaXdnSW5CdmNuUWlPaUFpTkRVeU56WWlMQ0FpYVdRaU9pQWlORFk1WlRCaU16RXRNekJqTXkwMFpHRmlMVGd3TUdRdE56RXhNak15TmpNMFkyVXhJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGczBORE50YzEwaUxDQWlZV1JrSWpvZ0lqazBMakV6Tmk0eE9EUXVNVFUySWl3Z0luQnZjblFpT2lBaU16ZzROeklpTENBaWFXUWlPaUFpTWpJd056TXlZMk10T1dVME15MDBORFV6TFRnelpqRXRZemswTXpWaVpUSTFZalZpSWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnMwTXpodGMxMGlMQ0FpWVdSa0lqb2dJamcwTGpJME55NHhOVEF1TVRjM0lpd2dJbkJ2Y25RaU9pQWlNell4TkRFaUxDQWlhV1FpT2lBaVpETXhaV1UxTW1ZdFlqWmxOQzAwWkdJNExUbGpPVFV0T1RnNE5UVmxZemd5TTJOaklpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzME1qbHRjMTBpTENBaVlXUmtJam9nSWpVdU1UZ3lMak0zTGpJek1TSXNJQ0p3YjNKMElqb2dJalE1TmpZMElpd2dJbWxrSWpvZ0lqa3pPVFUwTnpSakxXVXlZVEV0TkRVMk5TMWlZVFUyTFdNeE5tVTNNemN6WXpSak5DSXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZEdOd0lpd2dJblI1Y0dVaU9pQWlkbTFsYzNNaUxDQWlkR3h6SWpvZ0lpSjkKdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzMU56aHRjMTBpTENBaVlXUmtJam9nSWpRMUxqZ3lMakkwTmk0eE56TWlMQ0FpY0c5eWRDSTZJQ0l5TmpVeU1TSXNJQ0pwWkNJNklDSmpabVkzTURBeFpTMHpZVGMwTFRRelpUZ3RZbVprT0MxaE4yRm1PVFl6TUdFMU9HSWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3pOVFp0YzEwaUxDQWlZV1JrSWpvZ0lqRTFOeTR4T0RBdU1URXpMallpTENBaWNHOXlkQ0k2SUNJeU9UTXdNU0lzSUNKcFpDSTZJQ0k0WW1abE5UY3haUzFsWm1RNExUUXpOR1l0WW1JeU5TMDVabUk1WmpCbE9XVXhaR01pTENBaVlXbGtJam9nSWpBaUxDQWlibVYwSWpvZ0luUmpjQ0lzSUNKMGVYQmxJam9nSW5adFpYTnpJaXdnSW5Sc2N5STZJQ0lpZlE9PQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnMxTlRSdGMxMGlMQ0FpWVdSa0lqb2dJakU1T0M0eU5URXVPRE11TWpBNElpd2dJbkJ2Y25RaU9pQWlORFV5TXpVaUxDQWlhV1FpT2lBaU5EWTVaVEJpTXpFdE16QmpNeTAwWkdGaUxUZ3dNR1F0TnpFeE1qTXlOak0wWTJVeElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzek9UQnRjMTBpTENBaVlXUmtJam9nSWpnMExqSTBOeTR4TkRrdU56Y2lMQ0FpY0c5eWRDSTZJQ0kwTnpJeE1TSXNJQ0pwWkNJNklDSm1ZalkzTkRJMk1DMHhZekl4TFRSbU9Ua3RPR0prTUMwelpERmtNelF4WXpZM056RWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3pOVEp0YzEwaUxDQWlZV1JrSWpvZ0lqazFMakUyTkM0ek9DNDJJaXdnSW5CdmNuUWlPaUFpTWpFNU16Z2lMQ0FpYVdRaU9pQWlOVGd6WW1WaVpXWXRNMlV3WWkwMFl6ZzFMV0poT0RBdE16bGxNRGRqWlRNMVlXUTVJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGczFPRGh0YzEwaUxDQWlZV1JrSWpvZ0lqRTVPQzR5TlRFdU9ETXVNakE0SWl3Z0luQnZjblFpT2lBaU5EVXlOak1pTENBaWFXUWlPaUFpTkRZNVpUQmlNekV0TXpCak15MDBaR0ZpTFRnd01HUXROekV4TWpNeU5qTTBZMlV4SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnM0TVRsdGMxMGlMQ0FpWVdSa0lqb2dJalEyTGpJMU1DNHlNemN1TVRrMklpd2dJbkJ2Y25RaU9pQWlNams1T1RraUxDQWlhV1FpT2lBaVlqTXhabU14TXpRdE9UYzRaUzAwTVRjMkxUZzFOemt0T0RFd04yUTJZVEJqWldSbElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzek1UUnRjMTBpTENBaVlXUmtJam9nSWpRMUxqRXlMakUwTlM0eE1URWlMQ0FpY0c5eWRDSTZJQ0kwTmpJNU1DSXNJQ0pwWkNJNklDSXhZalF4TVRVelpTMWpOR1EwTFRRek1XSXRPRE5sWWkweE1EUTNNbVk0TmpsbU9UTWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGczJOREJ0YzEwaUxDQWlZV1JrSWpvZ0lqRTVPQzR5TlRFdU9ETXVNakE0SWl3Z0luQnZjblFpT2lBaU5EVXlNamtpTENBaWFXUWlPaUFpTkRZNVpUQmlNekV0TXpCak15MDBaR0ZpTFRnd01HUXROekV4TWpNeU5qTTBZMlV4SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnN5T0RadGMxMGlMQ0FpWVdSa0lqb2dJakl1TlRZdU1USTJMakV3TXlJc0lDSndiM0owSWpvZ0lqTXpOVGM1SWl3Z0ltbGtJam9nSWpKbFlqTmxaVEpoTFRkaVpqZ3ROR0kxTUMwNVlqa3pMVEprTkRnNVpESm1NelExTmlJc0lDSmhhV1FpT2lBaU1DSXNJQ0p1WlhRaU9pQWlkR053SWl3Z0luUjVjR1VpT2lBaWRtMWxjM01pTENBaWRHeHpJam9nSWlKOQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnMyTXpSdGMxMGlMQ0FpWVdSa0lqb2dJakU1T0M0eU5URXVPRE11TWpBNElpd2dJbkJ2Y25RaU9pQWlORFV5T1RRaUxDQWlhV1FpT2lBaU5EWTVaVEJpTXpFdE16QmpNeTAwWkdGaUxUZ3dNR1F0TnpFeE1qTXlOak0wWTJVeElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzek1qVnRjMTBpTENBaVlXUmtJam9nSWpRMUxqRXlMakV6T0M0NE1pSXNJQ0p3YjNKMElqb2dJalUwTnpVM0lpd2dJbWxrSWpvZ0ltTmtaVGxtTURjMExXTTVNekF0TkdGaE15MWhOVFU0TFRRMlltSmpPV1F3WVRWaE1TSXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZEdOd0lpd2dJblI1Y0dVaU9pQWlkbTFsYzNNaUxDQWlkR3h6SWpvZ0lpSjkKdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzME5EQnRjMTBpTENBaVlXUmtJam9nSWpRMkxqSTFNQzR5TXpRdU16SWlMQ0FpY0c5eWRDSTZJQ0kwTlRNeE55SXNJQ0pwWkNJNklDSmlNamd6TmpNMk9TMHlNakJpTFRRNE5EQXRPREJqTkMwNFkyWTVNRFJqTnpNMVpXVWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3pNRFJ0YzEwaUxDQWlZV1JrSWpvZ0lqVXVNVGd3TGpNd0xqRXhNQ0lzSUNKd2IzSjBJam9nSWpVeE16VXlJaXdnSW1sa0lqb2dJbUpqWmpnMk5EYzVMV0ZoWWpRdE5EZGpaaTA1WkRabExUTTBaRE0xTTJKaFlURmhNaUlzSUNKaGFXUWlPaUFpTUNJc0lDSnVaWFFpT2lBaWRHTndJaXdnSW5SNWNHVWlPaUFpZG0xbGMzTWlMQ0FpZEd4eklqb2dJaUo5CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3lPVEZ0YzEwaUxDQWlZV1JrSWpvZ0lqUTJMakkxTUM0eU5ETXVOVFlpTENBaWNHOXlkQ0k2SUNJMU1ETTVOQ0lzSUNKcFpDSTZJQ0poTnpWbU0yWTVOUzFoWkRSbExUUTBPVGd0Wm1NM01pMWtaRGMwTUdSa01ESmlabU1pTENBaVlXbGtJam9nSWpBaUxDQWlibVYwSWpvZ0luUmpjQ0lzSUNKMGVYQmxJam9nSW5adFpYTnpJaXdnSW5Sc2N5STZJQ0lpZlE9PQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnN6T0ROdGMxMGlMQ0FpWVdSa0lqb2dJamcwTGpJME55NHhORGN1TWpReklpd2dJbkJ2Y25RaU9pQWlOVEUxTmpZaUxDQWlhV1FpT2lBaVlXVTJZV1U1TnpjdE1UZG1NaTAwTTJaa0xXRXpNell0TWpCaU0ySXpZVGxsTnpreElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzek16bHRjMTBpTENBaVlXUmtJam9nSWpNM0xqSXlNUzR4TWpVdU1UVTVJaXdnSW5CdmNuUWlPaUFpTXpNNU5EQWlMQ0FpYVdRaU9pQWlNelV6WlRBM09EY3ROekZpWXkwME5ESmtMVGxqT1dRdE9UQXlaamt3TXpVNVpXSTFJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3hNRGx0YzEwaUxDQWlZV1JrSWpvZ0lqRTNNaTR5TXpJdU1URXVNalF6SWl3Z0luQnZjblFpT2lBaU5EYzNPREVpTENBaWFXUWlPaUFpTURBME1XUmhaR0V0TWpKaVl5MDBZemd3TFdZMk5UVXRaRE15WXpsbVlXVmpZbU00SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnN6TVRCdGMxMGlMQ0FpWVdSa0lqb2dJalExTGpndU1UUTFMakUwTlNJc0lDSndiM0owSWpvZ0lqTXdOVEl3SWl3Z0ltbGtJam9nSWpNd016Z3dNalJtTFROaE16UXROREl5T0MxaU5qRmpMV1EzTkRGaU1tWmlaV000WmlJc0lDSmhhV1FpT2lBaU1DSXNJQ0p1WlhRaU9pQWlkR053SWl3Z0luUjVjR1VpT2lBaWRtMWxjM01pTENBaWRHeHpJam9nSWlKOQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5rWEhWa1pESTFTbTlwYml0VVpXeGxaM0poYlRwQVJtRnlZV2hmVmxCT1hIVmtPRE5rWEhWa1ptVXpJRnMyTkRKdGMxMGlMQ0FpWVdSa0lqb2dJakU1T0M0eU5URXVPRE11TWpBNElpd2dJbkJ2Y25RaU9pQWlORFV5TnpNaUxDQWlhV1FpT2lBaU5EWTVaVEJpTXpFdE16QmpNeTAwWkdGaUxUZ3dNR1F0TnpFeE1qTXlOak0wWTJVeElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzeU1UWnRjMTBpTENBaVlXUmtJam9nSWpVdU1qVXpMalF4TGpFME55SXNJQ0p3YjNKMElqb2dJakkzTnpVd0lpd2dJbWxrSWpvZ0lqUmlNVGs1TW1OakxUaGxOMk10TkRBd015MWhORFZtTFdFeU9HTXpaVFptTm1aaE9DSXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZEdOd0lpd2dJblI1Y0dVaU9pQWlkbTFsYzNNaUxDQWlkR3h6SWpvZ0lpSjkKdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzMU56aHRjMTBpTENBaVlXUmtJam9nSWpFNU9DNHlOVEV1T0RNdU1qQTRJaXdnSW5CdmNuUWlPaUFpTkRVeU16RWlMQ0FpYVdRaU9pQWlORFk1WlRCaU16RXRNekJqTXkwMFpHRmlMVGd3TUdRdE56RXhNak15TmpNMFkyVXhJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGczJPVEZ0YzEwaUxDQWlZV1JrSWpvZ0lqRTFNaTQyTnk0NExqSXdOU0lzSUNKd2IzSjBJam9nSWpnd0lpd2dJbWxrSWpvZ0lqbGtZalJqTnpBNExXRmxaamd0TkRNMU9TMDRNakZpTFRNNFpUUTNPVGt3WW1Vd1pDSXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZDNNaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROa1hIVmtaREkxU205cGJpdFVaV3hsWjNKaGJUcEFSbUZ5WVdoZlZsQk9YSFZrT0ROa1hIVmtabVV6SUZzeU9UQnRjMTBpTENBaVlXUmtJam9nSWpFMU5DNHlOaTR4TlRNdU1UY3pJaXdnSW5CdmNuUWlPaUFpTWpnMk9EWWlMQ0FpYVdRaU9pQWlObVJtTjJRMU5tWXRORGsxTXkwMFlURXdMV0psTW1VdFlUZzRZMk01WmprMFpUUTRJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGczBNelZ0YzEwaUxDQWlZV1JrSWpvZ0lqUTFMakV5TGpFeE5DNHhOU0lzSUNKd2IzSjBJam9nSWpJd056YzVJaXdnSW1sa0lqb2dJamxrWXpWaVptWTRMV0pqWW1JdE5EY3dNeTFpTUdabExUUm1PVEZpWVRVeE56UXdNaUlzSUNKaGFXUWlPaUFpTUNJc0lDSnVaWFFpT2lBaWRHTndJaXdnSW5SNWNHVWlPaUFpZG0xbGMzTWlMQ0FpZEd4eklqb2dJaUo5CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3pNakZ0YzEwaUxDQWlZV1JrSWpvZ0lqVXhMamd4TGpJd015NDFOeUlzSUNKd2IzSjBJam9nSWpJNE9EWXdJaXdnSW1sa0lqb2dJakUzT0RRME9UZGtMVEF6WVRFdE5EQmlZaTFpWWpoaUxXUmxOR1ptWVdNM1l6VTVZeUlzSUNKaGFXUWlPaUFpTUNJc0lDSnVaWFFpT2lBaWRHTndJaXdnSW5SNWNHVWlPaUFpZG0xbGMzTWlMQ0FpZEd4eklqb2dJaUo5CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3pNVGh0YzEwaUxDQWlZV1JrSWpvZ0lqUTFMakV5TGpFek9DNDBOeUlzSUNKd2IzSjBJam9nSWpJeU9ETTVJaXdnSW1sa0lqb2dJakk0TlRoaE5EQTBMV1F3WTJFdE5HUTJOeTA0TUdFMkxXTmxPR1U1TldVek9ETm1aaUlzSUNKaGFXUWlPaUFpTUNJc0lDSnVaWFFpT2lBaWRHTndJaXdnSW5SNWNHVWlPaUFpZG0xbGMzTWlMQ0FpZEd4eklqb2dJaUo5CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmtYSFZrWkRJMVNtOXBiaXRVWld4bFozSmhiVHBBUm1GeVlXaGZWbEJPWEhWa09ETmtYSFZrWm1VeklGc3pOekZ0YzEwaUxDQWlZV1JrSWpvZ0lqZzBMakkwTnk0eE5EWXVNVGc1SWl3Z0luQnZjblFpT2lBaU16TTNOVFFpTENBaWFXUWlPaUFpTkRWbU5HWTFOalV0T0dNM09DMDBPVEEyTFdFMVlqa3RNRGhsWVRrd056VmpaRE14SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bGVzczovL2U0ODI0MTkzLTRmNTQtNDUzYi1kMDM3LTg4MzY4ZTg1ZWYwZUA0NS44Mi4yNTEuMTg1Ojg4ODA/dHlwZT1ncnBjJnJlbWFya3M9cHFoMzZ2Ny5lY29ub215MzZ0b3Auc2hvcCBbMjIxbXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDk1LjE2NC40NS45MDo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzQzNW1zXQp2bGVzczovL2RmMDY4MGNhLWU0M2MtNDk4ZC1lZDg2LThlMTk2ZWVkZDAxMkA1LjE5OS4xNzMuMjAyOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbNTc0bXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDg0LjMyLjkuODY6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFs1NDFtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJAOTQuMTMxLjkuMTcyOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbNDM1bXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xMDU6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1wcWYxdjEuZm9tdWxhMXJhY2Uuc2hvcCBbMjExbXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDk1LjE2NC40NS45NTo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzQ0MG1zXQp2bGVzczovL2RmMDY4MGNhLWU0M2MtNDk4ZC1lZDg2LThlMTk2ZWVkZDAxMkA4NC4zMi45LjE5NTo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzUzNG1zXQp2bGVzczovL2RmMDY4MGNhLWU0M2MtNDk4ZC1lZDg2LThlMTk2ZWVkZDAxMkA4NC4zMi4yMTQuNzg6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFs1NDRtc10Kdmxlc3M6Ly82NGJiOGVhNi1mMzlhLTRmOWEtYmMwZS01YTEzMTM1NDBhY2FANS40Mi4yMjMuMTQ3OjE1MzE5P3R5cGU9dGNwJnJlbWFya3M9VW5rbm93biBbNjg0bXNdCnZsZXNzOi8vODM4ZjUyNzMtNWQyZC00NjMwLWEwZjUtOWNjOGU0YWVmNGQ2QDE4OC4xMTkuMTEyLjM6MjA1Mj90eXBlPXdzJnJlbWFya3M9VW5rbm93biBbNTg2bXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xMzM6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1wcWgyNnYzLnNwb3J0MjZ0ZW5uaXMuc2hvcCBbMjIxbXNdCnZsZXNzOi8vMzVmNTkxYzYtMDkzMi00YzY4LWE4MzEtNGZlNmVjZjAwYjg1QDE3MC42NC4xNzEuODM6MzY0MDI/dHlwZT10Y3AmcmVtYXJrcz1Vbmtub3duIFs1NDJtc10Kdmxlc3M6Ly9lNDgyNDE5My00ZjU0LTQ1M2ItZDAzNy04ODM2OGU4NWVmMGVANDUuODIuMjUxLjE0OTo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPXBxaDMzdjMudmV0ZG9tb2suc2hvcCBbMjE5bXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xNjY6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1wcWgzNXY0Lmd5bTM1Zml0LnNob3AgWzIxMW1zXQp2bGVzczovL2RmMDY4MGNhLWU0M2MtNDk4ZC1lZDg2LThlMTk2ZWVkZDAxMkA4NC4zMi45LjQxOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbNTUwbXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xNTE6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1wcWgzM3Y1LmNpbmVtYTMzLnNob3AgWzIxMm1zXQp2bGVzczovL2U0ODI0MTkzLTRmNTQtNDUzYi1kMDM3LTg4MzY4ZTg1ZWYwZUA0NS44Mi4yNTEuMTc2Ojg4ODA/dHlwZT1ncnBjJnJlbWFya3M9cHFoMzJ2Ni5maWxtMzJ3ZXN0ZXJuLnNob3AgWzIyMm1zXQp2bGVzczovL2U0ODI0MTkzLTRmNTQtNDUzYi1kMDM3LTg4MzY4ZTg1ZWYwZUA0NS44Mi4yNTEuMTgzOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9cHFoMzZ2NS5lY29ub215MzZ0b3Auc2hvcCBbMjEybXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDk1LjE2NC40NS43MDo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzQzNW1zXQp2bGVzczovL2U0ODI0MTkzLTRmNTQtNDUzYi1kMDM3LTg4MzY4ZTg1ZWYwZUA0NS44Mi4yNTEuMTI4Ojg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbMjIxbXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xNDE6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFsyMTdtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJAODQuMzIuMTMxLjE4NTo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzE3N21zXQp2bGVzczovL2RmMDY4MGNhLWU0M2MtNDk4ZC1lZDg2LThlMTk2ZWVkZDAxMkA4NC4zMi45LjQyOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbNTc0bXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDg0LjMyLjEzMS43Mjo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzE2M21zXQp2bGVzczovLzQ1ODkzMTgwLWU4NzYtNDhjNi1iMDkwLWI1ZmUyM2IyOGU4NkAxNTcuMjMwLjE3LjEwMjozMTU1Mz90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFs0Njltc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJANDUuMTQwLjE2Ny41OTo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzQzNm1zXQp2bGVzczovL2VhMjg2MTA5LWQyMGYtNDE1ZS04NDllLTRhZjIwYWIwNGI2NUAxNDcxMzUwMDExOTUuc2VjMjJvcmcuY29tOjQ0Mz9zZWN1cml0eT10bHMmdHlwZT10Y3AmcmVtYXJrcz1Vbmtub3duIFszMThtc10Kdmxlc3M6Ly9lNDgyNDE5My00ZjU0LTQ1M2ItZDAzNy04ODM2OGU4NWVmMGVANDUuODIuMjUxLjE0NDo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPXBxaDI3djYubmF0dXJlMjcuc2hvcCBbMjE0bXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDQ1LjE1OS4yNDguMTI1Ojg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbNDQ4bXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xNzk6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFsyMTRtc10Kdmxlc3M6Ly8xNWFmYWI2Zi00ZmY5LTQwODctOWNlZC00YjMyZWUxOWEwZjNAMTU3LjIzMC4xNy4xMDI6Mzc1Mjk/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbNDU4bXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xNTI6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1wcWgzM3Y2LmNpbmVtYTMzLnNob3AgWzIxN21zXQp2bGVzczovL2RmMDY4MGNhLWU0M2MtNDk4ZC1lZDg2LThlMTk2ZWVkZDAxMkA4NC4zMi4xMzEuMTg3Ojg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbMTc0bXNdCnZsZXNzOi8vODM4ZjUyNzMtNWQyZC00NjMwLWEwZjUtOWNjOGU0YWVmNGQ2QDQ1Ljg5LjExMS4xOTg6MjA1Mj90eXBlPXdzJnJlbWFya3M9VW5rbm93biBbNDUxbXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDg4LjIxNi4xODcuMTIxOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbNDQ4bXNdCnZsZXNzOi8vNDgzOWUwYjktYjI3NS00N2VhLTgxYWItOWJmZDM4YmJlN2FmQDQzLjE1Ni4yMTcuNjg6NDEyODM/dHlwZT10Y3AmcmVtYXJrcz1Vbmtub3duIFszNDNtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJAODQuMzIuMTMxLjIxOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbMTUzbXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDQ1Ljg5LjExMS4yNTA6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFs0NTNtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJAOTUuMTY0LjQ1Ljc4Ojg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbNDI4bXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDg0LjMyLjkuNDQ6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFs1NTRtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJAODQuMzIuOS40Nzo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzU0OW1zXQp2bGVzczovL2RmMDY4MGNhLWU0M2MtNDk4ZC1lZDg2LThlMTk2ZWVkZDAxMkA5NS4xNjQuNDUuODU6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFs0MjNtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJAODguMjE2LjE4Ny4xNDQ6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFs0NDhtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJAODQuMzIuMTMxLjczOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9VW5rbm93biBbMTc2bXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xNDY6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFsyMDltc10Kdmxlc3M6Ly85MGVmYWQxMy1kMjY2LTRkMTAtYTkxNC1iYzQwMDI4ZWM0NjlAOTQuMTMxLjEwOC4xOTU6NTMyMjE/dHlwZT10Y3AmcmVtYXJrcz1Vbmtub3duIFs3Mzc0bXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xODE6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFsyMTZtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJANDUuMTQwLjE2Ny4xNjg6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFs0NDVtc10Kdmxlc3M6Ly9lNDgyNDE5My00ZjU0LTQ1M2ItZDAzNy04ODM2OGU4NWVmMGVANDUuODIuMjUxLjE3MDo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPXBxaDM1djguZ3ltMzVmaXQuc2hvcCBbMjIxbXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDg0LjMyLjEzMS45Mzo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzE2NW1zXQp2bGVzczovL2U0ODI0MTkzLTRmNTQtNDUzYi1kMDM3LTg4MzY4ZTg1ZWYwZUA0NS44Mi4yNTEuMTA5Ojg4ODA/dHlwZT1ncnBjJnJlbWFya3M9cHFmMXY1LmZvbXVsYTFyYWNlLnNob3AgWzIxNm1zXQp2bGVzczovLzQ1ODkzMTgwLWU4NzYtNDhjNi1iMDkwLWI1ZmUyM2IyOGU4NkBmYXJzaWR1dGNoLm5sOjMxNTUzP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzQ4Mm1zXQp2bGVzczovLzVhMjRkYzRiLTQ3MTEtNDAyYS1lYzZkLTdjMTc0YjI5MGM4M0A5Mi4xMTIuNTMuMTUzOjE4MjE3P3R5cGU9dGNwJnJlbWFya3M9VW5rbm93biBbMjE0bXNdCnZsZXNzOi8vZTQ4MjQxOTMtNGY1NC00NTNiLWQwMzctODgzNjhlODVlZjBlQDQ1LjgyLjI1MS4xMTI6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFsyMjBtc10Kdmxlc3M6Ly9kZjA2ODBjYS1lNDNjLTQ5OGQtZWQ4Ni04ZTE5NmVlZGQwMTJAODQuMzIuOS40Njo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzU1NG1zXQp2bGVzczovL2U0ODI0MTkzLTRmNTQtNDUzYi1kMDM3LTg4MzY4ZTg1ZWYwZUA0NS44Mi4yNTEuMTQzOjg4ODA/dHlwZT1ncnBjJnJlbWFya3M9cHFoMjd2NS5uYXR1cmUyNy5zaG9wIFsyMTZtc10Kdmxlc3M6Ly9lNDgyNDE5My00ZjU0LTQ1M2ItZDAzNy04ODM2OGU4NWVmMGVANDUuODIuMjUxLjE3MTo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPVVua25vd24gWzIyMW1zXQp2bGVzczovL2EyNjkxYmRkLTc5ODktNGU3ZS05YzQ0LTMwMmUzNjBjMDIxZkAxODUuMjA4Ljc3LjExMzoxNDA0MD90eXBlPXdzJnJlbWFya3M9VW5rbm93biBbMTAwN21zXQp2bGVzczovLzU0Njk0YTMzLWE4ZGMtNDdkZC1iYzM4LWFjZDM5NzFlMDA1NUAxNDcxMzUwMDQwMDIuc2VjMjBvcmcuY29tOjQ0Mz9zZWN1cml0eT10bHMmdHlwZT10Y3AmcmVtYXJrcz1Vbmtub3duIFszMTZtc10Kdmxlc3M6Ly9lNDgyNDE5My00ZjU0LTQ1M2ItZDAzNy04ODM2OGU4NWVmMGVANDUuODIuMjUxLjE2Mjo4ODgwP3R5cGU9Z3JwYyZyZW1hcmtzPXBxaDM0djguYmxvZ2VyMzRhcnQuc2hvcCBbMjE1bXNdCnZsZXNzOi8vZGYwNjgwY2EtZTQzYy00OThkLWVkODYtOGUxOTZlZWRkMDEyQDg0LjMyLjEzMS4xMTk6ODg4MD90eXBlPWdycGMmcmVtYXJrcz1Vbmtub3duIFsxNzRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VUVOdWJrZzJVMUZUYm1adlV6STNAMzguODkuNzAuMjA4OjgwOTAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzEzN21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUA2OS41MC45My44MDozMzA2I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNTJtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V1RaU09YQkJkSFo0ZUhwdFIwTT1AMzguMTQzLjY2Ljg3OjU2MDAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzM1NW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBTTmt4clVtdDBabWt3UVhFeWNtdDViRW80UzBwM0A3OC4xMjkuMTQwLjExOjQ0MyPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMjk5bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmNFdEZWemhLVUVKNVZGWlVUSFJOQDM4LjEwNy4yMjYuMTQ6NDQzI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNTZtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V1RaU09YQkJkSFo0ZUhwdFIwTT1ANjkuNTAuOTMuMTEzOjg4ODgj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE2Nm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZabUZDUVc5RU5UUnJPRGRWU2tjM0AyMy4xNTAuMjQ4LjIzNToyMzc2I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs5NG1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZPVE0wT1RnMU16a3ROemd6T0MwME9ETTJMV0k1WWpNdE9ETXhNV1ptWXpjNVltTm1AODIuMTgwLjE0Ni4xNzM6MzU2NTIj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQ0MW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V2tsdlFUWTVVVGg1YUdOUlZqaHJZVE5RWVROQkAxOTMuMjkuMTM5LjEzMjo4MDgwI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsyOTNtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Wm1GQ1FXOUVOVFJyT0RkVlNrYzNANjcuMjIwLjk1LjEwMjoyMzc1I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNDdtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldrbHZRVFk1VVRoNWFHTlJWamhyWVROUVlUTkJAMTAzLjEwNC4yNDcuNzI6ODA4MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMjk3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDY3LjIyMC45NS4xMDI6NTYwMCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTUzbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlJtOVBhVWRzYTBGQk9YbFFSVWRRQDY3LjIyMC45NS4xMDI6NzMwNyPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbNDM0bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmEwUlhkbGhaV205VVFtTkhhME0wQDM4LjY4LjEzNS4yNDc6ODg4MiPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTQ1bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmEwUlhkbGhaV205VVFtTkhhME0wQDY3LjIyMC45NS4xMDI6ODg4MiPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTQ5bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlpUUkdRMWR5WjNCcmFta3pVVms9QDY5LjUwLjkzLjExMzo5MTAxI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNTJtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldrbHZRVFk1VVRoNWFHTlJWamhyWVROUVlUTkJANDUuODcuMTc1LjU4OjgwODAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzI5NW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUA2Ny4yMjAuOTUuMTAyOjUwMDAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE1MG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V0Vkd01TdHBhR3htUzJjNE1qWklANjQuMTc2Ljg1LjczOjE4NjYj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzM0Nm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZSbTlQYVVkc2EwRkJPWGxRUlVkUUAyMy4xNTAuMjQ4LjIzNTo3MzA2I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs5Mm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG95TTNOVmNuZFNZMVJDUlVGMmVFeFRObFpOTmtGaGVUVTNTMUZpZDNNeGRYQkVRWGh5TjBKMFpqUm9XSFUwWjJGVlVWYzBRbEJpUTI5dGFrcHFVM1JOTWtweFNreEVkMVpyZEdWWVREaFdNek5yT0dWWGExcFNORlZDT0dsdWRIbz1AMTA3LjE4MS4xNTEuMTQ3OjQzNjY5I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs0MDVtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRvMFlUSnlabWw0YjNCb1pHcG1abUU0UzFaQk5FRmhAMTkzLjI5LjEzOS4xNjQ6ODA4MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzA4bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlkyUkNTVVJXTkRKRVEzZHVaa2xPQDIzLjE1NC4xMzYuMTMyOjgxMTgj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQ0OW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaelZOWlVRMlJuUXpRMWRzU2tsa0A2Ny4yMjAuOTUuMTMzOjUwMDQj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzMxNW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZhMFJYZGxoWldtOVVRbU5IYTBNMEA2Ny4yMjAuOTUuMTAyOjg4ODEj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE1NG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZWRVY2YW1aQldYRXlTV3AwZFc5VEAyMy4xNTAuMjQ4LjE5OTo2Njc5I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs5Mm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZWRVY2YW1aQldYRXlTV3AwZFc5VEAyMy4xNTQuMTM2LjEzMjo2Njk3I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs3MjZtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2YTBSWGRsaFpXbTlVUW1OSGEwTTBAMzguNjguMTM1LjI0Nzo4ODgxI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFszNTVtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VkVWNmFtWkJXWEV5U1dwMGRXOVRAMjMuMTU0LjEzNi4xMzI6NjY3OSPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzMzbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlVFTnVia2cyVTFGVGJtWnZVekkzQDY3LjIyMC45NS4xMDI6ODA5MSPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTQ2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlZFVjZhbVpCV1hFeVNXcDBkVzlUQDY3LjIyMC45NS4yOTo2Njk3I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFszODltc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDEwMy4yNDMuMjE1LjE3Ojk5MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbNzI5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBZVEp5Wm1sNGIzQm9aR3BtWm1FNFMxWkJORUZoQDE5My4yOS4xMzkuMTYyOjgwODAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzI5OG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBNVFZOT2FESXhWSEpZYWxJeWIyc3lOVkV5YmtVNFJVNVVNbnB2UW0xUWRtdGhNMUpEUTFWQlNGcEZURU51VjI5bGExWnFkbUZtT0RseGQyTlNhMlJpZUVWbVpYQXlZbU15WVZWMGJXNTRjWFpHTVdGNVVWSmxlakZLU0dwVlRHbz1AMTY2Ljg4LjEzMS4xOTU6NTI5NTIj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzMyMG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVRU51YmtnMlUxRlRibVp2VXpJM0A2Ny4yMjAuOTUuMTM1OjgwOTAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzIxOW1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBqZGtsSk9EVlVjbGMyYmpCUFIzbG1jRWhXVXpGMUAxOTMuMjkuMTM5LjEzMzo4MDgwI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs1MzAzbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlJtOVBhVWRzYTBGQk9YbFFSVWRRQDY3LjIyMC45NS4xMDI6NzMwNiPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTQ2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlJtOVBhVWRzYTBGQk9YbFFSVWRRQDY3LjIyMC45NS4yOTo3MzA2I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs4MTFtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VW1WNGJrSm5WVGRGVmpWQlJIaEhANjcuMjIwLjk1LjEzMzo3MDAxI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxOTJtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2YkVkeGN6azFVV3RHU0c4eVRsWT1ANjcuMjIwLjk1LjEwMjo1NDk4I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNDRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2UzJsNFRIWkxlbmRxWld0SE1EQnliUT09QDY3LjIyMC45NS4xMDI6ODA4MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTU0bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmEwUlhkbGhaV205VVFtTkhhME0wQDM4LjExNC4xMTQuMTA4Ojg4ODEj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzM5bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBZVEp5Wm1sNGIzQm9aR3BtWm1FNFMxWkJORUZoQDE5My4yOS4xMzkuMjA2OjgwODAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzM1M21zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHAwWld4bFozSmhiVjl5ZVhWcmIyaHJANS4zNC4yMTAuMzM6NjAwMSPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzY3bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzFlbEpwUWt0QldXSkxjRVJSZFZjMGJrdEhSVVI0TVROSU5HZzVSMlZFZUdGeE1rOU5kVXBwY1VKMlVUVlNjM009QDE4NS4xMzUuODYuODY6MzEzNDgj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQzN21zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBIWWxGVWVFOWthRmhTTms5YU1qSTBWM2xSZEhkbUAxNzguMTI4LjU1LjE1NTo0Nzc5OCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzQ0bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBZVEp5Wm1sNGIzQm9aR3BtWm1FNFMxWkJORUZoQDE5My4yOS4xMzkuMTU3OjgwODAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzMwM21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZOek0xWm1RMFpqUXRZbU0xTlMwME1EQmhMVGxtTVdNdE1tSTVNVEE0T1dNNU1qQXdANjguMTgzLjIxMy4yMzI6ODQ0MyPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzEwbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlpUUkdRMWR5WjNCcmFta3pVVms9QDY3LjIyMC45NS4xMDI6OTEwMiPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTUybXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcG1PR1kzWVVONlkxQkxZbk5HT0hBekAxMTkuNTkuOTguNTg6OTkwI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs4MTBtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Wm1GQ1FXOUVOVFJyT0RkVlNrYzNANjcuMjIwLjk1LjI5OjIzNzYj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQwMm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZZMlJDU1VSV05ESkVRM2R1WmtsT0A2Ny4yMjAuOTUuMjk6ODExOCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzU4bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlJtOVBhVWRzYTBGQk9YbFFSVWRRQDY3LjIyMC45NS4xMzM6NzMwNyPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMjQ0bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcEJTWFptYkZWd1dIUnJabFY0TmpaRldYQnFhV2xDQDEwNC4xOTIuMjI3LjE2Mjo0NDMj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzEwNG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVbVY0YmtKblZUZEZWalZCUkhoSEA2Ny4yMjAuOTUuOTY6NzAwMiPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTcxbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlVtVjRia0puVlRkRlZqVkJSSGhIQDIzLjE1NC4xMzYuMTMyOjcwMDEj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQ4MG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBtT0dZM1lVTjZZMUJMWW5OR09IQXpANjQuNzQuMTYzLjIxODo5OTAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE1N21zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG94VWxkM1dHaDNaa0ZDTldkQlJXOTZWVFJITWxCbkAxOTMuMjkuMTM5LjE3NTo4MDgwI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFszMDdtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Wm1GQ1FXOUVOVFJyT0RkVlNrYzNANjcuMjIwLjk1LjEzMzoyMzc1I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxOTFtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwV1FWVnBOVlJGYTNodVZVOUtSSG8yVFdwelNFaDJAOTEuMTk0LjE2MC4xNTE6MTIzNSPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMjE2bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlp6Vk5aVVEyUm5RelExZHNTa2xrQDY5LjUwLjkzLjQ3OjUwMDMj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE4MG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVG95UWtOMGRqZGlUa1IwUjJWQldrTkViV1JYWlVNeFFuWldWMEpoZFZSM1FVSm9OSEp4V0VGa1VrbzBaRmRCY2xaVVJVdzJUbEpOY2pFeE9Ia3lkVzlaVGpaYVUwSnplbk15ZGpKeFlUaDZkbm8wTVRGSWNrMWlRbmhOWXpFemFHRT1Ad3d3Mi5icm9hZGFseC5jZmQ6NDA5MzQj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzU1N21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaelZOWlVRMlJuUXpRMWRzU2tsa0AyMy4xNTAuMjQ4LjIzNTo1MDAzI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs5NG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V1ZFNFNuZEZiR1JaYmpSTFZESm5abG8yWlU1c0A4OS4yMy4xMDMuMjE6NTE1ODQj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzMyMm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB6VUV0VGExSTFXSEJHVFRnd2JHOTNNRmhtY0dzd0AxODguMTY2LjE4My4xMDA6MTE0NzUj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzM0NW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVRU51YmtnMlUxRlRibVp2VXpJM0A2Ny4yMjAuOTUuODA6ODA5MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMjA1bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlp6Vk5aVVEyUm5RelExZHNTa2xrQDY5LjUwLjkzLjExMzo1MDA0I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNTBtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V1RaU09YQkJkSFo0ZUhwdFIwTT1AMjMuMTU0LjEzNi4xMzI6NTYwMCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzY4bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcDNXa1ZaY2tJeU5XVk1jR2xNYUVJeU4zVTNZM1ZNUkc5U1REWnFhRnBOWmtONGNuTnlUWFpQZUdOVE1rVk5SMkoyVjJsS1pFc3lhWFJwVjFWSVFWRTlANDUuNDMuMTM3LjExNDo0NDMj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE3MTRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2V1RaU09YQkJkSFo0ZUhwdFIwTT1ANjcuMjIwLjk1LjEwMjozMzA2I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNDdtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VUVOdWJrZzJVMUZUYm1adlV6STNAMzguMTA3LjIyNi4xNDo4MDkxI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxOTVtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2YTBSWGRsaFpXbTlVUW1OSGEwTTBAMjMuMTU0LjEzNi40NDo4ODgxI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNTRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2Wm1GQ1FXOUVOVFJyT0RkVlNrYzNAMjMuMTU0LjEzNi4xMzI6MjM3NSPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbNjI3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDY3LjIyMC45NS4xMDI6OTA5MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTQ3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlZFVjZhbVpCV1hFeVNXcDBkVzlUQDE2Mi4yNTEuNjEuMjE5OjY2Nzkj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzEwMm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZTMmw0VEhaTGVuZHFaV3RITURCeWJRPT1AMjMuMTU0LjEzNi4xMzI6ODA4MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTI0OG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVRU51YmtnMlUxRlRibVp2VXpJM0AyMy4xNTQuMTM2LjEwMzo4MDkwI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNTBtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2UzJsNFRIWkxlbmRxWld0SE1EQnliUT09QDIzLjE1NC4xMzYuMTAzOjgwODAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE1MW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVRU51YmtnMlUxRlRibVp2VXpJM0AzOC4xMTQuMTE0LjEwODo4MDkxI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFszNm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZiRWR4Y3prMVVXdEdTRzh5VGxZPUAyMy4xNTQuMTM2LjEzMjo1NDk4I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFszMjdtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRweFpISmllbmRuY0hseFNFdHZiRk4zUlcxUVdGYzNAODEuMTkuMTQxLjQ1OjQ0MyPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzEwbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlVtVjRia0puVlRkRlZqVkJSSGhIQDIzLjE1NC4xMzYuMTMyOjcwMDIj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzM4MW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVRU51YmtnMlUxRlRibVp2VXpJM0AyMy4xNTAuMjQ4LjUwOjgwOTAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE1NG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBtT0dZM1lVTjZZMUJMWW5OR09IQXpAMTkyLjM2LjYxLjU5Ojk5MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzY5bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldFdEdTMnd5Y2xWTWFrbHdOelE9QDM4LjExNC4xMTQuMjQ1OjgwMDgj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzM3bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzBZVEp5Wm1sNGIzQm9aR3BtWm1FNFMxWkJORUZoQDE5My4yOS4xMzkuMTczOjgwODAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzMyM21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZla1JPVm1Wa1VrWlFVV1Y0UnpsMkA2OS41MC45My40Nzo2Mzc5I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxOTRtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VUVOdWJrZzJVMUZUYm1adlV6STNANjcuMjIwLjk1LjEwMjo4MDkwI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNDRtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDE2OS4xNTAuMjAyLjE3NDo5OTAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQ1M21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVbVY0YmtKblZUZEZWalZCUkhoSEAzOC43NS4xMzYuMjg6NzAwMSPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMzRtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDY0Ljc0LjE2My44Mjo5OTAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE1M21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZVRU51YmtnMlUxRlRibVp2VXpJM0AyMy4xNTAuMjQ4LjIzNTo4MDkxI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs5Mm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBtT0dZM1lVTjZZMUJMWW5OR09IQXpAMTc2LjEwMy41My4xMDU6OTkwI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs0MjFtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwbU9HWTNZVU42WTFCTFluTkdPSEF6QDM4LjU0LjIuMTgyOjk5MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbNjgwbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNmNFdEZWemhLVUVKNVZGWlVUSFJOQDY3LjIyMC45NS4yOTo0NDMj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQ2Mm1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHB2V2tsdlFUWTVVVGg1YUdOUlZqaHJZVE5RWVROQkA0NS44Ny4xNzUuMjI6ODA4MCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMjk3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldUWlNPWEJCZEhaNGVIcHRSME09QDY5LjUwLjkzLjQ3OjUwMDAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzIwNW1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZjMmhoWkc5M2MyOWphM009QDE0OS4zNC4yNDQuNzc6NDQzI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsyOThtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VUVOdWJrZzJVMUZUYm1adlV6STNANjcuMjIwLjk1Ljk2OjgwOTEj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE3NW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZSbTlQYVVkc2EwRkJPWGxRUlVkUUA2Ny4yMjAuOTUuMTMzOjczMDYj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzIwOW1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUA2Ny4yMjAuOTUuMjMwOjU2MDEj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzE1MG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZabUZDUVc5RU5UUnJPRGRWU2tjM0A2Ny4yMjAuOTUuMjk6MjM3NSPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMjIxOG1zXQpzczovL1kyaGhZMmhoTWpBdGFXVjBaaTF3YjJ4NU1UTXdOVHBtT0dZM1lVTjZZMUJMWW5OR09IQXpAMTg1LjEyNi4yMzcuMzg6OTkwI/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs0NDFtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VkVWNmFtWkJXWEV5U1dwMGRXOVRAMjMuMTUwLjI0OC4yMzU6NjY3OSPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbOTFtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2WnpWTlpVUTJSblF6UTFkc1NrbGtAMzguMTQzLjY2Ljg3OjUwMDMj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQzMW1zXQpzczovL1lXVnpMVEV5T0MxblkyMDZNVFl5TmpJNVpEY3RZMkl4TnkwME0ySXhMVGd5WXprdFpqbGpOMkZsTm1OaVlUY3dAODIuMTgwLjE0Ni4xNzM6MzA2MDcj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzQ0Mm1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZaelZOWlVRMlJuUXpRMWRzU2tsa0A2Ny4yMjAuOTUuOTY6NTAwMyPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTU3bXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UcHZXa2x2UVRZNVVUaDVhR05SVmpocllUTlFZVE5CQDE5My4yOS4xMzkuMjQwOjgwODAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzMwMG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZXVFpTT1hCQmRIWjRlSHB0UjBNPUAyMy4xNTQuMTM2LjEzMjo4ODg4I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs0NDhtc10Kc3M6Ly9ZMmhoWTJoaE1qQXRhV1YwWmkxd2IyeDVNVE13TlRwdldrbHZRVFk1VVRoNWFHTlJWamhyWVROUVlUTkJANDUuODcuMTc1LjEwOjgwODAj8J+UpUpvaW4rVGVsZWdyYW06QEZhcmFoX1ZQTvCfn6MgWzI5M21zXQpzczovL1lXVnpMVEkxTmkxblkyMDZiRWR4Y3prMVVXdEdTRzh5VGxZPUA2OS41MC45My44MDo1NDk4I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFsxNDhtc10Kc3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2VW1WNGJrSm5WVGRGVmpWQlJIaEhANjkuNTAuOTMuNDc6NzAwMiPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTgxbXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNldFdEdTMnd5Y2xWTWFrbHdOelE9QDY3LjIyMC45NS4xMDI6ODAwOCPwn5SlSm9pbitUZWxlZ3JhbTpARmFyYWhfVlBO8J+foyBbMTQ3bXNdCnNzOi8vWVdWekxUSTFOaTFuWTIwNlJtOVBhVWRzYTBGQk9YbFFSVWRRQDM4LjY4LjEzNS45Mzo3MzA2I/CflKVKb2luK1RlbGVncmFtOkBGYXJhaF9WUE7wn5+jIFs5NG1zXQpzczovL1lXVnpMVEkxTmkxblkyMDZabUZDUVc5RU5UUnJPRGRWU2tjM0AzOC4xMjEuNDMuOTc6MjM3NiPwn4e68J+HuFVTXzY3OSBbMjQxbXNdCnNzOi8vWTJoaFkyaGhNakF0YVdWMFppMXdiMng1TVRNd05UbzJTVlpQZFhwTlprZzFVazl3WjNkMFVsUmpUa3BMV1VwMldXVTVSa1JXWVZVM2QwRlpXV2c0VUZKTWVIaGFjelk9QDE4OC4xOTEuMTQ3LjEyNzozMTM0OCPwn4e68J+HpiBVQV82MTcgWzY4Mm1zXQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5qWEhWa1pHVmtYSFZrT0ROalhIVmtaR1l3SUVoTFh6SXhNeUJiTXpKdGMxMGlMQ0FpWVdSa0lqb2dJalExTGpJd055NHlNREV1TVRVaUxDQWljRzl5ZENJNklDSXpORFl5TlNJc0lDSnBaQ0k2SUNJek5UVXhNR1JtTkMwNU9EazVMVFEwTWpjdFpUZ3lOaTFrTURBMVpqQmhZV0pqTm1NaUxDQWlZV2xrSWpvZ0lqQWlMQ0FpYm1WMElqb2dJblJqY0NJc0lDSjBlWEJsSWpvZ0luWnRaWE56SWl3Z0luUnNjeUk2SUNJaWZRPT0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROalhIVmtaR1ZrWEhWa09ETmpYSFZrWkdZd0lFaExYekl4TmlCYk5qUTFiWE5kSWl3Z0ltRmtaQ0k2SUNKaU9EWXdOV1k1TnkxemQzRXhjekF0YzNkM1kyWm5MVEZsYVdwc0xtaG5ZekV1ZEdOd1ltSnlMbTVsZENJc0lDSndiM0owSWpvZ0lqZ3dPREFpTENBaWFXUWlPaUFpWXpKaU5UaGhaVEF0WkRJeFl5MHhNV1ZtTFdJME1UUXRaakl6WXpreFkyWmlZbU01SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjNjeUlzSUNKMGVYQmxJam9nSW5adFpYTnpJaXdnSW5Sc2N5STZJQ0lpZlE9PQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5qWEhWa1pHVmxYSFZrT0ROalhIVmtaR1l6SUVsT1h6VXpNQ0JiTWpSdGMxMGlMQ0FpWVdSa0lqb2dJakV3TXk0eE1qUXVNVEEzTGpFME5DSXNJQ0p3YjNKMElqb2dJakk1T0RBd0lpd2dJbWxrSWpvZ0ltTmpNekZrWkdaakxXUTVNbVV0TkdSaFlpMWpaREEyTFRBd1pHWmlPRFJoWmpoaFl5SXNJQ0poYVdRaU9pQWlNQ0lzSUNKdVpYUWlPaUFpZEdOd0lpd2dJblI1Y0dVaU9pQWlkbTFsYzNNaUxDQWlkR3h6SWpvZ0lpSjkKdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROalhIVmtaR1poWEhWa09ETmpYSFZrWkdZNElGVlRYelkwTlNCYk5qYzFiWE5kSWl3Z0ltRmtaQ0k2SUNKbVlTNW1lR3hqYmk1amIyMGlMQ0FpY0c5eWRDSTZJQ0kwTlRJME55SXNJQ0pwWkNJNklDSTBOamxsTUdJek1TMHpNR016TFRSa1lXSXRPREF3WkMwM01URXlNekkyTXpSalpURWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmpYSFZrWkdaaFhIVmtPRE5qWEhWa1pHWTRJRlZUWHpZMU1TQmJOak0yYlhOZElpd2dJbUZrWkNJNklDSnNkQzVtZUd4amJpNWpiMjBpTENBaWNHOXlkQ0k2SUNJME5USTVNU0lzSUNKcFpDSTZJQ0kwTmpsbE1HSXpNUzB6TUdNekxUUmtZV0l0T0RBd1pDMDNNVEV5TXpJMk16UmpaVEVpTENBaVlXbGtJam9nSWpBaUxDQWlibVYwSWpvZ0luUmpjQ0lzSUNKMGVYQmxJam9nSW5adFpYTnpJaXdnSW5Sc2N5STZJQ0lpZlE9PQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5qWEhWa1pHWTNYSFZrT0ROalhIVmtaR1poSUZKVlh6VTVPU0JiT0RFNWJYTmRJaXdnSW1Ga1pDSTZJQ0ptWVM1bWVHeGpiaTVqYjIwaUxDQWljRzl5ZENJNklDSTBOVEl4TlNJc0lDSnBaQ0k2SUNJME5qbGxNR0l6TVMwek1HTXpMVFJrWVdJdE9EQXdaQzAzTVRFeU16STJNelJqWlRFaUxDQWlZV2xrSWpvZ0lqQWlMQ0FpYm1WMElqb2dJblJqY0NJc0lDSjBlWEJsSWpvZ0luWnRaWE56SWl3Z0luUnNjeUk2SUNJaWZRPT0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROalhIVmtaR1poWEhWa09ETmpYSFZrWkdZNElGVlRYelkwT0NCYk5qYzBiWE5kSWl3Z0ltRmtaQ0k2SUNKc2RDNW1lR3hqYmk1amIyMGlMQ0FpY0c5eWRDSTZJQ0kwTlRReE55SXNJQ0pwWkNJNklDSTBOamxsTUdJek1TMHpNR016TFRSa1lXSXRPREF3WkMwM01URXlNekkyTXpSalpURWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmpYSFZrWkdaaFhIVmtPRE5qWEhWa1pHWTRJRlZUWHpZME15QmJPREEwYlhOZElpd2dJbUZrWkNJNklDSnNkQzVtZUd4amJpNWpiMjBpTENBaWNHOXlkQ0k2SUNJME5USXpNU0lzSUNKcFpDSTZJQ0kwTmpsbE1HSXpNUzB6TUdNekxUUmtZV0l0T0RBd1pDMDNNVEV5TXpJMk16UmpaVEVpTENBaVlXbGtJam9nSWpBaUxDQWlibVYwSWpvZ0luUmpjQ0lzSUNKMGVYQmxJam9nSW5adFpYTnpJaXdnSW5Sc2N5STZJQ0lpZlE9PQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5qWEhWa1pHWTNYSFZrT0ROalhIVmtaR1poSUZKVlh6VTVPQ0JiTVRBMU5tMXpYU0lzSUNKaFpHUWlPaUFpZVdVdVpuaHNZMjR1WTI5dElpd2dJbkJ2Y25RaU9pQWlORFV5TkRVaUxDQWlhV1FpT2lBaU5EWTVaVEJpTXpFdE16QmpNeTAwWkdGaUxUZ3dNR1F0TnpFeE1qTXlOak0wWTJVeElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROalhIVmtaR1poWEhWa09ETmpYSFZrWkdZNElGVlRYelkxTmlCYk9ERXdiWE5kSWl3Z0ltRmtaQ0k2SUNKNVlXd3VabmhzWTI0dVkyOXRJaXdnSW5CdmNuUWlPaUFpTkRVeU5qWWlMQ0FpYVdRaU9pQWlORFk1WlRCaU16RXRNekJqTXkwMFpHRmlMVGd3TUdRdE56RXhNak15TmpNMFkyVXhJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmpYSFZrWkdaaFhIVmtPRE5qWEhWa1pHWTRJRlZUWHpZMk1pQmJOalF3YlhOZElpd2dJbUZrWkNJNklDSnNkQzVtZUd4amJpNWpiMjBpTENBaWNHOXlkQ0k2SUNJME5USTNOaUlzSUNKcFpDSTZJQ0kwTmpsbE1HSXpNUzB6TUdNekxUUmtZV0l0T0RBd1pDMDNNVEV5TXpJMk16UmpaVEVpTENBaVlXbGtJam9nSWpBaUxDQWlibVYwSWpvZ0luUmpjQ0lzSUNKMGVYQmxJam9nSW5adFpYTnpJaXdnSW5Sc2N5STZJQ0lpZlE9PQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5qWEhWa1pHWmhYSFZrT0ROalhIVmtaR1k0SUZWVFh6WTJOU0JiTmpZd2JYTmRJaXdnSW1Ga1pDSTZJQ0o1WVd3dVpuaHNZMjR1WTI5dElpd2dJbkJ2Y25RaU9pQWlORFV5TmpNaUxDQWlhV1FpT2lBaU5EWTVaVEJpTXpFdE16QmpNeTAwWkdGaUxUZ3dNR1F0TnpFeE1qTXlOak0wWTJVeElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROalhIVmtaR1poWEhWa09ETmpYSFZrWkdZNElGVlRYelkyT1NCYk5UYzFiWE5kSWl3Z0ltRmtaQ0k2SUNKc2RDNW1lR3hqYmk1amIyMGlMQ0FpY0c5eWRDSTZJQ0kwTlRJM01TSXNJQ0pwWkNJNklDSTBOamxsTUdJek1TMHpNR016TFRSa1lXSXRPREF3WkMwM01URXlNekkyTXpSalpURWlMQ0FpWVdsa0lqb2dJakFpTENBaWJtVjBJam9nSW5SamNDSXNJQ0owZVhCbElqb2dJblp0WlhOeklpd2dJblJzY3lJNklDSWlmUT09CnZtZXNzOi8vZXlKMklqb2dJaklpTENBaWNITWlPaUFpWEhWa09ETmpYSFZrWkdaaFhIVmtPRE5qWEhWa1pHWTRJRlZUWHpZMk1DQmJPREF5YlhOZElpd2dJbUZrWkNJNklDSjVjMnd1Wm5oc1kyNHVZMjl0SWl3Z0luQnZjblFpT2lBaU5EVTBNVGtpTENBaWFXUWlPaUFpTkRZNVpUQmlNekV0TXpCak15MDBaR0ZpTFRnd01HUXROekV4TWpNeU5qTTBZMlV4SWl3Z0ltRnBaQ0k2SUNJd0lpd2dJbTVsZENJNklDSjBZM0FpTENBaWRIbHdaU0k2SUNKMmJXVnpjeUlzSUNKMGJITWlPaUFpSW4wPQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5qWEhWa1pHWmhYSFZrT0ROalhIVmtaR1k0SUZWVFh6WTJNU0JiT0RBNGJYTmRJaXdnSW1Ga1pDSTZJQ0o1YzJ3dVpuaHNZMjR1WTI5dElpd2dJbkJ2Y25RaU9pQWlORFV5TWpraUxDQWlhV1FpT2lBaU5EWTVaVEJpTXpFdE16QmpNeTAwWkdGaUxUZ3dNR1F0TnpFeE1qTXlOak0wWTJVeElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdm1lc3M6Ly9leUoySWpvZ0lqSWlMQ0FpY0hNaU9pQWlYSFZrT0ROalhIVmtaR1poWEhWa09ETmpYSFZrWkdZNElGVlRYelkyTnlCYk9ERTFiWE5kSWl3Z0ltRmtaQ0k2SUNKNVlXd3VabmhzWTI0dVkyOXRJaXdnSW5CdmNuUWlPaUFpTkRVeU56TWlMQ0FpYVdRaU9pQWlORFk1WlRCaU16RXRNekJqTXkwMFpHRmlMVGd3TUdRdE56RXhNak15TmpNMFkyVXhJaXdnSW1GcFpDSTZJQ0l3SWl3Z0ltNWxkQ0k2SUNKMFkzQWlMQ0FpZEhsd1pTSTZJQ0oyYldWemN5SXNJQ0owYkhNaU9pQWlJbjA9CnNzOi8vWVdWekxURXlPQzFuWTIwNmMyaGhaRzkzYzI5amEzTT1AMTQxLjk4LjEwMS4xNzk6NDQzI3VrX21hbmNoZXN0ZXIgWzMyMG1zXQp2bWVzczovL2V5SjJJam9nSWpJaUxDQWljSE1pT2lBaVhIVmtPRE5qWEhWa1pHWmhYSFZrT0ROalhIVmtaR1k0SUZWVFh6WTFPU0JiTVRBeU5HMXpYU0lzSUNKaFpHUWlPaUFpYkhRdVpuaHNZMjR1WTI5dElpd2dJbkJ2Y25RaU9pQWlORFV5TXpVaUxDQWlhV1FpT2lBaU5EWTVaVEJpTXpFdE16QmpNeTAwWkdGaUxUZ3dNR1F0TnpFeE1qTXlOak0wWTJVeElpd2dJbUZwWkNJNklDSXdJaXdnSW01bGRDSTZJQ0owWTNBaUxDQWlkSGx3WlNJNklDSjJiV1Z6Y3lJc0lDSjBiSE1pT2lBaUluMD0Kdmxlc3M6Ly9lNmQ4ZDc0My1hOWJjLTQ4YzktYmU5OS04ZjNjYzk0ZDE2ZTFAYWtvLnBhZ2F0ZS50b3A6NDQzP3NlY3VyaXR5PXRscyZmbG93PXh0bHMtcnByeC12aXNpb24tdWRwNDQzJnR5cGU9dGNwJnJlbWFya3M9YWtvLnBhZ2F0ZS50b3AgWzcwMW1zXQ== -------------------------------------------------------------------------------- /xray-core/windows-64/README.md: -------------------------------------------------------------------------------- 1 | # Project X 2 | 3 | [Project X](https://github.com/XTLS) originates from XTLS protocol, providing a set of network tools such as [Xray-core](https://github.com/XTLS/Xray-core) and [REALITY](https://github.com/XTLS/REALITY). 4 | 5 | [README](https://github.com/XTLS/Xray-core#readme) is open, so feel free to submit your project [here](https://github.com/XTLS/Xray-core/pulls). 6 | 7 | ## Donation & NFTs 8 | 9 | - **ETH/USDT/USDC: `0xDc3Fe44F0f25D13CACb1C4896CD0D321df3146Ee`** 10 | - **Project X NFT: [Announcement of NFTs by Project X](https://github.com/XTLS/Xray-core/discussions/3633)** 11 | - **REALITY NFT: [XHTTP: Beyond REALITY](https://github.com/XTLS/Xray-core/discussions/4113)** 12 | 13 | ## License 14 | 15 | [Mozilla Public License Version 2.0](https://github.com/XTLS/Xray-core/blob/main/LICENSE) 16 | 17 | ## Documentation 18 | 19 | [Project X Official Website](https://xtls.github.io) 20 | 21 | ## Telegram 22 | 23 | [Project X](https://t.me/projectXray) 24 | 25 | [Project X Channel](https://t.me/projectXtls) 26 | 27 | [Project VLESS](https://t.me/projectVless) (Русский) 28 | 29 | [Project XHTTP](https://t.me/projectXhttp) (Persian) 30 | 31 | ## Installation 32 | 33 | - Linux Script 34 | - [XTLS/Xray-install](https://github.com/XTLS/Xray-install) (**Official**) 35 | - [tempest](https://github.com/team-cloudchaser/tempest) (supports [`systemd`](https://systemd.io) and [OpenRC](https://github.com/OpenRC/openrc); Linux-only) 36 | - Docker 37 | - [ghcr.io/xtls/xray-core](https://ghcr.io/xtls/xray-core) (**Official**) 38 | - [teddysun/xray](https://hub.docker.com/r/teddysun/xray) 39 | - [wulabing/xray_docker](https://github.com/wulabing/xray_docker) 40 | - Web Panel - **WARNING: Please DO NOT USE plain HTTP panels like 3X-UI**, as they are believed to be bribed by Iran GFW for supporting plain HTTP by default and refused to change (https://github.com/XTLS/Xray-core/pull/3884#issuecomment-2439595331), which has already put many users' data security in danger in the past few years. **If you are already using 3X-UI, please switch to the following panels, which are verified to support HTTPS and SSH port forwarding only:** 41 | - [Marzban](https://github.com/Gozargah/Marzban) 42 | - [Xray-UI](https://github.com/qist/xray-ui) 43 | - [Hiddify](https://github.com/hiddify/Hiddify-Manager) 44 | - One Click 45 | - [Xray-REALITY](https://github.com/zxcvos/Xray-script), [xray-reality](https://github.com/sajjaddg/xray-reality), [reality-ezpz](https://github.com/aleskxyz/reality-ezpz) 46 | - [Xray_bash_onekey](https://github.com/hello-yunshu/Xray_bash_onekey), [XTool](https://github.com/LordPenguin666/XTool) 47 | - [v2ray-agent](https://github.com/mack-a/v2ray-agent), [Xray_onekey](https://github.com/wulabing/Xray_onekey), [ProxySU](https://github.com/proxysu/ProxySU) 48 | - Magisk 49 | - [Xray4Magisk](https://github.com/Asterisk4Magisk/Xray4Magisk) 50 | - [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk) 51 | - Homebrew 52 | - `brew install xray` 53 | 54 | ## Usage 55 | 56 | - Example 57 | - [VLESS-XTLS-uTLS-REALITY](https://github.com/XTLS/REALITY#readme) 58 | - [VLESS-TCP-XTLS-Vision](https://github.com/XTLS/Xray-examples/tree/main/VLESS-TCP-XTLS-Vision) 59 | - [All-in-One-fallbacks-Nginx](https://github.com/XTLS/Xray-examples/tree/main/All-in-One-fallbacks-Nginx) 60 | - Xray-examples 61 | - [XTLS/Xray-examples](https://github.com/XTLS/Xray-examples) 62 | - [chika0801/Xray-examples](https://github.com/chika0801/Xray-examples) 63 | - [lxhao61/integrated-examples](https://github.com/lxhao61/integrated-examples) 64 | - Tutorial 65 | - [XTLS Vision](https://github.com/chika0801/Xray-install) 66 | - [REALITY (English)](https://cscot.pages.dev/2023/03/02/Xray-REALITY-tutorial/) 67 | - [XTLS-Iran-Reality (English)](https://github.com/SasukeFreestyle/XTLS-Iran-Reality) 68 | - [Xray REALITY with 'steal oneself' (English)](https://computerscot.github.io/vless-xtls-utls-reality-steal-oneself.html) 69 | - [Xray with WireGuard inbound (English)](https://g800.pages.dev/wireguard) 70 | 71 | ## GUI Clients 72 | 73 | - OpenWrt 74 | - [PassWall](https://github.com/xiaorouji/openwrt-passwall), [PassWall 2](https://github.com/xiaorouji/openwrt-passwall2) 75 | - [ShadowSocksR Plus+](https://github.com/fw876/helloworld) 76 | - [luci-app-xray](https://github.com/yichya/luci-app-xray) ([openwrt-xray](https://github.com/yichya/openwrt-xray)) 77 | - Asuswrt-Merlin 78 | - [XRAYUI](https://github.com/DanielLavrushin/asuswrt-merlin-xrayui) 79 | - Windows 80 | - [v2rayN](https://github.com/2dust/v2rayN) 81 | - [Furious](https://github.com/LorenEteval/Furious) 82 | - [Invisible Man - Xray](https://github.com/InvisibleManVPN/InvisibleMan-XRayClient) 83 | - Android 84 | - [v2rayNG](https://github.com/2dust/v2rayNG) 85 | - [X-flutter](https://github.com/XTLS/X-flutter) 86 | - [SaeedDev94/Xray](https://github.com/SaeedDev94/Xray) 87 | - iOS & macOS arm64 88 | - [Happ](https://apps.apple.com/app/happ-proxy-utility/id6504287215) 89 | - [FoXray](https://apps.apple.com/app/foxray/id6448898396) 90 | - [Streisand](https://apps.apple.com/app/streisand/id6450534064) 91 | - macOS arm64 & x64 92 | - [V2rayU](https://github.com/yanue/V2rayU) 93 | - [V2RayXS](https://github.com/tzmax/V2RayXS) 94 | - [Furious](https://github.com/LorenEteval/Furious) 95 | - [FoXray](https://apps.apple.com/app/foxray/id6448898396) 96 | - Linux 97 | - [v2rayA](https://github.com/v2rayA/v2rayA) 98 | - [Furious](https://github.com/LorenEteval/Furious) 99 | 100 | ## Others that support VLESS, XTLS, REALITY, XUDP, PLUX... 101 | 102 | - iOS & macOS arm64 103 | - [Shadowrocket](https://apps.apple.com/app/shadowrocket/id932747118) 104 | - Xray Tools 105 | - [xray-knife](https://github.com/lilendian0x00/xray-knife) 106 | - [xray-checker](https://github.com/kutovoys/xray-checker) 107 | - Xray Wrapper 108 | - [XTLS/libXray](https://github.com/XTLS/libXray) 109 | - [xtlsapi](https://github.com/hiddify/xtlsapi) 110 | - [AndroidLibXrayLite](https://github.com/2dust/AndroidLibXrayLite) 111 | - [Xray-core-python](https://github.com/LorenEteval/Xray-core-python) 112 | - [xray-api](https://github.com/XVGuardian/xray-api) 113 | - [XrayR](https://github.com/XrayR-project/XrayR) 114 | - [XrayR-release](https://github.com/XrayR-project/XrayR-release) 115 | - [XrayR-V2Board](https://github.com/missuo/XrayR-V2Board) 116 | - [Clash.Meta](https://github.com/MetaCubeX/Clash.Meta) 117 | - [clashN](https://github.com/2dust/clashN) 118 | - [Clash Meta for Android](https://github.com/MetaCubeX/ClashMetaForAndroid) 119 | - [sing-box](https://github.com/SagerNet/sing-box) 120 | 121 | ## Contributing 122 | 123 | [Code of Conduct](https://github.com/XTLS/Xray-core/blob/main/CODE_OF_CONDUCT.md) 124 | 125 | ## Credits 126 | 127 | - [Xray-core v1.0.0](https://github.com/XTLS/Xray-core/releases/tag/v1.0.0) was forked from [v2fly-core 9a03cc5](https://github.com/v2fly/v2ray-core/commit/9a03cc5c98d04cc28320fcee26dbc236b3291256), and we have made & accumulated a huge number of enhancements over time, check [the release notes for each version](https://github.com/XTLS/Xray-core/releases). 128 | - For third-party projects used in [Xray-core](https://github.com/XTLS/Xray-core), check your local or [the latest go.mod](https://github.com/XTLS/Xray-core/blob/main/go.mod). 129 | 130 | ## One-line Compilation 131 | 132 | ### Windows (PowerShell) 133 | 134 | ```powershell 135 | $env:CGO_ENABLED=0 136 | go build -o xray.exe -trimpath -buildvcs=false -ldflags="-s -w -buildid=" -v ./main 137 | ``` 138 | 139 | ### Linux / macOS 140 | 141 | ```bash 142 | CGO_ENABLED=0 go build -o xray -trimpath -buildvcs=false -ldflags="-s -w -buildid=" -v ./main 143 | ``` 144 | 145 | ### Reproducible Releases 146 | 147 | Make sure that you are using the same Go version, and remember to set the git commit id (7 bytes): 148 | 149 | ```bash 150 | CGO_ENABLED=0 go build -o xray -trimpath -buildvcs=false -ldflags="-X github.com/xtls/xray-core/core.build=REPLACE -s -w -buildid=" -v ./main 151 | ``` 152 | 153 | ## Stargazers over time 154 | 155 | [![Stargazers over time](https://starchart.cc/XTLS/Xray-core.svg)](https://starchart.cc/XTLS/Xray-core) 156 | --------------------------------------------------------------------------------