From efa626ed17fd611c0e9a9e151a0a6a6bda49494a Mon Sep 17 00:00:00 2001 From: xyou Date: Sun, 26 Jul 2026 21:07:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Phase=201=20=E7=BD=91=E7=BB=9C=E7=AB=AF?= =?UTF-8?q?=E5=88=B0=E7=AB=AF=E6=89=93=E9=80=9A=20+=20FirstInit/Login/DevM?= =?UTF-8?q?ode=20=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 用户态共享网络协议栈 CODE/tools/net_stack.h(eth/ARP/IPv4/ICMP/UDP-DNS/TCP static inline,轮询模型) - shell 内建 ping/curl/run 命令;ping.elf/curl.elf 对齐 net_stack.h 真实协议栈 - shell dev_mode 串口镜像(g_serial_mirror)便于自动化验证 - DSK 启动流程:firstInit.txt 双行格式(firstInit + dev_mode),dev_mode=1 触发 shell 自动回归测试 - FirstInit 完成→持久化 USER.CONF + 翻转 firstInit 0->1(保留 dev_mode) - firstInit=1 时 DSK 加载 login.elf 进行用户选择 + 密码校验后再进 desktop - 新增 CODE/login/ 登录应用、CODE/DKM/dkm_shared.h、Logo.png - ahci/e1000/virtio_net/fat32/console_fb 驱动更新;utsm serial/block/dsk_loader 调整 - build.ps1 打包 ping.elf/curl.elf 进 SATA FAT32 根目录 - 移除 CODE/tools/bash(与 shell.elf 重复) --- CLAUDE.md | 6 +- CODE/DKM/ahci/ahci.c | 248 ++-- CODE/DKM/ath9k/ath9k.c | 189 +-- CODE/DKM/console_fb/console_fb.c | 172 +-- CODE/DKM/dkm_shared.h | 331 +++++ CODE/DKM/e1000/e1000.c | 145 +-- CODE/DKM/fat32/fat32.c | 2 + CODE/DKM/virtio_net/virtio_net.c | 205 +--- CODE/UTSM/arch/x86_64/serial.c | 42 +- CODE/UTSM/arch/x86_64/serial.o | Bin 1752 -> 2400 bytes CODE/UTSM/core/process.o | Bin 1040 -> 3208 bytes CODE/UTSM/core/utsm_init.c | 3 + CODE/UTSM/core/utsm_init.o | Bin 2248 -> 2312 bytes CODE/UTSM/dkm/boot_modules.c | 7 +- CODE/UTSM/dkm/boot_modules.o | Bin 8992 -> 9104 bytes CODE/UTSM/drr/drr_stub.o | Bin 1616 -> 10536 bytes CODE/UTSM/include/utsm/block.h | 4 + CODE/UTSM/include/utsm/deshab_ui.h | 17 +- CODE/UTSM/kernel/block.c | 17 +- CODE/UTSM/kernel/block.o | Bin 3072 -> 3544 bytes CODE/UTSM/kernel/dsk_loader.c | 3 +- CODE/UTSM/kernel/dsk_loader.o | Bin 7112 -> 7112 bytes CODE/UTSM/kernel/main.o | Bin 3016 -> 3000 bytes CODE/UTSM/linker.ld | 3 + CODE/UTSM/test/utsm_selftest.c | 15 +- CODE/UTSM/test/utsm_selftest.o | Bin 2504 -> 2792 bytes CODE/desktop/linker.ld | 16 +- CODE/desktop/main.c | 218 +++- CODE/dsk/MAKEFILE | 5 +- CODE/dsk/linker.ld | 21 +- CODE/dsk/main.c | 667 +++++++--- CODE/dsk/main.o | Bin 13704 -> 19816 bytes CODE/firstInit/linker.ld | 16 +- CODE/firstInit/main.c | 702 ++++++++--- CODE/firstInit/main.o | Bin 144896 -> 167024 bytes CODE/firstInit/text_bitmaps.c | 180 +-- CODE/font/render_embedded.py | 4 +- CODE/{tools/bash => login}/MAKEFILE | 8 +- CODE/login/linker.ld | 24 + CODE/login/main.c | 565 +++++++++ CODE/mouse/linker.ld | 16 +- CODE/netman/linker.ld | 16 +- CODE/netman/main.c | 44 +- CODE/netman/main.o | Bin 24680 -> 25736 bytes CODE/shell/linker.ld | 16 +- CODE/shell/main.c | 1290 +++++++++++++++++++- CODE/shell/main.o | Bin 198200 -> 130256 bytes CODE/tools/bash/linker.ld | 16 - CODE/tools/bash/main.c | 456 ------- CODE/tools/browser/linker.ld | 16 +- CODE/tools/curl/linker.ld | 16 +- CODE/tools/curl/main.c | 133 +- CODE/tools/editor/linker.ld | 16 +- CODE/tools/fileman/linker.ld | 16 +- CODE/tools/net_stack.h | 716 +++++++++++ CODE/tools/ping/linker.ld | 16 +- CODE/tools/ping/main.c | 109 +- ISO/run_qemu.bat | 2 +- Logo.png | Bin 0 -> 34538 bytes SYSTEM/boot/utsm.elf | Bin 17867232 -> 55176 bytes SYSTEM/driver/block/ahci.drv | Bin 24912 -> 30080 bytes SYSTEM/driver/console/console_fb.drv | Bin 4560 -> 2112 bytes SYSTEM/driver/fs/fat32.drv | Bin 8544 -> 8544 bytes SYSTEM/driver/net/ath9k.drv | Bin 14512 -> 14760 bytes SYSTEM/driver/net/e1000.drv | Bin 11488 -> 9992 bytes SYSTEM/driver/net/virtio_net.drv | Bin 12384 -> 13416 bytes SYSTEM/{boot => limine}/limine.conf | 0 SYSTEM/system/deshab64/deshab.elf | Bin 743840 -> 1545792 bytes SYSTEM/system/deshab64/desktop.elf | Bin 69016 -> 73832 bytes SYSTEM/system/deshab64/mouse/mouseInit.elf | Bin 9688 -> 9688 bytes SYSTEM/system/deshab64/network/netman.elf | Bin 170344 -> 170400 bytes SYSTEM/system/deshab64/shell.elf | Bin 196632 -> 871648 bytes SYSTEM/system/deshab64/tools/bash.elf | Bin 117152 -> 0 bytes SYSTEM/system/deshab64/tools/browser.elf | Bin 41136 -> 41136 bytes SYSTEM/system/deshab64/tools/curl.elf | Bin 125152 -> 204912 bytes SYSTEM/system/deshab64/tools/editor.elf | Bin 104552 -> 104552 bytes SYSTEM/system/deshab64/tools/fileman.elf | Bin 47384 -> 47384 bytes SYSTEM/system/deshab64/tools/ping.elf | Bin 121056 -> 134408 bytes SYSTEM/system/user/deshab/user.conf | 21 +- SYSTEM/system/user/use/FirstInit.elf | Bin 146256 -> 160456 bytes SYSTEM/system/user/use/firstInit.txt | 1 + SYSTEM/system/user/use/login.elf | Bin 0 -> 41392 bytes build.ps1 | 27 +- 83 files changed, 4993 insertions(+), 1785 deletions(-) create mode 100644 CODE/DKM/dkm_shared.h rename CODE/{tools/bash => login}/MAKEFILE (69%) create mode 100644 CODE/login/linker.ld create mode 100644 CODE/login/main.c delete mode 100644 CODE/tools/bash/linker.ld delete mode 100644 CODE/tools/bash/main.c create mode 100644 CODE/tools/net_stack.h create mode 100644 Logo.png rename SYSTEM/{boot => limine}/limine.conf (100%) delete mode 100644 SYSTEM/system/deshab64/tools/bash.elf create mode 100644 SYSTEM/system/user/use/login.elf diff --git a/CLAUDE.md b/CLAUDE.md index d5aba54..121f67e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,13 +14,13 @@ CODE/dsk -> SYSTEM/system/deshab64/deshab.elf DSK 主内核(`deshab.elf`)当前已实现: - 内嵌 FAT32 只读解析器(256 扇区批量读取 + 内存内文件查找) - PIE ELF loader(PT_LOAD + PT_DYNAMIC + R_X86_64_RELATIVE 重定位) -- 旋转加载动画(双缓冲精灵、顺时针、comet-tail 渐变弧) +- 静态启动 Logo(嵌入 Logo.png RGBA 数据,居中 alpha 混合绘制于渐变背景上,取代原旋转加载动画) - 首次启动检测:读取 `firstInit.txt`,值为 `0` 则触发首次启动流程 - 系统初始化调度:DSK 直接加载并调用 `mouseInit.elf`(PS/2 鼠标安全初始化) - 用户设置向导:DSK 加载并跳转 `FirstInit.elf`(圆角卡片 UI、键盘输入、SHA256 密码、加密配置缓冲) FirstInit(`CODE/firstInit`)只负责用户级设置向导: -- 淡蓝背景 → 旋转环淡出 → "欢迎使用 Deshab" → 设置提示 → 账户设置卡片 +- 淡蓝背景 → "欢迎使用 Deshab"(中英双语,英文小字副标题)→ 设置提示 → 账户设置卡片 - PS/2 键盘轮询输入:计算机名、用户名、密码 - SHA256 密码摘要 + XOR 加密配置缓冲(user.conf 格式已定义,写盘待 FAT32 write API) - 18px 黑体中文位图(预渲染嵌入 ELF) @@ -126,7 +126,7 @@ DKM/DSM 驱动加载系统已完工:内置 `console_early` + manifest.json 解 - **apic** (stage0): CPUID Local APIC 探测, IA32_APIC_BASE MSR, ACPI MADT 枚举, LAPIC MMIO 只读寄存器验证;当前保留 PIC IRQ 路由 - **acpi** (stage0): Limine RSDP → XSDT, ACPI 表枚举 - **pci** (stage0): PCI config space 扫描, 设备枚举 -- **console_fb** (stage1): Limine framebuffer, 淡蓝色背景 + 居中四色圆弧加载环(纯整数运算,无浮点依赖) +- **console_fb** (stage1): Limine framebuffer, 淡蓝色背景清屏(原四色圆弧加载环已移除,启动画面改由 DSK 静态 Logo 接管) - **ahci** (stage1): PCI AHCI `8086:2922` 探测, BAR5/ABAR HHDM MMIO 映射, HBA CAP/GHC/PI/VS 与 port 枚举;已接入 `kernel_api.dma`,支持 SATA disk IDENTIFY 与 LBA0 READ 最小 DMA 路径;可向 `kernel_api.block` 注册 `ahci0` block provider;默认无 SATA 盘/ATAPI 场景会跳过命令 - **nvme** (stage1): PCI NVMe `1b36:0010` 探测, BAR0/BAR1 解析, IRQ line 读取;当前 QEMU BAR0 位于 4G 以上,MMIO register 读取等待高位 PCI MMIO 映射能力 - **bootfs** (stage1): Limine boot module 内存文件系统 diff --git a/CODE/DKM/ahci/ahci.c b/CODE/DKM/ahci/ahci.c index 9a056c7..404e4ef 100644 --- a/CODE/DKM/ahci/ahci.c +++ b/CODE/DKM/ahci/ahci.c @@ -4,100 +4,7 @@ * and ports so later block I/O can be added safely. */ -#include - -#define DKM_DRIVER_MAGIC 0x444B4D31u -#define DKM_ABI_VERSION 1u - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; -typedef long long i64; - -#define NULL ((void *)0) - -struct dkm_log_api { - void (*info)(const char *msg); - void (*warn)(const char *msg); - void (*error)(const char *msg); - void (*panic)(const char *msg); -}; - -struct dkm_dma_buffer { - void *virt; - u64 phys; - u64 size; -}; - -struct dkm_dma_api { - int (*alloc_pages)(u64 page_count, u64 alignment, u64 max_phys, struct dkm_dma_buffer *out); -}; - -struct dkm_block_device_desc { - const char *name; - u64 sector_size; - u64 sector_count; - void *ctx; - int (*read)(void *ctx, u64 lba, u32 count, void *buffer); -}; - -struct dkm_block_api { - int (*register_device)(const struct dkm_block_device_desc *desc); - u32 (*device_count)(void); - int (*read)(u32 index, u64 lba, u32 count, void *buffer); - u64 (*sector_size)(u32 index); - const char *(*device_name)(u32 index); -}; - -struct dkm_kernel_api { - u32 version; - u32 size; - u64 feature_bits; - const struct dkm_log_api *log; - const void *mem; - const void *utsm; - const void *irq; - const void *pci; - const struct dkm_dma_api *dma; - const void *vfs; - const void *net; - const void *timer; - const void *drr; - const void *rsdp_address; - const void *fb_address; - u64 fb_width; - u64 fb_height; - u64 fb_pitch; - u16 fb_bpp; - const void *boot_modules_response; - int (*irq_register)(u8 irq, void *handler); - u64 hhdm_offset; - const struct dkm_block_api *block; -}; - -struct dkm_driver_handle; - -struct dkm_driver_desc { - u32 magic; - u16 abi_version; - u16 desc_size; - const char *name; - const char *version; - const char *vendor; - u32 driver_class; - u32 stage; - u32 flags; - u32 priority; - const char *const *depends; - u32 depends_count; - const char *const *provides; - u32 provides_count; - u64 min_kernel_abi; - u64 feature_bits; - u64 reserved0; - u64 reserved1; -}; +#include "../dkm_shared.h" static const char *const g_depends[] = { "pci", "irq" }; static const char *const g_provides[] = { "block" }; @@ -124,21 +31,6 @@ const struct dkm_driver_desc driver_desc = { .reserved1 = 0 }; -#define PCI_ADDR 0xCF8 -#define PCI_DATA 0xCFC -#define PCI_VENDOR_ID 0x00 -#define PCI_COMMAND 0x04 -#define PCI_PROG_IF 0x09 -#define PCI_SUBCLASS 0x0A -#define PCI_CLASS 0x0B -#define PCI_HEADER 0x0E -#define PCI_BAR5 0x24 -#define PCI_IRQ_LINE 0x3C - -#define PCI_CMD_IO (1u << 0) -#define PCI_CMD_MEM (1u << 1) -#define PCI_CMD_BUSM (1u << 2) - #define AHCI_CLASS_STORAGE 0x01 #define AHCI_SUBCLASS_SATA 0x06 #define AHCI_PROGIF_AHCI 0x01 @@ -170,12 +62,15 @@ const struct dkm_driver_desc driver_desc = { #define AHCI_CMD_ST (1u << 0) #define AHCI_CMD_FRE (1u << 4) +#define AHCI_CMD_W (1u << 6) #define AHCI_CMD_FR (1u << 14) #define AHCI_CMD_CR (1u << 15) #define AHCI_CMD_ICC_ACTIVE (1u << 28) #define ATA_CMD_IDENTIFY 0xEC #define ATA_CMD_IDENTIFY_PACKET 0xA1 +#define ATA_CMD_READ_DMA_EXT 0x25 +#define ATA_CMD_WRITE_DMA_EXT 0x35 typedef struct __attribute__((packed)) ahci_cmd_header { u16 flags; @@ -207,34 +102,12 @@ static ahci_cmd_header *g_cmd_header; static struct dkm_dma_buffer g_cmd_table; static struct dkm_dma_buffer g_data; -static __inline__ void outl(u16 port, u32 value) { - __asm__ volatile ("outl %0, %1" :: "a"(value), "Nd"(port)); -} - -static __inline__ u32 inl(u16 port) { - u32 value; - __asm__ volatile ("inl %1, %0" : "=a"(value) : "Nd"(port)); - return value; -} - static u32 pci_read(u8 bus, u8 dev, u8 func, u8 reg) { - u32 addr = (1u << 31) - | ((u32)bus << 16) - | ((u32)dev << 11) - | ((u32)func << 8) - | ((u32)reg & 0xFC); - outl(PCI_ADDR, addr); - return inl(PCI_DATA); + return dkm_pci_read(bus, dev, func, reg); } static void pci_write(u8 bus, u8 dev, u8 func, u8 reg, u32 value) { - u32 addr = (1u << 31) - | ((u32)bus << 16) - | ((u32)dev << 11) - | ((u32)func << 8) - | ((u32)reg & 0xFC); - outl(PCI_ADDR, addr); - outl(PCI_DATA, value); + dkm_pci_write(bus, dev, func, reg, value); } static void log_hex(const char *prefix, u64 value) { @@ -333,15 +206,21 @@ static int ahci_stop_port(u32 port) { u32 cmd = g_abar[(base + PxCMD) / 4]; cmd &= ~AHCI_CMD_ST; g_abar[(base + PxCMD) / 4] = cmd; - for (u32 i = 0; i < 100000; i++) { + /* 实机: 500ms TSC 超时等待 CR 清除 */ + u64 deadline = dkm_rdtsc() + dkm_tsc_per_ms * 500; + while (dkm_rdtsc() < deadline) { cmd = g_abar[(base + PxCMD) / 4]; if (!(cmd & AHCI_CMD_CR)) break; + __asm__ volatile("pause"); } cmd &= ~AHCI_CMD_FRE; g_abar[(base + PxCMD) / 4] = cmd; - for (u32 i = 0; i < 100000; i++) { + /* 实机: 500ms TSC 超时等待 FR 清除 */ + deadline = dkm_rdtsc() + dkm_tsc_per_ms * 500; + while (dkm_rdtsc() < deadline) { cmd = g_abar[(base + PxCMD) / 4]; if (!(cmd & AHCI_CMD_FR)) return 0; + __asm__ volatile("pause"); } return -1; } @@ -368,7 +247,23 @@ static void ahci_fill_read_fis(u8 *fis, u64 lba, u32 count) { ahci_zero(fis, 64); fis[0] = 0x27; fis[1] = 1u << 7; - fis[2] = 0x25; /* READ DMA EXT */ + fis[2] = ATA_CMD_READ_DMA_EXT; + fis[4] = (u8)(lba & 0xff); + fis[5] = (u8)((lba >> 8) & 0xff); + fis[6] = (u8)((lba >> 16) & 0xff); + fis[7] = (1u << 6) | (u8)((lba >> 24) & 0x0f); + fis[8] = (u8)((lba >> 24) & 0xff); + fis[9] = (u8)((lba >> 32) & 0xff); + fis[10] = (u8)((lba >> 40) & 0xff); + fis[12] = (u8)(count & 0xff); + fis[13] = (u8)((count >> 8) & 0xff); +} + +static void ahci_fill_write_fis(u8 *fis, u64 lba, u32 count) { + ahci_zero(fis, 64); + fis[0] = 0x27; + fis[1] = 1u << 7; + fis[2] = ATA_CMD_WRITE_DMA_EXT; fis[4] = (u8)(lba & 0xff); fis[5] = (u8)((lba >> 8) & 0xff); fis[6] = (u8)((lba >> 16) & 0xff); @@ -420,7 +315,81 @@ static int ahci_read_blocks_internal(u32 port, ahci_cmd_header *hdr, struct dkm_ return -3; } +static int ahci_write_blocks_internal(u32 port, ahci_cmd_header *hdr, struct dkm_dma_buffer *table, struct dkm_dma_buffer *data, u64 lba, u32 count, const void *buffer) { + if (!buffer || count == 0) return -1; + if (count > 8) return -2; + u32 base = HBA_PORT_BASE + port * HBA_PORT_SIZE; + ahci_cmd_table *tbl = (ahci_cmd_table *)table->virt; + u32 bytes = count * 512; + ahci_zero(tbl, sizeof(ahci_cmd_table)); + + /* copy data from user buffer into DMA buffer */ + { + u8 *dst = (u8 *)data->virt; + const u8 *src = (const u8 *)buffer; + for (u32 j = 0; j < bytes; j++) dst[j] = src[j]; + } + + hdr[0].flags = 5 | (1u << 6); /* CFL=5, W=1 (write) */ + hdr[0].prdtl = 1; + hdr[0].prdbc = 0; + hdr[0].ctba = (u32)(table->phys & 0xffffffffu); + hdr[0].ctbau = (u32)(table->phys >> 32); + + tbl->prdt[0].dba = (u32)(data->phys & 0xffffffffu); + tbl->prdt[0].dbau = (u32)(data->phys >> 32); + tbl->prdt[0].dbc_i = (bytes - 1) | (1u << 31); + ahci_fill_write_fis(tbl->cfis, lba, count); + + /* set PxCMD.W to indicate write direction */ + u32 cmd = g_abar[(base + PxCMD) / 4]; + cmd |= AHCI_CMD_W; + g_abar[(base + PxCMD) / 4] = cmd; + + g_abar[(base + PxIS) / 4] = 0xffffffffu; + g_abar[HBA_IS / 4] = (1u << port); + g_abar[(base + PxCI) / 4] = 1; + for (u32 i = 0; i < 5000000; i++) { + if ((g_abar[(base + PxCI) / 4] & 1u) == 0) { + /* clear PxCMD.W after write completes */ + cmd = g_abar[(base + PxCMD) / 4]; + cmd &= ~AHCI_CMD_W; + g_abar[(base + PxCMD) / 4] = cmd; + return 0; + } + } + + /* timeout: clear PxCMD.W */ + cmd = g_abar[(base + PxCMD) / 4]; + cmd &= ~AHCI_CMD_W; + g_abar[(base + PxCMD) / 4] = cmd; + + g_log->warn("[ahci] WRITE timeout"); + log_hex("[ahci] WRITE lba=", lba); + log_hex("[ahci] WRITE count=", count); + log_hex("[ahci] WRITE CI=", g_abar[(base + PxCI) / 4]); + log_hex("[ahci] WRITE IS=", g_abar[(base + PxIS) / 4]); + log_hex("[ahci] WRITE TFD=", g_abar[(base + PxTFD) / 4]); + return -3; +} + static int ahci_block_read(void *ctx, u64 lba, u32 count, void *buffer) { + (void)ctx; + if (g_ready_port == 0xffffffffu || !g_cmd_header) return -1; + log_hex("[ahci] block_read lba=", lba); + log_hex("[ahci] block_read count=", count); + while (count > 0) { + u32 chunk = count > 8 ? 8 : count; + int status = ahci_read_blocks_internal(g_ready_port, g_cmd_header, &g_cmd_table, &g_data, lba, chunk, buffer); + if (status != 0) return status; + lba += chunk; + count -= chunk; + buffer = (void *)((u8 *)buffer + (chunk * 512)); + } + return 0; +} + +static int ahci_block_write(void *ctx, u64 lba, u32 count, const void *buffer) { (void)ctx; if (g_ready_port == 0xffffffffu || !g_cmd_header) return -1; /* ensure port is in ST+FRE state */ @@ -433,11 +402,11 @@ static int ahci_block_read(void *ctx, u64 lba, u32 count, void *buffer) { } while (count > 0) { u32 chunk = count > 8 ? 8 : count; - int status = ahci_read_blocks_internal(g_ready_port, g_cmd_header, &g_cmd_table, &g_data, lba, chunk, buffer); + int status = ahci_write_blocks_internal(g_ready_port, g_cmd_header, &g_cmd_table, &g_data, lba, chunk, buffer); if (status != 0) return status; lba += chunk; count -= chunk; - buffer = (void *)((u8 *)buffer + (chunk * 512)); + buffer = (const void *)((const u8 *)buffer + (chunk * 512)); } return 0; } @@ -536,6 +505,8 @@ __attribute__((visibility("default"))) int driver_init(const struct dkm_kernel_api *api, struct dkm_driver_handle *handle) { (void)handle; + /* 实机要求: 先校准 TSC, 再使用基于 CPU 频率的延迟 */ + dkm_tsc_calibrate(); if (!api || !api->log) return -1; g_log = api->log; @@ -628,6 +599,7 @@ int driver_init(const struct dkm_kernel_api *api, desc.sector_count = 0; desc.ctx = 0; desc.read = ahci_block_read; + desc.write = ahci_block_write; int index = api->block->register_device(&desc); log_hex("[ahci] block provider index=", (u64)(i64)index); } else if (identified) { diff --git a/CODE/DKM/ath9k/ath9k.c b/CODE/DKM/ath9k/ath9k.c index 05fd8e2..561e771 100644 --- a/CODE/DKM/ath9k/ath9k.c +++ b/CODE/DKM/ath9k/ath9k.c @@ -17,105 +17,7 @@ * 部分高级特性(ANI/MRR/AGC 调优)留待硬件验证后增量完善。 */ -#include - -#define DKM_DRIVER_MAGIC 0x444B4D31u -#define DKM_ABI_VERSION 1u - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; -typedef long long i64; -typedef signed char i8; -#define NULL ((void *)0) - -/* ---- DKM ABI ---- */ -struct dkm_log_api { - void (*info)(const char *msg); - void (*warn)(const char *msg); - void (*error)(const char *msg); - void (*panic)(const char *msg); -}; - -struct dkm_net_scan_result { - char ssid[33]; - u8 bssid[6]; - u8 channel; - i8 rssi; - u8 security; -}; - -struct dkm_net_device_desc { - const char *name; - u8 mac[6]; - u32 flags; - void *ctx; - int (*tx)(void *ctx, const void *packet, u32 length); - int (*rx_poll)(void *ctx, void *buffer, u32 capacity, u32 *out_length); - int (*scan_start)(void *ctx); - int (*scan_count)(void *ctx); - int (*scan_result)(void *ctx, u32 n, struct dkm_net_scan_result *out); - int (*is_wireless)(void *ctx); -}; - -struct dkm_net_api { - int (*register_device)(const struct dkm_net_device_desc *desc); - u32 (*device_count)(void); - int (*device_info)(u32 index, void *out); - int (*tx)(u32 index, const void *packet, u32 length); - int (*rx_poll)(u32 index, void *buffer, u32 capacity, u32 *out_length); - int (*scan_start)(u32 index); - int (*scan_count)(u32 index); - int (*scan_result)(u32 index, u32 n, struct dkm_net_scan_result *out); - int (*is_wireless)(u32 index); -}; - -struct dkm_dma_buffer { - void *virt; - u64 phys; - u64 size; -}; - -struct dkm_dma_api { - int (*alloc_pages)(u64 page_count, u64 alignment, u64 max_phys, struct dkm_dma_buffer *out); -}; - -#define DKM_NET_F_LINK_UP (1u << 0) -#define DKM_NET_F_TX_READY (1u << 1) -#define DKM_NET_F_RX_READY (1u << 2) -#define DKM_NET_F_WIRELESS (1u << 3) - -#define DKM_NET_SEC_OPEN 0u -#define DKM_NET_SEC_WEP 1u -#define DKM_NET_SEC_WPA 2u -#define DKM_NET_SEC_WPA2 3u -#define DKM_NET_SEC_WPA3 4u - -struct dkm_kernel_api { - u32 version; u32 size; u64 feature_bits; - const struct dkm_log_api *log; - const void *mem,*utsm,*irq_api,*pci_api; - const struct dkm_dma_api *dma; - const void *vfs_api; - const struct dkm_net_api *net; - const void *timer,*drr; - const void *rsdp_address,*fb_address; - u64 fb_width,fb_height,fb_pitch; u16 fb_bpp; - const void *boot_modules_response; - int (*irq_register)(u8 irq, void *handler); - u64 hhdm_offset; -}; - -struct dkm_driver_handle; -struct dkm_driver_desc { - u32 magic; u16 abi_version; u16 desc_size; - const char *name,*version,*vendor; - u32 driver_class,stage,flags,priority; - const char *const *depends; u32 depends_count; - const char *const *provides; u32 provides_count; - u64 min_kernel_abi,feature_bits,reserved0,reserved1; -}; +#include "../dkm_shared.h" static const char *const g_depends[] = {"pci","irq"}; static const char *const g_provides[] = {"netdev"}; @@ -129,19 +31,6 @@ const struct dkm_driver_desc driver_desc = { .provides=g_provides,.provides_count=1,.min_kernel_abi=1, }; -/* ---- PCI config ---- */ -#define PCI_ADDR 0xCF8 -#define PCI_DATA 0xCFC -#define PCI_VENDOR_ID 0x00 -#define PCI_COMMAND 0x04 -#define PCI_BAR0 0x10 -#define PCI_BAR1 0x14 -#define PCI_IRQ_LINE 0x3C - -#define PCI_CMD_IO (1u << 0) -#define PCI_CMD_MEM (1u << 1) -#define PCI_CMD_BUSMST (1u << 2) - /* ---- ath9k 寄存器(AR9280/9285/9287 PCIe MAC,Linux ath9k reg.h 关键子集) ---- */ #define AR_RC 0x4000u #define AR_RC_MAC 0x00000001u @@ -285,20 +174,20 @@ static u32 g_scan_count; static int g_scanning; /* ---- 串口日志(参考 e1000 raw_log) ---- */ -static __inline__ void outb(u16 p, u8 v) { __asm__ volatile("outb %0,%1"::"a"(v),"Nd"(p):"memory"); } -static __inline__ u8 inb(u16 p) { u8 v; __asm__ volatile("inb %1,%0":"=a"(v):"Nd"(p):"memory"); return v; } -static __inline__ void outl(u16 p, u32 v) { __asm__ volatile("outl %0,%1"::"a"(v),"Nd"(p):"memory"); } -static __inline__ u32 inl(u16 p) { u32 v; __asm__ volatile("inl %1,%0":"=a"(v):"Nd"(p):"memory"); return v; } +#define COM1 0x3F8 + +/* 串口发送等待 thin wrapper — 调用 dkm 共享实现 */ +static void serial_wait_tx(void) { dkm_serial_wait_tx(COM1); } static void raw_log(const char *s) { while (*s) { char c = *s++; if (c == '\n') { - for (u32 i=0;i<100000;i++) if (inb(0x3F8+5)&0x20) break; - outb(0x3F8, '\r'); + serial_wait_tx(); + dkm_outb(COM1, '\r'); } - for (u32 i=0;i<100000;i++) if (inb(0x3F8+5)&0x20) break; - outb(0x3F8, (u8)c); + serial_wait_tx(); + dkm_outb(COM1, (u8)c); } } @@ -307,26 +196,19 @@ static void raw_hex(const char *prefix, u64 v) { raw_log(prefix); raw_log("0x"); for (int i=15; i>=0; i--) { - for (u32 wait=0; wait<100000; wait++) if (inb(0x3F8+5)&0x20) break; - outb(0x3F8, (u8)h[(v >> (i * 4)) & 0xf]); + serial_wait_tx(); + dkm_outb(COM1, (u8)h[(v >> (i * 4)) & 0xf]); } raw_log("\n"); } -static void delay_us(u32 us) { - /* 粗略延时:每个 iteration ~1us on QEMU x86 */ - for (u32 i = 0; i < us * 10; i++) __asm__ volatile("pause"); -} - /* ---- PCI 配置空间 ---- */ static u32 pci_read(u8 bus, u8 dev, u8 func, u8 reg) { - u32 a = (1u<<31)|((u32)bus<<16)|((u32)dev<<11)|((u32)func<<8)|((u32)reg&0xFC); - outl(PCI_ADDR,a); return inl(PCI_DATA); + return dkm_pci_read(bus, dev, func, reg); } static void pci_write(u8 bus, u8 dev, u8 func, u8 reg, u32 v) { - u32 a = (1u<<31)|((u32)bus<<16)|((u32)dev<<11)|((u32)func<<8)|((u32)reg&0xFC); - outl(PCI_ADDR,a); outl(PCI_DATA,v); + dkm_pci_write(bus, dev, func, reg, v); } /* ath9k PCI 设备 ID 表(vendor 0x168c Atheros) */ @@ -403,11 +285,12 @@ static u16 ath9k_eeprom_read(u16 addr) { /* AR5416_EEPROM_CMD: bit0=READ, bit1=BUSY, bit2=RESET */ /* 启动 read:写 cmd=READ | addr<<3 */ ath9k_reg_write(AR_EEPROM_CMD, AR_EEPROM_CMD_RESET); - delay_us(5); + dkm_delay_us(5); u32 cmd = AR_EEPROM_CMD_READ | ((u32)(addr & 0x3FF) << 3); ath9k_reg_write(AR_EEPROM_CMD, cmd); - /* 等待 RDBUSY 清除 */ - for (u32 i = 0; i < 100000; i++) { + /* 等待 RDBUSY 清除 (实机: 100ms TSC 超时) */ + u64 deadline = dkm_rdtsc() + dkm_tsc_per_ms * 100; + while (dkm_rdtsc() < deadline) { u32 sts = ath9k_reg_read(AR_EEPROM_STS); if (!(sts & AR_EEPROM_STS_RDBUSY)) { if (sts & AR_EEPROM_STS_VALID) { @@ -415,7 +298,7 @@ static u16 ath9k_eeprom_read(u16 addr) { } return 0xffff; } - delay_us(1); + dkm_delay_us(1); } return 0xffff; } @@ -425,27 +308,29 @@ static int ath9k_reset(void) { raw_log("[ath9k.raw] reset sequence\n"); /* 1. 强制唤醒(Power-On) */ ath9k_reg_write(AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_ON | AR_RTC_FORCE_WAKE_INT); - delay_us(50); - /* 2. 等待 RTC 进入 ON 状态 */ - for (u32 i = 0; i < 100000; i++) { + dkm_delay_us(50); + /* 2. 等待 RTC 进入 ON 状态 (实机: 100ms TSC 超时) */ + u64 deadline = dkm_rdtsc() + dkm_tsc_per_ms * 100; + while (dkm_rdtsc() < deadline) { u32 s = ath9k_reg_read(AR_RTC_STATUS); if ((s & 0x3) == AR_RTC_STATUS_ON) break; - delay_us(1); + dkm_delay_us(1); } /* 3. 全 chip 复位 */ ath9k_reg_write(AR_RC, AR_RC_MAC | AR_RC_BB | AR_RC_RPCU); - delay_us(100); + dkm_delay_us(100); ath9k_reg_write(AR_RC, 0); - delay_us(100); + dkm_delay_us(100); /* 4. 重新唤醒 */ ath9k_reg_write(AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_ON | AR_RTC_FORCE_WAKE_INT); - delay_us(50); - /* 5. 等待 RTC ON */ + dkm_delay_us(50); + /* 5. 等待 RTC ON (实机: 100ms TSC 超时) */ u32 ok = 0; - for (u32 i = 0; i < 100000; i++) { + u64 deadline2 = dkm_rdtsc() + dkm_tsc_per_ms * 100; + while (dkm_rdtsc() < deadline2) { u32 s = ath9k_reg_read(AR_RTC_STATUS); if ((s & 0x3) == AR_RTC_STATUS_ON) { ok = 1; break; } - delay_us(1); + dkm_delay_us(1); } if (!ok) { raw_log("[ath9k.raw] reset: RTC not ON\n"); return -1; } raw_log("[ath9k.raw] reset: RTC ON\n"); @@ -461,7 +346,7 @@ static int ath9k_hw_init(void) { raw_log("[ath9k.raw] hw_init minimal\n"); /* 关闭 RX/DMA,清 STA_ID1 */ ath9k_reg_write(AR_CR, AR_CR_RXD); - delay_us(10); + dkm_delay_us(10); ath9k_reg_write(AR_STA_ID1, 0); /* 清中断 */ ath9k_reg_write(AR_ISR, 0xFFFFFFFFu); @@ -650,13 +535,13 @@ static void ath9k_set_channel(u8 channel) { /* TODO: 完整 ath9k 信道切换序列(参考 ar9002_hw_set_channel) */ /* 触发 RFBUS 请求,等待 grant */ ath9k_reg_write(AR_PHY_RFBUS_REQ, 0x1); - delay_us(5); + dkm_delay_us(5); for (u32 i = 0; i < 1000; i++) { if (ath9k_reg_read(AR_PHY_RFBUS_REQ) & 0x2) break; - delay_us(1); + dkm_delay_us(1); } ath9k_reg_write(AR_PHY_RFBUS_REQ, 0); - delay_us(50); + dkm_delay_us(50); } /* ---- 被动扫描状态机 ---- @@ -684,7 +569,7 @@ static int ath9k_scan_start_impl(void *ctx) { /* 在该信道停留 ~400ms,期间轮询 RX 环 */ for (u32 tick = 0; tick < 400; tick++) { ath9k_rx_drain(); - delay_us(1000); + dkm_delay_us(1000); } } g_scanning = 0; @@ -752,6 +637,8 @@ __attribute__((visibility("default"))) int driver_init(const struct dkm_kernel_api *api, struct dkm_driver_handle *handle) { (void)handle; + /* 实机要求: 先校准 TSC, 再使用基于 CPU 频率的延迟 */ + dkm_tsc_calibrate(); raw_log("[ath9k.raw] driver_init entered\n"); if (!api || !api->log) return -1; g_log = api->log; @@ -766,7 +653,7 @@ int driver_init(const struct dkm_kernel_api *api, /* 2. 启用 PCI 命令(MEM + Bus Master) */ u32 cmd = pci_read(bus, dev, 0, PCI_COMMAND); - pci_write(bus, dev, 0, PCI_COMMAND, cmd | PCI_CMD_MEM | PCI_CMD_BUSMST); + pci_write(bus, dev, 0, PCI_COMMAND, cmd | PCI_CMD_MEM | PCI_CMD_BUSM); /* 3. 读取 BAR0 */ u32 bar0 = pci_read(bus, dev, 0, PCI_BAR0); diff --git a/CODE/DKM/console_fb/console_fb.c b/CODE/DKM/console_fb/console_fb.c index 2cdfc87..4718144 100644 --- a/CODE/DKM/console_fb/console_fb.c +++ b/CODE/DKM/console_fb/console_fb.c @@ -1,6 +1,8 @@ /* DKM Console Framebuffer Driver * Stage 1, optional, provides "console". - * Light-blue background + centered circular loading animation (4-color arc ring). + * Clears the framebuffer to a solid light-blue background so the screen is + * clean before DSK takes over and draws the Logo. The former 4-color arc + * loading ring has been removed — DSK now shows a static Logo instead. */ #include @@ -51,7 +53,7 @@ __attribute__((visibility("default"), used)) const struct dkm_driver_desc driver_desc = { .magic=DKM_DRIVER_MAGIC, .abi_version=DKM_ABI_VERSION, .desc_size=sizeof(struct dkm_driver_desc), - .name="console_fb", .version="0.2.0", .vendor="Deshab", + .name="console_fb", .version="0.3.0", .vendor="Deshab", .driver_class=5, .stage=1, .flags=0, .priority=0, .depends=NULL, .depends_count=0, .provides=g_provides, .provides_count=1, @@ -61,18 +63,11 @@ const struct dkm_driver_desc driver_desc = { /* --------------------------------------------------------------- * Colors * --------------------------------------------------------------- */ -static const u32 BG = 0xFFC8E0F0; /* light blue background */ -static const u32 ARC[4] = { 0xFF4488CC, 0xFF2266AA, 0xFF66AAEE, 0xFF88CCFF }; +static const u32 BG = 0xFFC8E0F0; /* light blue background — cleared before DSK Logo */ /* --------------------------------------------------------------- * Drawing helpers – all integer arithmetic, no soft-float * --------------------------------------------------------------- */ -static u64 fb_w, fb_h, fb_p; - -/* double-buffer sprite for ring area (128×128 = no flicker) */ -#define SPR_SIZE 128 -static u32 g_sprite[SPR_SIZE * SPR_SIZE]; - static void fb_fill(u32 *fb, u64 pitch, u64 w, u64 h, u32 color) { for (u64 y = 0; y < h; y++) { u32 *line = (u32 *)((u8 *)fb + y * pitch); @@ -80,105 +75,6 @@ static void fb_fill(u32 *fb, u64 pitch, u64 w, u64 h, u32 color) { } } -/* alpha-blend c2 over c1, alpha 0-255 */ -static u32 blend(u32 c1, u32 c2, u32 a) { - u32 na = 256 - a; - u32 r = ((c1 & 0xFF) * na + (c2 & 0xFF) * a) >> 8; - u32 g = (((c1 >> 8) & 0xFF) * na + ((c2 >> 8) & 0xFF) * a) >> 8; - u32 b = (((c1 >> 16) & 0xFF) * na + ((c2 >> 16) & 0xFF) * a) >> 8; - return 0xFF000000 | (b << 16) | (g << 8) | r; -} - -/* integer sqrt – returns floor(sqrt(v)) */ -static u64 isqrt(u64 v) { - u64 x = v, y = (x + 1) >> 1; - while (y < x) { x = y; y = (y + v / y) >> 1; } - return x; -} - -/* approximate atan2 in degrees (0=right, CCW). dx,dy = pixel offset from center */ -static i64 approx_angle(i64 dx, i64 dy) { - if (dx == 0) return dy < 0 ? 90 : 270; - i64 ax = dx < 0 ? -dx : dx; - i64 ay = dy < 0 ? -dy : dy; - i64 a; - if (ax > ay) { - a = ay * 45 / ax; - } else { - a = 90 - ax * 45 / (ay ? ay : 1); - } - /* quadrant correction */ - if (dx >= 0 && dy <= 0) return a; /* Q1 */ - else if (dx < 0 && dy <= 0) return 180 - a; /* Q2 */ - else if (dx < 0 && dy > 0) return 180 + a; /* Q3 */ - else return 360 - a; /* Q4 */ -} - -/* draw one arc segment: rounded caps (6° head/tail), bright mid, comet-tail fade */ -static void arc_segment(u32 *fb, i64 cx, i64 cy, i64 r, i64 start, i64 sweep, u32 color, i64 thk) { - i64 ro = r + thk, ri = r - thk; - i64 ri2 = ri * ri, ro2 = (ro + 1) * (ro + 1); - i64 rnd = 6; /* rounding zone at each end, in degrees */ - - for (i64 dy = -ro - 1; dy <= ro + 1; dy++) { - i64 y = cy + dy; - if ((u64)y >= fb_h) continue; - u32 *line = (u32 *)((u8 *)fb + (u64)y * fb_p); - for (i64 dx = -ro - 1; dx <= ro + 1; dx++) { - i64 x = cx + dx; - if ((u64)x >= fb_w) continue; - i64 d2 = dx * dx + dy * dy; - if (d2 < ri2 - 2 || d2 > ro2 + 2) continue; - - i64 ang = approx_angle(dx, dy); - i64 a = ang - start; - if (a < 0) a += 360; - if ((u64)a > (u64)sweep) continue; - - /* rounded-cap fade: 0→255 over rnd°, then 255→0 over last rnd° */ - u32 fade; - if ((u64)a < (u64)rnd) { - fade = (u32)(a * 255 / rnd); - } else if ((u64)a > (u64)(sweep - rnd)) { - fade = (u32)((sweep - a) * 255 / rnd); - } else { - fade = 255; - } - - i64 dist = (i64)isqrt((u64)d2); - u32 effective = blend(BG, color, fade); - if (dist >= ri && dist <= ro) { - line[(u64)x] = effective; - } else if (dist >= ri - 2 && dist < ri) { - line[(u64)x] = blend(BG, effective, (u32)((dist - (ri - 2)) * 85)); - } else if (dist > ro && dist <= ro + 2) { - line[(u64)x] = blend(effective, BG, (u32)((dist - ro) * 85)); - } - } - } -} - -/* filled disc with anti-aliased edge */ -static void fill_disc(u32 *fb, i64 cx, i64 cy, i64 r, u32 color) { - i64 r2 = r * r, o2 = (r + 1) * (r + 1); - for (i64 dy = -r - 2; dy <= r + 2; dy++) { - i64 y = cy + dy; - if ((u64)y >= fb_h) continue; - u32 *line = (u32 *)((u8 *)fb + (u64)y * fb_p); - for (i64 dx = -r - 2; dx <= r + 2; dx++) { - i64 x = cx + dx; - if ((u64)x >= fb_w) continue; - i64 d2 = dx * dx + dy * dy; - if (d2 <= r2) { - line[(u64)x] = color; - } else if (d2 <= o2) { - u32 a = (u32)((o2 - d2) * 255 / (o2 - r2)); - line[(u64)x] = blend(BG, color, a); - } - } - } -} - /* --------------------------------------------------------------- * Driver entry * --------------------------------------------------------------- */ @@ -192,61 +88,13 @@ int driver_init(const struct dkm_kernel_api *api, return 0; } - api->log->info("[console_fb] boot screen"); + api->log->info("[console_fb] clearing boot screen"); - fb_w = api->fb_width; fb_h = api->fb_height; fb_p = api->fb_pitch; + /* Solid background fill only — DSK draws the Logo next. Clearing here + * avoids firmware/UEFI leftover garbage being visible during the + * UTSM→DSK handoff. */ u32 *fb = (u32 *)api->fb_address; - i64 cx = (i64)fb_w / 2, cy = (i64)fb_h / 2, r = 48, thk = 4; - - /* light-blue background */ - fb_fill(fb, fb_p, fb_w, fb_h, BG); - - /* animation: 2000 frames × 2° clockwise × ~1ms, no flicker */ - i64 spr_p = SPR_SIZE * 4; - i64 scx = SPR_SIZE / 2; - i64 scy = SPR_SIZE / 2; - i64 frame = 0, base = 0; - i64 bx = cx - scx; /* screen position of sprite top-left */ - i64 by = cy - scy; - - while (frame < 2000) { - /* draw into sprite buffer — swap globals to sprite layout */ - u64 save_w = fb_w, save_h = fb_h, save_p = fb_p; - fb_w = SPR_SIZE; fb_h = SPR_SIZE; fb_p = spr_p; - - fb_fill(g_sprite, spr_p, SPR_SIZE, SPR_SIZE, BG); - - arc_segment(g_sprite, scx, scy, r, base + 0, 82, ARC[0], thk); - arc_segment(g_sprite, scx, scy, r, base + 90, 82, ARC[1], thk); - arc_segment(g_sprite, scx, scy, r, base +180, 82, ARC[2], thk); - arc_segment(g_sprite, scx, scy, r, base +270, 82, ARC[3], thk); - - fill_disc(g_sprite, scx, scy, r - 8, blend(BG, 0xFFD0F0FF, 80)); - - /* restore screen globals for blit */ - fb_w = save_w; fb_h = save_h; fb_p = save_p; - - /* blit sprite to screen */ - for (i64 sr = 0; sr < SPR_SIZE; sr++) { - i64 sy = by + sr; - if ((u64)sy >= fb_h) continue; - u32 *dst = (u32 *)((u8 *)fb + (u64)sy * fb_p) + bx; - u32 *src = &g_sprite[sr * SPR_SIZE]; - for (i64 sc = 0; sc < SPR_SIZE; sc++) { - i64 sx = bx + sc; - if ((u64)sx >= fb_w) continue; - dst[sc] = src[sc]; - } - } - - for (volatile u32 d = 0; d < 72000; d++) { - __asm__ volatile ("pause"); - } - - base -= 2; - if (base < 0) base += 360; - frame++; - } + fb_fill(fb, api->fb_pitch, api->fb_width, api->fb_height, BG); api->log->info("[console_fb] ready"); return 0; diff --git a/CODE/DKM/dkm_shared.h b/CODE/DKM/dkm_shared.h new file mode 100644 index 0000000..0c01224 --- /dev/null +++ b/CODE/DKM/dkm_shared.h @@ -0,0 +1,331 @@ +/* DKM 共享头文件 — 消除各驱动重复的结构体/宏/PCI/TSC 代码 + * + * 设计要点: + * - 结构体定义与 UTSM/include/utsm/dkm.h 保持布局一致 (canonical) + * - PCI I/O 函数使用 static __inline__, 每个 .drv 文件获得独立副本, 避免链接冲突 + * - TSC 校准函数使用 static __inline__, 每个 .drv 文件获得自己的 dkm_tsc_per_ms + * - 驱动源文件只需 #include "../dkm_shared.h", 保留各自的 driver_desc 和 driver_init + * + * 使用约定: + * 1. 在 driver_init 开头调用 dkm_tsc_calibrate() 完成校准 + * 2. 时序等待使用 dkm_delay_ms() / dkm_delay_us() + * 3. 串口发送等待使用 dkm_serial_wait_tx(COM1) + * 4. MMIO 寄存器读取等待使用 dkm_rdtsc() + dkm_tsc_per_ms 直接计算 deadline + */ +#ifndef DKM_SHARED_H +#define DKM_SHARED_H + +#include + +/* ---- 基本类型 (与 UTSM/types.h 一致) ---- */ +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned long long u64; +typedef signed char i8; +typedef short i16; +typedef int i32; +typedef long long i64; + +#ifndef NULL +#define NULL ((void *)0) +#endif + +/* ---- DKM magic / ABI 版本 ---- */ +#define DKM_DRIVER_MAGIC 0x444B4D31u +#define DKM_ABI_VERSION 1u + +/* ---- DKM 驱动类别 (driver_desc.driver_class) ---- */ +#define DKM_CLASS_PLATFORM 1u +#define DKM_CLASS_BUS 2u +#define DKM_CLASS_INTERRUPT 3u +#define DKM_CLASS_TIMER 4u +#define DKM_CLASS_CONSOLE 5u +#define DKM_CLASS_STORAGE 6u +#define DKM_CLASS_FS 7u +#define DKM_CLASS_NET 8u +#define DKM_CLASS_INPUT 9u +#define DKM_CLASS_GPU 10u +#define DKM_CLASS_MISC 11u + +/* ---- DKM 驱动标志 (driver_desc.flags) ---- */ +#define DKM_F_REQUIRED (1u << 0) +#define DKM_F_BOOT_MODULE (1u << 1) +#define DKM_F_NO_UNLOAD (1u << 2) +#define DKM_F_STRONG_RECOVERY (1u << 3) +#define DKM_F_DMA_REQUIRED (1u << 4) +#define DKM_F_EARLY_LOG (1u << 5) + +/* ---- 网卡链路/能力标志 ---- */ +#define DKM_NET_F_LINK_UP (1u << 0) +#define DKM_NET_F_TX_READY (1u << 1) +#define DKM_NET_F_RX_READY (1u << 2) +#define DKM_NET_F_WIRELESS (1u << 3) + +/* ---- WiFi 扫描加密类型 ---- */ +#define DKM_NET_SEC_OPEN 0u +#define DKM_NET_SEC_WEP 1u +#define DKM_NET_SEC_WPA 2u +#define DKM_NET_SEC_WPA2 3u +#define DKM_NET_SEC_WPA3 4u + +/* ---- DKM 结构体定义 (与 UTSM/include/utsm/dkm.h 布局一致) ---- */ +struct dkm_log_api { + void (*info)(const char *msg); + void (*warn)(const char *msg); + void (*error)(const char *msg); + void (*panic)(const char *msg); +}; + +struct dkm_dma_buffer { + void *virt; + u64 phys; + u64 size; +}; + +struct dkm_dma_api { + int (*alloc_pages)(u64 page_count, u64 alignment, u64 max_phys, struct dkm_dma_buffer *out); +}; + +struct dkm_net_scan_result { + char ssid[33]; + u8 bssid[6]; + u8 channel; + i8 rssi; + u8 security; +}; + +struct dkm_net_device_desc { + const char *name; + u8 mac[6]; + u32 flags; + void *ctx; + int (*tx)(void *ctx, const void *packet, u32 length); + int (*rx_poll)(void *ctx, void *buffer, u32 capacity, u32 *out_length); + /* 无线扩展回调(有线驱动置 NULL,向后兼容)。 */ + int (*scan_start)(void *ctx); + int (*scan_count)(void *ctx); + int (*scan_result)(void *ctx, u32 n, struct dkm_net_scan_result *out); + int (*is_wireless)(void *ctx); +}; + +struct dkm_net_api { + int (*register_device)(const struct dkm_net_device_desc *desc); + u32 (*device_count)(void); + int (*device_info)(u32 index, void *out); + int (*tx)(u32 index, const void *packet, u32 length); + int (*rx_poll)(u32 index, void *buffer, u32 capacity, u32 *out_length); + int (*scan_start)(u32 index); + int (*scan_count)(u32 index); + int (*scan_result)(u32 index, u32 n, struct dkm_net_scan_result *out); + int (*is_wireless)(u32 index); +}; + +typedef int (*dkm_block_read_fn)(void *ctx, u64 lba, u32 count, void *buffer); +typedef int (*dkm_block_write_fn)(void *ctx, u64 lba, u32 count, const void *buffer); + +struct dkm_block_device_desc { + const char *name; + u64 sector_size; + u64 sector_count; + void *ctx; + int (*read)(void *ctx, u64 lba, u32 count, void *buffer); + int (*write)(void *ctx, u64 lba, u32 count, const void *buffer); +}; + +struct dkm_block_api { + int (*register_device)(const struct dkm_block_device_desc *desc); + u32 (*device_count)(void); + int (*read)(u32 index, u64 lba, u32 count, void *buffer); + int (*write)(u32 index, u64 lba, u32 count, const void *buffer); + u64 (*sector_size)(u32 index); + const char *(*device_name)(u32 index); + int (*set_write_fn)(u32 index, dkm_block_write_fn fn); +}; + +/* 与 UTSM/include/utsm/dkm.h 中的 dkm_kernel_api 布局完全一致. + * 字段顺序/类型不可调整 — UTSM 端按此偏移填充. */ +struct dkm_kernel_api { + u32 version; + u32 size; + u64 feature_bits; + const struct dkm_log_api *log; + const void *mem; + const void *utsm; + const void *irq; + const void *pci; + const struct dkm_dma_api *dma; + const void *vfs; + const struct dkm_net_api *net; + const void *timer; + const void *drr; + const void *rsdp_address; + const void *fb_address; + u64 fb_width; + u64 fb_height; + u64 fb_pitch; + u16 fb_bpp; + const void *boot_modules_response; + int (*irq_register)(u8 irq, void *handler); + u64 hhdm_offset; + const struct dkm_block_api *block; /* 末尾字段, 不使用 block 的驱动可不访问 */ +}; + +struct dkm_driver_handle; + +struct dkm_driver_desc { + u32 magic; + u16 abi_version; + u16 desc_size; + const char *name; + const char *version; + const char *vendor; + u32 driver_class; + u32 stage; + u32 flags; + u32 priority; + const char *const *depends; + u32 depends_count; + const char *const *provides; + u32 provides_count; + u64 min_kernel_abi; + u64 feature_bits; + u64 reserved0; + u64 reserved1; +}; + +/* ---- PCI 配置空间常量 ---- */ +#define PCI_ADDR 0xCF8 +#define PCI_DATA 0xCFC +#define PCI_VENDOR_ID 0x00 +#define PCI_DEVICE_ID 0x02 +#define PCI_COMMAND 0x04 +#define PCI_PROG_IF 0x09 +#define PCI_SUBCLASS 0x0A +#define PCI_CLASS 0x0B +#define PCI_HEADER 0x0E +#define PCI_CAP_PTR 0x34 +#define PCI_IRQ_LINE 0x3C +#define PCI_BAR0 0x10 +#define PCI_BAR1 0x14 +#define PCI_BAR2 0x18 +#define PCI_BAR3 0x1C +#define PCI_BAR4 0x20 +#define PCI_BAR5 0x24 + +#define PCI_CMD_IO (1u << 0) +#define PCI_CMD_MEM (1u << 1) +#define PCI_CMD_BUSM (1u << 2) + +/* ---- PCI I/O 端口内联函数 (每个 .drv 获得独立副本) ---- */ +static __inline__ void dkm_outl(u16 port, u32 value) { + __asm__ volatile ("outl %0, %1" :: "a"(value), "Nd"(port)); +} + +static __inline__ u32 dkm_inl(u16 port) { + u32 value; + __asm__ volatile ("inl %1, %0" : "=a"(value) : "Nd"(port)); + return value; +} + +static __inline__ void dkm_outb(u16 port, u8 value) { + __asm__ volatile ("outb %0, %1" :: "a"(value), "Nd"(port)); +} + +static __inline__ u8 dkm_inb(u16 port) { + u8 value; + __asm__ volatile ("inb %1, %0" : "=a"(value) : "Nd"(port)); + return value; +} + +static __inline__ u32 dkm_pci_read(u8 bus, u8 dev, u8 func, u8 reg) { + u32 addr = (1u << 31) + | ((u32)bus << 16) + | ((u32)dev << 11) + | ((u32)func << 8) + | ((u32)reg & 0xFC); + dkm_outl(PCI_ADDR, addr); + return dkm_inl(PCI_DATA); +} + +static __inline__ void dkm_pci_write(u8 bus, u8 dev, u8 func, u8 reg, u32 value) { + u32 addr = (1u << 31) + | ((u32)bus << 16) + | ((u32)dev << 11) + | ((u32)func << 8) + | ((u32)reg & 0xFC); + dkm_outl(PCI_ADDR, addr); + dkm_outl(PCI_DATA, value); +} + +static __inline__ u8 dkm_pci_read8(u8 bus, u8 dev, u8 func, u8 reg) { + u32 v = dkm_pci_read(bus, dev, func, reg); + return (u8)((v >> ((reg & 3) * 8)) & 0xff); +} + +/* ---- TSC 时序: 实机要求用 CPU 频率计算, 不用循环 ---- + * 每个 .drv 包含此头文件后获得自己的 file-local dkm_tsc_per_ms 副本, + * 通过 dkm_tsc_calibrate() 在 driver_init 开头初始化. + */ +static u64 dkm_tsc_per_ms __attribute__((unused)) = 0; + +static __inline__ u64 dkm_rdtsc(void) { + u32 lo, hi; + __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((u64)hi << 32) | lo; +} + +/* 通过 PIT ch0 + TSC 校准 ~10ms 区间, 推算每毫秒 TSC 周期数. */ +static __inline__ void dkm_tsc_calibrate(void) { + dkm_outb(0x43, 0x30); /* ch0, lo+hi, mode 0, binary */ + dkm_outb(0x40, 0x7c); /* 11932 low = ~10ms */ + dkm_outb(0x40, 0x2e); /* 11932 high */ + u64 tsc_start = dkm_rdtsc(); + u16 prev = 0; u64 loops = 0; + for (;;) { + dkm_outb(0x43, 0x00); + u16 cur = (u16)dkm_inb(0x40) | ((u16)dkm_inb(0x40) << 8); + if (cur > prev && loops > 10) break; + prev = cur; loops++; + } + u64 tsc_end = dkm_rdtsc(); + dkm_tsc_per_ms = (tsc_end - tsc_start) / 10; +} + +static __inline__ void dkm_delay_ms(u32 ms) { + if (!dkm_tsc_per_ms) { + for (volatile u32 i = 0; i < 100000 * ms; i++) __asm__ volatile("pause"); + return; + } + u64 target = dkm_tsc_per_ms * ms; + u64 start = dkm_rdtsc(); + while (dkm_rdtsc() - start < target) __asm__ volatile("pause"); +} + +static __inline__ void dkm_delay_us(u32 us) { + if (!dkm_tsc_per_ms) { + for (volatile u32 i = 0; i < 100 * us; i++) __asm__ volatile("pause"); + return; + } + u64 target = dkm_tsc_per_ms * us / 1000; + u64 start = dkm_rdtsc(); + while (dkm_rdtsc() - start < target) __asm__ volatile("pause"); +} + +/* 实机: 基于 TSC 的串口发送等待 (100us 超时). com_port = 0x3F8 (COM1). */ +static __inline__ void dkm_serial_wait_tx(u16 com_port) { + if (!dkm_tsc_per_ms) { + for (volatile u32 i = 0; i < 100000; i++) { + if (dkm_inb((u16)(com_port + 5)) & 0x20) break; + __asm__ volatile("pause"); + } + return; + } + u64 deadline = dkm_rdtsc() + dkm_tsc_per_ms / 10; + while (dkm_rdtsc() < deadline) { + if (dkm_inb((u16)(com_port + 5)) & 0x20) break; + __asm__ volatile("pause"); + } +} + +#endif /* DKM_SHARED_H */ diff --git a/CODE/DKM/e1000/e1000.c b/CODE/DKM/e1000/e1000.c index c7dfddb..21eaa8e 100644 --- a/CODE/DKM/e1000/e1000.c +++ b/CODE/DKM/e1000/e1000.c @@ -3,98 +3,7 @@ * Finds e1000 via PCI, maps MMIO, reads MAC address. */ -#include - -#define DKM_DRIVER_MAGIC 0x444B4D31u -#define DKM_ABI_VERSION 1u - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; -typedef signed char i8; -typedef long long i64; -#define NULL ((void *)0) - -struct dkm_log_api { - void (*info)(const char *msg); - void (*warn)(const char *msg); - void (*error)(const char *msg); - void (*panic)(const char *msg); -}; - -struct dkm_net_scan_result { - char ssid[33]; - u8 bssid[6]; - u8 channel; - i8 rssi; - u8 security; -}; - -struct dkm_net_device_desc { - const char *name; - u8 mac[6]; - u32 flags; - void *ctx; - int (*tx)(void *ctx, const void *packet, u32 length); - int (*rx_poll)(void *ctx, void *buffer, u32 capacity, u32 *out_length); - /* 无线扩展回调(有线驱动置 NULL,向后兼容)。 */ - int (*scan_start)(void *ctx); - int (*scan_count)(void *ctx); - int (*scan_result)(void *ctx, u32 n, struct dkm_net_scan_result *out); - int (*is_wireless)(void *ctx); -}; - -struct dkm_net_api { - int (*register_device)(const struct dkm_net_device_desc *desc); - u32 (*device_count)(void); - int (*device_info)(u32 index, void *out); - int (*tx)(u32 index, const void *packet, u32 length); - int (*rx_poll)(u32 index, void *buffer, u32 capacity, u32 *out_length); - int (*scan_start)(u32 index); - int (*scan_count)(u32 index); - int (*scan_result)(u32 index, u32 n, struct dkm_net_scan_result *out); - int (*is_wireless)(u32 index); -}; - -struct dkm_dma_buffer { - void *virt; - u64 phys; - u64 size; -}; - -struct dkm_dma_api { - int (*alloc_pages)(u64 page_count, u64 alignment, u64 max_phys, struct dkm_dma_buffer *out); -}; - -#define DKM_NET_F_LINK_UP (1u << 0) -#define DKM_NET_F_TX_READY (1u << 1) -#define DKM_NET_F_RX_READY (1u << 2) - -struct dkm_kernel_api { - u32 version; u32 size; u64 feature_bits; - const struct dkm_log_api *log; - const void *mem,*utsm,*irq_api,*pci_api; - const struct dkm_dma_api *dma; - const void *vfs_api; - const struct dkm_net_api *net; - const void *timer,*drr; - const void *rsdp_address,*fb_address; - u64 fb_width,fb_height,fb_pitch; u16 fb_bpp; - const void *boot_modules_response; - int (*irq_register)(u8 irq, void *handler); - u64 hhdm_offset; -}; - -struct dkm_driver_handle; -struct dkm_driver_desc { - u32 magic; u16 abi_version; u16 desc_size; - const char *name,*version,*vendor; - u32 driver_class,stage,flags,priority; - const char *const *depends; u32 depends_count; - const char *const *provides; u32 provides_count; - u64 min_kernel_abi,feature_bits,reserved0,reserved1; -}; +#include "../dkm_shared.h" static const char *const g_depends[] = {"pci","irq"}; static const char *const g_provides[] = {"netdev"}; @@ -108,16 +17,6 @@ const struct dkm_driver_desc driver_desc = { .provides=g_provides,.provides_count=1,.min_kernel_abi=1, }; -/* PCI config ports */ -#define PCI_ADDR 0xCF8 -#define PCI_DATA 0xCFC -#define PCI_VENDOR_ID 0x00 -#define PCI_DEVICE_ID 0x02 -#define PCI_COMMAND 0x04 -#define PCI_BAR0 0x10 -#define PCI_BAR1 0x14 -#define PCI_IRQ_LINE 0x3C - /* e1000 MMIO registers */ #define E1000_CTRL 0x0000 #define E1000_STATUS 0x0008 @@ -205,20 +104,20 @@ static u32 g_rx_tail; static u32 g_tx_tail; static int g_rings_ready; -static __inline__ void outl(u16 p, u32 v) { __asm__ volatile("outl %0,%1"::"a"(v),"Nd"(p):"memory"); } -static __inline__ u32 inl(u16 p) { u32 v; __asm__ volatile("inl %1,%0":"=a"(v):"Nd"(p):"memory"); return v; } -static u8 inb(u16 p) { u8 v; __asm__ volatile("inb %1,%0":"=a"(v):"Nd"(p):"memory"); return v; } -static void outb(u16 p, u8 v) { __asm__ volatile("outb %0,%1"::"a"(v),"Nd"(p):"memory"); } +#define COM1 0x3F8 + +/* 串口发送等待 thin wrapper — 调用 dkm 共享实现 */ +static void serial_wait_tx(void) { dkm_serial_wait_tx(COM1); } static void raw_log(const char *s) { while (*s) { char c = *s++; if (c == '\n') { - for (u32 i=0;i<100000;i++) if (inb(0x3F8+5)&0x20) break; - outb(0x3F8, '\r'); + serial_wait_tx(); + dkm_outb(COM1, '\r'); } - for (u32 i=0;i<100000;i++) if (inb(0x3F8+5)&0x20) break; - outb(0x3F8, (u8)c); + serial_wait_tx(); + dkm_outb(COM1, (u8)c); } } @@ -227,20 +126,18 @@ static void raw_hex(const char *prefix, u64 v) { raw_log(prefix); raw_log("0x"); for (int i=15; i>=0; i--) { - for (u32 wait=0; wait<100000; wait++) if (inb(0x3F8+5)&0x20) break; - outb(0x3F8, (u8)h[(v >> (i * 4)) & 0xf]); + serial_wait_tx(); + dkm_outb(COM1, (u8)h[(v >> (i * 4)) & 0xf]); } raw_log("\n"); } static u32 pci_read(u8 bus, u8 dev, u8 func, u8 reg) { - u32 a = (1u<<31)|((u32)bus<<16)|((u32)dev<<11)|((u32)func<<8)|((u32)reg&0xFC); - outl(PCI_ADDR,a); return inl(PCI_DATA); + return dkm_pci_read(bus, dev, func, reg); } static void pci_write(u8 bus, u8 dev, u8 func, u8 reg, u32 v) { - u32 a = (1u<<31)|((u32)bus<<16)|((u32)dev<<11)|((u32)func<<8)|((u32)reg&0xFC); - outl(PCI_ADDR,a); outl(PCI_DATA,v); + dkm_pci_write(bus, dev, func, reg, v); } static int e1000_find(u8 *bus, u8 *dev) { @@ -262,9 +159,12 @@ static int e1000_find(u8 *bus, u8 *dev) { static u16 e1000_eeprom_read(u16 addr) { /* EERD: bit0=START, addr<<8, 完成后 bit4=DONE, data 在高 16 位 */ g_mmio[E1000_EERD/4] = ((u32)addr << 8) | 1u; - for (u32 i=0;i<100000;i++) { + /* 实机: 100ms TSC 超时 */ + u64 deadline = dkm_rdtsc() + dkm_tsc_per_ms * 100; + while (dkm_rdtsc() < deadline) { u32 v = g_mmio[E1000_EERD/4]; if (v & (1u<<4)) return (u16)(v >> 16); + __asm__ volatile("pause"); } return 0xffff; } @@ -382,7 +282,9 @@ static int e1000_tx(void *ctx, const void *packet, u32 length) { g_tx_tail = (index + 1) % E1000_TX_DESC_COUNT; g_mmio[E1000_TDT/4] = g_tx_tail; mmio_flush(); - for (u32 wait=0; wait<1000000; wait++) { + /* 实机: 1秒 TSC 超时等待 TX 完成 */ + u64 deadline = dkm_rdtsc() + dkm_tsc_per_ms * 1000; + while (dkm_rdtsc() < deadline) { dma_fence(); if (g_tx_desc[index].status & E1000_TX_STA_DD) { raw_log("[e1000.raw] tx complete\n"); @@ -428,6 +330,8 @@ static int e1000_rx_poll(void *ctx, void *buffer, u32 capacity, u32 *out_length) __attribute__((visibility("default"))) int driver_init(const struct dkm_kernel_api *api, struct dkm_driver_handle *handle) { + /* 实机要求: 先校准 TSC, 再使用基于 CPU 频率的延迟 */ + dkm_tsc_calibrate(); raw_log("[e1000.raw] driver_init entered\n"); (void)handle; if (!api||!api->log) return -1; @@ -472,8 +376,11 @@ int driver_init(const struct dkm_kernel_api *api, /* 软件复位,确保 RX/TX/RAL/RAH 从已知状态开始配置。 */ g_mmio[E1000_CTRL/4] = g_mmio[E1000_CTRL/4] | (1u << 26); - for (u32 wait=0; wait<1000000; wait++) { + /* 实机: 1秒 TSC 超时等待复位完成 */ + u64 deadline = dkm_rdtsc() + dkm_tsc_per_ms * 1000; + while (dkm_rdtsc() < deadline) { if (!(g_mmio[E1000_CTRL/4] & (1u << 26))) break; + __asm__ volatile("pause"); } raw_log("[e1000.raw] reset done\n"); diff --git a/CODE/DKM/fat32/fat32.c b/CODE/DKM/fat32/fat32.c index 645ddbd..467c8dd 100644 --- a/CODE/DKM/fat32/fat32.c +++ b/CODE/DKM/fat32/fat32.c @@ -31,8 +31,10 @@ struct dkm_block_api { int (*register_device)(const void *desc); u32 (*device_count)(void); int (*read)(u32 index, u64 lba, u32 count, void *buffer); + int (*write)(u32 index, u64 lba, u32 count, const void *buffer); u64 (*sector_size)(u32 index); const char *(*device_name)(u32 index); + int (*set_write_fn)(u32 index, int (*fn)(void *ctx, u64 lba, u32 count, const void *buf)); }; struct dkm_kernel_api { diff --git a/CODE/DKM/virtio_net/virtio_net.c b/CODE/DKM/virtio_net/virtio_net.c index 1faf920..39be2b3 100644 --- a/CODE/DKM/virtio_net/virtio_net.c +++ b/CODE/DKM/virtio_net/virtio_net.c @@ -4,110 +4,23 @@ * it does not negotiate features, create virtqueues, or transmit packets. */ -#include +#include "../dkm_shared.h" -#define DKM_DRIVER_MAGIC 0x444B4D31u -#define DKM_ABI_VERSION 1u +/* virtio-specific PCI IDs and capability types (driver-local) */ +#define PCI_CLASS_REG 0x08 /* 32-bit class/subclass/prog_if/revision */ -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; -typedef signed char i8; -typedef long long i64; +#define PCI_VENDOR_VIRTIO 0x1AF4u +#define VIRTIO_TRANS_DEVICE_MIN 0x1000u +#define VIRTIO_TRANS_DEVICE_MAX 0x103Fu +#define VIRTIO_MODERN_DEVICE_MIN 0x1040u +#define VIRTIO_MODERN_DEVICE_MAX 0x107Fu +#define VIRTIO_NET_DEVICE_ID 1u -#define NULL ((void *)0) - -struct dkm_log_api { - void (*info)(const char *msg); - void (*warn)(const char *msg); - void (*error)(const char *msg); - void (*panic)(const char *msg); -}; - -struct dkm_net_scan_result { - char ssid[33]; - u8 bssid[6]; - u8 channel; - i8 rssi; - u8 security; -}; - -struct dkm_net_device_desc { - const char *name; - u8 mac[6]; - u32 flags; - void *ctx; - int (*tx)(void *ctx, const void *packet, u32 length); - int (*rx_poll)(void *ctx, void *buffer, u32 capacity, u32 *out_length); - /* 无线扩展回调(有线驱动置 NULL,向后兼容)。 */ - int (*scan_start)(void *ctx); - int (*scan_count)(void *ctx); - int (*scan_result)(void *ctx, u32 n, struct dkm_net_scan_result *out); - int (*is_wireless)(void *ctx); -}; - -struct dkm_net_api { - int (*register_device)(const struct dkm_net_device_desc *desc); - u32 (*device_count)(void); - int (*device_info)(u32 index, void *out); - int (*tx)(u32 index, const void *packet, u32 length); - int (*rx_poll)(u32 index, void *buffer, u32 capacity, u32 *out_length); - int (*scan_start)(u32 index); - int (*scan_count)(u32 index); - int (*scan_result)(u32 index, u32 n, struct dkm_net_scan_result *out); - int (*is_wireless)(u32 index); -}; - -#define DKM_NET_F_LINK_UP (1u << 0) - -struct dkm_kernel_api { - u32 version; - u32 size; - u64 feature_bits; - const struct dkm_log_api *log; - const void *mem; - const void *utsm; - const void *irq; - const void *pci; - const void *dma; - const void *vfs; - const struct dkm_net_api *net; - const void *timer; - const void *drr; - const void *rsdp_address; - const void *fb_address; - u64 fb_width; - u64 fb_height; - u64 fb_pitch; - u16 fb_bpp; - const void *boot_modules_response; - int (*irq_register)(u8 irq, void *handler); - u64 hhdm_offset; -}; - -struct dkm_driver_handle; - -struct dkm_driver_desc { - u32 magic; - u16 abi_version; - u16 desc_size; - const char *name; - const char *version; - const char *vendor; - u32 driver_class; - u32 stage; - u32 flags; - u32 priority; - const char *const *depends; - u32 depends_count; - const char *const *provides; - u32 provides_count; - u64 min_kernel_abi; - u64 feature_bits; - u64 reserved0; - u64 reserved1; -}; +#define VIRTIO_PCI_CAP_COMMON_CFG 1u +#define VIRTIO_PCI_CAP_NOTIFY_CFG 2u +#define VIRTIO_PCI_CAP_ISR_CFG 3u +#define VIRTIO_PCI_CAP_DEVICE_CFG 4u +#define VIRTIO_PCI_CAP_PCI_CFG 5u static const char *const g_depends[] = { "pci", "irq" }; static const char *const g_provides[] = { "netdev" }; @@ -134,73 +47,18 @@ const struct dkm_driver_desc driver_desc = { .reserved1 = 0 }; -#define PCI_ADDR 0xCF8 -#define PCI_DATA 0xCFC -#define PCI_VENDOR_ID 0x00 -#define PCI_COMMAND 0x04 -#define PCI_CLASS_REG 0x08 -#define PCI_HEADER 0x0E -#define PCI_CAP_PTR 0x34 -#define PCI_IRQ_LINE 0x3C -#define PCI_BAR0 0x10 -#define PCI_BAR1 0x14 -#define PCI_BAR2 0x18 -#define PCI_BAR3 0x1C -#define PCI_BAR4 0x20 -#define PCI_BAR5 0x24 - -#define PCI_CMD_IO (1u << 0) -#define PCI_CMD_MEM (1u << 1) -#define PCI_CMD_BUSM (1u << 2) - -#define PCI_VENDOR_VIRTIO 0x1AF4u -#define VIRTIO_TRANS_DEVICE_MIN 0x1000u -#define VIRTIO_TRANS_DEVICE_MAX 0x103Fu -#define VIRTIO_MODERN_DEVICE_MIN 0x1040u -#define VIRTIO_MODERN_DEVICE_MAX 0x107Fu -#define VIRTIO_NET_DEVICE_ID 1u - -#define VIRTIO_PCI_CAP_COMMON_CFG 1u -#define VIRTIO_PCI_CAP_NOTIFY_CFG 2u -#define VIRTIO_PCI_CAP_ISR_CFG 3u -#define VIRTIO_PCI_CAP_DEVICE_CFG 4u -#define VIRTIO_PCI_CAP_PCI_CFG 5u - static const struct dkm_log_api *g_log; -static __inline__ void outl(u16 port, u32 value) { - __asm__ volatile ("outl %0, %1" :: "a"(value), "Nd"(port)); -} - -static __inline__ u32 inl(u16 port) { - u32 value; - __asm__ volatile ("inl %1, %0" : "=a"(value) : "Nd"(port)); - return value; -} - static u32 pci_read(u8 bus, u8 dev, u8 func, u8 reg) { - u32 addr = (1u << 31) - | ((u32)bus << 16) - | ((u32)dev << 11) - | ((u32)func << 8) - | ((u32)reg & 0xFC); - outl(PCI_ADDR, addr); - return inl(PCI_DATA); + return dkm_pci_read(bus, dev, func, reg); } static void pci_write(u8 bus, u8 dev, u8 func, u8 reg, u32 value) { - u32 addr = (1u << 31) - | ((u32)bus << 16) - | ((u32)dev << 11) - | ((u32)func << 8) - | ((u32)reg & 0xFC); - outl(PCI_ADDR, addr); - outl(PCI_DATA, value); + dkm_pci_write(bus, dev, func, reg, value); } static u8 pci_read8(u8 bus, u8 dev, u8 func, u8 reg) { - u32 v = pci_read(bus, dev, func, reg); - return (u8)((v >> ((reg & 3) * 8)) & 0xff); + return dkm_pci_read8(bus, dev, func, reg); } static void log_hex(const char *prefix, u64 value) { @@ -320,6 +178,28 @@ static void log_virtio_caps(u8 bus, u8 dev, u8 func) { } } +/* ---- tx/rx_poll stub: 安全占位, 不实际收发, 防止 netdev 调用 NULL ---- */ +static int virtio_net_tx(void *ctx, const void *packet, u32 length) { + (void)ctx; + (void)packet; + /* 仅记录日志, 避免每次发包刷屏: 仅记录长度 */ + static u32 s_tx_log_guard = 0; + if (s_tx_log_guard < 4) { + g_log->info("[virtio_net] tx stub: packet dropped (virtqueues not enabled)"); + log_hex("[virtio_net] tx stub len=", length); + s_tx_log_guard++; + } + return 0; +} + +static int virtio_net_rx_poll(void *ctx, void *buffer, u32 capacity, u32 *out_length) { + (void)ctx; + (void)buffer; + (void)capacity; + if (out_length) *out_length = 0; + return 0; /* 无数据, virtqueues 未启用 */ +} + __attribute__((visibility("default"))) int driver_init(const struct dkm_kernel_api *api, struct dkm_driver_handle *handle) { @@ -328,6 +208,9 @@ int driver_init(const struct dkm_kernel_api *api, if (!api || !api->log) return -1; g_log = api->log; + /* 实机要求: 在驱动初始化开头校准 TSC, 为后续时序提供准确计时 */ + dkm_tsc_calibrate(); + g_log->info("[virtio_net] init begin"); u8 bus = 0; @@ -379,8 +262,8 @@ int driver_init(const struct dkm_kernel_api *api, for (int i = 0; i < 6; i++) netdev.mac[i] = 0; netdev.flags = DKM_NET_F_LINK_UP; netdev.ctx = 0; - netdev.tx = 0; - netdev.rx_poll = 0; + netdev.tx = virtio_net_tx; /* stub: 安全占位, 不 NULL */ + netdev.rx_poll = virtio_net_rx_poll; int net_index = api->net->register_device(&netdev); log_hex("[virtio_net] netdev register rc=", (u64)(i64)net_index); } else { diff --git a/CODE/UTSM/arch/x86_64/serial.c b/CODE/UTSM/arch/x86_64/serial.c index ca4971b..f89b8f7 100644 --- a/CODE/UTSM/arch/x86_64/serial.c +++ b/CODE/UTSM/arch/x86_64/serial.c @@ -5,20 +5,56 @@ u8 inb(u16 port); #define COM1 0x3F8 +/* ---- TSC-based timing (实机要求: 用 CPU 频率计算, 不用循环) ---- */ +static u64 g_tsc_per_ms = 0; + +static inline u64 rdtsc_ser(void) { + u32 lo, hi; + __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((u64)hi << 32) | lo; +} + +/* 用 PIT (8254, 1.193182 MHz) 校准 TSC 频率 */ +static void tsc_calibrate_ser(void) { + outb(0x43, 0x30); /* ch0, lo+hi, mode 0, binary */ + outb(0x40, 0x7c); /* 11932 low = ~10ms */ + outb(0x40, 0x2e); /* 11932 high */ + u64 tsc_start = rdtsc_ser(); + u16 prev = 0; u64 loops = 0; + for (;;) { + outb(0x43, 0x00); + u16 cur = (u16)inb(0x40) | ((u16)inb(0x40) << 8); + if (cur > prev && loops > 10) break; + prev = cur; loops++; + } + u64 tsc_end = rdtsc_ser(); + g_tsc_per_ms = (tsc_end - tsc_start) / 10; +} + static int serial_ready(void) { return (inb(COM1 + 5) & 0x20) != 0; } +/* 实机: 基于 TSC 的 100ms 超时等待 */ static int serial_wait_ready(void) { - for (u64 spin = 0; spin < 1000000ULL; spin++) { - if (serial_ready()) { - return 1; + if (!g_tsc_per_ms) { + /* 兜底: 校准未完成时使用循环 */ + for (u64 spin = 0; spin < 1000000ULL; spin++) { + if (serial_ready()) return 1; } + return 0; + } + u64 deadline = rdtsc_ser() + g_tsc_per_ms * 100; /* 100ms 超时 */ + while (rdtsc_ser() < deadline) { + if (serial_ready()) return 1; + __asm__ volatile("pause"); } return 0; } void serial_init(void) { + /* 实机要求: 先校准 TSC, 再使用基于 CPU 频率的延迟 */ + tsc_calibrate_ser(); outb(COM1 + 1, 0x00); outb(COM1 + 3, 0x80); outb(COM1 + 0, 0x03); diff --git a/CODE/UTSM/arch/x86_64/serial.o b/CODE/UTSM/arch/x86_64/serial.o index b25f5f8607190ac62e7923600512e7f16fac8fc4..afeb06bb9edcc50ec13842e85094e58c29d2b63c 100644 GIT binary patch literal 2400 zcmb`J-D}%c6u__QZB5#B8fAm^p;UVr?L(C+shv8oVy$VXfEg{R+lMT1Wm!tyI<~Q- zw1vV9@rz&&fjx}9?qTdNFx!himeR6y8-Xz>6h`(1S;xjoM!($RopW`stZ38Q4(Q%< ze)pVnkIt23zjrcwYKI^YE&@4Dh8CxUNIQpmhN>Ad3Z6O5`&B)!o>Oz`+1b;b6R^}i z0>dWybTTlsufq^BWp18S2BM;RH@)wat|cC50w+ZEZqOvkgJB5Orp4AK%||V<)$MJJ zOpk6_)9DTI!`{rwV7K_e7t&WVgIkR!g8SLSyISvOY1+FlDq8O+$?Iyux_0QcCah_n zfAh63ns-Ng_@malm(aXdar4gO1R;FqKIrWRP`{8zXu`$Je|Zj^cO3P;5E>$bi__(adDe2%v$En#&%6C`1xsuIR3Qob0>1$EbFpkUUdk*mP=;EA+}jB>E(Q> zQUX}8ZL*kmY$IPY>-i;{$d#&N%5T4uJ8V0;ahb^YCg=5H5nlO49($!;a!hX2T*qL# zY>=w!6iBI3AhPY$9UbRuOE~`@fs| z(HDi!6Cs^0u;Em+AjWwd_dNkhB0H$U)Zh$f-ha+`-O>0aIIvsgu5{Me{&yI~IBY4; H!~6FSxKkZ) literal 1752 zcmb`GO=uHQ5XWCXw4o|11wqQr*=(9^lTFyXt=5Y{ zi;#;)&mMd9)MIm~=uNL4y%dxpRD`0Y8fSKAH_tVDb6|I7e(yg!^B!*>&o0b$c62b` zI@nd#%6!V$hwfIKa>EphfpRfj+pquVVk~j=330sv@op6&Fa3@wJe2;UY%Tpn<=a4c zjOi&zmp{XcNrPMH+3OQr(^6 z43xVoR3#10z`UZq*VW%s?=SC3JKx+YOlW{=(Elz>aC1i5NzQH^Nn6i>r)!Oa0ckMB zRB7kPEp$79W(+jkQmemvooTgB<3`NeH{W~@^Y)AT`Fr$qbITBtzuVXN{ zy0W~-^nzxs#y1SRVwSA<=%}2KmH5Rx=jF|*sVc+0Un=;x;g4EGK|C81hB4!W(iysp1}O` Y^8wC}7OuB}wQH3oxb0SXb?x^52WT@~CjbBd diff --git a/CODE/UTSM/core/process.o b/CODE/UTSM/core/process.o index 64a7b021d896b88a79c682c768dfa204951b057e..252839028a0efb4f10493ec95a8ed02fc8d7cac5 100644 GIT binary patch literal 3208 zcmbVNU5pb|6u#Xbsc6zhBy4<;c>sb6rL*j>8q%d;@8W_RcUMTrTBg%!sdPJ=_U9G6aNoLMD z-}$@u%)Muh>>PNm$>$>u`N%d>*Bq1(|H`@?;bMfW1kVv_{7Ov|k>Bt|%_=gv7Fb(E z!7N^R)3Q)9-u@OOY8HPuDS(Tmi$1g1^MOz+n?M5lvuEq}CbM|LQ7gwl0{iz(9?vvEG*&q1Sq-W4?_t5YNmFMVe^B>1Ax9|G=GWFf0U!r9@9oj+VbJPe> zW3Qi@u^_h3?u8L;qqFGL1P?W$>&)mTw3?+s2^f&@EA5l8b)_C)=&)P9H(;EOfM%8` zypiloXr)FeECDN>_wVm}xi3CCp9;D6Gc-8c3~usO`FpvR;n#4^sd0t34BFM$FM8BsPnxk! zJZKtQ%cU4!LYc=NtunuL!Qk?J@x}tpT)?Kt)shvVGX{p!!1lS(`N}MuI|~c!E5E}( z+SF~l4X^g|i!-w`NaucPrRBjkY77S`2tgDgv>c@6h@Toe0zC+X%Y0o{)!^KSt+S>( zctu=|XFrQI<95y7ON9}u)_aLfN_(~U2CPj1vnbv(RsPb7r1!-9RCfp z91BvbN)2GfG#-3&+Bxdx^dRU+qx1VmhKF{KO5=H5)d~fPDT%BmWpWv2I}kOi)VoYdYPl0#k6#)FKF7oOg-C7odhClVo5AKQ}6PTH@{kn0sqWl~D*P?ThMqBEJ; z3O(#-my@YprMGKqcUQPG(W@$*U0vNhJ@ONx)KaV$j$sS=i%&SWy#;U|SsXY7ZxGUY zcsMTf7LMAlX2`S@HM{c&hi$+g;d8|X_>}Ft_nOX zS|khq6@otm+}%CgFA`$ta~JO+&?*Fh&>z3f@DyrVsOpxF2w4{oD`tPAaF-aa9@jz}gaEUYpbpY1}!hr{kGi zN+-#DKAzW99fs23cv{P8d4<7nBB7klv`}o%$mRl5)I*KgmE@$7Q?erCr(;go%iNJ5-j$LLYX17JW5xtk(FQQVgsFz?L5SagZN39r63Otz8+k>izZxQnzeUZHD$2p2Q!)SDo6OVJ$P2T$7 zfYHI+ej8lBAUE#yy#>bR0Sm`)(e3x4Xq4lR{X=qeTO;Io0L0aHAkH_6`X@vHGW;ao G{{IL3M09Qd delta 401 zcmeB>oWL9pa&pRY;}cU-ii$JSC*S0ho-D*= zHd%p-hcyqRck)D5VXg^`5aa3?CTDTkG378!Ud3f5SOFE4fJid1PyWayuBZy+fg}u| zqA+R=l#w=BlUttE4aj2znaw1`I9ZTOY;pycfMys_klE*dK9FhvVmN?V4-;UYT*xKP VS_b4Yfs7E8fI1`rs(=yX5CA;{NX7sF diff --git a/CODE/UTSM/core/utsm_init.c b/CODE/UTSM/core/utsm_init.c index 85c7a65..50a2482 100644 --- a/CODE/UTSM/core/utsm_init.c +++ b/CODE/UTSM/core/utsm_init.c @@ -1,6 +1,7 @@ #include #include #include +#include #include static utsm_segment_desc g_segments[UTSM_MAX_SEGMENTS]; @@ -18,6 +19,8 @@ void utsm_init(void) { log_info("[UTSM] pckc init begin"); utsm_pckc_init(); log_info("[UTSM] pckc init ok"); + + utsm_process_init(); } utsm_segment_desc *utsm_get_segment(u32 slot) { diff --git a/CODE/UTSM/core/utsm_init.o b/CODE/UTSM/core/utsm_init.o index b5b256f4e29ee7e9d35e88b00b93caf0712d9462..d900d30d4a92bd460dd8a61cc3571e68f43082e1 100644 GIT binary patch delta 280 zcmX>h*da7QgVAH6<`M1}3_uY35=3tN;lL=l3dmq#`1l_rfD8gB2QrB>)=$o4ikGwi zN(eD9!KHUVS&5S$0@XNyNi`5TS%6uBF>A9X^Lj?cb(1Hui1TiNDrEuET$7)&)N>aU zgBo&H(aQ7(V_7i6R60$$?DbjJcCDnc^o4 zFtdmXF)+cUH$z$elOF=r7)%yq)@O{^?8v;Hk#YUxLT2&F3allQm$5!#XJA+YRLVSA zkx7`-k`&j&6(+yrkOu$(F*BzC diff --git a/CODE/UTSM/dkm/boot_modules.c b/CODE/UTSM/dkm/boot_modules.c index 9ec951a..85631d2 100644 --- a/CODE/UTSM/dkm/boot_modules.c +++ b/CODE/UTSM/dkm/boot_modules.c @@ -248,6 +248,9 @@ int dkm_load_elf_rel(const void *address, u64 size, const struct dkm_symbol_scan const elf64_ehdr *ehdr = (const elf64_ehdr *)address; const elf64_shdr *sections = (const elf64_shdr *)((const u8 *)address + ehdr->shoff); u64 image_offset[64]; + /* Zero the entire array so non-ALLOC section indices yield offset 0 + * instead of stack garbage. */ + for (int zi = 0; zi < 64; zi++) image_offset[zi] = 0; u64 total_size = 0; u64 max_align = 16; u16 alloc_count = 0; @@ -353,7 +356,9 @@ int dkm_load_elf_rel(const void *address, u64 size, const struct dkm_symbol_scan return -1; } - if (rela->offset + 8 <= target->size) { + /* Bounds check: use the actual write width, not always 8. */ + u32 reloc_width = (reloc_type == R_X86_64_64) ? 8 : 4; + if (rela->offset + reloc_width <= target->size) { if (reloc_type == R_X86_64_32 || reloc_type == R_X86_64_32S || reloc_type == R_X86_64_PC32) { *(u32 *)(target_base + rela->offset) = (u32)patch; } else { diff --git a/CODE/UTSM/dkm/boot_modules.o b/CODE/UTSM/dkm/boot_modules.o index fa70a40c9f8ad8cca97252d5aaa6de012c4f9c45..ab9b98437322afa716fa39740a37855dfec41122 100644 GIT binary patch delta 1489 zcmZ`(S!fec6rDGznl#Z#&~`G~B`Gc`E;OiUtc^xmJE@bj1x1iT6~(`b)fDSSqNCO@ z76Mnq4-uCS1wmViTS0B9VijBwwTeiIG{R!wGe>aW5?Ir6-4crW&)Db@32?bsta zRaGl_G>XPNC~}PSIG+{N&$z?}ZmhzlM}OcVMskhX+J*Ld!FOF*I5E;4)wim@!a`S^s@m2K$8E>+ z21aY3&G`gpR^yV$8(8luFSzGKz_u#q9yB#Fs) zv{4M|8Le=*FCTFSMaS{U_-o=V2JSStpEwK}o0$4ZxHjvPmil6P?-=i?0LQ@($wNNC zf$1Xo1peuw^lco^`=MJ+og6e{jSbpoh{Oe+8DcO@?P5^pQ}8h>TMgWF_}Vye3q){N zn}uyR*pvkyGw{RoED0=ZjlrIzn$kH7+iI{Es9Wi-!BUWZ`7`mM@dD0bFC$bRC-4m4 zqqIIbm5v+3^zWh#Vt5UlF4+l}Tj~Qw{T!yAoup!^KVr+vbIs#8tS|MDR%k92Nn8Hi z34tWQ6Ll)T!49j}B44yKP4E9x)HS**J?Do}@dobu*!pkCz z`NF(ifMxzLU*(29{_un*di&5`G!>ru1N=rejQPX(rx&VN!Iu<4@3dmbR0K#5+(f`v J1Y;Gm{{e^uvyT7( delta 1371 zcmZ`&U2IHS6yEzxF*7aOM9rD0cG_u?>1~P8hpIB2N`KCA&lrL?i3d{Agdj6PLW)6+ ztw~u4?#oS+zPLY$k#c))BxpRe;xB#DAeiuATt6)diuPFh^o*QLVm<7$_xG*u+iUH; zPj_oiOLu^lU8;OEV+HGPU7;jCOYDeD2~m?D)ugWQy#b}GxR&)tmn-z1hEp|hbIG;Y zgplhJ4$Z+g&A}Vpkg^}3DOlwAox0$Tqnf^eaYt|7nq;vHdYlV7G`^|c6QN(Dd~1pQ z(7^{JrYJn#t?>;t%hbdd&z?Gs$7(zZkEFE9u{~89*J{eHp+8aUZteAH$+R+%Dbv`+ zVYO?uN2|NVj-Nx4m4-?1W0V(GMfs+x*^P;BG|p7|;s3g}#jNzG(37TQI?<7yOpH5Y zK1`6pSrtiLf37Pp(Z+9d9RUvh-`U;8`u?oWuLC=N#|MXKJG7!R?| z^}^K_A6jj@Y;2ub1<&*E&l~-w>x0cbHY`^e928Z*6hm?(^9=45lsc~>-^NOt2#Y@20E&xJcTanAVb82q*37f1o4yTJ`??DSI%(CnW7$}lE zx_-i*wcu9IAqzgs;+8RS@ezHEn03CjxJbq>4PWP^}Kc7w?ZQ2bQ$#WomQ!Bs5N?ZThNpb_W$jr`smw*t`@#sy=q zi#cq-Wcv;6;~e(5cyAbKW0!ZvIAM%-2$smfnc|IL2ovii{bSN|_dX;Dq)s9u>Wo498TQJeJ&=YZcQdp#D`g&Elz=EFLlOlx7F zM5ZA)jPrGUzxkpPRUlK=N;g8#Un`Bcq1_*n&d-8B@pFU0D}QL(Gln*ho;wG^2mgGPrIeNhu>X*NM6c58#T6%n=37=qY9v&hm+(}+AB1GX)+ zNJ8R<>ln9~7$Z6cx5Q~cK^#p4GfYGhK%KbYg2V+};8opw3fdZZ?|t8U|Ge*|zK^a` zzdCj5)Tz4XE_@gi5^NVF(yHcpQgdWEXKLjP*E+grT%m$3v0>$&<{-Aj%$449nC@+J7Mnv{!HQnf!5K=e zxPbE+6|yH4BK<(N#F6zZWlO5?V9wj-A|A{=y%bp<$GRyP-XB9ChK$~eGqrH}eX-1m z9&(jsf>h0QR&h^%;)b8&Or_kIYEIP7P2{zf*a%MZjmUD=P4!2o2o44dV0o{5k-otWrjA5LQRY%G}uVo~~}c?pQbw}MY_2Ra;P z&Q#5fLA%4pkbBy|iT(jDbKn&3cQ#fBAS_{tz4QrZy43t8SqbIlL(WvonSA+q&~y%H zJUBbV(pd;0>PDwFq{~g=uoRg1;f5wN_q2`^oyV)jhF%SqU>b)NouH~_dt$^SoIT4; zve>WxMX`H^I3jiluURV&CDHqDh!(2HhpWP7Or0}FK_YMhA4vXC!eWKU2tzRMmSBs8 zD~DVk{PmO1hXP-4LO!u*!?nz=+JkIi<+)*;={cCXg&5k42BC&4-B`tLFmw6*!Q+fI zGIm3SOk5$$M(JrDTVlP+j0tCWCSo^~$;7SM&qNvi(i-9qPOyGhC-|@fglHM4&wM%JonD-%!d4tKy7iIdV`gJ}1v^6S2n6 zVO@gvLLSmZ8``aO5yx@-ejZL&2@a;Q`|*r3T!Nc9d5oJr-- zkHitluKfP|pIeV`HhWwTK2qdNWtJyW>f5C>LmN4BwZ!hRW1QZL2Rk$VKIs73^jJB|J6Iv;Gwa<5LA z=MOTrq?0SXjc$>SFY!3GWRllwFlVT+LU-2qW(Cal^iJrfdhIZsXXWGb{ zlU`C9+B#WdDQZd0(wbND9b4k#EX(tGgDufJi)4BFH$+&n!jcu1tg&Q`B^xZ+V96Fs zwpg;mk{y=pv1HE~${bLtmSyb6&y&)sxI*NmQ{Dg;t-?u^r(%(Hm6H_`ka3lhH4>0* zm6Ht;kZF~ZEfSDrm6IJ3kYSaRJra=JQe?MXmQfrbUnq~_A0CDLYMBr0A+e+GuID-2 z4>>dvpTP*loH>!=#MDH+I9d~*m}&{MNze+Ghli*ph;j6!Gv}(p(fzY;OUL=|pWW+t zaPfdCK4^rfpOBrM|qP`lJf48N$$>-4R@zF1;u$Q z&)(gC;OpG-KFv8BBR}0+bKzmm^0q96`$wm*7>BO85clbxE7}ukkByhs9GyKYlFfai z@aU;KCHFJK)xMSefA})|>M~!CV}~h%jxDnN{_c(NrVWF${5I^&)P6j8-MSU>T#wK62Q^b-Hr_d< zpJx7IW!(NpV^5EKzqk9*`(sr(hns7jnB|Kz3#!Vcb@J?*xY6F}@0ee_?UwBPQfeOb z@uPyKzq%b9optU|%Tn8eW%VOMnF&7oGt(9om_j7`w^!#UXE`xvcaJz0nou?5ta9}S zhl=u>6}~I}t@)(wLq)^Y?|V<5)-a~Yqjhvd_SrFg@&;EOC|mQ#*5o_#2fq~l(X~pn z({0=7p>ItNTs2_bjerAKWmns!~nJJR9=q`+Jv*s}Gh3%?RCoX`SKgW#8!zm#Q{@{fX=5FzKM$ zCkZbW*Jkv-@MPtJobg8P+SYFmeK&CZ$8B5Z^`7@A_F}IgZ?}#s4xZ{V#617Z>=IF6 zX2)l3>7Q4O${b+h^6C6l?sc_4dDhQA?O!+PPges!e=+EoRsK!4l8KJTZb=+Fg0o)w zt*^~E8T<66--`4d5$nIHijWz1Wf^ssBfbl~*$+!o_owD= zO1XULizBHiUaP&t%~KyZpYL2^rCIRcxpu&&)=`-&&u$+5&Gp8VmE$Irt6X+{kh`TY zd()O5gLBh-la?&rm~bbwe7KE?_x;$X~)@zUu@r;?xjQpgdO|AFe8h$PsR(`>I_`myQ-OC9)61j3# z;1BGmBgaPVsh>QvSA(g#s6(>Gr6ES2?)J;MLAuZOht2+_)loO2@2O%*vAbKw^W0A- zXZpMSd0}$;55849uJ0Q-{@$s}J9=4n)DCNZ`P=x%Wse-+z4_bEVPgiqSib+j$fI@J zk1slM;CpB3a?X8QMa#{;3m5!zb;Xb=zy9@$&oigRo&59j{4puh*1GA3EK8dD_L1A1 z|KhI}y!~Ft?kijF3s?W|zrRP|_XzyIj6h7XIyGLrM59Yj)TWBPyd+YIpLleFUZ0je zVcfX*M14X=v?NBGGA=oJiSXl*rqeFg#OTFwF+OT_?D%Nk*l2I`Q0C($jg1RX2l#o9 z_w)3P4v10v`uUCb_m__OPXZf@9xH8_hv*y8t3`phh_PeD1Um@APE?7|2vYDzEnNDe zKdeuRmw}s+uFz++qcpLHDFYr4dD)z!OJcBLZH64LteMbxZ5f=KE{(Ddy zwuiyj9WEpe#GhG|zM#c0^C*3M72<+lCUGHl8i8vp?7&gs^^z(5TcDpw@iyQ&6#ohM zS_}Jly_0$C46}*ifSK25IoFC$kBMuBIBtBx$A5QVH zz{gUY_~{Lt*cYra%mj*0hKqj&#fg3tWq%~hn?`ZsPcFrYKOa%{$-KKLeIKxYg5v(b z&rnGo#J`GS5UkVcpk-zfUl$Y4&d7;z69=A@Yxji z1fEWDVrMtSiJiYtoamb=PV}!){1MFCN^!ETmlP-V--L$-5+7oJIK|1jrc#{PNvAlm zW1u+EFQhopKSFV`t_q5ibyZXRD#YP7aFYK?{(L}jl0Vxio(y)Z;h}`sA$heoa1yt> zpzloSlYHw+aguLGP@Lpj3B^gi4WKy5w{w6Ke@J{{C|(bKCR27u{z<1eiQ66vjzuy0 z!{t;D{E7v~N00c~Kyec1`@o6+d%#aCxIYsfOX5s%vMyJOlYRLE#Ycl38O2H57Ezqo z*8wNzfy5_^;v}BgJ@8EwCwBHxoW$oK#lHgoFH@YvxvmFp+l${e{(S+5Tr4!1VLfn( z1&0*Ej|lI9$5Nd5nM852uJsfr{%`GppS9qY{{P$qzi+`U{jY`hNph~pzBf{w`;QX?484m;_BsQkoVyfyTyY(bpbcAu%;h3!d;W3t36k=+t`jDTp2?{I?0a z-94v1F(!$Tq-ymV$+XaLk955nwXurDd~s+|=?RPke?E#*$Ht=XOz}*NF2>I%O0SMi z*6{k>OH(H&Yh!qpuE!sq7)iQbhZIqrmBQCLZLC_a7N)^w7>PizqEsS<^Zh@qwCKGJ z9{pZ1RW?#+?u7R`(n&QLchrFy+-8UxBLnFroG;P=uVE&_<7IGLB!{a}7djd=p&X->uw?uUSNNT(LHvkAks8TOy7 di)BphV_{sS}qzXbpQ literal 1616 zcmbu9&rcIU6vwBa1~mpkV)SCz$OR7!v_Ju)rY3+r;ExoD2huFl-RV*(-DWye@gj*{ z`X6}kKhQtGa4;ljNK7zZylKRPi6$E2!HXK;z1=tMy1|n#+5Nuvd2ilqXI}bXa(b#Q zkzmFW>DH^WXqx8dE*+M4_rd3Y7byC^4P`+Ss-ZkmBgzteuiS)FEV26QiQiogR!f`ksXKU z&wgk(|H0dstCa0YZ7bi`_L5v>Ud!c5mIc@Ho({^&zGvT6B`xhzMazn2I0MV*V3Tls z>|mAxP}3^~s4T@7<063AO)BLpTJ88SaI5ew6{&=V!DGDQYss(OnCq`;;VdzZ<7Nxj zg}L;aTX2W*npRpAKv$OoRlX~N;J@S*td8D;Y4(Xm>6-zhI8RYK4*@cB z?Zdp(aVrWe=t_}lj35Gn{`H?K;HP#()q*SA+^tdwNLN+AZze6ZHErTw88U3 ZGjSL(whd1F>@c@Lg%&9a{_Dig{{SPo;DG=D diff --git a/CODE/UTSM/include/utsm/block.h b/CODE/UTSM/include/utsm/block.h index 938552a..803fe16 100644 --- a/CODE/UTSM/include/utsm/block.h +++ b/CODE/UTSM/include/utsm/block.h @@ -6,6 +6,7 @@ #define DKM_BLOCK_MAX_DEVICES 8u typedef int (*dkm_block_read_fn)(void *ctx, u64 lba, u32 count, void *buffer); +typedef int (*dkm_block_write_fn)(void *ctx, u64 lba, u32 count, const void *buffer); typedef struct dkm_block_device_desc { const char *name; @@ -13,14 +14,17 @@ typedef struct dkm_block_device_desc { u64 sector_count; void *ctx; dkm_block_read_fn read; + dkm_block_write_fn write; } dkm_block_device_desc; typedef struct dkm_block_api { int (*register_device)(const dkm_block_device_desc *desc); u32 (*device_count)(void); int (*read)(u32 index, u64 lba, u32 count, void *buffer); + int (*write)(u32 index, u64 lba, u32 count, const void *buffer); u64 (*sector_size)(u32 index); const char *(*device_name)(u32 index); + int (*set_write_fn)(u32 index, dkm_block_write_fn fn); } dkm_block_api; void block_init(void); diff --git a/CODE/UTSM/include/utsm/deshab_ui.h b/CODE/UTSM/include/utsm/deshab_ui.h index ba60b97..fc39341 100644 --- a/CODE/UTSM/include/utsm/deshab_ui.h +++ b/CODE/UTSM/include/utsm/deshab_ui.h @@ -195,12 +195,12 @@ typedef long long du_i64; #define DU_ANIM_DELAY_NORMAL 100000u /* 标准动画 */ #define DU_ANIM_DELAY_FAST 40000u /* 快速反馈 */ -/* 弧线动画参数(DSK spinner 专用) */ +/* 弧线动画参数(DSK spinner 专用 — Sealed Arc Comet 设计) */ #define DU_SPINNER_RADIUS 48u -#define DU_SPINNER_THICKNESS 4u -#define DU_SPINNER_ARC_GAP 82u /* 每弧宽度(度) */ -#define DU_SPINNER_ARC_COUNT 4u -#define DU_SPINNER_SPEED 2u /* 每帧旋转度数 */ +#define DU_SPINNER_THICKNESS 5u +#define DU_SPINNER_HEAD_WIDTH 40u /* 弧头宽度(度) */ +#define DU_SPINNER_TAIL_LEN 220u /* 拖尾长度(度) */ +#define DU_SPINNER_SPEED 4u /* 每帧旋转度数 */ #define DU_SPINNER_SPRITE 128u /* 精灵缓冲边长 */ /* 渐变动画步进 */ @@ -673,12 +673,13 @@ static inline void du_draw_progress(du_context *ctx, /* =================================================================== * Spinner(加载弧) — DSK 启动加载动画 * - * 使用 "Sealed Arc" 四弧旋转设计,弧色取自色板。 + * 使用 "Sealed Arc Comet" 单弧彗星尾设计: + * 一个明亮的弧头 + 渐变拖尾,颜色从弧头色过渡到拖尾色。 * =================================================================== */ -/* 默认弧色(从亮到暗的青蓝色) */ +/* 默认弧色:[0]=弧头色(亮蓝), [1]=拖尾色(紫) */ #define DU_SPINNER_ARCS { \ - DP_SEAL_100, DP_SEAL_300, DP_SEAL_500, DP_SEAL_700 \ + DP_SEAL_300, DP_SEAL_700, DP_SEAL_500, DP_SEAL_100 \ } /* =================================================================== diff --git a/CODE/UTSM/kernel/block.c b/CODE/UTSM/kernel/block.c index 5e36527..f118f25 100644 --- a/CODE/UTSM/kernel/block.c +++ b/CODE/UTSM/kernel/block.c @@ -35,6 +35,13 @@ static int block_read_impl(u32 index, u64 lba, u32 count, void *buffer) { return dev->read(dev->ctx, lba, count, buffer); } +static int block_write_impl(u32 index, u64 lba, u32 count, const void *buffer) { + if (index >= g_device_count || !buffer || count == 0) return -1; + dkm_block_device_desc *dev = &g_devices[index]; + if (!dev->write) return -2; + return dev->write(dev->ctx, lba, count, buffer); +} + static u64 block_sector_size_impl(u32 index) { if (index >= g_device_count) return 0; return g_devices[index].sector_size; @@ -45,12 +52,20 @@ static const char *block_device_name_impl(u32 index) { return g_devices[index].name; } +static int block_set_write_fn_impl(u32 index, dkm_block_write_fn fn) { + if (index >= g_device_count) return -1; + g_devices[index].write = fn; + return 0; +} + static const dkm_block_api g_block_api = { .register_device = block_register_device_impl, .device_count = block_device_count_impl, .read = block_read_impl, + .write = block_write_impl, .sector_size = block_sector_size_impl, - .device_name = block_device_name_impl + .device_name = block_device_name_impl, + .set_write_fn = block_set_write_fn_impl }; const dkm_block_api *block_get_api(void) { diff --git a/CODE/UTSM/kernel/block.o b/CODE/UTSM/kernel/block.o index fc324ad374c5fd7b90eb3c1a9d8cece2bff9b419..41f66394f6b2db2794f6ea1f69940011d8d6a2d2 100644 GIT binary patch literal 3544 zcmb_dU1%It6uz4uyKSNyTd5I|j3}B2on+Hwlc-HMR@(`URn!l+KhjmmqW3%QP0YLxy@ z80p2zo$=~n$TVn`Hq9B8@1;3josCE7V0T1qNNw?2{PftFv213oP|y=yOBhwwR+ZUf zJJQmYJz4%H7&4Z>3i_WpggpN#NayO0P~6fy+Q#x~u-905cHVeXw%Dl7cV=pvvNf>4 zUGe|#c$Cq;%57t%B^|bW0h7wCC0DUJrM`d4m-+7CRJnwU;1Vdqar(K56Gx6`G|w(N ze&AiyoU#)LMlE~R$=ft(d$v`damtoGcc^aqc0O>utna*GZv*r0`EnpPffxNZGG8*w zMQzshe8(+o{r!4UPifs#K``S#-P>Dqf~oU4J?~EUmP)hX&w&}wJqvkhh5UeNT0^-( zD|ZljJJ6rB3M1x7>flhSZ!kBKHwROxq2b|V&)?+r5PZZf;#O@ZO0#I%2Dbwe0}mdo zVSt#phhZ^H+7}?3;IEJD-$)LC#5f&fFVJOj3~b3K8`s0}HT)xL?v`(13AoD8wk#vlE|J#1)Wx8}CmT_mf{6$ooh~@gV8Af5`bWq}QG#9Qg^-QM^t% z$7lXr1H4K&#=(5}JiM>qd@epx@NTj{Q*e#!D+=C8_LmCIz1oQ2*oXaOe@jyB!;J>` zFNAYHIsacH{C%KvfB3^<{$b|Pxx{s&`~>05KS}%t8t_wutNU`Y0d7U&jue7~~t z1rqo=Oxxu^@9A#95jLaDaN(qZYUB{O& zYg!gOnZ=N&=Y84UYwRv_RDiEGcaZSQ}$eH0NN-KWGD3`HT^$`M`0tIcko}> z9fFg%(UGB;@})qG?{B82Nh#3zWt`6;+vtmTNSXnXAJWs*N6F#$f}!|)^SSLMOs(M( zt;^?`!ftze3`hWT=w|{+_CKrO$i=}D?=RGqGKEG7soyK-FN45O5}bFce}jmh5)tdi z9Hey*quC7k`3+Xg`MM9l?zfiaYGbbdHr b%pZs9-vfZ!JLIj>`kUl{0?!V|7%g5Ppsw;y{Z-B_I+)*#m-7shikMoCav?(9&*1ppj_lp)zK@yLPss%%)Fg(wri&#@vQaC zeDl3|Gqdl#U3g~pWM3pActpfev12g`a&Sk_NHrt&0Q0QY{Bg6NecI+Gs@Y%gKQVGb zNWZqZj&^ns(xGzTwk|KGSSd&OhVq=bGCy ztz(d$*Dr1IY0Yn?In%1ggLJTmf_C#uZRw-<`RSLYbJ>kTr~a1A7R%4b+GGz_KKCZI zm0Mow$s@RO?Eqx*;ZISmwR{6@ZDrltr>#D9Lwi-WRBJ5^XWQS&RzPeuF|v#_8IK|i zHMgK6i&`s&O@wwQ*Rvbg%RBkcKRtW;__JBXwTgDlb1y4)#r6cFrd78Mi=38gnH`T^ zF|Edtj#;w|&vA1#`xUDTG@MHnPZo)3{nufX^h!~wTW-yEDoQG)Ce^gEf8O(|wI@bL zi?%m^DX$t%d9+lj`+oG4Xr57bPnCy5K#4L|_IF*1nMVT?~u;q^*MNgWnk0zmgmWiE)O= z&d^~z1vc^(vT;2e@4_SF5PnjkLgWZvBwQi9PWZJDj_zn6f1*nf6>;8k#_`V(Z;Z_#B_g6X?boxSw%yFwWs_59g`HBUD#(n3Yc z%js1cGW2ssUB&A@r<*2x7m7YlHG~SEE>F*cyj+%2w!w8w-P2`R^Hw804&9LmvXg3( zU)BGTTQED?Bf_TxKB&_BWJ<^sc%LE0_Zssuq^yS~@P1()y73HU7$A8aK^WI?6T-l= zfhzAq-e04Hb=5%g=Kf{<5%41=1oftyz3_zV{|8K++~WWM diff --git a/CODE/UTSM/kernel/dsk_loader.c b/CODE/UTSM/kernel/dsk_loader.c index ff6ea0f..837adec 100644 --- a/CODE/UTSM/kernel/dsk_loader.c +++ b/CODE/UTSM/kernel/dsk_loader.c @@ -152,7 +152,8 @@ static struct limine_file *dsk_find_module(void) { /* ---- FAT32 block-provider file reader ---- */ static u8 g_dsk_fat32_disk[65536]; /* 128-sector BPB+FAT+root dir buffer */ static u8 g_dsk_fat32_cluster[4096]; /* 8-sector cluster buffer */ -static u8 g_dsk_fat32_filedata[65536]; /* file data buffer */ +/* 实机要求: 文件缓冲区足够大容纳 deshab.elf (~1.5MB) */ +static u8 g_dsk_fat32_filedata[2097152]; /* 2MB file data buffer */ static int dsk_load_from_block_fat32(const void **out_addr, u64 *out_size) { const dkm_kernel_api *api = dkm_get_kernel_api(); diff --git a/CODE/UTSM/kernel/dsk_loader.o b/CODE/UTSM/kernel/dsk_loader.o index 12e1f0ae6272c7f307dd05129867d17d1a0349d6..7beab38746c921ad2d8ebb76e8f922f31b87cd6f 100644 GIT binary patch delta 40 vcmX?Me!_gh97ctWbN8?_Dr}D8@MC1O-@KA@A~TR@&7055sJMBxlq@3vB7zKS delta 40 tcmX?Me!_gh97c(abN8?_GH#CI@M8p0D>)}J11W3Xd|pPT&8wwk837j%3&;Qf diff --git a/CODE/UTSM/kernel/main.o b/CODE/UTSM/kernel/main.o index 88fb8e05c332fab8f55139add87de49f34d5f9d6..84e874674cedccabad51796695c82a9b1dcef97e 100644 GIT binary patch delta 298 zcmX>hzC(P124lrW%?*r`?=gx^{>k{Bi-CcOk%57Q;p6|w7nwvRvoMQD-e6#05Mp2g zk`V9_N=HmKWEN-K3nC{cFiS9|fcg28Co=0#z5(RBf@KVVtYu)90*eIWF|e8`V6p;C zHf?TXF=t}jJb5RZK2Z84n>*v($%gFxj1rR%vWqjmnS7Joosn^}B1bWEN>S0|J`UB* z2RT?6Svi5uWCprXm@|L_;vkL5FFDH@CrnP{QfHK$+{q=+s5^NjmpNnH6v*9(V-#1zOf1^MMVlAsmbpcKQOXS ze#oTHcz3cOv-so}%o2=;COb0gGiCxwamEr5Ie7t4Gr(`URe`5~J-192f1zYIu0&I4xj=)pho7&jhw=q5g;xQ=uW=LS #include #include +#include int memcmp(const void *a, const void *b, usize len); usize strlen(const char *s); int utsm_selftest_run(void) { - utsm_process_context process; - utsm_process_create_test(&process, 1); + log_info("[UTSM] selftest enter"); + + /* utsm_process_context is ~8KB (256 capabilities × 32 bytes). + * Allocate from arena instead of stack to avoid kernel stack overflow. */ + utsm_process_context *process = (utsm_process_context *)kmem_alloc(sizeof(utsm_process_context)); + if (!process) { + log_error("[UTSM] selftest: failed to allocate process context"); + return UTSM_ERR_NO_MEMORY; + } + utsm_process_create_test(process, 1); utsm_capability cap; - int status = utsm_create_segment(&process, UTSM_PAGE_SIZE, UTSM_SEG_F_READ | UTSM_SEG_F_WRITE | UTSM_SEG_F_STRONG_RECOVERY, &cap); + int status = utsm_create_segment(process, UTSM_PAGE_SIZE, UTSM_SEG_F_READ | UTSM_SEG_F_WRITE | UTSM_SEG_F_STRONG_RECOVERY, &cap); if (status != UTSM_OK) { log_error("[UTSM] selftest create segment failed"); return status; diff --git a/CODE/UTSM/test/utsm_selftest.o b/CODE/UTSM/test/utsm_selftest.o index 9242949505345d9a082ef81b9443661366d93443..66939972a9bd6858a1ec86fe14d17b8e6f1f04f3 100644 GIT binary patch literal 2792 zcmbtV-)kII6uxPyZTtaMu?mU|h@e6y*`(PteXyH{w1Xy+kOtHew|8gm{%~h@)|tDl zc_@v97M3LtQTzkM2j8r3(TBE@VC;jSpsFrV6U*Ar%=W|JKEdlqHT^10dvV}{=R6f-78x=I|$#!+sz9G z?X0V}uQ_-b~>HCb2TTJ!S}TUN_Qz^ZT$OxQk4+Y2tv5E}qWV?yB!%vJm?m!D-gDOa z<&A@Bj_YZnx^{EDsHm9Ct=(aO&M%!?oLe?R;TEL`r6Fok1T2A`GK#$73dfMX!Clw4 zxfDh{@NE%>hV4Vhdomeg*nvP=C`ulPk^*x?Smp(zAwv(2IEs40^MjRc2?vBO1r^YV zD@Zx?tLh-&mkhg7FN?qs?>4v_8g-Xf_Eo4+?6R<{MlZVC2B_UhOBtPcmC)nTE~~uz zBSDebF0Yl0iy{ase$5ygGc#t^c(E*HJv=osQmV*uqhQ*;H{!Y%a~cIYRzx3H&zczmdRI|1S`ZdG$K03I6ls*EPQ0 z&-WAjY4WdWe7&E{41~+gXh7r4&C}G*$J05FGoRrU!WqpXMoGv#4eb~ps={2qlovtZ z2Mh+c?bR6qm0Hn{*=i8xgGP;oGH^wWnKfSu^X%(O!=dDMm6qKh2L2KiEg(I)1dU{)$caPVMjd z_{}4RR$n=C)O=NE$JB-_#^Q6#k*~}h1Yvzo!wKIF+@i(xbZppfU{Pa?d}V&1Lf<5- zaOEod0vzCeR1wI&Oid{!a22QQH8@v$ox0JlseQN~12#C@@xiRZ)m^Ip3Q)g0nd=uI UP>U2bvMT>P1)#x_l#c4(e~t@0-2eap literal 2504 zcmbW2PiP!f9LHZ8tyTkyy$C{?OG_0x>88mh@u0h6bgD^7N#muao3}G>cGt}8Y-ir~ z&!IG>C@xDNc+is|;#EX%7L0|I25(V3Xc6=xHds(EdJ)#&Z|3*golbWy{@~^J-sgRP zzxUh6n_sTZ&A+m5WJIuyh!@0Q#Z-uQ9~sO`@w6lkfO6UD{91lv$+~uL6R5TE;cBnf z+rkW1=jXd9v^ExYx5Se%xN#6bOy9n#$I6}C*3J%Uem_N%B%-rz^|r0<++C}?@XLI6 zZg;-B@Wa>ZAhdRFqu%P=Sv*}nU0zJ|*KZk+@6aG$j9>2jX@2u`6!@B;*`rw3E0b8%7BePXm8|}@cvSB4XGbm}VjwdBQckfM{Z(P}Y z@UStK%nsynA#;Vl_nrfGcKOWG!io_o&($i@h8-%Y6|8H%YHGuk4Np13QBhr1jkb<_ z*ph$@U-?0JxgRL9i7ti>$V2hNH-j~f3gtz^ZnWwuG}QUF^dh6>$wpJFOL~aJt}A=Z z7)1ArhuWRIBjY{45&2TvbxwMJBxDq}C!00nf(oNX&@?6{%z{}oj@GqqMbD3q*BZLs zu9|k>k9*#QB>m+{xi)4qwUP zpXKmFz|rs~aQq8T7;O?E7_x_9Fn^KhL%rS!PRd49|2 zKc@A)ls5wUej--Xl&(-aOaMulc|onB!Y~L0v_#u) z2?UL%8zgFOF_p006p;=+)f8qk(8_%E)bg=NOM6Y2*i0(YaiHtelCZdaCR6NO_vbQg zVL~b`tKcvDu@3`BYKgdD7U&lKzxxJ4M~8%ev_FCI|B%!^U3Z_L3>nG$yhJnZQ@oMw zRTztJti%HHs|dkL^fBW%gj4irPbW^``@kF%v}X4?75W5u=DcKo7&dTzoCV}>(z$Mi za~%73V4vq{>5*ZVIz;id) { idx = i; break; } } if (idx < 0) return; + + /* Window close animation - shrinking rectangle */ + { + int wx = w->x, wy = w->y, ww = w->w, wh = w->h; + w->visible = 0; + for (int step = 5; step >= 0; step--) { + int scale = (step + 1) * 100 / 6; + int aw = ww * scale / 100; + int ah = wh * scale / 100; + int ax = wx + (ww - aw) / 2; + int ay = wy + (wh - ah) / 2; + cursor_restore_bg(); + redraw_all(); + /* redraw_all 末尾已绘制光标,这里先擦除以保证保存的背景干净(不含光标像素) */ + cursor_restore_bg(); + du_rect_outline(&g_fb, ax, ay, aw, ah, DS_DARK_ACCENT, DU_RADIUS_SM); + cursor_save_bg(g_mouse_x, g_mouse_y); + cursor_draw(g_mouse_x, g_mouse_y); + anim_delay_poll_mouse(16); + } + } + /* 调用应用的 on_destroy */ if (w->app_id >= 0 && w->app_id < g_app_count && g_apps[w->app_id].on_destroy && w->app_state) { g_apps[w->app_id].on_destroy(w->app_state); @@ -474,7 +516,20 @@ static void draw_taskbar(void) { if (w->minimized) continue; u32 btn_bg = w->focused ? DS_DARK_ACCENT : DP_ABYSS_600; du_fill_rounded_rect(&g_fb, wx, tb_y + 4, 100, 32, btn_bg, DU_RADIUS_SM); - du_draw_string(&g_fb, w->title, wx + 4, tb_y + 8, + /* Truncate title to fit button width (100px - 8px padding = ~11 chars) */ + char truncated[16]; + int max_chars = 11; + int tlen = 0; + while (w->title[tlen] && tlen < max_chars) { truncated[tlen] = w->title[tlen]; tlen++; } + if (tlen == max_chars && w->title[tlen]) { + /* Add ellipsis */ + if (tlen > 8) tlen = 8; + truncated[tlen++] = '.'; + truncated[tlen++] = '.'; + truncated[tlen++] = '.'; + } + truncated[tlen] = 0; + du_draw_string(&g_fb, truncated, wx + 4, tb_y + 8, DS_DARK_TEXT_PRIMARY, btn_bg, DU_ASCII_STEP); wx += 104; if (wx > (int)g_fb_w - 200) break; @@ -507,7 +562,7 @@ static void draw_taskbar(void) { static void draw_desktop_icons(void) { for (int i = 0; i < g_icon_count; i++) { desktop_icon *ic = &g_icons[i]; - int cx = ic->x; + int cx = ic->x + (DESKTOP_ICON_W - 32) / 2; /* center icon in slot */ int cy = ic->y; /* 根据应用 ID 画不同图标 */ switch (ic->app_id) { @@ -520,8 +575,8 @@ static void draw_desktop_icons(void) { /* 标签文字 */ int label_len = 0; while (ic->label[label_len]) label_len++; - int label_x = cx + (32 - label_len * (int)DU_ASCII_STEP) / 2; - if (label_x < cx) label_x = cx; + int label_x = ic->x + (DESKTOP_ICON_W - label_len * (int)DU_ASCII_STEP) / 2; + if (label_x < ic->x) label_x = ic->x; du_draw_string(&g_fb, ic->label, label_x, cy + 36, DS_DARK_TEXT_PRIMARY, DS_DARK_BG_PRIMARY, DU_ASCII_STEP); } @@ -531,43 +586,94 @@ static void draw_desktop_icons(void) { * PS/2 鼠标处理 * ============================================================ */ +/* PS/2 控制器等待 — 输入缓冲区空(可写) */ +static int ps2_wait_write(void) { + for (int t = 0; t < 200000; t++) { + if (!(inb(0x64) & 0x02)) return 0; + __asm__ volatile("pause"); + } + return -1; +} + +/* PS/2 控制器等待 — 输出缓冲区满(可读) */ +static int ps2_wait_read(void) { + for (int t = 0; t < 200000; t++) { + if (inb(0x64) & 0x01) return 0; + __asm__ volatile("pause"); + } + return -1; +} + +/* 排干输出缓冲区中所有残留数据(带超时) */ +static void ps2_drain(void) { + for (int i = 0; i < 16; i++) { + if (!(inb(0x64) & 0x01)) break; + inb(0x60); + } +} + static void ps2_mouse_init(void) { - /* 启用 AUX 设备 */ - for (int t = 0; t < 100000; t++) { if (!(inb(0x64) & 2)) break; } + /* 1. 刷新固件/上一阶段留下的残留数据 */ + ps2_drain(); + + /* 2. 启用 AUX(鼠标)端口 */ + ps2_wait_write(); outb(0x64, 0xA8); - /* 启用 AUX IRQ */ - for (int t = 0; t < 100000; t++) { if (!(inb(0x64) & 2)) break; } + + /* 3. 读取控制器配置字节 */ + ps2_wait_write(); outb(0x64, 0x20); - for (int t = 0; t < 100000; t++) { if (inb(0x64) & 1) break; } + ps2_wait_read(); u8 cfg = inb(0x60); - cfg |= 0x02; /* enable AUX IRQ12 */ + + /* 4. 设置配置:bit5=0(启用 AUX 时钟), bit1=1(启用 AUX IRQ12), bit6=1(Set2→Set1 转换) */ cfg &= ~0x20; /* enable AUX clock */ - for (int t = 0; t < 100000; t++) { if (!(inb(0x64) & 2)) break; } + cfg |= 0x02; /* enable AUX IRQ12 */ + cfg |= 0x40; /* enable Set2→Set1 translation */ + + /* 5. 写回控制器配置 */ + ps2_wait_write(); outb(0x64, 0x60); - for (int t = 0; t < 100000; t++) { if (!(inb(0x64) & 2)) break; } + ps2_wait_write(); outb(0x60, cfg); - /* 复位鼠标 */ - for (int t = 0; t < 100000; t++) { if (!(inb(0x64) & 2)) break; } + + /* 6. 复位鼠标 (0xFF) — 响应为 ACK(0xFA) + 自检(0xAA) + 设备ID(0x00),共 3 字节 */ + ps2_wait_write(); outb(0x64, 0xD4); - for (int t = 0; t < 100000; t++) { if (!(inb(0x64) & 2)) break; } + ps2_wait_write(); outb(0x60, 0xFF); - for (int t = 0; t < 100000; t++) { if (inb(0x64) & 1) break; } - inb(0x60); /* ACK */ - /* 启用 streaming */ - for (int t = 0; t < 100000; t++) { if (!(inb(0x64) & 2)) break; } + /* 排干所有复位响应字节(最多 8 字节,带超时) */ + for (int i = 0; i < 8; i++) { + if (ps2_wait_read() != 0) break; + inb(0x60); + } + + /* 7. 启用数据流模式 (0xF4) — 响应为 ACK(0xFA) */ + ps2_wait_write(); outb(0x64, 0xD4); - for (int t = 0; t < 100000; t++) { if (!(inb(0x64) & 2)) break; } + ps2_wait_write(); outb(0x60, 0xF4); - for (int t = 0; t < 100000; t++) { if (inb(0x64) & 1) break; } - inb(0x60); /* ACK */ + /* 排干 ACK */ + for (int i = 0; i < 4; i++) { + if (ps2_wait_read() != 0) break; + inb(0x60); + } + + /* 8. 最终刷新:丢弃任何杂散字节,确保数据包从干净状态开始 */ + ps2_drain(); + + /* 重置鼠标数据包解析状态 */ + g_mouse_idx = 0; + g_mouse_has_pkt = 0; + slog("mouse init ok"); } static int ps2_mouse_poll(void) { u8 st = inb(0x64); if (!(st & 1)) return 0; + if (!(st & 0x20)) return 0; /* 不是鼠标数据(键盘数据留给键盘处理) */ u8 data = inb(0x60); - if (!(st & 0x20)) return 0; /* 不是鼠标数据 */ g_mouse_buf[g_mouse_idx++] = data; if (g_mouse_idx < 3) return 0; @@ -578,11 +684,8 @@ static int ps2_mouse_poll(void) { int dx = (int)(i8)g_mouse_buf[1]; int dy = (int)(i8)g_mouse_buf[2]; - if (g_mouse_buf[0] & 0x10) dx = -dx; /* X sign */ - /* 注意:Y 轴方向(鼠标 Y 向上为正,屏幕 Y 向下为正) */ - if (!(g_mouse_buf[0] & 0x20)) dy = -dy; /* Y sign */ - else dy = -dy; - dy = -dy; /* 鼠标 Y 翻转 */ + /* (i8) 转换已处理符号位,无需再检查 sign bits */ + dy = -dy; /* PS/2 Y 向上为正,屏幕 Y 向下为正,需翻转 */ g_mouse_x += dx; g_mouse_y += dy; @@ -591,7 +694,10 @@ static int ps2_mouse_poll(void) { if (g_mouse_x >= (int)g_fb_w - CURSOR_SIZE) g_mouse_x = (int)g_fb_w - CURSOR_SIZE; if (g_mouse_y >= (int)g_fb_h - CURSOR_SIZE) g_mouse_y = (int)g_fb_h - CURSOR_SIZE; + int old_btn = g_mouse_btn; g_mouse_btn = (g_mouse_buf[0] & 0x01) ? 1 : 0; + /* Only signal redraw if something visual changed */ + if (dx == 0 && dy == 0 && g_mouse_btn == old_btn) return 0; g_mouse_has_pkt = 1; return 1; } @@ -1210,6 +1316,24 @@ static void launch_app(int app_id) { win->app_state = app->on_create(&ctx); win->dirty = 1; + + /* Window open animation - expanding rectangle */ + for (int step = 0; step < 6; step++) { + int scale = (step + 1) * 100 / 6; + int aw = win->w * scale / 100; + int ah = win->h * scale / 100; + int ax = win->x + (win->w - aw) / 2; + int ay = win->y + (win->h - ah) / 2; + cursor_restore_bg(); + redraw_all(); + /* redraw_all 末尾已绘制光标,这里先擦除以保证保存的背景干净(不含光标像素) */ + cursor_restore_bg(); + du_rect_outline(&g_fb, ax, ay, aw, ah, DS_DARK_ACCENT, DU_RADIUS_SM); + cursor_save_bg(g_mouse_x, g_mouse_y); + cursor_draw(g_mouse_x, g_mouse_y); + anim_delay_poll_mouse(16); + } + slog("app launched"); } @@ -1229,13 +1353,16 @@ static void redraw_all(void) { desktop_window *w = &g_windows[i]; if (w->minimized || !w->visible) continue; + /* 窗口装饰(先画框架作为窗口背景:主体、标题栏、边框) */ + draw_window_frame(w); + /* 窗口客户区背景 */ int cx = w->x + BORDER_W; int cy = w->y + TITLEBAR_H; int cw = w->w - 2 * BORDER_W; int ch = w->h - TITLEBAR_H - BORDER_W; - /* 调用应用绘制 */ + /* 调用应用绘制(在框架之上绘制客户区内容) */ if (w->app_id >= 0 && w->app_id < g_app_count && g_apps[w->app_id].on_draw && w->app_state) { app_ctx ctx; ctx.fb = &g_fb; @@ -1247,9 +1374,6 @@ static void redraw_all(void) { ctx.kernel_api = g_kernel_api; g_apps[w->app_id].on_draw(w->app_state, &ctx); } - - /* 窗口装饰(在应用内容之上) */ - draw_window_frame(w); } /* 任务栏 */ @@ -1301,18 +1425,17 @@ void dsk_entry(const dsk_boot_context *ctx) { /* 轮询 PS/2 鼠标 */ if (ps2_mouse_poll()) { - need_redraw = 1; - - /* 拖拽处理 */ + /* 拖拽处理 - 需要全屏重绘 */ if (g_dragging && g_drag_win >= 0) { desktop_window *w = win_find(g_drag_win); if (w) { w->x = g_mouse_x - g_drag_off_x; w->y = g_mouse_y - g_drag_off_y; } + need_redraw = 1; } - /* 鼠标点击事件 */ + /* 鼠标点击事件 - 需要全屏重绘 */ if (g_mouse_btn) { /* 检查任务栏点击 */ int tb_y = (int)g_fb_h - TASKBAR_H; @@ -1431,6 +1554,11 @@ next: if (need_redraw) { cursor_restore_bg(); redraw_all(); + } else if (g_mouse_has_pkt) { + /* 鼠标移动但无需全屏重绘:只更新光标位置 */ + cursor_restore_bg(); + cursor_save_bg(g_mouse_x, g_mouse_y); + cursor_draw(g_mouse_x, g_mouse_y); } __asm__("pause"); diff --git a/CODE/dsk/MAKEFILE b/CODE/dsk/MAKEFILE index 164a6cc..762b8c0 100644 --- a/CODE/dsk/MAKEFILE +++ b/CODE/dsk/MAKEFILE @@ -7,7 +7,10 @@ OUT := $(ROOT)/SYSTEM/system/deshab64/deshab.elf CFLAGS := -target x86_64-unknown-none -std=c11 -ffreestanding -fno-builtin -fno-stack-protector -fpie -mno-red-zone -mno-sse -mno-sse2 -mno-mmx -msoft-float -m64 -Wall -Wextra -I../UTSM/include -O2 LDFLAGS := -nostdlib -static -pie -z max-page-size=0x1000 -T linker.ld -C_SOURCES := $(wildcard *.c) +# logo_data.c is #included directly into main.c (the DSK PIE loader only +# handles R_X86_64_RELATIVE, so the logo array must be file-local to main.o +# rather than a cross-unit symbol). Exclude it from standalone compilation. +C_SOURCES := $(filter-out logo_data.c, $(wildcard *.c)) OBJECTS := $(C_SOURCES:.c=.o) .PHONY: all clean diff --git a/CODE/dsk/linker.ld b/CODE/dsk/linker.ld index 78c6294..473e5fc 100644 --- a/CODE/dsk/linker.ld +++ b/CODE/dsk/linker.ld @@ -2,26 +2,23 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(5); /* R-X */ - rodata PT_LOAD FLAGS(4); /* R-- */ - data PT_LOAD FLAGS(6); /* RW- */ + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS { . = 0x1000; - - .text : ALIGN(4K) { - *(.text*) - } :text - - .rodata : ALIGN(4K) { - *(.rodata*) - } :rodata - + .text : ALIGN(4K) { *(.text*) } :text + .rodata : ALIGN(4K) { *(.rodata*) } :rodata .data : ALIGN(4K) { *(.data*) + *(.data.rel.ro*) *(COMMON) *(.bss*) } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/dsk/main.c b/CODE/dsk/main.c index 9eac4bb..7c6b497 100644 --- a/CODE/dsk/main.c +++ b/CODE/dsk/main.c @@ -12,6 +12,7 @@ typedef unsigned long long u64; typedef long long i64; typedef int (*block_read_fn)(u32 index, u64 lba, u32 count, void *buf); +typedef int (*block_write_fn)(u32 index, u64 lba, u32 count, const void *buf); static void sputc(char c) { for(unsigned i=0;i<100000;i++){if(inb(COM1+5)&0x20)break;} outb(COM1,(u8)c); } static void swrite(const char *s) { while(*s){if(*s=='\n')sputc('\r');sputc(*s++);} } @@ -61,11 +62,38 @@ typedef struct { u64 offset; u64 info; i64 addend; } elf64_rela; static u64 g_fb_addr, g_fb_w, g_fb_h, g_fb_p; static block_read_fn g_block_read; +static block_write_fn g_block_write; +static u64 g_tsc_per_ms = 0; static u8 g_disk[131072]; static u8 g_cluster[4096]; static u8 g_fdata[262144]; static int fat32_read_sectors(u32 lba, u32 count, u8 *out) { return g_block_read ? g_block_read(0,lba,count,out) : -1; } +static int fat32_write_sectors(u32 lba, u32 count, const u8 *buf) { return g_block_write ? g_block_write(0,lba,count,buf) : -1; } + +/* ---- TSC-based timing ---- */ +static u64 rdtsc_dsk(void) { + u32 lo, hi; + __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((u64)hi << 32) | lo; +} + +static void tsc_calibrate_dsk(void) { + outb(0x43, 0x30); /* ch0, lo+hi, mode 0, binary */ + outb(0x40, 0x7c); /* 11932 low = ~10ms */ + outb(0x40, 0x2e); /* 11932 high */ + u64 tsc_start = rdtsc_dsk(); + u16 prev = 0; u64 loops = 0; + for (;;) { + outb(0x43, 0x00); + u16 cur = (u16)inb(0x40) | ((u16)inb(0x40) << 8); + if (cur > prev && loops > 10) break; + prev = cur; loops++; + } + u64 tsc_end = rdtsc_dsk(); + g_tsc_per_ms = (tsc_end - tsc_start) / 10; + logh("[DSK] tsc_per_ms=", g_tsc_per_ms); +} static u32 blend_color(u32 c1, u32 c2, u32 a) { u32 na = 256 - a; @@ -96,6 +124,81 @@ static void dsk_fill_gradient_rect(u32 *fb, i64 x, i64 y, i64 w, i64 h) { } } +/* ---- Spinner animation: comet-tail arc, clockwise, double-buffered ---- */ +/* sin×127 lookup table, 256 entries (1.40625° each). cos(d) = sin(d+64). */ +static const i8 g_sin_tab[256] = { + 0,3,6,9,12,16,19,22,25,28,31,34,37,40,43,46, + 49,51,54,57,60,63,65,68,71,73,76,78,81,83,85,88, + 90,92,94,96,98,100,102,104,106,107,109,111,112,113,115,116, + 117,118,120,121,122,122,123,124,125,125,126,126,126,127,127,127, + 127,127,127,127,126,126,126,125,125,124,123,122,122,121,120,118, + 117,116,115,113,112,111,109,107,106,104,102,100,98,96,94,92, + 90,88,85,83,81,78,76,73,71,68,65,63,60,57,54,51, + 49,46,43,40,37,34,31,28,25,22,19,16,12,9,6,3, + 0,-3,-6,-9,-12,-16,-19,-22,-25,-28,-31,-34,-37,-40,-43,-46, + -49,-51,-54,-57,-60,-63,-65,-68,-71,-73,-76,-78,-81,-83,-85,-88, + -90,-92,-94,-96,-98,-100,-102,-104,-106,-107,-109,-111,-112,-113,-115,-116, + -117,-118,-120,-121,-122,-122,-123,-124,-125,-125,-126,-126,-126,-127,-127,-127, + -127,-127,-127,-127,-126,-126,-126,-125,-125,-124,-123,-122,-122,-121,-120,-118, + -117,-116,-115,-113,-112,-111,-109,-107,-106,-104,-102,-100,-98,-96,-94,-92, + -90,-88,-85,-83,-81,-78,-76,-73,-71,-68,-65,-63,-60,-57,-54,-51, + -49,-46,-43,-40,-37,-34,-31,-28,-25,-22,-19,-16,-12,-9,-6,-3, +}; +static i64 dsk_isin(u32 deg) { return (i64)g_sin_tab[deg & 255]; } +static i64 dsk_icos(u32 deg) { return (i64)g_sin_tab[(deg + 64) & 255]; } + +#define SPIN_R 64 +#define SPIN_ARC 110 /* comet-tail span (of 256) ≈ 155° */ +#define SPIN_THICK 3 /* half-thickness of arc band */ +#define SPIN_BOX (SPIN_R + SPIN_THICK + 2) +static u32 g_spin_bg[(SPIN_BOX*2+1) * (SPIN_BOX*2+1)]; + +static void spinner_save_bg(u32 *fb, i64 cx, i64 cy) { + for (i64 dy = -SPIN_BOX; dy <= SPIN_BOX; dy++) { + for (i64 dx = -SPIN_BOX; dx <= SPIN_BOX; dx++) { + i64 x = cx + dx, y = cy + dy; + u32 px = (x >= 0 && (u64)x < g_fb_w && y >= 0 && (u64)y < g_fb_h) + ? ((u32*)((u8*)fb + (u64)y * g_fb_p))[(u64)x] + : dsk_bg_at_y(y); + g_spin_bg[(dy + SPIN_BOX) * (SPIN_BOX*2+1) + (dx + SPIN_BOX)] = px; + } + } +} + +static void spinner_restore_bg(u32 *fb, i64 cx, i64 cy) { + for (i64 dy = -SPIN_BOX; dy <= SPIN_BOX; dy++) { + i64 y = cy + dy; + if (y < 0 || (u64)y >= g_fb_h) continue; + u32 *line = (u32*)((u8*)fb + (u64)y * g_fb_p); + for (i64 dx = -SPIN_BOX; dx <= SPIN_BOX; dx++) { + i64 x = cx + dx; + if (x < 0 || (u64)x >= g_fb_w) continue; + line[(u64)x] = g_spin_bg[(dy + SPIN_BOX) * (SPIN_BOX*2+1) + (dx + SPIN_BOX)]; + } + } +} + +/* Draw comet-tail arc: head at (base+SPIN_ARC) brightest, tail at base fading out. + * Clockwise rotation by advancing `base`. Double-buffered via save/restore. */ +static void spinner_draw(u32 *fb, i64 cx, i64 cy, u32 base, u32 head_color) { + u32 bg_ref = dsk_bg_at_y(cy); + for (u32 d = 0; d < SPIN_ARC; d++) { + u32 ang = (base + d) & 255; + i64 ic = dsk_icos(ang), is = dsk_isin(ang); + u32 alpha = ((d + 1) * 255) / SPIN_ARC; /* tail→head: 0→255 */ + u32 color = blend_color(bg_ref, head_color, alpha); + for (i64 t = -SPIN_THICK; t <= SPIN_THICK; t++) { + i64 r = SPIN_R + t; + if (r <= 0) continue; + i64 x = cx + (r * ic) / 127; + i64 y = cy + (r * is) / 127; + if (x < 0 || (u64)x >= g_fb_w || y < 0 || (u64)y >= g_fb_h) continue; + u32 *line = (u32*)((u8*)fb + (u64)y * g_fb_p); + line[(u64)x] = color; + } + } +} + static int fat32_find_entry(const u8 *clus, u32 clus_sectors, const char *target, u32 *out_clus, u32 *out_size) { const fat32_de *dir = (const fat32_de *)clus; for (u32 e=0; e*32 < clus_sectors*512; e++) { @@ -174,17 +277,238 @@ static int fat32_read_root_file(const char *name11, u8 **out_data, u32 *out_size return 0; } -static int dsk_check_firstinit(int *is_first) { +/* Write a file to the FAT32 root directory by 11-char 8.3 name. + * If the file exists, its content is replaced. If not, a new entry is created. + * Uses g_disk (256-sector buffer) which must already contain the BPB+FAT+root. + * Returns 0 on success. */ +static int fat32_write_root_file(const char *name11, const u8 *data, u32 size) { + u8 *disk = g_disk; + const fat32_bpb *bpb = (const fat32_bpb *)disk; + if (bpb->boot_sig != 0xAA55 || bpb->bps != 512) return -1; + u32 spc = bpb->spc; + u32 fat_lba = bpb->rsvd; + u32 fat_sectors = bpb->spf; + u32 data_lba = bpb->rsvd + (u32)bpb->fc * bpb->spf; + u32 fat_byte_off = bpb->rsvd * 512; + u32 root_clus = bpb->root_clus; + u32 cluster_bytes = spc * 512; + + /* 1. Re-read BPB+FAT to ensure g_disk is fresh */ + if (fat32_read_sectors(0, 256, disk) != 0) return -2; + + /* 2. Find file entry in root directory */ + u32 root_lba = data_lba + (root_clus - 2) * spc; + u8 *root_buf = disk + (u64)root_lba * 512; + u32 max_entries = cluster_bytes / 32; + fat32_de *dir = (fat32_de *)root_buf; + int free_entry = -1; + u32 existing_clus = 0; + int found = 0; + for (u32 e = 0; e < max_entries; e++) { + if (dir[e].name[0] == 0) { if (free_entry < 0) free_entry = (int)e; break; } + if ((u8)dir[e].name[0] == 0xE5) { if (free_entry < 0) free_entry = (int)e; continue; } + if (dir[e].attr == 0x0F) continue; + if (dir[e].attr & 0x08) continue; + if (neq11(dir[e].name, name11)) { + existing_clus = r16((const u8*)&dir[e].clow) | ((u32)r16((const u8*)&dir[e].chigh) << 16); + found = 1; + break; + } + } + + /* 3. Allocate or reuse clusters */ + u32 bytes_needed = size > 0 ? size : 1; + u32 clusters_needed = (bytes_needed + cluster_bytes - 1) / cluster_bytes; + u32 first_clus = 0; + u32 prev_clus = 0; + + if (found && existing_clus >= 2) { + /* Reuse existing chain, extend or shrink as needed */ + first_clus = existing_clus; + u32 cur = existing_clus; + u32 count = 0; + while (cur >= 2 && cur < 0x0FFFFFF8 && count < clusters_needed) { + prev_clus = cur; + u32 fo = fat_byte_off + cur * 4; + if (fo + 4 > sizeof(g_disk)) break; + cur = r32(disk + fo) & 0x0FFFFFFF; + count++; + } + /* If we need more clusters, allocate them */ + while (count < clusters_needed) { + /* Find a free cluster in FAT */ + u32 newc = 0; + for (u32 c = 2; c < (fat_sectors * 512) / 4; c++) { + u32 fo = fat_byte_off + c * 4; + if (fo + 4 > sizeof(g_disk)) break; + if ((r32(disk + fo) & 0x0FFFFFFF) == 0) { newc = c; break; } + } + if (newc == 0) { logl("[DSK] fat32 write: no free clusters"); return -3; } + /* Link previous cluster to new */ + u32 pfo = fat_byte_off + prev_clus * 4; + if (pfo + 4 <= sizeof(g_disk)) { + disk[pfo] = (u8)(newc & 0xFF); + disk[pfo+1] = (u8)((newc >> 8) & 0xFF); + disk[pfo+2] = (u8)((newc >> 16) & 0xFF); + disk[pfo+3] = (u8)((newc >> 24) & 0x0F); + } + prev_clus = newc; + count++; + } + /* Terminate the chain */ + if (prev_clus >= 2) { + u32 fo = fat_byte_off + prev_clus * 4; + if (fo + 4 <= sizeof(g_disk)) { + disk[fo] = 0xF8; disk[fo+1] = 0xFF; disk[fo+2] = 0xFF; disk[fo+3] = 0x0F; + } + } + /* Free excess clusters from the old chain */ + u32 next = 0; + u32 fo = fat_byte_off + prev_clus * 4; + if (fo + 4 <= sizeof(g_disk)) next = r32(disk + fo) & 0x0FFFFFFF; + while (next >= 2 && next < 0x0FFFFFF8) { + u32 nfo = fat_byte_off + next * 4; + u32 nn = 0; + if (nfo + 4 <= sizeof(g_disk)) nn = r32(disk + nfo) & 0x0FFFFFFF; + disk[nfo] = 0; disk[nfo+1] = 0; disk[nfo+2] = 0; disk[nfo+3] = 0; + next = nn; + } + } else { + /* Allocate new clusters */ + if (free_entry < 0) { logl("[DSK] fat32 write: no free dir entry"); return -4; } + for (u32 i = 0; i < clusters_needed; i++) { + u32 newc = 0; + for (u32 c = 2; c < (fat_sectors * 512) / 4; c++) { + u32 fo = fat_byte_off + c * 4; + if (fo + 4 > sizeof(g_disk)) break; + if ((r32(disk + fo) & 0x0FFFFFFF) == 0) { newc = c; break; } + } + if (newc == 0) { logl("[DSK] fat32 write: no free clusters"); return -3; } + if (i == 0) first_clus = newc; + if (prev_clus >= 2) { + u32 pfo = fat_byte_off + prev_clus * 4; + disk[pfo] = (u8)(newc & 0xFF); + disk[pfo+1] = (u8)((newc >> 8) & 0xFF); + disk[pfo+2] = (u8)((newc >> 16) & 0xFF); + disk[pfo+3] = (u8)((newc >> 24) & 0x0F); + } + prev_clus = newc; + } + /* Terminate chain */ + if (prev_clus >= 2) { + u32 fo = fat_byte_off + prev_clus * 4; + disk[fo] = 0xF8; disk[fo+1] = 0xFF; disk[fo+2] = 0xFF; disk[fo+3] = 0x0F; + } + } + + /* 4. Write data to clusters */ + u32 remaining = size; + const u8 *src = data; + u32 cur = first_clus; + u32 ci = 0; + while (cur >= 2 && cur < 0x0FFFFFF8 && ci < clusters_needed) { + u32 clba = data_lba + (cur - 2) * spc; + u32 chunk = remaining < cluster_bytes ? remaining : cluster_bytes; + /* Read cluster into g_cluster, overlay data, write back */ + if ((u64)clba * 512 + cluster_bytes <= 256ULL * 512) { + /* In g_disk buffer — copy data directly */ + u8 *dst = disk + (u64)clba * 512; + for (u32 b = 0; b < chunk; b++) dst[b] = src[b]; + for (u32 b = chunk; b < cluster_bytes; b++) dst[b] = 0; + } else { + /* Out of buffer — use sector write */ + if (fat32_read_sectors(clba, spc, g_cluster) != 0) return -5; + for (u32 b = 0; b < chunk; b++) g_cluster[b] = src[b]; + for (u32 b = chunk; b < cluster_bytes; b++) g_cluster[b] = 0; + if (fat32_write_sectors(clba, spc, g_cluster) != 0) return -6; + } + src += chunk; remaining -= chunk; ci++; + u32 fo = fat_byte_off + cur * 4; + if (fo + 4 > sizeof(g_disk)) break; + cur = r32(disk + fo) & 0x0FFFFFFF; + } + + /* 5. Update directory entry */ + if (!found) { + fat32_de *e = &dir[free_entry]; + for (int i = 0; i < 11; i++) e->name[i] = name11[i]; + e->attr = 0x20; /* archive */ + e->ntr = 0; e->ctenth = 0; e->ctime = 0; e->cdate = 0; + e->adate = 0; e->chigh = (u16)((first_clus >> 16) & 0xFFFF); + e->wtime = 0; e->wdate = 0; e->clow = (u16)(first_clus & 0xFFFF); + } else { + dir[free_entry >= 0 ? (u32)free_entry : 0].chigh = (u16)((first_clus >> 16) & 0xFFFF); + dir[free_entry >= 0 ? (u32)free_entry : 0].clow = (u16)(first_clus & 0xFFFF); + /* Find the existing entry again to update it */ + for (u32 e2 = 0; e2 < max_entries; e2++) { + if (neq11(dir[e2].name, name11)) { + dir[e2].chigh = (u16)((first_clus >> 16) & 0xFFFF); + dir[e2].clow = (u16)(first_clus & 0xFFFF); + dir[e2].fsize = size; + break; + } + } + } + /* Set file size in the directory entry */ + for (u32 e2 = 0; e2 < max_entries; e2++) { + if (neq11(dir[e2].name, name11)) { + dir[e2].fsize = size; + break; + } + } + + /* 6. Write FAT + root directory + data sectors back to disk */ + /* Write FAT (both copies) */ + for (u32 f = 0; f < bpb->fc; f++) { + u32 flba = fat_lba + f * fat_sectors; + if (fat32_write_sectors(flba, fat_sectors, disk + (u64)flba * 512) != 0) return -7; + } + /* Write root directory cluster */ + u32 root_dir_lba = data_lba + (root_clus - 2) * spc; + if ((u64)root_dir_lba * 512 + cluster_bytes <= 256ULL * 512) { + if (fat32_write_sectors(root_dir_lba, spc, disk + (u64)root_dir_lba * 512) != 0) return -8; + } + /* Write data clusters that were in the g_disk buffer */ + cur = first_clus; + ci = 0; + while (cur >= 2 && cur < 0x0FFFFFF8 && ci < clusters_needed) { + u32 clba = data_lba + (cur - 2) * spc; + if ((u64)clba * 512 + cluster_bytes <= 256ULL * 512) { + if (fat32_write_sectors(clba, spc, disk + (u64)clba * 512) != 0) return -9; + } + u32 fo = fat_byte_off + cur * 4; + if (fo + 4 > sizeof(g_disk)) break; + cur = r32(disk + fo) & 0x0FFFFFFF; + ci++; + } + + logl("[DSK] fat32 write: success"); + return 0; +} + +static int dsk_check_firstinit(int *is_first, int *dev_mode) { char name[12]; /* "FIRSTINTXT" on stack — no PIE reloc */ name[0]='F';name[1]='I';name[2]='R';name[3]='S';name[4]='T'; name[5]='I';name[6]='N';name[7]='T';name[8]='X';name[9]='T';name[10]=0; u8 *data = 0; u32 size = 0; + *dev_mode = 0; logl("[DSK] fat32_read_path start"); int rc = fat32_read_root_file(name, &data, &size); logh("[DSK] fat32_read_path rc=", (u64)(i64)rc); if (rc != 0) { logl("[DSK] firstInit.txt not found"); *is_first = 1; return 0; } - if (data[0] == '0') { logl("[DSK] firstInit=0"); *is_first = 1; return 0; } - logl("[DSK] firstInit != 0"); *is_first = 0; return 0; + if (data[0] == '0') { logl("[DSK] firstInit=0"); *is_first = 1; } + else { logl("[DSK] firstInit != 0"); *is_first = 0; } + /* 解析第二行 dev_mode 标志(firstInit.txt 格式: "0|1\n0|1") */ + u32 i = 0; + while (i < size && data[i] != '\n') i++; + if (i < size) { + i++; /* 跳过换行 */ + if (i < size && data[i] == '1') { + *dev_mode = 1; + logl("[DSK] dev_mode=1 (developer auto-test)"); + } + } + return 0; } static int dsk_load_elf(u8 *data, u32 size, void **entry_out) { @@ -205,8 +529,10 @@ static int dsk_load_elf(u8 *data, u32 size, void **entry_out) { if (!lc || min_vaddr == ~0ULL) return -4; u64 isize = max_vaddr - min_vaddr; isize = (isize + 0xFFF) & ~0xFFFULL; - static u8 ibuf[262144]; + /* 加载缓冲:需容纳 shell.elf(~536KB,含 FAT32 读写缓冲 BSS)。1MB 留余量。 */ + static u8 ibuf[1048576]; u8 *image = ibuf; + if (isize > 1048576) return -5; /* 镜像过大,防止越界 */ memset_dsk(image, 0, isize); for (u16 i = 0; i < eh->phnum; i++) { const elf64_phdr *ph = (const elf64_phdr *)(data + eh->phoff + (u64)i * eh->phentsize); @@ -247,177 +573,220 @@ static int dsk_load_elf(u8 *data, u32 size, void **entry_out) { return 0; } -static void dsk_spinner_and_check(u32 *fb_arg, i64 cx, i64 cy, i64 r, i64 thk, - const u32 arc_colors[4], u32 bg, const void *boot_ctx_ptr) { - (void)bg; - (void)fb_arg; +/* Load an ELF module from the FAT32 root by 11-char 8.3 name, parse it into + * the shared image buffer, and jump to its entry with the boot context. + * Returns 0 if the module ran and returned, non-zero on load failure. */ +static int dsk_load_and_run(const char name11[12], const dsk_boot_context *ctx) { + u8 *data=0; u32 size=0; void *entry=0; + if (fat32_read_root_file(name11, &data, &size) != 0) return -1; + if (dsk_load_elf(data, size, &entry) != 0) return -2; + void(*fn)(const dsk_boot_context*)=(void(*)(const dsk_boot_context*))entry; + fn(ctx); + return 0; +} + +/* Load desktop.elf and jump to it. Never returns on success. */ +static void dsk_run_desktop(const dsk_boot_context *ctx) { + char dn[12]; /* DESKTOP ELF */ + dn[0]='D';dn[1]='E';dn[2]='S';dn[3]='K';dn[4]='T';dn[5]='O';dn[6]='P';dn[7]=' ';dn[8]='E';dn[9]='L';dn[10]='F'; + if (dsk_load_and_run(dn, ctx) != 0) logl("[DSK] desktop load failed"); + for(;;)__asm__("hlt"); +} + +/* After FirstInit returns, persist the encrypted user.conf buffer (left in + * ctx->reserved[0/1]) to the FAT32 root as USER.CONF, then flip firstInit.txt + * from '0' to '1' so subsequent boots skip the wizard and go to login. */ +static void dsk_persist_userconf(const dsk_boot_context *ctx) { + dsk_boot_context *ctx_mut = (dsk_boot_context *)ctx; + u64 conf_ptr = ctx_mut->reserved[0]; + u64 conf_sz = ctx_mut->reserved[1]; + if (!conf_ptr || !conf_sz) { + logl("[DSK] no conf buffer from FirstInit, skipping persist"); + return; + } + if (!g_block_write) { + logl("[DSK] no block_write, cannot persist user.conf"); + return; + } + const u8 *conf = (const u8 *)conf_ptr; + + /* 1. Write USER.CONF (encrypted buffer as-is; login decrypts with password) */ + char cn[12]; /* USER CON */ + cn[0]='U';cn[1]='S';cn[2]='E';cn[3]='R';cn[4]=' ';cn[5]=' ';cn[6]=' ';cn[7]=' ';cn[8]='C';cn[9]='O';cn[10]='N'; + logl("[DSK] writing USER.CONF"); + int wrc = fat32_write_root_file(cn, conf, (u32)conf_sz); + logh("[DSK] USER.CONF write rc=", (u64)(i64)wrc); + + /* 2. Flip firstInit.txt: '0' -> '1',保留第二行 dev_mode 标志 */ + char fn[12]; /* FIRSTINTXT */ + fn[0]='F';fn[1]='I';fn[2]='R';fn[3]='S';fn[4]='T';fn[5]='I';fn[6]='N';fn[7]='T';fn[8]='X';fn[9]='T';fn[10]=0; + /* 读取当前 firstInit.txt 以保留 dev_mode(第二行),格式 "0|1\n0|1" */ + u8 dev_mode_byte = '0'; + u8 *fi_data = 0; u32 fi_size = 0; + if (fat32_read_root_file(fn, &fi_data, &fi_size) == 0) { + u32 i = 0; + while (i < fi_size && fi_data[i] != '\n') i++; + if (i < fi_size) { i++; if (i < fi_size) dev_mode_byte = fi_data[i]; } + } + u8 fi_buf[3]; fi_buf[0] = '1'; fi_buf[1] = '\n'; fi_buf[2] = dev_mode_byte; + int frc = fat32_write_root_file(fn, fi_buf, 3); + logh("[DSK] firstInit.txt flip rc=", (u64)(i64)frc); + + /* Clear reserved so login path doesn't see stale pointer */ + ctx_mut->reserved[0] = 0; + ctx_mut->reserved[1] = 0; +} + +/* Draw the spinning loader (comet-tail arc) on the gradient background, + * then run the firstInit check and dispatch system component loading. */ +static void dsk_spinner_and_check(const void *boot_ctx_ptr) { const dsk_boot_context *ctx = (const dsk_boot_context *)boot_ctx_ptr; { u64 api = ctx->dkm_kernel_api; - g_block_read = (block_read_fn)*(u64 *)(api + 0xA8); - if (g_block_read) g_block_read = (block_read_fn)*(u64 *)((u64)g_block_read + 16); } - -#define SPR 128 - static u32 sprite[SPR*SPR]; - i64 sp=SPR*4, scx=SPR/2, scy=SPR/2, bx=cx-scx, by=cy-scy; - i64 frame=0, base=0; int checked=0; void *fe_entry=0; + u64 blk = *(u64 *)(api + 0xA8); + g_block_read = blk ? (block_read_fn)*(u64 *)(blk + 16) : 0; /* block_api.read */ + g_block_write = blk ? (block_write_fn)*(u64 *)(blk + 24) : 0; /* block_api.write */ } g_fb_addr=ctx->framebuffer_address; g_fb_w=ctx->framebuffer_width; g_fb_h=ctx->framebuffer_height; g_fb_p=ctx->framebuffer_pitch; u32 *sfb=(u32*)(u64)g_fb_addr; - dsk_fill_gradient_rect(sfb, 0, 0, (i64)g_fb_w, (i64)g_fb_h); - u64 sw=g_fb_w, sh=g_fb_h, spv=g_fb_p; logh("[DSK] block_read ptr=", (u64)g_block_read); - logl("[DSK] entering spinner loop"); - while (1) { - g_fb_w=SPR; g_fb_h=SPR; g_fb_p=sp; - /* per-row gradient so sprite interior matches background */ - static u32 row_bg[SPR]; - for (i64 y0=0; y0= sh) ry = (i64)sh - 1; - row_bg[y0] = blend_color(BG_TOP, BG_BOTTOM, (u32)(((u64)ry * 255ULL) / (sh - 1))); - u32 *ln=&sprite[y0*SPR]; for(i64 x0=0;x0=SPR)continue; - u32 sbg=row_bg[yy]; - for(i64 dx=-ro-1;dx<=ro+1;dx++){i64 xx=scx+dx; if(xx<0||xx>=SPR)continue; - i64 d2=dx*dx+dy*dy; if(d2(ro+1)*(ro+1)+2)continue; - i64 ang; if(dx==0)ang=dy<0?90:270; - else{i64 ax=dx<0?-dx:dx,ay=dy<0?-dy:dy,a0=ax>ay?ay*45/ax:90-ax*45/(ay?ay:1); - if(dx>=0&&dy<=0)ang=a0;else if(dx<0&&dy<=0)ang=180-a0; - else if(dx<0&&dy>0)ang=180+a0;else ang=360-a0;} - i64 a=ang-sa; if(a<0)a+=360; if((u64)a>(u64)sw2)continue; - u32 fade; if((u64)a<6)fade=(u32)(a*255/6);else if((u64)a>(u64)(sw2-6))fade=(u32)((sw2-a)*255/6);else fade=255; - u64 vv=(u64)d2; u64 xr=vv,yr=(xr+1)>>1; while(yr>1;} i64 dist=(i64)xr; - u32 eff=((sbg&0xFF)*(256-fade)+(clr&0xFF)*fade)>>8; - u32 ge=(((sbg>>8)&0xFF)*(256-fade)+((clr>>8)&0xFF)*fade)>>8; - u32 be=(((sbg>>16)&0xFF)*(256-fade)+((clr>>16)&0xFF)*fade)>>8; - eff=0xFF000000|(be<<16)|(ge<<8)|eff; - if(dist>=ri&&dist<=ro)sprite[(u64)yy*SPR+(u64)xx]=eff; - }} - } - i64 ri2=r-8; - for(i64 dy=-ri2-2;dy<=ri2+2;dy++){i64 yy2=scy+dy; if(yy2<0||yy2>=SPR)continue; - u32 sbg2=row_bg[yy2]; - for(i64 dx=-ri2-2;dx<=ri2+2;dx++){i64 xx2=scx+dx; if(xx2<0||xx2>=SPR)continue; - i64 d2=dx*dx+dy*dy; - if(d2<=ri2*ri2){ - u32 ic=((sbg2&0xFF)*176+0xD0*80)>>8; - u32 ig=(((sbg2>>8)&0xFF)*176+0xF0*80)>>8; - u32 ib=(((sbg2>>16)&0xFF)*176+0xFF*80)>>8; - sprite[(u64)yy2*SPR+(u64)xx2]=0xFF000000|(ib<<16)|(ig<<8)|ic; - } - }} - } - g_fb_w=sw; g_fb_h=sh; g_fb_p=spv; - dsk_fill_gradient_rect(sfb, bx, by, SPR, SPR); - for(i64 sr=0;sr=g_fb_h)continue; - u32 *dst=(u32*)((u8*)sfb+(u64)sy*g_fb_p)+bx; u32 *src=&sprite[sr*SPR]; - for(i64 sc=0;sc=g_fb_w)continue; dst[sc]=src[sc];}} - for(volatile u32 d=0;d<72000;d++)__asm__("pause"); - base-=2; if(base<0)base+=360; frame++; + tsc_calibrate_dsk(); - if(frame>=100&&!checked){checked=1; /* was 540, reduced for test */ - logl("[DSK] checking firstInit..."); - if(g_block_read){logl("[DSK] have block read, calling dsk_check_firstinit"); - int is_first=0; - if(dsk_check_firstinit(&is_first)==0){ - if(is_first){ - logl("[DSK] first init detected; running system initializers"); + /* Gradient background + spinning loader (~1.1s, or 800ms without block dev). */ + i64 cx = (i64)g_fb_w / 2; + i64 cy = (i64)g_fb_h / 2; + dsk_fill_gradient_rect(sfb, 0, 0, (i64)g_fb_w, (i64)g_fb_h); + spinner_save_bg(sfb, cx, cy); - /* DSK owns system component initialization. FirstInit is only user setup. */ - char mn[12]; /* MOUSE ELF */ - mn[0]='M';mn[1]='O';mn[2]='U';mn[3]='S';mn[4]='E';mn[5]=' ';mn[6]=' ';mn[7]=' ';mn[8]='E';mn[9]='L';mn[10]='F'; - u8 *md=0; u32 ms=0; void *me=0; - if(fat32_read_root_file(mn,&md,&ms)==0){ - if(dsk_load_elf(md,ms,&me)==0){ - logl("[DSK] jumping to mouseInit"); - void(*mentry)(const dsk_boot_context*)=(void(*)(const dsk_boot_context*))me; - mentry(ctx); - logl("[DSK] mouseInit returned"); - } - } + u32 base = 0; + u32 head_color = 0xFFE8F2FC; /* nearly-white light blue */ + u64 spin_start = rdtsc_dsk(); + u64 spin_budget = g_tsc_per_ms * (g_block_read ? 1100 : 800); + while (rdtsc_dsk() - spin_start < spin_budget) { + spinner_restore_bg(sfb, cx, cy); + spinner_draw(sfb, cx, cy, base, head_color); + base = (base + 6) & 255; /* clockwise advance */ + u64 fs = rdtsc_dsk(); + while (rdtsc_dsk() - fs < g_tsc_per_ms * 33) __asm__("pause"); /* ~30fps */ + } + spinner_restore_bg(sfb, cx, cy); - char nn[12]; /* NETMAN ELF */ - nn[0]='N';nn[1]='E';nn[2]='T';nn[3]='M';nn[4]='A';nn[5]='N';nn[6]=' ';nn[7]=' ';nn[8]='E';nn[9]='L';nn[10]='F'; - u8 *nd=0; u32 ns=0; void *ne=0; - if(fat32_read_root_file(nn,&nd,&ns)==0){ - if(dsk_load_elf(nd,ns,&ne)==0){ - logl("[DSK] jumping to netman"); - void(*nentry)(const dsk_boot_context*)=(void(*)(const dsk_boot_context*))ne; - nentry(ctx); - logl("[DSK] netman returned"); - } - } + if (!g_block_read) { + logl("[DSK] no block device, halting"); + for(;;)__asm__("hlt"); + } - logl("[DSK] loading FirstInit.elf"); - char en[12]; /* FIRSTINIT */ - en[0]='F';en[1]='I';en[2]='R';en[3]='S';en[4]='T'; - en[5]='I';en[6]='N';en[7]='I';en[8]='T';en[9]=' ';en[10]=0; - u8 *fd=0; u32 fs=0; - if(fat32_read_root_file(en,&fd,&fs)==0){ - if(dsk_load_elf(fd,fs,&fe_entry)==0) logl("[DSK] FirstInit.elf loaded"); - } + logl("[DSK] checking firstInit..."); + int is_first = 0, dev_mode = 0; + if (dsk_check_firstinit(&is_first, &dev_mode) != 0) { + logl("[DSK] firstInit check failed, halting"); + for(;;)__asm__("hlt"); + } + + /* 开发者模式:加载 shell.elf 自动测试命令序列(cp/mv/echo/ls/cat/rm) */ + if (dev_mode) { + logl("[DSK] dev mode: loading shell.elf for auto-test"); + char sn[12]; /* SHELL ELF */ + sn[0]='S';sn[1]='H';sn[2]='E';sn[3]='L';sn[4]='L';sn[5]=' ';sn[6]=' ';sn[7]=' ';sn[8]='E';sn[9]='L';sn[10]='F'; + dsk_boot_context *ctx_mut = (dsk_boot_context *)ctx; + ctx_mut->reserved[3] = 1; /* dev mode flag for shell */ + if (dsk_load_and_run(sn, ctx) == 0) logl("[DSK] shell auto-test returned"); + else logl("[DSK] shell.elf not found, skipping dev test"); + ctx_mut->reserved[3] = 0; + } + + if (!is_first) { + logl("[DSK] firstInit=1, attempting login before desktop"); + + /* Load login.elf first (into g_fdata, then dsk_load_elf copies to ibuf) */ + char ln[12]; /* LOGIN ELF */ + ln[0]='L';ln[1]='O';ln[2]='G';ln[3]='I';ln[4]='N';ln[5]=' ';ln[6]=' ';ln[7]=' ';ln[8]='E';ln[9]='L';ln[10]='F'; + u8 *ld=0; u32 ls=0; void *le=0; + int login_ok = 0; + if (fat32_read_root_file(ln, &ld, &ls) == 0) { + if (dsk_load_elf(ld, ls, &le) == 0) { + /* Now read USER.CONF into g_fdata (login.elf already copied to ibuf) */ + char cn[12]; /* USER CON */ + cn[0]='U';cn[1]='S';cn[2]='E';cn[3]='R';cn[4]=' ';cn[5]=' ';cn[6]=' ';cn[7]=' ';cn[8]='C';cn[9]='O';cn[10]='N'; + u8 *conf_data=0; u32 conf_size=0; + if (fat32_read_root_file(cn, &conf_data, &conf_size) == 0) { + logl("[DSK] USER.CONF found, passing to login"); + dsk_boot_context *ctx_mut = (dsk_boot_context *)ctx; + ctx_mut->reserved[0] = (u64)conf_data; + ctx_mut->reserved[1] = (u64)conf_size; + ctx_mut->reserved[2] = 0; /* login success flag */ + + logl("[DSK] jumping to login"); + void(*lentry)(const dsk_boot_context*)=(void(*)(const dsk_boot_context*))le; + lentry(ctx); + logl("[DSK] login returned"); + + if (ctx_mut->reserved[2] == 1) { + logl("[DSK] login success"); + login_ok = 1; } else { - logl("[DSK] firstInit=1, skipping user setup, loading shell directly"); + logl("[DSK] login skipped or failed"); } + } else { + logl("[DSK] USER.CONF not found, skipping login"); } + } else { + logl("[DSK] login.elf load failed, skipping login"); } + } else { + logl("[DSK] login.elf not found, skipping login"); } - if(fe_entry&&frame>150){logl("[DSK] jumping to FirstInit"); /* was 600 */ - void(*entry)(const dsk_boot_context*)=(void(*)(const dsk_boot_context*))fe_entry; - entry(ctx); - logl("[DSK] FirstInit returned, loading desktop"); - /* FirstInit 返回后加载 desktop */ - char dn[12]; /* DESKTOP ELF */ - dn[0]='D';dn[1]='E';dn[2]='S';dn[3]='K';dn[4]='T';dn[5]='O';dn[6]='P';dn[7]=' ';dn[8]='E';dn[9]='L';dn[10]='F'; - u8 *dd=0; u32 ds=0; void *de=0; - if(fat32_read_root_file(dn,&dd,&ds)==0){ - if(dsk_load_elf(dd,ds,&de)==0){ - logl("[DSK] jumping to desktop"); - void(*dentry)(const dsk_boot_context*)=(void(*)(const dsk_boot_context*))de; - dentry(ctx); - } - } - for(;;)__asm__("hlt"); + (void)login_ok; + + logl("[DSK] loading desktop"); + dsk_run_desktop(ctx); + return; + } + + /* First boot: run system initializers, then FirstInit, then desktop */ + logl("[DSK] first init detected; running system initializers"); + + /* mouseInit.elf — safe PS/2 mouse init */ + { char mn[12]; /* MOUSE ELF */ + mn[0]='M';mn[1]='O';mn[2]='U';mn[3]='S';mn[4]='E';mn[5]=' ';mn[6]=' ';mn[7]=' ';mn[8]='E';mn[9]='L';mn[10]='F'; + logl("[DSK] loading mouseInit"); + if (dsk_load_and_run(mn, ctx) == 0) logl("[DSK] mouseInit returned"); + else logl("[DSK] mouseInit not found"); + } + + /* netman.elf — network configuration */ + { char nn[12]; /* NETMAN ELF */ + nn[0]='N';nn[1]='E';nn[2]='T';nn[3]='M';nn[4]='A';nn[5]='N';nn[6]=' ';nn[7]=' ';nn[8]='E';nn[9]='L';nn[10]='F'; + logl("[DSK] loading netman"); + if (dsk_load_and_run(nn, ctx) == 0) logl("[DSK] netman returned"); + else logl("[DSK] netman not found"); + } + + /* FirstInit.elf — user setup wizard; returns to DSK when done */ + { char en[12]; /* FIRSTINIT */ + en[0]='F';en[1]='I';en[2]='R';en[3]='S';en[4]='T'; + en[5]='I';en[6]='N';en[7]='I';en[8]='T';en[9]=' ';en[10]=0; + logl("[DSK] loading FirstInit"); + if (dsk_load_and_run(en, ctx) != 0) { + logl("[DSK] FirstInit not found, loading desktop directly"); + dsk_run_desktop(ctx); + return; } - /* 非首次启动:直接加载 desktop */ - if(checked&&!fe_entry&&frame>150){ - logl("[DSK] loading desktop directly (non-first boot)"); - char dn[12]; /* DESKTOP ELF */ - dn[0]='D';dn[1]='E';dn[2]='S';dn[3]='K';dn[4]='T';dn[5]='O';dn[6]='P';dn[7]=' ';dn[8]='E';dn[9]='L';dn[10]='F'; - u8 *dd=0; u32 ds=0; void *de=0; - if(fat32_read_root_file(dn,&dd,&ds)==0){ - if(dsk_load_elf(dd,ds,&de)==0){ - logl("[DSK] jumping to desktop"); - void(*dentry)(const dsk_boot_context*)=(void(*)(const dsk_boot_context*))de; - dentry(ctx); - } - } - for(;;)__asm__("hlt"); - } - if(!g_block_read&&frame>800){logl("[DSK] no block device, skipping firstInit");break;} - if(checked&&!fe_entry&&frame>800){logl("[DSK] firstInit not found, continuing normal boot");break;} + logl("[DSK] FirstInit returned, persisting user.conf"); + dsk_persist_userconf(ctx); + logl("[DSK] loading desktop"); + dsk_run_desktop(ctx); } } __attribute__((noreturn, visibility("default"))) void dsk_entry(const dsk_boot_context *ctx) { - __asm__ volatile("cli"); /* disable IRQs — ps2kbd/IRQ1 & mouse/IRQ12 handlers crash during spinner */ + __asm__ volatile("cli"); /* disable IRQs — ps2kbd/IRQ1 & mouse/IRQ12 handlers crash during boot */ logl("[DSK] boot"); if(!ctx||ctx->magic!=DSK_BOOT_MAGIC){logl("[DSK] bad context");for(;;)__asm__("hlt");} logl("[DSK] context ok"); - g_fb_addr=ctx->framebuffer_address; g_fb_w=ctx->framebuffer_width; - g_fb_h=ctx->framebuffer_height; g_fb_p=ctx->framebuffer_pitch; - u32 bg=BG_MID, arcs[4]={0xFF4488CC,0xFF2266AA,0xFF66AAEE,0xFF88CCFF}; - i64 cx=(i64)g_fb_w/2,cy=(i64)g_fb_h/2,r=48,thk=4; - dsk_spinner_and_check((u32*)(u64)g_fb_addr,cx,cy,r,thk,arcs,bg,ctx); + dsk_spinner_and_check(ctx); logl("[DSK] SELFTEST PASS"); for(;;)__asm__("hlt"); } diff --git a/CODE/dsk/main.o b/CODE/dsk/main.o index 9fbeae8afa529cafa44dfc9b7b15aa43389fff3e..622fb3e40f0bd7c70f9d77518fb1a8c6dfc3757d 100644 GIT binary patch literal 19816 zcmc(He|%KcweLBZA-_OQ&=e498LYO6V$37~83oM=GjK*`pjSw>EfhmYB=RGenE@22 z36s$r$5GmXa{DvwZTqsigA=u#b7#-4aL%0L)?BvG*Tnn3(fjDM z`?P4|7HS%a2ghmA6?s~;e01_!!L=P+waPfRB%MiKbe?s_HGLw9*YqLm5uH|`>5<_#cIU)vT?6IHvmILa!cbNDVO(_#XsI@}aX=2esp<1KpL<739Cqku z6{nUs;?U!o+@%$s(&U8p(i?v?il%pJ=Z$g;R2HrBCnCFn(WQkEXY2 zIs2i#Bbepv*3O+u+MV6!PQ66FQ`qLNYwJf#_ma+fkDO2wec3>I2#MvFtBE6akKCp< z9g$Kg$&<6cuA7|39ka(P@K5eS4>w9uN^<9PU4<7ZEpk?QY7rDhN8wA^4IZn$s_uUF zDE;ZBKOfSce)@BU{tVEc&s5$1tQKy|)?9Cey8MxMmF7_prp59%LAvCVPk1orV!kVM z`+9FG?sx48o#{Jyi5$u>wqaXg;;5%Zi)p)jdcUT}G!mz5O=!_gYTmjU+P#U79T-{i`pf)zTGamd zG~FGMFi3CHKooLUe~7$2gS^1G`!)DoDB|#%R0M#a4Ik6 zd#I?WmTBK_OnVomeZQJGfob30gC1gI%M%~i-SX>AAJCk;bKVkjK8)tPb8yac4jEG( zWv1!72lm0jeEZycTH=^P3$v+^UUb+bX}8Y~lPK=<7`C#Ny)ai>;hVJJ^cO~>IjtQ1 z6$eqS0VTWzO|=eBBeY@$MZkHH(aP*jOyy+ai}FYkGiI~7rJv?cj}+jgFZR$b@5`zq zFWa8cRPNJXCSq_J2Ls)W&Xx}=zK=Qqgw1C zvMn>Q3&uXJDHWKdE($4HAt;2D(}N-9EDI@Tc}S@{O|G?Mpk6+gIGJ5{x(79c3`CP2 zyDImqO+DmUYR-V+S+TNs%-%ofR|wh4_AY(XT$obXeo)_ZABaS69s;@^naAdYtx1m) zDt;NVrKH048#SC-t~7s*qG`0UQH|M0p^00*5N^X}(5=N-#Pun!jxE8TvSKyW;noLe zk0=~acEk_#*2O>BC`pOlFY$5cZ!240AT85o47tWSR5o7%55J0S*p zhWFfuUKpM1-g}ofF)+j{BX;xy_Sx9>vifzut2fZjIkd!uA)4H#*(zIB|3P!@4?KtE z_LgSbv>M{3>%-P3e`1ZtgR50fmKi5a=Ke0YU7z>RQ>CIoTsFiVzm^sRC1eyS+X^HXQ?NMH{KZgJlD@4$n6BGzQg*L2c|Uz@Q>=CGum6deLu zoa4C%vPt+(SS>zncDtu-mevtjfw?7t9g(G+g1um?7wCl++eBz@2Nn@^ps*3Ly`{I5 zl#a6YT6F$qO%Jz1Oq7X1WeX}=N0=!~Bp>QUlAynzs@x`!Bq8Bl#3+B>=6(O0#>5-P z*--qmF__QWiSzt~cuZ$7Y{gAzafEHXXE5zPBU(k`p>Z%91|4ecT{@J88X68@bE>kH zv-tFLy%ntYS)RFm71NY9OT725{FA+}{DR&;&i$g^_mUlUa_9G=_f|~fmbs30&u>lp zv=UE;rxT`xzlgE3b%C*yTVNqnZtER@D`Je*7$aL5y{n9F@9|;KK0TGHge{C&_CusU zx}y~m{n6btsmOekO>sYbcvGUeQ)#x7BlAQ=iHsU_>%LRq=5j8h-vRDQDB&{*a%$t0 z;Z7ye2U2wT*Fh1zZxX$8j^^?CK0o78&t|Qok%kAZe`?ZG@YyR(`l_5SGP|D?80-lB zNPSZVl}+Yxt&>?o{p&31E3Eap&AqjV*q1Frw!&!fKAC^!aS@Qpjtg0kbI{T*Jo74Pj|*qSf1*hvELd7&CnbU#AFM#n`sDX?llt?)_IG zQfgdVlFAKU?TguOLk5h{w<5F+_=Sk#idS~rR1GbNq?MnE3Zg6;HU+A{ve6c^h z`18kP$#VXzed(g@!*HLh{Ge@%BV=#x4t})lD$)K`gW0Q~qx_s3=Jb3x^W4+g3L^$7#xRdfkjw%t_Icl5OE>ihh zbvFV4vYyERl^xiABx$NdbmVLJYg{F$yCEQj-KF_zV8)J;p{yT*id)&i1S#8DQ)O$v z8;PwR!WrhvBuj+QpEK1fB<1go*&4VRiO{R2HKk8ePP^6Tf3eBi*4qwbVZ_ZA+a z!$}Ud)6KE_QsEDJwD2B>`V#5t)BQLUtlNp}h*ots1gDt&l&$CFw^djF$~>IFb40=- zw8xT;VP zpTcp6=Gvn){|6wf&djFse+Lyj9@(cfKMm@vJ9B7u=#YB5UkY_A+kKfbNIBF&WCqBL z(91;HK-xmTC(;hm9{LTDLqHA*{g}v1keQ(kL}r1^3Pp&_2AQoyR?_fM%|SIsi9Eoo zxv1tU5jv_R8;tnw)_c4$d(+fZN|siQ<38h#-jMAXe~{0|S(=aa|3!BQJj*zKo?Pcs z5+klSwT^aFQ@ww@AiN6aNcge#9d({MU;VDSVE!Js#nQ|%(RrC;O*j15r+c>aK8r>i z()9OwTbK;|!EtYXr`GhTB-y1^TRpMRB~`e`?J#|KU8kfp7lYDb%&(#zxPWIH5`a#< zP2CMGQ*LEzXs6p2ic?nL>e4H_RQ;e^spxULLR(hmc?X@s3#TZuI>jAm?!@)hS>_jJ zW_c>rMRWgUyj8=W$!`5{_<*E$hI?$N+5@;pOqMqt{tWhXcB{(vDI?2Urd$JJ?MS)2 zW$iUGBQuE1V5E&m8?M*vn(IL54LYri(PG1{@yc%x3K)UwS)4ROC*69l7WE@#;BywO z>{{hCr)@&^PN=1*<6pBFYt;yM;StQUChv)KE0GgyBH6-(q*hIrVH#Zc`8)M&F~OMw zbb?IvO{P46ig}+*@>7j>J&M?XY^Cv0dxjDz0=1I@Ms4`ftM61IUqM~jF?;e(T7?=p z{xBfvk!-RSz1IPkm@&y08+JSHa0;B=xL_ptUVXpE`7S%Z`sD-;|G^?P{O}<;bjlmO z*6aG#fbw_?X5AlssMqg0=2t3?`Q%SCyl9VSYkIw^(7U>S&fV+7ka2o4F>#$Q)K*}7)1#DaBBn_-K zvJcU0r_y`^!Hya*?@L}o@3d50*>Ql~3VclMFi1_lfN{>A3t?x-&}Ta(Y<9i5w-M@q_n_3H_5_;6OR0EhVL%J#7%rnii}+M89A76@jN`^(AO8ch1pnNw=J26v=&Y=+3Sic;h$0K=nPm8w^6evd11it z6geaGt`>D?=V>-i>#osg30L(v&n9zm-{FfEGr>^}(dT^5s_VVgz8Ega`%;H}(aH2G z`GM7+wdiODzR6BVI49w>lyD?))2KumFf6(u&pCvvCI=!_XD}Ca`d;u!GRsZWxlhcv zg$pNyvOi+?^0_|2X0gqOFr++w3xr^CZGko!J24#G`BroyO2m^7;htLyAHIa;7r#4} zKN)us*O4vQHIXkmzYBMqw4Y>X@@dVL2$qH)8ORQe@I@>7{e?ZgXs%y=XSO~pFT8dP z@V9+Y_ZZ{Furd5iGNGPrmzf^Tzs3Uf7ar%%?UT>r8f;H^t(=YRLdQF=j4Kp&8+dm# z|4wqms9PozBc$3(`f9-Q&5+JOR@ZQOmt>Ci! zdJYoo0(^AScDg-tX3m}c4F^nl5E=L1=uYK5x>M;P|LE|Xp$DqH>=|2k5NBjKRppu9 zgV?2TavA}{0|@o@&cX7=`ZDixN|^YsSJd;QD!*prKwB`gagUAA~-8#Mr+98Dvls-*fzy%Rx z&)=LJy#ZHkZbj=yRKpI1%qF2U*Q1fLy`QJ%;&5J0BI?7sY|5#8Bx{O7}PN=~iE5(eszsWsDgxjh_qKtBSW>)!UD)(w z#~2Pcl$HYYq`FQik0DPo_F+wrEQaPz<2xH__o3E|XuKGKSU-gC2F`s<`0O|F$!$oj z?pE?^^?Aw|xQNpH3@*EnnUv0q4I71IX3S;#KY0OtWND^TLHXpe5uuNe+Kj+-uaQGX zh{Sxa$q4<0NKE(|Tj-BOV#e3lLkS`=f%sFjwP&k(q&K-k^20gZ~kOmg&)cqTTKk%<$iJq(*$@H-wlG)it z5qF+7jGoM^-H?KL2iSz^upR=&!?;p@5y^n0>fMMJY7_F%i>ZbJPwYn*G4US#T{Y%S zO*?15nS2A^?}AsU$lY-F?vHuphCfA8!AZ1c+{g|GG8%qf5gQh+t!tHJFpeXbrFv+t_tuosY*(n|M5D_gOSZ}K7kqt)q-h7Lw6 zH^6&+`npavHUmd2Ht$ne#{Pr2>e{C~gUw9Saacmuc3$@DCzZ&(7#((^49Q*Ci5B#= zfW-hDtJwDwCw5mRM{h?c@6;3S=(3GuR=siqtu(}$e%lMQ5f1sra*|zwiwj z0(MIln<^XixAC=*WaE{_9_-^};Hw_}geUTm(riP_&`*UA+i<9AOzjU}umwWS?!G+~ zfJI1UDH{3YH{p}?Y0Kz^ox)f|H3H;hy!Gfwh$Y+bElz3Ph#t^{de{4rpPL;i;bC}% z?5eL4&!%IPtlu4*g7l!n=Ip-A-#xhf$alB6M_mNv&Xi3D-dlw|)X&-R~z;xeg#n zIDlxeO+Ik5zfu2F;a~8xitzEQ;CMVQ(+?Mc#namDSrYq-@u$#9t#Chn)qxE8OOWZ4 zkp;!GEd6U8?&9+>F%sH#B($eOANPHTntr(W+Mx+ty4-jdD`gS6XP``^vBh+sr(g^jx zCejG?KO)iy^-mMYLVc*&um3sf->CaC$0qYYCx?>OAV|eVcEKbCzvFyYeU%RS{QD#K z1eS-5$BD$F?{y=N(Y@{A9Av%Z6Kqp9{NWN7iH6?;7#CF@y~k}cemvpY)9}1ITC>eB z|J~bkQ9`s_Rc3k_BC?U`?M8FvWd(##Sc=9d!7_yZ0&j6H;c>n36$-+V(i{Q2i{h`Z z@B{T_R3rr0Eid7vg650qxz!)H#VEpRI3hrC&Gk+|+)b#jo}(A!+9E=_EO$wIi9FG{jP@@kL}`L zV;bdWBgD~#0d#!O=GmgRVSBy_&Y&c5{g_H_9qQRKm7?e>pWenoMnyFLrtxjD1`#&O zqM2>W4|3l{ zcmp;4SBot(XIS1fBd;Ah?)n=GZZ2|`PI67TOLfoi`eyyxoXY#YJ@32sFI-f+_`xO1 z>Q_7z2!>X!e)y3`)~sE(?t9<+-lIkVwQk+oHIF><@amPJVBnz@^~;t#xVU!F!u!8F z@7woP&iS`lKJN^-de;=!q*7_4JKW^-`Bd^IDmXm3dE?ziyrvIZ8$B!O<@7+Ux z?*7vo`#bg~cE9}Mj_3cd^|{||`OU9>+4{4e{Alwtn|}EH4Nu3Oj6Tuw_+yVnn#1As z>(@6K1ynfP9C_@q$6KC=J{fy@!}ou<>6y(x`pM5)fBCE5Z28@DTmSI+6FOC#x1Ys_T~rYgP+{*Btdrq+G$Y zw7z=Df`%IKt_U_v<>>Ny$3lAHSX8sJuDWJ|V{z5eVBPWu`0MJ$HPuT{b=1~11cKh> zb-|*dBK{679Lwq#)!gn_T3@w@m;#GymM$%-Sz7C;t#5Etg@X0B1Zx69C-!y_bu`oj zLk-Jo7IATdjhEL4At1DT(F8|eN!^MSB$_(2$THQL>YU)H3I=PItst$T$pdxE9SdvF ze+}9MmIUipaQXD}graG)XH6HfS5yT8)FxPOG~;{^hL*7&(_lk#n$89o2vt|t1OmK0 z$4K#-MGn}ZwyJKaIm$sTt~5&4)+&b?lg!JdSS)g7-v75$W2!E<4Kt^s4$}*x1#7B< zHH+?WG=!EfXS4cn0QO~X>#CO4JyO#!I8;N}vieY3mN~m5GTpb)#m-jO0 z^Tp|iWBgQy0I^aQ(6XHBbQFNDSy~U(2A5r-XiFNxw1(MBCQfn$V1fFEfTOmdewo8p zp_&qz!i;r+;IZh;Lu-}?8y^1rIM_S3z!y|64P9VX=^!m5BNf>5T6kSXTfvb4BJ1Voxy$HGu; zE$qgOVY-lI`Ehp`Y{kOpf>jN5K}6B&s^#QuoXL^yFvLYm%ZvtGj9GUuISz}NFLRCB zrFAQ;FPTMIliOi#C|y(IAkzj1*QzmzX*_Uy!!Er4%a}x1lZu@srDYQ*-8R`(wXk|o zO|2wVFRg<1D``d4FL#ub6gi6~ISLjBgDV2J-+Jo3n^Zh;p{u%T;w1Dm*;)9-$pIaN?b4|$ zrVutHI_YIH09nF$n-^S7vT{HEX5c>uKCn=sAAD2!6e5V9eIY@81Vbfh5-uSK7wvIc zVTBZtCHfJlQP{^9knQ+KxTuRKwI@8!U^m}4aeQ((pN4&ti_V(-P>l_{YY@ zJ6OX_ax-x1w}A5teg2!viP9AkiWt{VK@-1_fAkg@9_6ce$e00vqr%E)E@!$?mB#Vs z8;n0ws^Rsq{P{c1|5M(tz)#>k>EFr~S&suSl@*+yU3H;8hM|&lg3CXZrvFxs+jx8S zkpgWdayf5t{;zO3r#OzI6Dy_sNk3L6eTqjJzzi;LH|M9Xxm1K*n>l_T$9Xf!%W=Al zrXuvA10DHQGsp9d*U}!2Z|1nr^Ej8|!;{Kw#zT66<6({qKe~(K&vRVZ?GcXCZ#t=5 zYdoYgyx%uDF7$kygS*msHp>0#7@~jbFtM z;tM%WKYpcBW;~>&93RH}y@})Nc)z3hJbj(x4|2ST*MV3n59#|H-_CKN&nzzI-XR9#B+h?5$0w!P&5QTsZ;jU(jB7amKJby4Z$Vd$H)61=NJ7B=lJ6s7yfgXDF+Nx@{Gq@T+g3!ei1i*!SNS4F6>jw z@dIf%{T_qqc_){Tm`3Gh&fmxR`7}uX3-1hm5$g?wdbl0z+@2zS{+i<>IWEQ(;P?cN zi~WWAws9SZ7NvsoPv!h#9_g-#{9!2H+HT+te$4sja$M;DHpg$}_>H0iJZ+e-^a6J5 z1?YsAF?^pC^5_j&j;<%D+`;(>CshSrWx=Uyfj?rwXIt>5G@MU^^lTc=-CX)*8ZP4J zb7{Enljkis$q@QXrvamo{-lqvC;dQ|3gKh|!9UM}6Ti@BRT?hzc{&Xj`Wz*}D577% zpG?Dr{L^W;kaHV%Vwc1wO%oQ*I*gatls-rod-daEArI*Mg6?;A<@S^%i`q z1^=oA@3!FN3!>li7W_sFehZ&y8rRn>_%|&0*Dd%e3tnKs_gnBn3qD}MDL#l@CX;;z zH0I?d3;)#?{ALUO6$?JWf={*Jw^(qm1*g4S*x^?e{8kIzVZq7A1^)>P?zG^aSnv`H z{+R`*+*!!UX5V*=@s?Tei58r4BEdh$f={;Kr!Bb4f^VUqj6(BxJN^kdla1|};j}ji zynt`e>HM!)@F^DleHNVNQONo4G<+=2cTQXIJ1zWqwD?h|Uy?JL9~^E>!@thuOiIJc zIevEtwFRdfOpLe1f|LFl=RcK(3p-p)!-brD9*~6{ z#ugbXW8xR!BlrPikl)xyi!Hcn(bH|gt@eM|f>&7hpS0l9EciYPPU9WR^TbS^$ffIZ zbs8?lJ0T4h?JbD8imRy_8;}P1l0o%;UyeX}I9eq0QLB zFYIt@8ZP*2Ew~@;g#Q1>g44JJ|0vqjQAkfK|9}Obg?B;@@lqjv`j^A~TgVf57RPzo zXz~x`I8O&mT;Vw1rcC@Aj`MJ6;-fgum$ivs$8qisCNA`GKxZmK&wjqnZ!lmJzk$n{ zTJD}MEeb4Iz^=@t2Nu*WT(C+i!bN*k5&OnSSG&vbQYu=A&t4BK82tVr75Rz+!3JRb z`kBeWm!t*agAXsK(OEj=x)j~WUUPe!70VNp1Ow&+LUqMK5_B1R}ROaF~DJnIo5|eV8 zlu49LHXE2!iAgz4YT|8zugs)MO{&DCoF-)w6DOHXO{&zSN=(WL$`}=m-C0C+HorwC zF>#`R%1o-%q)JT6X;Onknc38&N=>T7q?{&Y5)(_!rY2QtQY9wkG^vRtW($)lHK`Jl za+;J$Omvz}O{&zSN=(W*NTr!gw4Ycks4|l(HK`Jla*C5CU!ecu;~JzB;>=+c@vG@Z ztugH-*e@%TZV;Av87fKTy#5*;f-FVEF#%B;Ofj-t0Q?!Jq#mW82Sj>MY!Y!(#J3W3 zPW{t6YssTS7K*rcH)`hfpr}gpx#CLwZ=>W1rQdk4dmG|Q@Bc2?hx#w!eBx0~hc=Y@ zG{X=t74f9)hh(Oi8UGhp#3f0NJ9$E9RK@isuc0jlex?3Jd+WU+H4^q0{nJ^UXx<&M zu#(_FtpNB_v=h&zzy)n({W={6uTau?p9YW3m#W93(aPRB-Kdexsfc|sy*>TU+|%ct U_zQUdn~ijn>G%!c>GSu00p1aM4gdfE literal 13704 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 a9}fbvV+Vz#nf{IVQ4a<6-UUzg{QnP7l5lna diff --git a/CODE/firstInit/linker.ld b/CODE/firstInit/linker.ld index 825d5f1..473e5fc 100644 --- a/CODE/firstInit/linker.ld +++ b/CODE/firstInit/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(5); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(6); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/firstInit/main.c b/CODE/firstInit/main.c index 8dc7b13..05c069c 100644 --- a/CODE/firstInit/main.c +++ b/CODE/firstInit/main.c @@ -16,6 +16,42 @@ typedef long long i64; static __inline__ void outb(u16 port, u8 value) { __asm__ volatile("outb %0,%1"::"a"(value),"Nd"(port)); } static __inline__ u8 inb(u16 port) { u8 v; __asm__ volatile("inb %1,%0":"=a"(v):"Nd"(port)); return v; } +/* ---- TSC-based timing (实机要求: 用 CPU 频率计算, 不用循环) ---- */ +static u64 g_tsc_per_ms = 0; + +static __inline__ u64 rdtsc_fi(void) { + u32 lo, hi; + __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((u64)hi << 32) | lo; +} + +/* 用 PIT (8254, 1.193182 MHz) 校准 TSC 频率 */ +static void tsc_calibrate_fi(void) { + outb(0x43, 0x30); /* ch0, lo+hi, mode 0, binary */ + outb(0x40, 0x7c); /* 11932 low = ~10ms */ + outb(0x40, 0x2e); /* 11932 high */ + u64 tsc_start = rdtsc_fi(); + u16 prev = 0; u64 loops = 0; + for (;;) { + outb(0x43, 0x00); + u16 cur = (u16)inb(0x40) | ((u16)inb(0x40) << 8); + if (cur > prev && loops > 10) break; + prev = cur; loops++; + } + u64 tsc_end = rdtsc_fi(); + g_tsc_per_ms = (tsc_end - tsc_start) / 10; +} + +static void delay_ms_fi(u32 ms) { + if (!g_tsc_per_ms) { + for (volatile u32 i = 0; i < 100000 * ms; i++) __asm__ volatile("pause"); + return; + } + u64 target = g_tsc_per_ms * ms; + u64 start = rdtsc_fi(); + while (rdtsc_fi() - start < target) __asm__ volatile("pause"); +} + static void sputc(char c) { for (unsigned int i=0; i<100000; i++) { if (inb(COM1+5)&0x20) break; } outb(COM1, (unsigned char)c); @@ -23,16 +59,20 @@ static void sputc(char c) { static void swrite(const char *s) { while(*s) { if(*s=='\n')sputc('\r'); sputc(*s++); } } static void logl(const char *s) { swrite(s); swrite("\n"); } -/* ---- PS/2 controller / mouse helpers (timeout-protected) ---- */ +/* ---- PS/2 controller / mouse helpers (timeout-protected, TSC-based) ---- */ static int ps2_wait_write(void) { - for (volatile u32 i = 0; i < 100000; i++) { + u64 deadline = rdtsc_fi() + g_tsc_per_ms * 100; /* 100ms 超时 */ + while (rdtsc_fi() < deadline) { if (!(inb(0x64) & 0x02)) return 0; /* input buffer empty */ + __asm__ volatile("pause"); } return -1; } static int ps2_wait_read(void) { - for (volatile u32 i = 0; i < 100000; i++) { + u64 deadline = rdtsc_fi() + g_tsc_per_ms * 100; /* 100ms 超时 */ + while (rdtsc_fi() < deadline) { if (inb(0x64) & 0x01) return 0; /* output buffer full */ + __asm__ volatile("pause"); } return -1; } @@ -81,12 +121,12 @@ static void mouse_init(void) { logl("[mouse] init done"); } -#define BG_TOP 0xFFC8E0F0u -#define BG_BOTTOM 0xFF49306Fu -#define BG_MID 0xFF8888B0u -#define CARD_BG 0xFFEAF5FBu -#define INPUT_BG 0xFFF0F5FAu -#define TEXT_FG 0xFF5F7FA6u +#define BG_TOP 0xFF2D2D30u +#define BG_BOTTOM 0xFF1A1A1Eu +#define BG_MID 0xFF3C3C40u +#define CARD_BG 0xFF353539u +#define INPUT_BG 0xFF2A2A2Eu +#define TEXT_FG 0xFFE0E0E0u #define WELCOME_FG 0xFFE8F2FCu static u64 fb_a, fb_w, fb_h, fb_p; @@ -127,6 +167,38 @@ static void fb_text(u32 *fb, const char *s, i64 x, i64 y, u32 fg, u32 bg) { for (i64 i=0; s[i]; i++) fb_char(fb, (u32)(u8)s[i], x+i*ASCII_STEP, y, fg, bg); } +/* width of an ASCII string in pixels (used to center English subtitles) */ +static i64 fb_text_width(const char *s) { + i64 n = 0; + while (s[n]) n++; + return n * ASCII_STEP; +} + +/* Alpha-blended ASCII text — same as fb_text but multiplied by a global alpha, + * used to fade English subtitles in/out alongside the Chinese bitmaps. */ +static void fb_text_alpha(u32 *fb, const char *s, i64 x, i64 y, u32 fg, u32 bg, u32 global_alpha) { + for (i64 i=0; s[i]; i++) { + u32 ch = (u32)(u8)s[i]; + if (ch < ' ' || ch > '~') ch = ' '; + u32 idx = ch - ' '; + const u8 *g = g_ascii[idx]; + for (i64 r=0; r= fb_h) continue; + u32 *line = (u32 *)((u8 *)fb + (u64)yy * fb_p); + for (i64 c=0; c> 8; + if (eff_a == 0) continue; + i64 xx = x + i*ASCII_STEP + c; + if (xx < 0 || (u64)xx >= fb_w) continue; + line[(u64)xx] = (eff_a == 255) ? fg : blend(bg, fg, eff_a); + } + } + } +} + /* draw pre-rendered grayscale bitmap – writes only, no framebuffer read */ static void fb_bitmap_alpha(u32 *fb, const u8 *data, i64 w, i64 h, i64 x, i64 y, u32 fg, u32 bg, u32 global_alpha) { for (i64 r=0; r= fb_w) continue; - u32 a = ((u32)data[r*(u64)w + (u64)c] * global_alpha) >> 8; + u8 val = data[r*(u64)w + (u64)c]; + if (val == 0) continue; /* skip transparent – let background show through */ + u32 a = ((u32)val * global_alpha) >> 8; line[(u64)xx] = blend(bg, fg, a); } } @@ -228,25 +302,21 @@ static void stroke_rounded_rect(u32 *fb, i64 x, i64 y, i64 w, i64 h, i64 radius, } static void delay_frame(void) { - for (volatile u32 d=0; d<300000; d++) __asm__("pause"); + delay_ms_fi(33); /* 实机: 基于 TSC 的 33ms 帧间隔 (~30fps) */ } #include "text_bitmaps.c" static void fade_ring(u32 *fb, i64 cx, i64 cy, u32 bg) { - /* Smoothly erase a square sprite area with the same vertical gradient as DSK. */ + /* Erase the spinner sprite area with gradient background in one frame. */ (void)bg; i64 r = 72; - for (int step=0; step<12; step++) { - (void)step; - fill_gradient_rect(fb, cx-r, cy-r, r*2+1, r*2+1); - delay_frame(); - } + fill_gradient_rect(fb, cx-r, cy-r, r*2+1, r*2+1); } static void draw_card(u32 *fb, i64 x, i64 y, i64 w, i64 h, u32 card, u32 bg_color) { (void)bg_color; - fill_rounded_rect(fb, x, y, w, h, 12, card); + fill_rounded_rect(fb, x, y, w, h, 4, card); } /* Draw gradient background + card in a single pass — per-row blend eliminates flicker */ @@ -266,9 +336,9 @@ static void draw_card_fade(u32 *fb, i64 x, i64 y, i64 w, i64 h, i64 radius, u32 } static void draw_rounded_input(u32 *fb, i64 x, i64 y, i64 w, i64 h, const char *value, int mask, u32 fg, u32 card_bg, int active) { - u32 fill = active ? 0xFFFFFFFF : INPUT_BG; - fill_rounded_rect(fb, x, y, w, h, 8, fill); - stroke_rounded_rect(fb, x, y, w, h, 8, 1, active ? 0xFFB6C9DD : card_bg); + u32 fill = active ? 0xFF45454Au : INPUT_BG; + fill_rounded_rect(fb, x, y, w, h, 2, fill); + stroke_rounded_rect(fb, x, y, w, h, 2, 1, active ? 0xFF6C6C72 : 0xFF404044); char out[64]; int i=0; while(value[i] && i<60) { out[i] = mask ? '*' : value[i]; i++; } out[i]=0; @@ -387,17 +457,35 @@ static void cursor_draw(u32 *fb, i64 mx, i64 my) { static void redraw_setup_card(u32 *fb, i64 card_x, i64 card_y, char *pc, char *user, char *pass, int active, u32 bg, u32 fg, i64 mx, i64 my) { u32 card = CARD_BG; + u32 sub_fg = 0xFF9098A0; /* dimmer English subtitle color on card */ cursor_erase(fb); fill_gradient_rect(fb, card_x - 24, card_y - 24, 948, 648); draw_card(fb, card_x, card_y, 900, 600, card, bg); fb_bitmap_alpha(fb, g_txt_title, g_txt_title_w, g_txt_title_h, card_x+40, card_y+40, fg, card, 255); + fb_text(fb, "Account Setup", card_x+40, card_y+40+g_txt_title_h+2, sub_fg, card); fb_bitmap_alpha(fb, g_txt_computer, g_txt_computer_w, g_txt_computer_h, card_x+40, card_y+130, fg, card, 255); + fb_text(fb, "Computer Name", card_x+40, card_y+130+g_txt_computer_h+2, sub_fg, card); draw_rounded_input(fb, card_x+40, card_y+180, 820, 44, pc, 0, fg, card, active==0); fb_bitmap_alpha(fb, g_txt_username, g_txt_username_w, g_txt_username_h, card_x+40, card_y+280, fg, card, 255); + fb_text(fb, "Username", card_x+40, card_y+280+g_txt_username_h+2, sub_fg, card); draw_rounded_input(fb, card_x+40, card_y+330, 820, 44, user, 0, fg, card, active==1); fb_bitmap_alpha(fb, g_txt_password, g_txt_password_w, g_txt_password_h, card_x+40, card_y+430, fg, card, 255); + fb_text(fb, "Password", card_x+40, card_y+430+g_txt_password_h+2, sub_fg, card); draw_rounded_input(fb, card_x+40, card_y+480, 820, 44, pass, 1, fg, card, active==2); fb_bitmap_alpha(fb, g_txt_hint, g_txt_hint_w, g_txt_hint_h, card_x+40, card_y+555, 0xFF7F97AC, card, 255); + fb_text(fb, "Press Enter to confirm each field", card_x+40, card_y+555+g_txt_hint_h+2, 0xFF6F7F8C, card); + cursor_draw(fb, mx, my); +} + +/* 仅重绘当前活动输入框,避免每次按键重绘整个卡片导致闪烁 */ +static void redraw_input_only(u32 *fb, i64 card_x, i64 card_y, int field, char *pc, char *user, char *pass, i64 mx, i64 my, u32 fg) { + u32 card = CARD_BG; + char *buf = field==0 ? pc : (field==1 ? user : pass); + int mask = (field == 2) ? 1 : 0; + i64 fy = card_y + 180 + (i64)field * 150; + cursor_erase(fb); + fill_rect(fb, card_x + 40, fy, 820, 44, card); + draw_rounded_input(fb, card_x+40, fy, 820, 44, buf, mask, fg, card, 1); cursor_draw(fb, mx, my); } @@ -474,7 +562,7 @@ static int read_field(u32 *fb, i64 card_x, i64 card_y, int field, char *pc, char buf[len++] = c; buf[len] = 0; } - redraw_setup_card(fb, card_x, card_y, pc, user, pass, field, bg, fg, *mx, *my); + redraw_input_only(fb, card_x, card_y, field, pc, user, pass, *mx, *my, fg); } } @@ -486,15 +574,64 @@ typedef struct { int theme; } setup_prefs; -static const char *pref_value(int row, int val) { - if (row == 0) return val ? "English" : "Simplified Chinese"; - if (row == 1) return val ? "Global" : "China Mainland"; - if (row == 2) return val ? "UTC" : "Asia/Shanghai"; - if (row == 3) return val ? "CN-QWERTY" : "US-QWERTY"; - if (row == 4) return val ? "Dark" : "Light"; +/* 语言选项: 索引 0-11 */ +static const char *lang_names[] = { + "Simplified Chinese", "English (US)", "English (UK)", "Japanese", + "Korean", "French", "German", "Spanish", + "Portuguese", "Russian", "Arabic", "Hindi" +}; +#define LANG_COUNT 12 + +/* 键盘布局选项: 索引 0-8 */ +static const char *kb_names[] = { + "US-QWERTY", "CN-QWERTY", "UK-QWERTY", "JP-JIS", + "KR-104", "FR-AZERTY", "DE-QWERTZ", "ES-QWERTY", + "RU-JCUKEN" +}; +#define KB_COUNT 9 + +/* 区域选项 */ +static const char *region_names[] = { + "China Mainland", "Global", "United States", "United Kingdom", + "Japan", "Korea", "France", "Germany", + "Spain", "Russia" +}; +#define REGION_COUNT 10 + +/* 时区选项 */ +static const char *tz_names[] = { + "Asia/Shanghai", "UTC", "America/New_York", "America/Los_Angeles", + "Europe/London", "Asia/Tokyo", "Asia/Seoul", "Europe/Paris", + "Europe/Berlin", "Europe/Moscow" +}; +#define TZ_COUNT 10 + +/* 主题选项 */ +static const char *theme_names[] = { "Light", "Dark", "Auto" }; +#define THEME_COUNT 3 + +static int pref_option_count(int row) { + if (row == 0) return LANG_COUNT; + if (row == 1) return REGION_COUNT; + if (row == 2) return TZ_COUNT; + if (row == 3) return KB_COUNT; + if (row == 4) return THEME_COUNT; + return 2; +} + +static const char *pref_option_name(int row, int opt) { + if (row == 0) return lang_names[opt]; + if (row == 1) return region_names[opt]; + if (row == 2) return tz_names[opt]; + if (row == 3) return kb_names[opt]; + if (row == 4) return theme_names[opt]; return ""; } +static const char *pref_value(int row, int val) { + return pref_option_name(row, val); +} + static int pref_get(const setup_prefs *p, int row) { if (row == 0) return p->language; if (row == 1) return p->region; @@ -504,22 +641,41 @@ static int pref_get(const setup_prefs *p, int row) { return 0; } +static void pref_set(setup_prefs *p, int row, int val) { + if (row == 0) p->language = val; + else if (row == 1) p->region = val; + else if (row == 2) p->timezone = val; + else if (row == 3) p->keyboard = val; + else if (row == 4) p->theme = val; +} + static void pref_toggle(setup_prefs *p, int row) { - if (row == 0) p->language ^= 1; - else if (row == 1) p->region ^= 1; - else if (row == 2) p->timezone ^= 1; - else if (row == 3) p->keyboard ^= 1; - else if (row == 4) p->theme ^= 1; + int count = pref_option_count(row); + int cur = pref_get(p, row); + pref_set(p, row, (cur + 1) % count); } static void draw_option_row(u32 *fb, i64 x, i64 y, i64 w, i64 h, const u8 *label, i64 lw, i64 lh, - const char *value, int active, u32 fg, u32 card) { - u32 fill = active ? 0xFFFFFFFF : INPUT_BG; + const char *value, int active, u32 fg, u32 card, + const char *en) { + u32 fill = active ? 0xFF45454Au : INPUT_BG; fb_bitmap_alpha(fb, label, lw, lh, x, y + 4, fg, card, 255); - fill_rounded_rect(fb, x + 220, y, w - 220, h, 8, fill); - stroke_rounded_rect(fb, x + 220, y, w - 220, h, 8, 1, active ? 0xFFB6C9DD : card); + if (en) fb_text(fb, en, x, y + 4 + lh + 1, 0xFF9098A0, card); + fill_rounded_rect(fb, x + 220, y, w - 220, h, 2, fill); + stroke_rounded_rect(fb, x + 220, y, w - 220, h, 2, 1, active ? 0xFF6C6C72 : 0xFF404044); fb_text(fb, value, x + 238, y + (h - ASCII_H) / 2, fg, fill); + /* dropdown arrow */ + { + i64 ax = x + w - 22; + i64 ay = y + (h - 6) / 2; + fill_rect(fb, ax, ay, 11, 1, fg); + fill_rect(fb, ax + 1, ay + 1, 9, 1, fg); + fill_rect(fb, ax + 2, ay + 2, 7, 1, fg); + fill_rect(fb, ax + 3, ay + 3, 5, 1, fg); + fill_rect(fb, ax + 4, ay + 4, 3, 1, fg); + fill_rect(fb, ax + 5, ay + 5, 1, 1, fg); + } } static void redraw_prefs_card(u32 *fb, i64 card_x, i64 card_y, setup_prefs *prefs, int active, i64 mx, i64 my, u32 bg, u32 fg) { @@ -528,12 +684,14 @@ static void redraw_prefs_card(u32 *fb, i64 card_x, i64 card_y, setup_prefs *pref fill_gradient_rect(fb, card_x - 24, card_y - 24, 948, 648); draw_card(fb, card_x, card_y, 900, 600, card, bg); fb_bitmap_alpha(fb, g_txt_prefs_title, g_txt_prefs_title_w, g_txt_prefs_title_h, card_x+40, card_y+40, fg, card, 255); - draw_option_row(fb, card_x+40, card_y+120, 820, 42, g_txt_prefs_language, g_txt_prefs_language_w, g_txt_prefs_language_h, pref_value(0, pref_get(prefs, 0)), active==0, fg, card); - draw_option_row(fb, card_x+40, card_y+200, 820, 42, g_txt_prefs_region, g_txt_prefs_region_w, g_txt_prefs_region_h, pref_value(1, pref_get(prefs, 1)), active==1, fg, card); - draw_option_row(fb, card_x+40, card_y+280, 820, 42, g_txt_prefs_timezone, g_txt_prefs_timezone_w, g_txt_prefs_timezone_h, pref_value(2, pref_get(prefs, 2)), active==2, fg, card); - draw_option_row(fb, card_x+40, card_y+360, 820, 42, g_txt_prefs_keyboard, g_txt_prefs_keyboard_w, g_txt_prefs_keyboard_h, pref_value(3, pref_get(prefs, 3)), active==3, fg, card); - draw_option_row(fb, card_x+40, card_y+440, 820, 42, g_txt_prefs_theme, g_txt_prefs_theme_w, g_txt_prefs_theme_h, pref_value(4, pref_get(prefs, 4)), active==4, fg, card); + fb_text(fb, "Preferences", card_x+40, card_y+40+g_txt_prefs_title_h+2, 0xFF9098A0, card); + draw_option_row(fb, card_x+40, card_y+120, 820, 42, g_txt_prefs_language, g_txt_prefs_language_w, g_txt_prefs_language_h, pref_value(0, pref_get(prefs, 0)), active==0, fg, card, "Language"); + draw_option_row(fb, card_x+40, card_y+200, 820, 42, g_txt_prefs_region, g_txt_prefs_region_w, g_txt_prefs_region_h, pref_value(1, pref_get(prefs, 1)), active==1, fg, card, "Region"); + draw_option_row(fb, card_x+40, card_y+280, 820, 42, g_txt_prefs_timezone, g_txt_prefs_timezone_w, g_txt_prefs_timezone_h, pref_value(2, pref_get(prefs, 2)), active==2, fg, card, "Timezone"); + draw_option_row(fb, card_x+40, card_y+360, 820, 42, g_txt_prefs_keyboard, g_txt_prefs_keyboard_w, g_txt_prefs_keyboard_h, pref_value(3, pref_get(prefs, 3)), active==3, fg, card, "Keyboard"); + draw_option_row(fb, card_x+40, card_y+440, 820, 42, g_txt_prefs_theme, g_txt_prefs_theme_w, g_txt_prefs_theme_h, pref_value(4, pref_get(prefs, 4)), active==4, fg, card, "Theme"); fb_bitmap_alpha(fb, g_txt_prefs_hint, g_txt_prefs_hint_w, g_txt_prefs_hint_h, card_x+40, card_y+555, 0xFF7F97AC, card, 255); + fb_text(fb, "Tab/arrows to navigate, Enter to confirm", card_x+40, card_y+555+g_txt_prefs_hint_h+2, 0xFF6F7F8C, card); cursor_draw(fb, mx, my); } @@ -541,21 +699,52 @@ static void redraw_prefs_row(u32 *fb, i64 card_x, i64 card_y, setup_prefs *prefs u32 card = CARD_BG; i64 ry = card_y + 120 + (i64)row * 80; cursor_erase(fb); - fill_rect(fb, card_x + 36, ry - 8, 832, 58, card); - if (row == 0) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_language, g_txt_prefs_language_w, g_txt_prefs_language_h, pref_value(0, pref_get(prefs, 0)), active==0, fg, card); - else if (row == 1) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_region, g_txt_prefs_region_w, g_txt_prefs_region_h, pref_value(1, pref_get(prefs, 1)), active==1, fg, card); - else if (row == 2) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_timezone, g_txt_prefs_timezone_w, g_txt_prefs_timezone_h, pref_value(2, pref_get(prefs, 2)), active==2, fg, card); - else if (row == 3) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_keyboard, g_txt_prefs_keyboard_w, g_txt_prefs_keyboard_h, pref_value(3, pref_get(prefs, 3)), active==3, fg, card); - else if (row == 4) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_theme, g_txt_prefs_theme_w, g_txt_prefs_theme_h, pref_value(4, pref_get(prefs, 4)), active==4, fg, card); + fill_rounded_rect(fb, card_x + 36, ry - 8, 832, 58, 2, card); + if (row == 0) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_language, g_txt_prefs_language_w, g_txt_prefs_language_h, pref_value(0, pref_get(prefs, 0)), active==0, fg, card, "Language"); + else if (row == 1) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_region, g_txt_prefs_region_w, g_txt_prefs_region_h, pref_value(1, pref_get(prefs, 1)), active==1, fg, card, "Region"); + else if (row == 2) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_timezone, g_txt_prefs_timezone_w, g_txt_prefs_timezone_h, pref_value(2, pref_get(prefs, 2)), active==2, fg, card, "Timezone"); + else if (row == 3) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_keyboard, g_txt_prefs_keyboard_w, g_txt_prefs_keyboard_h, pref_value(3, pref_get(prefs, 3)), active==3, fg, card, "Keyboard"); + else if (row == 4) draw_option_row(fb, card_x+40, ry, 820, 42, g_txt_prefs_theme, g_txt_prefs_theme_w, g_txt_prefs_theme_h, pref_value(4, pref_get(prefs, 4)), active==4, fg, card, "Theme"); cursor_draw(fb, mx, my); } +/* 绘制下拉菜单:最多显示 6 项,超出时显示滚动指示 */ +static void draw_dropdown_menu(u32 *fb, i64 card_x, i64 card_y, int row, const setup_prefs *prefs, u32 fg) { + i64 dd_x = card_x + 260; + i64 dd_y = card_y + 120 + (i64)row * 80 + 42; + i64 dd_w = 600; + int current = pref_get(prefs, row); + int opt_count = pref_option_count(row); + int visible = opt_count > 6 ? 6 : opt_count; + i64 opt_h = 32; + i64 total_h = visible * opt_h + (opt_count > 6 ? 20 : 0); + /* 深色背景 */ + fill_rect(fb, dd_x, dd_y, dd_w, total_h, 0xFF2A2A2E); + /* 选项 */ + for (int opt = 0; opt < visible; opt++) { + u32 bg_opt = (opt == current) ? 0xFF45454A : 0xFF2A2A2E; + fill_rect(fb, dd_x, dd_y + opt * opt_h, dd_w, opt_h, bg_opt); + fb_text(fb, pref_option_name(row, opt), dd_x + 18, dd_y + opt * opt_h + (opt_h - ASCII_H) / 2, fg, bg_opt); + } + /* 超过 6 项时显示滚动指示 */ + if (opt_count > 6) { + fill_rect(fb, dd_x, dd_y + visible * opt_h, dd_w, 20, 0xFF252528); + fb_text(fb, "...more", dd_x + 18, dd_y + visible * opt_h + 1, 0xFF808088, 0xFF252528); + } + /* 边框 */ + fill_rect(fb, dd_x, dd_y, dd_w, 1, 0xFF505055); + fill_rect(fb, dd_x, dd_y + total_h - 1, dd_w, 1, 0xFF505055); + fill_rect(fb, dd_x, dd_y, 1, total_h, 0xFF505055); + fill_rect(fb, dd_x + dd_w - 1, dd_y, 1, total_h, 0xFF505055); +} + static void read_prefs_page(u32 *fb, i64 card_x, i64 card_y, setup_prefs *prefs, i64 *mx, i64 *my, u32 bg, u32 fg) { int active = 0; int mcnt = 0; u8 mpkt[3]; u8 prev_btns = 0; int e0 = 0; + int dropdown_open = -1; redraw_prefs_card(fb, card_x, card_y, prefs, active, *mx, *my, bg, fg); for (;;) { u8 st = inb(0x64); @@ -579,14 +768,40 @@ static void read_prefs_page(u32 *fb, i64 card_x, i64 card_y, setup_prefs *prefs, cursor_draw(fb, *mx, *my); } if ((btns & 1) && !(prev_btns & 1)) { - for (int r = 0; r < 5; r++) { - i64 ry = card_y + 120 + (i64)r * 80; - if (*mx >= card_x + 260 && *mx < card_x + 860 && *my >= ry && *my < ry + 42) { - int old = active; - active = r; - pref_toggle(prefs, active); - if (old != active) redraw_prefs_row(fb, card_x, card_y, prefs, old, active, *mx, *my, fg); - redraw_prefs_row(fb, card_x, card_y, prefs, active, active, *mx, *my, fg); + if (dropdown_open >= 0) { + /* 检查点击是否在下拉选项上 */ + i64 dd_x = card_x + 260; + i64 dd_y = card_y + 120 + (i64)dropdown_open * 80 + 42; + i64 dd_w = 600; + int opt_count = pref_option_count(dropdown_open); + int visible = opt_count > 6 ? 6 : opt_count; + i64 opt_h = 32; + int clicked_opt = -1; + for (int opt = 0; opt < visible; opt++) { + i64 opt_y = dd_y + opt * opt_h; + if (*mx >= dd_x && *mx < dd_x + dd_w && *my >= opt_y && *my < opt_y + opt_h) { + clicked_opt = opt; + break; + } + } + if (clicked_opt >= 0) { + pref_set(prefs, dropdown_open, clicked_opt); + } + dropdown_open = -1; + redraw_prefs_card(fb, card_x, card_y, prefs, active, *mx, *my, bg, fg); + } else { + /* No dropdown open - check for value area clicks */ + for (int r = 0; r < 5; r++) { + i64 ry = card_y + 120 + (i64)r * 80; + if (*mx >= card_x + 260 && *mx < card_x + 860 && *my >= ry && *my < ry + 42) { + active = r; + dropdown_open = r; + redraw_prefs_card(fb, card_x, card_y, prefs, active, *mx, *my, bg, fg); + cursor_erase(fb); + draw_dropdown_menu(fb, card_x, card_y, r, prefs, fg); + cursor_draw(fb, *mx, *my); + break; + } } } } @@ -596,6 +811,13 @@ static void read_prefs_page(u32 *fb, i64 card_x, i64 card_y, setup_prefs *prefs, u8 sc = data; if (sc == 0xE0) { e0 = 1; continue; } if (sc & 0x80) { e0 = 0; continue; } + /* Close dropdown on any real key press */ + if (dropdown_open >= 0) { + dropdown_open = -1; + redraw_prefs_card(fb, card_x, card_y, prefs, active, *mx, *my, bg, fg); + e0 = 0; + continue; + } if (e0 && sc == 0x48) { if (active > 0) { int old = active; active--; redraw_prefs_row(fb, card_x, card_y, prefs, old, active, *mx, *my, fg); redraw_prefs_row(fb, card_x, card_y, prefs, active, active, *mx, *my, fg); } e0 = 0; continue; @@ -617,6 +839,9 @@ static void read_prefs_page(u32 *fb, i64 card_x, i64 card_y, setup_prefs *prefs, redraw_prefs_row(fb, card_x, card_y, prefs, old, active, *mx, *my, fg); redraw_prefs_row(fb, card_x, card_y, prefs, active, active, *mx, *my, fg); } else { + cursor_bg_valid = 0; + cursor_cur_x = -100; + cursor_cur_y = -100; return; } } @@ -710,10 +935,11 @@ static void wifi_query_scan(u64 kernel_api) { net_scan_count_fn scount = (net_scan_count_fn)*(u64 *)(net_api + 48); net_scan_result_fn sresult = (net_scan_result_fn)*(u64 *)(net_api + 56); net_is_wireless_fn iswl = (net_is_wireless_fn)*(u64 *)(net_api + 64); - if (!dcount || !iswl || !scount || !sresult) { - logl("[FirstInit] net scan api incomplete"); - return; - } + if (!dcount) { logl("[FirstInit] net device_count fn is null"); return; } + if (!sstart) { logl("[FirstInit] net scan_start fn is null"); return; } + if (!scount) { logl("[FirstInit] net scan_count fn is null"); return; } + if (!sresult) { logl("[FirstInit] net scan_result fn is null"); return; } + if (!iswl) { logl("[FirstInit] net is_wireless fn is null"); return; } u32 ndev = dcount(); /* 串口日志:设备数 */ { @@ -723,11 +949,21 @@ static void wifi_query_scan(u64 kernel_api) { b[p++]='0'+(ndev/10); b[p++]='0'+(ndev%10); b[p]=0; logl(b); } - /* 找第一个无线设备 */ + /* 找第一个无线设备 - 通过 device_info 检查 flags 而非调用 is_wireless */ int wifi_idx = -1; for (u32 i = 0; i < ndev; i++) { - int rc = iswl(i); - if (rc == 1) { wifi_idx = (int)i; break; } + /* 使用 device_info 获取 flags,避免直接调用 is_wireless 导致崩溃 */ + u64 devinfo_fn = *(u64 *)(net_api + 16); + if (devinfo_fn) { + /* dkm_net_device_info 布局: name(8) + mac(6) + pad(2) + flags(4) = 20 字节 */ + u8 info[24]; + for (int k = 0; k < 24; k++) info[k] = 0; + int rc = ((int (*)(u32, void *))devinfo_fn)(i, info); + if (rc == 0) { + u32 flags = *(u32 *)(info + 16); + if (flags & 8) { wifi_idx = (int)i; break; } /* DKM_NET_F_WIRELESS = (1<<3) */ + } + } } if (wifi_idx < 0) { logl("[FirstInit] no wireless device found"); @@ -806,63 +1042,84 @@ static void net_select(setup_net *net, int idx) { static void draw_wifi_row(u32 *fb, i64 card_x, i64 card_y, setup_net *net, int row, int active, u32 fg) { u32 card = CARD_BG; i64 x = card_x + 40; - i64 y = card_y + 132 + (i64)row * 64; - u32 fill = active == row ? 0xFFFFFFFF : (net->selected == row ? 0xFFDCECF8 : INPUT_BG); - fill_rounded_rect(fb, x, y, 390, 50, 9, fill); - stroke_rounded_rect(fb, x, y, 390, 50, 9, 1, active == row ? 0xFF7FA7C8 : card); - fb_text(fb, net->selected == row ? ">" : " ", x + 12, y + 16, fg, fill); + i64 y = card_y + 132 + (i64)row * 56; + u32 fill = active == row ? 0xFF45454A : (net->selected == row ? 0xFF3A3A3E : INPUT_BG); + fill_rounded_rect(fb, x, y, 390, 46, 3, fill); + stroke_rounded_rect(fb, x, y, 390, 46, 3, 1, active == row ? 0xFF6C6C72 : 0xFF404044); + fb_text(fb, net->selected == row ? ">" : " ", x + 12, y + 14, fg, fill); if (row < g_wifi_scan_count) { - fb_text(fb, g_wifi_ssids[row], x + 42, y + 8, fg, fill); - fb_text(fb, g_wifi_meta[row], x + 42, y + 28, 0xFF7F97AC, fill); + fb_text(fb, g_wifi_ssids[row], x + 42, y + 6, fg, fill); + fb_text(fb, g_wifi_meta[row], x + 42, y + 26, 0xFF808088, fill); } else { - /* 无扫描结果时的占位行 */ const char *placeholder = (g_wifi_scan_tried && g_wifi_scan_count == 0) ? "No networks found" : "(empty)"; - fb_text(fb, placeholder, x + 42, y + 16, 0xFF9AACC0, fill); + fb_text(fb, placeholder, x + 42, y + 14, 0xFF606068, fill); } } +/* 网络页面活跃元素索引 */ +#define NET_ACT_WIFI_BASE 0 +#define NET_ACT_SSID 4 +#define NET_ACT_PASS 5 +#define NET_ACT_SAVE 6 +#define NET_ACT_CONNECT 7 +#define NET_ACT_COUNT 8 + static void redraw_network_card(u32 *fb, i64 card_x, i64 card_y, setup_net *net, int active, i64 mx, i64 my, u32 bg, u32 fg) { u32 card = CARD_BG; cursor_erase(fb); fill_gradient_rect(fb, card_x - 24, card_y - 24, 948, 648); draw_card(fb, card_x, card_y, 900, 600, card, bg); fb_bitmap_alpha(fb, g_txt_network_title, g_txt_network_title_w, g_txt_network_title_h, card_x+40, card_y+40, fg, card, 255); - fb_text(fb, "Choose a network", card_x + 40, card_y + 88, 0xFF7F97AC, card); + fb_text(fb, "Network", card_x+40, card_y+40+g_txt_network_title_h+2, 0xFF9098A0, card); + fb_text(fb, "Choose or enter network", card_x + 40, card_y + 92, 0xFF808088, card); + + /* 左侧: WiFi 列表 */ for (int r=0; rselected; - if (preview < g_wifi_scan_count) { - fb_text(fb, g_wifi_ssids[preview], card_x + 494, card_y + 182, fg, INPUT_BG); - fb_text(fb, g_wifi_meta[preview], card_x + 494, card_y + 210, 0xFF7F97AC, INPUT_BG); - } else { - fb_text(fb, g_wifi_scan_tried ? "No networks found" : "WiFi not initialized", - card_x + 494, card_y + 182, 0xFF9AACC0, INPUT_BG); - fb_text(fb, g_wifi_scan_tried ? "Check ath9k driver" : "Run ath9k driver first", - card_x + 494, card_y + 210, 0xFF9AACC0, INPUT_BG); - } - fb_text(fb, "Use Up/Down or click menu", card_x + 494, card_y + 260, 0xFF7F97AC, INPUT_BG); - fb_text(fb, "Enter selects highlighted item", card_x + 494, card_y + 288, 0xFF7F97AC, INPUT_BG); + /* 右侧: 手动输入区 */ + fb_text(fb, "Network name (SSID)", card_x + 470, card_y + 120, 0xFF808088, card); + draw_rounded_input(fb, card_x + 470, card_y + 148, 390, 44, net->ssid, 0, fg, card, active == NET_ACT_SSID); + + fb_text(fb, "Password", card_x + 470, card_y + 210, 0xFF808088, card); + draw_rounded_input(fb, card_x + 470, card_y + 238, 390, 44, net->password, 1, fg, card, active == NET_ACT_PASS); + + /* 保存按钮 */ + { + u32 btn_bg = active == NET_ACT_SAVE ? 0xFF45454A : 0xFF3A3A3E; + fill_rounded_rect(fb, card_x + 470, card_y + 310, 180, 44, 3, btn_bg); + stroke_rounded_rect(fb, card_x + 470, card_y + 310, 180, 44, 3, 1, active == NET_ACT_SAVE ? 0xFF6C6C72 : 0xFF404044); + fb_text(fb, "Save", card_x + 530, card_y + 322, fg, btn_bg); + } + /* 连接按钮 */ + { + u32 btn_bg = active == NET_ACT_CONNECT ? 0xFF4A6A8A : 0xFF3A5070; + fill_rounded_rect(fb, card_x + 680, card_y + 310, 180, 44, 3, btn_bg); + stroke_rounded_rect(fb, card_x + 680, card_y + 310, 180, 44, 3, 1, active == NET_ACT_CONNECT ? 0xFF6A8AAA : 0xFF404060); + fb_text(fb, "Connect", card_x + 725, card_y + 322, 0xFFE0E0E0, btn_bg); + } + + /* 状态提示 */ + if (net->connected) { + fb_text(fb, "Network profile saved", card_x + 470, card_y + 380, 0xFF5FAF6F, card); + } else if (net->ssid[0]) { + fb_text(fb, "Press Save or Connect", card_x + 470, card_y + 380, 0xFF808088, card); + } else { + fb_text(fb, "Select network or type SSID", card_x + 470, card_y + 380, 0xFF606068, card); + } + fb_text(fb, "Save=save config only", card_x + 470, card_y + 510, 0xFF606068, card); + fb_text(fb, "Connect=save and connect", card_x + 470, card_y + 535, 0xFF606068, card); - fb_text(fb, "Password", card_x + 470, card_y + 400, fg, card); - draw_rounded_input(fb, card_x + 470, card_y + 430, 390, 44, net->password, 1, fg, card, active == WIFI_SCAN_COUNT); - u32 btn = active == WIFI_SCAN_COUNT + 1 ? 0xFFFFFFFF : 0xFFDCECF8; - fill_rounded_rect(fb, card_x + 620, card_y + 500, 240, 48, 10, btn); - stroke_rounded_rect(fb, card_x + 620, card_y + 500, 240, 48, 10, 1, active == WIFI_SCAN_COUNT + 1 ? 0xFFB6C9DD : card); - fb_text(fb, "Connect", card_x + 690, card_y + 516, fg, btn); - if (net->connected) fb_text(fb, "Connection profile saved", card_x + 40, card_y + 515, 0xFF4F8A5F, card); - else fb_text(fb, "Select SSID, enter password, then Connect", card_x + 40, card_y + 555, 0xFF7F97AC, card); cursor_draw(fb, mx, my); } static void read_network_page(u32 *fb, i64 card_x, i64 card_y, setup_net *net, i64 *mx, i64 *my, u32 bg, u32 fg) { int active = 0, mcnt = 0, e0 = 0, shift = 0; u8 mpkt[3]; u8 prev_btns = 0; - int len = 0; - while (net->password[len]) len++; + int plen = 0; + int slen = 0; + while (net->password[plen]) plen++; + while (net->ssid[slen]) slen++; net_select(net, net->selected); redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); for (;;) { @@ -885,23 +1142,41 @@ static void read_network_page(u32 *fb, i64 card_x, i64 card_y, setup_net *net, i cursor_draw(fb, *mx, *my); } if ((btns & 1) && !(prev_btns & 1)) { + /* WiFi 列表点击 */ for (int r=0; r= card_x + 40 && *mx < card_x + 430 && *my >= ry && *my < ry + 50) { + i64 ry = card_y + 132 + (i64)r * 56; + if (*mx >= card_x + 40 && *mx < card_x + 430 && *my >= ry && *my < ry + 46) { active = r; net_select(net, r); - len = 0; + slen = 0; + while (net->ssid[slen]) slen++; + plen = 0; redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); } } - if (*mx >= card_x + 470 && *mx < card_x + 860 && *my >= card_y + 430 && *my < card_y + 474) { - active = WIFI_SCAN_COUNT; + /* SSID 输入框 */ + if (*mx >= card_x + 470 && *mx < card_x + 860 && *my >= card_y + 148 && *my < card_y + 192) { + active = NET_ACT_SSID; redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); } - if (*mx >= card_x + 620 && *mx < card_x + 860 && *my >= card_y + 500 && *my < card_y + 548) { + /* 密码输入框 */ + if (*mx >= card_x + 470 && *mx < card_x + 860 && *my >= card_y + 238 && *my < card_y + 282) { + active = NET_ACT_PASS; + redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); + } + /* 保存按钮 */ + if (*mx >= card_x + 470 && *mx < card_x + 650 && *my >= card_y + 310 && *my < card_y + 354) { net->connected = 1; - logl("[FirstInit] wireless profile selected"); - redraw_network_card(fb, card_x, card_y, net, WIFI_SCAN_COUNT + 1, *mx, *my, bg, fg); + logl("[FirstInit] network profile saved"); + redraw_network_card(fb, card_x, card_y, net, NET_ACT_SAVE, *mx, *my, bg, fg); + for (int i=0;i<30;i++) delay_frame(); + return; + } + /* 连接按钮 */ + if (*mx >= card_x + 680 && *mx < card_x + 860 && *my >= card_y + 310 && *my < card_y + 354) { + net->connected = 1; + logl("[FirstInit] network connect requested"); + redraw_network_card(fb, card_x, card_y, net, NET_ACT_CONNECT, *mx, *my, bg, fg); for (int i=0;i<30;i++) delay_frame(); return; } @@ -920,7 +1195,7 @@ static void read_network_page(u32 *fb, i64 card_x, i64 card_y, setup_net *net, i e0=0; continue; } if (e0 && sc == 0x50) { - if (active < WIFI_SCAN_COUNT + 1) active++; + if (active < NET_ACT_COUNT - 1) active++; redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); e0=0; continue; } @@ -930,13 +1205,22 @@ static void read_network_page(u32 *fb, i64 card_x, i64 card_y, setup_net *net, i if (c == '\n') { if (active < WIFI_SCAN_COUNT) { net_select(net, active); - len = 0; - active = WIFI_SCAN_COUNT; - } else if (active == WIFI_SCAN_COUNT) { - active = WIFI_SCAN_COUNT + 1; - } else { + slen = 0; + while (net->ssid[slen]) slen++; + active = NET_ACT_PASS; + } else if (active == NET_ACT_SSID) { + active = NET_ACT_PASS; + } else if (active == NET_ACT_PASS) { + active = NET_ACT_CONNECT; + } else if (active == NET_ACT_SAVE) { net->connected = 1; - logl("[FirstInit] wireless profile selected"); + logl("[FirstInit] network profile saved"); + redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); + for (int i=0;i<30;i++) delay_frame(); + return; + } else if (active == NET_ACT_CONNECT) { + net->connected = 1; + logl("[FirstInit] network connect requested"); redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); for (int i=0;i<30;i++) delay_frame(); return; @@ -945,16 +1229,28 @@ static void read_network_page(u32 *fb, i64 card_x, i64 card_y, setup_net *net, i continue; } if (c == '\t') { - active = (active + 1) % (WIFI_SCAN_COUNT + 2); + active = (active + 1) % NET_ACT_COUNT; redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); continue; } - if (active == WIFI_SCAN_COUNT) { + /* SSID 输入 */ + if (active == NET_ACT_SSID) { if (c == 8) { - if (len > 0) net->password[--len] = 0; - } else if (len < 63 && c >= 32 && c <= 126) { - net->password[len++] = c; - net->password[len] = 0; + if (slen > 0) net->ssid[--slen] = 0; + } else if (slen < 31 && c >= 32 && c <= 126) { + net->ssid[slen++] = c; + net->ssid[slen] = 0; + } + net->connected = 0; + redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); + } + /* 密码输入 */ + if (active == NET_ACT_PASS) { + if (c == 8) { + if (plen > 0) net->password[--plen] = 0; + } else if (plen < 63 && c >= 32 && c <= 126) { + net->password[plen++] = c; + net->password[plen] = 0; } net->connected = 0; redraw_network_card(fb, card_x, card_y, net, active, *mx, *my, bg, fg); @@ -981,9 +1277,12 @@ static void sha256(const char *msg, u8 out[32]) { for(int i=0;i<8;i++){out[i*4]=(u8)(h[i]>>24);out[i*4+1]=(u8)(h[i]>>16);out[i*4+2]=(u8)(h[i]>>8);out[i*4+3]=(u8)h[i];} } +static u8 g_conf_data[1024]; +static u32 g_conf_size; + static void build_user_conf(const char *pc, const char *user, const char *pass, const setup_prefs *prefs, const setup_net *net) { u8 hash[32]; sha256(pass, hash); - static char conf[1024]; int p=0; + char *conf = (char *)g_conf_data; int p=0; const char *pre="DESHAB_USERCONF_V1\ncomputer="; for(int i=0;pre[i];i++) conf[p++]=pre[i]; for(int i=0;pc[i]&&p<740;i++) conf[p++]=pc[i]; @@ -1011,15 +1310,18 @@ static void build_user_conf(const char *pc, const char *user, const char *pass, const char *ni="\nnetwork.ip=dhcp"; for(int i=0;ni[i];i++) conf[p++]=ni[i]; const char *dns="\nnetwork.dns=auto"; for(int i=0;dns[i];i++) conf[p++]=dns[i]; conf[p++]='\n'; - /* XOR encrypt buffer with hash-derived stream; real disk write waits for FAT32 write support. */ + /* XOR encrypt buffer with hash-derived stream; DSK writes to FAT32 after return. */ for(int i=0;imagic != 0x44534B31424F4F54ULL) { logl("[FirstInit] bad context"); @@ -1049,13 +1351,20 @@ void dsk_entry(const dsk_boot_context *ctx) { fade_ring(fb, cx, cy, bg); logl("[FirstInit] ring faded"); - /* center text: Chinese bitmaps */ + /* center text: Chinese bitmaps + English subtitle below */ i64 tw = g_txt_welcome_w, tx = cx - tw/2, ty = cy - g_txt_welcome_h/2; + /* English subtitle sits below the Chinese bitmap, centered independently */ + const char *welcome_en = "Welcome to Deshab"; + i64 en_w = fb_text_width(welcome_en); + i64 en_x = cx - en_w/2, en_y = ty + g_txt_welcome_h + 6; + /* subtitle color: dimmer than WELCOME_FG so it reads as secondary */ + u32 sub_fg = 0xFFA8B8C8; logl("[FirstInit] fading in welcome"); for (u32 a=0; a<=255; a+=17) { - fill_gradient_rect(fb, tx-4, ty-4, tw+8, g_txt_welcome_h+8); + fill_gradient_rect(fb, tx-4, ty-4, tw+8, g_txt_welcome_h + 6 + ASCII_H + 4); fb_bitmap_alpha(fb, g_txt_welcome, tw, g_txt_welcome_h, tx, ty, WELCOME_FG, bg_at_y(ty + g_txt_welcome_h / 2), a); + fb_text_alpha(fb, welcome_en, en_x, en_y, sub_fg, bg_at_y(en_y + ASCII_H/2), a); delay_frame(); } logl("[FirstInit] welcome drawn"); @@ -1064,16 +1373,26 @@ void dsk_entry(const dsk_boot_context *ctx) { logl("[FirstInit] cross-fading to setup message"); i64 tw2 = g_txt_setup_w, tx2 = cx - tw2/2; - i64 area_x = tx2 < tx ? tx2 : tx; - i64 area_w = (tx2 + tw2 > tx + tw ? tx2 + tw2 : tx + tw) - area_x; - i64 area_h = (g_txt_setup_h > g_txt_welcome_h ? g_txt_setup_h : g_txt_welcome_h) + 8; + const char *setup_en = "Let's set up your system"; + i64 en2_w = fb_text_width(setup_en); + i64 en2_x = cx - en2_w/2; + i64 area_x = (tx2 < tx ? tx2 : tx); + if (en_x < area_x) area_x = en_x; + if (en2_x < area_x) area_x = en2_x; + i64 area_right = tx + tw; if (tx2 + tw2 > area_right) area_right = tx2 + tw2; + if (en_x + en_w > area_right) area_right = en_x + en_w; + if (en2_x + en2_w > area_right) area_right = en2_x + en2_w; + i64 area_w = area_right - area_x; + i64 area_h = (g_txt_setup_h > g_txt_welcome_h ? g_txt_setup_h : g_txt_welcome_h) + 6 + ASCII_H + 8; for (u32 step=0; step<=15; step++) { u32 a2 = step * 17; u32 a1 = 255 - a2; fill_gradient_rect(fb, area_x-4, ty-4, area_w+8, area_h); fb_bitmap_alpha(fb, g_txt_welcome, tw, g_txt_welcome_h, tx, ty, WELCOME_FG, bg_at_y(ty + g_txt_welcome_h / 2), a1); + fb_text_alpha(fb, welcome_en, en_x, en_y, sub_fg, bg_at_y(en_y + ASCII_H/2), a1); fb_bitmap_alpha(fb, g_txt_setup, tw2, g_txt_setup_h, tx2, ty, WELCOME_FG, bg_at_y(ty + g_txt_setup_h / 2), a2); + fb_text_alpha(fb, setup_en, en2_x, en_y, sub_fg, bg_at_y(en_y + ASCII_H/2), a2); delay_frame(); } logl("[FirstInit] setup message drawn"); @@ -1089,13 +1408,14 @@ void dsk_entry(const dsk_boot_context *ctx) { logl("[FI] fadein start"); /* Phase 1: fade in card background only (no title) — avoids title/card color mismatch flicker */ for (u32 a=0; a<=255; a+=17) { - draw_card_fade(fb, card_x, card_y, 900, 600, 12, a); + draw_card_fade(fb, card_x, card_y, 900, 600, 4, a); delay_frame(); } /* Phase 2: draw title once on fully-rendered card */ { u32 title_bg = blend(bg_at_y(card_y + 40 + g_txt_title_h/2), CARD_BG, 255); fb_bitmap_alpha(fb, g_txt_title, g_txt_title_w, g_txt_title_h, card_x+40, card_y+40, fg, title_bg, 255); + fb_text(fb, "Account Setup", card_x+40, card_y+40+g_txt_title_h+2, 0xFF9098A0, title_bg); } logl("[FI] fadein done"); logl("[FirstInit] initializing PS/2 mouse"); @@ -1103,10 +1423,89 @@ void dsk_entry(const dsk_boot_context *ctx) { i64 mx = cx, my = cy; { int field = 0; - while (field < 3) { - field = read_field(fb, card_x, card_y, field, pc, user, pass, &mx, &my, bg, fg); + for (;;) { + while (field < 3) { + field = read_field(fb, card_x, card_y, field, pc, user, pass, &mx, &my, bg, fg); + } + /* Validate: all fields must be non-empty */ + if (pc[0] != 0 && user[0] != 0 && pass[0] != 0) break; + /* Show warning message on card (overwrite hint area) */ + cursor_erase(fb); + { + u32 card = CARD_BG; + fill_rect(fb, card_x + 40, card_y + 550, 820, 45, card); + fb_text(fb, "Please fill in all fields", card_x + 40, card_y + 555, 0xFFFF6B6B, card); + fb_text(fb, "Press Enter to continue", card_x + 40, card_y + 575, 0xFFC0C0C0, card); + } + cursor_draw(fb, mx, my); /* 重绘鼠标光标,避免校验失败时光标消失 */ + logl("[FI] validation failed: empty field(s)"); + /* 等待用户确认:Enter/任意键回到 field 0,或点击输入框切换字段。 + * 避免死等 Enter 导致用户点击/输入无响应。 */ + int next_field = 0; + { + int release = 0; + int mcnt = 0; + u8 mpkt[3]; + u8 prev_btns = 0; + int done = 0; + while (!done) { + u8 st = inb(0x64); + if (!(st & 1)) { __asm__("pause"); continue; } + u8 data = inb(0x60); + if (st & 0x20) { + /* 鼠标数据:组装 3 字节包,同步位 bit 3 */ + if (mcnt == 0 && !(data & 0x08)) continue; + mpkt[mcnt++] = data; + if (mcnt < 3) continue; + mcnt = 0; + i64 dx = (i64)(i8)mpkt[1]; + i64 dy = (i64)(i8)mpkt[2]; + u8 btns = mpkt[0] & 0x07; + if (dx != 0 || dy != 0) { + cursor_erase(fb); + mx += dx; + my -= dy; /* invert Y: 鼠标上移 = 屏幕上移 */ + if (mx < 0) mx = 0; + if (my < 0) my = 0; + if ((u64)mx >= fb_w) mx = (i64)fb_w - 1; + if ((u64)my >= fb_h) my = (i64)fb_h - 1; + cursor_draw(fb, mx, my); + } + /* 左键点击输入框:切换到该字段重新输入 */ + if ((btns & 1) && !(prev_btns & 1)) { + for (int f = 0; f < 3; f++) { + i64 fy = card_y + 180 + (i64)f * 150; + if (my >= fy && my < fy + 44 && mx >= card_x + 40 && mx < card_x + 860) { + next_field = f; + done = 1; + break; + } + } + } + prev_btns = btns; + continue; + } + u8 sc = data; + if (sc == 0xF0) { release = 1; continue; } + if (release) { release = 0; continue; } + if (sc & 0x80) continue; /* Set 1 release code */ + /* Enter 或任意按键:退出等待,回到 field 0 重新输入 */ + next_field = 0; + done = 1; + } + } + /* Reset all fields and restart input from next_field. + * read_field() will call redraw_setup_card() which fully + * redraws the card (title, labels, inputs, hint) and cursor. */ + pc[0] = 0; user[0] = 0; pass[0] = 0; + field = next_field; } } + logl("[FI] all fields done"); + /* 重置光标状态,避免页面切换时崩溃 */ + cursor_bg_valid = 0; + cursor_cur_x = -100; + cursor_cur_y = -100; setup_prefs prefs; prefs.language = 0; /* zh-CN */ prefs.region = 0; /* CN */ @@ -1114,6 +1513,10 @@ void dsk_entry(const dsk_boot_context *ctx) { prefs.keyboard = 0; /* US-QWERTY */ prefs.theme = 0; /* Light */ read_prefs_page(fb, card_x, card_y, &prefs, &mx, &my, bg, fg); + /* 重置光标状态,避免页面切换时崩溃 */ + cursor_bg_valid = 0; + cursor_cur_x = -100; + cursor_cur_y = -100; /* 查询真实 WiFi 扫描结果(来自 ath9k 驱动通过 kernel_api.net.scan_*) */ wifi_query_scan(ctx->dkm_kernel_api); setup_net net; @@ -1121,23 +1524,36 @@ void dsk_entry(const dsk_boot_context *ctx) { net.connected = 0; net.ssid[0] = 0; net.password[0] = 0; - if (g_no_wireless_device) { - /* QEMU 或无无线网卡场景:跳过 WiFi 设置页面,network.mode=disabled */ - logl("[FirstInit] no wireless device, skipping WiFi setup page"); - net.connected = 0; - } else { - cursor_bg_valid = 0; - cursor_cur_x = -100; - cursor_cur_y = -100; - logl("[FirstInit] entering wireless setup page"); - read_network_page(fb, card_x, card_y, &net, &mx, &my, bg, fg); - logl("[FirstInit] wireless setup page returned"); - } + /* 始终显示网络设置页面,即使无无线设备也展示页面让用户确认 */ + cursor_bg_valid = 0; + cursor_cur_x = -100; + cursor_cur_y = -100; + logl("[FirstInit] entering network setup page"); + read_network_page(fb, card_x, card_y, &net, &mx, &my, bg, fg); + logl("[FirstInit] network setup page returned"); build_user_conf(pc, user, pass, &prefs, &net); + /* Pass config buffer to DSK via boot context reserved fields */ + { + dsk_boot_context *ctx_mut = (dsk_boot_context *)ctx; + ctx_mut->reserved[0] = (u64)(u64*)g_conf_data; + ctx_mut->reserved[1] = (u64)g_conf_size; + } + logl("[FirstInit] config ready for DSK to write"); + cursor_erase(fb); fill_gradient_rect(fb, card_x - 24, card_y - 24, 948, 648); - fb_bitmap_alpha(fb, g_txt_done, g_txt_done_w, g_txt_done_h, cx - g_txt_done_w/2, cy - 20, fg, bg_at_y(cy), 255); + fb_bitmap_alpha(fb, g_txt_done, g_txt_done_w, g_txt_done_h, cx - g_txt_done_w/2, cy - 30, fg, bg_at_y(cy), 255); + /* English subtitle below the Chinese done bitmap */ + { const char *done_en = "Setup Complete"; + i64 dw = fb_text_width(done_en); + fb_text(fb, done_en, cx - dw/2, cy + 2, 0xFFA8B8C8, bg_at_y(cy + 10)); + } + /* status line below the subtitle */ + { const char *status = "System starting..."; + i64 sw = fb_text_width(status); + fb_text(fb, status, cx - sw/2, cy + 28, 0xFF808088, bg_at_y(cy + 36)); + } logl("[FirstInit] user setup finished"); /* 短暂停留后返回,由 DSK 接管加载 shell */ diff --git a/CODE/firstInit/main.o b/CODE/firstInit/main.o index 582fbfa4470ebf6add2f6f09c6b6d9a8565da2fe..efa29d2064d4b242356450217129f5d5ffdb21be 100644 GIT binary patch literal 167024 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 diff --git a/CODE/firstInit/text_bitmaps.c b/CODE/firstInit/text_bitmaps.c index 2c693ee..a343ddc 100644 --- a/CODE/firstInit/text_bitmaps.c +++ b/CODE/firstInit/text_bitmaps.c @@ -1,97 +1,97 @@ /* Auto-generated */ -static const int g_txt_welcome_w = 360; -static const int g_txt_welcome_h = 54; -static const unsigned char g_txt_welcome[360*54] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 61, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 202, 137, 76, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 123, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 166, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 207, 118, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 255, 255, 247, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 255, 255, 255, 252, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 218, 255, 255, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 144, 243, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 255, 255, 250, 173, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 255, 255, 255, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 255, 255, 255, 161, 0, 0, 0, 0, 0, 0, 0, 0, 20, 70, 132, 209, 255, 255, 255, 255, 255, 226, 27, 5, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 228, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 245, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 255, 255, 255, 242, 8, 0, 0, 0, 0, 0, 0, 198, 255, 255, 255, 255, 255, 255, 255, 255, 254, 215, 120, 26, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 255, 255, 255, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 215, 255, 255, 255, 255, 251, 198, 136, 74, 17, 0, 0, 17, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 239, 255, 255, 242, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 255, 255, 255, 238, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 252, 255, 255, 252, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 246, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 207, 255, 255, 237, 72, 12, 0, 0, 0, 0, 0, 0, 8, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 255, 255, 255, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 51, 199, 188, 176, 169, 165, 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 130, 0, 0, 0, 0, 157, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 255, 255, 255, 244, 8, 0, 0, 0, 0, 0, 200, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 255, 255, 255, 54, 0, 47, 245, 232, 222, 215, 211, 209, 208, 208, 208, 208, 208, 208, 220, 255, 255, 255, 223, 208, 208, 208, 208, 208, 208, 211, 214, 217, 222, 232, 242, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 252, 236, 217, 196, 142, 77, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 169, 0, 0, 0, 0, 213, 255, 255, 248, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, 255, 255, 255, 76, 0, 0, 0, 0, 0, 193, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 249, 255, 255, 215, 0, 0, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 244, 137, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 121, 0, 0, 0, 16, 254, 255, 255, 234, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 255, 255, 255, 152, 0, 0, 0, 0, 0, 185, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 255, 255, 129, 0, 0, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 35, 139, 131, 124, 116, 109, 101, 96, 96, 96, 96, 96, 114, 255, 255, 255, 72, 0, 0, 0, 71, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 255, 255, 231, 140, 0, 0, 0, 0, 0, 178, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 233, 255, 255, 255, 112, 0, 0, 17, 87, 73, 64, 57, 52, 50, 48, 48, 48, 48, 48, 48, 100, 255, 255, 255, 113, 48, 48, 48, 48, 48, 49, 52, 55, 58, 63, 74, 84, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 186, 144, 147, 167, 193, 248, 255, 255, 255, 255, 255, 251, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 255, 255, 255, 24, 0, 0, 0, 136, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 134, 53, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 255, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 11, 91, 223, 255, 255, 255, 255, 251, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 255, 255, 230, 0, 0, 0, 0, 206, 255, 255, 214, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 212, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 221, 255, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 8, 176, 255, 255, 255, 255, 211, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 255, 255, 172, 0, 0, 0, 27, 254, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 255, 255, 224, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 255, 255, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 255, 255, 255, 121, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 226, 255, 255, 226, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 181, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 4, 187, 255, 255, 255, 255, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 210, 255, 255, 114, 0, 0, 0, 119, 255, 255, 253, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 220, 255, 255, 255, 255, 255, 112, 0, 0, 0, 0, 84, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 196, 255, 255, 255, 201, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 32, 250, 255, 255, 255, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 239, 121, 0, 0, 0, 0, 0, 15, 253, 255, 255, 57, 0, 0, 0, 213, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 255, 255, 255, 255, 255, 255, 112, 0, 0, 0, 0, 112, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 255, 255, 255, 250, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 143, 255, 255, 251, 61, 0, 0, 0, 0, 79, 255, 255, 248, 6, 0, 0, 75, 255, 255, 255, 94, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 237, 2, 0, 0, 0, 0, 0, 0, 0, 80, 96, 84, 74, 69, 65, 64, 64, 64, 27, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 11, 231, 255, 255, 208, 240, 255, 255, 112, 0, 0, 0, 0, 97, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 255, 220, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 248, 255, 255, 248, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 236, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 167, 255, 255, 255, 231, 24, 0, 0, 0, 153, 255, 255, 195, 0, 0, 0, 197, 255, 255, 243, 11, 0, 0, 0, 192, 235, 205, 170, 100, 0, 0, 0, 53, 255, 255, 255, 171, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 134, 255, 255, 255, 85, 240, 255, 255, 112, 0, 0, 0, 0, 90, 255, 255, 255, 88, 32, 32, 32, 32, 32, 32, 88, 255, 255, 255, 102, 32, 32, 32, 32, 32, 32, 32, 255, 255, 255, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 255, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 43, 64, 72, 51, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 57, 72, 72, 55, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 4, 43, 69, 73, 55, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 58, 74, 69, 52, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 11, 77, 108, 118, 94, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 201, 255, 255, 255, 191, 3, 0, 0, 227, 255, 255, 128, 0, 0, 64, 255, 255, 255, 159, 0, 0, 0, 0, 194, 255, 255, 255, 154, 0, 0, 0, 53, 153, 198, 249, 107, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 97, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 36, 248, 255, 255, 214, 2, 240, 255, 255, 112, 0, 0, 0, 0, 86, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 227, 255, 255, 255, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 179, 244, 255, 255, 255, 255, 250, 191, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 136, 225, 255, 255, 255, 255, 255, 255, 210, 112, 7, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 29, 155, 241, 255, 255, 255, 255, 250, 175, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 130, 222, 255, 255, 255, 255, 255, 253, 202, 100, 3, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 5, 137, 242, 255, 255, 255, 255, 255, 212, 79, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 229, 255, 255, 255, 130, 0, 49, 255, 255, 255, 61, 0, 0, 185, 255, 255, 255, 65, 0, 0, 0, 0, 197, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 8, 11, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 250, 245, 248, 255, 255, 255, 89, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 2, 194, 255, 255, 255, 90, 0, 240, 255, 255, 112, 0, 0, 0, 0, 81, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 25, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 181, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 217, 37, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 71, 238, 255, 255, 255, 255, 255, 255, 255, 255, 243, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 237, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 198, 21, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 12, 199, 255, 255, 255, 255, 255, 255, 255, 255, 255, 160, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 58, 250, 255, 255, 252, 57, 125, 255, 255, 234, 3, 0, 0, 22, 101, 201, 227, 2, 0, 0, 0, 0, 202, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 16, 3, 0, 0, 128, 255, 255, 255, 80, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 26, 223, 255, 255, 216, 2, 0, 240, 255, 255, 112, 0, 0, 0, 0, 87, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 255, 255, 255, 214, 0, 0, 0, 0, 0, 0, 44, 229, 255, 255, 255, 255, 252, 230, 237, 255, 255, 255, 255, 255, 208, 9, 0, 0, 0, 0, 0, 0, 0, 0, 74, 252, 255, 255, 255, 255, 249, 231, 236, 254, 255, 255, 255, 255, 228, 18, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 87, 253, 255, 255, 245, 198, 185, 233, 255, 255, 255, 255, 233, 17, 0, 0, 0, 0, 0, 0, 0, 90, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 199, 3, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 175, 255, 255, 255, 250, 231, 249, 255, 255, 255, 255, 255, 173, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 110, 255, 255, 255, 220, 208, 255, 255, 153, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 210, 255, 255, 255, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 74, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 17, 192, 255, 90, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 95, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 255, 255, 255, 228, 0, 0, 0, 0, 0, 19, 222, 255, 255, 255, 217, 89, 11, 0, 0, 26, 126, 247, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 7, 231, 255, 255, 255, 194, 58, 4, 0, 0, 8, 82, 206, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 154, 247, 255, 251, 130, 15, 0, 0, 3, 117, 254, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 29, 243, 255, 255, 255, 226, 104, 42, 20, 26, 55, 130, 248, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 255, 231, 90, 6, 0, 2, 66, 200, 255, 255, 255, 255, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 184, 255, 255, 255, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 71, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 21, 183, 2, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 103, 255, 255, 255, 112, 64, 64, 64, 64, 64, 64, 112, 255, 255, 255, 124, 64, 64, 64, 64, 64, 64, 64, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 255, 255, 255, 235, 0, 0, 0, 0, 0, 164, 255, 255, 255, 193, 12, 0, 0, 0, 0, 0, 0, 72, 255, 255, 255, 252, 29, 0, 0, 0, 0, 0, 0, 75, 255, 255, 255, 215, 7, 0, 0, 0, 0, 0, 0, 18, 241, 255, 255, 227, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 255, 255, 247, 71, 0, 0, 0, 0, 0, 0, 139, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 139, 255, 255, 255, 231, 30, 0, 0, 0, 0, 0, 0, 93, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 226, 29, 0, 0, 0, 0, 0, 4, 182, 255, 255, 255, 238, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 239, 255, 255, 255, 255, 241, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 68, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 111, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 255, 255, 255, 236, 0, 0, 0, 0, 37, 252, 255, 255, 244, 25, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 106, 255, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 164, 224, 224, 223, 4, 0, 0, 0, 0, 0, 96, 255, 255, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 21, 253, 255, 255, 240, 0, 0, 0, 0, 0, 0, 215, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 1, 224, 255, 255, 243, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 22, 243, 255, 255, 255, 103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 255, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 65, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 160, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 119, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 255, 255, 255, 166, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 236, 255, 255, 236, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 206, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 255, 255, 255, 229, 0, 0, 0, 0, 132, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 255, 255, 255, 190, 0, 0, 0, 0, 0, 0, 90, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 255, 255, 255, 0, 0, 0, 0, 0, 0, 62, 64, 64, 64, 11, 0, 0, 0, 0, 0, 0, 0, 0, 193, 255, 255, 255, 9, 0, 0, 0, 0, 0, 192, 255, 255, 255, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 255, 255, 255, 176, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 226, 255, 255, 255, 239, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 255, 255, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 0, 0, 9, 125, 16, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 170, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 94, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 220, 255, 255, 255, 199, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 255, 255, 255, 217, 0, 0, 0, 0, 198, 255, 255, 255, 153, 112, 112, 112, 112, 112, 112, 112, 112, 112, 138, 255, 255, 255, 241, 1, 0, 0, 0, 0, 0, 35, 255, 255, 255, 252, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 254, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 140, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 255, 255, 255, 232, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 255, 255, 255, 255, 255, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 255, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 0, 176, 255, 255, 224, 0, 0, 1, 90, 226, 255, 32, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 0, 210, 255, 255, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 9, 14, 0, 0, 0, 0, 0, 0, 126, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 255, 255, 255, 194, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 184, 255, 255, 255, 254, 187, 115, 66, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 64, 108, 157, 219, 255, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 255, 255, 255, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 255, 255, 255, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 255, 255, 246, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 0, 179, 255, 255, 224, 0, 65, 202, 255, 255, 255, 56, 0, 0, 240, 255, 255, 160, 0, 0, 0, 0, 0, 95, 255, 255, 255, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 0, 18, 197, 175, 0, 0, 0, 0, 0, 0, 145, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 255, 255, 255, 199, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 244, 255, 255, 244, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 226, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 255, 255, 255, 165, 0, 0, 0, 12, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 29, 227, 255, 255, 255, 255, 255, 255, 255, 232, 181, 112, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 4, 83, 164, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 253, 255, 255, 255, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 254, 255, 255, 206, 255, 255, 255, 233, 16, 0, 0, 0, 0, 0, 0, 0, 0, 2, 237, 255, 255, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 0, 214, 255, 255, 238, 189, 255, 255, 255, 255, 255, 90, 0, 0, 240, 255, 255, 160, 0, 0, 99, 176, 219, 255, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 55, 227, 255, 255, 119, 0, 0, 0, 0, 0, 175, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 252, 255, 255, 255, 124, 0, 0, 0, 27, 255, 255, 255, 255, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 24, 0, 0, 0, 0, 0, 0, 0, 22, 160, 250, 255, 255, 255, 255, 255, 255, 255, 255, 254, 178, 35, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 73, 222, 255, 255, 255, 255, 255, 255, 255, 255, 234, 160, 209, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 255, 43, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 255, 255, 255, 46, 179, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 67, 255, 255, 255, 231, 255, 255, 222, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 47, 255, 255, 255, 255, 255, 255, 255, 255, 222, 117, 22, 0, 0, 240, 255, 255, 160, 0, 0, 56, 255, 255, 255, 255, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 19, 219, 255, 255, 254, 85, 0, 0, 0, 0, 210, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 255, 255, 255, 255, 69, 0, 0, 0, 14, 255, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 94, 154, 199, 242, 255, 255, 255, 255, 255, 255, 243, 55, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 102, 254, 255, 255, 255, 255, 230, 184, 143, 98, 47, 2, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 255, 255, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 52, 254, 255, 255, 185, 0, 42, 252, 255, 255, 251, 42, 0, 0, 0, 0, 0, 0, 0, 179, 255, 255, 252, 61, 254, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 202, 255, 255, 255, 255, 255, 255, 212, 89, 3, 0, 0, 0, 0, 240, 255, 255, 160, 0, 0, 0, 203, 255, 255, 255, 255, 177, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 0, 39, 239, 255, 255, 247, 66, 0, 0, 8, 250, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 255, 255, 252, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 255, 255, 255, 247, 11, 0, 0, 0, 0, 250, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 34, 95, 176, 252, 255, 255, 255, 225, 8, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 39, 251, 255, 255, 255, 168, 45, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 255, 255, 255, 255, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 191, 255, 255, 255, 67, 0, 0, 149, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 36, 253, 255, 255, 175, 0, 182, 255, 255, 238, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 124, 255, 255, 255, 255, 217, 88, 2, 0, 0, 0, 0, 0, 0, 244, 255, 255, 166, 0, 0, 0, 118, 251, 208, 143, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 64, 249, 255, 255, 246, 69, 0, 60, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 17, 240, 255, 255, 255, 172, 0, 0, 0, 0, 0, 207, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 16, 16, 16, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 248, 255, 255, 255, 88, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 150, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 255, 255, 255, 238, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 85, 255, 255, 255, 191, 0, 0, 0, 19, 238, 255, 255, 255, 80, 0, 0, 0, 0, 0, 168, 255, 255, 255, 59, 0, 64, 255, 255, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 8, 222, 255, 228, 101, 3, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 173, 0, 0, 0, 7, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 88, 254, 255, 255, 249, 96, 134, 255, 255, 254, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 254, 255, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 158, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 141, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 255, 255, 255, 66, 0, 0, 0, 0, 0, 125, 128, 128, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 255, 255, 255, 142, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 212, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 12, 226, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 255, 255, 255, 182, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 228, 255, 255, 255, 55, 0, 0, 0, 0, 111, 255, 255, 255, 221, 7, 0, 0, 0, 69, 255, 255, 255, 189, 0, 0, 0, 189, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 0, 74, 121, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 255, 255, 255, 255, 244, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 255, 255, 255, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 1, 145, 255, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 50, 255, 255, 255, 247, 38, 0, 0, 0, 0, 0, 0, 0, 0, 67, 255, 255, 255, 249, 14, 0, 0, 0, 0, 0, 232, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 255, 255, 255, 151, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 233, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 2, 169, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 253, 56, 0, 0, 0, 0, 0, 0, 0, 19, 238, 255, 255, 255, 112, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 170, 255, 255, 255, 174, 0, 0, 0, 0, 0, 4, 217, 255, 245, 114, 2, 0, 0, 20, 228, 255, 255, 254, 55, 0, 0, 0, 51, 253, 255, 255, 250, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 255, 255, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 255, 255, 255, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 96, 0, 0, 0, 0, 2, 68, 202, 255, 255, 255, 255, 236, 31, 0, 0, 0, 0, 0, 0, 0, 181, 255, 255, 255, 215, 33, 0, 0, 0, 0, 0, 0, 20, 216, 255, 255, 255, 164, 0, 0, 0, 0, 0, 0, 182, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 169, 255, 255, 255, 122, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 218, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 23, 178, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 223, 29, 0, 0, 0, 0, 0, 4, 179, 255, 255, 255, 243, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 96, 255, 255, 255, 247, 34, 0, 0, 0, 0, 0, 0, 80, 188, 34, 0, 0, 0, 5, 191, 255, 255, 255, 158, 0, 0, 0, 0, 0, 154, 255, 255, 255, 245, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 255, 255, 255, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 232, 255, 255, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 176, 128, 131, 149, 174, 236, 255, 255, 255, 255, 255, 234, 55, 0, 0, 0, 0, 0, 0, 0, 0, 32, 236, 255, 255, 255, 240, 128, 41, 1, 0, 19, 95, 225, 255, 255, 255, 242, 33, 0, 0, 0, 0, 0, 0, 87, 255, 255, 255, 242, 120, 33, 0, 0, 0, 0, 23, 150, 255, 255, 255, 255, 45, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 160, 255, 255, 255, 253, 128, 23, 0, 16, 63, 155, 243, 255, 255, 255, 255, 255, 255, 24, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 255, 233, 100, 15, 0, 10, 77, 204, 255, 255, 255, 255, 120, 0, 0, 0, 0, - 0, 0, 0, 0, 50, 244, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 167, 255, 255, 255, 229, 19, 0, 0, 0, 0, 0, 15, 221, 255, 255, 255, 248, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 255, 255, 255, 199, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 247, 255, 255, 255, 255, 246, 102, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 255, 255, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 206, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 242, 255, 255, 255, 255, 255, 252, 245, 255, 255, 255, 255, 255, 249, 79, 0, 0, 0, 0, 0, 0, 0, 0, 181, 255, 255, 255, 255, 255, 230, 207, 196, 217, 253, 255, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 47, 251, 255, 255, 255, 255, 255, 248, 255, 255, 255, 255, 255, 244, 220, 255, 255, 255, 62, 0, 0, 0, 0, 0, 192, 255, 255, 255, 195, 255, 255, 255, 255, 246, 255, 255, 255, 255, 255, 255, 180, 1, 0, 0, 0, 0, - 0, 0, 0, 28, 229, 255, 255, 255, 220, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 166, 255, 255, 255, 253, 65, 0, 0, 0, 0, 0, 0, 0, 41, 236, 255, 255, 255, 255, 158, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 247, 255, 255, 255, 255, 253, 172, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 144, 144, 144, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 255, 255, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 235, 255, 255, 255, 255, 255, 255, 255, 198, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 255, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 224, 103, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 218, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 228, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 169, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 164, 7, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 93, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 229, 55, 152, 255, 255, 255, 152, 0, 0, 0, 0, 0, 192, 255, 255, 255, 21, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 161, 6, 0, 0, 0, 0, 0, - 0, 0, 7, 208, 255, 255, 255, 254, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 194, 255, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 233, 255, 255, 255, 255, 226, 100, 4, 0, 0, 0, 0, 0, 0, 0, 0, 120, 254, 255, 255, 255, 255, 255, 255, 255, 255, 216, 130, 58, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 241, 255, 255, 255, 160, 199, 255, 255, 255, 255, 255, 201, 102, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 254, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 255, 255, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 248, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 250, 232, 202, 138, 71, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 105, 211, 255, 255, 255, 255, 255, 255, 230, 127, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 176, 248, 255, 255, 255, 255, 255, 255, 253, 187, 72, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 46, 179, 252, 255, 255, 255, 255, 255, 222, 123, 10, 0, 73, 255, 255, 255, 250, 48, 0, 0, 0, 0, 192, 255, 255, 255, 0, 11, 147, 243, 255, 255, 255, 255, 255, 202, 74, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 77, 225, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 99, 238, 255, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 216, 255, 255, 255, 255, 255, 223, 132, 31, 0, 0, 0, 0, 1, 144, 255, 255, 255, 219, 85, 70, 173, 255, 255, 255, 255, 255, 255, 244, 194, 143, 104, 66, 36, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 26, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 31, 179, 255, 255, 255, 255, 136, 0, 3, 122, 245, 255, 255, 255, 255, 255, 251, 199, 135, 81, 38, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 255, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 255, 255, 242, 0, 0, 0, 0, 0, 0, 119, 229, 229, 242, 255, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 16, 16, 16, 16, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 76, 97, 105, 86, 43, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 50, 86, 101, 108, 96, 66, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 16, 16, 16, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 73, 101, 104, 81, 41, 0, 0, 0, 0, 0, 15, 16, 16, 16, 8, 0, 0, 0, 0, 12, 16, 16, 16, 0, 0, 0, 9, 67, 95, 103, 80, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 14, 169, 222, 12, 0, 0, 0, 0, 0, 0, 0, 0, 2, 80, 207, 255, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 178, 255, 255, 255, 255, 255, 227, 21, 0, 0, 0, 4, 163, 255, 255, 255, 222, 24, 0, 0, 0, 54, 175, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 244, 230, 217, 205, 198, 191, 186, 182, 178, 176, 176, 176, 180, 184, 190, 198, 209, 223, 240, 254, 230, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 255, 255, 255, 129, 0, 0, 0, 0, 0, 36, 157, 250, 255, 255, 255, 249, 109, 0, 0, 0, 0, 29, 163, 252, 255, 255, 255, 255, 255, 255, 255, 255, 251, 228, 202, 183, 173, 69, 0, 0, 0, 0, 0, 63, 255, 255, 255, 239, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 252, 0, 0, 0, 0, 0, 0, 27, 253, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 255, 255, 255, 255, 251, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 114, 249, 255, 255, 253, 57, 0, 0, 0, 7, 175, 255, 255, 255, 246, 48, 0, 0, 0, 0, 0, 0, 33, 132, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 255, 255, 255, 137, 0, 0, 15, 95, 184, 252, 255, 255, 255, 255, 219, 51, 0, 0, 0, 0, 0, 0, 0, 34, 148, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 190, 1, 0, 0, 0, 0, 8, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 255, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 205, 255, 255, 255, 255, 255, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 255, 255, 255, 236, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 210, 255, 152, 0, 0, 0, 0, 14, 184, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 120, 184, 231, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 244, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 255, 255, 255, 145, 0, 12, 194, 255, 255, 255, 255, 255, 249, 141, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 85, 163, 235, 255, 255, 255, 255, 255, 255, 255, 54, 0, 0, 0, 0, 0, 25, 141, 229, 255, 246, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 112, 112, 112, 112, 5, 0, 0, 0, 0, 0, 0, 150, 255, 252, 207, 126, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 255, 193, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 124, 20, 0, 0, 0, 0, 0, 3, 149, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 66, 99, 127, 152, 175, 195, 214, 231, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 255, 255, 255, 153, 0, 0, 5, 168, 255, 255, 254, 172, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 39, 92, 135, 171, 201, 219, 199, 0, 0, 0, 0, 0, 0, 0, 0, 8, 118, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 52, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 17, 29, 39, 47, 54, 61, 66, 70, 74, 77, 78, 79, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 80, 80, 80, 49, 0, 0, 0, 8, 210, 143, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static const int g_txt_welcome_w = 270; +static const int g_txt_welcome_h = 42; +static const unsigned char g_txt_welcome[270*42] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 105, 70, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 237, 178, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 134, 212, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 118, 242, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 226, 128, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 255, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 254, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 255, 255, 108, 0, 0, 0, 0, 0, 0, 33, 90, 166, 242, 255, 255, 243, 47, 12, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 255, 255, 198, 0, 0, 0, 0, 0, 216, 255, 255, 255, 255, 255, 238, 183, 105, 82, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 250, 255, 244, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 245, 255, 254, 30, 0, 0, 0, 0, 222, 255, 251, 174, 109, 46, 1, 0, 0, 73, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 255, 255, 191, 104, 104, 104, 104, 104, 104, 104, 165, 255, 255, 165, 104, 104, 104, 104, 104, 104, 104, 106, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 147, 136, 127, 123, 120, 120, 120, 120, 120, 120, 120, 103, 0, 0, 0, 174, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 255, 255, 114, 0, 0, 0, 0, 215, 255, 232, 0, 0, 0, 0, 0, 0, 64, 255, 255, 154, 64, 64, 64, 64, 154, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 255, 255, 53, 0, 166, 174, 164, 160, 157, 156, 156, 156, 156, 174, 255, 255, 204, 156, 156, 156, 156, 157, 160, 163, 170, 180, 114, 0, 0, 0, 0, 0, 0, 0, 39, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 192, 192, 192, 192, 187, 170, 150, 98, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 192, 192, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 192, 192, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 185, 0, 0, 0, 231, 255, 242, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 255, 255, 193, 0, 0, 0, 0, 208, 255, 232, 0, 0, 0, 0, 0, 0, 59, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 29, 252, 255, 215, 0, 0, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 33, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 255, 255, 255, 255, 255, 255, 255, 182, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 231, 224, 216, 209, 201, 200, 200, 200, 203, 255, 255, 137, 0, 0, 32, 255, 255, 252, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 235, 36, 0, 0, 0, 0, 0, 0, 11, 247, 255, 251, 12, 0, 0, 0, 200, 255, 232, 0, 0, 0, 0, 0, 0, 56, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 139, 255, 255, 150, 0, 0, 173, 184, 174, 170, 166, 164, 164, 164, 164, 181, 255, 255, 208, 164, 164, 164, 164, 166, 169, 172, 180, 190, 120, 0, 0, 0, 0, 0, 0, 0, 31, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 251, 236, 241, 255, 255, 255, 255, 255, 250, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 255, 255, 88, 0, 0, 93, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 130, 93, 23, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 53, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 14, 240, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 6, 58, 149, 251, 255, 255, 255, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 255, 255, 37, 0, 0, 163, 255, 249, 88, 84, 84, 84, 84, 84, 84, 84, 84, 179, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 122, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 57, 240, 255, 255, 225, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 255, 235, 0, 0, 7, 238, 255, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 255, 247, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 0, 12, 235, 255, 255, 255, 148, 0, 0, 0, 42, 68, 68, 68, 68, 68, 68, 68, 103, 255, 255, 159, 68, 68, 68, 68, 68, 68, 68, 68, 3, 0, 0, 0, 0, 0, 0, 0, 0, 26, 255, 255, 207, 140, 140, 140, 140, 140, 140, 140, 187, 255, 255, 187, 140, 140, 140, 140, 140, 140, 140, 141, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 85, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 21, 176, 68, 0, 0, 0, 0, 199, 255, 178, 0, 0, 84, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 28, 254, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 0, 127, 255, 255, 255, 255, 148, 0, 0, 0, 150, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 25, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 207, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 28, 226, 255, 232, 25, 0, 0, 11, 250, 255, 120, 0, 0, 199, 255, 241, 9, 0, 4, 59, 29, 2, 0, 0, 0, 115, 255, 255, 107, 0, 0, 0, 0, 0, 45, 137, 125, 117, 113, 112, 112, 63, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 22, 242, 255, 205, 244, 255, 148, 0, 0, 0, 136, 255, 255, 223, 216, 216, 216, 216, 223, 255, 255, 235, 216, 216, 216, 216, 216, 246, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 255, 208, 144, 144, 144, 144, 144, 144, 144, 189, 255, 255, 189, 144, 144, 144, 144, 144, 144, 144, 145, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 122, 255, 255, 244, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 172, 255, 255, 194, 3, 0, 80, 255, 255, 57, 0, 66, 255, 255, 155, 0, 0, 17, 255, 255, 249, 58, 0, 0, 173, 255, 255, 39, 0, 0, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 140, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 157, 255, 255, 80, 244, 255, 148, 0, 0, 0, 130, 255, 255, 48, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 192, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 65, 255, 255, 255, 37, 0, 0, 0, 0, 0, 0, 5, 79, 145, 173, 179, 152, 88, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 111, 159, 179, 180, 156, 101, 17, 0, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 13, 103, 154, 180, 171, 123, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 109, 160, 181, 177, 152, 96, 12, 0, 0, 0, 0, 0, 0, 80, 255, 255, 128, 0, 55, 159, 205, 214, 182, 105, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 207, 255, 255, 136, 0, 155, 255, 242, 4, 0, 187, 255, 255, 60, 0, 0, 20, 255, 255, 255, 34, 0, 0, 0, 15, 71, 0, 0, 0, 0, 0, 0, 80, 255, 255, 250, 249, 255, 255, 131, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 63, 254, 255, 210, 1, 244, 255, 148, 0, 0, 0, 125, 255, 255, 48, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 192, 255, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 24, 255, 255, 255, 75, 0, 0, 0, 0, 0, 76, 223, 255, 255, 255, 255, 255, 255, 225, 63, 0, 0, 0, 0, 0, 0, 0, 1, 132, 251, 255, 255, 255, 255, 255, 255, 241, 93, 0, 0, 0, 0, 0, 8, 255, 255, 200, 0, 79, 240, 255, 255, 255, 255, 255, 245, 76, 0, 0, 0, 0, 0, 0, 2, 131, 250, 255, 255, 255, 255, 255, 255, 236, 76, 0, 0, 0, 0, 0, 80, 255, 255, 128, 121, 253, 255, 255, 255, 255, 255, 223, 48, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 33, 238, 255, 254, 66, 229, 255, 167, 0, 0, 26, 111, 184, 1, 0, 0, 25, 255, 255, 254, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 14, 2, 0, 96, 255, 255, 123, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 92, 249, 255, 84, 0, 244, 255, 148, 0, 0, 0, 130, 255, 255, 48, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 192, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 1, 255, 255, 255, 91, 0, 0, 0, 0, 108, 254, 255, 255, 228, 182, 191, 239, 255, 255, 250, 62, 0, 0, 0, 0, 0, 0, 141, 255, 255, 255, 210, 175, 180, 222, 255, 255, 254, 78, 0, 0, 0, 0, 8, 255, 255, 200, 93, 254, 255, 208, 144, 165, 239, 255, 255, 242, 25, 0, 0, 0, 0, 0, 154, 255, 255, 255, 244, 214, 214, 248, 255, 255, 249, 50, 0, 0, 0, 0, 80, 255, 255, 210, 255, 255, 219, 175, 197, 252, 255, 255, 242, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 80, 255, 255, 239, 255, 255, 84, 0, 0, 0, 0, 0, 0, 0, 0, 36, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 118, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 72, 206, 1, 0, 244, 255, 148, 0, 0, 0, 138, 255, 255, 48, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 192, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 246, 255, 255, 104, 0, 0, 0, 64, 252, 255, 245, 95, 3, 0, 0, 13, 150, 255, 255, 225, 4, 0, 0, 0, 0, 29, 253, 255, 249, 71, 0, 0, 0, 0, 95, 255, 255, 206, 0, 0, 0, 0, 8, 255, 255, 235, 249, 251, 101, 0, 0, 0, 31, 225, 255, 255, 124, 0, 0, 0, 0, 62, 255, 255, 254, 112, 5, 0, 0, 10, 153, 255, 255, 174, 0, 0, 0, 0, 80, 255, 255, 255, 253, 107, 0, 0, 0, 35, 211, 255, 255, 202, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 157, 255, 255, 255, 248, 12, 0, 0, 0, 0, 0, 0, 0, 0, 58, 255, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 115, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 0, 19, 0, 0, 244, 255, 148, 0, 0, 0, 146, 255, 255, 243, 240, 240, 240, 240, 243, 255, 255, 247, 240, 240, 240, 240, 240, 252, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 37, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 239, 255, 255, 111, 0, 0, 0, 202, 255, 255, 96, 0, 0, 0, 0, 0, 2, 211, 255, 255, 83, 0, 0, 0, 0, 76, 255, 255, 179, 0, 0, 0, 0, 0, 0, 200, 232, 229, 2, 0, 0, 0, 8, 255, 255, 255, 255, 92, 0, 0, 0, 0, 0, 98, 255, 255, 176, 0, 0, 0, 0, 153, 255, 255, 160, 0, 0, 0, 0, 0, 9, 238, 255, 240, 0, 0, 0, 0, 80, 255, 255, 255, 130, 0, 0, 0, 0, 0, 34, 249, 255, 255, 63, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 233, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 255, 255, 246, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 2, 0, 52, 255, 255, 120, 0, 0, 0, 0, 120, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 154, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 45, 255, 255, 205, 136, 136, 136, 136, 136, 136, 136, 184, 255, 255, 184, 136, 136, 136, 136, 136, 136, 136, 137, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 98, 0, 0, 43, 255, 255, 223, 2, 0, 0, 0, 0, 0, 0, 125, 255, 255, 148, 0, 0, 0, 0, 62, 255, 255, 205, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 40, 255, 255, 191, 0, 0, 0, 0, 35, 48, 48, 18, 0, 0, 0, 0, 0, 4, 220, 255, 255, 8, 0, 0, 0, 80, 255, 255, 243, 11, 0, 0, 0, 0, 0, 0, 166, 255, 255, 139, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 188, 255, 255, 255, 74, 0, 0, 0, 0, 0, 0, 0, 0, 129, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 196, 255, 232, 0, 0, 11, 131, 138, 0, 52, 255, 255, 120, 0, 0, 0, 0, 140, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 49, 80, 80, 80, 80, 80, 80, 80, 144, 255, 255, 134, 80, 80, 80, 80, 80, 80, 80, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 54, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 5, 255, 255, 255, 84, 0, 0, 106, 255, 255, 241, 212, 212, 212, 212, 212, 212, 212, 227, 255, 255, 195, 0, 0, 0, 0, 9, 237, 255, 255, 159, 47, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 62, 125, 214, 255, 255, 255, 12, 0, 0, 0, 80, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 99, 255, 255, 190, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 50, 255, 255, 255, 255, 227, 12, 0, 0, 0, 0, 0, 0, 0, 186, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 198, 255, 232, 3, 100, 230, 255, 166, 0, 52, 255, 255, 120, 0, 0, 0, 17, 223, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 0, 0, 125, 107, 0, 0, 0, 0, 116, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 255, 255, 224, 184, 184, 184, 184, 184, 184, 184, 213, 255, 255, 213, 184, 184, 184, 184, 184, 184, 184, 185, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 38, 255, 255, 255, 61, 0, 0, 135, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 213, 0, 0, 0, 0, 0, 94, 254, 255, 255, 255, 244, 204, 155, 92, 18, 0, 0, 0, 0, 0, 0, 8, 255, 255, 240, 2, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 0, 0, 0, 28, 113, 175, 223, 254, 255, 255, 255, 255, 255, 255, 12, 0, 0, 0, 80, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 212, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 255, 254, 191, 255, 255, 140, 0, 0, 0, 0, 0, 0, 7, 246, 255, 255, 255, 220, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 1, 232, 255, 246, 218, 255, 255, 255, 190, 0, 52, 255, 255, 120, 0, 73, 200, 246, 255, 255, 250, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 0, 153, 255, 249, 58, 0, 0, 0, 143, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 79, 255, 255, 254, 13, 0, 0, 147, 255, 255, 184, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 94, 0, 0, 0, 0, 0, 0, 66, 191, 252, 255, 255, 255, 255, 255, 247, 141, 8, 0, 0, 0, 0, 8, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 0, 4, 139, 250, 255, 255, 255, 255, 251, 205, 130, 215, 255, 255, 12, 0, 0, 0, 80, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 55, 255, 255, 223, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 255, 255, 182, 27, 246, 255, 250, 40, 0, 0, 0, 0, 0, 93, 255, 255, 175, 255, 255, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 97, 255, 255, 255, 255, 255, 209, 91, 6, 0, 52, 255, 255, 120, 0, 13, 241, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 0, 44, 241, 255, 236, 39, 0, 0, 178, 255, 245, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 150, 255, 255, 215, 0, 0, 0, 132, 255, 255, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 69, 113, 161, 226, 255, 255, 255, 172, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 0, 153, 255, 255, 242, 152, 91, 48, 8, 0, 0, 196, 255, 255, 12, 0, 0, 0, 80, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 68, 255, 255, 209, 0, 0, + 0, 0, 0, 0, 0, 0, 190, 255, 255, 66, 0, 131, 255, 255, 184, 0, 0, 0, 0, 0, 204, 255, 250, 22, 206, 255, 228, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 112, 255, 255, 255, 210, 81, 1, 0, 0, 0, 55, 255, 255, 123, 0, 0, 163, 233, 177, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 0, 0, 70, 251, 255, 229, 38, 2, 239, 255, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 13, 234, 255, 255, 130, 0, 0, 0, 98, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 88, 251, 255, 255, 53, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 37, 254, 255, 248, 42, 0, 0, 0, 0, 0, 0, 196, 255, 255, 12, 0, 0, 0, 80, 255, 255, 189, 0, 0, 0, 0, 0, 0, 0, 107, 255, 255, 184, 0, 0, + 0, 0, 0, 0, 0, 84, 255, 255, 191, 0, 0, 11, 229, 255, 255, 78, 0, 0, 0, 91, 255, 255, 156, 0, 93, 255, 255, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 4, 213, 223, 92, 2, 0, 0, 0, 0, 0, 58, 255, 255, 131, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 0, 0, 0, 100, 255, 255, 235, 112, 255, 255, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 255, 237, 2, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 0, 0, 150, 255, 255, 252, 28, 0, 0, 0, 33, 255, 255, 244, 16, 0, 0, 0, 0, 0, 0, 64, 255, 255, 235, 0, 0, 0, 0, 115, 160, 160, 14, 0, 0, 0, 0, 0, 0, 155, 255, 255, 109, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 99, 255, 255, 183, 0, 0, 0, 0, 0, 0, 34, 241, 255, 255, 12, 0, 0, 0, 80, 255, 255, 250, 24, 0, 0, 0, 0, 0, 0, 183, 255, 255, 129, 0, 0, + 0, 0, 0, 0, 21, 232, 255, 255, 55, 0, 0, 0, 93, 255, 255, 159, 0, 0, 18, 233, 255, 250, 34, 0, 2, 208, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 33, 7, 0, 0, 0, 0, 0, 0, 0, 63, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 0, 0, 0, 0, 117, 255, 255, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 174, 0, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 200, 0, 0, 0, 0, 17, 155, 255, 255, 255, 127, 0, 0, 0, 0, 0, 185, 255, 255, 157, 1, 0, 0, 0, 0, 1, 178, 255, 255, 163, 0, 0, 0, 0, 159, 255, 255, 69, 0, 0, 0, 0, 0, 0, 160, 255, 255, 104, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 108, 255, 255, 196, 0, 0, 0, 0, 0, 31, 208, 255, 255, 255, 12, 0, 0, 0, 80, 255, 255, 255, 169, 1, 0, 0, 0, 0, 65, 255, 255, 255, 45, 0, 0, + 0, 0, 0, 0, 177, 255, 255, 167, 0, 0, 0, 0, 1, 189, 103, 1, 0, 5, 189, 255, 255, 137, 0, 0, 0, 68, 255, 255, 249, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 131, 255, 255, 255, 237, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 221, 96, 100, 119, 169, 241, 255, 255, 255, 177, 2, 0, 0, 0, 0, 0, 46, 246, 255, 255, 183, 59, 4, 4, 44, 169, 255, 255, 248, 42, 0, 0, 0, 0, 78, 255, 255, 223, 78, 7, 0, 0, 5, 101, 252, 255, 255, 45, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 66, 255, 255, 255, 120, 12, 3, 41, 129, 241, 255, 255, 255, 255, 16, 0, 0, 0, 80, 255, 255, 255, 255, 171, 37, 0, 14, 101, 240, 255, 255, 173, 0, 0, 0, + 0, 0, 0, 120, 255, 255, 242, 26, 0, 0, 0, 0, 0, 0, 0, 0, 1, 162, 255, 255, 217, 11, 0, 0, 0, 0, 144, 255, 255, 251, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 255, 255, 224, 81, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 255, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 255, 150, 0, 0, 0, 0, 0, 0, 0, 0, 61, 250, 255, 255, 255, 203, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 255, 253, 26, 0, 0, 0, 0, 0, 0, 0, 0, 108, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 5, 255, 255, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 134, 2, 0, 0, 0, 0, 0, 0, 0, 79, 246, 255, 255, 255, 253, 252, 255, 255, 255, 251, 89, 0, 0, 0, 0, 0, 0, 171, 255, 255, 255, 247, 222, 218, 245, 255, 255, 255, 156, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 2, 200, 255, 255, 255, 255, 252, 255, 255, 255, 226, 215, 255, 255, 56, 0, 0, 0, 80, 255, 255, 190, 251, 255, 255, 250, 255, 255, 255, 255, 215, 18, 0, 0, 0, + 0, 0, 85, 254, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 9, 167, 255, 255, 244, 48, 0, 0, 0, 0, 0, 4, 169, 255, 255, 255, 179, 33, 0, 0, 0, 0, 0, 0, 0, 111, 253, 255, 255, 255, 255, 211, 110, 25, 0, 0, 0, 0, 0, 0, 0, 0, 15, 44, 44, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 152, 0, 0, 0, 0, 0, 0, 0, 77, 245, 255, 252, 235, 255, 255, 251, 159, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 255, 255, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 46, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 255, 255, 255, 255, 255, 224, 149, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 191, 255, 255, 255, 255, 255, 255, 207, 57, 0, 0, 0, 0, 0, 0, 0, 4, 126, 241, 255, 255, 255, 255, 255, 255, 244, 125, 2, 0, 0, 0, 0, 8, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 192, 0, 0, 0, 0, 19, 178, 255, 255, 255, 255, 255, 254, 170, 26, 148, 255, 255, 165, 0, 0, 0, 80, 255, 255, 128, 80, 238, 255, 255, 255, 255, 254, 166, 16, 0, 0, 0, 0, + 0, 0, 96, 238, 255, 196, 2, 0, 0, 0, 0, 0, 0, 0, 57, 213, 255, 255, 249, 72, 0, 0, 0, 0, 0, 0, 0, 3, 154, 255, 255, 255, 250, 158, 61, 0, 0, 0, 0, 137, 255, 255, 210, 113, 179, 255, 255, 255, 255, 210, 152, 102, 63, 30, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 0, 0, 0, 0, 0, 0, 252, 255, 155, 0, 0, 0, 0, 0, 17, 156, 255, 255, 248, 80, 18, 158, 255, 255, 255, 255, 214, 141, 79, 34, 2, 0, 0, 0, 0, 0, 0, 0, 0, 181, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 255, 255, 116, 0, 0, 0, 0, 115, 170, 179, 232, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 76, 76, 76, 76, 71, 53, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 106, 135, 141, 115, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 71, 117, 138, 143, 126, 81, 12, 0, 0, 0, 0, 0, 0, 2, 76, 76, 59, 0, 0, 0, 0, 0, 0, 0, 4, 76, 76, 57, 0, 0, 0, 0, 0, 0, 43, 112, 141, 134, 100, 30, 0, 0, 21, 76, 76, 75, 5, 0, 0, 23, 76, 76, 38, 0, 14, 91, 132, 139, 109, 36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 28, 185, 37, 0, 0, 0, 0, 0, 0, 51, 171, 255, 255, 255, 245, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 249, 255, 255, 255, 98, 0, 0, 2, 156, 255, 255, 209, 14, 0, 0, 54, 171, 251, 255, 255, 255, 255, 255, 255, 255, 241, 228, 218, 212, 206, 201, 197, 198, 199, 201, 207, 217, 227, 243, 255, 105, 0, 0, 0, 0, 0, 0, 2, 255, 255, 162, 0, 0, 0, 24, 135, 242, 255, 255, 229, 61, 0, 0, 0, 65, 193, 255, 255, 255, 255, 255, 255, 249, 225, 203, 170, 12, 0, 0, 0, 80, 255, 255, 231, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 255, 255, 126, 0, 0, 0, 0, 77, 255, 255, 255, 255, 253, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 248, 255, 255, 228, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 212, 255, 171, 0, 0, 0, 115, 255, 255, 240, 36, 0, 0, 0, 0, 0, 25, 111, 189, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 229, 6, 0, 0, 0, 0, 0, 0, 10, 255, 255, 170, 0, 64, 188, 252, 255, 255, 255, 174, 20, 0, 0, 0, 0, 0, 0, 45, 153, 233, 255, 255, 255, 255, 255, 255, 88, 0, 0, 0, 0, 190, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 212, 212, 112, 0, 0, 0, 0, 13, 253, 255, 252, 191, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 247, 186, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 134, 31, 0, 0, 0, 3, 148, 254, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 52, 99, 136, 164, 188, 209, 228, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 143, 0, 0, 0, 0, 0, 0, 0, 18, 255, 255, 178, 0, 6, 161, 255, 255, 207, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 107, 158, 185, 211, 215, 2, 0, 0, 0, 0, 0, 67, 188, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 74, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, 27, 35, 42, 48, 53, 56, 58, 59, 21, 0, 0, 0, 0, 0, 0, 0, 5, 60, 60, 42, 0, 0, 4, 152, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const int g_txt_setup_w = 384; -static const int g_txt_setup_h = 30; -static const unsigned char g_txt_setup[384*30] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 56, 14, 0, 0, 0, 0, 0, 0, 0, 82, 158, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 56, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 47, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 130, 42, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 56, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 3, 0, 0, 0, 0, 0, 0, 1, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 115, 14, 0, 0, 0, 29, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 115, 14, 0, 0, 0, 29, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 17, 0, 0, 0, 0, 0, 0, 0, 40, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 51, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 89, 111, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 172, 255, 44, 0, 0, 0, 0, 0, 0, 0, 140, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 161, 4, 0, 0, 0, 0, 0, 0, 0, 4, 192, 192, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 72, 0, 0, 220, 255, 32, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 255, 234, 15, 13, 183, 173, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 33, 27, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 156, 255, 107, 0, 0, 0, 0, 0, 0, 4, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 255, 235, 15, 0, 0, 116, 255, 196, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 222, 198, 14, 0, 0, 0, 0, 60, 120, 120, 120, 120, 120, 120, 120, 43, 0, 0, 0, 0, 0, 0, 0, 0, 87, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 128, 0, 0, 0, 0, 0, 0, 0, 0, 75, 255, 235, 15, 0, 0, 116, 255, 196, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 250, 147, 0, 0, 0, 0, 0, 0, 159, 245, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 14, 34, 58, 91, 124, 157, 198, 247, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 88, 186, 79, 0, 0, 0, 0, 0, 0, 19, 237, 250, 39, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 153, 255, 25, 0, 0, 36, 46, 40, 40, 40, 103, 255, 202, 40, 40, 40, 46, 58, 19, 0, 0, 91, 177, 170, 164, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 164, 171, 177, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 255, 165, 1, 0, 0, 0, 0, 0, 0, 0, 254, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 72, 147, 232, 255, 93, 0, 215, 255, 11, 26, 218, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 255, 110, 0, 19, 224, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, 149, 255, 100, 0, 0, 0, 0, 0, 0, 0, 240, 255, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 201, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 255, 124, 0, 0, 0, 198, 255, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 177, 255, 197, 9, 0, 0, 0, 130, 255, 255, 255, 255, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 145, 255, 190, 168, 168, 184, 255, 179, 168, 168, 179, 255, 201, 168, 168, 168, 253, 221, 0, 0, 0, 0, 0, 0, 0, 0, 158, 255, 124, 0, 0, 0, 198, 255, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 255, 101, 0, 0, 0, 0, 0, 0, 220, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 203, 211, 215, 222, 229, 241, 253, 255, 255, 255, 255, 255, 237, 208, 184, 161, 145, 132, 32, 0, 0, 0, 0, 0, 0, 175, 255, 156, 0, 0, 0, 0, 0, 0, 0, 117, 255, 167, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 160, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 80, 0, 0, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 104, 0, 0, 0, 5, 46, 36, 32, 32, 32, 32, 32, 39, 255, 221, 32, 32, 32, 32, 32, 33, 42, 46, 0, 0, 0, 0, 0, 0, 13, 208, 255, 130, 0, 0, 0, 0, 0, 0, 0, 247, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 88, 116, 158, 208, 252, 255, 255, 233, 175, 94, 0, 211, 255, 3, 58, 240, 254, 107, 0, 0, 0, 0, 0, 0, 0, 0, 8, 236, 230, 8, 0, 0, 54, 250, 252, 57, 0, 108, 166, 157, 152, 152, 152, 112, 0, 0, 0, 0, 5, 46, 36, 32, 32, 32, 32, 32, 39, 255, 221, 32, 32, 32, 32, 32, 33, 42, 46, 0, 0, 0, 0, 0, 0, 149, 144, 138, 132, 128, 128, 128, 128, 248, 252, 0, 0, 0, 0, 0, 142, 255, 93, 0, 0, 0, 0, 0, 0, 0, 225, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 20, 245, 229, 10, 0, 0, 40, 255, 210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 188, 255, 177, 2, 0, 0, 135, 255, 73, 8, 8, 8, 155, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 138, 255, 64, 0, 0, 48, 255, 32, 0, 0, 32, 255, 96, 0, 0, 0, 248, 211, 0, 0, 0, 0, 0, 0, 0, 20, 245, 229, 10, 0, 0, 40, 255, 210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 252, 20, 0, 0, 0, 0, 0, 34, 255, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 200, 183, 170, 157, 147, 137, 239, 246, 99, 35, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 252, 232, 15, 0, 0, 38, 45, 37, 32, 32, 46, 154, 48, 32, 32, 33, 41, 49, 17, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 67, 95, 89, 88, 88, 88, 88, 88, 100, 113, 88, 92, 103, 34, 0, 0, 31, 58, 51, 45, 40, 40, 40, 40, 40, 188, 255, 100, 40, 40, 40, 40, 40, 40, 43, 47, 56, 25, 0, 0, 0, 24, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 0, 0, 0, 0, 0, 0, 0, 27, 228, 253, 42, 0, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 255, 255, 218, 210, 255, 102, 0, 0, 0, 0, 207, 255, 0, 0, 48, 236, 255, 110, 0, 0, 0, 0, 0, 0, 0, 98, 255, 116, 0, 0, 0, 0, 125, 255, 150, 0, 160, 255, 255, 255, 255, 255, 181, 0, 0, 0, 0, 24, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 245, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 134, 255, 104, 0, 0, 0, 150, 255, 225, 192, 192, 192, 192, 192, 192, 192, 192, 192, 34, 0, 0, 0, 0, 0, 17, 220, 248, 58, 0, 0, 161, 255, 55, 0, 0, 0, 152, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 145, 255, 136, 96, 96, 126, 255, 116, 96, 96, 116, 255, 156, 96, 96, 96, 251, 211, 0, 0, 0, 0, 0, 0, 0, 134, 255, 104, 0, 0, 0, 150, 255, 225, 192, 192, 192, 192, 192, 192, 192, 192, 192, 34, 0, 0, 0, 0, 0, 0, 235, 195, 0, 0, 0, 0, 0, 0, 119, 255, 140, 48, 48, 48, 48, 48, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 255, 254, 134, 0, 0, 0, 7, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 255, 94, 0, 0, 0, 184, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 80, 0, - 0, 216, 230, 212, 236, 255, 214, 218, 99, 0, 0, 22, 145, 21, 0, 0, 0, 75, 246, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 151, 129, 121, 120, 120, 120, 120, 124, 255, 234, 120, 120, 120, 120, 120, 122, 141, 144, 0, 0, 0, 0, 0, 0, 0, 0, 48, 75, 0, 0, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 72, 18, 0, 112, 255, 88, 0, 0, 0, 0, 204, 255, 0, 0, 0, 64, 250, 177, 2, 0, 0, 0, 0, 0, 3, 218, 255, 28, 0, 3, 40, 38, 6, 98, 0, 0, 39, 42, 30, 24, 53, 255, 173, 0, 0, 0, 0, 15, 151, 129, 121, 120, 120, 120, 120, 124, 255, 234, 120, 120, 120, 120, 120, 122, 141, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 241, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 224, 255, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 247, 255, 40, 0, 0, 0, 0, 0, 0, 0, 25, 241, 255, 5, 0, 0, 31, 249, 246, 216, 216, 216, 216, 216, 216, 216, 226, 255, 220, 0, 0, 0, 0, 0, 0, 0, 44, 60, 0, 0, 0, 195, 255, 24, 0, 0, 0, 152, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 131, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 188, 0, 0, 0, 0, 0, 0, 25, 241, 255, 5, 0, 0, 31, 249, 246, 216, 216, 216, 216, 216, 216, 216, 226, 255, 220, 0, 0, 0, 0, 153, 208, 208, 255, 236, 208, 208, 208, 158, 0, 0, 209, 255, 255, 255, 255, 255, 255, 255, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 250, 232, 70, 0, 0, 0, 31, 203, 205, 59, 0, 0, 0, 0, 0, 0, 0, 31, 248, 198, 1, 0, 157, 85, 85, 107, 100, 96, 151, 193, 96, 96, 96, 96, 97, 105, 114, 37, 0, - 0, 192, 212, 202, 233, 255, 207, 211, 96, 0, 0, 150, 255, 156, 0, 0, 0, 135, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 160, 9, 0, 0, 8, 255, 216, 0, 0, 0, 79, 188, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 255, 88, 0, 0, 0, 0, 202, 255, 0, 0, 0, 0, 60, 3, 0, 0, 0, 0, 0, 0, 99, 255, 255, 24, 0, 14, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 169, 0, 0, 0, 0, 0, 0, 0, 30, 160, 9, 0, 0, 8, 255, 216, 0, 0, 0, 79, 188, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 248, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 224, 255, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 35, 3, 0, 0, 0, 0, 0, 0, 174, 255, 255, 0, 0, 0, 158, 255, 120, 0, 0, 0, 0, 0, 0, 0, 125, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 250, 224, 0, 0, 0, 0, 152, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 186, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 255, 255, 0, 0, 0, 158, 255, 120, 0, 0, 0, 0, 0, 0, 0, 125, 255, 124, 0, 0, 0, 0, 180, 255, 207, 200, 200, 200, 205, 255, 186, 0, 61, 255, 204, 128, 128, 128, 128, 128, 236, 223, 0, 0, 0, 0, 0, 0, 0, 0, 5, 121, 253, 198, 25, 0, 0, 0, 81, 237, 255, 234, 120, 5, 0, 0, 0, 0, 0, 0, 180, 252, 48, 0, 49, 255, 254, 65, 0, 0, 0, 173, 255, 149, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 0, 0, 19, 244, 253, 45, 0, 0, 214, 246, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 255, 163, 0, 0, 8, 255, 216, 0, 0, 7, 222, 253, 51, 0, 0, 0, 0, 0, 0, 28, 61, 51, 48, 48, 31, 0, 0, 0, 0, 0, 0, 0, 240, 241, 24, 24, 24, 25, 30, 35, 0, 0, 0, 46, 84, 78, 74, 72, 152, 255, 135, 72, 72, 72, 72, 216, 255, 72, 72, 72, 72, 73, 77, 85, 46, 0, 0, 0, 12, 230, 255, 255, 24, 0, 5, 255, 226, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 0, 0, 0, 0, 123, 255, 163, 0, 0, 8, 255, 216, 0, 0, 7, 222, 253, 51, 0, 0, 0, 0, 0, 0, 0, 0, 151, 240, 240, 240, 240, 240, 240, 240, 255, 255, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 205, 74, 2, 0, 0, 0, 88, 255, 255, 255, 0, 0, 65, 253, 232, 11, 0, 0, 44, 48, 1, 0, 2, 225, 254, 30, 0, 0, 0, 41, 33, 25, 24, 24, 4, 0, 1, 170, 255, 125, 0, 0, 0, 0, 152, 255, 147, 39, 40, 55, 26, 0, 0, 0, 79, 136, 129, 122, 120, 120, 120, 120, 120, 232, 255, 138, 120, 120, 120, 120, 122, 127, 136, 40, 0, 0, 0, 0, 88, 255, 255, 255, 0, 0, 65, 253, 232, 11, 0, 0, 44, 48, 1, 0, 2, 225, 254, 30, 0, 0, 0, 0, 173, 255, 32, 0, 0, 0, 24, 255, 180, 0, 184, 255, 63, 0, 0, 0, 0, 0, 221, 219, 0, 0, 0, 0, 0, 0, 30, 146, 225, 255, 212, 78, 72, 72, 72, 156, 255, 240, 116, 9, 0, 0, 0, 0, 0, 0, 9, 149, 255, 179, 60, 68, 187, 255, 137, 0, 0, 0, 49, 252, 218, 18, 0, 0, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 45, 35, 16, 120, 98, 24, 16, 53, 255, 171, 16, 19, 38, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 200, 255, 76, 0, 8, 255, 216, 0, 0, 118, 255, 152, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 255, 255, 162, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 216, 0, 0, 0, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 0, 0, 140, 255, 254, 255, 24, 0, 1, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 0, 0, 0, 0, 4, 200, 255, 76, 0, 8, 255, 216, 0, 0, 118, 255, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 255, 170, 144, 144, 144, 144, 144, 144, 144, 3, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 222, 255, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 255, 244, 14, 0, 0, 48, 244, 243, 225, 255, 0, 20, 229, 255, 99, 0, 0, 0, 229, 252, 0, 0, 64, 254, 189, 0, 0, 0, 0, 248, 255, 255, 255, 255, 41, 6, 155, 255, 207, 8, 0, 0, 0, 0, 134, 255, 255, 255, 255, 255, 86, 0, 0, 0, 144, 255, 250, 244, 240, 240, 240, 240, 240, 255, 251, 240, 240, 240, 240, 240, 243, 247, 255, 72, 0, 0, 0, 48, 244, 243, 225, 255, 0, 20, 229, 255, 99, 0, 0, 0, 229, 252, 0, 0, 64, 254, 189, 0, 0, 0, 0, 0, 170, 255, 32, 0, 0, 0, 24, 255, 177, 66, 255, 196, 0, 0, 0, 0, 0, 0, 226, 214, 0, 0, 0, 0, 0, 0, 14, 250, 255, 255, 255, 255, 255, 255, 255, 254, 160, 21, 0, 0, 0, 0, 0, 0, 0, 0, 11, 236, 255, 255, 255, 255, 255, 212, 6, 0, 0, 5, 206, 244, 41, 0, 0, 61, 227, 112, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 120, 179, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 253, 196, 0, 8, 255, 216, 0, 20, 240, 235, 18, 0, 0, 0, 0, 0, 0, 0, 41, 92, 84, 136, 255, 155, 0, 0, 0, 0, 0, 0, 0, 240, 246, 104, 104, 104, 105, 110, 102, 0, 0, 0, 38, 69, 62, 59, 57, 143, 255, 124, 56, 56, 56, 56, 187, 255, 81, 56, 56, 56, 57, 61, 70, 38, 0, 0, 56, 252, 218, 204, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 49, 253, 196, 0, 8, 255, 216, 0, 20, 240, 235, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 187, 255, 238, 182, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 192, 247, 255, 144, 0, 0, 0, 204, 255, 104, 200, 255, 0, 109, 244, 188, 0, 0, 0, 0, 220, 243, 0, 0, 0, 21, 33, 0, 0, 0, 0, 141, 135, 131, 216, 255, 31, 22, 172, 212, 24, 0, 0, 0, 0, 0, 16, 127, 151, 152, 152, 152, 57, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 29, 255, 171, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 204, 255, 104, 200, 255, 0, 109, 244, 188, 0, 0, 0, 0, 220, 243, 0, 0, 0, 21, 33, 0, 0, 0, 0, 0, 168, 255, 32, 0, 0, 0, 24, 255, 176, 199, 255, 59, 0, 0, 0, 0, 0, 0, 230, 207, 0, 0, 0, 0, 0, 0, 0, 97, 91, 61, 43, 57, 195, 255, 214, 62, 0, 0, 45, 150, 18, 0, 0, 0, 0, 0, 0, 96, 130, 91, 61, 216, 253, 55, 0, 0, 1, 157, 255, 90, 0, 0, 0, 41, 239, 253, 79, 0, 0, 0, - 0, 0, 0, 0, 152, 255, 43, 128, 52, 106, 118, 112, 112, 141, 130, 112, 112, 112, 112, 112, 112, 119, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 24, 237, 255, 204, 21, 0, 0, 0, 0, 0, 0, 0, 18, 35, 27, 24, 24, 24, 101, 35, 24, 31, 255, 219, 24, 26, 99, 99, 24, 24, 24, 28, 37, 18, 0, 0, 0, 0, 0, 80, 255, 147, 0, 0, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 255, 88, 0, 0, 0, 0, 149, 255, 52, 0, 0, 0, 97, 69, 0, 0, 0, 5, 218, 255, 73, 200, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 18, 35, 27, 24, 24, 24, 101, 35, 24, 31, 255, 219, 24, 26, 99, 99, 24, 24, 24, 28, 37, 18, 0, 0, 0, 0, 182, 255, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 47, 195, 230, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 222, 175, 17, 0, 0, 0, 23, 151, 1, 200, 255, 0, 0, 16, 24, 0, 0, 0, 0, 217, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 27, 0, 57, 122, 100, 97, 96, 96, 96, 96, 96, 96, 96, 96, 26, 0, 0, 0, 0, 0, 0, 0, 0, 123, 192, 192, 192, 192, 204, 255, 229, 192, 192, 192, 192, 192, 141, 0, 0, 0, 0, 0, 0, 23, 151, 1, 200, 255, 0, 0, 16, 24, 0, 0, 0, 0, 217, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 255, 32, 0, 0, 0, 24, 255, 176, 12, 106, 17, 142, 98, 0, 0, 0, 0, 237, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 104, 237, 246, 122, 5, 0, 0, 3, 167, 255, 222, 42, 0, 0, 0, 0, 0, 0, 0, 0, 92, 255, 142, 0, 0, 44, 183, 255, 143, 0, 2, 18, 38, 62, 153, 255, 241, 36, 0, 0, - 0, 0, 0, 0, 159, 255, 247, 255, 76, 0, 0, 0, 0, 142, 248, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 44, 230, 255, 216, 27, 0, 0, 0, 0, 0, 0, 104, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 104, 0, 0, 0, 0, 0, 80, 255, 144, 0, 0, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 255, 88, 0, 0, 1, 0, 125, 255, 77, 0, 0, 3, 224, 255, 93, 0, 0, 0, 36, 131, 0, 200, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 104, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 104, 0, 0, 0, 0, 197, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 160, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 0, 0, 0, 5, 83, 2, 0, 216, 240, 0, 3, 111, 35, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 24, 0, 120, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 13, 0, 0, 0, 0, 0, 0, 0, 0, 158, 249, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 238, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 0, 0, 0, 5, 83, 2, 0, 216, 240, 0, 3, 111, 35, 0, 0, 0, 0, 0, 0, 168, 255, 151, 136, 136, 136, 147, 255, 176, 0, 0, 54, 254, 225, 6, 0, 0, 0, 242, 192, 0, 0, 0, 0, 0, 0, 0, 23, 111, 219, 255, 177, 33, 0, 0, 0, 0, 0, 0, 116, 253, 240, 66, 0, 0, 0, 0, 0, 0, 18, 233, 222, 10, 0, 0, 61, 255, 255, 237, 242, 254, 255, 255, 255, 255, 255, 255, 206, 7, 0, - 1, 50, 121, 204, 255, 255, 198, 81, 29, 53, 35, 32, 33, 231, 255, 84, 32, 32, 32, 32, 32, 38, 50, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 35, 225, 255, 220, 29, 0, 0, 0, 0, 0, 69, 153, 135, 128, 128, 128, 128, 138, 254, 247, 255, 254, 255, 209, 128, 128, 128, 128, 130, 138, 145, 61, 0, 0, 0, 0, 0, 80, 255, 144, 0, 0, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 255, 121, 101, 172, 164, 0, 89, 255, 115, 0, 0, 100, 255, 197, 3, 0, 0, 0, 0, 0, 0, 200, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 69, 153, 135, 128, 128, 128, 128, 138, 254, 247, 255, 254, 255, 209, 128, 128, 128, 128, 130, 138, 145, 61, 0, 0, 0, 0, 213, 255, 203, 200, 200, 200, 200, 200, 200, 200, 34, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 0, 0, 0, 113, 255, 172, 0, 216, 240, 0, 83, 255, 199, 3, 0, 0, 0, 0, 0, 0, 0, 176, 255, 24, 0, 15, 32, 212, 252, 44, 32, 32, 32, 32, 134, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 242, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 221, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 0, 0, 0, 113, 255, 172, 0, 216, 240, 0, 83, 255, 199, 3, 0, 0, 0, 0, 0, 168, 255, 255, 255, 255, 255, 255, 255, 176, 0, 0, 0, 172, 255, 102, 0, 0, 0, 250, 185, 0, 0, 0, 0, 0, 98, 224, 254, 255, 255, 181, 122, 135, 147, 159, 171, 182, 193, 204, 215, 248, 255, 249, 87, 0, 0, 0, 0, 0, 167, 255, 68, 0, 0, 3, 10, 239, 235, 221, 255, 203, 122, 209, 255, 59, 23, 216, 176, 17, 0, - 5, 226, 255, 245, 226, 255, 24, 0, 96, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 32, 223, 255, 220, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 255, 115, 255, 217, 206, 251, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 144, 0, 0, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 37, 85, 136, 211, 255, 255, 255, 251, 162, 0, 47, 255, 162, 0, 16, 229, 246, 36, 0, 0, 0, 0, 0, 0, 0, 200, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 255, 115, 255, 217, 206, 251, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 184, 184, 184, 184, 184, 184, 184, 252, 255, 16, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 97, 136, 130, 124, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 155, 255, 205, 120, 120, 123, 130, 122, 0, 0, 0, 0, 0, 200, 255, 0, 0, 0, 21, 240, 254, 64, 0, 216, 240, 0, 0, 187, 255, 127, 0, 0, 0, 0, 0, 0, 0, 176, 255, 24, 0, 0, 0, 115, 255, 88, 0, 0, 0, 1, 213, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 0, 0, 21, 240, 254, 64, 0, 216, 240, 0, 0, 187, 255, 127, 0, 0, 0, 0, 0, 168, 255, 46, 16, 16, 16, 38, 255, 176, 0, 0, 0, 54, 255, 220, 2, 0, 2, 255, 177, 0, 0, 0, 0, 0, 59, 255, 255, 255, 244, 233, 223, 217, 219, 255, 235, 196, 183, 170, 159, 148, 158, 255, 254, 100, 0, 0, 18, 156, 255, 226, 147, 177, 212, 249, 40, 16, 0, 64, 255, 132, 0, 176, 255, 24, 0, 26, 1, 0, 0, - 0, 125, 148, 22, 152, 255, 24, 0, 43, 104, 97, 96, 237, 250, 107, 96, 96, 148, 255, 168, 96, 98, 108, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 0, 35, 230, 255, 216, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 255, 181, 9, 255, 216, 45, 245, 247, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 144, 0, 0, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 247, 255, 255, 255, 255, 255, 169, 71, 12, 0, 0, 3, 241, 225, 1, 167, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 255, 181, 9, 255, 216, 45, 245, 247, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 255, 241, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 224, 0, 0, 0, 0, 0, 200, 255, 0, 0, 0, 160, 255, 153, 0, 0, 216, 240, 0, 0, 33, 244, 251, 51, 0, 0, 0, 0, 0, 0, 176, 255, 24, 0, 0, 0, 17, 242, 207, 1, 0, 0, 88, 255, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 241, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 219, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 0, 0, 160, 255, 153, 0, 0, 216, 240, 0, 0, 33, 244, 251, 51, 0, 0, 0, 0, 168, 255, 32, 0, 0, 0, 24, 255, 176, 0, 0, 0, 0, 203, 255, 79, 0, 12, 255, 166, 0, 0, 0, 0, 0, 1, 55, 25, 5, 0, 0, 0, 0, 48, 255, 152, 0, 0, 0, 0, 0, 0, 117, 167, 18, 0, 0, 51, 255, 255, 255, 255, 244, 212, 173, 0, 0, 0, 71, 255, 122, 0, 176, 255, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 0, 0, 85, 255, 127, 0, 0, 0, 174, 250, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 0, 0, 46, 237, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 255, 219, 18, 8, 255, 216, 0, 78, 251, 255, 133, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 144, 0, 27, 61, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 255, 220, 149, 81, 127, 255, 88, 0, 0, 0, 0, 0, 174, 255, 178, 255, 186, 1, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 129, 255, 219, 18, 8, 255, 216, 0, 78, 251, 255, 133, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 255, 210, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 20, 25, 19, 14, 14, 24, 8, 8, 8, 8, 8, 8, 8, 8, 70, 255, 163, 8, 8, 12, 18, 24, 0, 0, 0, 0, 0, 200, 255, 0, 0, 105, 255, 221, 13, 0, 0, 216, 240, 0, 0, 0, 117, 255, 209, 5, 0, 0, 0, 0, 0, 176, 255, 24, 50, 69, 0, 0, 132, 255, 117, 0, 17, 230, 249, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 251, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 243, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 0, 105, 255, 221, 13, 0, 0, 216, 240, 0, 0, 0, 117, 255, 209, 5, 0, 0, 0, 168, 255, 32, 0, 0, 0, 24, 255, 176, 0, 0, 0, 0, 105, 201, 56, 0, 22, 255, 152, 0, 0, 0, 0, 0, 0, 0, 7, 92, 1, 0, 0, 0, 48, 255, 152, 0, 0, 5, 115, 6, 0, 0, 0, 0, 0, 0, 0, 159, 121, 70, 27, 0, 0, 0, 0, 0, 0, 99, 255, 96, 0, 176, 255, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 0, 9, 224, 255, 154, 50, 0, 59, 254, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 8, 155, 255, 233, 36, 0, 8, 255, 216, 0, 0, 86, 249, 255, 207, 64, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 144, 21, 214, 212, 3, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 39, 0, 0, 0, 112, 255, 88, 0, 0, 0, 0, 0, 76, 255, 255, 217, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 0, 0, 0, 8, 155, 255, 233, 36, 0, 8, 255, 216, 0, 0, 86, 249, 255, 207, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 255, 177, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 15, 183, 186, 3, 0, 0, 0, 0, 0, 0, 0, 64, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 61, 250, 251, 57, 0, 0, 0, 216, 240, 0, 0, 0, 6, 220, 255, 124, 0, 0, 0, 0, 0, 176, 255, 60, 229, 194, 0, 0, 10, 223, 252, 90, 186, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 251, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 244, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 61, 250, 251, 57, 0, 0, 0, 216, 240, 0, 0, 0, 6, 220, 255, 124, 0, 0, 0, 168, 255, 32, 0, 0, 0, 24, 255, 176, 0, 0, 0, 0, 5, 1, 0, 0, 36, 255, 137, 0, 0, 0, 0, 0, 0, 0, 162, 255, 187, 10, 0, 0, 48, 255, 152, 0, 0, 160, 255, 205, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 160, 255, 48, 0, 176, 255, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 0, 2, 78, 187, 255, 255, 194, 214, 237, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 211, 255, 227, 40, 0, 0, 8, 255, 216, 0, 0, 0, 58, 232, 255, 255, 182, 81, 9, 0, 0, 0, 0, 0, 80, 255, 171, 213, 255, 138, 1, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 255, 88, 0, 0, 0, 0, 19, 178, 255, 255, 92, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 200, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 0, 0, 58, 211, 255, 227, 40, 0, 0, 8, 255, 216, 0, 0, 0, 58, 232, 255, 255, 182, 81, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 255, 144, 0, 0, 0, 0, 0, 136, 255, 88, 0, 0, 0, 0, 0, 0, 0, 10, 213, 255, 133, 0, 0, 0, 0, 0, 0, 0, 64, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 97, 251, 111, 0, 0, 0, 0, 216, 240, 0, 0, 0, 0, 81, 231, 83, 0, 0, 0, 0, 0, 177, 255, 238, 255, 167, 2, 0, 0, 56, 248, 255, 255, 188, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 245, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 229, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 0, 97, 251, 111, 0, 0, 0, 0, 216, 240, 0, 0, 0, 0, 81, 231, 83, 0, 0, 0, 168, 255, 32, 0, 0, 0, 24, 255, 176, 0, 0, 0, 0, 0, 0, 0, 0, 55, 255, 122, 0, 0, 0, 0, 0, 0, 148, 255, 222, 52, 0, 0, 0, 48, 255, 152, 0, 0, 29, 192, 255, 244, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 108, 190, 140, 0, 26, 247, 230, 2, 0, 176, 255, 24, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 152, 255, 24, 0, 0, 0, 0, 0, 0, 41, 191, 255, 255, 236, 113, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 168, 254, 255, 199, 24, 0, 0, 0, 10, 255, 216, 0, 0, 0, 0, 29, 194, 255, 255, 255, 140, 0, 0, 0, 0, 0, 88, 255, 255, 255, 119, 0, 0, 0, 0, 0, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 255, 88, 0, 0, 1, 90, 232, 255, 213, 251, 231, 33, 0, 0, 235, 175, 10, 0, 0, 0, 0, 201, 255, 24, 0, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 168, 0, 0, 0, 44, 168, 254, 255, 199, 24, 0, 0, 0, 10, 255, 216, 0, 0, 0, 0, 29, 194, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 255, 108, 0, 0, 0, 0, 0, 138, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 44, 247, 252, 56, 0, 0, 0, 0, 0, 0, 64, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, 255, 0, 0, 42, 0, 0, 0, 0, 0, 216, 240, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 205, 255, 255, 157, 2, 0, 0, 0, 41, 222, 255, 255, 140, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 255, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 254, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, 255, 0, 0, 42, 0, 0, 0, 0, 0, 216, 240, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 170, 255, 249, 248, 248, 248, 248, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 86, 255, 108, 0, 0, 0, 0, 7, 165, 255, 202, 22, 0, 0, 0, 0, 48, 255, 152, 0, 0, 0, 3, 137, 255, 255, 142, 1, 0, 0, 28, 73, 120, 173, 229, 255, 255, 244, 110, 0, 170, 255, 128, 0, 0, 176, 255, 24, 0, 6, 218, 106, 1, - 0, 0, 0, 0, 190, 255, 22, 0, 0, 0, 0, 0, 50, 159, 253, 242, 151, 242, 255, 233, 117, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 238, 254, 150, 7, 0, 0, 0, 0, 17, 255, 220, 0, 0, 0, 0, 0, 1, 93, 218, 191, 1, 0, 0, 0, 0, 0, 153, 255, 255, 116, 34, 83, 69, 54, 48, 48, 243, 243, 48, 48, 48, 50, 56, 70, 60, 0, 0, 0, 0, 0, 0, 0, 156, 255, 85, 7, 88, 207, 255, 251, 133, 5, 114, 255, 225, 52, 40, 255, 227, 1, 0, 0, 0, 0, 204, 255, 27, 0, 1, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 57, 255, 168, 0, 0, 0, 61, 238, 254, 150, 7, 0, 0, 0, 0, 17, 255, 220, 0, 0, 0, 0, 0, 1, 93, 218, 191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 229, 255, 68, 0, 0, 0, 0, 0, 141, 255, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 255, 164, 0, 0, 0, 0, 0, 0, 112, 255, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 255, 3, 0, 0, 0, 0, 0, 0, 23, 243, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 253, 255, 162, 1, 0, 0, 20, 139, 247, 251, 157, 221, 255, 229, 130, 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 144, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 255, 3, 0, 0, 0, 0, 0, 0, 23, 243, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 172, 160, 160, 160, 169, 255, 183, 0, 0, 0, 0, 0, 0, 0, 15, 186, 255, 83, 0, 0, 0, 43, 208, 255, 186, 12, 0, 0, 0, 0, 0, 95, 255, 148, 0, 0, 0, 0, 0, 99, 253, 252, 59, 0, 0, 169, 255, 255, 255, 206, 136, 65, 6, 0, 126, 255, 221, 12, 0, 0, 176, 255, 35, 0, 67, 255, 210, 0, - 0, 28, 206, 207, 255, 243, 1, 0, 47, 120, 169, 222, 255, 255, 179, 35, 0, 21, 151, 252, 255, 232, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 67, 0, 0, 0, 0, 0, 0, 32, 255, 227, 0, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 0, 0, 1, 192, 255, 133, 0, 96, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 176, 0, 0, 0, 0, 58, 190, 218, 255, 255, 49, 60, 245, 255, 204, 50, 0, 0, 0, 135, 255, 253, 240, 255, 131, 0, 0, 0, 0, 0, 207, 255, 30, 0, 4, 255, 224, 0, 0, 0, 0, 0, 0, 171, 201, 241, 255, 157, 0, 0, 0, 0, 61, 67, 0, 0, 0, 0, 0, 0, 32, 255, 227, 0, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 0, 0, 0, 0, 125, 225, 225, 233, 254, 255, 238, 15, 0, 0, 0, 0, 0, 148, 255, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 104, 2, 0, 0, 0, 72, 212, 231, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 8, 0, 0, 0, 0, 131, 220, 250, 255, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 199, 197, 7, 17, 78, 167, 248, 255, 180, 42, 0, 7, 115, 228, 255, 255, 237, 194, 145, 0, 0, 115, 225, 219, 213, 235, 253, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 248, 239, 209, 213, 221, 135, 0, 0, 0, 0, 0, 208, 255, 8, 0, 0, 0, 0, 131, 220, 250, 255, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 255, 32, 0, 0, 0, 24, 255, 190, 0, 0, 0, 0, 123, 203, 216, 249, 255, 230, 14, 0, 0, 0, 16, 173, 168, 6, 0, 0, 0, 35, 232, 244, 255, 255, 116, 0, 0, 0, 0, 0, 0, 91, 90, 0, 0, 0, 38, 197, 107, 28, 0, 0, 0, 6, 146, 255, 241, 48, 0, 0, 0, 158, 255, 207, 160, 225, 255, 106, 0, - 0, 0, 195, 255, 241, 94, 0, 0, 48, 255, 255, 225, 143, 48, 0, 0, 0, 0, 0, 48, 202, 224, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 176, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 200, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 123, 1, 0, 38, 95, 85, 82, 80, 80, 80, 80, 80, 80, 80, 81, 84, 92, 69, 0, 0, 0, 0, 2, 219, 255, 226, 110, 0, 0, 93, 100, 2, 0, 0, 0, 0, 0, 94, 233, 255, 225, 17, 0, 0, 0, 0, 0, 215, 255, 38, 0, 12, 255, 224, 0, 0, 0, 0, 0, 0, 125, 255, 255, 223, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 200, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 255, 255, 255, 250, 192, 56, 0, 0, 0, 0, 0, 0, 156, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 242, 255, 228, 122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 16, 0, 0, 0, 0, 49, 255, 253, 196, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 22, 8, 181, 255, 252, 174, 56, 0, 0, 0, 0, 0, 5, 84, 174, 245, 255, 82, 0, 0, 63, 122, 116, 109, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 107, 110, 118, 74, 0, 0, 0, 0, 0, 216, 255, 16, 0, 0, 0, 0, 49, 255, 253, 196, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 176, 22, 0, 0, 0, 12, 128, 98, 0, 0, 0, 0, 48, 255, 255, 229, 154, 32, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 189, 255, 223, 152, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 250, 238, 57, 0, 0, 0, 0, 47, 213, 247, 248, 245, 163, 4, 0, - 0, 0, 47, 52, 6, 0, 0, 0, 0, 79, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 48, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 54, 15, 0, 0, 0, 0, 0, 0, 117, 136, 24, 0, 9, 112, 98, 0, 0, 0, 0, 0, 0, 28, 85, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 61, 35, 5, 0, 0, 0, 0, 0, 0, 0, 0, 10, 16, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 45, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 40, 3, 0, 0, 0, 0, 0, 63, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 101, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 58, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 40, 3, 0, 0, 0, 0, 0, 63, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 69, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static const int g_txt_setup_w = 576; +static const int g_txt_setup_h = 42; +static const unsigned char g_txt_setup[576*42] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 64, 126, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 89, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 94, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 129, 212, 212, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 212, 212, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 32, 32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 219, 191, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 255, 243, 168, 30, 0, 0, 14, 148, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 212, 212, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 140, 140, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 207, 107, 16, 0, 0, 0, 0, 130, 198, 112, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 188, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 207, 107, 16, 0, 0, 0, 0, 130, 198, 112, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 168, 86, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 210, 108, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 81, 137, 192, 244, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 230, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 122, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 255, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 156, 249, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 113, 50, 0, 0, 73, 255, 255, 171, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 207, 3, 0, 29, 210, 255, 185, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 62, 52, 44, 40, 37, 36, 36, 36, 36, 36, 36, 36, 36, 36, 19, 0, 0, 0, 0, 0, 0, 0, 105, 255, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 230, 16, 0, 0, 0, 0, 193, 255, 255, 203, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 255, 255, 130, 0, 0, 0, 0, 0, 0, 0, 45, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 255, 230, 16, 0, 0, 0, 0, 193, 255, 255, 203, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 255, 255, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 255, 255, 237, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 36, 56, 79, 111, 145, 178, 211, 244, 255, 255, 255, 255, 255, 255, 240, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 232, 136, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 208, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 102, 255, 255, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 244, 255, 254, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 139, 132, 126, 119, 113, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 114, 120, 127, 133, 140, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 252, 255, 249, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 72, 155, 241, 255, 215, 9, 0, 69, 255, 255, 148, 0, 0, 61, 241, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 255, 255, 70, 0, 0, 43, 244, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 97, 255, 255, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 255, 255, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 254, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 94, 0, 0, 0, 0, 23, 252, 255, 252, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 252, 255, 255, 125, 0, 0, 0, 0, 0, 0, 66, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 255, 255, 252, 252, 252, 252, 252, 255, 255, 252, 252, 252, 252, 252, 252, 255, 255, 252, 252, 252, 252, 252, 253, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 94, 0, 0, 0, 0, 23, 252, 255, 252, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 186, 189, 191, 196, 203, 210, 218, 230, 243, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 227, 212, 198, 161, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 255, 255, 243, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 255, 255, 224, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 202, 199, 192, 188, 188, 188, 188, 188, 243, 255, 255, 206, 188, 188, 188, 188, 193, 208, 218, 104, 0, 0, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 255, 255, 243, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 70, 125, 187, 245, 255, 255, 255, 255, 255, 141, 0, 64, 255, 255, 138, 0, 35, 243, 255, 251, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 255, 255, 196, 0, 0, 0, 0, 88, 255, 255, 254, 71, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 90, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 255, 255, 205, 1, 0, 0, 0, 0, 113, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 253, 255, 255, 102, 0, 0, 0, 0, 0, 68, 255, 255, 188, 140, 140, 140, 140, 140, 185, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 255, 224, 0, 0, 0, 0, 0, 200, 255, 48, 0, 0, 0, 0, 48, 255, 255, 16, 0, 0, 0, 0, 116, 255, 255, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 255, 255, 205, 1, 0, 0, 0, 0, 113, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 255, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 243, 255, 245, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 250, 225, 200, 174, 147, 121, 94, 65, 38, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 251, 162, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 120, 0, 0, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 50, 66, 55, 51, 48, 48, 48, 48, 48, 48, 48, 48, 161, 255, 255, 103, 48, 48, 48, 48, 48, 48, 48, 48, 51, 58, 71, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 255, 227, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 127, 150, 184, 226, 255, 255, 255, 255, 255, 255, 252, 207, 149, 89, 21, 0, 60, 255, 255, 131, 0, 0, 113, 254, 255, 253, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 255, 255, 70, 0, 0, 0, 0, 0, 154, 255, 255, 231, 21, 0, 0, 239, 244, 235, 231, 228, 228, 228, 228, 228, 138, 0, 0, 0, 0, 0, 0, 0, 50, 66, 55, 51, 48, 48, 48, 48, 48, 48, 48, 48, 161, 255, 255, 103, 48, 48, 48, 48, 48, 48, 48, 48, 51, 58, 71, 29, 0, 0, 0, 0, 0, 0, 0, 0, 49, 95, 89, 83, 78, 72, 66, 64, 64, 64, 64, 64, 142, 255, 255, 113, 0, 0, 0, 0, 0, 0, 0, 83, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 255, 255, 68, 0, 0, 0, 0, 0, 214, 255, 252, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 255, 255, 252, 71, 0, 0, 0, 0, 78, 255, 255, 100, 0, 0, 0, 0, 0, 100, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 255, 224, 0, 0, 0, 0, 0, 200, 255, 48, 0, 0, 0, 0, 48, 255, 255, 16, 0, 0, 0, 0, 116, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 255, 255, 68, 0, 0, 0, 0, 0, 214, 255, 252, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 184, 177, 159, 143, 129, 116, 104, 94, 83, 74, 212, 255, 241, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 255, 255, 202, 2, 0, 0, 0, 6, 79, 70, 62, 54, 48, 48, 48, 48, 105, 81, 48, 48, 48, 48, 48, 50, 54, 60, 72, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 150, 146, 138, 133, 132, 132, 132, 132, 132, 132, 132, 132, 133, 132, 132, 132, 135, 146, 157, 77, 0, 0, 0, 0, 70, 88, 81, 75, 68, 61, 60, 60, 60, 60, 60, 60, 60, 164, 255, 255, 142, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 65, 68, 77, 86, 56, 0, 0, 0, 0, 0, 0, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 255, 255, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 255, 255, 255, 255, 255, 253, 255, 255, 154, 10, 0, 0, 0, 0, 0, 56, 255, 255, 128, 0, 0, 0, 98, 253, 255, 254, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 237, 255, 204, 0, 0, 0, 0, 0, 0, 9, 219, 255, 255, 145, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 249, 255, 190, 0, 0, 0, 0, 0, 64, 255, 255, 236, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 255, 255, 236, 15, 0, 0, 0, 107, 255, 255, 88, 0, 0, 0, 0, 0, 100, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 255, 226, 16, 16, 16, 16, 16, 203, 255, 61, 16, 16, 16, 16, 61, 255, 255, 31, 16, 16, 16, 16, 124, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 249, 255, 190, 0, 0, 0, 0, 0, 64, 255, 255, 236, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 255, 255, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 255, 255, 255, 225, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 255, 254, 53, 0, 0, 0, 0, 20, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 120, 0, 0, + 0, 38, 106, 80, 66, 57, 134, 255, 255, 85, 63, 75, 57, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 64, 186, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 200, 245, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 255, 222, 168, 113, 58, 48, 255, 255, 132, 0, 0, 0, 0, 0, 0, 52, 255, 255, 128, 0, 0, 0, 0, 111, 255, 255, 254, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 67, 254, 137, 7, 0, 0, 209, 197, 178, 171, 164, 164, 181, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 253, 255, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 255, 255, 56, 0, 0, 0, 0, 0, 182, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 196, 230, 55, 0, 0, 0, 0, 136, 255, 255, 63, 0, 0, 0, 0, 0, 100, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 255, 255, 56, 0, 0, 0, 0, 0, 182, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 22, 0, 0, 0, 0, 0, 34, 56, 56, 56, 150, 255, 245, 58, 56, 56, 56, 56, 56, 9, 0, 0, 5, 237, 255, 254, 200, 200, 200, 200, 200, 200, 200, 200, 200, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 245, 255, 255, 162, 14, 0, 0, 0, 0, 0, 28, 152, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 255, 255, 157, 0, 0, 0, 34, 0, 20, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 120, 0, 0, + 0, 80, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 168, 0, 0, 0, 0, 50, 189, 176, 0, 0, 0, 0, 0, 0, 117, 255, 255, 176, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 91, 68, 60, 52, 52, 52, 52, 52, 52, 52, 52, 163, 255, 255, 106, 52, 52, 52, 52, 52, 52, 52, 52, 61, 73, 100, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 21, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 50, 255, 255, 128, 0, 0, 0, 0, 0, 149, 255, 181, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 230, 255, 255, 36, 0, 0, 0, 38, 60, 60, 26, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 130, 0, 0, 0, 0, 0, 0, 0, 73, 91, 68, 60, 52, 52, 52, 52, 52, 52, 52, 52, 163, 255, 255, 106, 52, 52, 52, 52, 52, 52, 52, 52, 61, 73, 100, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 253, 255, 255, 0, 0, 0, 0, 0, 49, 255, 255, 235, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 218, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 32, 0, 0, 0, 0, 0, 179, 255, 255, 26, 0, 0, 0, 0, 0, 100, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 253, 255, 255, 0, 0, 0, 0, 0, 49, 255, 255, 235, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 218, 255, 255, 179, 0, 0, 0, 0, 0, 0, 152, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 34, 0, 0, 85, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 239, 255, 249, 107, 0, 0, 0, 0, 0, 0, 66, 233, 255, 241, 121, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 255, 239, 21, 0, 0, 62, 250, 143, 28, 46, 35, 25, 20, 16, 16, 133, 204, 47, 16, 16, 16, 16, 16, 16, 19, 28, 36, 44, 23, 0, 0, + 0, 80, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 168, 0, 0, 0, 17, 239, 255, 255, 70, 0, 0, 0, 0, 0, 181, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 132, 37, 0, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 0, 3, 183, 126, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 47, 255, 255, 128, 0, 0, 0, 0, 0, 6, 122, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 255, 255, 255, 36, 0, 0, 0, 152, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 132, 37, 0, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 0, 3, 183, 126, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 213, 255, 255, 255, 0, 0, 0, 0, 0, 190, 255, 255, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 244, 255, 227, 0, 0, 0, 0, 0, 0, 100, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 185, 155, 143, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 213, 255, 255, 255, 0, 0, 0, 0, 0, 190, 255, 255, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 255, 255, 83, 0, 0, 0, 0, 0, 0, 141, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 24, 0, 0, 193, 255, 255, 193, 192, 192, 192, 192, 192, 192, 192, 241, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 247, 255, 230, 58, 0, 0, 0, 0, 0, 3, 128, 253, 255, 255, 255, 210, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 255, 255, 106, 0, 0, 0, 169, 255, 255, 238, 23, 0, 0, 0, 0, 1, 215, 255, 245, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 24, 73, 64, 54, 45, 126, 255, 255, 75, 52, 64, 49, 0, 0, 0, 0, 108, 255, 255, 213, 3, 0, 0, 0, 9, 245, 255, 222, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 189, 255, 211, 11, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 0, 105, 255, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 46, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 238, 255, 255, 255, 36, 0, 0, 0, 140, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 189, 255, 211, 11, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 0, 105, 255, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 165, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 0, 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 130, 255, 255, 255, 255, 0, 0, 0, 0, 84, 255, 255, 207, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 241, 255, 236, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 255, 145, 0, 0, 0, 0, 0, 0, 100, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 255, 255, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 255, 255, 255, 255, 0, 0, 0, 0, 84, 255, 255, 207, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 241, 255, 236, 6, 0, 0, 0, 0, 0, 0, 134, 255, 255, 83, 44, 44, 44, 44, 44, 44, 179, 255, 255, 16, 0, 49, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 59, 184, 255, 255, 197, 25, 0, 0, 0, 0, 0, 33, 196, 255, 255, 255, 202, 79, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 243, 255, 204, 2, 0, 0, 43, 253, 255, 255, 91, 0, 0, 0, 0, 0, 80, 255, 255, 231, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 5, 224, 255, 255, 100, 0, 0, 0, 79, 255, 255, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 255, 255, 166, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 16, 236, 255, 250, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 95, 85, 75, 72, 72, 72, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 235, 36, 36, 36, 36, 36, 39, 43, 54, 50, 0, 0, 0, 0, 0, 104, 129, 121, 116, 112, 109, 108, 131, 255, 255, 184, 108, 108, 108, 108, 108, 108, 133, 255, 255, 182, 108, 108, 108, 108, 108, 108, 110, 114, 120, 131, 105, 0, 0, 0, 0, 0, 0, 144, 255, 255, 255, 255, 36, 0, 0, 0, 134, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 255, 255, 166, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 16, 236, 255, 250, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 254, 200, 86, 5, 0, 0, 0, 0, 0, 54, 250, 255, 255, 255, 255, 0, 0, 0, 20, 233, 255, 255, 75, 0, 0, 0, 0, 64, 72, 72, 2, 0, 0, 0, 99, 255, 255, 147, 0, 0, 0, 0, 0, 31, 62, 53, 43, 36, 36, 36, 36, 9, 0, 0, 0, 58, 247, 255, 250, 33, 0, 0, 0, 0, 0, 0, 100, 255, 255, 218, 78, 52, 54, 69, 87, 59, 0, 0, 0, 0, 0, 73, 207, 197, 188, 184, 181, 180, 180, 180, 180, 180, 180, 180, 199, 255, 255, 225, 180, 180, 180, 180, 180, 180, 180, 181, 185, 192, 201, 194, 0, 0, 0, 0, 0, 0, 0, 54, 250, 255, 255, 255, 255, 0, 0, 0, 20, 233, 255, 255, 75, 0, 0, 0, 0, 64, 72, 72, 2, 0, 0, 0, 99, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 130, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 12, 0, 181, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 205, 255, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 231, 255, 255, 255, 232, 114, 108, 108, 108, 108, 108, 126, 243, 255, 255, 219, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 234, 255, 255, 128, 88, 98, 104, 192, 255, 255, 160, 0, 0, 0, 0, 0, 6, 218, 255, 247, 53, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 112, 200, 99, 18, 0, 0, 0, 167, 255, 249, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 214, 255, 255, 76, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 142, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 255, 255, 255, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 196, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 0, 0, 0, 0, 0, 47, 252, 255, 255, 255, 255, 36, 0, 0, 0, 130, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 214, 255, 255, 76, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 142, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 255, 250, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 115, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 255, 255, 253, 33, 0, 0, 0, 0, 28, 230, 255, 255, 228, 255, 255, 0, 0, 0, 174, 255, 255, 189, 0, 0, 0, 0, 0, 219, 255, 253, 1, 0, 0, 0, 210, 255, 255, 52, 0, 0, 0, 0, 0, 116, 255, 255, 255, 255, 255, 255, 255, 65, 0, 0, 55, 237, 255, 255, 117, 0, 0, 0, 0, 0, 0, 0, 89, 255, 255, 255, 255, 255, 255, 255, 255, 132, 0, 0, 0, 0, 0, 88, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 0, 0, 0, 0, 0, 0, 28, 230, 255, 255, 228, 255, 255, 0, 0, 0, 174, 255, 255, 189, 0, 0, 0, 0, 0, 219, 255, 253, 1, 0, 0, 0, 210, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 126, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 9, 60, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 123, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 255, 255, 255, 255, 255, 255, 255, 255, 255, 228, 15, 0, 0, 0, 0, 0, 137, 255, 255, 94, 0, 0, 0, 0, 24, 177, 222, 24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 48, 210, 188, 161, 152, 156, 152, 152, 152, 152, 152, 152, 245, 255, 233, 152, 152, 153, 169, 191, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 85, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 254, 255, 220, 7, 0, 0, 140, 255, 255, 68, 0, 0, 35, 249, 255, 228, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 255, 255, 254, 250, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 196, 0, 0, 0, 0, 0, 183, 234, 226, 220, 217, 215, 214, 219, 255, 255, 234, 212, 212, 212, 212, 212, 212, 213, 255, 255, 240, 212, 212, 212, 212, 212, 212, 215, 219, 224, 235, 183, 0, 0, 0, 0, 3, 200, 255, 255, 222, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 254, 255, 220, 7, 0, 0, 140, 255, 255, 68, 0, 0, 35, 249, 255, 228, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 255, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 255, 255, 180, 44, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 19, 60, 200, 255, 255, 179, 0, 0, 0, 0, 10, 206, 255, 255, 155, 172, 255, 255, 0, 0, 119, 255, 255, 245, 34, 0, 0, 0, 0, 0, 207, 255, 243, 0, 0, 0, 7, 111, 175, 194, 0, 0, 0, 0, 0, 0, 116, 255, 255, 255, 255, 255, 255, 255, 55, 0, 60, 249, 255, 255, 160, 1, 0, 0, 0, 0, 0, 0, 0, 20, 229, 255, 255, 255, 255, 255, 255, 255, 132, 0, 0, 0, 0, 0, 47, 132, 122, 113, 109, 106, 104, 104, 104, 104, 104, 104, 104, 193, 255, 255, 116, 104, 104, 104, 104, 104, 104, 104, 107, 111, 117, 127, 125, 0, 0, 0, 0, 0, 10, 206, 255, 255, 155, 172, 255, 255, 0, 0, 119, 255, 255, 245, 34, 0, 0, 0, 0, 0, 207, 255, 243, 0, 0, 0, 7, 111, 175, 194, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 15, 214, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 255, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 255, 255, 238, 212, 196, 185, 180, 180, 248, 255, 255, 255, 179, 32, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 250, 255, 255, 253, 226, 196, 250, 255, 255, 75, 0, 0, 0, 0, 0, 74, 253, 255, 156, 0, 0, 0, 0, 0, 178, 255, 255, 204, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 56, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 116, 255, 206, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 255, 245, 63, 0, 0, 140, 255, 255, 68, 0, 0, 170, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 2, 0, 0, 248, 255, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 234, 28, 28, 28, 28, 28, 31, 35, 45, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 249, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 173, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 255, 245, 63, 0, 0, 140, 255, 255, 68, 0, 0, 170, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 57, 0, 0, 0, 0, 75, 250, 255, 228, 14, 172, 255, 255, 0, 5, 148, 229, 255, 113, 0, 0, 0, 0, 0, 0, 202, 255, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 89, 76, 71, 67, 166, 255, 255, 45, 0, 0, 71, 238, 158, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 80, 99, 100, 100, 100, 100, 100, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 255, 246, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 250, 255, 228, 14, 172, 255, 255, 0, 5, 148, 229, 255, 113, 0, 0, 0, 0, 0, 0, 202, 255, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 78, 247, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 43, 10, 0, 0, 0, 0, 43, 198, 255, 255, 229, 83, 0, 0, 0, 0, 35, 180, 216, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 78, 38, 5, 0, 81, 255, 255, 165, 0, 0, 0, 0, 0, 54, 242, 255, 205, 8, 0, 0, 0, 0, 0, 19, 219, 255, 255, 171, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 5, 94, 66, 44, 193, 180, 171, 168, 168, 168, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 173, 182, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 53, 255, 255, 255, 227, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 147, 25, 0, 0, 0, 140, 255, 255, 68, 0, 0, 34, 138, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 228, 255, 200, 0, 0, 0, 0, 0, 0, 103, 31, 0, 0, 0, 0, 0, 0, 69, 252, 255, 245, 32, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 147, 25, 0, 0, 0, 140, 255, 255, 68, 0, 0, 34, 138, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 52, 234, 83, 0, 172, 255, 255, 0, 0, 0, 4, 84, 2, 0, 0, 0, 0, 0, 0, 198, 255, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 41, 0, 0, 10, 77, 33, 23, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 160, 160, 160, 160, 160, 160, 160, 237, 255, 243, 160, 160, 160, 160, 160, 160, 160, 160, 160, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 234, 83, 0, 172, 255, 255, 0, 0, 0, 4, 84, 2, 0, 0, 0, 0, 0, 0, 198, 255, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 28, 195, 43, 0, 52, 176, 13, 0, 0, 0, 0, 0, 0, 226, 255, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 137, 250, 255, 253, 146, 14, 0, 0, 0, 0, 8, 196, 255, 255, 243, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 221, 255, 234, 20, 0, 0, 0, 8, 104, 244, 255, 236, 32, 0, 0, 0, 0, 0, 0, 0, 41, 244, 255, 255, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 134, 226, 255, 103, 0, 0, 0, 0, 0, 0, 0, 148, 170, 68, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 105, 253, 255, 255, 236, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 185, 173, 167, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 214, 255, 255, 188, 164, 164, 164, 164, 164, 164, 164, 164, 164, 166, 170, 176, 187, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 207, 255, 222, 0, 0, 0, 0, 0, 15, 243, 240, 117, 8, 0, 0, 0, 0, 53, 203, 255, 119, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 119, 185, 173, 167, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 214, 255, 255, 188, 164, 164, 164, 164, 164, 164, 164, 164, 164, 166, 170, 176, 187, 119, 0, 0, 0, 0, 0, 0, 27, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 56, 88, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 91, 80, 39, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 38, 0, 0, 52, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 0, 1, 0, 117, 254, 255, 123, 0, 0, 0, 0, 0, 0, 232, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 107, 232, 255, 255, 201, 50, 0, 0, 0, 0, 0, 0, 0, 5, 148, 255, 255, 253, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 255, 89, 0, 0, 0, 0, 160, 255, 255, 255, 158, 100, 110, 124, 141, 161, 181, 203, 228, 251, 255, 255, 255, 252, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 255, 255, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 2, 229, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 90, 251, 255, 255, 243, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 3, 0, 0, 182, 255, 249, 3, 0, 0, 0, 0, 114, 255, 255, 243, 43, 0, 0, 0, 0, 0, 6, 125, 4, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 156, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 44, 255, 255, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 240, 240, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 0, 0, 92, 103, 5, 0, 0, 196, 255, 232, 0, 0, 7, 127, 196, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 36, 0, 0, 52, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 255, 156, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 132, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 0, 0, 92, 103, 5, 0, 0, 196, 255, 232, 0, 0, 7, 127, 196, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 213, 204, 204, 204, 204, 204, 204, 237, 255, 255, 8, 0, 0, 0, 45, 252, 255, 237, 13, 0, 0, 0, 0, 0, 238, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 144, 232, 255, 255, 236, 102, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 250, 255, 255, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 249, 255, 179, 0, 0, 0, 0, 0, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 18, 0, 0, + 0, 0, 0, 35, 113, 201, 255, 255, 255, 255, 208, 92, 5, 0, 0, 0, 0, 0, 0, 70, 255, 255, 227, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 78, 248, 255, 255, 244, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 236, 212, 201, 192, 192, 192, 192, 192, 192, 192, 220, 255, 255, 255, 255, 255, 255, 255, 240, 192, 192, 192, 192, 192, 192, 192, 197, 204, 212, 220, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 41, 111, 192, 125, 0, 0, 144, 255, 255, 35, 0, 0, 0, 11, 231, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 154, 236, 212, 201, 192, 192, 192, 192, 192, 192, 192, 220, 255, 255, 255, 255, 255, 255, 255, 240, 192, 192, 192, 192, 192, 192, 192, 197, 204, 212, 220, 137, 0, 0, 0, 0, 0, 0, 60, 255, 255, 222, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 135, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 0, 11, 232, 255, 220, 39, 0, 196, 255, 232, 0, 0, 156, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 36, 0, 0, 9, 48, 48, 214, 255, 247, 52, 48, 48, 48, 48, 48, 48, 48, 169, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 0, 11, 232, 255, 220, 39, 0, 196, 255, 232, 0, 0, 156, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 161, 255, 255, 122, 0, 0, 0, 0, 0, 247, 255, 152, 0, 0, 0, 0, 0, 0, 0, 0, 134, 197, 240, 255, 255, 255, 255, 182, 64, 59, 72, 84, 96, 108, 121, 132, 143, 154, 165, 176, 187, 197, 239, 255, 255, 255, 169, 7, 0, 0, 0, 0, 0, 0, 0, 4, 198, 255, 241, 27, 0, 0, 0, 0, 0, 5, 245, 255, 255, 255, 255, 255, 249, 202, 176, 211, 255, 255, 92, 37, 36, 235, 255, 209, 38, 0, 0, + 0, 100, 220, 255, 255, 255, 255, 255, 255, 90, 0, 0, 15, 227, 203, 184, 176, 176, 176, 218, 255, 255, 222, 176, 176, 176, 176, 176, 176, 176, 176, 177, 188, 201, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 71, 247, 255, 255, 246, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 211, 255, 248, 182, 255, 255, 223, 255, 252, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 255, 255, 224, 233, 255, 255, 255, 154, 0, 0, 103, 255, 255, 75, 0, 0, 0, 126, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 211, 255, 248, 182, 255, 255, 223, 255, 252, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 176, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 255, 255, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 0, 126, 255, 255, 213, 5, 0, 196, 255, 232, 0, 0, 33, 244, 255, 252, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 117, 255, 255, 66, 0, 0, 0, 0, 0, 0, 6, 235, 255, 251, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 255, 208, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 197, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 0, 126, 255, 255, 213, 5, 0, 196, 255, 232, 0, 0, 33, 244, 255, 252, 59, 0, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 171, 152, 152, 152, 152, 152, 152, 218, 255, 255, 8, 0, 0, 0, 0, 40, 254, 255, 234, 9, 0, 0, 0, 0, 254, 255, 144, 0, 0, 0, 0, 0, 0, 0, 0, 152, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 15, 0, 0, 0, 0, 0, 0, 152, 255, 255, 103, 0, 5, 34, 72, 112, 141, 1, 132, 130, 88, 61, 229, 255, 201, 0, 0, 136, 255, 255, 36, 0, 0, 77, 164, 6, 0, 0, 0, + 0, 60, 255, 255, 255, 232, 188, 255, 255, 36, 0, 0, 16, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 70, 247, 255, 255, 245, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 168, 255, 255, 117, 140, 255, 255, 99, 245, 255, 238, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 68, 116, 165, 217, 254, 255, 255, 255, 255, 255, 255, 222, 117, 0, 0, 60, 255, 255, 131, 0, 0, 36, 244, 255, 234, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 168, 255, 255, 117, 140, 255, 255, 99, 245, 255, 238, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 194, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 6, 210, 201, 191, 186, 183, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 208, 255, 255, 213, 180, 180, 180, 184, 189, 198, 207, 66, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 36, 247, 255, 253, 58, 0, 0, 196, 255, 232, 0, 0, 0, 112, 255, 255, 222, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 24, 251, 255, 157, 0, 0, 0, 0, 0, 0, 95, 255, 255, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 0, 36, 247, 255, 253, 58, 0, 0, 196, 255, 232, 0, 0, 0, 112, 255, 255, 222, 13, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 0, 0, 0, 0, 0, 183, 255, 255, 107, 0, 0, 0, 6, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 67, 255, 255, 255, 255, 247, 234, 222, 212, 204, 196, 191, 205, 255, 255, 209, 169, 156, 143, 131, 118, 107, 96, 86, 122, 254, 255, 255, 204, 5, 0, 0, 0, 40, 179, 255, 255, 253, 199, 228, 253, 255, 255, 255, 166, 0, 0, 0, 0, 0, 223, 255, 198, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 214, 238, 117, 9, 100, 255, 255, 36, 0, 0, 11, 166, 151, 146, 144, 144, 221, 255, 255, 169, 144, 144, 144, 144, 185, 255, 255, 176, 144, 144, 148, 156, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 74, 250, 255, 255, 243, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 255, 255, 190, 2, 140, 255, 255, 68, 101, 255, 255, 237, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 237, 255, 255, 255, 255, 255, 255, 255, 255, 229, 154, 90, 27, 0, 0, 0, 0, 7, 247, 255, 192, 0, 3, 198, 255, 255, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 255, 255, 190, 2, 140, 255, 255, 68, 101, 255, 255, 237, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 8, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 1, 189, 255, 255, 144, 0, 0, 0, 196, 255, 232, 0, 0, 0, 2, 199, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 0, 165, 255, 250, 30, 0, 0, 0, 0, 5, 221, 255, 254, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 125, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 94, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 1, 189, 255, 255, 144, 0, 0, 0, 196, 255, 232, 0, 0, 0, 2, 199, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 0, 0, 0, 0, 0, 75, 255, 255, 218, 1, 0, 0, 17, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 56, 31, 9, 0, 0, 0, 0, 0, 0, 0, 72, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 255, 199, 42, 0, 0, 0, 0, 99, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 110, 0, 0, 0, 0, 0, 230, 255, 190, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 63, 18, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 28, 247, 255, 188, 1, 0, 0, 0, 0, 166, 255, 236, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 89, 254, 255, 245, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 255, 230, 23, 0, 140, 255, 255, 68, 0, 154, 255, 255, 249, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 255, 255, 255, 231, 182, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 189, 255, 251, 24, 152, 255, 255, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 255, 230, 23, 0, 140, 255, 255, 68, 0, 154, 255, 255, 249, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 5, 173, 167, 161, 155, 150, 144, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 183, 255, 255, 190, 140, 140, 141, 145, 149, 159, 168, 54, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 117, 255, 255, 219, 10, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 42, 249, 255, 255, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 36, 0, 0, 15, 0, 0, 0, 42, 254, 255, 169, 0, 0, 0, 0, 115, 255, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 108, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 73, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 0, 117, 255, 255, 219, 10, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 42, 249, 255, 255, 69, 0, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 0, 0, 0, 0, 0, 2, 227, 255, 255, 65, 0, 0, 26, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 4, 0, 0, 0, 0, 0, 16, 249, 255, 255, 242, 201, 158, 121, 87, 54, 22, 0, 0, 0, 0, 0, 1, 248, 255, 165, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 161, 255, 245, 32, 0, 0, 0, 0, 33, 251, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 238, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 255, 255, 247, 57, 0, 0, 140, 255, 255, 68, 0, 4, 179, 255, 255, 255, 145, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 0, 4, 167, 25, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 255, 247, 184, 114, 44, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 113, 255, 255, 209, 255, 255, 222, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 255, 255, 247, 57, 0, 0, 140, 255, 255, 68, 0, 4, 179, 255, 255, 255, 145, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 57, 251, 255, 251, 55, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 139, 255, 255, 223, 11, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 36, 0, 114, 141, 0, 0, 0, 0, 165, 255, 255, 94, 0, 0, 40, 247, 255, 244, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 0, 57, 251, 255, 251, 55, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 139, 255, 255, 223, 11, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 0, 0, 0, 0, 0, 0, 132, 208, 73, 0, 0, 0, 37, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 169, 39, 0, 0, 0, 0, 0, 0, 72, 255, 255, 100, 0, 0, 0, 0, 102, 171, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 102, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 136, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 0, 0, 54, 254, 255, 213, 70, 2, 0, 0, 0, 169, 255, 244, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 155, 255, 255, 253, 82, 0, 0, 0, 140, 255, 255, 68, 0, 0, 7, 183, 255, 255, 255, 207, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 0, 2, 162, 255, 155, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 77, 10, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 19, 248, 255, 255, 255, 240, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 155, 255, 255, 253, 82, 0, 0, 0, 140, 255, 255, 68, 0, 0, 7, 183, 255, 255, 255, 207, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 198, 217, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 33, 232, 255, 255, 125, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 14, 234, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 36, 82, 252, 238, 18, 0, 0, 0, 23, 239, 255, 247, 67, 17, 214, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 33, 232, 255, 255, 125, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 14, 234, 255, 255, 145, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 52, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 186, 255, 246, 119, 4, 0, 0, 0, 0, 72, 255, 255, 100, 0, 0, 0, 87, 249, 255, 222, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 255, 255, 86, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 0, 0, 123, 249, 255, 255, 255, 226, 124, 18, 68, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 206, 255, 255, 252, 94, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 6, 166, 255, 255, 255, 253, 165, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 216, 2, 156, 255, 255, 236, 11, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 9, 210, 255, 255, 249, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 206, 255, 255, 252, 94, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 6, 166, 255, 255, 255, 253, 165, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 255, 255, 180, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 7, 215, 255, 255, 188, 3, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 103, 255, 255, 248, 27, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 117, 250, 255, 255, 116, 0, 0, 0, 0, 96, 255, 255, 246, 206, 255, 255, 186, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 115, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 82, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 7, 215, 255, 255, 188, 3, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 103, 255, 255, 248, 27, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 159, 255, 255, 254, 151, 16, 0, 0, 0, 0, 72, 255, 255, 100, 0, 0, 0, 99, 244, 255, 255, 251, 120, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 92, 48, 0, 0, 0, 185, 255, 255, 29, 0, 0, 136, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 23, 126, 230, 255, 255, 255, 241, 232, 255, 213, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 123, 246, 255, 255, 249, 87, 0, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 0, 1, 132, 254, 255, 255, 255, 255, 193, 97, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 222, 167, 255, 255, 223, 41, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 44, 212, 255, 255, 255, 240, 32, 0, 0, 0, 0, 39, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 7, 123, 246, 255, 255, 249, 87, 0, 0, 0, 0, 0, 140, 255, 255, 68, 0, 0, 0, 0, 1, 132, 254, 255, 255, 255, 255, 193, 97, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 255, 255, 208, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 246, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 85, 244, 224, 20, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 3, 210, 200, 46, 0, 0, 0, 0, 0, 0, 0, 0, 137, 255, 255, 255, 255, 255, 177, 8, 0, 0, 0, 0, 0, 148, 255, 255, 255, 255, 226, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 182, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 164, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 255, 255, 0, 0, 85, 244, 224, 20, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 3, 210, 200, 46, 0, 0, 0, 0, 0, 124, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 1, 157, 255, 255, 240, 75, 0, 0, 0, 0, 0, 0, 72, 255, 255, 100, 0, 0, 0, 0, 36, 206, 255, 255, 255, 182, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 108, 180, 249, 255, 73, 0, 0, 59, 255, 255, 199, 0, 0, 0, 136, 255, 255, 36, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 89, 199, 255, 255, 255, 255, 211, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 220, 255, 255, 255, 237, 62, 0, 0, 0, 0, 0, 0, 141, 255, 255, 68, 0, 0, 0, 0, 0, 0, 76, 237, 255, 255, 255, 255, 255, 235, 32, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 255, 255, 216, 27, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 255, 255, 132, 0, 0, 0, 0, 0, 7, 127, 248, 255, 255, 252, 255, 255, 202, 9, 0, 0, 0, 89, 253, 154, 29, 0, 0, 0, 0, 0, 0, 0, 173, 255, 255, 36, 0, 0, 0, 128, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 0, 3, 93, 220, 255, 255, 255, 237, 62, 0, 0, 0, 0, 0, 0, 141, 255, 255, 68, 0, 0, 0, 0, 0, 0, 76, 237, 255, 255, 255, 255, 255, 235, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 255, 255, 171, 0, 0, 0, 0, 0, 0, 0, 0, 79, 255, 255, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 255, 255, 249, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 255, 255, 0, 0, 0, 47, 49, 0, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 0, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 255, 255, 255, 255, 167, 4, 0, 0, 0, 0, 0, 0, 58, 252, 255, 255, 255, 134, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 255, 255, 0, 0, 0, 47, 49, 0, 0, 0, 0, 0, 0, 0, 196, 255, 232, 0, 0, 0, 0, 0, 0, 0, 27, 2, 0, 0, 0, 0, 0, 0, 126, 255, 255, 246, 244, 244, 244, 244, 244, 244, 251, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 255, 255, 37, 0, 0, 0, 0, 0, 0, 0, 10, 172, 255, 255, 229, 44, 0, 0, 0, 0, 0, 0, 0, 72, 255, 255, 100, 0, 0, 0, 0, 0, 7, 153, 255, 255, 255, 224, 46, 0, 0, 0, 0, 0, 0, 0, 16, 65, 119, 172, 230, 255, 255, 255, 255, 255, 80, 0, 6, 202, 255, 255, 98, 0, 0, 0, 136, 255, 255, 36, 0, 0, 0, 122, 180, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 109, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 163, 255, 255, 255, 255, 255, 255, 204, 79, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 196, 255, 255, 255, 255, 207, 33, 0, 0, 0, 0, 0, 0, 0, 149, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 23, 165, 254, 255, 255, 245, 50, 0, 0, 0, 0, 0, 0, 0, 0, 25, 255, 255, 255, 255, 211, 23, 0, 0, 0, 0, 0, 0, 0, 0, 232, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 132, 0, 0, 0, 2, 88, 218, 255, 255, 255, 193, 36, 191, 255, 255, 186, 8, 0, 0, 131, 255, 255, 149, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 37, 0, 0, 0, 129, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 124, 0, 0, 0, 0, 5, 196, 255, 255, 255, 255, 207, 33, 0, 0, 0, 0, 0, 0, 0, 149, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 23, 165, 254, 255, 255, 245, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 255, 255, 134, 0, 0, 0, 0, 0, 0, 0, 0, 82, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 255, 255, 205, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 255, 255, 255, 163, 3, 0, 0, 0, 0, 0, 9, 128, 250, 255, 255, 255, 255, 255, 203, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 172, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 153, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 255, 255, 23, 0, 0, 0, 0, 0, 0, 34, 205, 255, 255, 218, 31, 0, 0, 0, 0, 0, 0, 0, 0, 76, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 110, 253, 255, 255, 240, 62, 0, 0, 0, 45, 182, 227, 255, 255, 255, 255, 255, 255, 254, 209, 138, 68, 7, 0, 147, 255, 255, 214, 3, 0, 0, 0, 136, 255, 255, 36, 0, 0, 0, 169, 255, 255, 115, 0, + 0, 0, 0, 0, 0, 0, 178, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 52, 144, 245, 255, 255, 226, 85, 164, 254, 255, 255, 255, 207, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 215, 255, 255, 150, 9, 0, 0, 0, 0, 0, 0, 0, 0, 156, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 181, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 255, 255, 255, 218, 23, 8, 131, 109, 90, 81, 74, 72, 72, 72, 238, 255, 238, 72, 72, 72, 72, 72, 77, 83, 92, 111, 132, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 255, 255, 126, 0, 16, 107, 214, 255, 255, 255, 246, 115, 2, 0, 23, 224, 255, 255, 203, 35, 0, 203, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 178, 255, 255, 40, 0, 0, 0, 131, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 255, 255, 124, 0, 0, 0, 0, 0, 31, 215, 255, 255, 150, 9, 0, 0, 0, 0, 0, 0, 0, 0, 156, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 181, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 239, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 85, 255, 255, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 245, 255, 212, 30, 0, 0, 0, 0, 0, 0, 0, 0, 7, 188, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 249, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 255, 255, 255, 174, 3, 0, 0, 0, 0, 8, 104, 226, 255, 255, 246, 127, 104, 235, 255, 255, 255, 219, 123, 45, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 249, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 255, 255, 139, 112, 112, 112, 112, 112, 112, 204, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 88, 250, 255, 240, 2, 0, 0, 0, 0, 0, 97, 243, 255, 255, 205, 21, 0, 0, 0, 0, 0, 0, 0, 0, 4, 153, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 78, 249, 255, 245, 70, 0, 0, 0, 4, 212, 255, 255, 255, 255, 234, 165, 94, 24, 0, 0, 0, 0, 124, 255, 255, 250, 57, 0, 0, 0, 0, 136, 255, 255, 61, 0, 0, 12, 240, 255, 255, 46, 0, + 0, 0, 57, 188, 170, 190, 255, 255, 253, 13, 0, 0, 0, 9, 48, 99, 155, 219, 255, 255, 255, 254, 166, 17, 0, 0, 48, 189, 255, 255, 255, 255, 204, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 199, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 14, 0, 0, 0, 0, 0, 0, 0, 0, 2, 218, 255, 255, 226, 30, 0, 16, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 90, 154, 171, 209, 255, 255, 255, 95, 0, 136, 255, 255, 255, 255, 191, 36, 0, 0, 0, 0, 37, 232, 255, 255, 250, 212, 255, 255, 222, 2, 0, 0, 0, 0, 0, 0, 0, 181, 255, 255, 44, 0, 0, 0, 135, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 69, 172, 171, 187, 247, 255, 255, 117, 0, 0, 0, 0, 0, 0, 33, 199, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 197, 210, 208, 210, 218, 238, 255, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 92, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 133, 6, 0, 0, 0, 0, 0, 24, 186, 192, 210, 244, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 255, 255, 11, 0, 0, 0, 0, 0, 0, 17, 183, 196, 221, 255, 255, 255, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 218, 255, 197, 7, 0, 0, 0, 49, 148, 238, 255, 255, 254, 167, 31, 0, 0, 16, 141, 244, 255, 255, 255, 255, 242, 188, 157, 136, 52, 0, 0, 0, 163, 212, 206, 200, 194, 187, 244, 255, 213, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 203, 255, 254, 185, 187, 190, 196, 206, 191, 0, 0, 0, 0, 0, 0, 0, 0, 183, 255, 255, 11, 0, 0, 0, 0, 0, 0, 17, 183, 196, 221, 255, 255, 255, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 28, 0, 0, 0, 0, 0, 11, 170, 172, 178, 197, 237, 255, 255, 255, 153, 0, 0, 0, 0, 0, 0, 36, 199, 255, 189, 13, 0, 0, 0, 0, 0, 1, 185, 224, 233, 251, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 240, 65, 0, 0, 0, 0, 0, 84, 255, 224, 138, 58, 2, 0, 0, 0, 0, 0, 3, 142, 255, 255, 255, 109, 0, 0, 0, 0, 0, 119, 255, 255, 212, 118, 112, 187, 255, 255, 199, 0, 0, + 0, 0, 2, 224, 255, 255, 255, 255, 183, 0, 0, 0, 50, 252, 255, 255, 255, 255, 255, 253, 172, 46, 0, 0, 0, 0, 0, 0, 80, 223, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 206, 243, 46, 0, 0, 16, 255, 255, 255, 254, 250, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 254, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 34, 250, 255, 255, 255, 255, 226, 15, 0, 0, 161, 255, 231, 93, 0, 0, 0, 0, 0, 0, 0, 34, 216, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 189, 255, 255, 50, 0, 0, 0, 139, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 16, 243, 255, 255, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 255, 255, 255, 255, 255, 255, 255, 255, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 255, 255, 255, 255, 255, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 159, 255, 255, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 222, 27, 0, 78, 166, 228, 255, 255, 255, 255, 185, 51, 0, 0, 0, 0, 0, 0, 18, 124, 229, 255, 255, 255, 255, 255, 221, 13, 0, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 228, 0, 0, 0, 0, 0, 0, 0, 0, 190, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 159, 255, 255, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 255, 255, 48, 0, 0, 0, 0, 0, 0, 164, 255, 255, 37, 0, 0, 0, 0, 0, 0, 146, 255, 255, 255, 255, 255, 255, 196, 16, 0, 0, 0, 0, 0, 0, 0, 8, 118, 7, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 255, 255, 223, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 60, 1, 0, 0, 0, 0, 0, 0, 0, 34, 198, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 56, 255, 255, 255, 255, 255, 255, 255, 253, 62, 0, 0, + 0, 0, 0, 137, 255, 255, 250, 170, 20, 0, 0, 0, 0, 161, 255, 255, 252, 196, 117, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 139, 253, 185, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 136, 136, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 172, 172, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 71, 0, 0, 0, 1, 22, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 12, 23, 0, 0, 0, 0, 0, 0, 0, 0, 170, 255, 255, 233, 148, 25, 0, 0, 0, 15, 119, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 139, 245, 255, 255, 187, 3, 0, 0, 0, 0, 0, 0, 0, 0, 197, 255, 255, 57, 0, 0, 0, 148, 255, 255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 255, 255, 255, 230, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 172, 172, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 255, 255, 255, 255, 255, 244, 187, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 255, 255, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 255, 255, 254, 195, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 252, 195, 95, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 22, 197, 255, 255, 248, 164, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 155, 231, 255, 255, 91, 0, 0, 0, 0, 46, 56, 50, 44, 37, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 33, 36, 42, 51, 53, 0, 0, 0, 0, 0, 0, 0, 0, 200, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 252, 195, 95, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 136, 136, 25, 0, 0, 0, 0, 0, 0, 41, 64, 64, 10, 0, 0, 0, 0, 0, 0, 52, 255, 255, 255, 233, 163, 82, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 251, 255, 244, 193, 127, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 191, 255, 254, 122, 0, 0, 0, 0, 0, 0, 0, 0, 104, 214, 242, 244, 244, 244, 223, 91, 0, 0, 0, + 0, 0, 0, 48, 107, 68, 15, 0, 0, 0, 0, 0, 0, 53, 130, 74, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 117, 58, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 78, 74, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 204, 204, 53, 0, 0, 0, 104, 168, 168, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 137, 96, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 123, 106, 87, 61, 30, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 24, 24, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 139, 83, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 60, 60, 8, 0, 0, 0, 0, 0, 0, 0, 0, 107, 69, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 169, 94, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 103, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 60, 60, 8, 0, 0, 0, 0, 0, 0, 0, 0, 107, 69, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 113, 77, 37, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 40, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 145, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const int g_txt_title_w = 240; diff --git a/CODE/font/render_embedded.py b/CODE/font/render_embedded.py index 87ac964..d44ddbd 100644 --- a/CODE/font/render_embedded.py +++ b/CODE/font/render_embedded.py @@ -4,8 +4,8 @@ from PIL import Image, ImageFont, ImageDraw ttf = "SYSTEM/system/font/simhei.ttf" texts = [ - ("welcome", "欢迎使用 Deshab", 48), # only welcome stays large - ("setup", "接下来让我们来引导你设置你的系统", 24), # 32 -> 24 + ("welcome", "欢迎使用 Deshab", 36), + ("setup", "接下来让我们来引导你设置你的系统", 36), ("title", "创建你的 Deshab 账户", 24), ("computer", "计算机名", 24), ("username", "用户名", 24), diff --git a/CODE/tools/bash/MAKEFILE b/CODE/login/MAKEFILE similarity index 69% rename from CODE/tools/bash/MAKEFILE rename to CODE/login/MAKEFILE index 1a9b8a2..fc329ac 100644 --- a/CODE/tools/bash/MAKEFILE +++ b/CODE/login/MAKEFILE @@ -1,10 +1,10 @@ CC := clang LD := ld.lld -ROOT := ../../.. -OUT := $(ROOT)/SYSTEM/system/deshab64/tools/bash.elf +ROOT := ../.. +OUT := $(ROOT)/SYSTEM/system/user/use/login.elf -CFLAGS := -target x86_64-unknown-none -std=c11 -ffreestanding -fno-builtin -fno-stack-protector -fpie -mno-red-zone -mno-sse -mno-sse2 -mno-mmx -msoft-float -m64 -Wall -Wextra -I.. -I../../UTSM/include -O2 +CFLAGS := -target x86_64-unknown-none -std=c11 -ffreestanding -fno-builtin -fno-stack-protector -fpie -mno-red-zone -mno-sse -mno-sse2 -mno-mmx -msoft-float -m64 -Wall -Wextra -I../UTSM/include -I../firstInit -O2 LDFLAGS := -nostdlib -static -pie -z max-page-size=0x1000 -T linker.ld C_SOURCES := main.c @@ -15,7 +15,7 @@ OBJECTS := $(C_SOURCES:.c=.o) all: $(OUT) $(OUT): $(OBJECTS) linker.ld - @if not exist "$(ROOT)\SYSTEM\system\deshab64\tools" mkdir "$(ROOT)\SYSTEM\system\deshab64\tools" + @if not exist "$(ROOT)\SYSTEM\system\user\use" mkdir "$(ROOT)\SYSTEM\system\user\use" $(LD) $(LDFLAGS) -o $@ $(OBJECTS) %.o: %.c diff --git a/CODE/login/linker.ld b/CODE/login/linker.ld new file mode 100644 index 0000000..473e5fc --- /dev/null +++ b/CODE/login/linker.ld @@ -0,0 +1,24 @@ +ENTRY(dsk_entry) + +PHDRS +{ + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); +} + +SECTIONS +{ + . = 0x1000; + .text : ALIGN(4K) { *(.text*) } :text + .rodata : ALIGN(4K) { *(.rodata*) } :rodata + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic +} diff --git a/CODE/login/main.c b/CODE/login/main.c new file mode 100644 index 0000000..4c73aee --- /dev/null +++ b/CODE/login/main.c @@ -0,0 +1,565 @@ +/* login.elf — Deshab login screen + * Shown on non-first boot (firstInit=1) before loading desktop. + * Reads USER.CONF via boot context (ctx->reserved[0/1]), + * extracts username + password hash, prompts for password, + * verifies via SHA256 comparison, sets ctx->reserved[2]=1 on success. + * + * Returns to DSK in all cases (success, skip via Esc, or fatal error). + * DSK loads desktop.elf after this returns. + */ + +#include "../UTSM/include/utsm/dsk.h" + +typedef signed char i8; +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned long long u64; +typedef long long i64; + +#define COM1 0x3F8 + +static __inline__ void outb(u16 port, u8 value) { __asm__ volatile("outb %0,%1"::"a"(value),"Nd"(port)); } +static __inline__ u8 inb(u16 port) { u8 v; __asm__ volatile("inb %1,%0":"=a"(v):"Nd"(port)); return v; } + +/* ---- TSC-based timing (PIT-calibrated) ---- */ +static u64 g_tsc_per_ms = 0; + +static __inline__ u64 rdtsc_fi(void) { + u32 lo, hi; + __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((u64)hi << 32) | lo; +} + +static void tsc_calibrate_fi(void) { + outb(0x43, 0x30); /* ch0, lo+hi, mode 0, binary */ + outb(0x40, 0x7c); /* 11932 low = ~10ms */ + outb(0x40, 0x2e); /* 11932 high */ + u64 tsc_start = rdtsc_fi(); + u16 prev = 0; u64 loops = 0; + for (;;) { + outb(0x43, 0x00); + u16 cur = (u16)inb(0x40) | ((u16)inb(0x40) << 8); + if (cur > prev && loops > 10) break; + prev = cur; loops++; + } + u64 tsc_end = rdtsc_fi(); + g_tsc_per_ms = (tsc_end - tsc_start) / 10; +} + +static void delay_ms_fi(u32 ms) { + if (!g_tsc_per_ms) { + for (volatile u32 i = 0; i < 100000 * ms; i++) __asm__ volatile("pause"); + return; + } + u64 target = g_tsc_per_ms * ms; + u64 start = rdtsc_fi(); + while (rdtsc_fi() - start < target) __asm__ volatile("pause"); +} + +static void delay_frame(void) { delay_ms_fi(33); } + +/* ---- Serial logging (COM1) ---- */ +static void sputc(char c) { + for (unsigned int i=0; i<100000; i++) { if (inb(COM1+5)&0x20) break; } + outb(COM1, (unsigned char)c); +} +static void swrite(const char *s) { while(*s) { if(*s=='\n')sputc('\r'); sputc(*s++); } } +static void logl(const char *s) { swrite(s); swrite("\n"); } + +/* ---- Colors (dark theme matching FirstInit) ---- */ +#define BG_TOP 0xFF2D2D30u +#define BG_BOTTOM 0xFF1A1A1Eu +#define CARD_BG 0xFF353539u +#define INPUT_BG 0xFF2A2A2Eu +#define TEXT_FG 0xFFE0E0E0u +#define ACCENT 0xFF5A8AC8u +#define ERROR_FG 0xFFE05050u +#define DIM_FG 0xFF808088u + +static u64 fb_a, fb_w, fb_h, fb_p; + +static u32 blend(u32 c1, u32 c2, u32 a) { + u32 na=256-a; + u32 r=((c1&0xFF)*na+(c2&0xFF)*a)>>8; + u32 g=(((c1>>8)&0xFF)*na+((c2>>8)&0xFF)*a)>>8; + u32 b=(((c1>>16)&0xFF)*na+((c2>>16)&0xFF)*a)>>8; + return 0xFF000000|(b<<16)|(g<<8)|r; +} + +/* ---- ASCII font (Consolas 18px grayscale) — shared from firstInit ---- */ +#include "../firstInit/ascii_bitmaps.c" +#define ASCII_W 11 +#define ASCII_H 18 +#define ASCII_STEP 11 + +static void fb_char(u32 *fb, u32 ch, i64 x, i64 y, u32 fg, u32 bg) { + if (ch < ' ' || ch > '~') ch = ' '; + u32 idx = (u32)(ch - ' '); + const u8 *g = g_ascii[idx]; + for (i64 r=0; r= fb_h) continue; + u32 *line = (u32 *)((u8 *)fb + (u64)yy * fb_p); + for (i64 c=0; c= fb_w) continue; + line[(u64)xx] = (a == 255) ? fg : blend(bg, fg, a); + } + } +} + +static void fb_text(u32 *fb, const char *s, i64 x, i64 y, u32 fg, u32 bg) { + for (i64 i=0; s[i]; i++) fb_char(fb, (u32)(u8)s[i], x+i*ASCII_STEP, y, fg, bg); +} + +static void fill_rect(u32 *fb, i64 x, i64 y, i64 w, i64 h, u32 color) { + for (i64 r=0; r= fb_h) continue; + u32 *line = (u32 *)((u8 *)fb + (u64)yy * fb_p); + for (i64 c=0; c= fb_w) continue; + line[(u64)xx] = color; + } + } +} + +static u32 bg_at_y(i64 y) { + if (fb_h <= 1) return BG_TOP; + if (y < 0) y = 0; + if ((u64)y >= fb_h) y = (i64)fb_h - 1; + return blend(BG_TOP, BG_BOTTOM, (u32)(((u64)y * 255ULL) / (fb_h - 1))); +} + +static void fill_gradient_rect(u32 *fb, i64 x, i64 y, i64 w, i64 h) { + for (i64 r=0; r= fb_h) continue; + u32 color = bg_at_y(yy); + u32 *line = (u32 *)((u8 *)fb + (u64)yy * fb_p); + for (i64 c=0; c= fb_w) continue; + line[(u64)xx] = color; + } + } +} + +static int rounded_rect_contains(i64 px, i64 py, i64 x, i64 y, i64 w, i64 h, i64 radius) { + if (px < x || py < y || px >= x + w || py >= y + h) return 0; + if (radius <= 0) return 1; + if (radius * 2 > w) radius = w / 2; + if (radius * 2 > h) radius = h / 2; + i64 left = x + radius; + i64 right = x + w - radius - 1; + i64 top = y + radius; + i64 bottom = y + h - radius - 1; + if (px >= left && px <= right) return 1; + if (py >= top && py <= bottom) return 1; + i64 cx = px < left ? left : right; + i64 cy = py < top ? top : bottom; + i64 dx = px - cx; + i64 dy = py - cy; + return dx * dx + dy * dy <= radius * radius; +} + +static void fill_rounded_rect(u32 *fb, i64 x, i64 y, i64 w, i64 h, i64 radius, u32 color) { + if (w <= 0 || h <= 0) return; + for (i64 r=0; r= fb_h) continue; + u32 *line = (u32 *)((u8 *)fb + (u64)yy * fb_p); + for (i64 c=0; c= fb_w) continue; + if (rounded_rect_contains(xx, yy, x, y, w, h, radius)) line[(u64)xx] = color; + } + } +} + +static void stroke_rounded_rect(u32 *fb, i64 x, i64 y, i64 w, i64 h, i64 radius, i64 thickness, u32 color) { + if (w <= 0 || h <= 0 || thickness <= 0) return; + for (i64 r=0; r= fb_h) continue; + u32 *line = (u32 *)((u8 *)fb + (u64)yy * fb_p); + for (i64 c=0; c= fb_w) continue; + int outer = rounded_rect_contains(xx, yy, x, y, w, h, radius); + int inner = rounded_rect_contains(xx, yy, x + thickness, y + thickness, w - thickness * 2, h - thickness * 2, radius - thickness); + if (outer && !inner) line[(u64)xx] = color; + } + } +} + +static void draw_card(u32 *fb, i64 x, i64 y, i64 w, i64 h, u32 card) { + fill_rounded_rect(fb, x, y, w, h, 4, card); +} + +static void draw_rounded_input(u32 *fb, i64 x, i64 y, i64 w, i64 h, const char *value, int mask, u32 fg, u32 card_bg, int active) { + (void)card_bg; + u32 fill = active ? 0xFF45454Au : INPUT_BG; + fill_rounded_rect(fb, x, y, w, h, 2, fill); + stroke_rounded_rect(fb, x, y, w, h, 2, 1, active ? 0xFF6C6C72 : 0xFF404044); + char out[80]; int i=0; + while(value[i] && i<76) { out[i] = mask ? '*' : value[i]; i++; } + out[i]=0; + if (out[0]) fb_text(fb, out, x+14, y+(h-ASCII_H)/2, fg, fill); + if (active) { + i64 cx2 = x + 14 + i * ASCII_STEP; + fill_rect(fb, cx2, y+10, 2, h-20, fg); + } +} + +/* ---- PS/2 scan code set 1 → ASCII ---- */ +static char scan_to_ascii(u8 sc, int shift) { + static const char normal[58] = { + 0, 27, '1','2','3','4','5','6','7','8','9','0','-','=', 8, '\t', + 'q','w','e','r','t','y','u','i','o','p','[',']','\n',0, + 'a','s','d','f','g','h','j','k','l',';','\'', '`',0,'\\', + 'z','x','c','v','b','n','m',',','.','/',0,'*',0,' ' + }; + static const char shifted[58] = { + 0, 27, '!','@','#','$','%','^','&','*','(',')','_','+', 8, '\t', + 'Q','W','E','R','T','Y','U','I','O','P','{','}','\n',0, + 'A','S','D','F','G','H','J','K','L',':','"','~',0,'|', + 'Z','X','C','V','B','N','M','<','>','?',0,'*',0,' ' + }; + if (sc >= 58) return 0; + return shift ? shifted[sc] : normal[sc]; +} + +/* ---- SHA-256 (compact, copied from FirstInit) ---- */ +#define ROR(x,n) (((x)>>(n))|((x)<<(32-(n)))) +static const u32 K256[64] = {0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2}; +static void sha256(const char *msg, u8 out[32]) { + u32 h[8]={0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19}; + u8 block[64]; u64 len=0; while(msg[len]) len++; + for(int i=0;i<64;i++) block[i]=0; + for(u64 i=0;i>(i*8)); + u32 w[64]; + for(int i=0;i<16;i++) w[i]=((u32)block[i*4]<<24)|((u32)block[i*4+1]<<16)|((u32)block[i*4+2]<<8)|block[i*4+3]; + for(int i=16;i<64;i++){u32 s0=ROR(w[i-15],7)^ROR(w[i-15],18)^(w[i-15]>>3);u32 s1=ROR(w[i-2],17)^ROR(w[i-2],19)^(w[i-2]>>10);w[i]=w[i-16]+s0+w[i-7]+s1;} + u32 a=h[0],b=h[1],c=h[2],d=h[3],e=h[4],f=h[5],g=h[6],hh=h[7]; + for(int i=0;i<64;i++){u32 S1=ROR(e,6)^ROR(e,11)^ROR(e,25);u32 ch=(e&f)^((~e)&g);u32 t1=hh+S1+ch+K256[i]+w[i];u32 S0=ROR(a,2)^ROR(a,13)^ROR(a,22);u32 maj=(a&b)^(a&c)^(b&c);u32 t2=S0+maj;hh=g;g=f;f=e;e=d+t1;d=c;c=b;b=a;a=t1+t2;} + h[0]+=a;h[1]+=b;h[2]+=c;h[3]+=d;h[4]+=e;h[5]+=f;h[6]+=g;h[7]+=hh; + for(int i=0;i<8;i++){out[i*4]=(u8)(h[i]>>24);out[i*4+1]=(u8)(h[i]>>16);out[i*4+2]=(u8)(h[i]>>8);out[i*4+3]=(u8)h[i];} +} + +/* ---- conf parsing ---- + * USER.CONF format (built by FirstInit's build_user_conf, but stored unencrypted + * on disk for login.elf to parse): + * DESHAB_USERCONF_V1 + * computer= + * username= + * passwordSha256=<64 hex chars> + * ... + * + * If the buffer does NOT start with "DESHAB_USERCONF_V1", it may be XOR-encrypted + * with the password hash stream. In that case, the user's entered password is + * used to decrypt: SHA256(password) → hash, then buf[i] ^= hash[i & 31]. + * If the decrypted buffer starts with the magic, the password is correct. + */ + +static int streq_n(const char *a, const char *b, u32 n) { + for (u32 i = 0; i < n; i++) { + if (a[i] != b[i]) return 0; + } + return 1; +} + +/* Find "key=" in buf, copy value (up to newline) into out (NUL-terminated). + * Returns 0 on success, -1 if key not found. */ +static int conf_get_value(const u8 *buf, u32 size, const char *key, char *out, u32 out_cap) { + u32 klen = 0; while (key[klen]) klen++; + for (u32 i = 0; i + klen + 1 < size; i++) { + /* Match key at start of line (or start of buffer) */ + if (i > 0 && buf[i-1] != '\n') continue; + if (buf[i + klen] != '=') continue; + if (!streq_n((const char *)buf + i, key, klen)) continue; + /* Found key=, copy value until newline or end */ + u32 vstart = i + klen + 1; + u32 j = 0; + while (vstart + j < size && buf[vstart + j] != '\n' && buf[vstart + j] != '\r' && j + 1 < out_cap) { + out[j] = (char)buf[vstart + j]; + j++; + } + out[j] = 0; + return 0; + } + return -1; +} + +static int starts_with(const u8 *buf, u32 size, const char *prefix) { + u32 i = 0; + while (prefix[i]) { + if (i >= size) return 0; + if (buf[i] != (u8)prefix[i]) return 0; + i++; + } + return 1; +} + +/* ---- hex string comparison ---- */ +static int hexeq(const u8 *hash32, const char *hex64) { + static const char hx[] = "0123456789abcdef"; + for (int i = 0; i < 32; i++) { + if (hex64[i*2] != hx[hash32[i] >> 4]) return 0; + if (hex64[i*2+1] != hx[hash32[i] & 0xf]) return 0; + } + return 1; +} + +/* ---- login state ---- */ +static char g_username[64]; +static char g_password_hash[80]; /* 64 hex chars + NUL */ +static int g_has_user; /* 1 if username extracted */ +static int g_has_hash; /* 1 if passwordSha256 extracted */ +static int g_is_encrypted; /* 1 if conf buffer is XOR-encrypted */ + +/* ---- UI layout ---- */ +#define CARD_W 560 +#define CARD_H 400 + +static void draw_login_card(u32 *fb, i64 card_x, i64 card_y, const char *pass, int active, + const char *msg, u32 msg_color, u32 fg) { + u32 card = CARD_BG; + u32 sub_fg = 0xFF9098A0; + /* Background + card */ + fill_gradient_rect(fb, card_x - 24, card_y - 24, CARD_W + 48, CARD_H + 48); + draw_card(fb, card_x, card_y, CARD_W, CARD_H, card); + /* Title */ + fb_text(fb, "Deshab Login", card_x + 40, card_y + 40, fg, card); + fb_text(fb, "Enter your password to continue", card_x + 40, card_y + 70, sub_fg, card); + /* Username field */ + fb_text(fb, "Username", card_x + 40, card_y + 120, sub_fg, card); + draw_rounded_input(fb, card_x + 40, card_y + 150, CARD_W - 80, 44, + g_has_user ? g_username : "(unknown)", 0, fg, card, 0); + /* Password field */ + fb_text(fb, "Password", card_x + 40, card_y + 210, sub_fg, card); + draw_rounded_input(fb, card_x + 40, card_y + 240, CARD_W - 80, 44, pass, 1, fg, card, active); + /* Login button */ + { + u32 btn_bg = ACCENT; + fill_rounded_rect(fb, card_x + 40, card_y + 310, 160, 44, 3, btn_bg); + fb_text(fb, "Login", card_x + 40 + 56, card_y + 310 + (44 - ASCII_H) / 2, + 0xFFFFFFFFu, btn_bg); + } + /* Status / error message */ + if (msg && msg[0]) { + fb_text(fb, msg, card_x + 220, card_y + 322, msg_color, card); + } + /* Bottom hint */ + fb_text(fb, "Enter=login Esc=skip Backspace=delete", + card_x + 40, card_y + CARD_H - 28, DIM_FG, card); +} + +/* Redraw only the password input field (avoids full card redraw on each keystroke) */ +static void redraw_password_only(u32 *fb, i64 card_x, i64 card_y, const char *pass, u32 fg) { + u32 card = CARD_BG; + i64 fy = card_y + 240; + fill_rect(fb, card_x + 40, fy, CARD_W - 80, 44, card); + draw_rounded_input(fb, card_x + 40, fy, CARD_W - 80, 44, pass, 1, fg, card, 1); +} + +/* ---- verify password against stored hash or encrypted conf ---- + * Returns 1 if password is correct, 0 otherwise. + * For encrypted conf: XOR-decrypt with SHA256(password); if magic matches, correct. + * For unencrypted conf: SHA256(password) == stored passwordSha256 hex string. + */ +static int verify_password(const u8 *conf_buf, u32 conf_size, const char *password) { + if (g_is_encrypted) { + /* Decrypt a copy and check magic */ + u8 hash[32]; + sha256(password, hash); + static u8 scratch[2048]; + u32 sz = conf_size; + if (sz > sizeof(scratch)) sz = sizeof(scratch); + for (u32 i = 0; i < sz; i++) scratch[i] = conf_buf[i] ^ hash[i & 31]; + if (starts_with(scratch, sz, "DESHAB_USERCONF_V1")) { + /* Also extract username from decrypted buffer for display */ + if (!g_has_user) { + conf_get_value(scratch, sz, "username", g_username, sizeof(g_username)); + if (g_username[0]) g_has_user = 1; + } + return 1; + } + return 0; + } else if (g_has_hash) { + u8 hash[32]; + sha256(password, hash); + return hexeq(hash, g_password_hash); + } + return 0; +} + +__attribute__((visibility("default"))) +void dsk_entry(const dsk_boot_context *ctx) { + __asm__ volatile("cli"); /* prevent IRQ1 (ps2kbd) from racing with our polling */ + logl("[login] boot"); + logl("[login] calibrating TSC"); + tsc_calibrate_fi(); + + if (!ctx || ctx->magic != 0x44534B31424F4F54ULL) { + logl("[login] bad context"); + return; + } + + fb_a = ctx->framebuffer_address; + fb_w = ctx->framebuffer_width; + fb_h = ctx->framebuffer_height; + fb_p = ctx->framebuffer_pitch; + + logl("[login] framebuffer ready"); + + /* Get conf data from boot context (passed by DSK) */ + const u8 *conf_buf = (const u8 *)(u64)ctx->reserved[0]; + u32 conf_size = (u32)ctx->reserved[1]; + if (!conf_buf || conf_size == 0) { + logl("[login] no conf data, cannot login"); + /* Mark as skipped (reserved[2]=0) and return */ + ((dsk_boot_context *)ctx)->reserved[2] = 0; + return; + } + logl("[login] conf data received"); + + /* Initialize state */ + g_username[0] = 0; + g_password_hash[0] = 0; + g_has_user = 0; + g_has_hash = 0; + g_is_encrypted = 0; + + /* Check if conf is unencrypted (starts with magic) or encrypted */ + if (starts_with(conf_buf, conf_size, "DESHAB_USERCONF_V1")) { + logl("[login] conf is plaintext, parsing"); + g_is_encrypted = 0; + if (conf_get_value(conf_buf, conf_size, "username", g_username, sizeof(g_username)) == 0) { + g_has_user = 1; + logl("[login] username found"); + } else { + logl("[login] username not found in conf"); + } + if (conf_get_value(conf_buf, conf_size, "passwordSha256", g_password_hash, sizeof(g_password_hash)) == 0) { + g_has_hash = 1; + logl("[login] password hash found"); + } else { + logl("[login] passwordSha256 not found in conf"); + } + } else { + logl("[login] conf appears encrypted, will verify by password decryption"); + g_is_encrypted = 1; + /* Username will be extracted after successful decryption */ + } + + u32 fg = TEXT_FG; + u32 *fb = (u32 *)(u64)fb_a; + + /* Fill background */ + fill_gradient_rect(fb, 0, 0, (i64)fb_w, (i64)fb_h); + + /* Card position (centered) */ + i64 card_x = ((i64)fb_w - CARD_W) / 2; + i64 card_y = ((i64)fb_h - CARD_H) / 2; + + /* Initial message */ + const char *msg = "Enter password and press Enter"; + u32 msg_color = DIM_FG; + + /* Password input buffer */ + char pass[64]; + pass[0] = 0; + int plen = 0; + + /* Draw initial UI */ + draw_login_card(fb, card_x, card_y, pass, 1, msg, msg_color, fg); + + /* Input loop */ + int shift = 0; + int release = 0; + for (;;) { + u8 st = inb(0x64); + if (!(st & 1)) { __asm__("pause"); continue; } + u8 data = inb(0x60); + /* Skip mouse data (bit 5 of status) */ + if (st & 0x20) continue; + + u8 sc = data; + /* Handle extended (E0) sequences — ignore (no arrow keys needed for login) */ + if (sc == 0xE0) { continue; } + /* Handle release (F0 in Set 2, or high bit in Set 1) */ + if (sc == 0xF0) { release = 1; continue; } + if (release) { release = 0; /* track shift release below */ } + + /* Shift press/release */ + if (sc == 0x2A || sc == 0x36) { shift = 1; continue; } + if (sc == 0xAA || sc == 0xB6) { shift = 0; continue; } + + /* Ignore high-bit (release in Set 1) */ + if (sc & 0x80) continue; + + /* Escape (sc 0x01) — skip login */ + if (sc == 0x01) { + logl("[login] Esc pressed, skipping login"); + ((dsk_boot_context *)ctx)->reserved[2] = 0; + return; + } + + char c = scan_to_ascii(sc, shift); + if (!c) continue; + + if (c == '\n') { + /* Submit password */ + if (plen == 0) { + /* Empty password — show hint, don't verify */ + msg = "Password is empty"; + msg_color = ERROR_FG; + draw_login_card(fb, card_x, card_y, pass, 1, msg, msg_color, fg); + continue; + } + logl("[login] verifying password"); + int ok = verify_password(conf_buf, conf_size, pass); + if (ok) { + logl("[login] password correct"); + ((dsk_boot_context *)ctx)->reserved[2] = 1; + /* Show success message briefly */ + draw_login_card(fb, card_x, card_y, pass, 0, + "Login successful", 0xFF5FAF6Fu, fg); + for (int i = 0; i < 30; i++) delay_frame(); + return; + } else { + logl("[login] password wrong"); + msg = "Wrong password, try again"; + msg_color = ERROR_FG; + /* Clear password */ + pass[0] = 0; + plen = 0; + draw_login_card(fb, card_x, card_y, pass, 1, msg, msg_color, fg); + continue; + } + } + + if (c == 8) { + /* Backspace */ + if (plen > 0) { + pass[--plen] = 0; + redraw_password_only(fb, card_x, card_y, pass, fg); + } + continue; + } + + /* Regular character */ + if (plen < 62 && c >= 32 && c <= 126) { + pass[plen++] = c; + pass[plen] = 0; + redraw_password_only(fb, card_x, card_y, pass, fg); + } + } +} diff --git a/CODE/mouse/linker.ld b/CODE/mouse/linker.ld index 825d5f1..473e5fc 100644 --- a/CODE/mouse/linker.ld +++ b/CODE/mouse/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(5); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(6); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/netman/linker.ld b/CODE/netman/linker.ld index 825d5f1..473e5fc 100644 --- a/CODE/netman/linker.ld +++ b/CODE/netman/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(5); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(6); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/netman/main.c b/CODE/netman/main.c index 63a4782..8e293ff 100644 --- a/CODE/netman/main.c +++ b/CODE/netman/main.c @@ -249,8 +249,48 @@ static u16 udp_checksum_ipv4(const u8 *ip, const u8 *udp, u32 udp_len) { return out ? out : 0xffff; } +/* ---- TSC-based timing (实机要求: 用 CPU 频率计算, 不用循环) ---- */ +static u64 g_tsc_per_ms = 0; + +static inline u64 rdtsc_nm(void) { + u32 lo, hi; + __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((u64)hi << 32) | lo; +} + +static void tsc_calibrate_nm(void) { + outb(0x43, 0x30); /* ch0, lo+hi, mode 0, binary */ + outb(0x40, 0x7c); /* 11932 low = ~10ms */ + outb(0x40, 0x2e); /* 11932 high */ + u64 tsc_start = rdtsc_nm(); + u16 prev = 0; u64 loops = 0; + for (;;) { + outb(0x43, 0x00); + u16 cur = (u16)inb(0x40) | ((u16)inb(0x40) << 8); + if (cur > prev && loops > 10) break; + prev = cur; loops++; + } + u64 tsc_end = rdtsc_nm(); + g_tsc_per_ms = (tsc_end - tsc_start) / 10; +} + +static void delay_ms_nm(u32 ms) { + if (!g_tsc_per_ms) { + for (volatile u32 i = 0; i < 100000 * ms; i++) __asm__ volatile("pause"); + return; + } + u64 target = g_tsc_per_ms * ms; + u64 start = rdtsc_nm(); + while (rdtsc_nm() - start < target) __asm__ volatile("pause"); +} + static void delay_spin(u32 loops) { - for (volatile u32 i=0;imagic != DSK_BOOT_MAGIC) { logl("[netman] bad context"); return; } + logl("[netman] calibrating TSC (实机 CPU 频率计算)"); + tsc_calibrate_nm(); u64 api = ctx->dkm_kernel_api; if (api) { u64 block_api = *(u64 *)(api + 0xA8); diff --git a/CODE/netman/main.o b/CODE/netman/main.o index 3c13803f2bfa4eda734956839f31e65a540a1abb..00e1e92ef7328ac33eba656bf32bc49beda85de5 100644 GIT binary patch literal 25736 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 ZZvvpFg$%wGwEucKVc70o_!H;vKLKQ13tj*K diff --git a/CODE/shell/linker.ld b/CODE/shell/linker.ld index 825d5f1..473e5fc 100644 --- a/CODE/shell/linker.ld +++ b/CODE/shell/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(5); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(6); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/shell/main.c b/CODE/shell/main.c index ed8a9da..ecada58 100644 --- a/CODE/shell/main.c +++ b/CODE/shell/main.c @@ -15,9 +15,55 @@ typedef long long i64; static __inline__ void outb(u16 port, u8 value) { __asm__ volatile("outb %0,%1"::"a"(value),"Nd"(port)); } static __inline__ u8 inb(u16 port) { u8 v; __asm__ volatile("inb %1,%0":"=a"(v):"Nd"(port)); return v; } +static __inline__ void outl(u16 port, u32 value) { __asm__ volatile("outl %0,%1"::"a"(value),"Nd"(port)); } +static __inline__ u32 inl(u16 port) { u32 v; __asm__ volatile("inl %1,%0":"=a"(v):"Nd"(port)); return v; } + +/* ---- TSC-based timing (实机要求: 用 CPU 频率计算, 不用循环) ---- */ +static u64 g_tsc_per_ms = 0; + +static __inline__ u64 rdtsc_shell(void) { + u32 lo, hi; + __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((u64)hi << 32) | lo; +} + +/* 通过 PIT ch0 (16-bit mode 0) 校准 TSC ~10ms 计数 */ +static void tsc_calibrate_shell(void) { + outb(0x43, 0x30); /* ch0, lo+hi, mode 0, binary */ + outb(0x40, 0x7c); /* 11932 low = ~10ms */ + outb(0x40, 0x2e); /* 11932 high */ + u64 tsc_start = rdtsc_shell(); + u16 prev = 0; u64 loops = 0; + for (;;) { + outb(0x43, 0x00); + u16 cur = (u16)inb(0x40) | ((u16)inb(0x40) << 8); + if (cur > prev && loops > 10) break; + prev = cur; loops++; + } + u64 tsc_end = rdtsc_shell(); + g_tsc_per_ms = (tsc_end - tsc_start) / 10; +} + +/* 串口发送等待: TSC 100us 超时, 校准失败时回退到循环 */ +static void serial_wait_tx_shell(void) { + if (g_tsc_per_ms == 0) { + tsc_calibrate_shell(); + } + if (g_tsc_per_ms == 0) { + for (u32 i = 0; i < 100000; i++) { + if (inb(COM1 + 5) & 0x20) break; + } + return; + } + u64 deadline = rdtsc_shell() + g_tsc_per_ms / 10; /* 100us 超时 */ + while (rdtsc_shell() < deadline) { + if (inb(COM1 + 5) & 0x20) break; + __asm__ volatile("pause"); + } +} static void sputc(char c) { - for (unsigned int i=0; i<100000; i++) { if (inb(COM1+5)&0x20) break; } + serial_wait_tx_shell(); outb(COM1, (unsigned char)c); } static void swrite(const char *s) { while(*s) { if(*s=='\n')sputc('\r'); sputc(*s++); } } @@ -26,6 +72,430 @@ static void logl(const char *s) { swrite(s); swrite("\n"); } /* ASCII 字体 — 必须在 deshab_ui.h 之前包含,因为 du_draw_char 引用 g_ascii */ #include "../firstInit/ascii_bitmaps.c" #include "../UTSM/include/utsm/deshab_ui.h" +/* 用户态共享协议栈(ping/curl 内建命令使用) */ +#include "../tools/net_stack.h" + +/* ============================================================ + * Block 设备 + FAT32 读写(移植自 DSK,支持 cp/mv/cat/ls) + * ============================================================ */ + +typedef int (*shell_block_read_fn)(u32 index, u64 lba, u32 count, void *buf); +typedef int (*shell_block_write_fn)(u32 index, u64 lba, u32 count, const void *buf); + +static shell_block_read_fn g_block_read; +static shell_block_write_fn g_block_write; + +/* FAT32 BPB / 目录项结构(与 DSK 一致,packed) */ +typedef struct __attribute__((packed)) { + u8 jmp[3]; char oem[8]; u16 bps; u8 spc; u16 rsvd; u8 fc; u16 root_ent; + u16 ts16; u8 media; u16 spf16; u16 spt; u16 heads; u32 hidden; u32 ts32; + u32 spf; u16 flags; u16 ver; u32 root_clus; u16 fsi; u16 bkboot; + u8 res[12]; u8 drv; u8 ntfl; u8 sig; u32 ser; char lbl[11]; char typ[8]; + u8 code[420]; u16 boot_sig; +} shell_fat32_bpb; + +typedef struct __attribute__((packed)) { + char name[11]; u8 attr; u8 ntr; u8 ctenth; + u16 ctime; u16 cdate; u16 adate; u16 chigh; + u16 wtime; u16 wdate; u16 clow; u32 fsize; +} shell_fat32_de; + +static u32 sh_r32(const u8 *p) { return (u32)p[0]|((u32)p[1]<<8)|((u32)p[2]<<16)|((u32)p[3]<<24); } +static u16 sh_r16(const u8 *p) { return (u16)p[0]|((u16)p[1]<<8); } +static int sh_neq11(const char *a, const char *b) { for(int i=0;i<11;i++) if(a[i]!=b[i]) return 0; return 1; } + +/* 批量读写缓冲区(与 DSK 对齐:256 扇区覆盖 BPB+FAT+根目录+小文件) */ +static u8 g_disk[131072]; /* 256 扇区 BPB+FAT+根目录缓存 */ +static u8 g_cluster[4096]; /* 单簇缓冲 */ +static u8 g_fdata[262144]; /* 文件数据缓冲(最大 256KB) */ +static int g_disk_loaded = 0; /* g_disk 是否已加载 BPB+FAT */ + +static int sh_read_sectors(u32 lba, u32 count, u8 *out) { return g_block_read ? g_block_read(0,lba,count,out) : -1; } +static int sh_write_sectors(u32 lba, u32 count, const u8 *buf) { return g_block_write ? g_block_write(0,lba,count,buf) : -1; } + +/* 确保 g_disk 已加载 BPB+FAT+根目录(256 扇区) */ +static int sh_disk_load(void) { + if (g_disk_loaded) return 0; + if (sh_read_sectors(0, 256, g_disk) != 0) return -1; + const shell_fat32_bpb *bpb = (const shell_fat32_bpb *)g_disk; + if (bpb->boot_sig != 0xAA55 || bpb->bps != 512) return -2; + if (bpb->spf == 0 || bpb->root_clus < 2) return -3; + g_disk_loaded = 1; + return 0; +} + +/* 把 "file.txt" / "NAME" 转为 11 字符 8.3 名(大写,空格填充) + * 返回 0 成功,-1 失败(过长或非法字符) */ +static int name_to_83(const char *in, char out[11]) { + for (int i = 0; i < 11; i++) out[i] = ' '; + int inlen = 0; + while (in[inlen] && inlen < 13) inlen++; + if (inlen == 0 || inlen > 12) return -1; + int dot = -1; + for (int i = 0; i < inlen; i++) if (in[i] == '.') dot = i; + int base_end = (dot >= 0) ? dot : inlen; + if (base_end == 0 || base_end > 8) return -1; + for (int j = 0; j < base_end; j++) { + char c = in[j]; + if (c >= 'a' && c <= 'z') c -= 32; + if (c == '.' || c == ' ' || c == '/' || c == '\\') return -1; + out[j] = c; + } + if (dot >= 0) { + int extlen = inlen - dot - 1; + if (extlen > 3) return -1; + for (int j = 0; j < extlen; j++) { + char c = in[dot + 1 + j]; + if (c >= 'a' && c <= 'z') c -= 32; + if (c == '.' || c == ' ' || c == '/' || c == '\\') return -1; + out[8 + j] = c; + } + } + return 0; +} + +/* 把 11 字符 8.3 名转为可显示字符串(如 "README.TXT") */ +static void name_from_83(const char in[11], char out[13]) { + int p = 0; + for (int j = 0; j < 8; j++) { + if (in[j] == ' ') break; + out[p++] = in[j]; + } + if (in[8] != ' ') { + out[p++] = '.'; + for (int j = 8; j < 11; j++) { + if (in[j] == ' ') break; + out[p++] = in[j]; + } + } + out[p] = 0; +} + +/* 在根目录簇链中查找 11 字符名,输出首簇号与文件大小 */ +static int fat32_find_in_root(const u8 *clus, u32 clus_sectors, const char *target, + u32 *out_clus, u32 *out_size, u32 *out_idx) { + const shell_fat32_de *dir = (const shell_fat32_de *)clus; + for (u32 e = 0; e * 32 < clus_sectors * 512; e++) { + if (dir[e].name[0] == 0) break; + if ((u8)dir[e].name[0] == 0xE5) continue; + if (dir[e].attr == 0x0F) continue; + if (dir[e].attr & 0x08) continue; + if (sh_neq11(dir[e].name, target)) { + *out_clus = (u32)sh_r16((const u8*)&dir[e].clow) | ((u32)sh_r16((const u8*)&dir[e].chigh) << 16); + *out_size = dir[e].fsize; + if (out_idx) *out_idx = e; + return 0; + } + } + return -1; +} + +/* 读取根目录下指定 8.3 名文件到 g_fdata。 + * 返回 0 成功,*out_data 指向 g_fdata,*out_size 为字节数;非 0 失败。 */ +static int fat32_read_root_file(const char *name11, u8 **out_data, u32 *out_size) { + if (sh_disk_load() != 0) return -1; + const shell_fat32_bpb *bpb = (const shell_fat32_bpb *)g_disk; + u32 data_lba = bpb->rsvd + (u32)bpb->fc * bpb->spf; + u32 fat_byte_off = bpb->rsvd * 512; + u32 spc = bpb->spc; + + u32 clus = bpb->root_clus; + u32 found_clus = 0, found_size = 0; + int found = 0; + while (clus >= 2 && clus < 0x0FFFFFF8 && !found) { + u32 lba = data_lba + (clus - 2) * spc; + const u8 *cb; + if ((u64)lba * 512 + (u64)spc * 512 <= 256ULL * 512) + cb = g_disk + (u64)lba * 512; + else { + if (sh_read_sectors(lba, 8, g_cluster) != 0) return -4; + cb = g_cluster; + } + if (fat32_find_in_root(cb, spc, name11, &found_clus, &found_size, 0) == 0) { found = 1; break; } + u32 fo = fat_byte_off + clus * 4; + if (fo + 4 > sizeof(g_disk)) break; + clus = sh_r32(g_disk + fo) & 0x0FFFFFFF; + } + if (!found) return -5; + if (found_size > sizeof(g_fdata)) return -6; + + u8 *dst = g_fdata; u32 remaining = found_size; u32 fc = found_clus; + while (fc >= 2 && fc < 0x0FFFFFF8 && remaining > 0) { + u32 fc_lba = data_lba + (fc - 2) * spc; + u32 fc_bytes = spc * 512; + if (fc_bytes > remaining) fc_bytes = remaining; + const u8 *fb; + if ((u64)fc_lba * 512 + (u64)spc * 512 <= 256ULL * 512) + fb = g_disk + (u64)fc_lba * 512; + else { + if (sh_read_sectors(fc_lba, 8, g_cluster) != 0) return -7; + fb = g_cluster; + } + for (u32 b = 0; b < fc_bytes; b++) dst[b] = fb[b]; + dst += fc_bytes; remaining -= fc_bytes; + u32 fo = fat_byte_off + fc * 4; + if (fo + 4 > sizeof(g_disk)) break; + fc = sh_r32(g_disk + fo) & 0x0FFFFFFF; + } + *out_data = g_fdata; *out_size = found_size; + return 0; +} + +/* 写入根目录下指定 8.3 名文件(存在则替换,不存在则新建)。 + * 依赖 g_disk 已加载 BPB+FAT。返回 0 成功。 */ +static int fat32_write_root_file(const char *name11, const u8 *data, u32 size) { + if (sh_disk_load() != 0) return -1; + /* 写入前重新加载 BPB+FAT,保证与盘上一致 */ + if (sh_read_sectors(0, 256, g_disk) != 0) return -2; + const shell_fat32_bpb *bpb = (const shell_fat32_bpb *)g_disk; + u32 spc = bpb->spc; + u32 fat_lba = bpb->rsvd; + u32 fat_sectors = bpb->spf; + u32 data_lba = bpb->rsvd + (u32)bpb->fc * bpb->spf; + u32 fat_byte_off = bpb->rsvd * 512; + u32 root_clus = bpb->root_clus; + u32 cluster_bytes = spc * 512; + + u32 root_lba = data_lba + (root_clus - 2) * spc; + u8 *root_buf = g_disk + (u64)root_lba * 512; + u32 max_entries = cluster_bytes / 32; + shell_fat32_de *dir = (shell_fat32_de *)root_buf; + int free_entry = -1; + u32 existing_clus = 0; + int found = 0; + u32 existing_idx = 0; + for (u32 e = 0; e < max_entries; e++) { + if (dir[e].name[0] == 0) { if (free_entry < 0) free_entry = (int)e; break; } + if ((u8)dir[e].name[0] == 0xE5) { if (free_entry < 0) free_entry = (int)e; continue; } + if (dir[e].attr == 0x0F) continue; + if (dir[e].attr & 0x08) continue; + if (sh_neq11(dir[e].name, name11)) { + existing_clus = (u32)sh_r16((const u8*)&dir[e].clow) | ((u32)sh_r16((const u8*)&dir[e].chigh) << 16); + found = 1; existing_idx = e; + if (free_entry < 0) free_entry = (int)e; + break; + } + } + + u32 bytes_needed = size > 0 ? size : 1; + u32 clusters_needed = (bytes_needed + cluster_bytes - 1) / cluster_bytes; + u32 first_clus = 0; + u32 prev_clus = 0; + + if (found && existing_clus >= 2) { + first_clus = existing_clus; + u32 cur = existing_clus; + u32 count = 0; + while (cur >= 2 && cur < 0x0FFFFFF8 && count < clusters_needed) { + prev_clus = cur; + u32 fo = fat_byte_off + cur * 4; + if (fo + 4 > sizeof(g_disk)) break; + cur = sh_r32(g_disk + fo) & 0x0FFFFFFF; + count++; + } + while (count < clusters_needed) { + u32 newc = 0; + for (u32 c = 2; c < (fat_sectors * 512) / 4; c++) { + u32 fo = fat_byte_off + c * 4; + if (fo + 4 > sizeof(g_disk)) break; + if ((sh_r32(g_disk + fo) & 0x0FFFFFFF) == 0) { newc = c; break; } + } + if (newc == 0) return -3; + u32 pfo = fat_byte_off + prev_clus * 4; + if (pfo + 4 <= sizeof(g_disk)) { + g_disk[pfo] = (u8)(newc & 0xFF); + g_disk[pfo+1] = (u8)((newc >> 8) & 0xFF); + g_disk[pfo+2] = (u8)((newc >> 16) & 0xFF); + g_disk[pfo+3] = (u8)((newc >> 24) & 0x0F); + } + prev_clus = newc; + count++; + } + if (prev_clus >= 2) { + u32 fo = fat_byte_off + prev_clus * 4; + if (fo + 4 <= sizeof(g_disk)) { + g_disk[fo] = 0xF8; g_disk[fo+1] = 0xFF; g_disk[fo+2] = 0xFF; g_disk[fo+3] = 0x0F; + } + } + /* 释放多余旧簇 */ + u32 next = 0; + u32 fo = fat_byte_off + prev_clus * 4; + if (fo + 4 <= sizeof(g_disk)) next = sh_r32(g_disk + fo) & 0x0FFFFFFF; + while (next >= 2 && next < 0x0FFFFFF8) { + u32 nfo = fat_byte_off + next * 4; + u32 nn = 0; + if (nfo + 4 <= sizeof(g_disk)) nn = sh_r32(g_disk + nfo) & 0x0FFFFFFF; + g_disk[nfo] = 0; g_disk[nfo+1] = 0; g_disk[nfo+2] = 0; g_disk[nfo+3] = 0; + next = nn; + } + } else { + if (free_entry < 0) return -4; + for (u32 i = 0; i < clusters_needed; i++) { + u32 newc = 0; + for (u32 c = 2; c < (fat_sectors * 512) / 4; c++) { + u32 fo = fat_byte_off + c * 4; + if (fo + 4 > sizeof(g_disk)) break; + if ((sh_r32(g_disk + fo) & 0x0FFFFFFF) == 0) { newc = c; break; } + } + if (newc == 0) return -3; + if (i == 0) first_clus = newc; + if (prev_clus >= 2) { + u32 pfo = fat_byte_off + prev_clus * 4; + g_disk[pfo] = (u8)(newc & 0xFF); + g_disk[pfo+1] = (u8)((newc >> 8) & 0xFF); + g_disk[pfo+2] = (u8)((newc >> 16) & 0xFF); + g_disk[pfo+3] = (u8)((newc >> 24) & 0x0F); + } + prev_clus = newc; + } + if (prev_clus >= 2) { + u32 fo = fat_byte_off + prev_clus * 4; + g_disk[fo] = 0xF8; g_disk[fo+1] = 0xFF; g_disk[fo+2] = 0xFF; g_disk[fo+3] = 0x0F; + } + } + + /* 写数据到簇 */ + u32 remaining = size; + const u8 *src = data; + u32 cur = first_clus; + u32 ci = 0; + while (cur >= 2 && cur < 0x0FFFFFF8 && ci < clusters_needed) { + u32 clba = data_lba + (cur - 2) * spc; + u32 chunk = remaining < cluster_bytes ? remaining : cluster_bytes; + if ((u64)clba * 512 + cluster_bytes <= 256ULL * 512) { + u8 *dst = g_disk + (u64)clba * 512; + for (u32 b = 0; b < chunk; b++) dst[b] = src[b]; + for (u32 b = chunk; b < cluster_bytes; b++) dst[b] = 0; + } else { + if (sh_read_sectors(clba, spc, g_cluster) != 0) return -5; + for (u32 b = 0; b < chunk; b++) g_cluster[b] = src[b]; + for (u32 b = chunk; b < cluster_bytes; b++) g_cluster[b] = 0; + if (sh_write_sectors(clba, spc, g_cluster) != 0) return -6; + } + src += chunk; remaining -= chunk; ci++; + u32 fo = fat_byte_off + cur * 4; + if (fo + 4 > sizeof(g_disk)) break; + cur = sh_r32(g_disk + fo) & 0x0FFFFFFF; + } + + /* 更新目录项 */ + u32 entry_idx = found ? existing_idx : (u32)free_entry; + shell_fat32_de *e = &dir[entry_idx]; + if (!found) { + for (int i = 0; i < 11; i++) e->name[i] = name11[i]; + e->attr = 0x20; e->ntr = 0; e->ctenth = 0; e->ctime = 0; e->cdate = 0; e->adate = 0; + } + e->chigh = (u16)((first_clus >> 16) & 0xFFFF); + e->clow = (u16)(first_clus & 0xFFFF); + e->fsize = size; + + /* 回写 FAT(两份)+ 根目录 + 缓冲区内的数据簇 */ + for (u32 f = 0; f < bpb->fc; f++) { + u32 flba = fat_lba + f * fat_sectors; + if (sh_write_sectors(flba, fat_sectors, g_disk + (u64)flba * 512) != 0) return -7; + } + u32 root_dir_lba = data_lba + (root_clus - 2) * spc; + if ((u64)root_dir_lba * 512 + cluster_bytes <= 256ULL * 512) { + if (sh_write_sectors(root_dir_lba, spc, g_disk + (u64)root_dir_lba * 512) != 0) return -8; + } + cur = first_clus; ci = 0; + while (cur >= 2 && cur < 0x0FFFFFF8 && ci < clusters_needed) { + u32 clba = data_lba + (cur - 2) * spc; + if ((u64)clba * 512 + cluster_bytes <= 256ULL * 512) { + if (sh_write_sectors(clba, spc, g_disk + (u64)clba * 512) != 0) return -9; + } + u32 fo = fat_byte_off + cur * 4; + if (fo + 4 > sizeof(g_disk)) break; + cur = sh_r32(g_disk + fo) & 0x0FFFFFFF; + ci++; + } + g_disk_loaded = 0; /* 下次操作重新加载,避免使用脏缓存 */ + return 0; +} + +/* 删除根目录下指定 8.3 名文件:清空簇链 + 标记目录项为 0xE5。 + * 返回 0 成功,-1 未找到,其他负值失败。 */ +static int fat32_delete_root_file(const char *name11) { + if (sh_disk_load() != 0) return -2; + if (sh_read_sectors(0, 256, g_disk) != 0) return -3; + const shell_fat32_bpb *bpb = (const shell_fat32_bpb *)g_disk; + u32 spc = bpb->spc; + u32 fat_lba = bpb->rsvd; + u32 fat_sectors = bpb->spf; + u32 data_lba = bpb->rsvd + (u32)bpb->fc * bpb->spf; + u32 fat_byte_off = bpb->rsvd * 512; + u32 root_clus = bpb->root_clus; + + u32 root_lba = data_lba + (root_clus - 2) * spc; + u8 *root_buf = g_disk + (u64)root_lba * 512; + u32 max_entries = (spc * 512) / 32; + shell_fat32_de *dir = (shell_fat32_de *)root_buf; + u32 found_idx = 0xFFFFFFFFu; + for (u32 e = 0; e < max_entries; e++) { + if (dir[e].name[0] == 0) break; + if ((u8)dir[e].name[0] == 0xE5) continue; + if (dir[e].attr == 0x0F) continue; + if (dir[e].attr & 0x08) continue; + if (sh_neq11(dir[e].name, name11)) { found_idx = e; break; } + } + if (found_idx == 0xFFFFFFFFu) return -1; + + /* 释放簇链 */ + u32 cur = (u32)sh_r16((const u8*)&dir[found_idx].clow) | ((u32)sh_r16((const u8*)&dir[found_idx].chigh) << 16); + while (cur >= 2 && cur < 0x0FFFFFF8) { + u32 fo = fat_byte_off + cur * 4; + u32 next = 0; + if (fo + 4 <= sizeof(g_disk)) next = sh_r32(g_disk + fo) & 0x0FFFFFFF; + g_disk[fo] = 0; g_disk[fo+1] = 0; g_disk[fo+2] = 0; g_disk[fo+3] = 0; + cur = next; + } + /* 标记目录项为已删除 */ + dir[found_idx].name[0] = (char)0xE5; + + /* 回写 FAT + 根目录 */ + for (u32 f = 0; f < bpb->fc; f++) { + u32 flba = fat_lba + f * fat_sectors; + if (sh_write_sectors(flba, fat_sectors, g_disk + (u64)flba * 512) != 0) return -4; + } + if (sh_write_sectors(root_lba, spc, g_disk + (u64)root_lba * 512) != 0) return -5; + g_disk_loaded = 0; + return 0; +} + +/* 列出根目录所有文件/目录,调用回调输出 */ +static int fat32_list_root(int (*emit)(const char *name, u32 size, u8 attr, void *u), void *u) { + if (sh_disk_load() != 0) return -1; + const shell_fat32_bpb *bpb = (const shell_fat32_bpb *)g_disk; + u32 data_lba = bpb->rsvd + (u32)bpb->fc * bpb->spf; + u32 fat_byte_off = bpb->rsvd * 512; + u32 spc = bpb->spc; + u32 clus = bpb->root_clus; + while (clus >= 2 && clus < 0x0FFFFFF8) { + u32 lba = data_lba + (clus - 2) * spc; + const u8 *cb; + if ((u64)lba * 512 + (u64)spc * 512 <= 256ULL * 512) + cb = g_disk + (u64)lba * 512; + else { + if (sh_read_sectors(lba, 8, g_cluster) != 0) return -4; + cb = g_cluster; + } + const shell_fat32_de *dir = (const shell_fat32_de *)cb; + for (u32 e = 0; e * 32 < spc * 512; e++) { + if (dir[e].name[0] == 0) goto done; + if ((u8)dir[e].name[0] == 0xE5) continue; + if (dir[e].attr == 0x0F) continue; + if (dir[e].attr & 0x08) continue; + char disp[13]; + name_from_83(dir[e].name, disp); + if (emit(disp, dir[e].fsize, dir[e].attr, u) != 0) goto done; + } + u32 fo = fat_byte_off + clus * 4; + if (fo + 4 > sizeof(g_disk)) break; + clus = sh_r32(g_disk + fo) & 0x0FFFFFFF; + } +done: + return 0; +} /* ---- 风格令牌(引用 deshab_ui.h 语义色) ---- */ #define BG_COLOR DS_DARK_BG_PRIMARY @@ -114,7 +584,11 @@ static void term_newline(void) { if (cur_row >= term_h) term_scroll(); } +/* dev_mode 串口镜像:reserved[3]=1 时终端输出同步写 COM1,便于自动化验证 */ +static int g_serial_mirror = 0; + static void term_putc_color(char c, u32 color) { + if (g_serial_mirror) { if (c == '\n') sputc('\r'); sputc(c); } if (c == '\n') { term_newline(); return; } if (c == '\r') { cur_col = 0; return; } if (c == '\t') { @@ -220,6 +694,74 @@ static char input_buf[256]; static int input_len = 0; static int input_cursor = 0; +/* ---- 命令历史(上下箭头浏览) ---- */ +/* 前向声明: redraw_input_line 在下方定义 */ +static void redraw_input_line(void); + +#define HISTORY_MAX 32 +static char g_history[HISTORY_MAX][256]; +static int g_history_count = 0; /* 已记录命令条数 (0..HISTORY_MAX) */ +static int g_history_view = -1; /* 当前浏览索引, -1 表示正在编辑新输入 */ + +/* 将命令推入历史。空字符串或纯空白不入历史;与最近一条相同时跳过。 */ +static void history_push(const char *cmd) { + const char *p = cmd; + while (*p == ' ') p++; + if (*p == 0) return; + /* 与最近一条相同则跳过 */ + if (g_history_count > 0) { + const char *latest = g_history[(g_history_count - 1) % HISTORY_MAX]; + const char *a = latest; + const char *b = p; + while (*a && *b && *a == *b) { a++; b++; } + if (*a == 0 && *b == 0) return; + } + int idx = g_history_count % HISTORY_MAX; + int i = 0; + while (p[i] && i < 255) { g_history[idx][i] = p[i]; i++; } + g_history[idx][i] = 0; + if (g_history_count < HISTORY_MAX) g_history_count++; +} + +/* 加载历史条目到 input_buf 并刷新显示 */ +static void history_load(int idx) { + const char *src = g_history[idx % HISTORY_MAX]; + int i = 0; + while (src[i] && i < 255) { input_buf[i] = src[i]; i++; } + input_buf[i] = 0; + input_len = i; + input_cursor = i; + redraw_input_line(); +} + +/* 上箭头: 浏览更早的命令 */ +static void history_prev(void) { + if (g_history_count == 0) return; + if (g_history_view == -1) { + g_history_view = g_history_count - 1; + } else if (g_history_view > 0) { + g_history_view--; + } else { + return; /* 已到达最早一条 */ + } + history_load(g_history_view); +} + +/* 下箭头: 浏览更新的命令; 超过最新则回到空输入 */ +static void history_next(void) { + if (g_history_view == -1) return; + g_history_view++; + if (g_history_view >= g_history_count) { + g_history_view = -1; + input_len = 0; + input_cursor = 0; + input_buf[0] = 0; + redraw_input_line(); + return; + } + history_load(g_history_view); +} + /* ---- 键盘扫描码 → ASCII(Set 1) ---- */ static char scan_to_ascii(u8 sc, int shift) { static const char normal[58] = { @@ -248,16 +790,25 @@ static void cmd_help(void) { term_puts_color("Deshab Shell — 内置命令列表:\n", PROMPT_FG); term_puts(" help 显示此帮助\n"); term_puts(" clear 清屏\n"); - term_puts(" echo 显示文本\n"); - term_puts(" version 显示系统版本\n"); + term_puts(" echo 显示文本(-n 不换行, > file 重定向写盘)\n"); + term_puts(" ls / dir 列出根目录文件\n"); + term_puts(" cat 显示文件内容\n"); + term_puts(" cp 复制文件\n"); + term_puts(" mv 移动/重命名文件\n"); + term_puts(" rm 删除文件\n"); + term_puts(" pwd 显示当前目录\n"); + term_puts(" whoami 显示当前用户\n"); + term_puts(" id 显示用户ID\n"); + term_puts(" version/ver 显示系统版本\n"); term_puts(" uname 显示系统名称\n"); term_puts(" date 显示当前日期\n"); - term_puts(" ver 显示内核版本(同 version)\n"); term_puts(" about 关于 Deshab\n"); + term_puts(" pci 列出 PCI 设备\n"); + term_puts(" ping [ip] ICMP echo 测试(缺省网关 10.0.2.2)\n"); + term_puts(" curl HTTP GET 请求(http://host[:port]/path)\n"); + term_puts(" run 运行根目录下的工具程序\n"); term_puts(" reboot 重启系统\n"); term_puts(" halt 关机(停止 CPU)\n"); - term_puts(" ls 列出根目录文件(暂未实现,需要 VFS)\n"); - term_puts(" pci 列出 PCI 设备(暂未实现)\n"); } static void cmd_version(void) { @@ -301,9 +852,45 @@ static void cmd_halt(void) { for(;;) __asm__("hlt"); } +/* echo:支持 -n(不换行)和 " > file" 重定向写盘 */ static void cmd_echo(const char *args) { + int newline = 1; + if (args && args[0] == '-' && args[1] == 'n' && (args[2] == ' ' || args[2] == 0)) { + newline = 0; + args += 2; + while (*args == ' ') args++; + } + /* 检测 " > file" 重定向 */ + const char *redir = 0; + if (args) { + const char *p = args; + while (*p) { if (*p == '>') { redir = p; break; } p++; } + } + if (redir) { + int text_len = (int)(redir - args); + while (text_len > 0 && args[text_len-1] == ' ') text_len--; + const char *fname = redir + 1; + while (*fname == ' ') fname++; + char fnbuf[64]; int fl = 0; + while (*fname && *fname != ' ' && fl < 63) fnbuf[fl++] = *fname++; + fnbuf[fl] = 0; + if (fl == 0) { term_puts_color("echo: 重定向缺少文件名\n", ERROR_FG); return; } + char n83[11]; + if (name_to_83(fnbuf, n83) != 0) { term_puts_color("echo: 无效文件名\n", ERROR_FG); return; } + static char echo_buf[4096]; + int el = 0; + for (int i = 0; i < text_len && el < 4095; i++) echo_buf[el++] = args[i]; + if (newline) echo_buf[el++] = '\n'; + if (!g_block_write) { term_puts_color("echo: 无块设备写能力\n", ERROR_FG); return; } + int rc = fat32_write_root_file(n83, (const u8 *)echo_buf, (u32)el); + if (rc != 0) { term_puts_color("echo: 写入失败\n", ERROR_FG); return; } + term_puts_color("echo: 已写入 ", OK_FG); + term_puts_color(fnbuf, OK_FG); + term_putc('\n'); + return; + } if (args && *args) term_puts_color(args, TEXT_FG); - term_putc('\n'); + if (newline) term_putc('\n'); } static u8 read_rtc_reg(u8 reg); @@ -347,6 +934,598 @@ static void cmd_not_impl(const char *cmd) { term_puts_color(": 此命令尚未实现\n", ERROR_FG); } +/* ============================================================ + * 文件命令:ls / cat / cp / mv / rm(FAT32 根目录) + * ============================================================ */ + +/* 从 args 解析一个空白分隔 token 到 out(最多 max-1 字符),返回剩余 args 指针 */ +static const char *parse_token(const char *args, char *out, int max) { + int n = 0; + while (*args == ' ') args++; + while (*args && *args != ' ' && n < max - 1) out[n++] = *args++; + out[n] = 0; + return args; +} + +/* u32 → 十进制字符串 */ +static void u32_to_dec(char *buf, u32 v) { + char tmp[12]; int n = 0; + if (v == 0) { buf[0] = '0'; buf[1] = 0; return; } + while (v && n < 11) { tmp[n++] = (char)('0' + v % 10); v /= 10; } + for (int i = 0; i < n; i++) buf[i] = tmp[n - 1 - i]; + buf[n] = 0; +} + +/* ls 回调:每行打印一个条目 */ +static int ls_emit(const char *name, u32 size, u8 attr, void *u) { + (void)u; + if (attr & 0x10) term_puts_color("[DIR] ", ACCENT_FG); + else term_puts_color(" ", TEXT_FG); + term_puts_color(name, TEXT_FG); + /* 名字对齐填充 */ + int nl = 0; while (name[nl]) nl++; + for (int i = nl; i < 14; i++) term_putc(' '); + if (!(attr & 0x10)) { + char sz[12]; u32_to_dec(sz, size); + term_puts_color(sz, DIM_FG); + term_puts_color(" B", DIM_FG); + } + term_putc('\n'); + return 0; +} + +static void cmd_ls(void) { + if (!g_block_read) { term_puts_color("ls: 无块设备\n", ERROR_FG); return; } + if (fat32_list_root(ls_emit, 0) != 0) { + term_puts_color("ls: 读取根目录失败\n", ERROR_FG); + } +} + +static void cmd_cat(const char *args) { + if (!g_block_read) { term_puts_color("cat: 无块设备\n", ERROR_FG); return; } + char fn[64]; + parse_token(args, fn, 64); + if (fn[0] == 0) { term_puts_color("用法: cat <文件>\n", ERROR_FG); return; } + char n83[11]; + if (name_to_83(fn, n83) != 0) { term_puts_color("cat: 无效文件名\n", ERROR_FG); return; } + u8 *data = 0; u32 size = 0; + if (fat32_read_root_file(n83, &data, &size) != 0) { + term_puts_color("cat: 文件不存在\n", ERROR_FG); + return; + } + for (u32 i = 0; i < size; i++) term_putc((char)data[i]); +} + +static void cmd_cp(const char *args) { + if (!g_block_read || !g_block_write) { term_puts_color("cp: 需要块设备读写能力\n", ERROR_FG); return; } + char src[64], dst[64]; + args = parse_token(args, src, 64); + parse_token(args, dst, 64); + if (src[0] == 0 || dst[0] == 0) { + term_puts_color("用法: cp <源文件> <目标文件>\n", ERROR_FG); + return; + } + char s83[11], d83[11]; + if (name_to_83(src, s83) != 0) { term_puts_color("cp: 无效源文件名\n", ERROR_FG); return; } + if (name_to_83(dst, d83) != 0) { term_puts_color("cp: 无效目标文件名\n", ERROR_FG); return; } + u8 *data = 0; u32 size = 0; + if (fat32_read_root_file(s83, &data, &size) != 0) { + term_puts_color("cp: 源文件不存在或读取失败\n", ERROR_FG); + return; + } + if (fat32_write_root_file(d83, data, size) != 0) { + term_puts_color("cp: 写入目标失败\n", ERROR_FG); + return; + } + term_puts_color("cp: ", OK_FG); + term_puts_color(src, OK_FG); + term_puts_color(" -> ", OK_FG); + term_puts_color(dst, OK_FG); + term_puts_color(" (", DIM_FG); + char sz[12]; u32_to_dec(sz, size); + term_puts_color(sz, DIM_FG); + term_puts_color(" bytes)\n", DIM_FG); +} + +static void cmd_mv(const char *args) { + if (!g_block_read || !g_block_write) { term_puts_color("mv: 需要块设备读写能力\n", ERROR_FG); return; } + char src[64], dst[64]; + args = parse_token(args, src, 64); + parse_token(args, dst, 64); + if (src[0] == 0 || dst[0] == 0) { + term_puts_color("用法: mv <源文件> <目标文件>\n", ERROR_FG); + return; + } + char s83[11], d83[11]; + if (name_to_83(src, s83) != 0) { term_puts_color("mv: 无效源文件名\n", ERROR_FG); return; } + if (name_to_83(dst, d83) != 0) { term_puts_color("mv: 无效目标文件名\n", ERROR_FG); return; } + u8 *data = 0; u32 size = 0; + if (fat32_read_root_file(s83, &data, &size) != 0) { + term_puts_color("mv: 源文件不存在或读取失败\n", ERROR_FG); + return; + } + if (fat32_write_root_file(d83, data, size) != 0) { + term_puts_color("mv: 写入目标失败\n", ERROR_FG); + return; + } + /* 写入后 g_disk 缓存已失效,delete 会重新加载 BPB+FAT */ + if (fat32_delete_root_file(s83) != 0) { + term_puts_color("mv: 警告 — 源文件删除失败,目标已写入\n", DP_WARNING); + return; + } + term_puts_color("mv: ", OK_FG); + term_puts_color(src, OK_FG); + term_puts_color(" -> ", OK_FG); + term_puts_color(dst, OK_FG); + term_putc('\n'); +} + +static void cmd_rm(const char *args) { + if (!g_block_write) { term_puts_color("rm: 需要块设备写能力\n", ERROR_FG); return; } + char fn[64]; + parse_token(args, fn, 64); + if (fn[0] == 0) { term_puts_color("用法: rm <文件>\n", ERROR_FG); return; } + char n83[11]; + if (name_to_83(fn, n83) != 0) { term_puts_color("rm: 无效文件名\n", ERROR_FG); return; } + int rc = fat32_delete_root_file(n83); + if (rc == -1) { term_puts_color("rm: 文件不存在\n", ERROR_FG); return; } + if (rc != 0) { term_puts_color("rm: 删除失败\n", ERROR_FG); return; } + term_puts_color("rm: 已删除 ", OK_FG); + term_puts_color(fn, OK_FG); + term_putc('\n'); +} + +/* ---- PCI 设备列表 ---- */ +static u32 pci_config_read(u8 bus, u8 dev, u8 func, u8 reg) { + u32 addr = 0x80000000u | ((u32)bus << 16) | ((u32)dev << 11) + | ((u32)func << 8) | ((u32)reg & 0xFCu); + outl(0xCF8, addr); + return inl(0xCFC); +} + +static void hex_nibble(char *buf, u8 v) { + v = (u8)(v & 0x0F); + buf[0] = (char)(v < 10 ? '0' + v : 'A' + (v - 10)); +} + +static void u8_to_hex(char *buf, u8 v) { + hex_nibble(buf, (u8)(v >> 4)); + hex_nibble(buf + 1, v); + buf[2] = 0; +} + +static void u16_to_hex(char *buf, u16 v) { + hex_nibble(buf, (u8)(v >> 12)); + hex_nibble(buf+1, (u8)(v >> 8)); + hex_nibble(buf+2, (u8)(v >> 4)); + hex_nibble(buf+3, v); + buf[4] = 0; +} + +static void u8_to_dec(char *buf, u8 v) { + if (v >= 100) { + buf[0] = (char)('0' + v / 100); + buf[1] = (char)('0' + (v / 10) % 10); + buf[2] = (char)('0' + v % 10); + buf[3] = 0; + } else if (v >= 10) { + buf[0] = (char)('0' + v / 10); + buf[1] = (char)('0' + v % 10); + buf[2] = 0; + } else { + buf[0] = (char)('0' + v); + buf[1] = 0; + } +} + +static const char *pci_vendor_name(u16 vendor) { + switch (vendor) { + case 0x8086: return "Intel"; + case 0x1234: return "Bochs/QEMU"; + case 0x1AF4: return "Virtio"; + case 0x168C: return "Atheros"; + case 0x10DE: return "NVIDIA"; + case 0x1002: return "AMD"; + case 0x10EC: return "Realtek"; + case 0x14E4: return "Broadcom"; + case 0x1B36: return "Red Hat"; + case 0x1022: return "AMD-x86"; + case 0x106B: return "Apple"; + default: return ""; + } +} + +static const char *pci_class_name(u8 class_code) { + switch (class_code) { + case 0x00: return "Unclassified"; + case 0x01: return "Mass storage"; + case 0x02: return "Network"; + case 0x03: return "Display"; + case 0x04: return "Multimedia"; + case 0x05: return "Memory"; + case 0x06: return "Bridge"; + case 0x07: return "Comm"; + case 0x08: return "Sys peripheral"; + case 0x09: return "Input"; + case 0x0C: return "Serial bus"; + case 0x0D: return "Wireless"; + case 0x10: return "Encryption"; + case 0x11: return "Signal proc"; + case 0x40: return "Coprocessor"; + default: return "Other"; + } +} + +static void cmd_pci(void) { + int count = 0; + term_puts_color("PCI 设备列表:\n", PROMPT_FG); + for (u8 bus = 0; bus < 1; bus++) { + for (u8 dev = 0; dev < 32; dev++) { + u32 vd = pci_config_read(bus, dev, 0, 0x00); + if ((vd & 0xFFFFu) == 0xFFFFu) continue; + u32 hdr_class = pci_config_read(bus, dev, 0, 0x0C); + u8 header_type = (u8)((hdr_class >> 16) & 0xFF); + u8 func_count = (u8)((header_type & 0x80) ? 8 : 1); + for (u8 func = 0; func < func_count; func++) { + u32 vdf = pci_config_read(bus, dev, func, 0x00); + u16 vendor = (u16)(vdf & 0xFFFFu); + u16 device = (u16)(vdf >> 16); + if (vendor == 0xFFFFu) continue; + u32 cls = pci_config_read(bus, dev, func, 0x08); + u8 rev = (u8)(cls & 0xFF); + u8 prog_if = (u8)((cls >> 8) & 0xFF); + u8 subclass = (u8)((cls >> 16) & 0xFF); + u8 class_code = (u8)((cls >> 24) & 0xFF); + + char line[80]; + int p = 0; + /* "00:00.0 " */ + u8_to_hex(line + p, bus); p += 2; + line[p++] = ':'; + u8_to_hex(line + p, dev); p += 2; + line[p++] = '.'; + u8_to_hex(line + p, func); p += 2; + line[p++] = ' '; + /* "VEN:DEV " */ + u16_to_hex(line + p, vendor); p += 4; + line[p++] = ':'; + u16_to_hex(line + p, device); p += 4; + line[p++] = ' '; + /* "rev NN " */ + line[p++] = 'r'; line[p++] = 'e'; line[p++] = 'v'; + line[p++] = ' '; + u8_to_hex(line + p, rev); p += 2; + line[p++] = ' '; + /* "class CC:SS:PP" */ + line[p++] = 'c'; line[p++] = 'l'; line[p++] = 'a'; + line[p++] = 's'; line[p++] = 's'; line[p++] = ' '; + u8_to_hex(line + p, class_code); p += 2; + line[p++] = ':'; + u8_to_hex(line + p, subclass); p += 2; + line[p++] = ':'; + u8_to_hex(line + p, prog_if); p += 2; + line[p++] = ' '; + line[p++] = '['; + const char *cn = pci_class_name(class_code); + while (*cn) line[p++] = *cn++; + line[p++] = ']'; + const char *vn = pci_vendor_name(vendor); + if (*vn) { + line[p++] = ' '; + while (*vn) line[p++] = *vn++; + } + line[p] = 0; + term_puts(line); + term_putc('\n'); + count++; + } + } + } + char tail[32]; + int q = 0; + const char *prefix = "Total: "; + while (prefix[q]) { tail[q] = prefix[q]; q++; } + u8_to_dec(tail + q, (u8)(count > 255 ? 255 : count)); + while (tail[q]) q++; + const char *suffix = " device(s)\n"; + int s = 0; + while (suffix[s]) { tail[q++] = suffix[s++]; } + tail[q] = 0; + term_puts_color(tail, DIM_FG); +} + +/* ============================================================ + * 网络命令:ping / curl(共享协议栈 net_stack.h) + * ============================================================ */ + +static u64 g_kernel_api = 0; +static const dsk_boot_context *g_boot_ctx = 0; +static int g_ns_status = 0; /* 0=未尝试, 1=就绪, <0=初始化失败 */ + +static int shell_net_ready(void) { + if (g_ns_status == 1) return 1; + if (g_ns_status < 0) return 0; + int rc = ns_init(g_kernel_api); + g_ns_status = (rc == 0) ? 1 : -1; + if (rc != 0) { + logl("[shell] ns_init failed"); + term_puts_color("网络初始化失败 (rc=", ERROR_FG); + char rcbuf[4]; + rcbuf[0] = (char)('0' + (-rc % 10)); + rcbuf[1] = 0; + term_puts_color(rcbuf, ERROR_FG); + term_puts_color("),无可用网卡或 net API\n", ERROR_FG); + return 0; + } + logl("[shell] ns_init ok"); + return 1; +} + +/* ping [a.b.c.d] — 缺省网关 10.0.2.2,4 次 echo */ +static void cmd_ping(const char *args) { + u32 ip; + if (!args || !*args) { + ip = NS_GATEWAY_IP; + } else if (ns_parse_ip(args, &ip) != 0) { + term_puts_color("用法: ping [a.b.c.d]\n", ERROR_FG); + return; + } + if (!shell_net_ready()) return; + + char ipstr[24]; + ns_fmt_ip(ip, ipstr); + term_puts_color("PING ", PROMPT_FG); + term_puts_color(ipstr, ACCENT_FG); + term_puts_color(" 32 data bytes\n", DIM_FG); + + int sent = 0, recv = 0; + u32 sum = 0, min = 0xFFFFFFFFu, max = 0; + for (u16 seq = 1; seq <= 4; seq++) { + u32 rtt = 0; u8 ttl = 0; + int rc = ns_ping(ip, seq, 2000, &rtt, &ttl); + sent++; + if (rc == 0) { + recv++; + sum += rtt; + if (rtt < min) min = rtt; + if (rtt > max) max = rtt; + term_puts("reply from "); + term_puts(ipstr); + term_puts(": bytes=32 time="); + char nb[12]; ns_u32_dec(nb, rtt); + term_puts(nb); + term_puts("ms TTL="); + ns_u32_dec(nb, ttl); + term_puts(nb); + term_putc('\n'); + } else if (rc == -1) { + term_puts_color("ARP 解析失败,目标不可达\n", ERROR_FG); + break; + } else { + term_puts_color("request timed out\n", DIM_FG); + } + } + /* 统计行 */ + char nb[12]; + ns_u32_dec(nb, (u32)sent); + term_puts_color("--- ", DIM_FG); + term_puts_color(ipstr, DIM_FG); + term_puts_color(" ping statistics ---\n ", DIM_FG); + term_puts(nb); + term_puts(" transmitted, "); + ns_u32_dec(nb, (u32)recv); + term_puts(nb); + term_puts(" received, "); + u32 loss = sent ? (u32)(sent - recv) * 100 / (u32)sent : 100; + ns_u32_dec(nb, loss); + term_puts(nb); + term_puts("% loss"); + if (recv > 0) { + term_puts(", min/avg/max = "); + ns_u32_dec(nb, min); term_puts(nb); term_puts("/"); + ns_u32_dec(nb, sum / (u32)recv); term_puts(nb); term_puts("/"); + ns_u32_dec(nb, max); term_puts(nb); term_puts(" ms"); + } + term_putc('\n'); +} + +/* curl http://host[:port][/path] — HTTP/1.0 GET,打印 status + body */ +static void cmd_curl(const char *args) { + if (!args || !*args) { + term_puts_color("用法: curl http://host[:port][/path]\n", ERROR_FG); + return; + } + if (!shell_net_ready()) return; + + const char *p = args; + if (p[0]=='h'&&p[1]=='t'&&p[2]=='t'&&p[3]=='p'&&p[4]==':'&&p[5]=='/'&&p[6]=='/') p += 7; + + char host[128]; int hl = 0; + while (*p && *p != ':' && *p != '/' && hl < 127) host[hl++] = *p++; + host[hl] = 0; + if (!hl) { term_puts_color("curl: 缺少主机名\n", ERROR_FG); return; } + + u16 port = 80; + if (*p == ':') { + p++; + u32 pv = 0; int digits = 0; + while (*p >= '0' && *p <= '9') { pv = pv * 10 + (u32)(*p - '0'); p++; digits++; } + if (digits && pv <= 65535) port = (u16)pv; + } + char path[128]; int pl = 0; + if (*p == '/') { + while (*p && *p != ' ' && pl < 127) path[pl++] = *p++; + } + if (!pl) { path[0] = '/'; pl = 1; } + path[pl] = 0; + + /* 解析主机 */ + u32 ip; + term_puts_color("-> 解析 ", DIM_FG); + term_puts_color(host, DIM_FG); + term_puts_color("...\n", DIM_FG); + if (ns_dns_resolve(host, &ip) != 0) { + term_puts_color("curl: DNS 解析失败\n", ERROR_FG); + return; + } + char ipstr[24]; ns_fmt_ip(ip, ipstr); + term_puts_color("-> ", DIM_FG); + term_puts_color(ipstr, DIM_FG); + term_putc('\n'); + + /* 连接 */ + term_puts_color("-> TCP 连接...\n", DIM_FG); + if (ns_tcp_connect(ip, port, 2000) != 0) { + term_puts_color("curl: TCP 连接失败(超时/RST)\n", ERROR_FG); + return; + } + term_puts_color("-> 已连接,发送请求\n", DIM_FG); + + /* 构造 HTTP/1.0 请求 */ + static char req[512]; + int r = 0; + const char *m = "GET "; while (*m) req[r++] = *m++; + for (int i = 0; i < pl; i++) req[r++] = path[i]; + m = " HTTP/1.0\r\nHost: "; while (*m) req[r++] = *m++; + for (int i = 0; i < hl; i++) req[r++] = host[i]; + m = "\r\nConnection: close\r\n\r\n"; while (*m) req[r++] = *m++; + req[r] = 0; + + if (ns_tcp_send((const u8 *)req, (u32)r) != 0) { + term_puts_color("curl: 发送失败\n", ERROR_FG); + ns_tcp_close(); + return; + } + + /* 收至 FIN(数据在协议栈 ns_tcp_rx 中累计) */ + int n = ns_tcp_recv(0, 0, 5000); + ns_tcp_close(); + if (n < 0) { + term_puts_color("curl: 连接被重置\n", ERROR_FG); + return; + } + if (n == 0) { + term_puts_color("curl: 无响应数据(超时)\n", ERROR_FG); + return; + } + + /* 打印状态行 + body(截断提示) */ + u32 total = ns_tcp_rx_len; + u32 show = (u32)n; + for (u32 i = 0; i < show; i++) term_putc((char)ns_tcp_rx[i]); + if (total > show) { + term_puts_color("\n[... 已截断,共 ", DIM_FG); + char nb[12]; ns_u32_dec(nb, total); + term_puts_color(nb, DIM_FG); + term_puts_color(" 字节]\n", DIM_FG); + } + term_putc('\n'); +} + +/* ============================================================ + * run 命令:从 FAT32 根目录加载并跳转 PIE ELF 工具 + * ============================================================ */ + +#define SH_ELFCLASS64 2 +#define SH_EM_X86_64 62 +#define SH_PT_LOAD 1 +#define SH_PT_DYNAMIC 2 +#define SH_DT_RELA 7 +#define SH_DT_RELASZ 8 +#define SH_DT_RELAENT 9 +#define SH_R_X86_64_RELATIVE 8 + +typedef struct { u8 ident[16]; u16 type,machine; u32 ver; u64 entry,phoff,shoff; u32 flags; u16 ehsize,phentsize,phnum,shentsize,shnum,shstrndx; } sh_elf64_ehdr; +typedef struct { u32 type,flags; u64 offset,vaddr,paddr,filesz,memsz,align; } sh_elf64_phdr; +typedef struct { i64 tag; u64 val; } sh_elf64_dyn; +typedef struct { u64 offset; u64 info; i64 addend; } sh_elf64_rela; + +/* run 加载镜像缓冲(容纳工具 ELF 展开后的 memsz) */ +static u8 g_run_image[262144]; + +static int sh_load_elf(u8 *data, void **entry_out) { + const sh_elf64_ehdr *eh = (const sh_elf64_ehdr *)data; + if (eh->ident[0] != 0x7F || eh->ident[4] != SH_ELFCLASS64) return -1; + if (eh->machine != SH_EM_X86_64) return -2; + u64 min_vaddr = ~0ULL, max_vaddr = 0; + u32 lc = 0; + for (u16 i = 0; i < eh->phnum; i++) { + const sh_elf64_phdr *ph = (const sh_elf64_phdr *)(data + eh->phoff + (u64)i * eh->phentsize); + if (ph->type != SH_PT_LOAD) continue; + if (ph->filesz > ph->memsz) return -3; + if (ph->vaddr < min_vaddr) min_vaddr = ph->vaddr; + if (ph->vaddr + ph->memsz > max_vaddr) max_vaddr = ph->vaddr + ph->memsz; + lc++; + } + if (!lc || min_vaddr == ~0ULL) return -4; + u64 isize = (max_vaddr - min_vaddr + 0xFFF) & ~0xFFFULL; + if (isize > sizeof(g_run_image)) return -5; + u8 *image = g_run_image; + for (u64 i = 0; i < isize; i++) image[i] = 0; + for (u16 i = 0; i < eh->phnum; i++) { + const sh_elf64_phdr *ph = (const sh_elf64_phdr *)(data + eh->phoff + (u64)i * eh->phentsize); + if (ph->type != SH_PT_LOAD) continue; + u64 off = ph->vaddr - min_vaddr; + for (u64 b = 0; b < ph->filesz; b++) image[off + b] = data[ph->offset + b]; + } + *entry_out = image + (eh->entry - min_vaddr); + + /* R_X86_64_RELATIVE 重定位 */ + u64 load_bias = (u64)image - min_vaddr; + for (u16 i = 0; i < eh->phnum; i++) { + const sh_elf64_phdr *ph = (const sh_elf64_phdr *)(data + eh->phoff + (u64)i * eh->phentsize); + if (ph->type != SH_PT_DYNAMIC) continue; + const sh_elf64_dyn *dyn = (const sh_elf64_dyn *)(image + (ph->vaddr - min_vaddr)); + u64 rela_off = 0, rela_sz = 0, rela_ent = 24; + for (; dyn->tag != 0; dyn++) { + if (dyn->tag == SH_DT_RELA) rela_off = dyn->val; + else if (dyn->tag == SH_DT_RELASZ) rela_sz = dyn->val; + else if (dyn->tag == SH_DT_RELAENT) rela_ent = dyn->val; + } + if (rela_off && rela_sz) { + u64 cnt = rela_sz / rela_ent; + for (u64 rr = 0; rr < cnt; rr++) { + const sh_elf64_rela *rel = (const sh_elf64_rela *)(image + (rela_off - min_vaddr) + rr * rela_ent); + if ((u32)(rel->info & 0xFFFFFFFF) == SH_R_X86_64_RELATIVE) { + u64 *slot = (u64 *)(image + (rel->offset - min_vaddr)); + *slot = load_bias + (u64)rel->addend; + } + } + } + } + return 0; +} + +/* run NAME.ELF — 加载根目录工具,全屏执行,返回后重绘 shell */ +static void cmd_run(const char *args) { + if (!g_block_read) { term_puts_color("run: 无块设备\n", ERROR_FG); return; } + char fn[64]; + parse_token(args, fn, 64); + if (fn[0] == 0) { term_puts_color("用法: run \n", ERROR_FG); return; } + char n83[11]; + if (name_to_83(fn, n83) != 0) { term_puts_color("run: 无效文件名\n", ERROR_FG); return; } + u8 *data = 0; u32 size = 0; + if (fat32_read_root_file(n83, &data, &size) != 0) { + term_puts_color("run: 文件不存在: ", ERROR_FG); + term_puts_color(fn, ERROR_FG); + term_putc('\n'); + return; + } + void *entry = 0; + int rc = sh_load_elf(data, &entry); + if (rc != 0) { + term_puts_color("run: ELF 加载失败(无效格式或过大)\n", ERROR_FG); + return; + } + logl("[shell] run: jumping to tool"); + void (*fn_entry)(const dsk_boot_context *) = (void (*)(const dsk_boot_context *))entry; + fn_entry(g_boot_ctx); + logl("[shell] run: tool returned"); + /* 工具可能改动磁盘/显示状态:失效 FAT 缓存并重绘 */ + g_disk_loaded = 0; + term_redraw_all(); +} + static void execute_command(const char *cmd) { while (*cmd == ' ') cmd++; if (*cmd == 0) return; @@ -367,9 +1546,15 @@ static void execute_command(const char *cmd) { else if (str_eq(name, "halt") || str_eq(name, "shutdown")) cmd_halt(); else if (str_eq(name, "echo")) cmd_echo(args); else if (str_eq(name, "date") || str_eq(name, "time")) cmd_date(); - else if (str_eq(name, "ls") || str_eq(name, "dir")) cmd_not_impl("ls"); - else if (str_eq(name, "pci")) cmd_not_impl("pci"); - else if (str_eq(name, "cat")) cmd_not_impl("cat"); + else if (str_eq(name, "ls") || str_eq(name, "dir")) cmd_ls(); + else if (str_eq(name, "pci")) cmd_pci(); + else if (str_eq(name, "cat")) cmd_cat(args); + else if (str_eq(name, "cp")) cmd_cp(args); + else if (str_eq(name, "mv")) cmd_mv(args); + else if (str_eq(name, "rm") || str_eq(name, "del")) cmd_rm(args); + else if (str_eq(name, "ping")) cmd_ping(args); + else if (str_eq(name, "curl")) cmd_curl(args); + else if (str_eq(name, "run")) cmd_run(args); else if (str_eq(name, "cd")) cmd_not_impl("cd"); else if (str_eq(name, "pwd")) { term_puts("/\n"); } else if (str_eq(name, "whoami")) { term_puts("root\n"); } @@ -497,6 +1682,54 @@ static void kill_line(void) { redraw_input_line(); } +/* 开发者模式:自动测试命令序列(ls/echo>/cat/cp/mv/rm) + * 由 DSK 在 firstInit.txt 第二行=1 时触发,reserved[3]=1 */ +static void run_dev_tests(void) { + term_puts_color("=== 开发者模式:自动测试命令 ===\n", PROMPT_FG); + term_putc('\n'); + + term_puts_color("[1] ls — 列出根目录\n", ACCENT_FG); + cmd_ls(); + term_putc('\n'); + + term_puts_color("[2] echo \"Deshab dev test\" > TEST.TXT\n", ACCENT_FG); + cmd_echo("Deshab dev test > TEST.TXT"); + + term_puts_color("[3] cat TEST.TXT — 读回验证\n", ACCENT_FG); + cmd_cat("TEST.TXT"); + term_putc('\n'); + + term_puts_color("[4] cp TEST.TXT COPY.TXT\n", ACCENT_FG); + cmd_cp("TEST.TXT COPY.TXT"); + + term_puts_color("[5] ls — 确认复制\n", ACCENT_FG); + cmd_ls(); + term_putc('\n'); + + term_puts_color("[6] mv COPY.TXT MOVED.TXT\n", ACCENT_FG); + cmd_mv("COPY.TXT MOVED.TXT"); + + term_puts_color("[7] ls — 确认移动\n", ACCENT_FG); + cmd_ls(); + term_putc('\n'); + + term_puts_color("[8] rm TEST.TXT\n", ACCENT_FG); + cmd_rm("TEST.TXT"); + term_puts_color("[9] rm MOVED.TXT — 清理\n", ACCENT_FG); + cmd_rm("MOVED.TXT"); + + term_puts_color("[10] ls — 确认清理\n", ACCENT_FG); + cmd_ls(); + + term_puts_color("[11] ping 10.0.2.2 — 网络回归(失败不阻断)\n", ACCENT_FG); + cmd_ping("10.0.2.2"); + + term_putc('\n'); + term_puts_color("=== 自动测试完成 ===\n", OK_FG); + term_puts_color("按 Esc 返回 DSK,或继续输入命令\n", DIM_FG); + term_putc('\n'); +} + /* ---- 主入口 ---- */ __attribute__((visibility("default"))) void dsk_entry(const dsk_boot_context *ctx) { @@ -513,6 +1746,20 @@ void dsk_entry(const dsk_boot_context *ctx) { fb_h = ctx->framebuffer_height; fb_p = ctx->framebuffer_pitch; + /* 保存 boot 上下文(网络协议栈/run 命令使用) */ + g_kernel_api = ctx->dkm_kernel_api; + g_boot_ctx = ctx; + + /* 获取 block 设备 read/write(从 kernel_api + 0xA8 → block_api → +16/+24) */ + { + u64 api = ctx->dkm_kernel_api; + u64 blk = *(u64 *)(api + 0xA8); + g_block_read = blk ? (shell_block_read_fn)*(u64 *)(blk + 16) : 0; + g_block_write = blk ? (shell_block_write_fn)*(u64 *)(blk + 24) : 0; + } + if (g_block_read) logl("[shell] block_read ok"); + if (g_block_write) logl("[shell] block_write ok"); + /* 初始化风格系统渲染上下文 */ du_context_init(&g_ctx, fb_a, fb_w, fb_h, fb_p); @@ -522,10 +1769,19 @@ void dsk_entry(const dsk_boot_context *ctx) { /* 启动 banner — 使用风格令牌 */ term_puts_color("=== Deshab OS v0.1.0 ===\n", ACCENT_FG); - term_puts_color("欢迎使用 Deshab Shell\n", OK_FG); + if (ctx->reserved[3] == 1) + term_puts_color("开发者模式 (自动测试命令)\n", OK_FG); + else + term_puts_color("欢迎使用 Deshab Shell\n", OK_FG); term_puts_color("输入 'help' 查看可用命令\n", DIM_FG); term_putc('\n'); + /* 开发者模式:DSK 设 reserved[3]=1 时自动跑命令测试序列 */ + if (ctx->reserved[3] == 1) { + g_serial_mirror = 1; + run_dev_tests(); + } + /* 主循环 */ int shift = 0; int e0 = 0; @@ -567,21 +1823,27 @@ void dsk_entry(const dsk_boot_context *ctx) { else if (sc == 0x47) cursor_home(); else if (sc == 0x4F) cursor_end(); else if (sc == 0x53) delete_char_fwd(); - else if (sc == 0x48) { } - else if (sc == 0x50) { } + else if (sc == 0x48) { history_prev(); } + else if (sc == 0x50) { history_next(); } e0 = 0; continue; } if (sc == 0x1C) { term_clear_cursor(); input_buf[input_len] = 0; + /* 提交命令前先入历史; 执行后再清空输入 */ + history_push(input_buf); + g_history_view = -1; term_putc('\n'); execute_command(input_buf); + input_len = 0; + input_cursor = 0; + input_buf[0] = 0; cmd_done = 1; continue; } if (sc == 0x0E) { delete_char_back(); continue; } - if (sc == 0x01) { kill_line(); continue; } + if (sc == 0x01) { logl("[shell] esc -> return to DSK"); return; } if (sc == 0x15 && !shift) { kill_line(); continue; } if (sc == 0x17 && !shift) { while (input_cursor > 0) delete_char_back(); continue; } if (sc == 0x0B && !shift) { kill_to_end(); continue; } diff --git a/CODE/shell/main.o b/CODE/shell/main.o index 7b43b8c08ae928f08ddf15d0fcb45b2ec75cf11e..aa4542f4bc41d232b74b69c39e8f37b91c7f1265 100644 GIT binary patch literal 130256 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 N^UUA*WIZ^3{vXwLgJb{z diff --git a/CODE/tools/bash/linker.ld b/CODE/tools/bash/linker.ld deleted file mode 100644 index 94dddf7..0000000 --- a/CODE/tools/bash/linker.ld +++ /dev/null @@ -1,16 +0,0 @@ -ENTRY(dsk_entry) - -PHDRS -{ - text PT_LOAD FLAGS(7); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(7); -} - -SECTIONS -{ - . = 0x1000; - .text : ALIGN(4K) { *(.text*) } :text - .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data -} diff --git a/CODE/tools/bash/main.c b/CODE/tools/bash/main.c deleted file mode 100644 index 790ee6c..0000000 --- a/CODE/tools/bash/main.c +++ /dev/null @@ -1,456 +0,0 @@ -/* Deshab Bash — 全屏终端应用 - * PS/2 键盘输入,命令行编辑,内置命令。 - * Esc 键退出返回 DSK。 - */ - -#include "../../firstInit/ascii_bitmaps.c" -#include "../desktop_app.h" - -/* ---- 终端参数 ---- */ -#define TERM_COLS 120 -#define TERM_ROWS 40 -#define TERM_MAX_CHARS (TERM_COLS * TERM_ROWS) -#define CHAR_STEP 12 -#define CHAR_H 18 -#define PROMPT_STR "deshab# " - -static da_app_context g_ac; - -/* 终端缓冲区 */ -static u8 term_ch[TERM_MAX_CHARS]; -static u32 term_fg[TERM_MAX_CHARS]; -static int term_w = TERM_COLS; -static int term_h = TERM_ROWS; -static int cur_col = 0; -static int cur_row = 0; - -/* 输入缓冲 */ -static char input_buf[256]; -static int input_len = 0; -static int input_cursor = 0; - -/* 命令历史 */ -#define HIST_SIZE 16 -static char history[HIST_SIZE][256]; -static int hist_count = 0; -static int hist_idx = 0; - -/* 坐标 */ -static int term_x, term_y; -static int content_h; - -static void term_init_layout(void) { - term_x = 8; - term_y = DA_TITLEBAR_H + 4; - int avail_w = (int)g_ac.fb_w - 16; - int avail_h = (int)g_ac.fb_h - term_y - DA_STATUSBAR_H - 8; - term_w = avail_w / CHAR_STEP; - term_h = avail_h / CHAR_H; - if (term_w < 10) term_w = 10; - if (term_h < 5) term_h = 5; - if (term_w > TERM_COLS) term_w = TERM_COLS; - if (term_h > TERM_ROWS) term_h = TERM_ROWS; - content_h = term_h * CHAR_H; -} - -static void term_clear(void) { - for (int i = 0; i < TERM_MAX_CHARS; i++) { - term_ch[i] = ' '; - term_fg[i] = DA_TEXT_PRIMARY; - } - cur_col = 0; cur_row = 0; -} - -static void term_scroll(void) { - for (int r = 1; r < term_h; r++) { - for (int c = 0; c < term_w; c++) { - term_ch[(r-1)*TERM_COLS+c] = term_ch[r*TERM_COLS+c]; - term_fg[(r-1)*TERM_COLS+c] = term_fg[r*TERM_COLS+c]; - } - } - for (int c = 0; c < term_w; c++) { - term_ch[(term_h-1)*TERM_COLS+c] = ' '; - term_fg[(term_h-1)*TERM_COLS+c] = DA_TEXT_PRIMARY; - } - cur_row = term_h - 1; cur_col = 0; -} - -static void term_newline(void) { - cur_col = 0; cur_row++; - if (cur_row >= term_h) term_scroll(); -} - -static void term_putc_color(char c, u32 color) { - if (c == '\n') { term_newline(); return; } - if (c == '\r') { cur_col = 0; return; } - if (c == '\t') { int sp = 4 - (cur_col % 4); for (int i = 0; i < sp; i++) term_putc_color(' ', color); return; } - if (c < ' ' || c > '~') c = '?'; - if (cur_col >= term_w) term_newline(); - int idx = cur_row * TERM_COLS + cur_col; - term_ch[idx] = (u8)c; term_fg[idx] = color; - cur_col++; -} - -static void term_putc(char c) { term_putc_color(c, DA_TEXT_PRIMARY); } -static void term_puts_color(const char *s, u32 color) { while (*s) term_putc_color(*s++, color); } -static void term_puts(const char *s) { term_puts_color(s, DA_TEXT_PRIMARY); } - -/* ---- 绘制 ---- */ -static void redraw_all(void) { - da_fill_bg(&g_ac, DA_BG_PRIMARY); - da_draw_titlebar(&g_ac, "Deshab Bash", (i64)g_ac.fb_w); - /* 终端字符 */ - for (int r = 0; r < term_h; r++) { - for (int c = 0; c < term_w; c++) { - int idx = r * TERM_COLS + c; - if (term_ch[idx] == ' ') continue; - da_draw_char(&g_ac, term_ch[idx], - term_x + c * CHAR_STEP, term_y + r * CHAR_H, - term_fg[idx], DA_BG_PRIMARY); - } - } - /* 光标 */ - if (cur_col < term_w && cur_row < term_h) { - da_fill_rect(&g_ac, term_x + cur_col * CHAR_STEP, - term_y + cur_row * CHAR_H + CHAR_H - 3, 11, 2, DA_ACCENT); - } - /* 状态栏 */ - char status[64]; - int p = 0; - const char *s1 = "/ root@deshab "; - while (*s1) status[p++] = *s1++; - u8 hh, mm; da_rtc_time(&hh, &mm); - status[p++] = '0' + hh/10; status[p++] = '0' + hh%10; - status[p++] = ':'; status[p++] = '0' + mm/10; status[p++] = '0' + mm%10; - status[p] = 0; - da_draw_statusbar(&g_ac, status, (i64)g_ac.fb_w, (i64)g_ac.fb_h); -} - -/* ---- 内置命令 ---- */ -static int str_eq(const char *a, const char *b) { - while (*a && *b) { if (*a != *b) return 0; a++; b++; } - return *a == *b; -} - -static void cmd_help(void) { - term_puts_color("Deshab Bash - 内置命令:\n", DA_PROMPT_COLOR); - term_puts(" help 显示此帮助\n"); - term_puts(" clear 清屏\n"); - term_puts(" echo 显示文本\n"); - term_puts(" version 显示系统版本\n"); - term_puts(" ver 同 version\n"); - term_puts(" uname 显示系统名称\n"); - term_puts(" date 显示当前日期时间\n"); - term_puts(" about 关于 Deshab\n"); - term_puts(" reboot 重启系统\n"); - term_puts(" halt 关机\n"); - term_puts(" pwd 显示当前目录\n"); - term_puts(" whoami 显示当前用户\n"); - term_puts(" id 显示用户ID\n"); - term_puts(" ls 列出根目录文件\n"); - term_puts(" cat 显示文件内容\n"); -} - -static void cmd_version(void) { - term_puts_color("Deshab OS v0.1.0\n", DA_SUCCESS); - term_puts(" Kernel: DSK (Deshab System Kernel)\n"); - term_puts(" Architecture: x86_64\n"); - term_puts(" ABI: DKM v1\n"); - term_puts(" Bootloader: Limine\n"); -} - -static void cmd_uname(void) { term_puts("Deshab\n"); } - -static void cmd_about(void) { - term_puts_color("=== Deshab OS ===\n", DA_PROMPT_COLOR); - term_puts("单地址空间 Ring0 内核实验系统\n"); - term_puts("架构: UTSM + DSK + DKM\n"); - term_puts_color("Built with Clang + lld\n", DA_TEXT_DIM); -} - -static void cmd_clear(void) { term_clear(); } - -static void cmd_reboot(void) { - term_puts_color("Rebooting...\n", DA_PROMPT_COLOR); - redraw_all(); - outb(0x64, 0xFE); - for(;;) __asm__("hlt"); -} - -static void cmd_halt(void) { - term_puts_color("System halted.\n", DA_PROMPT_COLOR); - redraw_all(); - for(;;) __asm__("hlt"); -} - -static void cmd_echo(const char *args) { - if (args && *args) term_puts_color(args, DA_TEXT_PRIMARY); - term_putc('\n'); -} - -static void cmd_date(void) { - u8 year, month, day, hour, minute, second; - outb(0x70, 9); year = inb(0x71); - outb(0x70, 8); month = inb(0x71); - outb(0x70, 7); day = inb(0x71); - outb(0x70, 4); hour = inb(0x71); - outb(0x70, 2); minute = inb(0x71); - outb(0x70, 0); second = inb(0x71); - year = (u8)((year>>4)*10+(year&0xF)); - month = (u8)((month>>4)*10+(month&0xF)); - day = (u8)((day>>4)*10+(day&0xF)); - hour = (u8)((hour>>4)*10+(hour&0xF)); - minute = (u8)((minute>>4)*10+(minute&0xF)); - second = (u8)((second>>4)*10+(second&0xF)); - char buf[32]; int p = 0; - buf[p++]='2'; buf[p++]='0'; buf[p++]='0'+year/10; buf[p++]='0'+year%10; buf[p++]='-'; - buf[p++]='0'+month/10; buf[p++]='0'+month%10; buf[p++]='-'; - buf[p++]='0'+day/10; buf[p++]='0'+day%10; buf[p++]=' '; - buf[p++]='0'+hour/10; buf[p++]='0'+hour%10; buf[p++]=':'; - buf[p++]='0'+minute/10; buf[p++]='0'+minute%10; buf[p++]=':'; - buf[p++]='0'+second/10; buf[p++]='0'+second%10; buf[p]=0; - term_puts(buf); term_putc('\n'); -} - -static void cmd_ls(void) { - if (!g_ac.block_read) { - term_puts_color("ls: 无块设备可用\n", DA_ERROR); - return; - } - /* 读取 FAT32 根目录 — 简化版:读取 BPB 获取根目录区 */ - u8 bpb[512]; - if (g_ac.block_read(0, 0, 1, bpb) != 0) { - term_puts_color("ls: 读取 BPB 失败\n", DA_ERROR); - return; - } - /* 检查 FAT32 签名 */ - if (bpb[510] != 0x55 || bpb[511] != 0xAA) { - term_puts_color("ls: 无有效 FAT32 分区\n", DA_ERROR); - return; - } - u32 root_cluster = *(u32 *)(bpb + 44); - u16 bytes_per_sector = *(u16 *)(bpb + 11); - u8 sectors_per_cluster = bpb[13]; - u32 fat_start = *(u16 *)(bpb + 14); - u32 data_start = fat_start + (*(u16 *)(bpb + 22)) * 2; - (void)bytes_per_sector; - (void)sectors_per_cluster; - (void)data_start; - - /* 读取根目录簇 — 简化:只读取第一个簇 */ - u8 dir_buf[8192]; - u32 cluster = root_cluster; - u32 lba = data_start + (cluster - 2) * sectors_per_cluster; - if (g_ac.block_read(0, lba, sectors_per_cluster, dir_buf) != 0) { - term_puts_color("ls: 读取根目录失败\n", DA_ERROR); - return; - } - /* 解析目录项 */ - int found = 0; - for (int i = 0; i < (int)(sectors_per_cluster * 512); i += 32) { - u8 first = dir_buf[i]; - if (first == 0x00) break; - if (first == 0xE5) continue; - if (dir_buf[i+11] & 0x08) continue; /* 卷标 */ - if (dir_buf[i+11] & 0x10) { - /* 目录 */ - term_puts_color("[DIR] ", DA_ACCENT); - } else { - term_puts_color(" ", DA_TEXT_PRIMARY); - } - /* 文件名(8.3) */ - for (int j = 0; j < 8; j++) { - if (dir_buf[i+j] == ' ') break; - term_putc((char)dir_buf[i+j]); - } - if (dir_buf[i+8] != ' ') { - term_putc('.'); - for (int j = 8; j < 11; j++) { - if (dir_buf[i+j] == ' ') break; - term_putc((char)dir_buf[i+j]); - } - } - term_putc('\n'); - found++; - } - if (found == 0) term_puts_color("(empty)\n", DA_TEXT_DIM); -} - -static void cmd_cat(const char *args) { - if (!args || !*args) { - term_puts_color("cat: 需要文件名参数\n", DA_ERROR); - return; - } - if (!g_ac.block_read) { - term_puts_color("cat: 无块设备可用\n", DA_ERROR); - return; - } - term_puts_color("cat: 文件读取暂未完整实现\n", DA_WARNING); -} - -static void execute_command(const char *cmd) { - while (*cmd == ' ') cmd++; - if (*cmd == 0) return; - const char *args = cmd; - while (*args && *args != ' ') args++; - char name[32]; - int nlen = (int)(args - cmd); - if (nlen >= 32) nlen = 31; - for (int i = 0; i < nlen; i++) name[i] = cmd[i]; - name[nlen] = 0; - while (*args == ' ') args++; - - if (str_eq(name,"help")||str_eq(name,"?")) cmd_help(); - else if (str_eq(name,"version")||str_eq(name,"ver")) cmd_version(); - else if (str_eq(name,"uname")) cmd_uname(); - else if (str_eq(name,"about")) cmd_about(); - else if (str_eq(name,"clear")||str_eq(name,"cls")) cmd_clear(); - else if (str_eq(name,"reboot")) cmd_reboot(); - else if (str_eq(name,"halt")||str_eq(name,"shutdown")) cmd_halt(); - else if (str_eq(name,"echo")) cmd_echo(args); - else if (str_eq(name,"date")||str_eq(name,"time")) cmd_date(); - else if (str_eq(name,"ls")||str_eq(name,"dir")) cmd_ls(); - else if (str_eq(name,"cat")) cmd_cat(args); - else if (str_eq(name,"pwd")) { term_puts("/\n"); } - else if (str_eq(name,"whoami")) { term_puts("root\n"); } - else if (str_eq(name,"id")) { term_puts("uid=0(root) gid=0(root)\n"); } - else { - term_puts_color("未知命令: ", DA_ERROR); - term_puts_color(name, DA_ERROR); - term_putc('\n'); - term_puts_color("输入 'help' 查看可用命令\n", DA_TEXT_DIM); - } -} - -static void add_history(const char *cmd) { - if (hist_count < HIST_SIZE) { - int i; - for (i = 0; cmd[i] && i < 255; i++) history[hist_count][i] = cmd[i]; - history[hist_count][i] = 0; - hist_count++; - } - hist_idx = hist_count; -} - -/* ---- 输入行重绘 ---- */ -static void redraw_input_line(void) { - int plen = 0; - while (PROMPT_STR[plen]) plen++; - i64 y = term_y + (i64)cur_row * CHAR_H; - da_fill_rect(&g_ac, term_x, y, (i64)term_w * CHAR_STEP, CHAR_H, DA_BG_PRIMARY); - for (int i = 0; i < plen; i++) - da_draw_char(&g_ac, PROMPT_STR[i], term_x + i * CHAR_STEP, y, DA_PROMPT_COLOR, DA_BG_PRIMARY); - for (int i = 0; i < input_len; i++) - da_draw_char(&g_ac, input_buf[i], term_x + (plen + i) * CHAR_STEP, y, DA_TEXT_PRIMARY, DA_BG_PRIMARY); - cur_col = plen + input_cursor; - /* 光标 */ - da_fill_rect(&g_ac, term_x + cur_col * CHAR_STEP, y + CHAR_H - 3, 11, 2, DA_ACCENT); -} - -/* ---- 主入口 ---- */ -__attribute__((visibility("default"))) -void dsk_entry(const da_boot_context *ctx) { - __asm__ volatile("cli"); - da_slog("bash", "boot"); - - if (!ctx || ctx->magic != DA_BOOT_MAGIC) { - da_slog("bash", "bad context"); - for(;;) __asm__("hlt"); - } - - da_init(&g_ac, ctx); - term_init_layout(); - term_clear(); - - /* 启动 banner */ - term_puts_color("=== Deshab Bash v0.1 ===\n", DA_ACCENT); - term_puts_color("欢迎使用 Deshab 终端\n", DA_SUCCESS); - term_puts_color("输入 'help' 查看可用命令 | Esc 退出\n", DA_TEXT_DIM); - term_putc('\n'); - - redraw_all(); - - int shift = 0, e0 = 0; - for (;;) { - /* 绘制提示符 */ - term_puts_color(PROMPT_STR, DA_PROMPT_COLOR); - input_len = 0; input_cursor = 0; input_buf[0] = 0; - int plen = 0; while (PROMPT_STR[plen]) plen++; - cur_col = plen; - redraw_all(); - - int cmd_done = 0; - while (!cmd_done) { - u8 st = inb(0x64); - if (!(st & 1)) { __asm__("pause"); continue; } - u8 data = inb(0x60); - if (st & 0x20) continue; - u8 sc = data; - if (sc == 0xE0) { e0 = 1; continue; } - if (sc == 0x2A || sc == 0x36) { shift = 1; continue; } - if (sc == 0xAA || sc == 0xB6) { shift = 0; continue; } - if (sc & 0x80) { e0 = 0; continue; } - - /* Esc 退出 */ - if (sc == 0x01 && !e0) { - da_slog("bash", "exit"); - return; - } - - if (e0) { - if (sc == 0x4B) { if (input_cursor > 0) input_cursor--; } - else if (sc == 0x4D) { if (input_cursor < input_len) input_cursor++; } - else if (sc == 0x47) { input_cursor = 0; } - else if (sc == 0x4F) { input_cursor = input_len; } - else if (sc == 0x48) { /* 上箭头 - 历史 */ - if (hist_idx > 0) { - hist_idx--; - int i; for (i = 0; history[hist_idx][i] && i < 255; i++) input_buf[i] = history[hist_idx][i]; - input_len = i; input_cursor = i; input_buf[i] = 0; - } - } - else if (sc == 0x50) { /* 下箭头 - 历史 */ - if (hist_idx < hist_count - 1) { - hist_idx++; - int i; for (i = 0; history[hist_idx][i] && i < 255; i++) input_buf[i] = history[hist_idx][i]; - input_len = i; input_cursor = i; input_buf[i] = 0; - } else if (hist_idx < hist_count) { - hist_idx = hist_count; - input_len = 0; input_cursor = 0; input_buf[0] = 0; - } - } - e0 = 0; - redraw_input_line(); - continue; - } - - if (sc == 0x1C) { /* Enter */ - input_buf[input_len] = 0; - term_putc('\n'); - if (input_len > 0) add_history(input_buf); - execute_command(input_buf); - cmd_done = 1; - continue; - } - if (sc == 0x0E) { /* Backspace */ - if (input_cursor > 0) { - for (int i = input_cursor - 1; i < input_len - 1; i++) - input_buf[i] = input_buf[i+1]; - input_len--; input_cursor--; - input_buf[input_len] = 0; - } - redraw_input_line(); - continue; - } - char c = da_scan_to_ascii(sc, shift); - if (c && c >= 32 && c <= 126 && input_len < 255) { - for (int i = input_len; i > input_cursor; i--) - input_buf[i] = input_buf[i-1]; - input_buf[input_cursor++] = c; - input_len++; - redraw_input_line(); - } - } - redraw_all(); - } -} diff --git a/CODE/tools/browser/linker.ld b/CODE/tools/browser/linker.ld index 94dddf7..473e5fc 100644 --- a/CODE/tools/browser/linker.ld +++ b/CODE/tools/browser/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(7); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(7); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/tools/curl/linker.ld b/CODE/tools/curl/linker.ld index 94dddf7..473e5fc 100644 --- a/CODE/tools/curl/linker.ld +++ b/CODE/tools/curl/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(7); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(7); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/tools/curl/main.c b/CODE/tools/curl/main.c index b06724c..f6ba1cb 100644 --- a/CODE/tools/curl/main.c +++ b/CODE/tools/curl/main.c @@ -1,11 +1,11 @@ -/* Deshab curl — 终端风格 HTTP 客户端 stub - * 命令行输入 URL,显示 HTTP GET 请求结果。 - * 当前为 stub,提示需要 TCP/IP 栈支持。 +/* Deshab curl — 终端风格 HTTP 客户端 + * 命令行输入 URL,发送 HTTP/1.0 GET 请求并打印响应(net_stack.h 共享协议栈)。 * Esc 键退出返回 DSK。 */ #include "../../firstInit/ascii_bitmaps.c" #include "../desktop_app.h" +#include "../net_stack.h" /* ---- 终端参数 ---- */ #define TERM_COLS 120 @@ -125,29 +125,121 @@ static void redraw_all(void) { da_draw_statusbar(&g_ac, status, (i64)g_ac.fb_w, (i64)g_ac.fb_h); } -/* ---- URL 请求模拟 ---- */ +/* ---- HTTP GET 实现(net_stack.h) ---- */ +static int g_ns_status = 0; /* 0=未尝试, 1=就绪, <0=失败 */ + +static int curl_net_ready(void) { + if (g_ns_status == 1) return 1; + if (g_ns_status < 0) return 0; + int rc = ns_init((u64)g_ac.kernel_api); + g_ns_status = (rc == 0) ? 1 : -1; + if (rc != 0) { + term_puts_color(" [错误] 网络初始化失败,无可用网卡或 net API\n", DA_ERROR); + return 0; + } + return 1; +} + static void do_http_get(const char *url) { + if (!curl_net_ready()) return; + + const char *p = url; + if (p[0]=='h'&&p[1]=='t'&&p[2]=='t'&&p[3]=='p'&&p[4]==':'&&p[5]=='/'&&p[6]=='/') p += 7; + + char host[128]; int hl = 0; + while (*p && *p != ':' && *p != '/' && hl < 127) host[hl++] = *p++; + host[hl] = 0; + if (!hl) { term_puts_color(" [错误] 缺少主机名\n", DA_ERROR); return; } + + u16 port = 80; + if (*p == ':') { + p++; + u32 pv = 0; int digits = 0; + while (*p >= '0' && *p <= '9') { pv = pv * 10 + (u32)(*p - '0'); p++; digits++; } + if (digits && pv <= 65535) port = (u16)pv; + } + char path[128]; int pl = 0; + if (*p == '/') { + while (*p && *p != ' ' && pl < 127) path[pl++] = *p++; + } + if (!pl) { path[0] = '/'; pl = 1; } + path[pl] = 0; + term_puts_color("GET ", DA_PROMPT_COLOR); term_puts_color(url, DA_ACCENT_LIGHT); term_putc('\n'); - term_puts_color(" -> 解析主机...\n", DA_TEXT_DIM); - term_puts_color(" -> 建立 TCP 连接...\n", DA_TEXT_DIM); - /* stub: 检查 kernel_api 是否有 net 接口 */ - if (!g_ac.kernel_api) { - term_puts_color(" [错误] 无内核 API\n", DA_ERROR); + /* 解析主机 */ + term_puts_color(" -> 解析 ", DA_TEXT_DIM); + term_puts_color(host, DA_TEXT_DIM); + term_puts_color("...\n", DA_TEXT_DIM); + redraw_all(); + u32 ip; + if (ns_dns_resolve(host, &ip) != 0) { + term_puts_color(" [错误] DNS 解析失败\n", DA_ERROR); return; } - /* 尝试读取 net API — 当前为 stub */ - u64 net_api = *(u64 *)((u64)g_ac.kernel_api + 0xC0); - if (!net_api) { - term_puts_color(" [错误] 需要 TCP/IP 栈支持\n", DA_ERROR); - term_puts_color(" 当前内核未实现网络协议栈。\n", DA_WARNING); - term_puts_color(" 请等待后续版本更新。\n", DA_TEXT_DIM); + char ipstr[24]; ns_fmt_ip(ip, ipstr); + term_puts_color(" -> ", DA_TEXT_DIM); + term_puts_color(ipstr, DA_TEXT_DIM); + term_putc('\n'); + + /* TCP 连接 */ + term_puts_color(" -> TCP 连接...\n", DA_TEXT_DIM); + redraw_all(); + if (ns_tcp_connect(ip, port, 2000) != 0) { + term_puts_color(" [错误] TCP 连接失败(超时/RST)\n", DA_ERROR); return; } - /* 如果有 net API,此处应实现真正的 HTTP GET */ - term_puts_color(" [stub] 网络功能尚未实现\n", DA_WARNING); + + /* 构造 HTTP/1.0 请求 */ + static char req[512]; + int r = 0; + const char *m = "GET "; while (*m) req[r++] = *m++; + for (int i = 0; i < pl; i++) req[r++] = path[i]; + m = " HTTP/1.0\r\nHost: "; while (*m) req[r++] = *m++; + for (int i = 0; i < hl; i++) req[r++] = host[i]; + m = "\r\nConnection: close\r\n\r\n"; while (*m) req[r++] = *m++; + req[r] = 0; + + term_puts_color(" -> 已连接,发送请求\n", DA_TEXT_DIM); + redraw_all(); + if (ns_tcp_send((const u8 *)req, (u32)r) != 0) { + term_puts_color(" [错误] 发送失败\n", DA_ERROR); + ns_tcp_close(); + return; + } + + /* 收至 FIN */ + term_puts_color(" -> 等待响应...\n", DA_TEXT_DIM); + redraw_all(); + int n = ns_tcp_recv(0, 0, 5000); + ns_tcp_close(); + if (n < 0) { + term_puts_color(" [错误] 连接被重置\n", DA_ERROR); + return; + } + if (n == 0) { + term_puts_color(" [错误] 无响应数据(超时)\n", DA_ERROR); + return; + } + + term_puts_color(" -> 收到 ", DA_SUCCESS); + char nb[12]; ns_u32_dec(nb, (u32)n); + term_puts_color(nb, DA_SUCCESS); + term_puts_color(" 字节\n\n", DA_SUCCESS); + + /* 打印 status line + body */ + u32 total = ns_tcp_rx_len; + u32 show = (u32)n; + for (u32 i = 0; i < show; i++) term_putc((char)ns_tcp_rx[i]); + if (total > show) { + term_puts_color("\n[... 已截断,共 ", DA_TEXT_DIM); + ns_u32_dec(nb, total); + term_puts_color(nb, DA_TEXT_DIM); + term_puts_color(" 字节]\n", DA_TEXT_DIM); + } + term_putc('\n'); } /* ---- 内置命令 ---- */ @@ -168,8 +260,8 @@ static void cmd_help(void) { static void cmd_clear(void) { term_clear(); } static void cmd_version(void) { - term_puts_color("Deshab curl v0.1 (stub)\n", DA_SUCCESS); - term_puts_color(" HTTP 客户端功能需要 TCP/IP 栈支持\n", DA_TEXT_DIM); + term_puts_color("Deshab curl v1.0\n", DA_SUCCESS); + term_puts_color(" HTTP/1.0 GET via net_stack (e1000 + slirp)\n", DA_TEXT_DIM); } static void execute_command(const char *cmd) { @@ -231,10 +323,9 @@ void dsk_entry(const da_boot_context *ctx) { term_clear(); /* 启动 banner */ - term_puts_color("=== Deshab curl v0.1 (stub) ===\n", DA_ACCENT); + term_puts_color("=== Deshab curl v1.0 ===\n", DA_ACCENT); term_puts_color("HTTP 命令行客户端\n", DA_SUCCESS); term_puts_color("输入 URL 发送 GET 请求 | 输入 'help' 查看帮助 | Esc 退出\n", DA_TEXT_DIM); - term_puts_color("注意: 当前需要 TCP/IP 栈支持\n", DA_WARNING); term_putc('\n'); redraw_all(); diff --git a/CODE/tools/editor/linker.ld b/CODE/tools/editor/linker.ld index 94dddf7..473e5fc 100644 --- a/CODE/tools/editor/linker.ld +++ b/CODE/tools/editor/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(7); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(7); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/tools/fileman/linker.ld b/CODE/tools/fileman/linker.ld index 94dddf7..473e5fc 100644 --- a/CODE/tools/fileman/linker.ld +++ b/CODE/tools/fileman/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(7); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(7); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/tools/net_stack.h b/CODE/tools/net_stack.h new file mode 100644 index 0000000..6e6554c --- /dev/null +++ b/CODE/tools/net_stack.h @@ -0,0 +1,716 @@ +/* net_stack.h — Deshab 用户态共享网络协议栈(static inline,无库) + * + * 前置条件:包含者已定义 u8/u16/u32/u64/i64 基础类型。 + * 通过 dkm_kernel_api + 0x48 的 net API 收发原始以太帧(轮询模型,无 IRQ)。 + * + * 能力:eth II / ARP(含应答)/ IPv4 / ICMP echo / UDP DNS / TCP 最小 client。 + * 默认拓扑:QEMU slirp — guest 10.0.2.15 / gw 10.0.2.2 / dns 10.0.2.3。 + * + * 用法: + * ns_init(ctx->dkm_kernel_api) — 初始化,选第一个有线 tx/rx ready 设备 + * ns_ping(ip, seq, timeout, &rtt, &ttl) — 单次 ICMP echo + * ns_dns_resolve(host, &ip) — A 记录查询(数字 IP 直接返回) + * ns_tcp_connect(ip, port, timeout) + * ns_tcp_send(data, len) + * ns_tcp_recv(buf, cap, idle_timeout) — 收至 FIN/超时,返回累计长度 + * ns_tcp_close() + * + * IP 以 u32 网络序数值表示(NS_IP4(10,0,2,15))。 + */ + +#ifndef DESHAB_NET_STACK_H +#define DESHAB_NET_STACK_H + +/* ---- 默认网络配置(QEMU user-mode slirp) ---- */ +#define NS_IP4(a,b,c,d) ((u32)((((u32)(a))<<24)|(((u32)(b))<<16)|(((u32)(c))<<8)|((u32)(d)))) +#define NS_GUEST_IP NS_IP4(10,0,2,15) +#define NS_GATEWAY_IP NS_IP4(10,0,2,2) +#define NS_DNS_IP NS_IP4(10,0,2,3) +#define NS_NETMASK NS_IP4(255,255,255,0) + +#define NS_ETH_ARP 0x0806 +#define NS_ETH_IPV4 0x0800 +#define NS_IP_ICMP 1 +#define NS_IP_TCP 6 +#define NS_IP_UDP 17 + +#define NS_ARP_CACHE_SIZE 8 +#define NS_TCP_RX_CAP 65536 + +/* dkm_net_device_desc.flags 位(与 utsm/net.h 一致) */ +#define NS_NET_F_TX_READY 0x2 +#define NS_NET_F_RX_READY 0x4 +#define NS_NET_F_WIRELESS 0x8 + +/* ---- 端口 I/O / TSC(ns_ 前缀避免与包含者冲突) ---- */ +static inline void ns_outb(u16 p, u8 v) { __asm__ volatile("outb %0,%1"::"a"(v),"Nd"(p)); } +static inline u8 ns_inb(u16 p) { u8 v; __asm__ volatile("inb %1,%0":"=a"(v):"Nd"(p)); return v; } +static inline u64 ns_rdtsc(void) { + u32 lo, hi; + __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((u64)hi << 32) | lo; +} + +/* PIT ch0 ~10ms 校准 TSC(与 shell/dsk 同法) */ +static u64 ns_tsc_per_ms = 0; +static inline void ns_tsc_calibrate(void) { + if (ns_tsc_per_ms) return; + ns_outb(0x43, 0x30); + ns_outb(0x40, 0x7C); + ns_outb(0x40, 0x2E); + u64 t0 = ns_rdtsc(); + u16 prev = 0; u64 loops = 0; + for (;;) { + ns_outb(0x43, 0x00); + u16 cur = (u16)ns_inb(0x40) | ((u16)ns_inb(0x40) << 8); + if (cur > prev && loops > 10) break; + prev = cur; loops++; + } + ns_tsc_per_ms = (ns_rdtsc() - t0) / 10; + if (!ns_tsc_per_ms) ns_tsc_per_ms = 3000; /* 兜底 ~3GHz */ +} + +static inline int ns_deadline_reached(u64 deadline) { + return (i64)(ns_rdtsc() - deadline) >= 0; +} + +/* ---- 字节序/校验和 ---- */ +static inline void ns_w16(u8 *p, u16 v) { p[0] = (u8)(v >> 8); p[1] = (u8)v; } +static inline void ns_w32(u8 *p, u32 v) { p[0] = (u8)(v >> 24); p[1] = (u8)(v >> 16); p[2] = (u8)(v >> 8); p[3] = (u8)v; } +static inline u16 ns_r16(const u8 *p) { return (u16)(((u16)p[0] << 8) | p[1]); } +static inline u32 ns_r32(const u8 *p) { return ((u32)p[0] << 24) | ((u32)p[1] << 16) | ((u32)p[2] << 8) | p[3]; } + +static inline u16 ns_checksum(const void *data, u32 len) { + const u8 *p = (const u8 *)data; + u32 sum = 0; + while (len > 1) { sum += ((u16)p[0] << 8) | p[1]; p += 2; len -= 2; } + if (len) sum += ((u16)p[0] << 8); + while (sum >> 16) sum = (sum & 0xFFFF) + (sum >> 16); + return (u16)~sum; +} + +static inline void ns_memcpy(void *d, const void *s, u32 n) { + u8 *dd = (u8 *)d; const u8 *ss = (const u8 *)s; + while (n--) *dd++ = *ss++; +} +static inline void ns_memset(void *d, u8 c, u32 n) { + u8 *dd = (u8 *)d; while (n--) *dd++ = c; +} + +/* ---- 十进制/IP 字符串 ---- */ +static inline void ns_u32_dec(char *buf, u32 v) { + char tmp[12]; int n = 0; + if (!v) { buf[0] = '0'; buf[1] = 0; return; } + while (v && n < 11) { tmp[n++] = (char)('0' + v % 10); v /= 10; } + for (int i = 0; i < n; i++) buf[i] = tmp[n - 1 - i]; + buf[n] = 0; +} + +static inline void ns_fmt_ip(u32 ip, char *out) { + int p = 0; + for (int i = 3; i >= 0; i--) { + char d[4]; ns_u32_dec(d, (ip >> (i * 8)) & 0xFF); + for (int j = 0; d[j]; j++) out[p++] = d[j]; + if (i) out[p++] = '.'; + } + out[p] = 0; +} + +/* 解析 "a.b.c.d" → 网络序 u32。返回 0 成功。 */ +static inline int ns_parse_ip(const char *s, u32 *out) { + u32 v = 0; + for (int part = 0; part < 4; part++) { + u32 n = 0; int digits = 0; + while (*s >= '0' && *s <= '9') { + n = n * 10 + (u32)(*s - '0'); + if (n > 255) return -1; + s++; digits++; + } + if (!digits) return -1; + v = (v << 8) | n; + if (part < 3) { + if (*s != '.') return -1; + s++; + } + } + if (*s && *s != ' ') return -1; + *out = v; + return 0; +} + +/* ---- net API 绑定 ---- */ +typedef int (*ns_net_tx_fn)(u32 index, const void *packet, u32 length); +typedef int (*ns_net_rx_poll_fn)(u32 index, void *buffer, u32 capacity, u32 *out_length); +typedef u32 (*ns_net_count_fn)(void); +typedef int (*ns_net_info_fn)(u32 index, void *out); + +static int ns_ready = 0; +static u32 ns_dev_index = 0; +static u8 ns_mac[6] = {0}; +static ns_net_tx_fn ns_net_tx = 0; +static ns_net_rx_poll_fn ns_net_rx_poll_fn_ptr = 0; +static u16 ns_ip_id = 1; + +/* dkm_net_device_info 布局:name ptr @0, mac[6] @8, flags @16(对齐填充后 size 24) */ +typedef struct __attribute__((packed)) { + u64 name; + u8 mac[6]; + u16 pad; + u32 flags; +} ns_dev_info; + +static inline int ns_init(u64 dkm_kernel_api) { + if (ns_ready) return 0; + if (!dkm_kernel_api) return -1; + u64 net = *(u64 *)(dkm_kernel_api + 0x48); + if (!net) return -2; + ns_net_count_fn device_count = (ns_net_count_fn)*(u64 *)(net + 0x08); + ns_net_info_fn device_info = (ns_net_info_fn)*(u64 *)(net + 0x10); + ns_net_tx = (ns_net_tx_fn)*(u64 *)(net + 0x18); + ns_net_rx_poll_fn_ptr = (ns_net_rx_poll_fn)*(u64 *)(net + 0x20); + if (!device_count || !device_info || !ns_net_tx || !ns_net_rx_poll_fn_ptr) return -3; + u32 n = device_count(); + if (!n) return -4; + + int picked = -1; + ns_dev_info info; + for (u32 i = 0; i < n && i < 8; i++) { + ns_memset(&info, 0, sizeof(info)); + if (device_info(i, &info) != 0) continue; + if (info.flags & NS_NET_F_WIRELESS) continue; + if ((info.flags & NS_NET_F_TX_READY) && (info.flags & NS_NET_F_RX_READY)) { + picked = (int)i; + for (int k = 0; k < 6; k++) ns_mac[k] = info.mac[k]; + break; + } + } + if (picked < 0) { + ns_memset(&info, 0, sizeof(info)); + if (device_info(0, &info) != 0) return -5; + picked = 0; + for (int k = 0; k < 6; k++) ns_mac[k] = info.mac[k]; + } + ns_dev_index = (u32)picked; + ns_tsc_calibrate(); + ns_ready = 1; + return 0; +} + +/* ---- 帧缓冲 ---- */ +static u8 ns_txbuf[2048]; +static u8 ns_rxframe[2048]; + +/* 发送以太帧 */ +static inline int ns_send_eth(const u8 dst_mac[6], u16 ethertype, const u8 *payload, u32 len) { + if (len + 14 > sizeof(ns_txbuf)) return -1; + for (int i = 0; i < 6; i++) ns_txbuf[i] = dst_mac[i]; + for (int i = 0; i < 6; i++) ns_txbuf[6 + i] = ns_mac[i]; + ns_w16(ns_txbuf + 12, ethertype); + ns_memcpy(ns_txbuf + 14, payload, len); + u32 total = len + 14; + if (total < 60) { /* 以太网最小帧 */ + ns_memset(ns_txbuf + total, 0, 60 - total); + total = 60; + } + return ns_net_tx(ns_dev_index, ns_txbuf, total); +} + +/* ---- ARP ---- */ +typedef struct { + u32 ip; + u8 mac[6]; + u8 valid; +} ns_arp_entry; + +static ns_arp_entry ns_arp_cache[NS_ARP_CACHE_SIZE]; +static u8 ns_arp_reply_mac[6]; +static volatile int ns_arp_reply_valid = 0; + +static inline void ns_arp_cache_put(u32 ip, const u8 mac[6]) { + int slot = -1; + for (int i = 0; i < NS_ARP_CACHE_SIZE; i++) { + if (ns_arp_cache[i].valid && ns_arp_cache[i].ip == ip) { slot = i; break; } + } + if (slot < 0) { + for (int i = 0; i < NS_ARP_CACHE_SIZE; i++) { + if (!ns_arp_cache[i].valid) { slot = i; break; } + } + } + if (slot < 0) slot = 0; + ns_arp_cache[slot].ip = ip; + for (int k = 0; k < 6; k++) ns_arp_cache[slot].mac[k] = mac[k]; + ns_arp_cache[slot].valid = 1; +} + +static inline int ns_arp_cache_get(u32 ip, u8 mac[6]) { + for (int i = 0; i < NS_ARP_CACHE_SIZE; i++) { + if (ns_arp_cache[i].valid && ns_arp_cache[i].ip == ip) { + for (int k = 0; k < 6; k++) mac[k] = ns_arp_cache[i].mac[k]; + return 0; + } + } + return -1; +} + +/* 构造 ARP 包到 out(42 字节),oper 1=request 2=reply */ +static inline void ns_arp_build(u8 *out, u16 oper, + const u8 sha[6], u32 spa, + const u8 tha[6], u32 tpa) { + ns_w16(out + 0, 1); /* htype eth */ + ns_w16(out + 2, NS_ETH_IPV4); /* ptype */ + out[4] = 6; out[5] = 4; + ns_w16(out + 6, oper); + for (int i = 0; i < 6; i++) out[8 + i] = sha[i]; + ns_w32(out + 14, spa); + for (int i = 0; i < 6; i++) out[18 + i] = tha[i]; + ns_w32(out + 24, tpa); +} + +/* 处理收到的 ARP 包:应答对我们的请求,记录 reply。 */ +static inline void ns_arp_handle(const u8 *pkt, u32 len) { + if (len < 28) return; + u16 oper = ns_r16(pkt + 6); + u32 spa = ns_r32(pkt + 14); + u32 tpa = ns_r32(pkt + 24); + if (oper == 1 && tpa == NS_GUEST_IP) { + /* 请求我们的 IP → 回复 */ + u8 reply[28]; + ns_arp_build(reply, 2, ns_mac, NS_GUEST_IP, pkt + 8, spa); + ns_send_eth(pkt + 8, NS_ETH_ARP, reply, 28); + } else if (oper == 2) { + ns_arp_cache_put(spa, pkt + 8); + for (int k = 0; k < 6; k++) ns_arp_reply_mac[k] = pkt[8 + k]; + ns_arp_reply_valid = 1; + } +} + +/* 轮询一帧;ARP 内部处理(不返回给调用者)。 + * 返回 0=收到非 ARP 帧(*out_et 为 ethertype),1=超时。 */ +static inline int ns_wait_frame(u8 *buf, u32 cap, u32 *out_len, u16 *out_et, u32 timeout_ms) { + u64 deadline = ns_rdtsc() + ns_tsc_per_ms * timeout_ms; + for (;;) { + u32 len = 0; + int rc = ns_net_rx_poll_fn_ptr(ns_dev_index, buf, cap, &len); + if (rc == 0 && len >= 14) { + u16 et = ns_r16(buf + 12); + if (et == NS_ETH_ARP) { + ns_arp_handle(buf + 14, len - 14); + /* 继续等待 */ + } else { + *out_len = len; + *out_et = et; + return 0; + } + } + if (ns_deadline_reached(deadline)) return 1; + __asm__ volatile("pause"); + } +} + +/* ARP 解析 ip → mac,3 次重传。返回 0 成功。 */ +static inline int ns_arp_resolve(u32 ip, u8 out_mac[6]) { + if (ns_arp_cache_get(ip, out_mac) == 0) return 0; + static const u8 bcast[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; + static const u8 zero_mac[6] = {0,0,0,0,0,0}; + for (int attempt = 0; attempt < 3; attempt++) { + u8 req[28]; + ns_arp_build(req, 1, ns_mac, NS_GUEST_IP, zero_mac, ip); + ns_arp_reply_valid = 0; + if (ns_send_eth(bcast, NS_ETH_ARP, req, 28) != 0) continue; + u64 deadline = ns_rdtsc() + ns_tsc_per_ms * 1000; + while (!ns_deadline_reached(deadline)) { + u32 len = 0; + int rc = ns_net_rx_poll_fn_ptr(ns_dev_index, ns_rxframe, sizeof(ns_rxframe), &len); + if (rc == 0 && len >= 14 && ns_r16(ns_rxframe + 12) == NS_ETH_ARP) { + ns_arp_handle(ns_rxframe + 14, len - 14); + if (ns_arp_reply_valid) { + u32 spa = ns_r32(ns_rxframe + 14 + 14); + if (spa == ip) { + for (int k = 0; k < 6; k++) out_mac[k] = ns_arp_reply_mac[k]; + return 0; + } + ns_arp_reply_valid = 0; + } + } + __asm__ volatile("pause"); + } + } + return -1; +} + +/* 目标 IP 的下一跳 MAC(同子网直连,否则走网关)。返回 0 成功。 */ +static inline int ns_route_mac(u32 dst_ip, u8 out_mac[6]) { + u32 next = dst_ip; + if ((dst_ip & NS_NETMASK) != (NS_GUEST_IP & NS_NETMASK)) next = NS_GATEWAY_IP; + return ns_arp_resolve(next, out_mac); +} + +/* ---- IPv4 发送 ---- */ +static inline void ns_ipv4_build(u8 *out, u8 proto, u32 src, u32 dst, u32 payload_len) { + out[0] = 0x45; /* ver=4 ihl=5 */ + out[1] = 0; /* tos */ + ns_w16(out + 2, (u16)(20 + payload_len)); + ns_w16(out + 4, ns_ip_id++); + ns_w16(out + 6, 0x4000); /* DF */ + out[8] = 64; /* ttl */ + out[9] = proto; + ns_w16(out + 10, 0); + ns_w32(out + 12, src); + ns_w32(out + 16, dst); + ns_w16(out + 10, ns_checksum(out, 20)); +} + +/* ---- ICMP echo(ping) ---- + * 返回 0 成功(*out_rtt_ms / *out_ttl 有效),-1 ARP 失败,-2 超时。 */ +static inline int ns_ping(u32 dst_ip, u16 seq, u32 timeout_ms, u32 *out_rtt_ms, u8 *out_ttl) { + u8 dst_mac[6]; + if (ns_route_mac(dst_ip, dst_mac) != 0) return -1; + + u8 pkt[20 + 8 + 32]; + ns_ipv4_build(pkt, NS_IP_ICMP, NS_GUEST_IP, dst_ip, 8 + 32); + u8 *icmp = pkt + 20; + icmp[0] = 8; /* echo request */ + icmp[1] = 0; + ns_w16(icmp + 2, 0); + ns_w16(icmp + 4, 0xD5AB); /* identifier */ + ns_w16(icmp + 6, seq); + for (int i = 0; i < 32; i++) icmp[8 + i] = (u8)(0x61 + (i % 26)); + ns_w16(icmp + 2, ns_checksum(icmp, 8 + 32)); + + if (ns_send_eth(dst_mac, NS_ETH_IPV4, pkt, sizeof(pkt)) != 0) return -3; + u64 t0 = ns_rdtsc(); + u64 deadline = t0 + ns_tsc_per_ms * timeout_ms; + while (!ns_deadline_reached(deadline)) { + u32 len = 0; + int rc = ns_net_rx_poll_fn_ptr(ns_dev_index, ns_rxframe, sizeof(ns_rxframe), &len); + if (rc == 0 && len >= 14) { + u16 et = ns_r16(ns_rxframe + 12); + if (et == NS_ETH_ARP) { + ns_arp_handle(ns_rxframe + 14, len - 14); + } else if (et == NS_ETH_IPV4 && len >= 14 + 20 + 8) { + const u8 *ip = ns_rxframe + 14; + u8 ihl = (u8)((ip[0] & 0x0F) * 4); + if (ihl < 20 || len < 14 + ihl + 8) continue; + if (ip[9] != NS_IP_ICMP) continue; + const u8 *ic = ip + ihl; + if (ic[0] == 0 && ns_r16(ic + 4) == 0xD5AB && ns_r16(ic + 6) == seq) { + u64 dt = ns_rdtsc() - t0; + if (out_rtt_ms) { + u32 ms = (u32)(dt / ns_tsc_per_ms); + *out_rtt_ms = ms; + } + if (out_ttl) *out_ttl = ip[8]; + return 0; + } + } + } + __asm__ volatile("pause"); + } + return -2; +} + +/* ---- UDP DNS A 查询 ---- + * host 为数字 IP 时直接解析返回。返回 0 成功。 */ +static inline int ns_dns_resolve(const char *host, u32 *out_ip) { + if (ns_parse_ip(host, out_ip) == 0) return 0; + + u8 dst_mac[6]; + if (ns_route_mac(NS_DNS_IP, dst_mac) != 0) return -1; + + /* 构造查询:header + qname + qtype/qclass */ + u8 q[512]; + u16 txid = (u16)(ns_rdtsc() & 0xFFFF); + if (!txid) txid = 0x1234; + ns_w16(q + 0, txid); + ns_w16(q + 2, 0x0100); /* RD */ + ns_w16(q + 4, 1); /* qdcount */ + ns_w16(q + 6, 0); ns_w16(q + 8, 0); ns_w16(q + 10, 0); + u32 p = 12; + u32 i = 0; + while (host[i]) { + u32 start = p++; + u8 n = 0; + while (host[i] && host[i] != '.') { + if (n >= 63 || p >= 500) return -2; + q[p++] = (u8)host[i++]; n++; + } + q[start] = n; + if (host[i] == '.') i++; + } + q[p++] = 0; + ns_w16(q + p, 1); p += 2; /* A */ + ns_w16(q + p, 1); p += 2; /* IN */ + u32 qlen = p; + + u8 pkt[20 + 8 + 512]; + ns_ipv4_build(pkt, NS_IP_UDP, NS_GUEST_IP, NS_DNS_IP, 8 + qlen); + u8 *udp = pkt + 20; + ns_w16(udp + 0, 49153); + ns_w16(udp + 2, 53); + ns_w16(udp + 4, (u16)(8 + qlen)); + ns_w16(udp + 6, 0); /* 不校验 UDP checksum */ + ns_memcpy(udp + 8, q, qlen); + + for (int attempt = 0; attempt < 2; attempt++) { + if (ns_send_eth(dst_mac, NS_ETH_IPV4, pkt, 20 + 8 + qlen) != 0) continue; + u64 deadline = ns_rdtsc() + ns_tsc_per_ms * 3000; + while (!ns_deadline_reached(deadline)) { + u32 len = 0; + int rc = ns_net_rx_poll_fn_ptr(ns_dev_index, ns_rxframe, sizeof(ns_rxframe), &len); + if (rc == 0 && len >= 14) { + u16 et = ns_r16(ns_rxframe + 12); + if (et == NS_ETH_ARP) { + ns_arp_handle(ns_rxframe + 14, len - 14); + } else if (et == NS_ETH_IPV4 && len >= 14 + 20 + 8 + 12) { + const u8 *ip = ns_rxframe + 14; + u8 ihl = (u8)((ip[0] & 0x0F) * 4); + if (ihl < 20 || ip[9] != NS_IP_UDP) continue; + const u8 *ru = ip + ihl; + if (ns_r16(ru + 2) != 49153) continue; + const u8 *d = ru + 8; + if (ns_r16(d + 0) != txid) continue; + u16 qd = ns_r16(d + 4); + u16 an = ns_r16(d + 6); + u32 off = 12; + /* 跳过问题段 */ + for (u16 qq = 0; qq < qd; qq++) { + while (off < len) { + u8 b = d[off]; + if (b == 0) { off++; break; } + if ((b & 0xC0) == 0xC0) { off += 2; break; } + off += 1 + b; + } + off += 4; + } + /* 遍历应答 RR */ + for (u16 rr = 0; rr < an; rr++) { + while (off < len) { /* 跳过 name */ + u8 b = d[off]; + if (b == 0) { off++; break; } + if ((b & 0xC0) == 0xC0) { off += 2; break; } + off += 1 + b; + } + if (off + 10 > len) break; + u16 rtype = ns_r16(d + off); + u16 rdlen = ns_r16(d + off + 8); + off += 10; + if (rtype == 1 && rdlen == 4 && off + 4 <= len) { + *out_ip = ns_r32(d + off); + return 0; + } + off += rdlen; + } + } + } + __asm__ volatile("pause"); + } + } + return -3; +} + +/* ---- TCP 最小 client ---- */ +#define NS_TCP_CLOSED 0 +#define NS_TCP_SYN_SENT 1 +#define NS_TCP_ESTAB 2 +#define NS_TCP_FIN_WAIT 3 + +static struct { + u32 state; + u32 dst_ip; + u16 dst_port; + u16 src_port; + u32 snd_nxt; + u32 rcv_nxt; + u8 dst_mac[6]; +} ns_tc = {0, 0, 0, 0, 0, 0, {0}}; + +static u8 ns_tcp_rx[NS_TCP_RX_CAP]; +static u32 ns_tcp_rx_len = 0; +static volatile int ns_tcp_got_fin = 0; +static volatile int ns_tcp_got_rst = 0; + +#define NS_TCP_FIN 0x01 +#define NS_TCP_SYN 0x02 +#define NS_TCP_RST 0x04 +#define NS_TCP_PSH 0x08 +#define NS_TCP_ACK 0x10 + +/* 构造并发送 TCP 段(data 可为 0)。 */ +static inline int ns_tcp_emit(u8 flags, const u8 *data, u32 len, u32 seq) { + u8 pkt[20 + 20 + 1460]; + if (len > 1460) return -1; + u32 tcp_len = 20 + len; + ns_ipv4_build(pkt, NS_IP_TCP, NS_GUEST_IP, ns_tc.dst_ip, tcp_len); + u8 *t = pkt + 20; + ns_w16(t + 0, ns_tc.src_port); + ns_w16(t + 2, ns_tc.dst_port); + ns_w32(t + 4, seq); + ns_w32(t + 8, (flags & NS_TCP_ACK) ? ns_tc.rcv_nxt : 0); + t[12] = (5 << 4); /* data offset */ + t[13] = flags; + ns_w16(t + 14, 64240); /* window */ + ns_w16(t + 16, 0); + ns_w16(t + 18, 0); + if (len) ns_memcpy(t + 20, data, len); + /* 伪头部校验和 */ + u8 ph[12]; + ns_w32(ph + 0, NS_GUEST_IP); + ns_w32(ph + 4, ns_tc.dst_ip); + ph[8] = 0; ph[9] = NS_IP_TCP; + ns_w16(ph + 10, (u16)tcp_len); + u32 sum = 0; + for (u32 k = 0; k < 12; k += 2) sum += ((u16)ph[k] << 8) | ph[k + 1]; + for (u32 k = 0; k + 1 < tcp_len; k += 2) sum += ((u16)t[k] << 8) | t[k + 1]; + if (tcp_len & 1) sum += ((u16)t[tcp_len - 1] << 8); + while (sum >> 16) sum = (sum & 0xFFFF) + (sum >> 16); + ns_w16(t + 16, (u16)~sum); + return ns_send_eth(ns_tc.dst_mac, NS_ETH_IPV4, pkt, 20 + tcp_len); +} + +/* 处理收到的 IPv4/TCP 段。返回 1 表示属于本连接并已处理。 */ +static inline int ns_tcp_process(const u8 *ip, u32 ip_len) { + if (ip_len < 20) return 0; + u8 ihl = (u8)((ip[0] & 0x0F) * 4); + if (ihl < 20 || ip_len < ihl + 20) return 0; + if (ip[9] != NS_IP_TCP) return 0; + if (ns_r32(ip + 12) != ns_tc.dst_ip) return 0; + const u8 *t = ip + ihl; + if (ns_r16(t + 0) != ns_tc.dst_port) return 0; + if (ns_r16(t + 2) != ns_tc.src_port) return 0; + + u32 seq = ns_r32(t + 4); + u32 ack = ns_r32(t + 8); + u8 doff = (u8)((t[12] >> 4) * 4); + u8 flags = t[13]; + u16 ip_total = ns_r16(ip + 2); + u32 data_len = (u32)ip_total - ihl - doff; + const u8 *data = t + doff; + + if (flags & NS_TCP_RST) { ns_tcp_got_rst = 1; ns_tc.state = NS_TCP_CLOSED; return 1; } + + if (ns_tc.state == NS_TCP_SYN_SENT) { + if ((flags & (NS_TCP_SYN | NS_TCP_ACK)) == (NS_TCP_SYN | NS_TCP_ACK)) { + ns_tc.rcv_nxt = seq + 1; + ns_tc.snd_nxt = ack; + ns_tc.state = NS_TCP_ESTAB; + ns_tcp_emit(NS_TCP_ACK, 0, 0, ns_tc.snd_nxt); + } + return 1; + } + + if (ns_tc.state == NS_TCP_ESTAB || ns_tc.state == NS_TCP_FIN_WAIT) { + if (data_len > 0) { + if (seq == ns_tc.rcv_nxt) { + u32 room = NS_TCP_RX_CAP - ns_tcp_rx_len; + u32 take = data_len < room ? data_len : room; + ns_memcpy(ns_tcp_rx + ns_tcp_rx_len, data, take); + ns_tcp_rx_len += take; + ns_tc.rcv_nxt += data_len; + ns_tcp_emit(NS_TCP_ACK, 0, 0, ns_tc.snd_nxt); + } else { + /* 乱序超前或重复段:重 ACK 当前期望序号 */ + ns_tcp_emit(NS_TCP_ACK, 0, 0, ns_tc.snd_nxt); + } + } + if (flags & NS_TCP_FIN) { + if (seq + data_len == ns_tc.rcv_nxt || data_len == 0) { + ns_tc.rcv_nxt = seq + data_len + 1; + ns_tcp_emit(NS_TCP_ACK, 0, 0, ns_tc.snd_nxt); + ns_tcp_got_fin = 1; + ns_tc.state = NS_TCP_CLOSED; + } + } + return 1; + } + return 1; +} + +/* 在超时窗口内收帧并喂给 TCP;返回 0=收到本连接段,1=超时。 */ +static inline int ns_tcp_wait(u32 timeout_ms) { + u64 deadline = ns_rdtsc() + ns_tsc_per_ms * timeout_ms; + while (!ns_deadline_reached(deadline)) { + u32 len = 0; + int rc = ns_net_rx_poll_fn_ptr(ns_dev_index, ns_rxframe, sizeof(ns_rxframe), &len); + if (rc == 0 && len >= 14) { + u16 et = ns_r16(ns_rxframe + 12); + if (et == NS_ETH_ARP) { + ns_arp_handle(ns_rxframe + 14, len - 14); + } else if (et == NS_ETH_IPV4) { + if (ns_tcp_process(ns_rxframe + 14, len - 14)) return 0; + } + } + __asm__ volatile("pause"); + } + return 1; +} + +/* 返回 0 成功(state=ESTAB),-1 ARP 失败,-2 超时/RST。 */ +static inline int ns_tcp_connect(u32 dst_ip, u16 dst_port, u32 timeout_ms) { + if (ns_route_mac(dst_ip, ns_tc.dst_mac) != 0) return -1; + ns_tc.dst_ip = dst_ip; + ns_tc.dst_port = dst_port; + ns_tc.src_port = (u16)(49152 + (ns_rdtsc() & 0x0FFF)); + u32 iss = (u32)ns_rdtsc(); + ns_tcp_rx_len = 0; + ns_tcp_got_fin = 0; + ns_tcp_got_rst = 0; + + for (int attempt = 0; attempt < 3; attempt++) { + ns_tc.state = NS_TCP_SYN_SENT; + if (ns_tcp_emit(NS_TCP_SYN, 0, 0, iss) != 0) continue; + u64 deadline = ns_rdtsc() + ns_tsc_per_ms * timeout_ms; + while (!ns_deadline_reached(deadline)) { + if (ns_tcp_got_rst) { ns_tc.state = NS_TCP_CLOSED; return -2; } + if (ns_tc.state == NS_TCP_ESTAB) return 0; + ns_tcp_wait(50); + } + } + ns_tc.state = NS_TCP_CLOSED; + return -2; +} + +/* 发送数据并等待 ACK(数据段可能在等待期间到达,已入缓冲)。 */ +static inline int ns_tcp_send(const u8 *data, u32 len) { + if (ns_tc.state != NS_TCP_ESTAB) return -1; + for (int attempt = 0; attempt < 3; attempt++) { + u32 expect = ns_tc.snd_nxt + len; + if (ns_tcp_emit((u8)(NS_TCP_PSH | NS_TCP_ACK), data, len, ns_tc.snd_nxt) != 0) return -2; + u64 deadline = ns_rdtsc() + ns_tsc_per_ms * 2000; + while (!ns_deadline_reached(deadline)) { + if (ns_tcp_got_rst) { ns_tc.state = NS_TCP_CLOSED; return -3; } + /* 检查 snd_una 是否被 ACK 推进:ns_tcp_process 不记录 una, + * 简单起见此处认为发出后收到任何本连接段即推进。 + * 对 HTTP/1.0 请求-响应模式足够(对端 ACK+数据一起回来)。 */ + if (ns_tcp_wait(100) == 0) { + ns_tc.snd_nxt = expect; + return 0; + } + } + } + return -4; +} + +/* 收至 FIN 或空闲超时;把累计数据拷到 buf(最多 cap)。返回长度或负值。 */ +static inline int ns_tcp_recv(u8 *buf, u32 cap, u32 idle_timeout_ms) { + u64 idle_deadline = ns_rdtsc() + ns_tsc_per_ms * idle_timeout_ms; + for (;;) { + if (ns_tcp_got_rst) return -1; + if (ns_tcp_got_fin) break; + if (ns_deadline_reached(idle_deadline)) break; + if (ns_tcp_wait(100) == 0) { + idle_deadline = ns_rdtsc() + ns_tsc_per_ms * idle_timeout_ms; + } + } + u32 n = ns_tcp_rx_len < cap ? ns_tcp_rx_len : cap; + if (buf && n) ns_memcpy(buf, ns_tcp_rx, n); + return (int)n; +} + +static inline void ns_tcp_close(void) { + if (ns_tc.state == NS_TCP_ESTAB) { + ns_tcp_emit((u8)(NS_TCP_FIN | NS_TCP_ACK), 0, 0, ns_tc.snd_nxt); + } + ns_tc.state = NS_TCP_CLOSED; +} + +#endif /* DESHAB_NET_STACK_H */ diff --git a/CODE/tools/ping/linker.ld b/CODE/tools/ping/linker.ld index 94dddf7..473e5fc 100644 --- a/CODE/tools/ping/linker.ld +++ b/CODE/tools/ping/linker.ld @@ -2,9 +2,10 @@ ENTRY(dsk_entry) PHDRS { - text PT_LOAD FLAGS(7); - rodata PT_LOAD FLAGS(4); - data PT_LOAD FLAGS(7); + text PT_LOAD FLAGS(5); + rodata PT_LOAD FLAGS(4); + data PT_LOAD FLAGS(6); + dynamic PT_DYNAMIC FLAGS(4); } SECTIONS @@ -12,5 +13,12 @@ SECTIONS . = 0x1000; .text : ALIGN(4K) { *(.text*) } :text .rodata : ALIGN(4K) { *(.rodata*) } :rodata - .data : ALIGN(4K) { *(.data*) *(COMMON) *(.bss*) } :data + .data : ALIGN(4K) { + *(.data*) + *(.data.rel.ro*) + *(COMMON) + *(.bss*) + } :data + .rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data + .dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic } diff --git a/CODE/tools/ping/main.c b/CODE/tools/ping/main.c index f7fc219..d9907c2 100644 --- a/CODE/tools/ping/main.c +++ b/CODE/tools/ping/main.c @@ -1,11 +1,11 @@ -/* Deshab ping — 终端风格 ICMP Echo 工具 stub - * 命令行输入 IP 地址,发送 ICMP Echo Request。 - * 当前为 stub,提示需要 TCP/IP 栈支持。 +/* Deshab ping — 终端风格 ICMP Echo 工具 + * 命令行输入 IP 地址,发送 ICMP Echo Request(net_stack.h 共享协议栈)。 * Esc 键退出返回 DSK。 */ #include "../../firstInit/ascii_bitmaps.c" #include "../desktop_app.h" +#include "../net_stack.h" /* ---- 终端参数 ---- */ #define TERM_COLS 120 @@ -137,32 +137,84 @@ static int is_valid_ip(const char *s) { return dots == 3; } -/* ---- Ping 模拟 ---- */ -static void do_ping(const char *ip) { +/* ---- Ping 实现(net_stack.h) ---- */ +static int g_ns_status = 0; /* 0=未尝试, 1=就绪, <0=失败 */ + +static int ping_net_ready(void) { + if (g_ns_status == 1) return 1; + if (g_ns_status < 0) return 0; + int rc = ns_init((u64)g_ac.kernel_api); + g_ns_status = (rc == 0) ? 1 : -1; + if (rc != 0) { + term_puts_color(" [错误] 网络初始化失败,无可用网卡或 net API\n", DA_ERROR); + return 0; + } + return 1; +} + +static void do_ping(const char *ip_str) { + u32 ip; + if (ns_parse_ip(ip_str, &ip) != 0) { + term_puts_color(" [错误] 无法解析 IP\n", DA_ERROR); + return; + } + if (!ping_net_ready()) return; + + char ipstr[24]; + ns_fmt_ip(ip, ipstr); term_puts_color("PING ", DA_PROMPT_COLOR); - term_puts_color(ip, DA_ACCENT_LIGHT); - term_puts_color(" 56(84) bytes of data.\n", DA_TEXT_DIM); + term_puts_color(ipstr, DA_ACCENT_LIGHT); + term_puts_color(" 32 data bytes\n", DA_TEXT_DIM); - /* stub: 检查 kernel_api 是否有 net 接口 */ - if (!g_ac.kernel_api) { - term_puts_color(" [错误] 无内核 API\n", DA_ERROR); - return; + int sent = 0, recv = 0; + u32 sum = 0, min = 0xFFFFFFFFu, max = 0; + for (u16 seq = 1; seq <= 4; seq++) { + u32 rtt = 0; u8 ttl = 0; + int rc = ns_ping(ip, seq, 2000, &rtt, &ttl); + sent++; + if (rc == 0) { + recv++; + sum += rtt; + if (rtt < min) min = rtt; + if (rtt > max) max = rtt; + term_puts("reply from "); + term_puts(ipstr); + term_puts(": bytes=32 time="); + char nb[12]; ns_u32_dec(nb, rtt); + term_puts(nb); + term_puts("ms TTL="); + ns_u32_dec(nb, ttl); + term_puts(nb); + term_putc('\n'); + } else if (rc == -1) { + term_puts_color("ARP 解析失败,目标不可达\n", DA_ERROR); + break; + } else { + term_puts_color("request timed out\n", DA_TEXT_DIM); + } + redraw_all(); } - u64 net_api = *(u64 *)((u64)g_ac.kernel_api + 0xC0); - if (!net_api) { - term_puts_color(" [错误] 需要 TCP/IP 栈支持\n", DA_ERROR); - term_puts_color(" 当前内核未实现 ICMP 协议栈。\n", DA_WARNING); - term_puts_color(" 请等待后续版本更新。\n", DA_TEXT_DIM); - term_putc('\n'); - term_puts_color("--- ", DA_TEXT_DIM); - term_puts_color(ip, DA_TEXT_DIM); - term_puts_color(" ping statistics ---\n", DA_TEXT_DIM); - term_puts_color(" 0 packets transmitted, 0 received, 100% packet loss\n", DA_ERROR); - return; + char nb[12]; + ns_u32_dec(nb, (u32)sent); + term_puts_color("--- ", DA_TEXT_DIM); + term_puts_color(ipstr, DA_TEXT_DIM); + term_puts_color(" ping statistics ---\n ", DA_TEXT_DIM); + term_puts(nb); + term_puts(" transmitted, "); + ns_u32_dec(nb, (u32)recv); + term_puts(nb); + term_puts(" received, "); + u32 loss = sent ? (u32)(sent - recv) * 100 / (u32)sent : 100; + ns_u32_dec(nb, loss); + term_puts(nb); + term_puts("% loss"); + if (recv > 0) { + term_puts(", min/avg/max = "); + ns_u32_dec(nb, min); term_puts(nb); term_puts("/"); + ns_u32_dec(nb, sum / (u32)recv); term_puts(nb); term_puts("/"); + ns_u32_dec(nb, max); term_puts(nb); term_puts(" ms"); } - - /* 如果有 net API,此处应实现真正的 ICMP Echo */ - term_puts_color(" [stub] 网络功能尚未实现\n", DA_WARNING); + term_putc('\n'); } /* ---- 内置命令 ---- */ @@ -183,8 +235,8 @@ static void cmd_help(void) { static void cmd_clear(void) { term_clear(); } static void cmd_version(void) { - term_puts_color("Deshab ping v0.1 (stub)\n", DA_SUCCESS); - term_puts_color(" ICMP Echo 功能需要 TCP/IP 栈支持\n", DA_TEXT_DIM); + term_puts_color("Deshab ping v1.0\n", DA_SUCCESS); + term_puts_color(" ICMP Echo via net_stack (e1000 + slirp)\n", DA_TEXT_DIM); } static void execute_command(const char *cmd) { @@ -246,10 +298,9 @@ void dsk_entry(const da_boot_context *ctx) { term_clear(); /* 启动 banner */ - term_puts_color("=== Deshab ping v0.1 (stub) ===\n", DA_ACCENT); + term_puts_color("=== Deshab ping v1.0 ===\n", DA_ACCENT); term_puts_color("ICMP Echo 请求工具\n", DA_SUCCESS); term_puts_color("输入 IP 地址发送 ping | 输入 'help' 查看帮助 | Esc 退出\n", DA_TEXT_DIM); - term_puts_color("注意: 当前需要 TCP/IP 栈支持\n", DA_WARNING); term_putc('\n'); redraw_all(); diff --git a/ISO/run_qemu.bat b/ISO/run_qemu.bat index 007935b..bb7c5dc 100644 --- a/ISO/run_qemu.bat +++ b/ISO/run_qemu.bat @@ -1,4 +1,4 @@ -@echo off +@echo off setlocal set "SCRIPT_DIR=%~dp0" diff --git a/Logo.png b/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f13ea0ecce0266d687a21587be959599ce7f20ec GIT binary patch literal 34538 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 literal 0 HcmV?d00001 diff --git a/SYSTEM/boot/utsm.elf b/SYSTEM/boot/utsm.elf index 49b8d3c22848a45167c077e5ddd6182b5e576e1e..fad5b5d5a755478bceb0754963ccb01db7f71e0e 100644 GIT binary patch delta 16881 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 delta 29945 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

6}a4eMA|tZ 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 Ru=USkFd$c&O^wF&{{f>RH#h(Q diff --git a/SYSTEM/driver/fs/fat32.drv b/SYSTEM/driver/fs/fat32.drv index be174251fc1563ea2d8be7c1f6735bcd4def0272..b9574a07285d87768f546d29288a1c5f4a890a86 100644 GIT binary patch delta 44 ycmaFh^uTGtLPmv&iyliW_;mjFuw`IkVBl{(%*ept(cQj+0Yo`yY+k^4Kpp^d0}l%T delta 44 ycmaFh^uTGtLPm*+iyli$_;mjFuw`IkVBl{(%*ept(cQj+0Yo_{Y+k^4Kpp^as}A!3 diff --git a/SYSTEM/driver/net/ath9k.drv b/SYSTEM/driver/net/ath9k.drv index b18300619efc61565dd4849540722ff59b2391ca..b07bec74264d123cfe3a35a3d6d15b0f1ebf5f99 100644 GIT binary patch literal 14760 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 diff --git a/SYSTEM/driver/net/e1000.drv b/SYSTEM/driver/net/e1000.drv index d507d64dd32b77a38d45f5b06a44f5dd299e5ed4..0fe2ab821729bcb167b6b191f45f9bcfc72480e3 100644 GIT binary patch literal 9992 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 diff --git a/SYSTEM/driver/net/virtio_net.drv b/SYSTEM/driver/net/virtio_net.drv index 1d8871be2e7a8f9d20e35359cc80e60da08cdc34..0e228d91df6d40c7e23759ea719c826060aa02f0 100644 GIT binary patch literal 13416 zcmbuF4{%$>nZTc8C$Wjsr}T2g?X{QJnG}+_#z-NA7;x*?Nc6e2n;Z$07J^T*BwJuh zLVto2$RQ)U_(f4-dfd?tWrm}jD{YT!I!sOIk&Bc+cDS2fLfgCMCUX-5X<`$|pW{yq z1a#lG?|ag|wU?N7XQa3L+i$vj z$|sb1Wlsr`F<4Ruo?4_RMsA(U7<^G3_PriVD!I!7@8U8-Ue)7 zE<_!>-KW;>e&AHg?#5Fss>k!9r!Z{p_Y_X8J=vm;oX4+1alE$fe7NbT`q+LW`|g4k z_3uVowEs3r#g@#6Rq2;hkCB^;s*JHQyp&v?*m z)+>7Hke>ZOQwNSi!DpV+i>DW?&DShJC7JNArs~gye|4$;jc|6Vl=|&gp~7nx7S=oJ z%%acpj?Z&aUE);~ulbI*Zqz)F^Woa7&mHZ5@2$@$N_t&!!e#EyzEbe!hm`ZB(%izi zQmOyF7MG%^zOnxI6v*hRx7h!mwVZX?}Y?xU@=rs2AuYTDWu|`@TyZeEUN%w$noEYbSrFqN{kjwV6+JV=I?B za-hxJ>xQiHyt~iMl3})ITK8Fbx4X^UHdLIbQAaW`AZ5rmoPAYQN3vGokx}1w1=S^& z-Bo^DrsUGqkweD6R#b1wOjD?5|Db}{;A~YIrlq9K95);z10@4XXRReSh$aAAmz1^~ zGlAZJTA7-!=yhYhx{F?OiY&u?Z4P=ty5cI`9M#Q(dhvCa*BsA|7xes&rRZ-x|L9V5 zc{6%k-;1&7RlTn@qu(Jj32GOj=PR1b1I3A2!(^i|k3slA-hjR^-vIeFkk{4cM!_ZI zAh2L&%r}G{3Xl1AxZTBx`m%p^dd>5oFgp%j%2>wO#ZV28h5_;A%R6#fr%dT*%bi&L zHtBX~)_3SD1?su%A4C~pGSe(6|ru7T9I3!GXV)}#uIVb#aqYV3P{kO_0NDrYy zD)SvSa?CaSglA{PHq+9zm~V>e(Ca+=cmV;QO=hj9#S?vt?HnM_mr@W-=YJ_qYO<9TQDd1$UKQ6PfKi#DBs)e5T? zT%&<~%5&QeU>Of`09-uSQQmO#+}ha*dD=90LH1#5>ch~`hx62dMRODdePZ7laih!MT$P=glQ?FwMrbBukG(Ps(>FBg8+IEeQ&slI z=R@nd!hI-3VRKJzg=UDw>tKKpk)!)zR zcX-V=i)UQy#+74M%0Iv=@;>t|*uv{+Q-U2F(olXItK8``-`0z7)Y8V0x9a|u)$Q_` z7xm(~8a;a&ce7nq-Gi)dnD*?C7dZMmqgCp_uRkc2ocp|G9dI-=g>O6L*ra_q$g%19 zAUX!we0+JxvBCRxLXHj9w+nJ?V7|(ZRk>SS-b<6efiXcq;*wst%CTg0v*3e!VCLi{ zbzlgV`WPD|+G5}5;mgQx%6N0X#QWyt6qMB^EfAJ0)UyTG7cK#!YA>Am$^qAA_EJok zMF@%VO5Bb`41zMrAwjp7$qpngp5&3#^JFKITAu7eQp1zkuX^)D$(7rSi^#eiz?}%s z1!loA%l*}GzBr-|B;g9%UjNH%)^!*76=sg|B{=BTrJuKM`zBM&*XrgWh{*;$-%?{4 zkhdHJ9)8yh7M(M=zzqb0}_W0NE|vKap-`=q4P(@ z%MLxew;N(|jymw;_e&*vqlsTCl`8uX+@{JuYJ9Y-|iuK8Pl zT5JusTjn>E@hTo~EMqs1Z!P05^7ytgUdH2Zmhn;^-(JQVkG};NcbM{BBmZq8{EZ`j z2SNVck-w85fBVR9BFNuC@^=yBZzA~)g8Y3X|2F_RXAk8!x#^mYK2#8}8WTDWD0;&x3Hv@Wd)LZwwcL;we}ba?~S?BoiH-;V$Kl&5=YZ z66=VDQk%43Xmg}9)a-CT|ZXg#5*&}kqIrgYfsEBY;3BpM9$30%Y0U8(M7 z#T!a?`vcBa8q5`(<wbD_DIjb3lr?VHZfzYp}&20K; zOzVvWLy4#+#ziEQyirRf{Ly3tmO#|sqqVLB$EUirP+vUMnF6~yW=5vB&8{Uno6+!! z#htPmdI(nwES`?ubWbW0?}>y&TP4#0itCDboO;6PDD>hOMlh1>jBO4jwrH_v&z2k6 zv?w&8ip8a~fu<$=_X$cg4OV|gYD-)Ux?my#y0t{eAKcsDXCrpX`Z42HtCiYCfn z{|n#)r!bZVB%J*WCs};H`ZbdKCmN`z=NaOt8|4Ee|AIswk3g7g`5+nQ630JbiLmcF zsz-UAUr8JXyjoIeFfXPfGZ+624!;j}jNh`Fl+iO6`VZw`yW&znE9eHIe8?ehTj`zeY1H#m8|-wp|nOZZj^ z|Bi$|BH=%f@P8&Q+WA>d9_?(eUZ--+N`4gNx>OVww zo{-3=ufSPNpVz|@{(TAmnS}3^@FNobvV@|B({zrxA${hpKX4o``#5>bevVm1Q4UMwPjd3S9WF}v6(odq=H)*p;cf|E zE8(|Ecu2yN#6>%7<>YZHe?jq(mB_!u$y1hD?o|nYTf*nVU#u{R_W87g|CNL{OL&`v zf19{y2R|o|b}-2fcT42&m+*%KJ^xF3o)P#kt@oEWj<=cu{4o&I|A_pP7N6ocZ+{j3 zMuADR=T#EkEa4j^{2mE^NW#A_;Xjk`f`tETmr3{y65b}^cS(3$!na9yj=1RG?{f0!-`~@GAD77gSm0!4T%s&tbJSyy zq3QU{o;xCc5rSQO$s4Y@rYn-_P6ry{mB=+cJ)5ns74S;tZg}jjg*#XI{lV)4*98OD!n>_iD?Pz* zlfP;8wb!q9Ul(ZV^k26c9?-7wELY~vt6N~tl=>AeIGh^g0{lzWnQ$+zQs~DrwMrc}+%i?6R%=*JNcAzwY?lXm14JMc}a%d@J`BxFCyjq?{|xCe=klYQ)Y z<$y1O@i&l)I9-*-RH!edG$uklemffr`cwYKWGdll^gse%ln#L#>l|vYq0@cZzqRN(L%uc z3if0B-S#)CN4^q1d|F2Bz9ob<%3`vwpQk)+i>wa6hOe};yUWDN*z3y1%ONw<_}72Y zl2}6>;rLNb9RF%!_I=lC1@@o`($6^?m)qOmM#x|n;{5IQ_P%4w+vB(A|8;8bwgu=q zw8F}S1#Y*quN$Ghx~&w0ONJLcOYP|~Yq`p9XM+G_M22;5QhQs@zKXI5s1SXJvQyOl uFf~{R4CgM|e=9K2_JEYaHTbP4JFH9jTkL-TYG!KRMh1PX+|tU3?f)M%6l8e- literal 12384 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 delta 6363 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 diff --git a/SYSTEM/system/deshab64/desktop.elf b/SYSTEM/system/deshab64/desktop.elf index e4ccfa533a48be27c652f1bba63e7a9367a8476c..56d3a31bd868f6079bc58012e3a5694817ff78ce 100644 GIT binary patch delta 18392 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 clg7$~bX0k4G#mE7t{%pR Ush=>JQAK>?fg60A1a61|0Kiuf*Z=?k delta 43 pcmccNeZzZ#1tZf$%XlFHMg}l|(F_8c6&dgIO*UXG-z0ED6adWj2`c~q diff --git a/SYSTEM/system/deshab64/network/netman.elf b/SYSTEM/system/deshab64/network/netman.elf index 62d1563cd61013f814c512ce018f3339c730f4c5..04bbd05015dd5c72c31869dbe21f667d8db0d4e4 100644 GIT binary patch delta 6974 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 F{};X!b_oCg delta 6044 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 diff --git a/SYSTEM/system/deshab64/shell.elf b/SYSTEM/system/deshab64/shell.elf index 4b6d81448ce624cd9401adb29f6264687d493e09..e0d0856b4a77cc372b11870ca44655da97905e89 100644 GIT binary patch literal 871648 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 literal 196632 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%0DQ5mh+nD$t<}T?!52^ego&VRwj{g|6jRpU+VEK~# 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 diff --git a/SYSTEM/system/deshab64/tools/bash.elf b/SYSTEM/system/deshab64/tools/bash.elf deleted file mode 100644 index 341d4c6fae4b9acf25d1cd7e23e5cc375e5e6630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117152 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 N*!b}|-zI?#69Bp04(I>? delta 43 zcmdmRkZHp~rU@3j%nS|;ybRn7j0_A6>=Rw{8QCXpHQubwc$06k0i*pUfejM?@wf}D diff --git a/SYSTEM/system/deshab64/tools/curl.elf b/SYSTEM/system/deshab64/tools/curl.elf index ec3da1c55f1e6d6dea3f077754f5c028a6449953..06063439a30d37514f56cfc59fb4f074490e6b50 100644 GIT binary patch delta 25189 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

p2~VG`GLMEJjuiCuTU&ZoDp9G{9XC9@rBtbN}Nn c3zJ>H$>-M7$zp=_zl%EK#f0?m=MCik55)p@rT_o{ diff --git a/SYSTEM/system/deshab64/tools/editor.elf b/SYSTEM/system/deshab64/tools/editor.elf index 2ab35c8e139423ababaff94dc7799db6a0fdb367..9cde1c89c5217e288a28f5c3e5660812cec80bf3 100644 GIT binary patch delta 88 zcmaE{f$hZxwh0!zEDR0|ybRn7j0_A6tP@@H8QCUoHP&PT@>qa4Vgg7Ulb!$;Wnh>v UJ#ZSM_$J01d`$w|1Q;_q0Of=by8r+H delta 42 ycmaE{f$hZxwh0!z%nS|;ybRn7j0_A6>=Rw{8QCXpHQp@VEy3R;uuXt5qXPi(w+jFO diff --git a/SYSTEM/system/deshab64/tools/fileman.elf b/SYSTEM/system/deshab64/tools/fileman.elf index ea25f321183e960b6adac9db65a16f903ad4b995..218dbabf54f10266ba15c128b64e163f1d2f013a 100644 GIT binary patch delta 84 zcmbR7iD||srU@3jEDR0|ybRn7j0_A6tP@@H8QCUoHP&PT@>qa4VIz>hLQjAQGfbGw PxLte`;|;z|0un0$s=Rw{8QCXpHQqeEM}mKofW%4w(3uLC diff --git a/SYSTEM/system/deshab64/tools/ping.elf b/SYSTEM/system/deshab64/tools/ping.elf index dc6f2f60fb0849612f31e062e8e2c01a0c91bd63..58159ff14935877213a50e22e1eff5c2508f49e9 100644 GIT binary patch delta 22300 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 HgM|MBBAexJ delta 14233 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 F{{dCnPB8!g diff --git a/SYSTEM/system/user/deshab/user.conf b/SYSTEM/system/user/deshab/user.conf index 623296b..527c47b 100644 --- a/SYSTEM/system/user/deshab/user.conf +++ b/SYSTEM/system/user/deshab/user.conf @@ -1,7 +1,14 @@ -# Deshab user configuration placeholder -# Runtime write is pending FAT32 write support. -version=1 -computerName= -username= -passwordSha256= -configEncrypted=0 +DESHAB_USERCONF_V1 +computer=DESHAB-PC +username=admin +passwordSha256=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 +locale=zh-CN +region=CN +timezone=Asia/Shanghai +keyboard=us-qwerty +theme=dark +network.mode=disabled +network.ssid= +network.password= +network.ip=dhcp +network.dns=auto diff --git a/SYSTEM/system/user/use/FirstInit.elf b/SYSTEM/system/user/use/FirstInit.elf index eb34a8481607cb5400230188539ced9623bb75d7..888cbba4c2de77907e0f08fc36c3e72abd0039b9 100644 GIT binary patch literal 160456 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 NiKoA#$(%O*e*-RYV_g6M delta 43527 zcmeFacYGAp`aeFC0s#XPBve5b0R;;XnuHL|!Y|H_3Zq~qk6-=n z{wkFa1m8QjUJJ@F=v`j*&Xgz<&GL7sAVjV2DIRT`HBh|wji@O5(@2q(hI(0z&lW?3 ziqlra(+^2$g{UOwP8c_CRLuPko8;I~DSZPaIY;-EmGJMR5DE@NFpmd^Bls;3CLp+# zf@*wT7}{J#ZK^}NAnffji#`3N9%(eJtRC$WTTTf@Ib=weORzZ5%6-^ts zSXMl;r*foK4PPD+B8-wYMv58gF=X+K;f``iPyE%NI3$pG+@ClwkocQF@yuq%XCycObFCpJ)gqRw7aHcq+T;!#SnLI|qt*^`z)P(rG;@Dv^FCeS~*v{7S{{sl?0Di3U|15+7X>ZglsfS4r-e|u#ZD~pA4X|1fJFV-k)=qQ#|#j~n- z)>M`i-ic+I3+41`>9sg;TUmWsvpQM2Q7JMy%3E4C*P<*QyQOEb)tOvqQ=jM-bI9A1 zc$$6IEFV`BWNo`m#J_ww_JWl5I~ZMVRav1XI~v8Lg|f0=_LN1){r1aBp4_Tl_M9># zwT#&%*VK5!Vs_QkY!=XazdTc7eHCh&W|uu{7B3q;rz4P3Mk(r@2}aLvVP^4)G4(eA zG;VJ7TcUjzv22q%(mhHIs})PoMIS-X1XHVuHptNA^djlC85lfza@0l4H)G8H0UH%l z)^Yl&pr6z9Q$;@)>8F-{E*q7wEZLD4VTs+9Tw+6GX`RrRMU8&b9HWg=!t9$ZT7fOL zF8N}m)(Bv$@gbThRBRtbLW9F!m2(kf@K)#L#%SJXPz;j;f>z+rBBeAtW)7IY6CNVi zR2ks!@DBv7&hBY=$;t(bwCF{ zTJ5&R<{70o3XFyVV~Qpw?_rB!any#)UnDCfd@)L}7}i$BzQwTAob!gq>@wDz`?ITI zZ@L_Ruo|05&Rdk7-Y6dg0NX~3qaehVt{J7(J8ZE>G3M{ghTn`SSH$EnKzNIszDr7r z2GniJWs9~0#lEw}9!9YpX2WT_G3BzDym^#j+7jknFZB?(6h$|JlgZQgqgi2s^vX&s z4&zf7GBuX2=awONzPEBAU%QA}tX*p(t=$?%JF3Hqj%CH{wmLV^5?a(Tzag4~g&tIg z!uDShuy*SEGS4eVUS>?SExkIIhG3D#<%0~}j6y+VYS=0{d?3XXbB0x!xysuyGqsT@ zMIF;l$+tRZu96(TL8q}g+pGvBY%mfwypABS;RW`ZlWCLIowA0`0Xk^jd)j3Z0*XId z9NIln8j+6dv}IbwI)(v7(i?e(yp(z|`GCIsbs_Wr#@GbWVqsR|q8|3dQmQt)_E~YC z=l6)j(lQ!Pw*=3xVdC!8Uy0IMH6#`hovG1oHLOG|^if%>{fx*q&m#m@PI@~BXiLVT z(&9>KqX>fOnzY(ujXf&8vEA@}N`sgj4)WRtWUZ5}nnzl_-5Ps9dc$KlkWwcm@1VRe z?>1sEeq!B3yu{+b_?Lj32&C57LMwD7X;k5#n2<>g1N$foGm0g~)H0fsu~ltiDVtTK zTa7FfOFiWgspXt`cw}dIIW$A86Noqb2!bHc0=!Jp#v*Cs6;EXpLZw#cwZ?iDoEQyFaDcS#Cr@R>7RD>TH!4TW(z


urQF*4HBK2fO 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�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 diff --git a/SYSTEM/system/user/use/firstInit.txt b/SYSTEM/system/user/use/firstInit.txt index 1874828..879cdec 100644 --- a/SYSTEM/system/user/use/firstInit.txt +++ b/SYSTEM/system/user/use/firstInit.txt @@ -1 +1,2 @@ 0 +1 \ No newline at end of file diff --git a/SYSTEM/system/user/use/login.elf b/SYSTEM/system/user/use/login.elf new file mode 100644 index 0000000000000000000000000000000000000000..92d708c72d7461957b53bcfea02984b9fa965d0d GIT binary patch literal 41392 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