diff --git a/__pycache__/admin_routes.cpython-312.pyc b/__pycache__/admin_routes.cpython-312.pyc index aeaab72..362630a 100644 Binary files a/__pycache__/admin_routes.cpython-312.pyc and b/__pycache__/admin_routes.cpython-312.pyc differ diff --git a/__pycache__/admin_routes.cpython-313.pyc b/__pycache__/admin_routes.cpython-313.pyc new file mode 100644 index 0000000..2058d00 Binary files /dev/null and b/__pycache__/admin_routes.cpython-313.pyc differ diff --git a/__pycache__/auth.cpython-313.pyc b/__pycache__/auth.cpython-313.pyc new file mode 100644 index 0000000..6a1d985 Binary files /dev/null and b/__pycache__/auth.cpython-313.pyc differ diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc index 2e2a64f..feb0134 100644 Binary files a/__pycache__/config.cpython-312.pyc and b/__pycache__/config.cpython-312.pyc differ diff --git a/__pycache__/config.cpython-313.pyc b/__pycache__/config.cpython-313.pyc index ec055de..4967a4a 100644 Binary files a/__pycache__/config.cpython-313.pyc and b/__pycache__/config.cpython-313.pyc differ diff --git a/__pycache__/database.cpython-312.pyc b/__pycache__/database.cpython-312.pyc index 634ab37..6b6eb66 100644 Binary files a/__pycache__/database.cpython-312.pyc and b/__pycache__/database.cpython-312.pyc differ diff --git a/__pycache__/database.cpython-313.pyc b/__pycache__/database.cpython-313.pyc index d0e8873..e5a724c 100644 Binary files a/__pycache__/database.cpython-313.pyc and b/__pycache__/database.cpython-313.pyc differ diff --git a/__pycache__/image_processor.cpython-313.pyc b/__pycache__/image_processor.cpython-313.pyc new file mode 100644 index 0000000..65cd3bf Binary files /dev/null and b/__pycache__/image_processor.cpython-313.pyc differ diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index 64213cd..47016b4 100644 Binary files a/__pycache__/main.cpython-312.pyc and b/__pycache__/main.cpython-312.pyc differ diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc index ba2cf3c..147ff12 100644 Binary files a/__pycache__/main.cpython-313.pyc and b/__pycache__/main.cpython-313.pyc differ diff --git a/__pycache__/models.cpython-312.pyc b/__pycache__/models.cpython-312.pyc index 12cfa21..1a9dd5c 100644 Binary files a/__pycache__/models.cpython-312.pyc and b/__pycache__/models.cpython-312.pyc differ diff --git a/__pycache__/models.cpython-313.pyc b/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000..83b2636 Binary files /dev/null and b/__pycache__/models.cpython-313.pyc differ diff --git a/__pycache__/mqtt_manager.cpython-312.pyc b/__pycache__/mqtt_manager.cpython-312.pyc index 6257174..57157cf 100644 Binary files a/__pycache__/mqtt_manager.cpython-312.pyc and b/__pycache__/mqtt_manager.cpython-312.pyc differ diff --git a/__pycache__/mqtt_manager.cpython-313.pyc b/__pycache__/mqtt_manager.cpython-313.pyc new file mode 100644 index 0000000..daf6c11 Binary files /dev/null and b/__pycache__/mqtt_manager.cpython-313.pyc differ diff --git a/__pycache__/schemas.cpython-312.pyc b/__pycache__/schemas.cpython-312.pyc index c5510fb..aee2958 100644 Binary files a/__pycache__/schemas.cpython-312.pyc and b/__pycache__/schemas.cpython-312.pyc differ diff --git a/__pycache__/schemas.cpython-313.pyc b/__pycache__/schemas.cpython-313.pyc new file mode 100644 index 0000000..b13552b Binary files /dev/null and b/__pycache__/schemas.cpython-313.pyc differ diff --git a/api/__pycache__/__init__.cpython-312.pyc b/api/__pycache__/__init__.cpython-312.pyc index 4cf179d..3b7591f 100644 Binary files a/api/__pycache__/__init__.cpython-312.pyc and b/api/__pycache__/__init__.cpython-312.pyc differ diff --git a/api/__pycache__/__init__.cpython-313.pyc b/api/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..f2332b0 Binary files /dev/null and b/api/__pycache__/__init__.cpython-313.pyc differ diff --git a/api/__pycache__/contents.cpython-312.pyc b/api/__pycache__/contents.cpython-312.pyc index 2942577..93019f5 100644 Binary files a/api/__pycache__/contents.cpython-312.pyc and b/api/__pycache__/contents.cpython-312.pyc differ diff --git a/api/__pycache__/contents.cpython-313.pyc b/api/__pycache__/contents.cpython-313.pyc new file mode 100644 index 0000000..a810951 Binary files /dev/null and b/api/__pycache__/contents.cpython-313.pyc differ diff --git a/api/__pycache__/devices.cpython-312.pyc b/api/__pycache__/devices.cpython-312.pyc index f6f19fd..d8710b0 100644 Binary files a/api/__pycache__/devices.cpython-312.pyc and b/api/__pycache__/devices.cpython-312.pyc differ diff --git a/api/__pycache__/devices.cpython-313.pyc b/api/__pycache__/devices.cpython-313.pyc new file mode 100644 index 0000000..031311c Binary files /dev/null and b/api/__pycache__/devices.cpython-313.pyc differ diff --git a/api/__pycache__/todos.cpython-312.pyc b/api/__pycache__/todos.cpython-312.pyc index 23c30f5..4a612e5 100644 Binary files a/api/__pycache__/todos.cpython-312.pyc and b/api/__pycache__/todos.cpython-312.pyc differ diff --git a/api/__pycache__/todos.cpython-313.pyc b/api/__pycache__/todos.cpython-313.pyc new file mode 100644 index 0000000..beea15c Binary files /dev/null and b/api/__pycache__/todos.cpython-313.pyc differ diff --git a/api/contents.py b/api/contents.py index 7b7af55..5fa828b 100644 --- a/api/contents.py +++ b/api/contents.py @@ -1,9 +1,12 @@ -from fastapi import APIRouter, Depends, HTTPException, status, Query, File, UploadFile, Security +from fastapi import APIRouter, Depends, HTTPException, status, Query, File, UploadFile, Security, Response from sqlalchemy.orm import Session from sqlalchemy import func from typing import List, Optional import json import os +import sys +import tempfile +import importlib.util from database import get_db from schemas import Content as ContentSchema, ContentCreate, ContentUpdate, ContentResponse @@ -250,7 +253,7 @@ async def get_latest_content(device_id: str, db: Session = Depends(get_db)): created_at=content.created_at ) -@router.post("/upload") +@router.post("/upload", dependencies=[Depends(get_api_key)]) async def upload_image( device_id: str = Query(..., description="设备ID"), version: Optional[int] = Query(None, description="内容版本,如果提供则更新指定版本"), @@ -336,4 +339,243 @@ async def upload_image( raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"图片处理失败: {str(e)}" + ) + +def convert_to_binary_data(image_path: str, width: int = 400, height: int = 300, invert: bool = False, rotate: bool = False, dither: bool = True) -> bytes: + """ + 使用image_converter.py工具将图片转换为二进制数据 + + Args: + image_path: 图片路径 + width: 目标宽度 + height: 目标高度 + invert: 是否反转颜色 + rotate: 是否旋转90度 + dither: 是否使用抖动算法 + + Returns: + 二进制数据 + """ + try: + # 动态导入image_converter模块 + spec = importlib.util.spec_from_file_location("image_converter", "/Users/jeremygan/Desktop/python_dev/luna2025/tool/image_converter.py") + image_converter = importlib.util.module_from_spec(spec) + spec.loader.exec_module(image_converter) + + # 创建临时文件 + with tempfile.NamedTemporaryFile(suffix='.py', delete=False) as temp_file: + temp_path = temp_file.name + + try: + # 使用image_converter转换图片 + image_converter.convert_image_to_epaper( + image_path, + temp_path, + width=width, + height=height, + invert=invert, + rotate=rotate, + dither=dither + ) + + # 读取生成的Python文件并提取二进制数据 + with open(temp_path, 'r', encoding='utf-8') as f: + content = f.read() + + # 解析二进制数据 + start_idx = content.find("bytearray(b'") + len("bytearray(b'") + end_idx = content.find("')", start_idx) + + # 提取并解析十六进制字符串 + hex_str = content[start_idx:end_idx] + # 替换换行符和空格 + hex_str = hex_str.replace("'\n b'", "") + + # 转换为字节数组 + binary_data = bytearray() + i = 0 + while i < len(hex_str): + if hex_str[i] == '\\' and i + 1 < len(hex_str) and hex_str[i+1] == 'x': + # 提取十六进制值 + hex_val = hex_str[i+2:i+4] + binary_data.append(int(hex_val, 16)) + i += 4 + else: + i += 1 + + return bytes(binary_data) + + finally: + # 删除临时文件 + if os.path.exists(temp_path): + os.unlink(temp_path) + + except Exception as e: + raise Exception(f"图片转换为二进制数据失败: {str(e)}") + +@router.get("/devices/{device_id}/content/latest/binary", dependencies=[Depends(get_api_key)]) +async def get_latest_content_binary( + device_id: str, + invert: bool = Query(False, description="是否反转颜色"), + rotate: bool = Query(False, description="是否旋转90度"), + dither: bool = Query(True, description="是否使用抖动算法"), + db: Session = Depends(get_db) +): + """ + 获取设备最新活跃内容的二进制数据,适用于墨水屏显示 + """ + # 检查设备是否存在 + device = db.query(DeviceModel).filter(DeviceModel.device_id == device_id).first() + if not device: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="设备不存在" + ) + + # 获取最新的活跃内容 + content = db.query(ContentModel).filter( + ContentModel.device_id == device_id, + ContentModel.is_active == True + ).order_by(ContentModel.version.desc()).first() + + if not content: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="设备没有活跃内容" + ) + + if not content.image_path: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="内容没有关联的图片" + ) + + try: + # 获取完整的图片路径 + # 检查image_path是否已经包含static目录 + if content.image_path.startswith('static/'): + # 已经包含static目录,直接使用 + image_path = content.image_path + elif content.image_path.startswith('/'): + # 以/开头的完整路径,去掉开头的斜杠 + image_path = content.image_path[1:] + else: + # 相对路径,添加static_dir前缀 + image_path = os.path.join(settings.static_dir, content.image_path) + + # 确保图片文件存在 + if not os.path.exists(image_path): + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="图片文件不存在" + ) + + # 转换为二进制数据 + binary_data = convert_to_binary_data( + image_path, + width=settings.ink_width, + height=settings.ink_height, + invert=invert, + rotate=rotate, + dither=dither + ) + + # 返回二进制数据 + return Response( + content=binary_data, + media_type="application/octet-stream", + headers={ + "Content-Disposition": f"attachment; filename={device_id}_latest.bin", + "Content-Length": str(len(binary_data)) + } + ) + + except Exception as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"生成二进制数据失败: {str(e)}" + ) + +@router.get("/devices/{device_id}/content/{version}/binary", dependencies=[Depends(get_api_key)]) +async def get_content_binary( + device_id: str, + version: int, + invert: bool = Query(False, description="是否反转颜色"), + rotate: bool = Query(False, description="是否旋转90度"), + dither: bool = Query(True, description="是否使用抖动算法"), + db: Session = Depends(get_db) +): + """ + 获取内容的二进制数据,适用于墨水屏显示 + """ + # 检查设备是否存在 + device = db.query(DeviceModel).filter(DeviceModel.device_id == device_id).first() + if not device: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="设备不存在" + ) + + # 获取内容 + content = db.query(ContentModel).filter( + ContentModel.device_id == device_id, + ContentModel.version == version + ).first() + + if not content: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="内容不存在" + ) + + if not content.image_path: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="内容没有关联的图片" + ) + + try: + # 获取完整的图片路径 + # 检查image_path是否已经包含static目录 + if content.image_path.startswith('static/'): + # 已经包含static目录,直接使用 + image_path = content.image_path + elif content.image_path.startswith('/'): + # 以/开头的完整路径,去掉开头的斜杠 + image_path = content.image_path[1:] + else: + # 相对路径,添加static_dir前缀 + image_path = os.path.join(settings.static_dir, content.image_path) + + # 确保图片文件存在 + if not os.path.exists(image_path): + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="图片文件不存在" + ) + + # 转换为二进制数据 + binary_data = convert_to_binary_data( + image_path, + width=settings.ink_width, + height=settings.ink_height, + invert=invert, + rotate=rotate, + dither=dither + ) + + # 返回二进制数据 + return Response( + content=binary_data, + media_type="application/octet-stream", + headers={ + "Content-Disposition": f"attachment; filename={device_id}_v{version}.bin", + "Content-Length": str(len(binary_data)) + } + ) + + except Exception as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"生成二进制数据失败: {str(e)}" ) \ No newline at end of file diff --git a/static/processed/2f4215c6-62cf-4c5d-b1c7-c4e0b7b26b94.bmp b/static/processed/2f4215c6-62cf-4c5d-b1c7-c4e0b7b26b94.bmp new file mode 100644 index 0000000..0730d16 Binary files /dev/null and b/static/processed/2f4215c6-62cf-4c5d-b1c7-c4e0b7b26b94.bmp differ diff --git a/static/processed/af90fec7-7b6a-4ce6-bbac-cee44fdd6c22.bmp b/static/processed/af90fec7-7b6a-4ce6-bbac-cee44fdd6c22.bmp new file mode 100644 index 0000000..ba77802 Binary files /dev/null and b/static/processed/af90fec7-7b6a-4ce6-bbac-cee44fdd6c22.bmp differ diff --git a/static/uploads/7e9f852a-683a-4e81-8281-00b8d857cb4e.png b/static/uploads/7e9f852a-683a-4e81-8281-00b8d857cb4e.png new file mode 100644 index 0000000..942050a Binary files /dev/null and b/static/uploads/7e9f852a-683a-4e81-8281-00b8d857cb4e.png differ diff --git a/static/uploads/8051db84-3062-476b-9fe9-c59437561a95.png b/static/uploads/8051db84-3062-476b-9fe9-c59437561a95.png new file mode 100644 index 0000000..8deaa6c Binary files /dev/null and b/static/uploads/8051db84-3062-476b-9fe9-c59437561a95.png differ diff --git a/test_image.png b/test_image.png new file mode 100644 index 0000000..8deaa6c Binary files /dev/null and b/test_image.png differ diff --git a/tool/IMAGE_CONVERTER_README.md b/tool/IMAGE_CONVERTER_README.md new file mode 100644 index 0000000..b886ae8 --- /dev/null +++ b/tool/IMAGE_CONVERTER_README.md @@ -0,0 +1,167 @@ +# 图片转换工具使用指南 + +这个工具可以将多种格式的图片转换为适用于ESP32墨水屏显示的二进制点阵数据。 + +## 功能特点 + +- 支持多种图片格式:JPG、PNG、BMP、GIF、TIFF等 +- 自动调整图片大小并居中显示 +- 支持黑色背景白色文本或白色背景黑色文本 +- 支持旋转90度显示 +- 支持Floyd-Steinberg抖动算法提高图像质量 +- 支持创建文本图像 +- 支持批量转换 + +## 安装依赖 + +```bash +pip install Pillow +``` + +## 使用方法 + +### 1. 转换单个图片 + +```bash +python3 image_converter.py image <输入图片路径> <输出文件路径> [选项] +``` + +```bash +cd "/Users/jeremygan/Desktop/ +TangledupAI/esp32_GDEY042T81-24Pin-_dirver-" && python3 tool/image_con +verter.py image tool/test_iamge_white_bg2.png images/test_image2.py -- +width 400 --height 300 +``` +选项参数: +- `--width`: 目标宽度(默认400) +- `--height`: 目标高度(默认300) +- `--invert`: 反转颜色(白色背景黑色文本) +- `--rotate`: 旋转90度 +- `--no-dither`: 不使用抖动算法 + +示例: +```bash +# 转换为黑色背景白色文本(默认) +python3 image_converter.py image photo.jpg photo_dark.py + +# 转换为白色背景黑色文本 +python3 image_converter.py image photo.jpg photo_light.py --invert + +# 转换并旋转90度 +python3 image_converter.py image photo.jpg photo_rotated.py --rotate + +# 转换为128x296尺寸并旋转 +python3 image_converter.py image photo.jpg photo_small.py --width 128 --height 296 --rotate +``` + +### 2. 创建文本图像 + +```bash +python3 image_converter.py text "<文本内容>" <输出文件路径> [选项] +``` + + +选项参数: +- `--width`: 目标宽度(默认400) +- `--height`: 目标高度(默认300) +- `--font-size`: 字体大小(默认24) +- `--invert`: 反转颜色(白色背景黑色文本) +- `--rotate`: 旋转90度 + +示例: +```bash +# 创建文本图像 +python3 image_converter.py text "Hello ESP32!" hello.py + +# 创建大字体文本图像 +python3 image_converter.py text "Hello ESP32!" hello_big.py --font-size 32 + +# 创建旋转文本图像 +python3 image_converter.py text "Rotated Text" rotated.py --rotate +``` + +### 3. 批量转换 + +```bash +python3 image_converter.py batch <输入目录> <输出目录> [选项] +``` + +示例: +```bash +# 批量转换目录中的所有图片 +python3 image_converter.py batch images/ converted/ + +# 批量转换为白色背景黑色文本 +python3 image_converter.py batch images/ converted/ --invert +``` + +## 输出格式 + +转换后的文件包含一个bytearray变量,变量名与文件名相同: + +```python +# Converted from photo.jpg +# Size: 400x300 +# Inverted: False, Rotated: False +photo = bytearray(b'\x00\x00\x00\x0...') +``` + +## 在ESP32项目中使用 + +1. 将转换后的.py文件复制到ESP32项目目录 +2. 在boot.py中设置`RUN_MODE=3` +3. 修改image.py导入转换后的图片数据: + +```python +# 在image.py中导入转换后的图片 +from photo import photo + +def run(img_data=None): + if img_data is None: + # 使用默认图片 + img_data = photo + + # ... 其余代码保持不变 +``` + +4. 上传代码到ESP32并运行 + +## 示例 + +运行示例脚本: + +```bash +python3 convert_examples.py +``` + +这将创建示例图片目录并展示各种转换用法。 + +## 注意事项 + +1. 图片会自动调整大小并居中显示,保持原始宽高比 +2. 使用抖动算法可以提高图像质量,但会增加文件大小 +3. 旋转90度后,宽度和高度会互换 +4. 确保输出目录有写入权限 +5. 转换大图片可能需要一些时间 + +## 故障排除 + +1. **ImportError: No module named 'PIL'** + - 解决方案:运行 `pip install Pillow` + +2. **无法识别的图片格式** + - 解决方案:确保图片格式受支持(JPG、PNG、BMP、GIF、TIFF) + +3. **转换后的图片显示不正确** + - 解决方案:尝试使用`--invert`参数反转颜色 + - 尝试使用`--rotate`参数旋转图片 + +4. **内存不足** + - 解决方案:减小目标尺寸或使用更小的源图片 + +## 技术细节 + +- 图片使用Floyd-Steinberg抖动算法转换为1位黑白图像 +- 每个字节表示8个像素,最高位在前 +- 像素值0表示黑色,1表示白色 +- 字节数组按行组织,每行需要的字节数为(宽度+7)//8 \ No newline at end of file diff --git a/tool/USAGE_CN.md b/tool/USAGE_CN.md new file mode 100644 index 0000000..b814aa2 --- /dev/null +++ b/tool/USAGE_CN.md @@ -0,0 +1,144 @@ +# 图片转换工具使用说明 + +## 问题修复说明 + +### 之前的问题 +转换器在生成的图片数据中错误地插入了换行符 (`\n`, 0x0A),导致墨水屏显示乱码。 + +### 修复内容 +修改了 `image_converter.py` 中的字节数组格式化逻辑: +- **之前**: 每16个字节后直接写入 `\n`,导致换行符成为数据的一部分 +- **现在**: 每16个字节后正确地分割字符串为多个 `b'...'` 部分 + +## 使用方法 + +### 1. 转换单个图片 + +```bash +python image_converter.py image <输入图片路径> <输出文件路径> [选项] +``` + +**示例:** +```bash +# 基本用法 +python image_converter.py image test_image.png output.py + +# 指定尺寸 +python image_converter.py image test_image.png output.py --width 400 --height 300 + +# 反转颜色(白底黑字) +python image_converter.py image test_image.png output.py --invert + +# 旋转90度 +python image_converter.py image test_image.png output.py --rotate + +# 不使用抖动算法 +python image_converter.py image test_image.png output.py --no-dither +``` + +**重要提示:** +- 输出路径必须包含文件名,不能只是目录 +- ❌ 错误: `python image_converter.py image input.png /path/to/directory` +- ✅ 正确: `python image_converter.py image input.png /path/to/directory/output.py` + +### 2. 创建文本图片 + +```bash +python image_converter.py text <文本内容> <输出文件路径> [选项] +``` + +**示例:** +```bash +# 基本用法 +python image_converter.py text "Hello World" output.py + +# 指定字体大小 +python image_converter.py text "Hello" output.py --font-size 32 + +# 白底黑字 +python image_converter.py text "Hello" output.py --invert +``` + +### 3. 批量转换 + +```bash +python image_converter.py batch <输入目录> <输出目录> [选项] +``` + +**示例:** +```bash +python image_converter.py batch ./input_images ./output_files --width 400 --height 300 +``` + +## 参数说明 + +### 通用参数 +- `--width`: 目标宽度(默认400像素) +- `--height`: 目标高度(默认300像素) +- `--invert`: 反转颜色(黑底白字 → 白底黑字) +- `--rotate`: 旋转90度 + +### 图片转换专用 +- `--no-dither`: 不使用抖动算法(使用简单阈值二值化) + +### 文本创建专用 +- `--font-size`: 字体大小(默认24) + +## 在MicroPython中使用生成的文件 + +```python +# 导入生成的图片数据 +from output import image_data + +# 在image.py中使用 +import image +image.run(image_data, width=400, height=300) +``` + +## 验证修复 + +运行验证脚本检查生成的文件是否正确: + +```bash +python verify_fix.py +``` + +这会比较修复前后的数据,确认没有错误的换行符。 + +## 常见问题 + +### Q: 为什么显示乱码? +A: 如果使用旧版本转换器生成的文件,数据中包含错误的换行符。请使用修复后的转换器重新生成。 + +### Q: 如何重新生成所有图片? +A: 使用批量转换功能: +```bash +python image_converter.py batch ./old_images ./new_images --width 400 --height 300 +``` + +### Q: 支持哪些图片格式? +A: 支持 JPG, PNG, BMP, GIF, TIFF 等常见格式。 + +### Q: 生成的文件大小是多少? +A: 对于400x300的图片,二进制数据大小为 15000 字节 (400 * 300 / 8)。 + +## 技术细节 + +### 数据格式 +- 每个像素用1位表示(黑或白) +- 每行需要 `(width + 7) // 8` 个字节 +- 总字节数: `width_bytes * height` +- 位顺序: MSB first (最高位在前) + +### 正确的输出格式 +```python +image_data = bytearray(b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'...') +``` + +### 错误的输出格式(已修复) +```python +# 不要使用这种格式! +image_data = bytearray(b'\n\xFF\xFF\xFF\xFF...\n\xFF\xFF...') +``` diff --git a/tool/__pycache__/image_converter.cpython-312.pyc b/tool/__pycache__/image_converter.cpython-312.pyc new file mode 100644 index 0000000..86ad041 Binary files /dev/null and b/tool/__pycache__/image_converter.cpython-312.pyc differ diff --git a/tool/__pycache__/image_converter.cpython-313.pyc b/tool/__pycache__/image_converter.cpython-313.pyc new file mode 100644 index 0000000..6ddb0bd Binary files /dev/null and b/tool/__pycache__/image_converter.cpython-313.pyc differ diff --git a/tool/convert_examples.py b/tool/convert_examples.py new file mode 100644 index 0000000..096f0a2 --- /dev/null +++ b/tool/convert_examples.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +""" +图片转换工具使用示例 +""" + +import os +import subprocess +import sys + +def run_command(cmd): + """运行命令并打印输出""" + print(f"执行命令: {' '.join(cmd)}") + result = subprocess.run(cmd, capture_output=True, text=True) + if result.stdout: + print(result.stdout) + if result.stderr: + print(f"错误: {result.stderr}") + return result.returncode == 0 + +def main(): + print("=== 图片转换工具使用示例 ===\n") + + # 检查是否存在示例图片目录 + example_dir = "example_images" + output_dir = "converted_images" + + if not os.path.exists(example_dir): + print(f"创建示例图片目录: {example_dir}") + os.makedirs(example_dir, exist_ok=True) + print("请将图片文件放入此目录后再次运行此脚本") + return + + if not os.path.exists(output_dir): + print(f"创建输出目录: {output_dir}") + os.makedirs(output_dir, exist_ok=True) + + # 示例1: 转换单个图片为黑色背景白色文本 + print("\n示例1: 转换单个图片为黑色背景白色文本") + print("=" * 50) + cmd = [ + "python3", "image_converter.py", "image", + os.path.join(example_dir, "example.jpg"), + os.path.join(output_dir, "example_dark.py"), + "--width", "400", + "--height", "300" + ] + run_command(cmd) + + # 示例2: 转换单个图片为白色背景黑色文本 + print("\n示例2: 转换单个图片为白色背景黑色文本") + print("=" * 50) + cmd = [ + "python3", "image_converter.py", "image", + os.path.join(example_dir, "example.jpg"), + os.path.join(output_dir, "example_light.py"), + "--width", "400", + "--height", "300", + "--invert" + ] + run_command(cmd) + + # 示例3: 创建文本图像 + print("\n示例3: 创建文本图像") + print("=" * 50) + cmd = [ + "python3", "image_converter.py", "text", + "Hello ESP32!", + os.path.join(output_dir, "hello_text.py"), + "--width", "400", + "--height", "300", + "--font-size", "32" + ] + run_command(cmd) + + # 示例4: 创建旋转90度的文本图像 + print("\n示例4: 创建旋转90度的文本图像") + print("=" * 50) + cmd = [ + "python3", "image_converter.py", "text", + "Rotated Text", + os.path.join(output_dir, "rotated_text.py"), + "--width", "400", + "--height", "300", + "--font-size", "32", + "--rotate" + ] + run_command(cmd) + + # 示例5: 批量转换图片 + print("\n示例5: 批量转换图片") + print("=" * 50) + cmd = [ + "python3", "image_converter.py", "batch", + example_dir, + output_dir, + "--width", "400", + "--height", "300" + ] + run_command(cmd) + + # 示例6: 转换为128x296尺寸(与现有示例相同) + print("\n示例6: 转换为128x296尺寸") + print("=" * 50) + cmd = [ + "python3", "image_converter.py", "image", + os.path.join(example_dir, "example.jpg"), + os.path.join(output_dir, "example_128x296.py"), + "--width", "128", + "--height", "296", + "--rotate" + ] + run_command(cmd) + + print("\n=== 转换完成 ===") + print(f"输出文件位于: {output_dir}") + print("\n使用方法:") + print("1. 将转换后的.py文件复制到ESP32项目目录") + print("2. 在boot.py中设置RUN_MODE=3") + print("3. 修改image.py导入转换后的图片数据") + print("4. 上传代码到ESP32并运行") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tool/example_usage.py b/tool/example_usage.py new file mode 100644 index 0000000..28d0863 --- /dev/null +++ b/tool/example_usage.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python3 +""" +示例:如何在ESP32项目中使用转换后的图片数据 +""" + +# 假设你已经使用图片转换工具将图片转换为example_image.py +# 其中包含以下内容: +# example_image = bytearray(b'\x00\x00\x00\x0...') + +# 1. 导入转换后的图片数据 +# from example_image import example_image + +# 2. 在image.py中使用图片数据 +""" +# image.py 中的示例代码 + +import framebuf +from machine import Pin, SPI +import epaper4in2 +import time +import config + +def run(img_data=None): + # 如果没有提供图片数据,使用默认图片 + if img_data is None: + # 可以在这里设置默认图片 + img_data = None + + try: + # 初始化墨水屏 + epd = epaper4in2.EPD() + epd.init() + + # 创建帧缓冲区 + buf = bytearray(config.WIDTH * config.HEIGHT // 8) + fb = framebuf.FrameBuffer(buf, config.WIDTH, config.HEIGHT, framebuf.MONO_HLSB) + + if img_data is not None: + # 使用提供的图片数据 + # 根据图片数据长度判断图片尺寸 + data_length = len(img_data) + + # 常见尺寸检查 + if data_length == 128 * 296 // 8: # 128x296 + img_width, img_height = 128, 296 + elif data_length == 400 * 300 // 8: # 400x300 + img_width, img_height = 400, 300 + else: + # 默认尺寸 + img_width, img_height = 400, 300 + + # 计算居中位置 + x_offset = (config.WIDTH - img_width) // 2 + y_offset = (config.HEIGHT - img_height) // 2 + + # 将图片数据复制到帧缓冲区 + for y in range(img_height): + for x in range(img_width): + # 计算源位置 + src_byte_index = y * ((img_width + 7) // 8) + x // 8 + src_bit_position = 7 - (x % 8) + + # 获取像素值 + pixel = (img_data[src_byte_index] >> src_bit_position) & 1 + + # 计算目标位置 + dst_x = x_offset + x + dst_y = y_offset + y + + if 0 <= dst_x < config.WIDTH and 0 <= dst_y < config.HEIGHT: + fb.pixel(dst_x, dst_y, pixel) + else: + # 如果没有图片数据,显示测试图案 + fb.fill(0) + fb.rect(10, 10, config.WIDTH-20, config.HEIGHT-20, 1) + fb.text("No Image Data", 50, config.HEIGHT//2, 1) + + # 显示图片 + epd.display_frame(buf) + + # 等待一段时间 + time.sleep(5) + + # 清屏并进入深度睡眠 + epd.clear() + epd.sleep() + + except Exception as e: + print(f"显示图片时出错: {e}") + # 清屏并进入深度睡眠 + epd.clear() + epd.sleep() +""" + +# 3. 在boot.py中设置RUN_MODE=3 +""" +# boot.py 中的示例代码 + +import machine +import time +import config + +# 设置运行模式 +# 0: 正常运行模式 +# 1: WiFi连接模式 +# 2: 配置模式 +# 3: 图片显示模式 +RUN_MODE = 3 + +if RUN_MODE == 3: + # 导入图片数据 + from example_image import example_image + + # 导入图片显示模块 + import image + + # 显示图片 + image.run(example_image) +""" + +# 4. 使用不同的图片 +""" +# 你可以根据需要导入不同的图片数据 + +# 显示黑色背景白色文本的图片 +from example_dark import example_dark +image.run(example_dark) + +# 显示白色背景黑色文本的图片 +from example_light import example_light +image.run(example_light) + +# 显示旋转的图片 +from example_rotated import example_rotated +image.run(example_rotated) + +# 显示文本图片 +from hello_text import hello_text +image.run(hello_text) +""" + +# 5. 动态选择图片 +""" +# 你可以根据条件动态选择要显示的图片 + +def display_image_by_condition(condition): + if condition == "dark": + from example_dark import example_dark + return example_dark + elif condition == "light": + from example_light import example_light + return example_light + elif condition == "rotated": + from example_rotated import example_rotated + return example_rotated + else: + from hello_text import hello_text + return hello_text + +# 使用示例 +img_data = display_image_by_condition("dark") +image.run(img_data) +""" + +print("这是一个示例文件,展示了如何在ESP32项目中使用转换后的图片数据。") +print("请参考注释中的代码示例,根据你的实际需求进行修改。") \ No newline at end of file diff --git a/tool/image_converter.py b/tool/image_converter.py new file mode 100644 index 0000000..0cfafad --- /dev/null +++ b/tool/image_converter.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python3 +""" +图片转换工具 - 将多种格式的图片转换为适用于墨水屏显示的二进制点阵数据 +支持转换为黑色背景白色文本或白色背景黑色文本的格式 +""" + +import os +import sys +from PIL import Image, ImageOps, ImageDraw, ImageFont +import argparse +import math + +def convert_image_to_epaper(input_path, output_path, width=400, height=300, invert=False, rotate=False, dither=True): + """ + 将图片转换为墨水屏二进制格式 + + 参数: + input_path: 输入图片路径 + output_path: 输出文件路径 + width: 目标宽度(默认400) + height: 目标高度(默认300) + invert: 是否反转颜色(默认False,黑色背景白色文本) + rotate: 是否旋转90度(默认False) + dither: 是否使用抖动算法(默认True) + """ + try: + # 打开图片 + img = Image.open(input_path) + + # 转换为RGB模式 + if img.mode != 'RGB': + img = img.convert('RGB') + + # 调整大小,保持宽高比 + img_ratio = img.width / img.height + target_ratio = width / height + + if img_ratio > target_ratio: + # 图片较宽,以宽度为准 + new_width = width + new_height = int(width / img_ratio) + else: + # 图片较高,以高度为准 + new_height = height + new_width = int(height * img_ratio) + + img = img.resize((new_width, new_height), Image.LANCZOS) + + # 创建目标大小的黑色背景 + result = Image.new('RGB', (width, height), (0, 0, 0) if not invert else (255, 255, 255)) + + # 计算居中位置 + x_offset = (width - new_width) // 2 + y_offset = (height - new_height) // 2 + + # 将图片粘贴到中心 + result.paste(img, (x_offset, y_offset)) + + # 转换为灰度 + result = result.convert('L') + + # 转换为1位黑白图像 + if dither: + result = result.convert('1', dither=Image.FLOYDSTEINBERG) + else: + # 使用阈值128进行二值化 + result = result.point(lambda x: 0 if x < 128 else 255, '1') + + # 如果需要反转颜色 + if invert: + result = ImageOps.invert(result) + + # 如果需要旋转90度 + if rotate: + result = result.rotate(90, expand=True) + # 如果旋转后尺寸不匹配,需要重新调整 + if result.size != (width, height): + result = result.resize((width, height), Image.LANCZOS) + + # 转换为字节数组 + width_bytes = (width + 7) // 8 # 每行需要的字节数 + total_bytes = width_bytes * height + + # 创建字节数组 + byte_array = bytearray(total_bytes) + + # 将像素数据转换为字节数组 + for y in range(height): + for x in range(width): + # 获取像素值 (0或255) + pixel = 0 if result.getpixel((x, y)) == 0 else 1 + + # 计算字节位置和位位置 + byte_index = y * width_bytes + x // 8 + bit_position = 7 - (x % 8) # 最高位在前 + + # 设置位 + if pixel: + byte_array[byte_index] |= (1 << bit_position) + + # 生成Python代码 + var_name = os.path.splitext(os.path.basename(output_path))[0] + + with open(output_path, 'w', encoding='utf-8') as f: + f.write(f"# Converted from {input_path}\n") + f.write(f"# Size: {width}x{height}\n") + f.write(f"# Inverted: {invert}, Rotated: {rotate}\n") + f.write(f"{var_name} = bytearray(b'") + + # 将字节数组格式化为十六进制字符串 + for i, byte in enumerate(byte_array): + if i > 0 and i % 16 == 0: + f.write("'\n b'") + f.write(f"\\x{byte:02X}") + + f.write("')\n") + + print(f"转换完成: {input_path} -> {output_path}") + print(f"输出尺寸: {width}x{height}") + print(f"总字节数: {total_bytes}") + + return True + + except Exception as e: + print(f"转换失败: {e}") + return False + +def create_text_image(text, output_path, width=400, height=300, font_size=24, invert=False, rotate=False): + """ + 创建文本图像并转换为墨水屏二进制格式 + + 参数: + text: 要显示的文本 + output_path: 输出文件路径 + width: 目标宽度(默认400) + height: 目标高度(默认300) + font_size: 字体大小(默认24) + invert: 是否反转颜色(默认False,黑色背景白色文本) + rotate: 是否旋转90度(默认False) + """ + try: + # 创建图像 + result = Image.new('RGB', (width, height), (0, 0, 0) if not invert else (255, 255, 255)) + draw = ImageDraw.Draw(result) + + # 尝试加载字体 + try: + # 尝试使用系统字体 + font = ImageFont.truetype("arial.ttf", font_size) + except: + try: + # 尝试使用项目中的字体 + font = ImageFont.truetype("GB2312-12.fon", font_size) + except: + # 使用默认字体 + font = ImageFont.load_default() + + # 计算文本位置 + text_width, text_height = draw.textsize(text, font=font) + x = (width - text_width) // 2 + y = (height - text_height) // 2 + + # 绘制文本 + text_color = (255, 255, 255) if not invert else (0, 0, 0) + draw.text((x, y), text, font=font, fill=text_color) + + # 转换为灰度 + result = result.convert('L') + + # 转换为1位黑白图像 + result = result.convert('1') + + # 如果需要旋转90度 + if rotate: + result = result.rotate(90, expand=True) + # 如果旋转后尺寸不匹配,需要重新调整 + if result.size != (width, height): + result = result.resize((width, height), Image.LANCZOS) + + # 转换为字节数组 + width_bytes = (width + 7) // 8 # 每行需要的字节数 + total_bytes = width_bytes * height + + # 创建字节数组 + byte_array = bytearray(total_bytes) + + # 将像素数据转换为字节数组 + for y in range(height): + for x in range(width): + # 获取像素值 (0或255) + pixel = 0 if result.getpixel((x, y)) == 0 else 1 + + # 计算字节位置和位位置 + byte_index = y * width_bytes + x // 8 + bit_position = 7 - (x % 8) # 最高位在前 + + # 设置位 + if pixel: + byte_array[byte_index] |= (1 << bit_position) + + # 生成Python代码 + var_name = os.path.splitext(os.path.basename(output_path))[0] + + with open(output_path, 'w', encoding='utf-8') as f: + f.write(f"# Text image: {text}\n") + f.write(f"# Size: {width}x{height}\n") + f.write(f"# Font size: {font_size}\n") + f.write(f"# Inverted: {invert}, Rotated: {rotate}\n") + f.write(f"{var_name} = bytearray(b'") + + # 将字节数组格式化为十六进制字符串 + for i, byte in enumerate(byte_array): + if i > 0 and i % 16 == 0: + f.write("'\n b'") + f.write(f"\\x{byte:02X}") + + f.write("')\n") + + print(f"文本图像创建完成: {output_path}") + print(f"文本: {text}") + print(f"输出尺寸: {width}x{height}") + print(f"总字节数: {total_bytes}") + + return True + + except Exception as e: + print(f"创建失败: {e}") + return False + +def main(): + parser = argparse.ArgumentParser(description='将图片转换为墨水屏二进制格式') + subparsers = parser.add_subparsers(dest='command', help='子命令') + + # 图片转换命令 + img_parser = subparsers.add_parser('image', help='转换图片文件') + img_parser.add_argument('input', help='输入图片路径') + img_parser.add_argument('output', help='输出文件路径') + img_parser.add_argument('--width', type=int, default=400, help='目标宽度(默认400)') + img_parser.add_argument('--height', type=int, default=300, help='目标高度(默认300)') + img_parser.add_argument('--invert', action='store_true', help='反转颜色(白色背景黑色文本)') + img_parser.add_argument('--rotate', action='store_true', help='旋转90度') + img_parser.add_argument('--no-dither', action='store_true', help='不使用抖动算法') + + # 文本创建命令 + text_parser = subparsers.add_parser('text', help='创建文本图像') + text_parser.add_argument('text', help='要显示的文本') + text_parser.add_argument('output', help='输出文件路径') + text_parser.add_argument('--width', type=int, default=400, help='目标宽度(默认400)') + text_parser.add_argument('--height', type=int, default=300, help='目标高度(默认300)') + text_parser.add_argument('--font-size', type=int, default=24, help='字体大小(默认24)') + text_parser.add_argument('--invert', action='store_true', help='反转颜色(白色背景黑色文本)') + text_parser.add_argument('--rotate', action='store_true', help='旋转90度') + + # 批量转换命令 + batch_parser = subparsers.add_parser('batch', help='批量转换图片') + batch_parser.add_argument('input_dir', help='输入目录') + batch_parser.add_argument('output_dir', help='输出目录') + batch_parser.add_argument('--width', type=int, default=400, help='目标宽度(默认400)') + batch_parser.add_argument('--height', type=int, default=300, help='目标高度(默认300)') + batch_parser.add_argument('--invert', action='store_true', help='反转颜色(白色背景黑色文本)') + batch_parser.add_argument('--rotate', action='store_true', help='旋转90度') + batch_parser.add_argument('--no-dither', action='store_true', help='不使用抖动算法') + + args = parser.parse_args() + + if args.command == 'image': + convert_image_to_epaper( + args.input, + args.output, + args.width, + args.height, + args.invert, + args.rotate, + not args.no_dither + ) + elif args.command == 'text': + create_text_image( + args.text, + args.output, + args.width, + args.height, + args.font_size, + args.invert, + args.rotate + ) + elif args.command == 'batch': + # 确保输出目录存在 + os.makedirs(args.output_dir, exist_ok=True) + + # 支持的图片格式 + supported_formats = ('.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff') + + # 遍历输入目录 + for filename in os.listdir(args.input_dir): + if filename.lower().endswith(supported_formats): + input_path = os.path.join(args.input_dir, filename) + output_filename = os.path.splitext(filename)[0] + '.py' + output_path = os.path.join(args.output_dir, output_filename) + + convert_image_to_epaper( + input_path, + output_path, + args.width, + args.height, + args.invert, + args.rotate, + not args.no_dither + ) + else: + parser.print_help() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tool/test_iamge.png b/tool/test_iamge.png new file mode 100644 index 0000000..67c92f9 Binary files /dev/null and b/tool/test_iamge.png differ diff --git a/tool/test_iamge_fixed.py b/tool/test_iamge_fixed.py new file mode 100644 index 0000000..54c21fa --- /dev/null +++ b/tool/test_iamge_fixed.py @@ -0,0 +1,941 @@ +# Converted from tool/test_iamge_white_bg.png +# Size: 400x300 +# Inverted: False, Rotated: False +test_iamge_fixed = bytearray(b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\x8F\xFF\xFF\xFF\xFF\xFC\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFC\xFF\x87\xFF\xFF\xFF\xFF\xF8\xFF\x3F\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFC\x7F\x87\xFF\xFF\xFF\xFF\xF8\xF8\x1F\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFD\x3F\x06\x8F\xFF\xFF\xF8\xF8\x40\x8F' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC\x3A\x10\x07\xFF\xFF\xF8\xF2' + b'\x02\x5F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x00\x00\x27\xFF\xFF' + b'\xF8\x00\x0B\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE8\x00\x81\x57' + b'\xFF\xFF\xF8\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC\x00\x48' + b'\x3F\xFF\xFF\xFC\x81\x11\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC' + b'\x00\x02\xFF\xFF\xFF\xF8\x00\x77\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFE\x49\x38\xFF\xFF\xFF\xF0\x04\xF3\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\x06\x51\x3F\xFF\xFF\xFD\x2C\xF7\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x40\x1F\xFF\xFF\xFF\xFD\xE7\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x40\x1F\xFF\xFF\xFF\xFE\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x09\x7F\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x00\x3F\xFF' + b'\xFF\xFF\xF3\xBF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x22' + b'\x1F\xFF\xFF\xFF\xE3\x8F\x8F\xCF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFC\x80\x4F\xFF\xFF\xFF\xE3\x87\x8F\x8F\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xC4\x1F\xFF\xFF\xFF\xC3\x87\xC3\x1F\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFC\x51\x1F\xFF\xFF\xFF\xD7\x85\xC2\x3F\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFC\x44\x3E\x3F\xFF\xFF\xC7\x94\x48\x7F' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC\x00\x20\x0F\xFF\xFF\x81\x80' + b'\x40\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD\x10\x40\x87\xFF\xFF' + b'\x19\x84\x44\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC\x01\x04\x0F' + b'\xFF\xFF\x00\x94\x4C\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x44' + b'\x03\xFF\xFF\xFE\x40\x0F\xCC\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFC\x00\x2F\xFF\xFF\xFE\x04\x3F\x98\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xC0\x10\xFF\xFF\xFF\xFD\x90\xB1\xD9\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xF0\x00\x87\xC1\xFF\xFF\xFF\x00\x63\x79\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xF0\x02\x3E\x00\x3F\xFF\xFE\x21\x87\x19\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF2\x25\xF0\x08\x1F\xFF\xFE\x77\x0F' + b'\xD1\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x3F\x80\x20\x1F\xFF\xFC' + b'\x78\x2F\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD\xCC\x02\x7D\x1F' + b'\xFF\xFC\x70\x33\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x15' + b'\x3E\x1F\xFF\xF9\x39\x43\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xC4\x98\x3C\x5F\xFF\xF3\x1E\x03\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xC1\x80\x3E\x1F\xFF\xE7\x3E\x4B\xC1\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xD3\x82\x3C\x1F\xFF\xEF\x3E\x23\xC8\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xE3\xD8\x7C\x1F\xFF\xDE\x1E\x47\x98\x7F' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE3\x80\xFC\x5F\xFF\xDE\x3E\x53' + b'\x39\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE3\xC3\xF8\x1F\xFF\xFF' + b'\x1E\x44\x7C\x0F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE7\x87\xFA\x3F' + b'\xFF\xFE\x1E\x40\xFE\x03\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE7\xD0' + b'\xF8\x3F\xFF\xFF\x1E\x83\xFE\x23\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xF7\xC0\x28\xBF\xFF\xFE\x0C\xC9\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xE4\x0B\x00\x7F\xFF\xFE\x2E\x83\xFF\x80\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xE1\x0F\x82\x7F\xFF\xFE\x0D\xC7\xFF\xC8\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x3F\xC8\x7F\xFF\xFE\x4B\xCF\xFF\xF0' + b'\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\xFF\xE0\xFF\xFF\xFF\x1F\xFF' + b'\xFF\xFE\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF1\xFF\xFF\xFF' + b'\xBF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC\x3F' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFC\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFD\xFD\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xF8\x7C\x17\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFC\x1F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xF8\x3C\x00\xFF\xFF\xFF\xFF\xFE\x3F\xFF\xFF' + b'\xFF\xFF\xFC\x0F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x70\x40\xFF\xFF\xFF\xFF\xFE\x3F' + b'\xFF\xFF\xFF\xFF\xFC\x2F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xF5\xFF\xFF\xFF\xFF\xFF\xFF\xFA\x01\x09\xFF\xFF\xFF\xFF' + b'\xFE\x3F\xFF\xFF\xFF\xFF\xF8\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFC\x7F\xFF\xFF\xF0\x7F\xFF\xFF\xFF\xFF\xFF\xE0\x10\xFF\xFF\xFF' + b'\xFF\x1F\xFF\x3F\xFF\xFF\xFF\xFF\xF0\x8F\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xF8\x3F\xFF\xFF\xF0\x3F\xFF\xFF\xFF\xFF\xFF\x01\x11\xFF' + b'\xFF\xFF\xFF\x0F\xFF\x3F\xFF\xFF\xFF\xFF\xE0\x3F\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xE1\x3F\xFF\xFF\xF9\x3F\xFF\xFF\xFF\xFF\xFC\x10' + b'\x71\xFF\xFF\xFF\xFF\x0F\xFE\x3E\x3F\xFF\xFF\xFF\xC2\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xC4\x7F\xFF\xFF\xFC\x3F\xFF\xFC\xFF\xFF' + b'\xFE\x0C\x73\xFF\xFF\xFF\xFF\x87\xFE\x78\x1F\xFF\xFF\xFF\x83\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x10\x7F\xFF\xFF\xFE\x3F\xFF\xF8' + b'\x3F\xFF\xFF\xFC\x63\xFF\xFF\xFF\xFF\x87\xFE\x20\x9F\xFF\xFF\xFF' + b'\x1F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xEC\x40\xFF\xFF\xFF\xFF\x7F' + b'\xEF\xF0\x3F\xFF\xFF\xFC\x67\xFF\xFF\xFF\xFF\x8F\xFE\x02\x1F\xFF' + b'\xFF\xFE\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01\xFF\xFF\xFF' + b'\xFF\x7F\x83\xF1\x7F\xFF\xFF\xFC\xE7\xFF\xFF\xFF\xFF\x0F\xFE\x88' + b'\x3F\xFF\xFF\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF1\x07\xFF' + b'\xFF\xFF\xFF\xFF\x03\xE1\x7F\xFF\xFF\xFC\x6F\xFF\xFF\xFF\xFF\xA7' + b'\xFC\x10\xFF\xFF\xFF\xE7\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\x93\xFF\xFF\xFF\xFF\xFC\x27\xC7\xFF\xFF\xFF\xFE\xCF\xFA\x3F\xFF' + b'\xFF\x8F\xF0\x51\xFF\xFF\xFF\xC3\xFF\xF9\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\x07\xFF\xFF\xFF\xFF\xF0\x07\x83\xFF\xFF\xFF\xFC\xFF\xC0' + b'\x3F\xFF\xFF\x87\xFE\x03\xFF\xFF\xFF\xF1\xF9\xE1\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\x0F\xFF\xFF\xFF\xFF\xF0\x0F\x03\xFF\xFF\xFF\xFE' + b'\xFE\x00\x1F\xFF\xFF\x8F\xFE\x47\xFF\xFF\xFF\xF8\xF1\xC5\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFC\x1E\x3F\xFF\xFF\xFF\xFF\xFD\x4E\x69\xFF\xFF' + b'\xFF\xFE\xF0\x3D\x3F\xFF\xFF\x0F\xFC\x07\xFF\xFF\xFF\xFC\xF8\x07' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xF9\x00\x3F\xFF\xFF\xFF\xF0\xFF\x1F\xE3' + b'\xFF\xFF\xFF\xFF\xC1\x7C\x1F\xFF\xFF\x8F\xFE\x27\xFF\xFF\xFF\xF8' + b'\xF8\x17\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF2\x7F\xFF\xFF\xFF\xC0\x7F' + b'\x01\xE3\xFF\xFF\xFF\xFF\x05\xF8\x3F\xFF\xCF\x8C\xFC\x30\xFF\xFF' + b'\xFF\xFC\xFA\x4F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x0F\xFF\xFF\xFF' + b'\x80\xFE\x23\xE0\x3F\xFF\xFF\xF8\x0F\xF8\xBF\xFF\xCF\x81\xFD\x70' + b'\xFF\xFF\xFF\xF8\x70\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x8F\xFF' + b'\xFF\xFE\x12\xFE\x03\xE0\x7F\xFF\xFF\xC0\x27\xF0\x7F\xFF\xE7\x13' + b'\xFC\x61\xFF\xFF\xFF\xF8\xC0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF1' + b'\xC1\xFF\xFF\xFC\x00\xFD\x0B\xE4\xFF\xFF\xFE\x04\x8F\xF2\x7F\xFF' + b'\xE7\x87\xF8\xC5\xFF\xFF\xFF\xF0\x04\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xE3\xF0\xFF\xFF\xFC\x80\xFC\x20\xE1\xFF\xFF\xFE\x11\xC7\xE0' + b'\xFF\xFF\xC3\x0F\xF0\x83\xFF\xFF\xFF\xF4\x90\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xE3\xF8\x3F\xFF\xFE\x35\xFE\x08\xE7\xFF\xFF\xFF\x07' + b'\x87\xE0\xFF\xFF\xC0\x2F\xE2\x0F\xFF\xFF\xFF\xF0\x00\x7F\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xC7\x7C\x0F\xFF\xFF\xF0\xFF\x98\xE7\xFF\xFF' + b'\xFF\xFF\xC9\xC9\xFF\xFF\xC8\x9F\xC0\x1F\xFF\xFF\xFF\xE0\x02\x7F' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x8F\x2E\x81\xFF\xFF\xF1\xFF\x9C\xE7' + b'\xFF\xFF\xFF\xFF\xC8\x43\xFF\xFF\x80\x1F\xC4\x7F\xFF\xFF\xFF\xE2' + b'\x48\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1E\x03\x00\x0F\xFF\xE0\x0F' + b'\x1C\xEE\x01\xFF\xFF\xFF\xC4\x03\xFF\xFF\xC2\x1F\xE0\xFF\xFF\xFF' + b'\xFF\xE0\x38\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x3E\x03\xC4\x07\xFF' + b'\xE0\x03\x3C\x40\x00\xFF\xFF\xFF\xC6\x13\xFF\xFF\xC9\x9F\xF0\xFF' + b'\xFF\xFF\xFF\xF0\xF8\x43\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x7F\x27\xE0' + b'\x03\xFF\xE9\xF0\x30\x00\x91\xFF\xFF\xFF\xC7\x47\xFF\xFF\xC3\x1F' + b'\xF9\x3F\xFF\xFF\xFF\xF2\xF9\x60\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC\x78' + b'\x07\xF0\x91\xFF\xE1\xCC\x60\x15\x4F\xFF\xFF\xFF\x87\x8F\xFF\xFF' + b'\xEF\xBF\xF3\x1F\xFF\xFF\xFF\xFF\xF8\x78\x0F\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xF0\xE0\x1F\xFC\x03\xFF\xE1\x9C\x1B\xFF\xFF\xFF\xFF\xFF\xC7\xFF' + b'\xFF\xFF\xFF\x1F\xF3\x8F\xFF\xFF\xFF\xFF\xF0\x7E\x01\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xE3\xE1\x3F\xFF\xFF\xFF\xE5\x3C\x0F\xFF\xFF\xFF\xFF\xFF' + b'\xC7\xFF\xFF\xFF\xFF\x9F\xF3\xC3\xFF\xFF\xFF\xFF\xF9\x7F\x90\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\x0B\xF0\x3F\xFF\xFF\xFF\xE2\x39\xA7\xFF\xFF\xFF' + b'\xFF\xFF\xC7\xFF\xFF\xFF\xFF\x1F\xE7\xE3\xFF\xFF\xFF\xFF\xF0\x7F' + b'\x02\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\x9F\xFE\x7C\x07\xFF\xFF\xE0\x3B\xC1\xFF' + b'\xFF\xFF\xFF\xFF\x87\xFF\xFF\xFF\xFF\x9F\xE7\xE0\xFF\xFF\xFF\xFF' + b'\xF0\x7F\x08\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x60\x03\xFF\xFF\xC0\xF7' + b'\xE0\xFF\xFF\xFF\xFF\xFF\xC3\xFF\xFF\xFF\xFF\x9F\xCF\xF0\x3F\xFF' + b'\xFF\xE0\x24\x7F\xE0\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x93\xFF\xFF' + b'\xC8\x6F\xF0\x3F\xFF\xFF\xFF\xFF\x97\xFF\xFF\xFF\xFF\x9F\xCF\xF8' + b'\x1F\xFF\xEF\xF4\x80\x7F\xF0\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x12\x03' + b'\xFF\xFF\xC1\xDF\xFC\x06\xFF\xFF\xFF\xFF\xC3\xFF\xFF\xFF\xFF\x3F' + b'\x9F\xFC\x83\xFF\xE7\xFE\x01\x7F\xFC\xBF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8' + b'\x1C\x0F\xFF\xFF\xC1\xBF\xFE\x00\x3F\xFF\xFF\xFF\x83\xFF\xFF\xFF' + b'\xFF\x9F\x3F\xFE\x01\xFF\xE7\xFF\x88\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xE0\xFF\xFF\xFF\xFF\xE7\xFF\xFF\x48\x03\xFF\xFF\xFF\xC7\xFF' + b'\xFF\xFF\xFE\x1E\xFF\xFE\x08\x7F\xE7\xFF\xE0\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\x85\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x80\x7F\xFF\xFF' + b'\xC3\xFF\xFF\xFF\xFF\x1F\xFF\xFF\xA0\x7F\xC6\xFF\xF3\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\x57\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x05\xFF' + b'\xFF\xFF\xC7\xFF\xFF\xFF\xFF\x1F\xFF\xFF\xD0\x7F\xE0\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\x83\xFF\xFF\xFF\xFF\x1F\xFF\xFF\xFF\xFF\xC9\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xCB\xFF\xFF\xFF\xFF\x5F\xFF\xFF\xFF\xFF' + b'\xC1\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC7\xFF\xFF\xFF\xFF\x9F\xFF\xFF' + b'\xFF\xFF\xD3\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC7\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC7\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xF7\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xEF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xEF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' + b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF') diff --git a/tool/test_iamge_white_bg.png b/tool/test_iamge_white_bg.png new file mode 100644 index 0000000..d713798 Binary files /dev/null and b/tool/test_iamge_white_bg.png differ diff --git a/tool/test_iamge_white_bg2.png b/tool/test_iamge_white_bg2.png new file mode 100644 index 0000000..c519edb Binary files /dev/null and b/tool/test_iamge_white_bg2.png differ diff --git a/tool/verify_fix.py b/tool/verify_fix.py new file mode 100644 index 0000000..5a0fe73 --- /dev/null +++ b/tool/verify_fix.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +""" +验证修复后的图片数据 +""" + +# 导入旧的(有问题的)和新的(修复后的)图片数据 +from test_iamge import test_iamge as old_data +from test_iamge_fixed import test_iamge_fixed as new_data + +print("=== 验证图片数据修复 ===\n") + +# 检查数据长度 +print(f"旧数据长度: {len(old_data)} 字节") +print(f"新数据长度: {len(new_data)} 字节") +print(f"预期长度: {(400 * 300) // 8} 字节\n") + +# 检查旧数据中的换行符 +newline_count = old_data.count(0x0A) # 0x0A 是换行符 \n +print(f"旧数据中的换行符(0x0A)数量: {newline_count}") +print(f"新数据中的换行符(0x0A)数量: {new_data.count(0x0A)}\n") + +# 显示前几个字节 +print("旧数据前32字节:") +print(' '.join(f'{b:02X}' for b in old_data[:32])) +print("\n新数据前32字节:") +print(' '.join(f'{b:02X}' for b in new_data[:32])) + +# 检查数据类型 +print(f"\n旧数据类型: {type(old_data)}") +print(f"新数据类型: {type(new_data)}") + +print("\n=== 结论 ===") +if newline_count > 0: + print(f"❌ 旧数据包含 {newline_count} 个错误的换行符,会导致显示乱码") +else: + print("✓ 旧数据没有换行符问题") + +if new_data.count(0x0A) == 0 or new_data.count(0x0A) < newline_count: + print("✓ 新数据已修复,不包含错误的换行符") +else: + print("❌ 新数据仍有问题") + +if len(new_data) == 15000: + print("✓ 新数据长度正确 (400x300/8 = 15000 字节)") +else: + print(f"❌ 新数据长度不正确,应该是 15000 字节")