From d905a5eaca3ce51ce73f4777056c4cc061d1b6cc Mon Sep 17 00:00:00 2001 From: ontim52 Date: Sat, 17 Jun 2023 18:41:49 +0800 Subject: [PATCH] fogor: kernel: 2nd tongxingda ili9883c TP bringup 1. add 2nd ili9883c TP code 2. add TP build. Change-Id: Iee5821d2b5f92be73c5184d5ac386afd559673e7 Signed-off-by: ontim52 Reviewed-on: https://gerrit.mot.com/2647002 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Jun Weng Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- .../chipone_tddi_v2_mmi/Android.mk | 8 + .../touchscreen/chipone_tddi_v2_mmi/Kbuild | 6 + .../touchscreen/chipone_tddi_v2_mmi/Makefile | 3 + .../chipone_tddi_v2_mmi/cts_driver.c | 22 + .../touchscreen/ilitek_v3_mmi/Android.mk | 65 + .../input/touchscreen/ilitek_v3_mmi/Kbuild | 63 + .../input/touchscreen/ilitek_v3_mmi/Makefile | 13 + .../firmware/FW_TDDI_TRUNK_FB.ili | 8194 +++++++++++++++++ .../ilitek_v3_mmi/firmware/ilitek_v3_fw.h | 91 + .../touchscreen/ilitek_v3_mmi/ilitek_v3.c | 1713 ++++ .../touchscreen/ilitek_v3_mmi/ilitek_v3.h | 1674 ++++ .../ilitek_v3_mmi/ilitek_v3_flash.c | 1905 ++++ .../ilitek_v3_mmi/ilitek_v3_hostdl.c | 1105 +++ .../touchscreen/ilitek_v3_mmi/ilitek_v3_i2c.c | 504 + .../touchscreen/ilitek_v3_mmi/ilitek_v3_ic.c | 3021 ++++++ .../touchscreen/ilitek_v3_mmi/ilitek_v3_mp.c | 4641 ++++++++++ .../touchscreen/ilitek_v3_mmi/ilitek_v3_mtk.c | 518 ++ .../ilitek_v3_mmi/ilitek_v3_node.c | 4207 +++++++++ .../ilitek_v3_mmi/ilitek_v3_qcom.c | 1085 +++ .../touchscreen/ilitek_v3_mmi/ilitek_v3_spi.c | 910 ++ .../ilitek_v3_mmi/ilitek_v3_touch.c | 2389 +++++ 21 files changed, 32137 insertions(+) create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/Android.mk create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/Kbuild create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/Makefile create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/firmware/FW_TDDI_TRUNK_FB.ili create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/firmware/ilitek_v3_fw.h create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3.h create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_flash.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_hostdl.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_i2c.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_ic.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_mp.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_mtk.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_node.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_qcom.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_spi.c create mode 100644 drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_touch.c diff --git a/drivers/input/touchscreen/chipone_tddi_v2_mmi/Android.mk b/drivers/input/touchscreen/chipone_tddi_v2_mmi/Android.mk index 5ee633d83a3b..53c67ef0ba99 100644 --- a/drivers/input/touchscreen/chipone_tddi_v2_mmi/Android.mk +++ b/drivers/input/touchscreen/chipone_tddi_v2_mmi/Android.mk @@ -22,6 +22,10 @@ ifneq ($(MOTO_PANEL_CHECK_TOUCH_STATE),) KERNEL_CFLAGS += CONFIG_INPUT_CHIPONE_0FLASH_MMI_NOTIFY_TOUCH_STATE=y endif +ifneq ($(findstring touchscreen_mmi.ko,$(BOARD_VENDOR_KERNEL_MODULES)),) + KBUILD_OPTIONS += CONFIG_INPUT_TOUCHSCREEN_MMI=y + endif + include $(CLEAR_VARS) ifneq ($(BOARD_USES_DOUBLE_TAP),) LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/sensors_class.ko @@ -29,4 +33,8 @@ endif LOCAL_MODULE := chipone_tddi_v2_mmi.ko LOCAL_MODULE_TAGS := optional LOCAL_MODULE_PATH := $(CHIPONE_MMI_MODULE_PATH) +LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/mmi_info.ko +ifneq ($(findstring touchscreen_mmi.ko,$(BOARD_VENDOR_KERNEL_MODULES)),) + LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/touchscreen_mmi.ko +endif include $(DLKM_DIR)/AndroidKernelModule.mk diff --git a/drivers/input/touchscreen/chipone_tddi_v2_mmi/Kbuild b/drivers/input/touchscreen/chipone_tddi_v2_mmi/Kbuild index bfcee448988c..f5fd45e08593 100644 --- a/drivers/input/touchscreen/chipone_tddi_v2_mmi/Kbuild +++ b/drivers/input/touchscreen/chipone_tddi_v2_mmi/Kbuild @@ -21,6 +21,10 @@ ifneq ($(filter m y,$(CONFIG_INPUT_CHIPONE_PANEL_NOTIFICATIONS)),) EXTRA_CFLAGS += -DCHIPONE_CONFIG_PANEL_NOTIFICATIONS endif +ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_MMI)),) + EXTRA_CFLAGS += -DCONFIG_INPUT_TOUCHSCREEN_MMI +endif + #obj-$(CONFIG_TOUCHSCREEN_CHIPONE) += chipone-tddi.o obj-m += chipone_tddi_v2_mmi.o @@ -38,3 +42,5 @@ chipone_tddi_v2_mmi-objs += cts_tool.o chipone_tddi_v2_mmi-objs += cts_sysfs.o chipone_tddi_v2_mmi-objs += cts_strerror.o chipone_tddi_v2_mmi-objs += cts_oem.o +KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../touchscreen_mmi/$(GKI_OBJ_MODULE_DIR)/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../../../mmi_info/$(GKI_OBJ_MODULE_DIR)/Module.symvers diff --git a/drivers/input/touchscreen/chipone_tddi_v2_mmi/Makefile b/drivers/input/touchscreen/chipone_tddi_v2_mmi/Makefile index 4191dea22679..14bfd106b983 100644 --- a/drivers/input/touchscreen/chipone_tddi_v2_mmi/Makefile +++ b/drivers/input/touchscreen/chipone_tddi_v2_mmi/Makefile @@ -8,3 +8,6 @@ modules_install: clean: $(MAKE) -C $(KERNEL_SRC) M=$(PWD) clean + +KBUILD_EXTRA_SYMBOLS += $(M)/../../../mmi_info/$(GKI_OBJ_MODULE_DIR)/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(M)/../touchscreen_mmi/$(GKI_OBJ_MODULE_DIR)/Module.symvers diff --git a/drivers/input/touchscreen/chipone_tddi_v2_mmi/cts_driver.c b/drivers/input/touchscreen/chipone_tddi_v2_mmi/cts_driver.c index 69049a3a63a6..21acb4c0728d 100644 --- a/drivers/input/touchscreen/chipone_tddi_v2_mmi/cts_driver.c +++ b/drivers/input/touchscreen/chipone_tddi_v2_mmi/cts_driver.c @@ -1,3 +1,16 @@ +/* + * Copyright (C) 2023 Motorola Mobility LLC + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifdef CONFIG_CTS_I2C_HOST #define LOG_TAG "I2CDrv" #else @@ -11,6 +24,9 @@ #include "cts_charger_detect.h" #include "cts_earjack_detect.h" #include "cts_oem.h" +#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) +#include +#endif static void cts_resume_work_func(struct work_struct *work); #ifdef CFG_CTS_DRM_NOTIFIER @@ -356,6 +372,12 @@ static int cts_driver_probe(struct spi_device *client) { struct device_node *dp = client->dev.of_node; +#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) + if (client->dev.of_node && !mmi_device_is_available(client->dev.of_node)) { + cts_err("%s : mmi: device not supported\n", __func__); + return -ENODEV; + } +#endif if (check_dt(dp)) { if (!check_default_tp(dp, "qcom,i2c-touch-active")) ret = -EPROBE_DEFER; diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/Android.mk b/drivers/input/touchscreen/ilitek_v3_mmi/Android.mk new file mode 100644 index 000000000000..7bfa956fefd2 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/Android.mk @@ -0,0 +1,65 @@ +DLKM_DIR := motorola/kernel/modules +LOCAL_PATH := $(call my-dir) + +ifneq ($(BOARD_USES_DOUBLE_TAP),) + KERNEL_CFLAGS += CONFIG_INPUT_ILI_ENABLE_DOUBLE_TAP=y +endif + +ifeq ($(BOARD_USES_DOUBLE_TAP_CTRL),true) + KERNEL_CFLAGS += CONFIG_BOARD_USES_DOUBLE_TAP_CTRL=y +endif + +ifneq ($(CONFIG_INPUT_SET_TOUCH_STATE),) + KERNEL_CFLAGS += CONFIG_INPUT_ILI_SET_TOUCH_STATE=y +endif + +ifneq ($(BOARD_USES_PANEL_NOTIFICATIONS),) + KERNEL_CFLAGS += CONFIG_INPUT_ILI_PANEL_NOTIFICATIONS=y +endif + +ifneq ($(BOARD_USES_MTK_CHECK_PANEL),) + KERNEL_CFLAGS += CONFIG_ILITEK_MTK_CHECK_PANEL=y +endif + +ifeq ($(ILITEK_MULTI_TP_MODULE),true) + KERNEL_CFLAGS += CONFIG_ILITEK_MULTI_TP_MODULE=y +endif + +ifneq ($(ILITEK_RESUME_BY_DDI),) + KERNEL_CFLAGS += CONFIG_ILITEK_RESUME_BY_DDI=y +endif + +ifeq ($(CONFIG_INPUT_CHARGER_DETECTION),true) + KERNEL_CFLAGS += CONFIG_ILITEK_CHARGER=y +endif + +ifeq ($(ILITEK_ESD),true) + KERNEL_CFLAGS += CONFIG_ILITEK_ESD=y +endif + +ifeq ($(ILITEK_GESTURE),true) + KERNEL_CFLAGS += CONFIG_ILITEK_GESTURE=y +endif + +ifeq ($(TOUCHSCREEN_LAST_TIME),true) + KERNEL_CFLAGS += CONFIG_ILI_TOUCH_LAST_TIME=y +endif + +ifneq ($(findstring touchscreen_mmi.ko,$(BOARD_VENDOR_KERNEL_MODULES)),) + KBUILD_OPTIONS += CONFIG_INPUT_TOUCHSCREEN_MMI=y + endif + +include $(CLEAR_VARS) +ifneq ($(BOARD_USES_DOUBLE_TAP),) +LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/sensors_class.ko +LOCAL_REQUIRED_MODULES := sensors_class.ko +endif +LOCAL_MODULE := ilitek_v3_mmi.ko +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) +KBUILD_OPTIONS_GKI += GKI_OBJ_MODULE_DIR=gki +LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/mmi_info.ko +ifneq ($(findstring touchscreen_mmi.ko,$(BOARD_VENDOR_KERNEL_MODULES)),) + LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/touchscreen_mmi.ko +endif +include $(DLKM_DIR)/AndroidKernelModule.mk diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/Kbuild b/drivers/input/touchscreen/ilitek_v3_mmi/Kbuild new file mode 100644 index 000000000000..e0947969d105 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/Kbuild @@ -0,0 +1,63 @@ +# add -Wall to try to catch everything we can. +EXTRA_CFLAGS += -Wall +EXTRA_CFLAGS += -I$(ANDROID_BUILD_TOP)/motorola/kernel/modules/include \ + -I$(ANDROID_BUILD_TOP)/motorola/kernel/modules/drivers/input/touchscreen/ilitek_v3_mmi \ + -I$(ANDROID_BUILD_TOP)/motorola/kernel/modules/drivers/input/touchscreen/ilitek_v3_mmi/firmware + +ifeq ($(filter m y, $(CONFIG_TOUCHSCREEN_ILITEK_CHIPSET)),) + obj-m += ilitek_v3_mmi.o +endif + +ifneq ($(filter m y,$(CONFIG_INPUT_ILI_ENABLE_DOUBLE_TAP)),) + EXTRA_CFLAGS += -DILI_SENSOR_EN + KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../../../sensors/$(GKI_OBJ_MODULE_DIR)/Module.symvers +endif + +ifneq ($(filter m y, $(CONFIG_BOARD_USES_DOUBLE_TAP_CTRL)),) + EXTRA_CFLAGS += -DILI_DOUBLE_TAP_CTRL + EXTRA_CFLAGS += -DILI_PRIMARY_NODE +endif + +ifneq ($(filter m y,$(CONFIG_INPUT_ILI_SET_TOUCH_STATE)),) + EXTRA_CFLAGS += -DILI_SET_TOUCH_STATE +endif + +ifneq ($(filter m y,$(CONFIG_INPUT_ILI_PANEL_NOTIFICATIONS)),) +EXTRA_CFLAGS += -DILI_CONFIG_PANEL_NOTIFICATIONS +endif +ifneq ($(filter m y,$(CONFIG_ILITEK_RESUME_BY_DDI)),) +EXTRA_CFLAGS += -DILI_CONFIG_RESUME_BY_DDI +endif +ifneq ($(filter m y,$(CONFIG_ILITEK_CHARGER)),) +EXTRA_CFLAGS += -DILI_CONFIG_MTK_CHARGER +endif +ifneq ($(filter m y,$(CONFIG_ILITEK_ESD)),) +EXTRA_CFLAGS += -DILI_CONFIG_ESD +endif + +ifneq ($(filter m y,$(CONFIG_ILITEK_MTK_CHECK_PANEL)),) + EXTRA_CFLAGS += -DILI_MTK_CHECK_PANEL +endif + +ifneq ($(filter m y,$(CONFIG_ILITEK_MULTI_TP_MODULE)),) + EXTRA_CFLAGS += -DILI_TP_MODULE_EN +endif + +ifneq ($(filter m y,$(CONFIG_ILI_TOUCH_LAST_TIME)),) + EXTRA_CFLAGS += -DILI_TOUCH_LAST_TIME +endif + +ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_MMI)),) + EXTRA_CFLAGS += -DCONFIG_INPUT_TOUCHSCREEN_MMI +endif + +ilitek_v3_mmi-objs += ilitek_v3.o +ilitek_v3_mmi-objs += ilitek_v3_spi.o +ilitek_v3_mmi-objs += ilitek_v3_qcom.o +ilitek_v3_mmi-objs += ilitek_v3_ic.o +ilitek_v3_mmi-objs += ilitek_v3_touch.o +ilitek_v3_mmi-objs += ilitek_v3_mp.o +ilitek_v3_mmi-objs += ilitek_v3_hostdl.o +ilitek_v3_mmi-objs += ilitek_v3_node.o +KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../touchscreen_mmi/$(GKI_OBJ_MODULE_DIR)/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../../../mmi_info/$(GKI_OBJ_MODULE_DIR)/Module.symvers diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/Makefile b/drivers/input/touchscreen/ilitek_v3_mmi/Makefile new file mode 100644 index 000000000000..14bfd106b983 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/Makefile @@ -0,0 +1,13 @@ +KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build + +all: + $(MAKE) -C $(KERNEL_SRC) M=$(shell pwd) modules $(KBUILD_OPTIONS) + +modules_install: + $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(shell pwd) modules_install + +clean: + $(MAKE) -C $(KERNEL_SRC) M=$(PWD) clean + +KBUILD_EXTRA_SYMBOLS += $(M)/../../../mmi_info/$(GKI_OBJ_MODULE_DIR)/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(M)/../touchscreen_mmi/$(GKI_OBJ_MODULE_DIR)/Module.symvers diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/firmware/FW_TDDI_TRUNK_FB.ili b/drivers/input/touchscreen/ilitek_v3_mmi/firmware/FW_TDDI_TRUNK_FB.ili new file mode 100644 index 000000000000..49ecb8dd561c --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/firmware/FW_TDDI_TRUNK_FB.ili @@ -0,0 +1,8194 @@ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x02,0x00,0x00, +0x1F,0x05,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x00,0x00,0x01,0x0F,0xFF,0x01,0x10,0x00,0x01,0x1F,0xFF,0x01,0xE0,0x00,0x01,0xFF,0xFF,0x01,0x20,0x00,0x01,0xAF,0xFF, +0x48,0x00,0x66,0xD4,0x48,0x00,0x65,0x14,0x48,0x00,0x65,0x32,0x48,0x00,0x65,0x50, +0x48,0x00,0x65,0x6E,0x48,0x00,0x65,0x8C,0x48,0x00,0x65,0xAA,0x48,0x00,0x65,0xC8, +0x48,0x00,0x65,0xE6,0x48,0x00,0x66,0x3C,0x48,0x00,0x66,0x3E,0x48,0x00,0x66,0x40, +0x48,0x00,0x66,0x42,0x48,0x00,0x66,0x44,0x48,0x00,0x66,0x46,0x48,0x00,0x66,0x48, +0x48,0x00,0x66,0x4A,0x48,0x00,0x66,0x4C,0x48,0x00,0x66,0x4E,0x48,0x00,0x66,0x50, +0x48,0x00,0x66,0x52,0x48,0x00,0x66,0x54,0x48,0x00,0x66,0x56,0x48,0x00,0x66,0x58, +0x48,0x00,0x66,0x5A,0x48,0x00,0x66,0x5C,0x48,0x00,0x66,0x5E,0x48,0x00,0x66,0x60, +0x48,0x00,0x66,0x62,0x48,0x00,0x66,0x64,0x48,0x00,0x66,0x66,0x48,0x00,0x66,0x68, +0x48,0x00,0x66,0x6A,0x48,0x00,0x66,0x6C,0x48,0x00,0x66,0x6E,0x48,0x00,0x66,0x70, +0x48,0x00,0x66,0x72,0x48,0x00,0x66,0x75,0x48,0x00,0x66,0x78,0x48,0x00,0x66,0x7B, +0x48,0x00,0x66,0x7E,0x86,0xCE,0x00,0x00,0x88,0xCE,0x00,0x00,0x9C,0xCE,0x00,0x00, +0xAE,0xCE,0x00,0x00,0xBC,0xCE,0x00,0x00,0xD4,0xCE,0x00,0x00,0xE2,0xCE,0x00,0x00, +0x1A,0xCF,0x00,0x00,0x22,0xCF,0x00,0x00,0x38,0xCF,0x00,0x00,0x5C,0xCF,0x00,0x00, +0xA6,0xCF,0x00,0x00,0xA8,0xCF,0x00,0x00,0xB0,0xCF,0x00,0x00,0xB8,0xCF,0x00,0x00, +0xC0,0xCF,0x00,0x00,0xFA,0xCF,0x00,0x00,0xFC,0xD0,0x00,0x00,0x90,0xD1,0x00,0x00, +0xA6,0xD1,0x00,0x00,0xCE,0xD2,0x00,0x00,0xE6,0xD3,0x00,0x00,0x52,0xD4,0x00,0x00, +0x54,0xD4,0x00,0x00,0x56,0xD4,0x00,0x00,0x58,0xD4,0x00,0x00,0x5A,0xD4,0x00,0x00, +0x5C,0xD4,0x00,0x00,0x5E,0xD4,0x00,0x00,0x60,0xD4,0x00,0x00,0x62,0xD4,0x00,0x00, +0x64,0xD4,0x00,0x00,0xE6,0x28,0xE8,0x4C,0x96,0x06,0x46,0x20,0x00,0x81,0x44,0xF0, +0x01,0x3C,0x38,0x17,0x84,0x00,0x40,0xF0,0xBC,0x00,0xDD,0x0F,0x08,0x16,0x24,0x32, +0x40,0x4E,0x5C,0x6A,0x40,0x00,0x40,0x08,0x04,0x31,0x00,0x29,0x44,0x1E,0xFF,0xFF, +0xD5,0x33,0x40,0x00,0x44,0x08,0x04,0x31,0x00,0x29,0x44,0x1D,0xFF,0xFF,0xD5,0x2C, +0x40,0x00,0x48,0x08,0x04,0x31,0x00,0x29,0x44,0x1B,0xFF,0xFF,0xD5,0x25,0x40,0x00, +0x4C,0x08,0x04,0x31,0x00,0x29,0x46,0x1F,0xFF,0x7F,0xD5,0x1C,0x40,0x00,0x50,0x08, +0x04,0x31,0x00,0x29,0x46,0x1F,0xFE,0xFF,0xD5,0x15,0x40,0x00,0x54,0x08,0x04,0x31, +0x00,0x29,0x46,0x1F,0xFD,0xFF,0xD5,0x0E,0x40,0x00,0x58,0x08,0x04,0x31,0x00,0x29, +0x46,0x1F,0xFB,0xFF,0xD5,0x07,0x40,0x00,0x5C,0x08,0x04,0x31,0x00,0x29,0x46,0x1F, +0xF7,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x29,0xDD,0x9E, +0x44,0x24,0x80,0x90,0x96,0x06,0xB4,0x62,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF, +0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x46,0x10,0x00,0x82,0xA0,0x0A,0x58,0x00, +0x00,0x01,0xA8,0x0A,0xDD,0x9E,0x46,0x20,0x00,0x82,0x96,0x06,0xA0,0xD5,0x40,0x10, +0x40,0x08,0x44,0x0E,0xFF,0xFF,0xFE,0x1E,0xFE,0x0F,0xA8,0x15,0xDD,0x9E,0x46,0x00, +0x00,0x82,0xA0,0x05,0x92,0x10,0x96,0x06,0xDD,0x9E,0xFC,0x40,0x46,0x60,0x00,0x81, +0x96,0x2F,0x40,0x90,0x20,0x08,0x04,0x03,0x00,0x2A,0x44,0x7F,0xC0,0xFF,0xFE,0x3E, +0x40,0x00,0x24,0x04,0x14,0x03,0x00,0x2A,0x96,0x6F,0x40,0x90,0xC0,0x08,0x46,0x0F, +0xFC,0x0F,0x04,0x13,0x00,0x2A,0x50,0x00,0x0F,0xFF,0xFE,0x46,0x40,0x10,0xA4,0x04, +0x14,0x13,0x00,0x2A,0x96,0xAF,0x04,0x93,0x00,0x2A,0x40,0x11,0x60,0x08,0x46,0x2C, +0x0F,0xFF,0x50,0x21,0x0F,0xFF,0x40,0x24,0x88,0x02,0xFE,0x8F,0x14,0x23,0x00,0x2A, +0x04,0x13,0x00,0x2B,0x96,0xEF,0x92,0x26,0x94,0x4E,0xFE,0x5F,0x14,0x13,0x00,0x2B, +0x97,0x2F,0x40,0x12,0x20,0x08,0x04,0x43,0x00,0x2B,0x97,0x6F,0xFF,0x3E,0xFF,0x0F, +0x14,0x43,0x00,0x2B,0x04,0x13,0x00,0x2B,0x40,0x52,0xC0,0x08,0xFE,0x0E,0xFE,0x2F, +0x14,0x03,0x00,0x2B,0x49,0x00,0x04,0x80,0x00,0x0F,0x80,0x20,0x54,0x10,0x00,0x3F, +0x04,0x03,0x03,0x98,0x92,0x06,0x94,0x06,0xFE,0x0F,0x14,0x03,0x03,0x98,0x00,0x0F, +0x80,0x24,0x04,0x23,0x03,0x99,0x96,0x2F,0x94,0x46,0x44,0x0F,0xF0,0x3F,0xFE,0x16, +0xFE,0x0F,0x14,0x03,0x03,0x99,0x49,0x00,0x04,0x60,0xFC,0xC0,0x46,0x30,0x00,0x82, +0x44,0x41,0x00,0x00,0xB4,0xA3,0x54,0x10,0x87,0xFF,0xFF,0x2F,0xB6,0x83,0xB4,0x83, +0x94,0x92,0x92,0x8B,0x40,0x42,0x2C,0x08,0xFF,0x0F,0xB6,0x83,0x88,0x40,0x4C,0x01, +0x00,0x05,0xA0,0x59,0xAA,0x41,0xD5,0xFC,0xB4,0x23,0x44,0x0E,0xFF,0xFF,0xFE,0x0E, +0xB6,0x03,0xDD,0x9E,0x46,0x30,0x00,0x82,0x44,0x41,0x00,0x00,0xB4,0xA3,0x54,0x10, +0x87,0xFF,0xFF,0x2F,0xB6,0x83,0xB4,0x83,0x94,0x92,0x92,0x8B,0x40,0x42,0x2C,0x08, +0xFF,0x0F,0xB6,0x83,0x88,0x40,0x80,0x23,0x4C,0x01,0x00,0x05,0xA3,0x01,0xA9,0x09, +0xD5,0xFC,0xB4,0x23,0x44,0x0E,0xFF,0xFF,0xFE,0x0E,0xB6,0x03,0xDD,0x9E,0xFC,0x00, +0x46,0x50,0x00,0x80,0x46,0x3F,0xFF,0x00,0x9D,0x99,0x9D,0x2E,0x94,0xA9,0x88,0x40, +0x38,0x11,0x18,0x00,0x38,0x21,0x0C,0x00,0x94,0x4C,0xFE,0x57,0x96,0x48,0x18,0x12, +0x80,0x01,0xDC,0xF5,0xFC,0x80,0xFC,0x00,0x46,0x10,0x00,0x80,0x46,0x2F,0xFE,0xFF, +0x50,0x50,0x80,0x08,0x50,0x61,0x0F,0xF1,0x50,0x41,0x0F,0xF0,0x50,0x30,0x80,0x0E, +0x94,0xA9,0x88,0x40,0x38,0x11,0x18,0x00,0x38,0x21,0x10,0x00,0x94,0x4C,0xFE,0x57, +0x96,0x48,0x18,0x12,0x80,0x01,0xDB,0xF5,0xFC,0x80,0x46,0x20,0x00,0x80,0x84,0x7E, +0x50,0x51,0x01,0xC4,0xB4,0x85,0x96,0x06,0xFE,0xE6,0xFE,0x1F,0xB6,0x05,0x96,0x57, +0xB4,0x65,0x40,0x00,0xA0,0x08,0x44,0x1F,0xF8,0xFF,0xFE,0x5E,0xFE,0x47,0xB6,0x25, +0xDD,0x9E,0x46,0x20,0x00,0x81,0x40,0x00,0x40,0x08,0x04,0x11,0x00,0x11,0x96,0x49, +0xFE,0x0F,0x14,0x01,0x00,0x11,0xDD,0x9E,0x46,0x20,0x00,0x81,0x40,0x00,0x40,0x08, +0x04,0x11,0x00,0x10,0x96,0x49,0xFE,0x0F,0x14,0x01,0x00,0x10,0xDD,0x9E,0x46,0x20, +0x00,0x81,0x04,0x11,0x00,0x10,0x92,0x30,0x40,0x10,0xC0,0x08,0xFE,0x0F,0x14,0x01, +0x00,0x10,0xDD,0x9E,0x46,0x20,0x00,0x81,0x04,0x11,0x00,0x11,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x0F,0x14,0x01,0x00,0x11,0xDD,0x9E,0x46,0x20,0x00,0x81,0x84,0x30, +0x04,0x31,0x00,0x12,0x96,0x1F,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E, +0x46,0x20,0x00,0x80,0x84,0x30,0x04,0x31,0x00,0x70,0x96,0x1F,0xFE,0x5E,0xFE,0x0F, +0x14,0x01,0x00,0x70,0xDD,0x9E,0x46,0x20,0x00,0x81,0x84,0x3E,0x04,0x31,0x00,0x13, +0x96,0x06,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x13,0xDD,0x9E,0x46,0x20,0x00,0x81, +0x96,0x06,0x04,0x31,0x00,0x12,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF,0xFE,0x1E, +0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E,0x46,0x20,0x00,0x81,0x96,0x0F,0x40,0x10, +0x48,0x08,0x04,0x31,0x00,0x12,0x46,0x0F,0xFF,0x3F,0x50,0x00,0x0F,0xFF,0xFE,0x1E, +0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E,0x46,0x00,0x00,0x81,0x04,0x00,0x00,0x12, +0x92,0x12,0x96,0x0F,0xDD,0x9E,0x44,0x14,0x80,0x10,0xB4,0x01,0x92,0x0D,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x11,0xFA,0x50,0xAE,0x80,0xB4,0x01,0x92,0x0E,0x96,0x06, +0xC0,0x06,0x44,0x04,0x80,0x11,0x44,0x10,0x00,0x40,0xAE,0x40,0x44,0x14,0x80,0x10, +0xB4,0x01,0x92,0x0F,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x11,0x44,0x2F,0xFF,0x80, +0xAE,0x80,0xB4,0x01,0x92,0x09,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x11,0x84,0x22, +0xAE,0x40,0x44,0x14,0x80,0x10,0xB4,0x01,0x92,0x0C,0x96,0x06,0xC0,0x05,0x44,0x04, +0x80,0x11,0xFA,0x40,0xAE,0x80,0xB4,0x01,0x92,0x17,0x96,0x06,0xC0,0x06,0x44,0x04, +0x80,0x12,0x44,0x1F,0xFF,0x80,0xAE,0x40,0xDD,0x9E,0x00,0x00,0x46,0x10,0x00,0x81, +0x04,0x30,0x80,0x39,0xC0,0x0B,0x5A,0x00,0x01,0x0D,0x5A,0x00,0x02,0x0E,0x84,0x40, +0x5A,0x08,0x03,0x0D,0x46,0x23,0xF3,0xC0,0xD5,0x09,0x46,0x23,0x00,0x00,0xD5,0x06, +0x46,0x23,0x51,0x40,0xD5,0x03,0x46,0x23,0xA2,0x80,0x46,0x1C,0x0C,0x3F,0x50,0x10, +0x8F,0xFF,0x40,0x01,0x84,0x02,0x46,0x10,0x00,0x81,0xFE,0x17,0x14,0x00,0x80,0x39, +0xDD,0x9E,0x46,0x20,0x00,0x81,0x96,0x0F,0x40,0x10,0x58,0x08,0x04,0x31,0x00,0x39, +0x46,0x0F,0xF3,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x39, +0xDD,0x9E,0x46,0x10,0x00,0x81,0x04,0x30,0x80,0x39,0xC0,0x11,0x5A,0x00,0x01,0x09, +0x5A,0x00,0x02,0x0A,0x5A,0x08,0x03,0x0B,0x44,0x03,0xFF,0xC0,0xD5,0x08,0x44,0x01, +0x55,0x40,0xD5,0x05,0x44,0x02,0xAA,0x80,0xD5,0x02,0x84,0x00,0x44,0x23,0xFF,0xC0, +0x44,0x1C,0x00,0x3F,0xFE,0x5E,0xFE,0x16,0xFE,0x0F,0x46,0x10,0x00,0x81,0x14,0x00, +0x80,0x39,0xDD,0x9E,0x46,0x20,0x00,0x81,0x96,0x0F,0x04,0x31,0x00,0x39,0x40,0x10, +0x28,0x08,0x44,0x0F,0xF3,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x39,0xDD,0x9E, +0x46,0x20,0x00,0x81,0x46,0x31,0x55,0x10,0x50,0x31,0x84,0x40,0x50,0x51,0x00,0xE4, +0xB4,0x25,0xA8,0xE9,0xA1,0x2A,0x84,0x78,0xFE,0xE6,0xE6,0x05,0xA8,0xEA,0xE8,0x3A, +0x44,0xF0,0x06,0x10,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00,0x4A,0x00,0x3C,0x00, +0x06,0x1C,0x28,0x3E,0x54,0x00,0x46,0x03,0xA3,0x2A,0x92,0x26,0x50,0x00,0x03,0x00, +0x94,0x4E,0x14,0x01,0x00,0x38,0x58,0x10,0x80,0x3A,0xD5,0x22,0x84,0x00,0x92,0x26, +0x14,0x01,0x00,0x38,0x94,0x4E,0xD5,0x1C,0x46,0x05,0x55,0x55,0x92,0x26,0x50,0x00, +0x05,0x55,0x94,0x4E,0x14,0x01,0x00,0x38,0x58,0x10,0x80,0x15,0xD5,0x11,0x46,0x0A, +0xAA,0xAA,0x92,0x26,0x50,0x00,0x0A,0xAA,0x94,0x4E,0x14,0x01,0x00,0x38,0x58,0x10, +0x80,0x2A,0xD5,0x06,0x84,0x1F,0x14,0x01,0x00,0x38,0x58,0x10,0x80,0x3F,0x14,0x11, +0x00,0x39,0xDD,0x9E,0xDD,0x9E,0x44,0x24,0x50,0x00,0x96,0x06,0xB4,0x62,0x94,0x42, +0x84,0x1B,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x04,0x50,0x28,0xB4,0x00, +0x92,0x04,0x96,0x06,0xDD,0x9E,0x92,0x00,0x46,0x20,0x00,0x83,0x84,0x3C,0x04,0x31, +0x00,0x10,0x96,0x0F,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x10,0xDD,0x9E,0x46,0x20, +0x00,0x83,0x96,0x06,0x04,0x31,0x00,0x10,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF, +0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x10,0xDD,0x9E,0xFC,0x40,0x46,0x20,0x00,0x83, +0x44,0x5F,0xFE,0xFF,0x83,0x82,0xBB,0x18,0x46,0x40,0x0F,0x03,0xFE,0xEE,0xBB,0x98, +0xBB,0x18,0x50,0x42,0x0C,0x0F,0x92,0x68,0x40,0x31,0xA0,0x08,0x58,0x31,0x80,0x46, +0xBB,0x98,0xBF,0x39,0xBE,0x3A,0x04,0x91,0x00,0x3B,0xFF,0xE6,0xFF,0xA6,0x40,0x44, +0x90,0x02,0x04,0x90,0x80,0x02,0xBB,0x3C,0xB5,0x41,0x89,0x24,0xA1,0x0B,0x96,0xDF, +0x88,0xEA,0x04,0xA0,0x80,0x01,0x98,0x5C,0xBB,0x18,0x88,0xCA,0x58,0x31,0x81,0x00, +0xBB,0x98,0xBB,0x18,0x92,0x68,0x40,0x31,0xA0,0x08,0x58,0x31,0x80,0x46,0xBB,0x98, +0xBF,0xB9,0xBE,0xBA,0x14,0x91,0x00,0x3B,0x96,0xC9,0xB9,0x3C,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x5F,0xB9,0xBC,0xB4,0x20,0xB9,0xB9,0xA0,0x41,0xB9,0xBA,0xA0,0x42, +0xB9,0xBB,0xA4,0x46,0xB8,0x3C,0x92,0x10,0x40,0x00,0x40,0x08,0xFE,0x0F,0xB8,0xBC, +0xB8,0x18,0xFF,0x46,0xBD,0x98,0xFC,0xC0,0xFC,0x20,0x46,0x20,0x00,0x83,0x44,0x3F, +0xFE,0xFF,0x83,0x82,0xBC,0x18,0x94,0x4A,0xFE,0xE6,0xBB,0x98,0xBB,0x18,0x50,0x51, +0x00,0xE4,0x92,0x68,0x40,0x31,0xA0,0x08,0x58,0x31,0x80,0x48,0xBB,0x98,0xBB,0x18, +0x50,0x61,0x00,0xE8,0x58,0x31,0x81,0x00,0xBB,0x98,0x50,0x71,0x00,0xEC,0x88,0x20, +0x50,0x21,0x00,0xF0,0x46,0x30,0x00,0x83,0x4C,0x00,0x80,0x12,0xA2,0xC1,0xB6,0x65, +0x83,0x80,0xBB,0x3F,0x02,0x40,0x01,0x7E,0xB6,0x66,0xBB,0x7F,0xB6,0x67,0xB4,0x62, +0x92,0x70,0x40,0x31,0xC0,0x08,0xFE,0xE7,0xB6,0x62,0xD5,0xED,0x83,0x83,0xB9,0x18, +0x44,0x0F,0xFE,0xFF,0xFE,0x0E,0xB8,0x98,0xFC,0xA0,0xFC,0x20,0x46,0x10,0x00,0x83, +0x44,0x2F,0xFE,0xFF,0x83,0x81,0xBB,0x18,0x46,0x40,0xF0,0x3C,0xFE,0x9E,0xBA,0x98, +0xBA,0x18,0x50,0x32,0x00,0xF0,0x92,0x48,0x40,0x21,0x20,0x08,0x58,0x21,0x00,0x46, +0xBA,0x98,0xBE,0x39,0xB4,0x80,0xBD,0x3A,0xFF,0x9E,0x88,0xC4,0xA1,0x01,0xBF,0x3B, +0xFF,0x5E,0x88,0xA4,0xA1,0x02,0xBA,0x3C,0xFE,0xFE,0x88,0x83,0xA0,0xC3,0x54,0x21, +0x00,0xF0,0xBE,0xB9,0x98,0x13,0xBD,0xBA,0xBC,0xBB,0x96,0x81,0xB8,0x3C,0x92,0x10, +0x40,0x00,0x40,0x08,0xFE,0x17,0xB8,0xBC,0xFC,0xA0,0x44,0x14,0x80,0x90,0x84,0x5E, +0xB4,0x61,0x96,0x06,0xFE,0x9E,0xFE,0x87,0xB6,0x41,0xB4,0x81,0x44,0x2F,0xFF,0xEF, +0x94,0xC4,0xFE,0xA6,0xFE,0x9F,0xB6,0x41,0xB4,0x61,0x44,0x2F,0xFB,0xFF,0xFE,0x9E, +0x40,0x00,0x28,0x08,0xFE,0x17,0xB6,0x01,0x46,0x10,0x00,0x80,0x84,0x18,0x50,0x30, +0x82,0x6C,0xB4,0x43,0xFE,0x16,0xB6,0x03,0xB4,0x43,0x44,0x0F,0xF0,0xFF,0xFE,0x16, +0x58,0x00,0x0A,0x00,0xB6,0x03,0xDD,0x9E,0x52,0x00,0x00,0x01,0x46,0x20,0x00,0x80, +0x96,0x06,0xC9,0x08,0x40,0x10,0x20,0x08,0x04,0x31,0x00,0x79,0x44,0x0F,0xFE,0xFF, +0xD5,0x07,0x40,0x10,0x40,0x08,0x04,0x31,0x00,0x79,0x44,0x0E,0xFF,0xFF,0xFE,0x1E, +0xFE,0x0F,0x14,0x01,0x00,0x79,0xDD,0x9E,0x46,0x10,0x00,0x82,0x5A,0x08,0x01,0x0B, +0x50,0x30,0x80,0x20,0xB4,0x03,0x58,0x00,0x00,0x02,0xB6,0x03,0xB4,0x43,0x84,0x1E, +0xD5,0x04,0x04,0x20,0x80,0x08,0x84,0x1D,0xFE,0x16,0x14,0x00,0x80,0x08,0xDD,0x9E, +0x46,0x30,0x00,0x83,0x54,0x10,0x00,0x01,0x50,0x51,0x83,0xB8,0xB4,0x85,0x40,0x20, +0xA0,0x08,0x44,0x1F,0xFE,0xFF,0xFE,0x66,0xFE,0x57,0xB6,0x25,0xB4,0x25,0xE6,0x01, +0x44,0x0F,0xFD,0xFF,0x40,0xF7,0xA4,0x08,0xFE,0x0E,0x40,0x00,0x3C,0x04,0xB6,0x05, +0xDD,0x9E,0x46,0x30,0x00,0x83,0x54,0x10,0x00,0x01,0x50,0x51,0x83,0xB8,0xB4,0x85, +0x40,0x20,0xA8,0x08,0x44,0x1F,0xFB,0xFF,0xFE,0x66,0xFE,0x57,0xB6,0x25,0xB4,0x25, +0xE6,0x01,0x44,0x0F,0xF7,0xFF,0x40,0xF7,0xAC,0x08,0xFE,0x0E,0x40,0x00,0x3C,0x04, +0xB6,0x05,0xDD,0x9E,0x44,0x27,0x20,0x68,0x96,0x01,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x70,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x78,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x80,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x88,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x90,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xC8,0x0A,0x44,0x17,0x20,0x00,0x46,0x0F, +0xEF,0xFF,0xB4,0x41,0x50,0x00,0x0F,0xFF,0xFE,0x16,0xD5,0x09,0x5A,0x08,0x01,0x09, +0x44,0x17,0x20,0x00,0x46,0x00,0x10,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0xDD,0x9E, +0x44,0x27,0x20,0x00,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x0F,0xB6,0x02, +0xDD,0x9E,0x44,0x27,0x20,0x04,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x0F, +0xB6,0x02,0xDD,0x9E,0x44,0x27,0x20,0x00,0x96,0x06,0xB4,0x62,0x40,0x10,0x40,0x08, +0x44,0x0E,0xFF,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xC9,0x06,0x44,0x27, +0x10,0x00,0xB4,0x22,0xFE,0x0F,0xD5,0x08,0x5A,0x18,0x01,0x08,0x44,0x27,0x10,0x00, +0xFE,0x03,0xB4,0x22,0xFE,0x0E,0xB6,0x02,0xDD,0x9E,0x5A,0x18,0x01,0x07,0x44,0x27, +0x10,0x04,0xB4,0x22,0xFE,0x0F,0xD5,0x07,0xC9,0x07,0x44,0x27,0x10,0x04,0xFE,0x03, +0xB4,0x22,0xFE,0x0E,0xB6,0x02,0xDD,0x9E,0x5A,0x18,0x01,0x07,0x44,0x27,0x10,0x08, +0xB4,0x22,0xFE,0x0F,0xD5,0x07,0xC9,0x07,0x44,0x27,0x10,0x08,0xFE,0x03,0xB4,0x22, +0xFE,0x0E,0xB6,0x02,0xDD,0x9E,0x44,0x16,0x00,0x00,0x5A,0x08,0x01,0x06,0xB4,0x01, +0x58,0x00,0x00,0x01,0xD5,0x04,0xB4,0x41,0x84,0x1E,0xFE,0x16,0xB6,0x01,0xDD,0x9E, +0x44,0x16,0x00,0x00,0xB4,0x41,0x5A,0x08,0x01,0x06,0x44,0x01,0x00,0x00,0xFE,0x17, +0xD5,0x04,0x44,0x0E,0xFF,0xFF,0xFE,0x16,0xB6,0x01,0xDD,0x9E,0x44,0x06,0x00,0x00, +0xB4,0x00,0x92,0x1C,0x96,0x06,0xDD,0x9E,0x44,0x16,0x00,0x30,0x5A,0x08,0x01,0x06, +0xB4,0x01,0x58,0x00,0x01,0x00,0xD5,0x05,0xB4,0x41,0x44,0x0F,0xFE,0xFF,0xFE,0x16, +0xB6,0x01,0xDD,0x9E,0x44,0x36,0x38,0x14,0x40,0x00,0x20,0x08,0x40,0x20,0x20,0x09, +0xB4,0x03,0x96,0x6F,0x92,0x18,0x40,0x00,0x60,0x08,0xFE,0x17,0x44,0x26,0x38,0x08, +0xB6,0x03,0xB4,0x62,0x40,0x00,0xE0,0x08,0x46,0x1C,0x0F,0xFF,0x50,0x10,0x8F,0xFF, +0xFE,0x5E,0xFE,0x47,0xB6,0x22,0x44,0x16,0x38,0x04,0x44,0x01,0x00,0x00,0xB4,0x41, +0xFE,0x17,0xB6,0x01,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x03,0x96,0x06,0xC0,0xFD, +0x44,0x04,0x80,0x0C,0x84,0x28,0xAE,0x40,0xDD,0x9E,0x44,0x36,0x34,0x14,0x40,0x00, +0x20,0x08,0x40,0x20,0x20,0x09,0xB4,0x03,0x96,0x6F,0x92,0x18,0x40,0x00,0x60,0x08, +0xFE,0x17,0x44,0x26,0x34,0x08,0xB6,0x03,0xB4,0x62,0x40,0x00,0xE0,0x08,0x46,0x1C, +0x0F,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x5E,0xFE,0x47,0xB6,0x22,0x44,0x16,0x34,0x04, +0x44,0x01,0x00,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0x44,0x14,0x80,0x0C,0xB4,0x01, +0x92,0x13,0x96,0x06,0xC0,0xFD,0x44,0x04,0x80,0x0E,0x84,0x28,0xAE,0x40,0xDD,0x9E, +0xFC,0x01,0xB6,0x3F,0x80,0x22,0xF3,0x81,0x49,0xFF,0xFF,0xA6,0xB4,0x1F,0xF1,0x01, +0x49,0xFF,0xFF,0xCD,0xFC,0x81,0x44,0x16,0x3C,0x04,0xB4,0x01,0x58,0x00,0x00,0x01, +0xB6,0x01,0xDD,0x9E,0x44,0x26,0x38,0x04,0xB4,0x22,0x44,0x06,0x38,0x04,0x92,0x28, +0x96,0x46,0xC9,0xFB,0xB4,0x40,0x84,0x3E,0xFE,0x56,0xB6,0x20,0x80,0x20,0xB4,0x01, +0x92,0x08,0x96,0x06,0xC8,0xFD,0x44,0x26,0x34,0x04,0xB4,0x22,0x44,0x06,0x34,0x04, +0x92,0x28,0x96,0x46,0xC9,0xFB,0xB4,0x40,0x84,0x3E,0xFE,0x56,0xB6,0x20,0x80,0x20, +0xB4,0x01,0x92,0x08,0x96,0x06,0xC8,0xFD,0xDD,0x9E,0xFC,0x00,0x46,0x60,0x00,0x83, +0x83,0x86,0xB8,0x27,0x58,0x00,0x00,0x01,0xB8,0xA7,0xB8,0x27,0x58,0x00,0x01,0x00, +0xB8,0xA7,0x84,0x01,0x49,0x00,0x08,0x9B,0xB9,0x27,0x84,0x1E,0xFE,0x0E,0xB8,0xA7, +0xB9,0x27,0x44,0x0F,0xFE,0xFF,0xFE,0x0E,0xB8,0xA7,0xFC,0x80,0xFC,0x40,0x46,0x60, +0x00,0x83,0x84,0xFE,0x83,0x86,0x04,0x93,0x00,0x14,0x96,0x06,0x40,0x74,0x9C,0x02, +0xFE,0x3F,0xB8,0x94,0x96,0x5F,0xBF,0x14,0x40,0x00,0xE0,0x08,0x46,0x1F,0x0F,0xFF, +0x50,0x10,0x8F,0xFF,0xFE,0x7E,0xFE,0x47,0xB9,0x94,0x97,0x2F,0xB9,0x14,0x40,0x02, +0x44,0x08,0x46,0x4F,0xF8,0x1F,0x50,0x42,0x0F,0xFF,0xFF,0x0E,0xFF,0x07,0xBC,0x94, +0x97,0x6F,0x40,0x02,0xAC,0x08,0xBD,0x14,0x44,0x1E,0x07,0xFF,0xFF,0x4E,0xFF,0x47, +0xBD,0x94,0xB8,0x15,0x54,0x21,0x03,0xFF,0x92,0x0A,0x40,0x00,0x28,0x08,0xFE,0x17, +0xB8,0x95,0x96,0xF7,0x40,0x01,0xC0,0x08,0xB9,0x15,0x46,0x3F,0xF8,0x0F,0x50,0x31, +0x8F,0xFF,0xFE,0xCE,0xFE,0xC7,0xBB,0x95,0xFC,0xC0,0x46,0x00,0x00,0x83,0x04,0x00, +0x00,0x16,0x96,0x01,0xDD,0x9E,0xFC,0x00,0x46,0x40,0x00,0x83,0x84,0x61,0x83,0x84, +0xBE,0x13,0x84,0xBE,0xFE,0x1E,0xFF,0x76,0xFE,0x2F,0xB8,0x93,0xFE,0x5E,0x40,0x30, +0xA0,0x08,0xB9,0x60,0x44,0x0F,0xFE,0xFF,0xFE,0x46,0xFE,0x5F,0xB9,0xE0,0x96,0xA7, +0x40,0x01,0x20,0x08,0xBA,0x13,0x44,0x1F,0xE0,0xFF,0xFE,0x8E,0xFE,0x87,0xBA,0x93, +0xFC,0x80,0x46,0x30,0x00,0x83,0x96,0x8F,0x50,0x41,0x81,0x84,0xB6,0x04,0xA8,0x61, +0xA0,0x62,0x84,0x1C,0xFE,0x0E,0xFE,0x87,0xA8,0xA2,0xDD,0x9E,0x46,0x20,0x00,0x83, +0x96,0x27,0x04,0x11,0x00,0x60,0x92,0x25,0x94,0x4D,0xFE,0x47,0x14,0x11,0x00,0x60, +0xDD,0x9E,0x46,0x20,0x00,0x83,0x84,0x3E,0x04,0x31,0x00,0x12,0x96,0x06,0xFE,0x5E, +0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E,0xB4,0x40,0x46,0x10,0x00,0x80,0x14,0x20, +0x80,0x48,0xA0,0x01,0x14,0x00,0x80,0x4A,0xDD,0x9E,0xFC,0x40,0x46,0x20,0x00,0x83, +0x50,0x61,0x00,0xE4,0x83,0x82,0xBB,0x18,0x50,0x71,0x00,0xE8,0x58,0x31,0x81,0x00, +0xBB,0x98,0xBB,0x18,0x50,0x91,0x00,0xEC,0x92,0x68,0x40,0x31,0xA0,0x08,0x58,0x31, +0x80,0x88,0xBB,0x98,0x8C,0x02,0x84,0xA0,0x50,0x21,0x00,0xF0,0x46,0x30,0x00,0x83, +0xD1,0x22,0x22,0x30,0x00,0x00,0x22,0x40,0x7F,0xFF,0x40,0x31,0xC0,0x08,0x88,0x64, +0xB6,0x66,0x22,0x30,0x00,0x02,0x22,0x40,0x00,0x01,0x40,0x31,0xC0,0x08,0x88,0x64, +0xB6,0x67,0x22,0x30,0x00,0x04,0x22,0x40,0x00,0x03,0x40,0x31,0xC0,0x08,0x88,0x64, +0xB6,0x69,0xB4,0x62,0x8C,0xA1,0x92,0x70,0x40,0x31,0xC0,0x08,0xB6,0x62,0x97,0x68, +0x8C,0x0C,0xD5,0xDD,0x83,0x83,0xB9,0x18,0x44,0x0F,0xFE,0xFF,0xFE,0x0E,0xB8,0x98, +0xFC,0xC0,0x46,0x20,0x00,0x83,0x96,0x0F,0x04,0x31,0x00,0x12,0x40,0x10,0x40,0x08, +0x44,0x0C,0xFF,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E,0xFC,0x00, +0x84,0x40,0x44,0x64,0x00,0xC0,0x38,0x30,0x88,0x00,0x38,0x40,0x09,0x01,0x99,0x56, +0x40,0x31,0xB0,0x08,0x95,0x69,0xFE,0xE7,0x96,0xD9,0x8C,0x41,0xAC,0xE8,0x5A,0x28, +0x14,0xF4,0xFC,0x80,0x46,0x20,0x00,0x83,0x96,0x06,0x04,0x31,0x00,0x26,0x94,0x41, +0x84,0x1D,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x26,0xDD,0x9E,0x46,0x20,0x00,0x81, +0x96,0x06,0xA0,0xD5,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF,0xFE,0x1E,0xFE,0x0F, +0xA8,0x15,0xDD,0x9E,0xC9,0x08,0x46,0x20,0x00,0x91,0x84,0x3E,0xB4,0x62,0x96,0x06, +0xFE,0x5E,0xD5,0x0A,0x5A,0x18,0x01,0x0B,0x46,0x20,0x00,0x91,0x96,0x06,0xB4,0x62, +0x94,0x41,0x84,0x1D,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xFC,0x00,0x44,0x00, +0x00,0xC8,0x49,0x00,0x07,0x6C,0x44,0x14,0x50,0x0C,0x46,0x60,0x00,0x81,0xB4,0x01, +0x58,0x00,0x00,0x04,0xB6,0x01,0xFA,0x18,0x49,0x00,0x07,0x6A,0x83,0x86,0xB8,0x1C, +0x58,0x00,0x01,0x00,0xB8,0x9C,0x84,0x01,0x49,0x00,0x07,0x62,0xB9,0x1C,0x44,0x01, +0x00,0x00,0xFE,0x0F,0xB8,0x9C,0x44,0x00,0x01,0xF4,0x49,0x00,0x07,0x50,0xB9,0x1C, +0x46,0x00,0x10,0x00,0xFE,0x0F,0xB8,0x9C,0x44,0x00,0x01,0xF4,0x49,0x00,0x07,0x47, +0xFC,0x80,0x00,0x00,0x46,0x10,0x00,0x80,0x50,0x50,0x80,0x80,0x50,0x10,0x80,0xB0, +0xA2,0x81,0xAA,0xA9,0xD9,0xFE,0xDD,0x9E,0x46,0x10,0x00,0x80,0x50,0x50,0x80,0xB0, +0x50,0x10,0x80,0xC4,0xA2,0x81,0xAA,0xA9,0xD9,0xFE,0xDD,0x9E,0xB4,0x40,0x46,0x10, +0x00,0x80,0x14,0x20,0x80,0x47,0xA0,0x01,0x14,0x00,0x80,0x49,0xDD,0x9E,0x46,0x10, +0x00,0x80,0x50,0x50,0x81,0x40,0x50,0x30,0x81,0x4C,0xA6,0x41,0xA6,0x80,0x94,0x4C, +0xFE,0x57,0x96,0x48,0xAE,0x68,0x00,0x10,0x00,0x0D,0x00,0x20,0x00,0x0C,0x94,0x4C, +0xFE,0x57,0x96,0x48,0x10,0x12,0x80,0x0C,0x8C,0xA1,0x8C,0x02,0xDB,0xEF,0xDD,0x9E, +0x46,0x10,0x00,0x80,0x50,0x50,0x80,0x40,0x50,0x30,0x80,0x46,0xA6,0x41,0xA6,0x80, +0x94,0x4C,0xFE,0x57,0x96,0x48,0xAE,0x68,0x00,0x10,0x00,0x0D,0x00,0x20,0x00,0x0C, +0x94,0x4C,0xFE,0x57,0x96,0x48,0x10,0x12,0x80,0x0C,0x8C,0xA1,0x8C,0x02,0xDB,0xEF, +0xDD,0x9E,0xA6,0x81,0x80,0xA0,0x94,0x94,0x08,0x12,0x80,0x05,0xFE,0x8F,0x46,0x10, +0x00,0x80,0x96,0x90,0x10,0x20,0x80,0x48,0xA6,0xA9,0xA6,0xC5,0x94,0x94,0xFE,0x9F, +0x96,0x90,0x10,0x20,0x80,0x54,0xA6,0x83,0xA6,0xC2,0x94,0x94,0xFE,0x9F,0x96,0x90, +0x10,0x20,0x80,0x49,0xA6,0xAB,0xA6,0xEA,0x94,0x94,0xFE,0x9F,0x96,0x90,0x10,0x20, +0x80,0x55,0xA6,0x84,0x84,0x0F,0xFE,0x86,0x40,0x31,0x40,0x08,0x46,0x4F,0xFF,0x0F, +0x04,0x20,0x80,0x12,0x50,0x42,0x0F,0xFF,0xFE,0xA6,0xFE,0x9F,0x14,0x20,0x80,0x12, +0xA6,0xAC,0xFE,0x16,0x40,0x20,0x40,0x08,0x04,0x00,0x80,0x15,0xFE,0x26,0xFE,0x17, +0x14,0x00,0x80,0x15,0xDD,0x9E,0x46,0x10,0x00,0x80,0x50,0x50,0x80,0x58,0x50,0x30, +0x80,0x5E,0xA6,0x41,0xA6,0x80,0x94,0x4C,0xFE,0x57,0x96,0x48,0xAE,0x68,0x00,0x10, +0x00,0x0D,0x00,0x20,0x00,0x0C,0x94,0x4C,0xFE,0x57,0x96,0x48,0x10,0x12,0x80,0x0C, +0x8C,0xA1,0x8C,0x02,0xDB,0xEF,0xDD,0x9E,0xA6,0x81,0x80,0xA0,0x94,0x94,0x08,0x12, +0x80,0x05,0xFE,0x8F,0x46,0x10,0x00,0x80,0x96,0x90,0x10,0x20,0x80,0x60,0xA6,0xA9, +0xA6,0xC5,0x94,0x94,0xFE,0x9F,0x96,0x90,0x10,0x20,0x80,0x6C,0xA6,0x83,0xA6,0xC2, +0x94,0x94,0xFE,0x9F,0x96,0x90,0x10,0x20,0x80,0x61,0xA6,0xAB,0xA6,0xEA,0x94,0x94, +0xFE,0x9F,0x96,0x90,0x10,0x20,0x80,0x6D,0xA6,0x84,0x84,0x0F,0xFE,0x86,0x40,0x31, +0x40,0x08,0x46,0x4F,0xFF,0x0F,0x04,0x20,0x80,0x18,0x50,0x42,0x0F,0xFF,0xFE,0xA6, +0xFE,0x9F,0x14,0x20,0x80,0x18,0xA6,0xAC,0xFE,0x16,0x40,0x20,0x40,0x08,0x04,0x00, +0x80,0x1B,0xFE,0x26,0xFE,0x17,0x14,0x00,0x80,0x1B,0xDD,0x9E,0xE6,0x06,0xE8,0x57, +0xFC,0x20,0x46,0x70,0x00,0x81,0x44,0xF0,0x10,0x74,0x38,0x07,0x80,0x00,0x40,0xF0, +0x3C,0x00,0xDD,0x0F,0x06,0x16,0x34,0x62,0x76,0x44,0x04,0x03,0x80,0x20,0x54,0x10, +0x87,0xFF,0x92,0x0B,0x40,0x00,0x2C,0x08,0xD5,0x0C,0x54,0x10,0x87,0xFF,0x40,0x00, +0xC0,0x08,0x04,0x23,0x80,0x20,0x46,0x1F,0x80,0x0F,0x50,0x10,0x8F,0xFF,0xFE,0x56, +0xFE,0x47,0x14,0x13,0x80,0x20,0xFC,0xA0,0x04,0x03,0x80,0x21,0x54,0x10,0x87,0xFF, +0x92,0x0B,0x40,0x00,0x2C,0x08,0xD5,0x0C,0x54,0x10,0x87,0xFF,0x40,0x00,0xC0,0x08, +0x04,0x23,0x80,0x21,0x46,0x1F,0x80,0x0F,0x50,0x10,0x8F,0xFF,0xFE,0x56,0xFE,0x47, +0x14,0x13,0x80,0x21,0xFC,0xA0,0x83,0x87,0xB8,0x22,0x54,0x10,0x87,0xFF,0x92,0x0B, +0x40,0x00,0x2C,0x08,0xFE,0x47,0xB9,0xA2,0xFC,0xA0,0x80,0xC1,0x49,0xFF,0xFD,0x54, +0x54,0x13,0x03,0xFF,0x95,0x8E,0x04,0x13,0x83,0x98,0x44,0x0F,0x00,0x3F,0xFE,0x46, +0xFE,0x77,0x14,0x13,0x83,0x98,0x49,0xFF,0xFD,0x40,0xFC,0xA0,0xDD,0x9E,0x46,0x20, +0x00,0x83,0x96,0x06,0x40,0x10,0x60,0x08,0x04,0x31,0x00,0xC0,0x46,0x0F,0xEF,0xFF, +0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0xC0,0xDD,0x9E,0x46,0x20, +0x00,0x83,0x96,0x06,0x40,0x10,0x64,0x08,0x04,0x31,0x00,0xC0,0x46,0x0F,0xDF,0xFF, +0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0xC0,0xDD,0x9E,0x46,0x20, +0x00,0x83,0x96,0x0F,0x04,0x31,0x00,0x0F,0x40,0x10,0x20,0x08,0x44,0x0F,0xFC,0xFF, +0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x0F,0xDD,0x9E,0x46,0x20,0x00,0x83,0x84,0x3E, +0x04,0x31,0x00,0x0F,0x96,0x06,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x0F,0xDD,0x9E, +0x46,0x20,0x00,0x83,0x96,0x06,0x04,0x31,0x00,0x0F,0x40,0x10,0x28,0x08,0x44,0x0F, +0xFB,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x0F,0xDD,0x9E,0x46,0x10,0x00,0x83, +0x44,0x01,0x00,0x00,0x04,0x20,0x80,0x0E,0xFE,0x17,0x14,0x00,0x80,0x0E,0xDD,0x9E, +0x46,0x20,0x00,0x83,0x46,0x3F,0x7F,0xFF,0x50,0x51,0x00,0x38,0xB4,0x85,0x50,0x31, +0x8F,0xFF,0xFE,0xE6,0xB6,0x65,0xB4,0x85,0x46,0x3E,0xFF,0xFF,0x50,0x31,0x8F,0xFF, +0xFE,0xE6,0xB6,0x65,0x5A,0x08,0x01,0x04,0x84,0x1F,0xD5,0x02,0x84,0x00,0x14,0x01, +0x00,0x0B,0x14,0x01,0x00,0x0C,0x04,0x01,0x00,0x33,0x5A,0x18,0x01,0x0B,0x58,0x00, +0x0F,0xFF,0x14,0x01,0x00,0x33,0x04,0x01,0x00,0x34,0x58,0x00,0x0F,0xFF,0xD5,0x0B, +0x92,0x0C,0x40,0x00,0x30,0x08,0x14,0x01,0x00,0x33,0x04,0x01,0x00,0x34,0x92,0x0C, +0x40,0x00,0x30,0x08,0x14,0x01,0x00,0x34,0xDD,0x9E,0x46,0x10,0x00,0x83,0x96,0x06, +0x50,0x50,0x80,0x38,0xB4,0x85,0x44,0x2F,0xFE,0xFF,0x40,0x30,0x20,0x08,0xFE,0xA6, +0xFE,0x9F,0xB6,0x45,0xB4,0x65,0x44,0x2F,0xFD,0xFF,0x40,0x00,0x24,0x08,0xFE,0x9E, +0xFE,0x17,0xB6,0x05,0xDD,0x9E,0x46,0x20,0x00,0x81,0x50,0x51,0x00,0x90,0x50,0x31, +0x00,0x9A,0x08,0x20,0x00,0x01,0x88,0x41,0x96,0x90,0x18,0x22,0x80,0x01,0xDB,0xFA, +0xDD,0x9E,0xE6,0x25,0xE8,0x33,0x96,0x1F,0x46,0x20,0x00,0x81,0x44,0xF0,0x12,0x7C, +0x38,0x17,0x84,0x00,0x40,0xF0,0xBC,0x00,0x4A,0x00,0x3C,0x00,0x06,0x0E,0x1A,0x28, +0x36,0x00,0x04,0x31,0x00,0x23,0x84,0x30,0xD5,0x1D,0x94,0x04,0x04,0x31,0x00,0x23, +0x44,0x1F,0xFF,0x0F,0xD5,0x17,0x40,0x00,0x20,0x08,0x04,0x31,0x00,0x23,0x44,0x1F, +0xF0,0xFF,0xD5,0x10,0x40,0x00,0x30,0x08,0x04,0x31,0x00,0x23,0x44,0x1F,0x0F,0xFF, +0xD5,0x09,0x46,0x1F,0xFF,0x0F,0x40,0x00,0x40,0x08,0x04,0x31,0x00,0x23,0x50,0x10, +0x8F,0xFF,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x23,0xDD,0x9E,0x84,0x00,0xDD,0x9E, +0x46,0x20,0x00,0x81,0x54,0x00,0x03,0xFF,0x40,0x10,0x40,0x08,0x04,0x31,0x00,0x49, +0x46,0x0F,0xC0,0x0F,0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x49, +0xDD,0x9E,0xE6,0x06,0xE8,0x52,0xFC,0x20,0x46,0x70,0x00,0x81,0x54,0x60,0x83,0xFF, +0x44,0xF0,0x13,0x10,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00,0x4A,0x00,0x3C,0x00, +0x06,0x2E,0x46,0x56,0x66,0x16,0x83,0x87,0xB9,0x30,0x92,0x2A,0x40,0x10,0xA8,0x08, +0xFF,0x8F,0xBE,0xB0,0xFC,0xA0,0x83,0x87,0xB8,0x31,0x46,0x2F,0xC0,0x0F,0x50,0x21, +0x0F,0xFF,0x40,0x63,0x40,0x08,0xFE,0x16,0xFE,0x37,0xB8,0xB1,0xFC,0xA0,0x83,0x87, +0xB8,0x30,0x46,0x2F,0xC0,0x0F,0x50,0x21,0x0F,0xFF,0x40,0x63,0x40,0x08,0xFE,0x16, +0xFE,0x37,0xB8,0xB0,0xFC,0xA0,0x83,0x87,0xB9,0x31,0x92,0x2A,0x40,0x10,0xA8,0x08, +0xFF,0x8F,0xBE,0xB1,0xFC,0xA0,0x83,0x87,0xB9,0x32,0x92,0x2A,0x40,0x10,0xA8,0x08, +0xFF,0x8F,0xBE,0xB2,0xFC,0xA0,0x49,0xFF,0xFC,0x0F,0x40,0x13,0x40,0x08,0x04,0x03, +0x83,0x98,0x46,0x6F,0xC0,0x0F,0x50,0x63,0x0F,0xFF,0xFF,0x86,0xFF,0x8F,0x14,0x63, +0x83,0x98,0x49,0xFF,0xFB,0xFA,0xFC,0xA0,0xDD,0x9E,0x54,0x20,0x80,0x03,0xE6,0x08, +0x54,0x10,0x80,0x0C,0x90,0x22,0x4E,0xF2,0x00,0x93,0x96,0x4F,0x46,0x30,0x00,0x81, +0x96,0x8F,0x44,0xF0,0x13,0xC0,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00,0xDD,0x0F, +0x08,0x24,0x40,0x5E,0x7C,0x9C,0xBC,0xE8,0x50,0x51,0x80,0x9C,0xB4,0x85,0x84,0x1C, +0xFE,0x26,0xFE,0x47,0xB6,0x25,0xB4,0x25,0x44,0x0C,0xFF,0xFF,0x40,0x21,0x40,0x08, +0xFE,0x0E,0xD5,0x72,0x50,0x51,0x80,0x9C,0xB4,0x85,0x84,0x13,0xFE,0x26,0x94,0x4A, +0xFE,0x47,0xB6,0x25,0x40,0x21,0x48,0x08,0xB4,0x05,0x46,0x1F,0xFF,0x3F,0xD5,0x4E, +0x50,0x51,0x80,0x9C,0xB4,0x85,0x44,0x0F,0xFF,0xCF,0xFE,0x26,0x94,0x4C,0xFE,0x47, +0xB6,0x25,0x40,0x21,0x50,0x08,0xB4,0x05,0x46,0x1F,0xFC,0xFF,0xD5,0x3F,0x50,0x51, +0x80,0x9C,0xB4,0x85,0x44,0x0F,0xFF,0x3F,0xFE,0x26,0x94,0x4E,0xFE,0x47,0xB6,0x25, +0x40,0x21,0x58,0x08,0xB4,0x05,0x46,0x1F,0xF3,0xFF,0xD5,0x30,0x50,0x51,0x80,0x9C, +0xB4,0x85,0x44,0x0F,0xFC,0xFF,0xFE,0x26,0x40,0x10,0xA0,0x08,0xFE,0x47,0xB6,0x25, +0x40,0x21,0x60,0x08,0xB4,0x05,0x46,0x1F,0xCF,0xFF,0xD5,0x20,0x50,0x51,0x80,0x9C, +0xB4,0x85,0x44,0x0F,0xF3,0xFF,0xFE,0x26,0x40,0x10,0xA8,0x08,0xFE,0x47,0xB6,0x25, +0x40,0x21,0x68,0x08,0xB4,0x05,0x46,0x1F,0x3F,0xFF,0xD5,0x10,0x50,0x51,0x80,0x9C, +0xB4,0x85,0x44,0x0F,0xCF,0xFF,0xFE,0x26,0x40,0x10,0xB0,0x08,0xFE,0x47,0xB6,0x25, +0x40,0x21,0x70,0x08,0xB4,0x05,0x46,0x1C,0xFF,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x0E, +0xFE,0x17,0x14,0x01,0x80,0x27,0xDD,0x9E,0x50,0x51,0x80,0x9C,0xB4,0x85,0x44,0x0F, +0x3F,0xFF,0xFE,0x26,0x40,0x10,0xB8,0x08,0xFE,0x47,0xB6,0x25,0xB4,0x05,0x40,0x21, +0x78,0x08,0x94,0x02,0x92,0x02,0xFE,0x87,0x14,0x21,0x80,0x27,0xDD,0x9E,0xDD,0x9E, +0xFC,0x40,0x80,0xE0,0x44,0x04,0x34,0x38,0x5A,0x78,0x01,0x2B,0x80,0xC1,0xB4,0x20, +0x44,0x9F,0xE0,0xFF,0x58,0x10,0x80,0x02,0xB6,0x20,0x80,0x27,0x49,0xFF,0xFB,0x17, +0x44,0x04,0x34,0x50,0x97,0xA7,0xB4,0x20,0x40,0x63,0x20,0x08,0x40,0x10,0xA4,0x02, +0xFE,0x77,0xB6,0x20,0x80,0x27,0x49,0xFF,0xFB,0x0A,0x44,0x04,0x38,0x3C,0xB4,0x20, +0x58,0x10,0x80,0x02,0xB6,0x20,0x80,0x27,0x49,0xFF,0xFA,0xD6,0x44,0x04,0x38,0x58, +0xB4,0x20,0x40,0x10,0xA4,0x02,0xFF,0x8F,0xB6,0xC0,0x80,0x27,0xD5,0x0E,0xB4,0x20, +0x84,0xDD,0xFE,0x76,0xB6,0x20,0x84,0x21,0x49,0xFF,0xFA,0xF1,0x44,0x04,0x38,0x3C, +0xB4,0x20,0xFF,0x8E,0xB6,0xC0,0x84,0x21,0x49,0xFF,0xFA,0xBE,0xFC,0xC0,0x92,0x00, +0xC8,0x04,0x44,0x07,0x20,0x0C,0xD5,0x03,0x44,0x07,0x20,0x10,0xB4,0x00,0x40,0x00, +0x30,0x08,0x92,0x0C,0xDD,0x9E,0xFC,0x00,0x80,0xC1,0x49,0xFF,0xFF,0xF3,0x84,0x40, +0x80,0x22,0xE2,0x46,0xE8,0x05,0x38,0x10,0x0A,0x0A,0x8C,0x41,0xD5,0xFB,0xFC,0x80, +0x44,0x27,0x20,0x1C,0x54,0x00,0x0F,0xFF,0xB4,0x22,0x92,0x2C,0x40,0x10,0xB0,0x08, +0xFE,0x47,0xB6,0x22,0xDD,0x9E,0x44,0x27,0x20,0x34,0x54,0x00,0x0F,0xFF,0xB4,0x22, +0x92,0x2C,0x40,0x10,0xB0,0x08,0xFE,0x47,0xB6,0x22,0xDD,0x9E,0x44,0x27,0x20,0x38, +0x54,0x00,0x0F,0xFF,0xB4,0x22,0x92,0x2C,0x40,0x10,0xB0,0x08,0xFE,0x47,0xB6,0x22, +0xDD,0x9E,0x44,0x27,0x20,0x54,0x84,0x30,0xB4,0x62,0x96,0x1F,0xFE,0x5E,0xFE,0x0F, +0xB6,0x02,0xDD,0x9E,0x44,0x27,0x20,0x54,0x96,0x1F,0xB4,0x62,0x40,0x10,0x20,0x08, +0x44,0x0F,0xF0,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x27,0x20,0x58, +0x96,0x1F,0x40,0x10,0x40,0x08,0xB4,0x62,0x46,0x0F,0xFF,0x0F,0x50,0x00,0x0F,0xFF, +0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x04,0x00,0x9C,0xA6,0x00,0xDD,0x9E, +0x46,0x10,0x00,0x81,0x04,0x00,0x80,0x6E,0x58,0x00,0x00,0x01,0x14,0x00,0x80,0x6E, +0xDD,0x9E,0xFC,0x00,0x44,0x04,0x2C,0x1C,0x84,0x41,0xB4,0x20,0x80,0x62,0x58,0x10, +0x81,0x00,0xB6,0x20,0xB4,0x20,0x58,0x10,0x80,0x80,0xB6,0x20,0x44,0x04,0x28,0x1C, +0x44,0x14,0x24,0x1C,0x49,0xFF,0xFA,0x96,0xFC,0x80,0x46,0x20,0x00,0x80,0x84,0x30, +0x50,0x41,0x01,0xD0,0xB4,0x64,0x96,0x1F,0xFE,0x5E,0xFE,0x47,0xB6,0x24,0xB4,0x64, +0x44,0x1F,0xFF,0x0F,0x94,0x04,0xFE,0x5E,0xFE,0x0F,0xB6,0x04,0xDD,0x9E,0x00,0x00, +0x44,0x24,0x80,0x88,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x47,0xB6,0x22, +0xB4,0x62,0x84,0x3D,0x94,0x01,0xFE,0x5E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xFC,0x00, +0x44,0x64,0x00,0x18,0x84,0x41,0xAE,0xB0,0xA6,0x72,0x84,0x1E,0xFE,0x46,0xAE,0x72, +0xA6,0x72,0x44,0x30,0x98,0x81,0x58,0x10,0x80,0x02,0xAE,0x72,0xA6,0x72,0x58,0x10, +0x80,0x04,0xAE,0x72,0xA6,0x73,0x58,0x10,0x80,0x02,0xAE,0x73,0xA6,0x73,0x58,0x10, +0x80,0x04,0xAE,0x73,0xA6,0x73,0x58,0x10,0x80,0x08,0xAE,0x73,0xA6,0x73,0x58,0x10, +0x80,0x10,0xAE,0x73,0x44,0x14,0x00,0x10,0xB6,0x61,0xAE,0xB1,0xA6,0x72,0x58,0x10, +0x80,0x10,0xAE,0x72,0xA6,0x72,0x54,0x10,0x80,0xDF,0xAE,0x72,0xA6,0xB2,0x44,0x1F, +0xFF,0x80,0xFE,0x57,0xAE,0x72,0xA6,0x73,0xFE,0x0E,0xAE,0x33,0xA6,0x33,0x58,0x00, +0x00,0x20,0xAE,0x33,0xA6,0x33,0x58,0x00,0x00,0x40,0xAE,0x33,0x49,0x00,0x03,0x0B, +0xE6,0x03,0x44,0x14,0x50,0x10,0xA6,0x32,0xE9,0x10,0x54,0x00,0x00,0xFB,0xAE,0x32, +0xB4,0x01,0x92,0x08,0x40,0x00,0x20,0x08,0xB6,0x01,0x44,0x14,0x70,0x00,0x44,0x0E, +0xFF,0xFF,0xB4,0x41,0xFE,0x16,0xD5,0x11,0x58,0x00,0x00,0x04,0xAE,0x32,0xB4,0x01, +0x92,0x08,0x40,0x00,0x20,0x08,0x58,0x00,0x00,0x98,0xB6,0x01,0x44,0x14,0x70,0x00, +0x44,0x01,0x00,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0xFC,0x80,0x44,0x37,0x20,0x44, +0x46,0x0F,0xC0,0x0F,0xB4,0x23,0x50,0x00,0x0F,0xFF,0xFE,0x46,0x46,0x20,0x24,0x00, +0xFE,0x57,0xB6,0x23,0x44,0x37,0x20,0x48,0x44,0x23,0x00,0x00,0xB4,0x23,0xFE,0x46, +0xFE,0x57,0x44,0x27,0x20,0x4C,0xB6,0x23,0xB4,0x22,0x46,0x30,0x0C,0x00,0x92,0x2C, +0x40,0x10,0xB0,0x08,0x58,0x10,0x82,0x52,0xB6,0x22,0xB4,0x22,0xFE,0x46,0xFE,0x5F, +0xB6,0x22,0x44,0x27,0x20,0x50,0x46,0x30,0x00,0x90,0xB4,0x22,0x92,0x2C,0x40,0x10, +0xB0,0x08,0x58,0x10,0x82,0x40,0xB6,0x22,0xB4,0x22,0xFE,0x0E,0xB6,0x02,0x44,0x27, +0x20,0x04,0x46,0x0F,0xFF,0x0F,0xB4,0x22,0x50,0x00,0x0F,0xFF,0xFE,0x46,0xFE,0x5F, +0xB6,0x22,0xB4,0x62,0x46,0x1F,0xF0,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x5E,0x46,0x30, +0x03,0x00,0xFE,0x5F,0xB6,0x22,0x46,0x20,0x00,0x80,0x44,0x1F,0xF0,0xFF,0x50,0x41, +0x01,0xC0,0xB4,0x64,0xFE,0x5E,0x58,0x10,0x88,0x00,0xB6,0x24,0xB4,0x24,0xFE,0x0E, +0x44,0x12,0x00,0x00,0xFE,0x0F,0xB6,0x04,0xDD,0x9E,0x46,0x20,0x00,0x91,0x40,0x00, +0x40,0x08,0xA0,0x56,0x96,0x49,0xFE,0x0F,0xA8,0x16,0xDD,0x9E,0xE6,0x05,0xE8,0x31, +0x46,0x10,0x00,0x91,0x44,0xF0,0x18,0x34,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00, +0x4A,0x00,0x3C,0x00,0x06,0x14,0x22,0x30,0x3E,0x00,0xA0,0x0A,0x92,0x10,0x40,0x00, +0x40,0x08,0x58,0x00,0x00,0x0A,0xD5,0x1C,0xA0,0x0A,0x92,0x10,0x40,0x00,0x40,0x08, +0x58,0x00,0x00,0x23,0xD5,0x15,0xA0,0x0A,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00, +0x00,0x46,0xD5,0x0E,0xA0,0x0A,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x00,0x96, +0xD5,0x07,0xA0,0x0A,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x01,0xF4,0xA8,0x0A, +0xDD,0x9E,0x46,0x2F,0xFC,0x0F,0x46,0x10,0x00,0x91,0x50,0x21,0x0F,0xFF,0x5A,0x08, +0x01,0x08,0x04,0x00,0x80,0x0E,0xFE,0x86,0x44,0x02,0x00,0x00,0xD5,0x06,0x04,0x00, +0x80,0x0E,0xFE,0x86,0x44,0x01,0x00,0x00,0xFE,0x87,0x14,0x20,0x80,0x0E,0xA0,0x09, +0x92,0x06,0x94,0x06,0x58,0x00,0x00,0x01,0xA8,0x09,0xDD,0x9E,0xFC,0x00,0x46,0x60, +0x00,0x91,0x84,0x01,0xA8,0x31,0x44,0x00,0x01,0xF4,0xA8,0x32,0x83,0x86,0xB9,0x0A, +0x46,0x0F,0xC0,0x0F,0x50,0x00,0x0C,0x00,0xFE,0x46,0x58,0x10,0x80,0x01,0xB9,0x8A, +0xB9,0x0B,0xFE,0x0E,0x58,0x00,0x02,0x40,0xB8,0x8B,0xB9,0x0C,0x44,0x0F,0xC0,0xC0, +0xFE,0x0E,0x58,0x00,0x20,0x01,0xB8,0x8C,0xB9,0x0D,0x46,0x0E,0x0E,0x0E,0x50,0x00, +0x00,0xE0,0xFE,0x0E,0x46,0x10,0x60,0x11,0x50,0x10,0x82,0x01,0xFE,0x0F,0xB8,0x8D, +0xB9,0x0E,0x46,0x0F,0xFC,0x0C,0x50,0x00,0x00,0xF3,0xFE,0x0E,0x44,0x11,0x01,0x0C, +0xFE,0x0F,0xB8,0x8E,0x49,0xFF,0xFE,0x72,0xE6,0x03,0xA0,0x36,0x92,0x10,0x40,0x00, +0x40,0x08,0xE9,0x1F,0x58,0x00,0x00,0x28,0xA8,0x36,0x83,0x86,0xB8,0x08,0x92,0x10, +0x40,0x00,0x40,0x08,0x58,0x00,0x00,0x28,0xB8,0x88,0xA0,0x35,0x92,0x10,0x40,0x00, +0x40,0x08,0x58,0x00,0x00,0x28,0xA8,0x35,0xA0,0x37,0x92,0x10,0x40,0x00,0x40,0x08, +0x58,0x00,0x00,0x28,0xA8,0x37,0xA0,0x76,0x46,0x00,0x02,0x80,0x96,0x49,0xD5,0x1E, +0x58,0x00,0x46,0x00,0xA8,0x36,0x83,0x86,0xB8,0x08,0x92,0x10,0x40,0x00,0x40,0x08, +0x58,0x00,0x46,0x00,0xB8,0x88,0xA0,0x35,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00, +0x46,0x00,0xA8,0x35,0xA0,0x37,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x46,0x00, +0xA8,0x37,0xA0,0x76,0x46,0x04,0x60,0x00,0x96,0x49,0xFE,0x47,0xA8,0x76,0x83,0x86, +0xB9,0x08,0x96,0x49,0xFE,0x47,0xB9,0x88,0xA0,0x75,0x96,0x49,0xFE,0x47,0xA8,0x75, +0xA0,0x77,0x96,0x49,0xFE,0x0F,0xA8,0x37,0x46,0x00,0x00,0x91,0x83,0x80,0xB9,0x12, +0x58,0x10,0xBF,0x3F,0xB9,0x92,0xBA,0x13,0x44,0x1E,0xE0,0x80,0xFE,0x56,0x44,0x21, +0x00,0x48,0xFE,0x57,0xB9,0x93,0xFC,0x80,0x46,0x00,0x00,0x91,0x50,0x30,0x00,0x44, +0xB4,0x23,0x58,0x10,0x80,0x01,0xB6,0x23,0xB4,0x43,0x84,0x3E,0xFE,0x56,0xB6,0x23, +0xDD,0x9E,0x92,0x00,0x44,0x17,0x30,0x10,0xB4,0x01,0x96,0x06,0xC0,0xFE,0x44,0x17, +0x30,0x10,0xB4,0x01,0x92,0x03,0x96,0x06,0x5A,0x00,0x01,0xFD,0xDD,0x9E,0x84,0xA0, +0xD0,0x05,0x40,0x00,0x00,0x09,0x8C,0xA1,0xD5,0xFC,0xDD,0x9E,0xC9,0x08,0x44,0x24, +0x00,0x0C,0x96,0x06,0xA6,0x50,0x54,0x10,0x80,0xFE,0xD5,0x0A,0x5A,0x18,0x01,0x0B, +0x44,0x24,0x00,0x0C,0x96,0x06,0xA6,0x50,0x94,0x01,0x54,0x10,0x80,0xFD,0xFE,0x0F, +0xAE,0x10,0xDD,0x9E,0xC8,0x04,0x44,0x05,0x00,0x00,0xD5,0x03,0x44,0x05,0x00,0x10, +0xA6,0x02,0xDD,0x9E,0xC9,0x04,0x44,0x15,0x00,0x00,0xD5,0x05,0x5A,0x18,0x01,0x05, +0x44,0x15,0x00,0x10,0xAE,0x0A,0xDD,0x9E,0xC9,0x0A,0x44,0x24,0x80,0x80,0x96,0x06, +0x40,0x10,0x60,0x08,0xB4,0x62,0x46,0x0F,0xEF,0xFF,0xD5,0x0B,0x5A,0x18,0x01,0x0F, +0x44,0x24,0x80,0x80,0x96,0x06,0x40,0x10,0x64,0x08,0xB4,0x62,0x46,0x0F,0xDF,0xFF, +0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xCA,0x0C,0x44,0x40, +0xFA,0x00,0x42,0x20,0x10,0x24,0x40,0x11,0x04,0x0E,0x44,0x20,0x00,0x64,0x40,0x10, +0x88,0x36,0xD5,0x0E,0x3C,0x2D,0xF8,0xEF,0xFE,0x84,0x44,0x00,0x03,0xE8,0x40,0x21, +0x00,0x57,0x40,0x11,0x04,0x0D,0x44,0x20,0x00,0x64,0x40,0x10,0x88,0x37,0x96,0x49, +0xCB,0x04,0x44,0x05,0x00,0x04,0xD5,0x05,0x5A,0x38,0x01,0x05,0x44,0x05,0x00,0x14, +0xAC,0x40,0xDD,0x9E,0xC8,0x08,0x44,0x14,0x80,0x03,0x84,0x01,0xAE,0x08,0x44,0x15, +0x00,0x08,0xD5,0x09,0x5A,0x08,0x01,0x09,0x44,0x14,0x80,0x03,0x84,0x42,0xAE,0x88, +0x44,0x15,0x00,0x18,0xAE,0x09,0xDD,0x9E,0xC8,0x08,0x44,0x04,0x80,0x03,0x84,0x21, +0xAE,0x40,0x44,0x15,0x00,0x08,0xD5,0x09,0x5A,0x08,0x01,0x0C,0x44,0x04,0x80,0x03, +0x84,0x22,0xAE,0x40,0x44,0x15,0x00,0x18,0xA6,0x08,0x58,0x00,0x00,0x02,0xAE,0x08, +0xDD,0x9E,0xC8,0x08,0x44,0x04,0x80,0x03,0x84,0x21,0xAE,0x40,0x44,0x15,0x00,0x08, +0xD5,0x09,0x5A,0x08,0x01,0x0C,0x44,0x04,0x80,0x03,0x84,0x22,0xAE,0x40,0x44,0x15, +0x00,0x18,0xA6,0x08,0x54,0x00,0x00,0xFD,0xAE,0x08,0xDD,0x9E,0xC9,0x04,0x44,0x15, +0x00,0x00,0xD5,0x05,0x5A,0x18,0x01,0x05,0x44,0x15,0x00,0x10,0xAE,0x08,0xDD,0x9E, +0x84,0x21,0xC0,0x04,0x5A,0x08,0x01,0x06,0x84,0x22,0x44,0x04,0x80,0x03,0xAE,0x40, +0xDD,0x9E,0x44,0x04,0x80,0x00,0xA6,0x03,0x92,0x01,0x96,0x06,0xC0,0x1A,0xFC,0x00, +0x44,0x04,0x80,0x03,0x84,0x22,0xAE,0x40,0x49,0x00,0x3F,0xA6,0xC8,0x11,0x3C,0x0D, +0xF8,0xB4,0xC0,0x0E,0x49,0x00,0x3C,0x13,0x80,0xC0,0xC8,0x0A,0x49,0x00,0x24,0x51, +0x49,0x00,0x40,0xFD,0xC0,0x05,0x80,0x06,0x80,0x26,0x49,0x00,0x23,0xB6,0xFC,0x80, +0xDD,0x9E,0x46,0x20,0x00,0x81,0x84,0x3E,0xA0,0xD5,0x96,0x06,0xFE,0x5E,0xFE,0x0F, +0xA8,0x15,0xDD,0x9E,0x46,0x00,0x00,0x81,0xA0,0x05,0x96,0x06,0xDD,0x9E,0x44,0x24, +0x50,0x14,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E, +0x44,0x25,0x10,0x04,0xB4,0x22,0x92,0x30,0x40,0x10,0xC0,0x08,0xFE,0x0F,0xB6,0x02, +0xDD,0x9E,0x44,0x15,0x10,0x0C,0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01,0xDD,0x9E, +0x44,0x15,0x10,0x0C,0xB4,0x01,0x92,0x08,0x40,0x00,0x20,0x08,0x58,0x00,0x00,0x01, +0xB6,0x01,0x44,0x15,0x10,0x18,0xB4,0x01,0x96,0x00,0x5A,0x00,0x5A,0xFE,0xDD,0x9E, +0xFC,0x40,0x44,0x00,0x01,0x2C,0x49,0x00,0x00,0x72,0x44,0x75,0x10,0x0C,0x44,0x9F, +0xFF,0x98,0x84,0x00,0xAE,0x38,0xFA,0x18,0x10,0x93,0x80,0x00,0x49,0x00,0x00,0x67, +0x44,0x05,0x10,0x18,0x44,0x65,0x10,0x0C,0xB4,0x00,0x96,0x00,0x5A,0x00,0xA5,0xF3, +0xB4,0x06,0x92,0x08,0x40,0x00,0x20,0x08,0xB6,0x06,0xFC,0xC0,0xC0,0x04,0x5A,0x00, +0x01,0x1F,0xDD,0x9E,0x44,0x14,0x80,0x82,0x44,0x22,0x00,0x00,0xAE,0x08,0x44,0x14, +0x80,0x00,0x44,0x04,0x80,0x80,0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x44,0x24, +0x00,0x00,0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x46,0x20,0x01,0x00,0xB6,0x41, +0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x46,0x20,0x00,0x80,0xD5,0x23,0x44,0x04,0x80,0x82, +0x84,0x20,0xAE,0x40,0x44,0x14,0x80,0x00,0x44,0x04,0x80,0x80,0x44,0x21,0x00,0x00, +0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x44,0x22,0x00,0x00,0xB6,0x41,0xB4,0x60, +0xFE,0x9F,0xB6,0x40,0x44,0x24,0x00,0x00,0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40, +0x46,0x20,0x00,0x80,0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x46,0x20,0x01,0x00, +0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x46,0x20,0x02,0x00,0xB6,0x41,0xB4,0x60, +0xFE,0x9F,0xB6,0x40,0x46,0x20,0x04,0x00,0xB6,0x41,0xB4,0x20,0xFE,0x8F,0xB6,0x40, +0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xFC,0x72,0xFC,0x80,0x84,0x2E,0xFE,0x0C,0x8E,0x01, +0x5A,0x07,0xFF,0x05,0x40,0x00,0x00,0x09,0xD5,0xFB,0xDD,0x9E,0x44,0x10,0x36,0xB0, +0xFE,0x0C,0x8E,0x01,0x5A,0x07,0xFF,0x05,0x40,0x00,0x00,0x09,0xD5,0xFB,0xDD,0x9E, +0xFC,0x20,0x44,0x62,0x33,0x90,0x44,0x72,0x10,0x80,0x80,0x06,0x49,0x00,0x19,0xC8, +0xFD,0x03,0x49,0x00,0x1A,0x12,0xFD,0x03,0x50,0x23,0xFF,0xE8,0x50,0x33,0xFF,0xF4, +0x00,0x43,0x7F,0xF9,0x49,0x00,0x68,0x5E,0xFC,0xA0,0xFC,0x00,0x84,0x20,0x44,0x20, +0x0C,0x8C,0x44,0x02,0x33,0x90,0x49,0x00,0x5B,0xC7,0x49,0x00,0x1E,0xCB,0xFC,0x80, +0xFC,0x00,0x49,0x00,0x4D,0x86,0x50,0x30,0x04,0x80,0x3C,0x44,0x05,0x93,0x84,0x20, +0x2A,0x20,0x00,0x01,0xE0,0x82,0xE8,0x05,0x84,0x00,0x3E,0x07,0xEF,0x88,0xD5,0x22, +0x5E,0xF1,0x7F,0x38,0xE8,0x0B,0x8C,0x21,0x5E,0xF1,0x7E,0x70,0x96,0x49,0xE8,0x06, +0xE6,0x27,0x80,0x41,0xE8,0x02,0x84,0x47,0x96,0x51,0x4C,0x01,0xFF,0xEB,0xE6,0x27, +0xE9,0x08,0x84,0x01,0x3E,0x07,0xEF,0x89,0x2E,0x07,0xEF,0x88,0x8C,0x01,0xD5,0x04, +0x84,0x00,0x3E,0x07,0xEF,0x89,0x3E,0x07,0xEF,0x88,0x2E,0x07,0xEF,0x88,0xE6,0x02, +0xE8,0x03,0x84,0x00,0xD5,0x07,0x49,0x00,0x3A,0x83,0xC8,0xFC,0x3E,0x07,0xEF,0x88, +0x84,0x01,0xFC,0x80,0xFC,0x00,0x49,0x00,0x3A,0x7B,0xC8,0x04,0x49,0xFF,0xFF,0xC2, +0xFC,0x80,0x84,0x00,0xFC,0x80,0xFC,0x40,0xB4,0x80,0xA5,0x4C,0x22,0x30,0x80,0x02, +0xE0,0x85,0x22,0x70,0x80,0x05,0x22,0x60,0x80,0x03,0xE8,0x2B,0x96,0xD9,0xE0,0x83, +0x81,0x43,0x40,0x92,0x8C,0x01,0x40,0xA2,0x3C,0x1A,0x80,0xC9,0x4E,0x94,0x00,0x04, +0x52,0x64,0x80,0x00,0x40,0x21,0xA8,0x01,0x4E,0x24,0x00,0x03,0xFE,0x92,0x22,0x70, +0x80,0x00,0x40,0x15,0x0C,0x01,0x9A,0xEF,0xFE,0x5C,0x40,0x10,0xA4,0x36,0x88,0x27, +0xE0,0x27,0xE9,0x05,0xE0,0xA1,0x40,0x50,0xBC,0x1A,0x80,0xE5,0x9A,0x72,0xFF,0x14, +0x42,0x23,0x84,0x24,0x40,0x42,0x18,0x96,0x40,0x21,0x18,0x56,0x88,0x82,0xD5,0x38, +0x41,0xC3,0x80,0x13,0x40,0x91,0x70,0x01,0xE1,0x24,0xE8,0x35,0x40,0xA3,0x00,0x13, +0x40,0x31,0x28,0x01,0xE0,0x64,0x80,0xA3,0x40,0x7E,0x28,0x01,0x40,0x52,0x3C,0x1A, +0x4E,0x74,0x00,0x03,0xFF,0xFA,0x8A,0x65,0x4E,0x34,0x00,0x05,0x40,0x35,0x08,0x01, +0x88,0x65,0x22,0x80,0x80,0x01,0x9B,0x55,0x8A,0xAA,0x40,0x6E,0x20,0x01,0xFF,0x74, +0x40,0x15,0x70,0x01,0x40,0x12,0x84,0x36,0x8A,0x28,0x88,0x22,0xE0,0x29,0xE9,0x06, +0x8A,0x48,0xE0,0x41,0x40,0x20,0xBC,0x1A,0x81,0x22,0x9A,0x7B,0x42,0x52,0x0C,0x24, +0x42,0x34,0x84,0x24,0x40,0x52,0x9C,0xB6,0x40,0x31,0x9C,0x76,0x99,0x2B,0xB6,0x80, +0x84,0x01,0xFC,0xC0,0x84,0x00,0xFC,0xC0,0x3C,0x03,0xF7,0xC6,0x96,0x06,0xC0,0x5F, +0xFC,0x42,0x45,0xC2,0x33,0x90,0x84,0xE0,0x50,0x9E,0x01,0x18,0x00,0x0E,0x01,0x05, +0x9E,0x41,0xE6,0x22,0xE9,0x03,0x5A,0x08,0x04,0x4D,0xB0,0x43,0x84,0x40,0x80,0x1C, +0x49,0x00,0x00,0x88,0xF0,0x03,0x44,0x12,0x10,0x68,0x22,0x00,0x00,0x04,0xF0,0x81, +0x3C,0x63,0xEF,0x08,0xB0,0x01,0x80,0x46,0x49,0xFF,0xFF,0x6F,0x81,0x40,0x3C,0x27, +0xF7,0x3C,0xF0,0x01,0xF1,0x03,0xE0,0x02,0xE9,0x08,0x3C,0x27,0xF7,0x3D,0x9A,0xB2, +0xE0,0x02,0x40,0x20,0x3C,0x1B,0x96,0x93,0x22,0x00,0x80,0x05,0xAC,0x8C,0xF0,0x82, +0x44,0x12,0x10,0x74,0x3C,0x63,0xEF,0x09,0xB0,0x02,0x80,0x46,0x49,0xFF,0xFF,0x55, +0x81,0x00,0x3C,0x27,0xF7,0x42,0xF0,0x02,0xF1,0x03,0xE0,0x02,0xE9,0x08,0x3C,0x27, +0xF7,0x43,0x9A,0xB2,0xE0,0x02,0x40,0x20,0x3C,0x1B,0x96,0x93,0xAC,0x8D,0x80,0x1C, +0x49,0x00,0x00,0x3B,0x4E,0xA3,0x00,0x04,0x4E,0x82,0x00,0x0C,0x44,0x00,0x01,0x24, +0x80,0x29,0x42,0x13,0x80,0x73,0x80,0x01,0xA6,0x4F,0x58,0x10,0x80,0x40,0xAE,0x47, +0x8C,0xE1,0x51,0xCE,0x01,0x24,0x5A,0x78,0x0B,0xAB,0xFC,0xC2,0xDD,0x9E,0x04,0x30, +0x00,0x47,0x92,0x79,0x96,0xD7,0xE4,0x65,0xE8,0x1D,0xFC,0x00,0xFA,0x4C,0x80,0xC0, +0x42,0x01,0x88,0x73,0x49,0x00,0x5A,0x7A,0x04,0x13,0x00,0x47,0x50,0x03,0x01,0x1B, +0x92,0x39,0x8C,0x21,0x96,0x57,0xE6,0x25,0xE8,0x07,0xA6,0x84,0x94,0x49,0x54,0x21, +0x00,0xF1,0xFE,0x57,0xD5,0x04,0xA6,0x44,0x54,0x10,0x80,0xF1,0xAE,0x44,0x84,0x01, +0xFC,0x80,0x84,0x00,0xDD,0x9E,0x04,0x20,0x00,0x47,0x92,0x59,0x96,0x97,0xE4,0x45, +0xE8,0x0E,0xFC,0x00,0x9E,0xD1,0x96,0xD8,0x5A,0x38,0xFF,0x03,0x9C,0xD4,0xFA,0x4C, +0x42,0x01,0x88,0x73,0x49,0x00,0x5A,0x52,0x84,0x01,0xFC,0x80,0x84,0x00,0xDD,0x9E, +0xE6,0x45,0xE8,0x14,0x04,0x30,0x00,0x47,0x92,0x79,0x96,0xD7,0x9A,0x9A,0x96,0x90, +0x9E,0xD1,0x96,0xD8,0x97,0x1A,0x4E,0x44,0x00,0x04,0x8C,0x44,0x96,0xD0,0xFA,0x4C, +0x42,0x01,0x88,0x73,0xB6,0x01,0x84,0x01,0xDD,0x9E,0x84,0x00,0xDD,0x9E,0xFC,0x40, +0x85,0x46,0x80,0xC0,0x50,0x90,0x04,0x80,0x84,0xE0,0x49,0xFF,0xFE,0x5C,0xE6,0x03, +0xE9,0x08,0x38,0x03,0x1D,0x11,0x42,0x00,0x28,0x24,0x90,0x01,0x38,0x03,0x1D,0x09, +0x8C,0xE1,0x5A,0x78,0x12,0xF4,0x50,0x63,0x00,0x24,0x4C,0x64,0xFF,0xEF,0xFC,0xC0, +0xFC,0x40,0xFF,0x92,0x81,0x40,0x80,0xE1,0x80,0x01,0x81,0x22,0x84,0x20,0x44,0x20, +0x00,0x40,0x49,0x00,0x5A,0x39,0x97,0xB3,0x84,0x80,0x84,0x49,0xFA,0x22,0x83,0x8A, +0x42,0x82,0x08,0x24,0x43,0xC2,0x04,0x73,0x84,0x00,0x38,0x3E,0x01,0x11,0x97,0x40, +0xE0,0x69,0xE9,0x06,0x96,0x2A,0x4E,0x05,0x00,0x20,0xFA,0x61,0xD5,0x12,0xE0,0xC3, +0xE8,0xFA,0x8C,0x01,0x5A,0x08,0x12,0xF3,0xD5,0x17,0x40,0xF1,0xA0,0x00,0x39,0xC5, +0x3D,0x11,0x40,0xFE,0x24,0x07,0xE8,0x08,0xE0,0xDC,0xE8,0x06,0x8E,0x61,0x96,0xD8, +0xE0,0x60,0xE8,0xF4,0xD5,0x03,0x96,0xDA,0xD5,0x02,0x84,0x7F,0x98,0x3C,0x8C,0x61, +0x38,0x53,0x90,0x08,0xAE,0xC1,0x8C,0x82,0x5A,0x48,0x40,0xD3,0xFC,0xC0,0xFC,0x42, +0x84,0xA0,0x80,0xE5,0x81,0x25,0xA7,0x89,0x55,0xC2,0x80,0xFF,0xF6,0x82,0xFA,0xC2, +0xFF,0xAC,0xF6,0x83,0x2E,0x67,0xEF,0x92,0xA7,0x08,0x2F,0xE7,0xEF,0x93,0xF6,0x81, +0x2E,0x87,0xEF,0x91,0x2E,0xA7,0xEF,0x90,0xF6,0x02,0xE2,0x86,0xE8,0x13,0xF6,0x03, +0x88,0xC4,0x38,0x60,0x19,0x11,0xE1,0x26,0xE8,0x05,0x15,0xCF,0x80,0x01,0x83,0xC4, +0x81,0x26,0xE0,0xC7,0xE8,0x04,0x81,0x5C,0x81,0x04,0x80,0xE6,0x8C,0x81,0x97,0x20, +0xD5,0xEC,0x00,0x4F,0x80,0x04,0x8C,0xA1,0x3F,0xE7,0xEF,0x93,0x3E,0x47,0xEF,0x92, +0x3E,0x87,0xEF,0x91,0x3E,0xA7,0xEF,0x90,0x8C,0x22,0x5A,0x58,0x20,0xCE,0x12,0x91, +0x00,0x00,0xAD,0xD8,0xFC,0xC2,0xFC,0x41,0x81,0x20,0x80,0xE1,0x80,0x02,0xFA,0x2F, +0x81,0x42,0x44,0x20,0x02,0x40,0xB6,0x7F,0xF4,0x81,0x49,0x00,0x59,0xBD,0x84,0x60, +0x80,0xC3,0x80,0x23,0x80,0xA3,0x84,0x09,0x38,0x43,0x8C,0x00,0x43,0xE1,0x80,0x24, +0x41,0xC3,0x8C,0x00,0x00,0x0E,0x00,0x01,0xE2,0x80,0xE8,0x1B,0x40,0x22,0x78,0x00, +0xB5,0x1F,0x38,0x04,0x89,0x11,0xE1,0x00,0x88,0x20,0xE8,0x10,0x04,0x8F,0x80,0x01, +0x8C,0xC1,0xE1,0x00,0x97,0xB3,0xE8,0x04,0x44,0x00,0x00,0xDF,0xD5,0x03,0x44,0x00, +0x00,0x5F,0x8C,0xA1,0x38,0x05,0x08,0x08,0x97,0x69,0x8C,0x81,0x97,0x20,0xD5,0xE3, +0x8C,0x62,0x5A,0x38,0x40,0xDA,0x3C,0x1F,0xFC,0x58,0x3C,0x6B,0xF8,0xB2,0x80,0x05, +0xFC,0xC1,0xFC,0x48,0xFA,0x94,0x50,0x50,0x00,0x24,0x84,0x20,0x80,0x61,0x44,0x60, +0x7F,0xFF,0x42,0x20,0x90,0x24,0x38,0x20,0x08,0x11,0x38,0x2F,0x85,0x09,0xE0,0x46, +0x40,0x61,0x3C,0x1B,0x8C,0x21,0xE0,0x62,0x40,0x31,0x3C,0x1B,0x5A,0x18,0x20,0xF3, +0x3C,0x14,0x05,0xAF,0xE0,0x23,0xE9,0x05,0x8C,0x02,0x4C,0x02,0xFF,0xE8,0xFC,0xC8, +0x84,0x60,0x80,0x43,0x80,0xE3,0x38,0x9F,0x8D,0x11,0x40,0xA4,0x98,0x01,0xE1,0x41, +0xE8,0x04,0x8C,0x41,0x88,0xE9,0x96,0x90,0x8C,0x61,0x5A,0x38,0x20,0xF6,0xCA,0x02, +0x84,0x41,0x40,0x11,0x04,0x09,0x88,0x27,0x40,0x10,0x88,0x36,0x5E,0xF0,0x80,0xC9, +0xE9,0x04,0x44,0x10,0x00,0xC8,0xD5,0x04,0x4E,0x14,0x00,0x03,0x84,0x20,0x40,0x60, +0x84,0x0A,0x97,0xB1,0x84,0x60,0x3C,0x74,0x05,0xAF,0x38,0x2F,0x8D,0x11,0x88,0xE1, +0xE0,0xE2,0x42,0x71,0x90,0x24,0xE8,0x03,0x8A,0x46,0xD5,0x02,0x8A,0x41,0x8C,0x61, +0x38,0x20,0x1C,0x09,0x5A,0x38,0x20,0xF1,0xD5,0xC8,0xFC,0x00,0x84,0xC0,0x84,0x03, +0x84,0x20,0x3E,0x67,0xEF,0xAD,0x49,0x00,0x53,0x73,0x84,0x04,0x84,0x20,0x49,0x00, +0x53,0x6F,0x84,0x09,0x84,0x20,0x49,0x00,0x53,0x6B,0x84,0x0E,0x84,0x20,0x49,0x00, +0x53,0x67,0x84,0x0F,0x84,0x20,0x49,0x00,0x53,0x63,0x84,0x0A,0x84,0x20,0x49,0x00, +0x53,0x5F,0x84,0x0B,0x84,0x20,0x49,0x00,0x53,0x5B,0x3E,0x67,0xEF,0xAC,0xFC,0x80, +0xFC,0x21,0x44,0x52,0x00,0x00,0x80,0xE2,0x80,0xC3,0xA4,0xA8,0xA4,0xE9,0x22,0x10, +0x80,0x00,0x22,0x00,0x00,0x00,0x9A,0x59,0x9A,0x10,0xB6,0x1F,0xF1,0x81,0xA5,0x2C, +0x3A,0x0F,0x84,0x00,0xA5,0x6D,0x49,0x00,0x1F,0x15,0x3A,0x0F,0x84,0x20,0xB4,0x1F, +0xAC,0x38,0xF0,0x01,0xAC,0x30,0xFC,0xA1,0x46,0x27,0xFF,0xFF,0x84,0x20,0x44,0x52, +0x2F,0x04,0x50,0x21,0x0F,0xFF,0x44,0x32,0x2E,0xD8,0x38,0x22,0x86,0x0A,0x38,0x21, +0x86,0x0A,0x8C,0x21,0x44,0x42,0x2F,0x04,0x5A,0x18,0x0B,0xF9,0xFC,0x40,0x2E,0x37, +0xE2,0x44,0x84,0xA0,0x40,0x91,0x88,0x08,0x81,0x44,0xD3,0x14,0x40,0x70,0x24,0x00, +0x80,0x40,0x4C,0x23,0x80,0x0B,0x38,0x62,0x16,0x02,0xA2,0x51,0xE0,0xC1,0x40,0x13, +0x3C,0x1B,0x38,0x15,0x16,0x0A,0xD5,0xF6,0x8C,0xA1,0x97,0x68,0x50,0x00,0x00,0x2C, +0xD5,0xED,0xFC,0xC0,0x2E,0x27,0xE2,0x44,0x46,0x18,0x00,0x00,0x84,0x00,0x44,0x42, +0x2E,0xAC,0x44,0x52,0x2E,0x80,0xE0,0x02,0xE8,0x0B,0x38,0x32,0x02,0x02,0xCB,0x06, +0x38,0x32,0x82,0x02,0xE0,0x23,0x40,0x11,0xBC,0x1B,0x8C,0x01,0xD5,0xF5,0x84,0x00, +0x44,0x52,0x2E,0x54,0x44,0x42,0x2F,0x04,0xE0,0x02,0xE8,0x0B,0x38,0x32,0x82,0x02, +0xC3,0x06,0x38,0x32,0x02,0x02,0x8A,0x61,0x38,0x32,0x02,0x0A,0x8C,0x01,0xD5,0xF5, +0x84,0x00,0x44,0x52,0x2E,0xAC,0x44,0x42,0x2E,0xD8,0xE0,0x02,0xE8,0x0B,0x38,0x32, +0x82,0x02,0xC3,0x06,0x38,0x32,0x02,0x02,0x88,0x61,0x38,0x32,0x02,0x0A,0x8C,0x01, +0xD5,0xF5,0x84,0x00,0x44,0x52,0x2E,0xAC,0x44,0x42,0x2E,0x80,0xE0,0x02,0xE8,0x0B, +0x38,0x32,0x82,0x02,0xCB,0x06,0x38,0x32,0x02,0x02,0x8A,0x61,0x38,0x32,0x02,0x0A, +0x8C,0x01,0xD5,0xF5,0xDD,0x9E,0xFC,0x40,0x44,0x32,0x2E,0x54,0x84,0x81,0x38,0x41, +0x82,0x0A,0x44,0x32,0x2F,0x30,0x2E,0x57,0xE2,0x44,0x38,0x11,0x82,0x0A,0xFA,0x3C, +0x42,0x20,0x04,0x73,0x44,0x62,0x2F,0x04,0x84,0x20,0x44,0x72,0x2E,0xD8,0x44,0x42, +0x2E,0x80,0x44,0x92,0x2D,0xFC,0x96,0xC8,0xE2,0x65,0xE8,0x13,0x38,0xA3,0x02,0x02, +0x38,0x33,0x86,0x02,0x88,0x6A,0x38,0xA1,0x06,0x02,0x8A,0x6A,0x38,0xA2,0x06,0x02, +0xE1,0x43,0xE8,0x05,0x38,0x32,0x06,0x0A,0x38,0x04,0x86,0x0A,0x8C,0x21,0xD5,0xEC, +0xFC,0xC0,0xFC,0x48,0x44,0xA2,0x2F,0x5C,0xB6,0x1F,0x2E,0x97,0xE2,0x44,0x2E,0x57, +0xEF,0x14,0x4C,0x54,0x80,0xE0,0x84,0x20,0xFA,0x5C,0x44,0x02,0x2E,0x54,0x49,0x00, +0x58,0x43,0x84,0x20,0xFA,0x5C,0x44,0x02,0x2E,0xAC,0x49,0x00,0x58,0x3D,0x44,0x02, +0x2F,0x30,0x84,0x3F,0xFA,0x5C,0x49,0x00,0x58,0x37,0x84,0xE0,0xE0,0xE9,0xE8,0x15, +0x38,0x05,0x1E,0x02,0x5A,0x0F,0xFF,0x10,0x44,0x02,0x2F,0x30,0x84,0x3E,0x38,0x10, +0x1E,0x0A,0x44,0x02,0x2E,0x54,0x84,0x21,0xF7,0x85,0x38,0x10,0x1E,0x0A,0x80,0xC9, +0x80,0x47,0xD5,0x06,0x8C,0xE1,0xD5,0xEB,0x84,0x20,0x80,0xC9,0x80,0x41,0xFA,0x1C, +0xB4,0x7F,0x42,0x31,0x00,0x73,0x84,0xA0,0x45,0xE2,0x2E,0x80,0x44,0x42,0x2F,0x04, +0x44,0x82,0x2E,0xD8,0x44,0xF2,0x2D,0xFC,0x4C,0x54,0x80,0x10,0x39,0xC2,0x0A,0x02, +0x38,0x04,0x16,0x02,0x88,0x1C,0x39,0xC1,0x96,0x02,0x38,0x27,0x96,0x0A,0x8A,0x1C, +0x38,0x0F,0x16,0x0A,0x8C,0xA1,0xD5,0xF1,0x85,0x20,0x44,0x82,0x2E,0xAC,0xE1,0x21, +0xE8,0x39,0xB0,0x05,0x05,0xCF,0x80,0x00,0x38,0x70,0x26,0x02,0xFA,0x1C,0x43,0xC3, +0x80,0x73,0x84,0xC0,0x44,0x42,0x2F,0x04,0x44,0x52,0x2E,0xD8,0x2E,0x07,0xE2,0x44, +0xE0,0xC0,0x4E,0xF2,0x00,0x7D,0x38,0x22,0x1E,0x02,0x38,0x02,0x9A,0x02,0x94,0xF2, +0x88,0x02,0x38,0x2E,0x1A,0x02,0x4C,0x20,0x40,0x1C,0x38,0x04,0x1A,0x02,0xC8,0x18, +0x44,0x02,0x2E,0x28,0xF5,0x83,0x38,0x00,0x0C,0x02,0xF4,0x82,0x5A,0x07,0xFF,0x13, +0x84,0x41,0x38,0x24,0x0C,0x0A,0x88,0x41,0xF2,0x81,0xB0,0x85,0x38,0x01,0x06,0x0A, +0x80,0x27,0xB4,0x5F,0x49,0xFF,0xFF,0x49,0xF1,0x01,0xF5,0x03,0xF4,0x02,0x8C,0xC1, +0xD5,0xD6,0x2E,0x07,0xE2,0x44,0xE0,0xC0,0xE9,0x37,0x49,0xFF,0xFE,0xF5,0x84,0x20, +0x80,0xC1,0x45,0xC2,0x2E,0x80,0x2E,0x07,0xE2,0x44,0xE0,0xC0,0xE8,0x2A,0x38,0x04, +0x1A,0x02,0x94,0xB2,0xC8,0x24,0x38,0x0E,0x1A,0x02,0xC8,0x21,0x44,0x02,0x2E,0x28, +0x38,0x00,0x08,0x02,0x5A,0x0F,0xFF,0x07,0x44,0x02,0x2D,0xFC,0x38,0x70,0x1A,0x02, +0xD5,0x1B,0x84,0x61,0x38,0x34,0x08,0x0A,0x44,0x32,0x2E,0x54,0x38,0x31,0x82,0x02, +0xCB,0x0E,0xB0,0xC5,0x50,0x90,0x80,0x01,0x38,0x01,0x86,0x0A,0x44,0x12,0x2D,0xFC, +0x38,0x10,0x88,0x02,0xB4,0x5F,0x49,0xFF,0xFF,0x10,0x80,0x29,0x8C,0xC1,0xD5,0xD4, +0x85,0x20,0x48,0xFF,0xFF,0x8E,0x2E,0x07,0xE2,0x44,0xE0,0xC0,0xE8,0x1B,0x2E,0x07, +0xEF,0x14,0x44,0x12,0x2F,0x30,0x8C,0x01,0x3E,0x07,0xEF,0x14,0x44,0x02,0x2E,0x28, +0x5A,0x7F,0xFE,0x04,0x48,0xFF,0xFF,0x2B,0x38,0x25,0x1E,0x02,0x38,0x70,0x1A,0x0A, +0x38,0x65,0x1E,0x0A,0x38,0x70,0x9E,0x02,0x80,0xC2,0xD5,0xF3,0x8D,0x21,0x48,0xFF, +0xFF,0x70,0xFC,0xC8,0xFC,0x01,0xF0,0x81,0x84,0x00,0x80,0xC1,0x3E,0x07,0xEF,0x14, +0x84,0x3F,0xFA,0x5C,0x44,0x02,0x2F,0x5C,0x49,0x00,0x57,0x5E,0x84,0x3F,0xFA,0x5C, +0x44,0x02,0x2E,0x28,0x49,0x00,0x57,0x58,0xF0,0x01,0x3E,0x67,0xE2,0x44,0x49,0xFF, +0xFE,0x5D,0xF0,0x01,0x49,0xFF,0xFE,0xFF,0xFC,0x81,0x00,0x00,0x3A,0x6F,0xAA,0xBC, +0xEF,0xEC,0x9E,0x11,0xF0,0x81,0x83,0x81,0x84,0x80,0x85,0x40,0x4E,0x07,0x00,0x36, +0xF0,0x01,0x84,0xC0,0x40,0x80,0x10,0x01,0x4E,0x86,0x00,0x08,0xD5,0x27,0x8C,0xC1, +0x97,0xB0,0xE0,0xC8,0x4E,0xF2,0x00,0x23,0x40,0x93,0x08,0x08,0x50,0x34,0x80,0x04, +0x38,0x0E,0x1A,0x11,0x38,0x1E,0x0C,0x11,0x89,0x3C,0xE0,0x01,0x40,0x7E,0x0C,0x00, +0xE8,0xEF,0x84,0x44,0x80,0x29,0xB0,0x03,0x49,0x00,0x57,0x00,0x8C,0xC1,0x80,0x27, +0x84,0x44,0x80,0x09,0x49,0x00,0x56,0xFA,0x97,0xB0,0x80,0x07,0xB0,0x43,0x84,0x44, +0x49,0x00,0x56,0xF4,0x40,0x03,0x20,0x07,0xC8,0xE0,0x8D,0x41,0xF0,0x01,0x54,0xA5, +0x00,0xFF,0xE1,0x40,0x80,0x8A,0xE9,0xCD,0xEC,0x14,0x3A,0x6F,0xAA,0x84,0xDD,0x9E, +0xC3,0x66,0x3A,0x6F,0xAA,0xBC,0x8E,0x61,0xA7,0x83,0x00,0x90,0x00,0x02,0x96,0xD8, +0x94,0xD9,0x2E,0x77,0xDE,0x16,0x8C,0x63,0x9D,0x51,0xEF,0xFC,0x2E,0x07,0xDE,0x17, +0x88,0x43,0xFB,0x4F,0x87,0x80,0x85,0x00,0x00,0x32,0xFF,0xFF,0x20,0xF2,0x80,0x00, +0x88,0x66,0x96,0xDA,0x4E,0x35,0x00,0x24,0x41,0xE1,0x9C,0x07,0x4F,0xE2,0x00,0x20, +0x40,0xF4,0xBC,0x00,0x40,0xF7,0x80,0x10,0x4E,0xF5,0x00,0x1A,0x41,0xE7,0x80,0x07, +0x4F,0xE2,0x00,0x16,0x83,0xC1,0x43,0xE3,0xBC,0x73,0x38,0x3F,0x0C,0x00,0x54,0xF1, +0x80,0x20,0xE8,0x0D,0x54,0xF1,0x80,0x3F,0x5A,0xF0,0x3F,0x24,0x54,0xF1,0x80,0x1F, +0x5A,0xF0,0x1F,0x06,0x4E,0x83,0x00,0x18,0x81,0x43,0x85,0x01,0x8C,0xA2,0xDA,0xD5, +0xE7,0x02,0xE9,0x1E,0xA6,0x60,0x44,0x00,0x00,0x3F,0xE6,0x39,0xE8,0x08,0x94,0x8A, +0x88,0x44,0x8C,0x21,0xAF,0x95,0x10,0x91,0x00,0x04,0xAE,0x60,0xEC,0x04,0x3A,0x6F, +0xAA,0x84,0xDD,0x9E,0x4C,0x35,0x3F,0xEC,0x8D,0x01,0x54,0x84,0x00,0xFF,0xD5,0xE9, +0x51,0xCE,0x00,0x01,0x8C,0xA2,0x55,0xCE,0x00,0xFF,0xDA,0xB7,0xD5,0xE2,0x80,0x0A, +0x4E,0x83,0xFF,0xEE,0xFA,0x0F,0x4F,0xC2,0xFF,0xEB,0xD5,0xDD,0xFA,0x0F,0xDD,0x9E, +0x3A,0x6F,0xAA,0xBC,0xEF,0xD4,0x44,0x02,0x00,0x68,0x80,0xC2,0xF2,0x81,0x81,0x43, +0xF4,0x84,0xF5,0x82,0x3A,0x20,0x14,0x00,0x22,0x0F,0x80,0x24,0xF0,0x85,0x00,0x0F, +0x80,0x4C,0xF0,0x83,0xB0,0x06,0x3A,0x20,0x14,0x20,0x4E,0xA2,0x00,0x23,0x81,0x21, +0x2E,0x87,0xDE,0x16,0xA6,0x72,0xA6,0x33,0x80,0x69,0x42,0x30,0xA0,0x73,0x38,0x01, +0x80,0x00,0x80,0x26,0x96,0x2E,0x8C,0x27,0x84,0xC0,0xC8,0x0E,0x48,0x00,0x00,0x20, +0x00,0x20,0x7F,0xFF,0x80,0x69,0xA6,0x00,0x42,0x31,0x20,0x73,0x38,0x01,0x80,0x00, +0x8C,0x24,0x96,0x2E,0xC0,0x14,0x8C,0xC1,0x97,0xB0,0x80,0x01,0x4C,0x65,0x7F,0xF2, +0xF0,0x04,0xEC,0x2C,0x3A,0x6F,0xAA,0x84,0xDD,0x9E,0xA6,0xBA,0xA6,0x7B,0x80,0x69, +0x42,0x31,0x20,0x73,0x38,0x01,0x84,0x08,0x8C,0xC1,0x97,0xB0,0xE2,0xCA,0xE8,0xF1, +0xF0,0x01,0x41,0xC3,0x08,0x08,0x40,0x70,0x70,0x00,0x80,0x07,0x80,0x29,0xB0,0x86, +0xF3,0x03,0xF4,0x02,0x49,0xFF,0xFF,0x46,0x5A,0x08,0x1F,0xE9,0xF0,0x04,0xE6,0x0B, +0xE8,0xEC,0xF0,0x01,0xF3,0x05,0xF2,0x04,0x38,0x00,0x70,0x11,0x58,0x11,0x00,0x20, +0xE0,0x03,0x8C,0x41,0xE9,0xE2,0xA6,0xFA,0xA6,0x3B,0x80,0x89,0x42,0x41,0xA0,0x73, +0x96,0x90,0xF2,0x84,0x38,0x12,0x00,0x08,0xD5,0xD8,0x92,0x00,0xB4,0x81,0x3A,0x6F, +0xA8,0xBC,0xB5,0x00,0xA1,0x81,0xA0,0x09,0xA0,0x4A,0xC4,0x07,0x44,0xA0,0x7F,0xFF, +0xFA,0xA0,0x80,0xEA,0x48,0x00,0x00,0x25,0xC8,0xFA,0xD5,0x4D,0xE1,0x49,0xE8,0x26, +0x85,0xFF,0x4E,0x45,0x00,0x03,0x85,0xE1,0x40,0x44,0x84,0x0A,0x42,0x47,0x90,0x24, +0x85,0x21,0x4E,0x04,0x00,0x03,0x85,0x3F,0x4E,0x04,0x00,0x03,0xFE,0x02,0x90,0x01, +0x42,0x04,0x80,0x24,0x85,0x21,0x4E,0x14,0x00,0x03,0x85,0x3F,0x4E,0x14,0x00,0x03, +0xFE,0x4A,0x8E,0xA1,0x90,0x21,0x97,0x68,0x42,0x14,0x84,0x24,0xC5,0x0E,0x81,0x24, +0x4E,0x44,0xFF,0xDE,0x52,0x92,0x00,0x00,0xD5,0xDA,0x81,0xE0,0x4E,0x04,0x00,0x04, +0x52,0xF0,0x00,0x00,0xE0,0xEF,0xE9,0xD5,0xFF,0x84,0x42,0x62,0x20,0x73,0xFE,0x04, +0x88,0xC1,0x42,0x02,0x10,0x73,0x81,0x22,0x80,0xE3,0x49,0x00,0x0C,0x15,0x84,0x41, +0x4E,0x64,0x00,0x04,0x44,0x2F,0xFF,0xFF,0x10,0x24,0x80,0x00,0x80,0x26,0x4E,0x64, +0x00,0x03,0xFE,0x72,0x40,0x10,0x80,0x36,0x40,0x00,0x94,0x0A,0x96,0x02,0xB6,0x27, +0x42,0x00,0x00,0x24,0x3A,0x6F,0xA8,0x84,0xDD,0x9E,0x92,0x00,0xE6,0x62,0xE9,0x3A, +0xA5,0x08,0xE0,0x80,0xE9,0x04,0xA4,0x10,0x4A,0x00,0x78,0x20,0x46,0x47,0xFF,0xFF, +0x50,0x42,0x0F,0xFF,0x88,0x83,0x38,0x50,0x91,0x01,0xE0,0x05,0xE8,0x28,0x3A,0x6F, +0xA4,0x3C,0x84,0x80,0x8E,0x61,0xE0,0x83,0xE8,0x20,0x9D,0x61,0x95,0xE1,0x38,0x40, +0x91,0x01,0x97,0x69,0xE0,0x04,0xE9,0x17,0x38,0x60,0x95,0x01,0x40,0x92,0x84,0x08, +0xE0,0x06,0xE8,0x11,0x38,0x11,0x1C,0x01,0x9B,0x04,0x38,0x51,0x24,0x01,0x9A,0x30, +0x98,0xE0,0xFE,0x0C,0x42,0x02,0x14,0x73,0x40,0x11,0x84,0x0A,0x88,0x01,0x40,0x00, +0x0C,0x16,0xD5,0x0B,0x80,0x85,0xD5,0xE0,0x84,0x00,0xD5,0x07,0x38,0x01,0x11,0x01, +0xDD,0x9E,0x84,0x00,0x4A,0x00,0x78,0x20,0x3A,0x6F,0xA4,0x04,0xDD,0x9E,0x92,0x00, +0x3A,0x6F,0xA8,0xBC,0x80,0xC0,0x81,0x21,0x80,0xE2,0x4E,0x14,0x00,0x05,0xFF,0x82, +0x52,0x90,0x80,0x00,0x80,0x06,0x49,0x00,0x0B,0xDA,0x81,0x40,0x80,0x09,0x49,0x00, +0x0B,0xD6,0x8A,0x0A,0x80,0x2A,0x96,0x00,0xE6,0x36,0xE9,0x0E,0x84,0x41,0x4E,0x64, +0x00,0x03,0x84,0x5F,0x4E,0x64,0x00,0x03,0xFF,0xB2,0x90,0xC1,0x8E,0x21,0xFF,0x94, +0x91,0x21,0x96,0x48,0xD5,0xF2,0x98,0x81,0x96,0x90,0xE6,0x56,0xE8,0xF0,0xCE,0x05, +0x4E,0x92,0x00,0x43,0x81,0x46,0xD5,0x06,0x81,0x46,0x4E,0x64,0x00,0x04,0x52,0xA3, +0x00,0x00,0xE1,0x2A,0xE8,0x08,0x40,0x34,0xA0,0x08,0x40,0x31,0x98,0x76,0x4E,0x34, +0x00,0x0B,0xD5,0x07,0x40,0x33,0x20,0x08,0x40,0x31,0xA4,0x76,0x4E,0x34,0x00,0x04, +0x52,0x31,0x80,0x00,0x44,0x12,0x04,0x38,0x80,0x03,0x50,0x20,0x80,0x16,0x84,0x6B, +0x49,0xFF,0xFF,0x76,0xE1,0x2A,0x84,0x2A,0xE8,0x06,0x52,0x00,0x03,0x84,0x40,0x00, +0x04,0x16,0xD5,0x03,0x40,0x00,0x04,0x16,0x4E,0x65,0x00,0x04,0x52,0x00,0x00,0x00, +0x5A,0x07,0xA6,0x06,0x5E,0xF0,0x7F,0xA7,0xE9,0x0A,0xD5,0x03,0x44,0x00,0x00,0x5A, +0x5E,0xF0,0x00,0x5B,0xE9,0x06,0x44,0x00,0x00,0x5A,0xD5,0x03,0x44,0x0F,0xFF,0xA7, +0xB6,0x07,0x84,0x01,0xD5,0x02,0x80,0x09,0x3A,0x6F,0xA8,0x84,0xDD,0x9E,0x92,0x00, +0x3A,0x6F,0xA8,0xBC,0x80,0xE0,0x84,0x00,0xAE,0x10,0xEF,0xF8,0xB4,0x07,0x81,0x21, +0x50,0xA1,0x00,0x00,0x49,0x00,0x0B,0x6B,0x10,0x0F,0x80,0x04,0x04,0x03,0x80,0x01, +0x49,0x00,0x0B,0x65,0x10,0x0F,0x80,0x05,0x50,0x83,0x80,0x08,0x04,0x03,0x80,0x02, +0x49,0x00,0x0B,0x5D,0x10,0x0F,0x80,0x06,0x04,0x04,0x00,0x01,0x49,0x00,0x0B,0x57, +0x10,0x0F,0x80,0x07,0x00,0x1F,0x80,0x04,0xE6,0x2F,0xE8,0x0F,0x00,0x0F,0x80,0x07, +0xE6,0x0F,0xE8,0x0B,0x88,0x01,0x5A,0x00,0x1C,0x09,0x00,0x1F,0x80,0x06,0x00,0x0F, +0x80,0x05,0x88,0x01,0xE4,0x1C,0xE9,0x26,0x80,0xA7,0x84,0x20,0xB0,0x01,0x98,0x81, +0x50,0x32,0x80,0x08,0xB4,0x05,0x84,0x81,0x4E,0x04,0x00,0x04,0x44,0x4F,0xFF,0xFF, +0x4E,0x04,0x00,0x03,0xFE,0x02,0x90,0x01,0xFE,0x24,0xAA,0x29,0xA6,0x10,0xE4,0x02, +0xE9,0x07,0x5E,0xF0,0x00,0x22,0xE8,0x06,0x8E,0x01,0x96,0x00,0xD5,0x04,0x84,0x01, +0xD5,0x02,0xFA,0x10,0x18,0x01,0x00,0x01,0xDB,0xE6,0x8C,0x22,0x5A,0x18,0x04,0xE0, +0xD5,0xCA,0xB4,0x67,0x04,0x24,0x00,0x01,0xA0,0x79,0xA1,0x3A,0x42,0x01,0x88,0x24, +0x42,0x02,0x04,0x75,0xFF,0x9A,0x84,0x3C,0x8A,0xC2,0xFE,0x0C,0x42,0x03,0x18,0x73, +0x4E,0x05,0x00,0x67,0xCB,0x0C,0x44,0x00,0x00,0x40,0x14,0x04,0x80,0x01,0x44,0x00, +0x00,0x64,0xB6,0x69,0x10,0x05,0x00,0x00,0x48,0x00,0x00,0x53,0xCA,0x0C,0x44,0x00, +0x00,0x40,0xB6,0x09,0x44,0x00,0x00,0x64,0x14,0x24,0x80,0x01,0x10,0x05,0x00,0x00, +0x48,0x00,0x00,0x47,0x49,0x00,0x0A,0xC8,0x9A,0x46,0xFF,0xB2,0x9B,0x30,0xB4,0xC7, +0x04,0x04,0x00,0x01,0x90,0x81,0x88,0x06,0xE0,0x80,0x90,0x21,0xE8,0x16,0x9A,0xC1, +0x44,0x20,0x00,0x64,0xFE,0xD4,0x9B,0x04,0x40,0x61,0x90,0xD6,0x4E,0x65,0x00,0x0A, +0x5E,0xF3,0x00,0x65,0xE9,0x02,0x80,0xC2,0x52,0x63,0x00,0x64,0x97,0xB0,0xD5,0x03, +0x50,0x61,0x00,0x00,0x10,0x65,0x00,0x00,0xA0,0xF9,0xFF,0x1A,0x4E,0x45,0x00,0x03, +0x80,0x64,0xB4,0x47,0x8A,0x41,0x80,0x02,0x4E,0x24,0x00,0x03,0xFE,0x12,0xA1,0xBA, +0x88,0x60,0xFF,0x72,0x4E,0x55,0x00,0x04,0x50,0x62,0x80,0x00,0x04,0x04,0x00,0x01, +0x9A,0x41,0x80,0x01,0x4E,0x14,0x00,0x03,0xFE,0x0A,0x88,0x06,0xE0,0x03,0xE8,0x05, +0xB6,0x89,0x14,0x24,0x80,0x01,0xD5,0x04,0xB6,0x29,0x14,0x54,0x80,0x01,0xB4,0x09, +0xC8,0x09,0x04,0x04,0x80,0x01,0xC8,0x06,0x10,0x05,0x00,0x00,0xD5,0x04,0x84,0x00, +0xD5,0x02,0x84,0x01,0xEC,0x08,0x3A,0x6F,0xA8,0x84,0xDD,0x9E,0x3A,0x6F,0xAA,0xBC, +0xEF,0x9C,0x85,0x00,0x81,0x40,0x80,0xE1,0xB6,0x5F,0x80,0x28,0xFA,0x40,0xB0,0x14, +0x81,0x23,0x80,0xC4,0x14,0x8F,0x80,0x04,0x95,0xFA,0x49,0x00,0x54,0x3D,0x80,0x28, +0xB0,0x06,0x84,0x48,0x49,0x00,0x54,0x38,0x88,0xEA,0x80,0xAA,0x50,0x14,0x00,0x00, +0x45,0xE2,0x30,0x20,0xD7,0x3C,0xA6,0x2B,0x22,0x82,0x80,0x00,0x44,0x32,0x33,0x08, +0x38,0x2F,0x01,0x01,0x88,0x28,0x8A,0x49,0xF2,0x8C,0xA6,0x2A,0x5E,0xF1,0x0C,0x9A, +0x38,0x01,0x81,0x01,0x8A,0x06,0xF0,0x8D,0xE8,0x28,0x5E,0xF0,0x19,0x33,0xE8,0x25, +0x91,0x05,0x84,0x80,0xB0,0x0C,0xB0,0x94,0x38,0xF0,0x12,0x02,0x94,0x23,0x88,0x02, +0x84,0x60,0xB0,0x8C,0x38,0x21,0x0E,0x02,0x42,0x27,0x88,0x24,0x4E,0x27,0x00,0x04, +0x90,0x48,0xD5,0x05,0xFE,0x92,0x90,0x48,0x52,0x21,0x00,0x00,0x05,0xC0,0x00,0x00, +0x43,0xC1,0x20,0x73,0x1D,0xC0,0x00,0x01,0x5A,0x30,0x01,0x04,0x84,0x61,0xD5,0xEA, +0x5A,0x40,0x01,0x04,0x80,0x83,0xD5,0xDF,0x8C,0xA4,0xD5,0xC5,0x90,0x25,0x4E,0x16, +0x00,0x03,0x84,0x21,0xF0,0x14,0x50,0x2F,0x80,0x1D,0x40,0x00,0x04,0x16,0xF0,0x94, +0xF0,0x15,0x40,0x00,0x04,0x16,0xF0,0x95,0xF0,0x16,0x40,0x00,0x04,0x16,0xF0,0x96, +0xF0,0x17,0x40,0x10,0x04,0x36,0xF1,0x97,0xB0,0x14,0xB0,0x48,0x49,0xFF,0xFE,0xBA, +0x5A,0x00,0x01,0x04,0x48,0x00,0x00,0x7C,0x04,0x8F,0x80,0x09,0x05,0xCF,0x80,0x08, +0x10,0x0F,0x80,0x1E,0x80,0x28,0x80,0x1C,0x50,0x2F,0x80,0x14,0x49,0xFF,0xFE,0x3A, +0x5A,0x08,0x01,0x6E,0x52,0x14,0x00,0x00,0x52,0x0E,0x00,0x00,0xF1,0x92,0x42,0x14, +0x18,0x24,0x42,0x10,0x24,0x75,0xF1,0x93,0xF1,0x08,0xF0,0x91,0xF0,0x09,0xFF,0x8C, +0x42,0x60,0x24,0x75,0xF0,0x8E,0xF0,0x05,0xFE,0x8A,0xF6,0x90,0x84,0xC0,0xF2,0x8F, +0x10,0x0F,0x80,0x1C,0x81,0x06,0x81,0x26,0x45,0xC2,0x30,0x20,0x44,0x42,0x33,0x08, +0x4C,0xA3,0x80,0x2A,0x22,0x05,0x00,0x00,0xB0,0x51,0x89,0x20,0x00,0x05,0x00,0x03, +0x50,0x2F,0x80,0x0F,0xB0,0xC4,0x38,0x0E,0x01,0x01,0xF4,0x81,0xF0,0x8A,0x00,0x05, +0x00,0x02,0x38,0x02,0x01,0x01,0xF0,0x8B,0x50,0x0F,0x80,0x28,0x49,0xFF,0xFD,0x60, +0x22,0x15,0x00,0x00,0x50,0x2F,0x80,0x0F,0x42,0x80,0x04,0x73,0xB0,0xC4,0xB0,0x4E, +0x50,0x0F,0x80,0x28,0x49,0xFF,0xFD,0x54,0x2A,0x15,0x00,0x02,0x42,0x60,0x04,0x73, +0xF4,0x01,0xD5,0xD7,0x40,0x04,0x24,0x16,0x49,0x00,0x09,0xA6,0x44,0x10,0x00,0x6E, +0xFE,0x0C,0x50,0x10,0x00,0x32,0x80,0x01,0x96,0x49,0x5C,0xF0,0x93,0x89,0xE9,0x03, +0x44,0x00,0x13,0x88,0x12,0x0F,0x80,0x0D,0x40,0x03,0x24,0x16,0x49,0x00,0x09,0x94, +0x44,0x10,0x00,0x68,0xFE,0x0C,0x50,0x00,0x00,0x32,0x80,0x20,0x96,0x01,0x5C,0xF0, +0x13,0x89,0xE9,0x03,0x44,0x10,0x13,0x88,0x12,0x1F,0x80,0x0C,0xB4,0x1F,0xB0,0x46, +0x84,0x48,0x49,0x00,0x53,0x33,0xEC,0x64,0x3A,0x6F,0xAA,0x84,0xDD,0x9E,0x92,0x00, +0x3A,0x6F,0xAA,0xBC,0x51,0xFF,0xFA,0x9C,0xF0,0x8D,0x84,0x00,0xF1,0x9D,0xF2,0x9E, +0x10,0x0F,0x80,0x9D,0x84,0x20,0x44,0x20,0x02,0x68,0x50,0x0F,0x82,0xF8,0x49,0x00, +0x53,0x43,0x84,0x20,0x44,0x20,0x00,0x66,0x44,0x02,0x2F,0x88,0x49,0x00,0x53,0x3C, +0x84,0x20,0x84,0x4B,0x44,0x02,0x13,0x1C,0x49,0x00,0x53,0x36,0x84,0x00,0x84,0x3F, +0x3C,0x0F,0xFB,0xE0,0x3E,0x07,0xEF,0x16,0x3E,0x17,0xEF,0x15,0x3C,0x0B,0xF7,0xA7, +0x3C,0x0B,0xFA,0x03,0x44,0x12,0x33,0x48,0xF0,0x0D,0x44,0x22,0x30,0xC8,0x44,0x30, +0x00,0x64,0xF4,0x1E,0x49,0xFF,0xF9,0x59,0xF0,0x93,0x3C,0x07,0xF9,0xF5,0x5E,0xF0, +0x01,0x68,0xE9,0x05,0x90,0x01,0xF0,0x94,0x48,0x00,0x00,0x05,0x44,0x00,0x00,0xB4, +0xF0,0x94,0xF0,0x13,0x4E,0x02,0x01,0xC7,0x84,0x00,0xF0,0x8C,0xF0,0x9A,0x84,0x08, +0xF0,0x8F,0x84,0x00,0xF0,0x90,0xF0,0x8B,0xF0,0x0C,0xF2,0x0C,0x94,0x41,0x44,0x02, +0x33,0x48,0xF3,0x0C,0x38,0x20,0x09,0x00,0x88,0x01,0xF2,0x91,0xF0,0xA3,0xFA,0x42, +0xF0,0x0B,0xFE,0x9C,0xF2,0xA4,0xF0,0x8E,0xF0,0x23,0xF1,0x11,0xA6,0x01,0xE2,0x20, +0x4E,0xF2,0x01,0x9D,0xF1,0x11,0x44,0x02,0x30,0xC8,0x88,0x01,0xF1,0x24,0x38,0x00, +0x04,0x00,0x96,0x36,0x4E,0x02,0x01,0x8B,0x50,0x0F,0x80,0x9D,0xF0,0x81,0xF0,0x0F, +0x84,0xC0,0xF0,0x82,0x84,0x01,0xF0,0x83,0x50,0x0F,0x80,0x9E,0xF0,0x84,0x50,0x7F, +0x82,0x08,0xB0,0x28,0xF0,0x89,0x22,0x1F,0x80,0x18,0xB6,0xFF,0xF6,0x85,0xF6,0x86, +0xF6,0x87,0xF6,0x88,0xF0,0x11,0x44,0x20,0x00,0x40,0xF3,0x10,0x44,0x42,0x30,0xC8, +0x04,0x5F,0x80,0x0D,0x49,0x00,0x14,0x0F,0x2E,0x17,0xEF,0x16,0x8C,0x21,0x3E,0x17, +0xEF,0x16,0xF1,0x1D,0xE0,0x01,0x4E,0xF3,0x01,0x62,0xF0,0x0D,0x50,0x13,0x80,0x00, +0x00,0x2F,0x80,0x9D,0x49,0xFF,0xFB,0x6C,0x02,0x0F,0x80,0x4F,0x2E,0x10,0x0B,0x40, +0xE2,0x20,0xE9,0x09,0x00,0x0F,0x80,0x9D,0x9E,0x42,0xE6,0x2D,0x4E,0xF3,0x00,0x2F, +0x48,0x00,0x03,0xFD,0x00,0x1F,0x80,0x9D,0x80,0x06,0x96,0xB0,0xE2,0x41,0xE8,0x0B, +0x38,0xF3,0x9A,0x11,0xF2,0x14,0xE0,0x4F,0xE8,0x03,0x8C,0x01,0x96,0x01,0x8C,0xC1, +0x48,0xFF,0xFF,0xF5,0x3C,0x13,0xFA,0x03,0xE2,0x20,0xE8,0xE5,0x5C,0xF0,0x00,0x3D, +0x3C,0x0B,0xFA,0x03,0x80,0x20,0xE9,0x03,0x44,0x10,0x00,0x3C,0x96,0x49,0x84,0x00, +0x50,0x2F,0x81,0x90,0x50,0x3F,0x82,0x08,0xE2,0x01,0xE8,0xD5,0x38,0x41,0x82,0x01, +0x38,0x41,0x01,0x09,0x8C,0x01,0x96,0x00,0xD5,0xF8,0xE6,0x06,0x80,0x20,0xE9,0x03, +0x44,0x10,0x00,0x05,0x55,0xE0,0x80,0xFF,0x50,0x0F,0x7F,0xFF,0x84,0x20,0x80,0x61, +0x80,0x41,0xF0,0x92,0xF0,0x12,0xE0,0x40,0x4E,0xF2,0x03,0xC1,0x9C,0x11,0x96,0x00, +0xF0,0x8F,0x94,0x92,0x50,0x0F,0x82,0x08,0x88,0x40,0xF6,0x0F,0xE2,0xDE,0xE8,0x4D, +0x50,0x0F,0x82,0x08,0x95,0x32,0x88,0x80,0xA7,0xD3,0xA6,0x23,0x00,0x91,0x00,0x02, +0x9A,0x38,0x96,0x02,0xA7,0x62,0x81,0x00,0x4E,0x04,0x00,0x04,0x52,0x80,0x00,0x00, +0x5A,0x88,0x01,0x39,0x40,0x54,0x94,0x01,0x97,0x6A,0x81,0x05,0x4E,0x54,0x00,0x04, +0x52,0x82,0x80,0x00,0x5A,0x88,0x01,0x2F,0xA5,0x20,0x02,0x81,0x00,0x00,0x40,0xF2, +0x00,0x11,0x40,0xA4,0x00,0x11,0xE1,0x4F,0x40,0x44,0x3C,0x1A,0x97,0x23,0xC4,0x1B, +0x9A,0x38,0xFA,0x22,0x42,0x04,0x84,0x73,0xF1,0x0D,0x40,0x54,0x94,0x01,0x38,0x30, +0x81,0x11,0x44,0x00,0x00,0x64,0xFE,0xC4,0xFA,0x02,0x42,0x72,0x80,0x73,0x38,0x10, +0x9D,0x11,0x44,0x00,0x00,0x64,0xFE,0x44,0x40,0x31,0x90,0x76,0x40,0x10,0x90,0x36, +0x96,0xDB,0x96,0x4B,0xE0,0x61,0x80,0x03,0x40,0x00,0xBC,0x1B,0x5E,0xF0,0x00,0x3C, +0xE9,0x06,0x8C,0xC1,0x97,0xB0,0xD5,0xB3,0xF2,0x0F,0xD5,0xA5,0x00,0x0F,0x82,0x0A, +0xE6,0x02,0x4E,0xF3,0x03,0x64,0x84,0x04,0xF0,0x8F,0xF6,0x0B,0x44,0x70,0x00,0x00, +0x50,0x9F,0x82,0x08,0x00,0x0F,0x80,0x9D,0xE2,0xE0,0xE8,0x07,0x38,0xF4,0x9E,0x11, +0xF0,0x1E,0xE0,0x0F,0x4E,0xF3,0x01,0x7D,0xF0,0x1D,0x80,0x86,0xB6,0x1F,0xF0,0x0F, +0x00,0x3F,0x80,0x9D,0xF0,0x81,0x44,0x12,0x30,0xC8,0x50,0x2F,0x82,0x08,0x44,0x52, +0x2F,0x88,0xF0,0x0D,0x49,0xFF,0xFB,0x4E,0xF0,0x8B,0x00,0x0F,0x80,0x9D,0xB1,0xF1, +0xF0,0x99,0x44,0x02,0x00,0x78,0x84,0xC0,0x3A,0x20,0x14,0x00,0x3A,0x23,0x94,0x20, +0x84,0x21,0x84,0x4B,0xB0,0x2E,0xF6,0xA9,0xF6,0xAA,0xF6,0xAB,0x49,0x00,0x51,0xDC, +0x80,0x26,0xFA,0x5C,0xB0,0x35,0x49,0x00,0x51,0xD7,0x80,0x26,0x44,0x20,0x00,0x2C, +0x50,0x0F,0x81,0x00,0x49,0x00,0x51,0xD0,0x50,0x9F,0x81,0x58,0x80,0x26,0xFA,0x5C, +0x50,0x0F,0x81,0x2C,0x49,0x00,0x51,0xC8,0x80,0x09,0x80,0x26,0x44,0x20,0x00,0x38, +0x49,0x00,0x51,0xC2,0x50,0xAF,0x82,0x08,0x2E,0x07,0xDE,0x16,0xF6,0x95,0xF0,0x92, +0x14,0x9F,0x80,0x25,0x2E,0x07,0xDE,0x17,0xF7,0xA1,0xF0,0xA2,0xF5,0x15,0xF1,0x19, +0x4C,0x50,0xC1,0x64,0x00,0x0F,0x81,0x86,0xF4,0x29,0xF0,0x95,0x00,0x0F,0x81,0x85, +0xF3,0x2A,0xF0,0x92,0xF1,0x2B,0x05,0xEF,0x80,0x5D,0x00,0x6F,0x81,0x5B,0x00,0x7F, +0x81,0x5A,0x00,0x9F,0x81,0x59,0x00,0xAF,0x81,0x58,0xF0,0x0E,0xF2,0x0B,0xE2,0x02, +0x4E,0xF3,0x02,0x67,0x00,0x0F,0x80,0x54,0x10,0xAF,0x81,0x58,0x10,0x0F,0x81,0x86, +0x00,0x0F,0x80,0x48,0x10,0x9F,0x81,0x59,0x10,0x0F,0x81,0x85,0xF0,0x0E,0x10,0x7F, +0x81,0x5A,0xE2,0x02,0x10,0x6F,0x81,0x5B,0x15,0xEF,0x80,0x5D,0xF4,0xA9,0xF3,0xAA, +0xF1,0xAB,0xE8,0x24,0xB1,0xAC,0x40,0x31,0x90,0x76,0x50,0x0F,0x82,0x08,0x40,0x40, +0x90,0x96,0x80,0x46,0xF1,0x19,0xF3,0xD9,0xF4,0xDA,0x49,0xFF,0xFD,0x29,0xF5,0x0E, +0x44,0x10,0x00,0x38,0x50,0x0F,0x85,0x60,0x42,0x02,0x84,0x73,0x50,0x00,0x7D,0x9C, +0x3A,0x23,0x0C,0x00,0x3A,0x20,0x0C,0x20,0x8C,0xA1,0xF0,0x0B,0x97,0x68,0xD8,0xF3, +0xF0,0x0E,0xF1,0x0B,0xE2,0x01,0x4E,0xF3,0x02,0x85,0xF0,0x11,0x8C,0x01,0x96,0x00, +0xF0,0x91,0xF0,0x0B,0xF0,0x8E,0x48,0xFF,0xFE,0x61,0xF0,0x1A,0x5A,0x00,0x01,0x0D, +0xF0,0x0C,0x8C,0x01,0x14,0x0F,0x80,0x0C,0x5A,0x00,0x20,0x04,0x48,0xFF,0xFE,0x46, +0xD5,0x03,0xF0,0x13,0xF0,0x8B,0xF1,0x13,0x50,0x0F,0x81,0x90,0x49,0x00,0x58,0x62, +0x3C,0x0F,0xFB,0xE0,0x44,0x10,0x00,0xFF,0x44,0x02,0x2F,0xF0,0x84,0x4B,0x3C,0x60, +0x05,0x95,0x49,0x00,0x51,0x39,0xF0,0x0B,0x5A,0x08,0x02,0x06,0x95,0xB2,0x84,0x05, +0x40,0x63,0x00,0xD6,0xF0,0x0B,0x8E,0x03,0x96,0x00,0xE6,0x03,0xE8,0x06,0x95,0xB1, +0x84,0x03,0x40,0x63,0x00,0xD6,0xD5,0x05,0xF0,0x0B,0xE6,0x06,0xE9,0x02,0x90,0xC1, +0x84,0x45,0x42,0x03,0x08,0x24,0x90,0x03,0xF0,0x8D,0x84,0x07,0xFE,0x34,0x90,0x03, +0xF0,0x8E,0x84,0x03,0xFE,0x34,0x90,0x01,0x85,0x40,0xF0,0x8F,0x40,0x83,0x04,0x0A, +0x50,0x1F,0x82,0xF8,0x80,0xEA,0xF2,0x90,0xF2,0x0B,0x54,0x05,0x00,0xFF,0xE2,0x02, +0x4E,0xF2,0x00,0x7C,0x00,0x00,0x80,0x2B,0xC0,0x14,0x5A,0x00,0x11,0x13,0x00,0x00, +0x80,0x2C,0xC0,0x0F,0x5A,0x00,0x1F,0x0E,0x9E,0x81,0xE6,0x42,0xE9,0x0C,0x9E,0x83, +0xE6,0x44,0xE9,0x0B,0x8E,0x1C,0xE6,0x03,0xF0,0x0F,0x40,0x03,0x3C,0x1A,0xD5,0x07, +0x80,0x08,0xD5,0x05,0xF0,0x0D,0xD5,0x03,0x04,0x0F,0x80,0x0E,0x3C,0x2D,0xFB,0xD6, +0x54,0x21,0x20,0x00,0xC2,0x06,0x84,0x46,0xFE,0x14,0xF2,0x10,0x40,0x00,0x08,0x16, +0x04,0x20,0x80,0x08,0xE0,0x40,0xE9,0x05,0x44,0x00,0x00,0x01,0x3C,0x0F,0xFC,0x4A, +0x00,0x00,0x80,0x2E,0xC0,0x44,0x44,0x02,0x13,0x1C,0x38,0x00,0x28,0x00,0xF0,0x8C, +0xC8,0x3E,0x3C,0xFD,0xFC,0x4A,0x5A,0xF8,0x01,0x3B,0x44,0x00,0x00,0x38,0x42,0x93, +0x80,0x24,0x44,0x02,0x13,0x4C,0x88,0x09,0x51,0xE0,0x00,0x0C,0x80,0x01,0x3A,0x20, +0x14,0x04,0x3A,0x2F,0x14,0x24,0x3A,0x20,0x14,0x04,0x3A,0x2F,0x14,0x24,0x3A,0x20, +0x14,0x04,0x3A,0x2F,0x14,0x24,0x3A,0x20,0x0C,0x00,0x44,0x02,0x13,0x4C,0x89,0x20, +0x3A,0x2F,0x0C,0x20,0x50,0x24,0x80,0x30,0x9C,0x39,0x10,0xA1,0x00,0x05,0x44,0x32, +0x13,0x4C,0x44,0x22,0x2F,0xF0,0x44,0x40,0x00,0x38,0x42,0x30,0x10,0x73,0x38,0x71, +0x28,0x08,0x00,0x2F,0x80,0x30,0x10,0xF1,0x80,0x04,0x84,0x7F,0xE4,0xEB,0x10,0x34, +0x80,0x3B,0x84,0xEB,0x10,0x24,0x80,0x30,0xE8,0x02,0x97,0xC0,0x50,0xA5,0x00,0x01, +0x50,0x10,0x80,0x38,0x48,0xFF,0xFF,0x82,0x4E,0x73,0x00,0x04,0x3C,0x7F,0xFC,0x4A, +0x3E,0x77,0xF1,0x5C,0x51,0xFF,0x85,0x64,0x3A,0x6F,0xAA,0x84,0xDD,0x9E,0x94,0x7A, +0x88,0x29,0xFA,0x42,0xA6,0x0B,0xA6,0x4A,0x80,0x60,0x42,0x30,0x88,0x73,0x80,0x43, +0x44,0x32,0x30,0xC8,0x38,0x21,0x88,0x10,0x4E,0x24,0x00,0x20,0x50,0x2F,0x80,0x9D, +0xF2,0x81,0xF2,0x0F,0x58,0x33,0x00,0x20,0xF2,0x82,0x50,0x4F,0x80,0x9E,0x84,0x40, +0x8C,0xC1,0xF2,0x83,0xF4,0x84,0xF2,0x85,0xF2,0x86,0xF2,0x87,0xF2,0x88,0xF2,0x89, +0xB7,0x3F,0x44,0x20,0x00,0x80,0x96,0xD8,0x44,0x42,0x30,0xC8,0xF5,0x0D,0x97,0xB0, +0x49,0x00,0x11,0xA1,0xE6,0xCB,0xE8,0x05,0x8C,0xE1,0x97,0xF8,0x48,0xFF,0xFE,0x4C, +0x84,0x01,0xF0,0x9A,0x48,0xFF,0xFE,0x52,0x00,0x75,0x00,0x03,0xF1,0x12,0x00,0x25, +0x00,0x02,0x80,0x07,0x42,0x01,0x04,0x73,0xF0,0x9B,0xF1,0x1B,0x44,0x02,0x30,0xC8, +0x38,0x10,0x04,0x00,0x54,0x00,0x80,0x20,0x4E,0x02,0x01,0x04,0x5A,0x18,0x3F,0x04, +0x48,0x00,0x00,0xBE,0x96,0x67,0xE6,0x2B,0x4E,0xF2,0x00,0xFC,0x94,0x0A,0x50,0x9F, +0x80,0xD4,0x40,0x34,0x80,0x00,0x50,0x5F,0x81,0x00,0x50,0x4F,0x81,0x2C,0xF3,0x96, +0x98,0xE8,0x88,0x04,0xF3,0x97,0xF0,0x98,0x50,0x3F,0x82,0xF8,0x44,0x00,0x00,0x38, +0x42,0x30,0x80,0x73,0x80,0x03,0xB0,0xEE,0x38,0x31,0x84,0x00,0x5A,0x30,0x01,0x04, +0x48,0x00,0x00,0x89,0x84,0x60,0x14,0x9F,0x80,0x1F,0x80,0xC3,0x81,0x25,0xF4,0xA0, +0xF4,0x21,0x04,0x8F,0x80,0x21,0x38,0x52,0x0D,0x00,0x95,0x19,0x88,0xA7,0x97,0x68, +0x88,0x88,0x41,0xE2,0x80,0x10,0x20,0x42,0x00,0x01,0x4F,0xE5,0x00,0x4C,0x04,0x8F, +0x80,0x12,0x40,0xFF,0x20,0x07,0xE8,0x46,0x88,0x82,0x97,0x20,0xF4,0x9C,0x20,0x8F, +0x80,0x70,0x4E,0x85,0x00,0x40,0xF4,0x22,0xE1,0x04,0xE8,0x3C,0xF4,0x12,0x8C,0xC1, +0x43,0xE4,0x10,0x73,0xF4,0x0D,0x04,0x80,0x00,0x08,0x97,0xB0,0x38,0xF2,0x79,0x11, +0x44,0x42,0x30,0xC8,0x89,0x0F,0x14,0x80,0x00,0x08,0x38,0x82,0x78,0x00,0x5A,0x88, +0x1F,0x2A,0x4E,0xF7,0x00,0x07,0x04,0x80,0x00,0x07,0x89,0x0F,0x14,0x80,0x00,0x07, +0x50,0xF7,0xFF,0x9C,0x4E,0xF7,0x00,0x1F,0xF4,0x1F,0x38,0x82,0x06,0x02,0x89,0x0F, +0x38,0x82,0x06,0x0A,0x44,0x42,0x30,0x20,0x38,0x82,0x15,0x01,0x38,0x54,0x86,0x02, +0x42,0x57,0xA0,0x73,0x38,0x54,0x86,0x0A,0xF5,0x1C,0x44,0x42,0x33,0x08,0x38,0x52, +0x15,0x01,0xF4,0x20,0x38,0x42,0x06,0x02,0x42,0x47,0x94,0x73,0xF5,0x20,0x38,0x42, +0x86,0x0A,0x8C,0x61,0xF5,0x0F,0x97,0x18,0xE2,0x85,0xE9,0xA3,0x22,0x35,0x00,0x00, +0x04,0x40,0x00,0x08,0xFF,0x9C,0x9B,0x74,0x44,0x30,0x03,0xE8,0xFE,0xEC,0x40,0x61, +0x98,0xD6,0xAE,0x82,0xAE,0x83,0x10,0x20,0x00,0x2C,0xF3,0x1B,0xF2,0x0D,0x12,0x60, +0x00,0x1A,0xAF,0xC0,0xAF,0xC1,0x10,0x70,0x00,0x2B,0x38,0x21,0x0D,0x11,0xB0,0xEE, +0x88,0x82,0x14,0x40,0x00,0x08,0x84,0x80,0x12,0x20,0x00,0x13,0x38,0x41,0x84,0x08, +0xD5,0x25,0xA6,0x43,0xE2,0x22,0xE8,0x03,0xAE,0x83,0xD5,0x05,0xA6,0x42,0xE2,0x41, +0xE8,0x02,0xAE,0x82,0x00,0x15,0x00,0x03,0xA6,0x81,0xE2,0x41,0xE8,0x03,0xAE,0x41, +0xD5,0x0D,0xA6,0x80,0xE2,0x22,0xE8,0x0A,0xAE,0x40,0xD5,0x08,0xB0,0x6B,0xF1,0x98, +0xB0,0x6A,0xF1,0x97,0xB0,0x69,0xF0,0x25,0xF1,0x96,0xF2,0x12,0x00,0x15,0x00,0x02, +0x42,0x70,0x88,0x73,0xF2,0x0D,0x38,0x21,0x1D,0x11,0xA0,0x47,0x88,0x22,0xA8,0x47, +0xF1,0x14,0xE0,0x22,0xE8,0x06,0x00,0x10,0x00,0x2D,0x8C,0x21,0x10,0x10,0x00,0x2D, +0x50,0x21,0x7F,0x9C,0x4E,0x27,0x00,0x26,0xF1,0x16,0xF3,0x16,0xB4,0x21,0x88,0x22, +0xB6,0x23,0x00,0x15,0x00,0x03,0x44,0x32,0x30,0x20,0x38,0x31,0x85,0x01,0xF1,0x17, +0xB4,0x21,0x42,0x11,0x0C,0x73,0xF3,0x17,0xB6,0x23,0x00,0x15,0x00,0x02,0x44,0x32, +0x33,0x08,0x38,0x31,0x85,0x01,0xF1,0x18,0xB4,0x21,0x42,0x11,0x0C,0x73,0xF2,0x18, +0xB6,0x22,0x00,0x10,0x00,0x2E,0x5A,0x10,0xFF,0x05,0x8C,0x21,0x10,0x10,0x00,0x2E, +0xF6,0x15,0x8D,0x44,0x8C,0xC1,0x96,0x30,0xF0,0x95,0x48,0xFF,0xFD,0x81,0xB0,0xB5, +0x38,0x51,0x02,0x02,0x4E,0x57,0x00,0x26,0x44,0x20,0x00,0x38,0x50,0xFF,0x82,0xF8, +0x42,0xF0,0x08,0x73,0x50,0x2F,0x81,0x00,0x88,0x85,0x38,0x21,0x02,0x02,0xF2,0x96, +0x40,0x22,0x84,0x0A,0xF2,0x97,0x04,0x8F,0x80,0x17,0xF2,0x16,0x89,0x02,0x50,0x2F, +0x81,0x2C,0x40,0x84,0x15,0x16,0x14,0x87,0x80,0x03,0x38,0x81,0x02,0x02,0xF2,0x17, +0x88,0x28,0x88,0x48,0x40,0x21,0x14,0x56,0x14,0x27,0x80,0x04,0xF2,0x16,0x88,0x62, +0x44,0x50,0x00,0x38,0x50,0x2F,0x82,0xF8,0x42,0x20,0x14,0x73,0xA1,0x57,0x04,0x8F, +0x80,0x15,0x41,0xEF,0x14,0x00,0x00,0x51,0x00,0x2E,0x89,0x05,0x80,0xA8,0x97,0x68, +0x04,0x8F,0x80,0x12,0xF5,0x95,0x00,0x51,0x00,0x2D,0x89,0x05,0x80,0xA8,0x00,0x81, +0x00,0x03,0x97,0x68,0xE2,0xC8,0xF5,0x92,0xE9,0x06,0xA7,0x52,0x81,0x06,0xE2,0xA7, +0x40,0x72,0xBC,0x1B,0xA7,0x51,0xE3,0x25,0xE9,0x06,0xA6,0x90,0x80,0xA9,0xE2,0x4A, +0x40,0xA1,0x3C,0x1B,0x8C,0x01,0x96,0x00,0x80,0xC8,0x81,0x25,0x48,0xFF,0xFD,0x40, +0x00,0x0F,0x80,0x9D,0x3C,0x13,0xF7,0xA7,0xE2,0x20,0xE8,0x07,0x3C,0x0B,0xF7,0xA7, +0x00,0x0F,0x80,0x40,0x3E,0x07,0xEF,0x15,0x44,0x10,0x00,0x38,0xF2,0x0E,0x50,0x0F, +0x82,0xF8,0x42,0x01,0x04,0x73,0x00,0x2F,0x80,0x40,0x10,0x20,0x00,0x32,0xF0,0x0E, +0xF2,0x0B,0x8C,0x01,0x97,0x40,0xF5,0x8E,0xDA,0xF2,0xF0,0x10,0xE6,0x0B,0x4E,0xF2, +0xFD,0x74,0x8C,0x01,0x96,0x00,0xF0,0x90,0x5A,0x08,0x0B,0x04,0x48,0xFF,0xFD,0x6D, +0xE6,0x4B,0x4E,0xF3,0xFD,0x54,0x48,0xFF,0xFD,0x68,0x84,0x08,0xF0,0x8F,0x48,0xFF, +0xFC,0x9E,0x92,0x00,0x3B,0xFF,0xFC,0xBC,0xEF,0xFC,0xFA,0x40,0x5A,0x08,0x04,0x0A, +0x44,0x12,0x10,0x30,0x44,0x02,0x2D,0x14,0x49,0x00,0x4E,0x78,0x48,0x00,0x00,0x08, +0x44,0x02,0x2D,0x14,0x44,0x12,0x10,0x20,0x49,0x00,0x4E,0x70,0xEC,0x04,0x3B,0xFF, +0xFC,0x84,0xDD,0x9E,0x3A,0x6F,0xA4,0xBC,0xEF,0xF4,0x3C,0x64,0x05,0x92,0xF0,0x81, +0x3C,0x94,0x05,0x93,0x3C,0x74,0x05,0x94,0x49,0x00,0x41,0x9D,0x5A,0x08,0x01,0x19, +0x3C,0x27,0xF9,0xF5,0x84,0x24,0x40,0x11,0x04,0x36,0x5E,0xF0,0x81,0xC2,0xE8,0x03, +0x44,0x10,0x01,0xC2,0xFA,0x1D,0x44,0xF0,0x00,0x64,0xFE,0x84,0x40,0x21,0x3C,0x56, +0x5E,0xF1,0x02,0x58,0x96,0x4B,0xE8,0x51,0x44,0x20,0x02,0x58,0xD5,0x4E,0x84,0xA0, +0x44,0x12,0x33,0x88,0x44,0x00,0x0C,0x8C,0x98,0xA9,0x00,0x21,0x01,0x0D,0xE6,0x42, +0xE8,0x06,0x50,0x52,0x81,0x24,0xD8,0xF9,0x84,0x20,0xD5,0x03,0x44,0x10,0x00,0x01, +0x3C,0x0D,0xFB,0xD6,0x3C,0x47,0xF9,0xF5,0x96,0x1E,0xC8,0x1B,0x5A,0x18,0x01,0x1A, +0x2E,0x10,0x11,0x99,0xE6,0x23,0xE9,0x15,0x5E,0xF2,0x01,0xF5,0xE8,0x12,0x84,0x1A, +0xFE,0x0C,0x50,0x00,0x00,0x64,0x42,0x14,0x80,0x24,0x44,0xF0,0x00,0x64,0x40,0x10, +0xBC,0x36,0x96,0x4B,0x9C,0x31,0xE0,0x20,0x40,0x10,0x3C,0x1B,0x40,0x90,0x80,0x11, +0xFA,0x62,0x44,0x20,0x00,0x64,0xFE,0xE4,0x40,0x31,0x88,0x76,0xE0,0x66,0x40,0x61, +0xBC,0x1A,0x84,0x24,0x44,0x30,0x00,0x55,0x40,0x12,0x04,0x36,0x42,0x02,0x0C,0x24, +0xE1,0x21,0x40,0x00,0x08,0x16,0x40,0x90,0xBC,0x1B,0x80,0x47,0xE0,0x07,0x97,0xB3, +0x50,0x14,0x80,0x00,0x40,0x20,0x3C,0x1A,0x3C,0x0D,0xFB,0xD6,0x96,0x93,0x54,0x00, +0x20,0x00,0xC0,0x15,0x84,0x03,0x84,0x62,0xFF,0x84,0x40,0x63,0x0C,0xD6,0xE0,0x26, +0x40,0x60,0xBC,0x1B,0xFE,0x44,0x40,0x10,0x8C,0x36,0xE0,0x41,0x40,0x11,0x3C,0x1B, +0xFE,0x84,0x40,0x21,0x0C,0x56,0x97,0xB3,0x96,0x4B,0x96,0x93,0xF0,0x01,0xEC,0x0C, +0x3C,0x6B,0xF7,0xBC,0x3A,0x6F,0xA4,0x84,0x3C,0x1B,0xF7,0xA6,0x3C,0x1B,0xF7,0xBD, +0x3C,0x2B,0xF7,0xBE,0x48,0xFF,0xFA,0xA6,0xFC,0x40,0xEE,0x98,0x44,0x62,0x33,0x90, +0x87,0x80,0x80,0xE6,0x81,0x3C,0x44,0x82,0x15,0xC0,0x84,0x02,0x10,0x03,0x81,0x06, +0x02,0x03,0x80,0x80,0x54,0xAE,0x00,0xFF,0xC0,0x38,0x00,0x03,0x81,0x05,0x5A,0x08, +0x02,0x2A,0xB0,0x41,0x84,0x40,0x80,0x07,0x49,0xFF,0xF3,0x6C,0xF0,0x01,0x40,0x14, +0x94,0x08,0xB0,0x82,0x88,0x22,0x22,0x20,0x00,0x04,0x22,0x33,0x80,0x46,0xA8,0x89, +0x22,0x20,0x00,0x05,0xA8,0x8A,0x50,0x20,0x80,0x08,0xA8,0xD1,0x80,0x41,0x22,0x33, +0x80,0x47,0x18,0xA1,0x00,0x10,0xA8,0xCC,0x04,0x33,0x80,0x3D,0xB4,0x00,0xA8,0xD1, +0x04,0x23,0x80,0x3C,0xA8,0x0F,0x50,0x04,0x80,0x01,0xA8,0x8E,0x54,0x90,0x00,0xFF, +0xD5,0x0C,0x5A,0x00,0x04,0xD8,0x5A,0x08,0x03,0x09,0x80,0x0A,0x49,0x00,0x10,0xB0, +0x38,0x14,0x70,0x00,0xE2,0x20,0xE8,0xCE,0x51,0xCE,0x00,0x01,0x50,0x73,0x81,0x24, +0x5B,0xC8,0x0B,0xBD,0x2E,0x07,0xF1,0x5C,0xC0,0x41,0x80,0x49,0x44,0x02,0x13,0x4C, +0xB0,0x42,0x84,0xE0,0x49,0x00,0x06,0x93,0x81,0x27,0x02,0x03,0x00,0x80,0xC0,0x28, +0x00,0x03,0x01,0x05,0x5A,0x08,0x01,0x25,0xB0,0x41,0x84,0x40,0x80,0x06,0x49,0xFF, +0xF3,0x21,0xF1,0x01,0x94,0x3D,0xB0,0x82,0x88,0x02,0x22,0x20,0x80,0x04,0x22,0x33, +0x00,0x46,0xA8,0x81,0x22,0x20,0x80,0x05,0x8C,0xE1,0xA8,0x82,0x50,0x20,0x00,0x08, +0xA8,0xD1,0x80,0x40,0x22,0x33,0x00,0x47,0x18,0x91,0x00,0x10,0xA8,0xC4,0x83,0x86, +0xBB,0x3D,0xB4,0x21,0xA8,0xD1,0xBA,0x3C,0xA8,0x47,0xA8,0x86,0x97,0xF8,0x50,0x04, +0x80,0x01,0x54,0x90,0x00,0xFF,0x50,0x63,0x01,0x24,0x5A,0x98,0x0B,0xD0,0x44,0x02, +0x13,0x4C,0xB0,0x42,0x80,0x47,0x49,0x00,0x06,0x5A,0xED,0x68,0xFC,0xC0,0xFC,0x47, +0xE6,0x2C,0x80,0xE1,0xF2,0x81,0x4E,0xF2,0x01,0x86,0x81,0x00,0x5A,0x20,0x01,0x04, +0x48,0x00,0x01,0x49,0x44,0x00,0x00,0x38,0x45,0xC2,0x13,0x4C,0x42,0x04,0x00,0x24, +0x40,0x9E,0x00,0x00,0xF0,0x82,0x04,0x04,0x80,0x0A,0x44,0x60,0x01,0x24,0xF0,0x87, +0x00,0x04,0x80,0x3A,0x10,0x14,0x80,0x3B,0x10,0x0F,0x80,0x30,0x22,0x04,0x80,0x0E, +0x22,0x14,0x80,0x0C,0x12,0x0F,0x80,0x13,0x12,0x0F,0x80,0x11,0x50,0x04,0x80,0x28, +0xF0,0x83,0xA4,0x05,0xFF,0xBC,0x44,0xA2,0x33,0x88,0x12,0x0F,0x80,0x19,0x50,0x03, +0x00,0x08,0x50,0x34,0x80,0x30,0x50,0x24,0x80,0x20,0x12,0x1F,0x80,0x12,0x12,0x1F, +0x80,0x10,0x88,0x0A,0xB0,0x47,0xF2,0x85,0xF3,0x84,0x49,0xFF,0xF2,0x7A,0xF3,0x04, +0x40,0x15,0x18,0x00,0x50,0x10,0x81,0x23,0xA6,0x1F,0x8D,0x28,0x54,0x40,0x00,0x0F, +0x95,0x64,0xA7,0x09,0x92,0x04,0x97,0x1F,0xFF,0x2F,0xAF,0x09,0x00,0x41,0x80,0x08, +0x96,0x0F,0x95,0x22,0xFE,0x27,0xAE,0x0A,0xF2,0x05,0x40,0x45,0x18,0x00,0x50,0x52, +0x01,0x10,0x05,0xE1,0x00,0x02,0x04,0x12,0x00,0x40,0xF0,0x03,0xE0,0x3E,0x40,0x1F, +0x3C,0x1B,0x14,0x12,0x00,0x40,0xA6,0x5C,0x44,0xF0,0x00,0x38,0xAE,0x6E,0x80,0x7C, +0x50,0x14,0x00,0x01,0x42,0x30,0xBC,0x73,0xA6,0x5E,0xA4,0x05,0xAE,0x6F,0xF1,0x02, +0xAC,0x2A,0x88,0x3C,0x80,0x1C,0xA0,0x4B,0x80,0x4A,0x14,0x12,0x00,0x39,0x02,0x12, +0x00,0x84,0xC9,0x1F,0x00,0x24,0x80,0x0E,0x50,0x03,0x00,0xE8,0x5A,0x28,0x01,0x14, +0x89,0x40,0xF0,0x02,0x88,0x1C,0x8C,0x10,0x3A,0x20,0x0C,0x00,0x00,0x04,0x80,0x0D, +0x3A,0x25,0x0C,0x20,0x5C,0xF0,0x00,0x29,0x4E,0xF2,0x00,0xD7,0x10,0x12,0x00,0xEC, +0x48,0x00,0x00,0xD3,0x88,0x0A,0x84,0x48,0x49,0x00,0x4C,0xCE,0x48,0x00,0x00,0xCD, +0x00,0x14,0x80,0x0D,0x5C,0xF0,0x80,0x29,0xE9,0x4D,0x20,0x52,0x00,0xEC,0x20,0x44, +0x80,0x0C,0x8A,0x85,0x5E,0xF2,0x00,0x5B,0xE9,0x04,0x50,0x42,0x7F,0x4C,0xD5,0x07, +0x5E,0xF2,0x7F,0xA6,0xE8,0x04,0x50,0x42,0x00,0xB4,0x97,0x23,0x80,0x64,0x4E,0x44, +0x00,0x03,0xFE,0xE2,0xE4,0x62,0xE9,0x36,0x84,0x21,0x4E,0x44,0x00,0x04,0x44,0x10, +0xFF,0xFF,0x8E,0x61,0xFE,0x5C,0x96,0x4B,0x80,0x61,0x4E,0x14,0x00,0x03,0xFE,0xCA, +0xE4,0x62,0xE9,0x04,0x84,0x62,0x40,0x10,0x8C,0x36,0x88,0x25,0x96,0x49,0x97,0x4B, +0x5E,0xF2,0x80,0x5B,0xE9,0x05,0x50,0x10,0xFF,0x4C,0x97,0x4B,0xD5,0x0A,0x5E,0xF2, +0xFF,0xA7,0xE8,0x07,0x50,0x10,0x80,0xB4,0x97,0x4B,0x5E,0xF2,0xFF,0xA7,0xE9,0x09, +0x5E,0xF2,0x80,0x5B,0x80,0x25,0xE9,0x03,0x44,0x10,0x00,0x5A,0x96,0x4A,0xD5,0x03, +0x44,0x1F,0xFF,0xA7,0x44,0x30,0x01,0x24,0x80,0x82,0x42,0x43,0x8C,0x73,0x10,0x12, +0x00,0xEC,0x44,0x10,0x00,0x38,0x80,0x80,0x42,0x44,0x04,0x73,0x00,0x12,0x00,0x16, +0x8C,0x88,0x5A,0x18,0x01,0x72,0x44,0x10,0x01,0x24,0x80,0x62,0x42,0x33,0x84,0x73, +0xA5,0x25,0x02,0x11,0x80,0x75,0x8A,0x81,0x80,0x64,0x4E,0x44,0x00,0x03,0xFE,0xE2, +0x5E,0xF1,0x80,0x33,0xE9,0x1E,0x4E,0x45,0x00,0x04,0x84,0x81,0xD5,0x02,0x84,0x9F, +0x50,0x31,0xFF,0xCE,0xFE,0xE4,0x84,0x82,0x40,0x31,0x90,0x76,0x88,0x23,0x4E,0x15, +0x00,0x09,0x5E,0xF0,0x93,0x89,0xE9,0x03,0x44,0x10,0x13,0x88,0x96,0x49,0xD5,0x02, +0x84,0x20,0x44,0x30,0x01,0x24,0x80,0x82,0x42,0x43,0x8C,0x73,0x12,0x12,0x00,0x75, +0x44,0x10,0x01,0x24,0x80,0x62,0x42,0x33,0x84,0x73,0x44,0x10,0x00,0x38,0x42,0x04, +0x04,0x73,0x02,0x41,0x80,0x74,0x02,0x30,0x00,0x08,0x8A,0x64,0x80,0x23,0x4E,0x34, +0x00,0x03,0xFE,0x5A,0x5E,0xF0,0x80,0x33,0xE9,0x2F,0x84,0x01,0x4E,0x34,0x00,0x03, +0x84,0x1F,0x50,0x10,0xFF,0xCE,0xFE,0x44,0x84,0x02,0x40,0x10,0x80,0x36,0x98,0x21, +0x4E,0x05,0x00,0x09,0x5E,0xF0,0x13,0x89,0xE9,0x03,0x44,0x00,0x13,0x88,0x96,0x01, +0xD5,0x02,0x84,0x00,0x44,0x10,0x01,0x24,0x42,0x23,0x84,0x73,0x12,0x01,0x00,0x74, +0xD5,0x13,0xF0,0x01,0x5A,0x08,0x02,0x37,0x44,0x00,0x01,0x24,0x44,0x62,0x33,0x90, +0x42,0x60,0x80,0x73,0x80,0x06,0xB0,0x46,0x84,0x40,0x49,0xFF,0xF1,0x93,0x80,0x06, +0xF1,0x06,0x49,0xFF,0xF1,0x56,0x44,0x02,0x33,0x88,0x44,0x10,0x01,0x24,0x80,0x40, +0x42,0x23,0x84,0x73,0x02,0x11,0x00,0x84,0xC9,0x0D,0x44,0x30,0x00,0x38,0x44,0x12, +0x13,0x4C,0x42,0x14,0x0C,0x73,0xA0,0xCE,0xA0,0x4F,0x12,0x31,0x00,0x8C,0x12,0x11, +0x00,0x8D,0x44,0x10,0x01,0x24,0x42,0x03,0x84,0x73,0x00,0x1F,0x80,0x04,0x02,0x50, +0x00,0x84,0x10,0x10,0x01,0x0E,0x44,0x10,0xFF,0xFF,0xD1,0x04,0x8C,0xA1,0x12,0x50, +0x00,0x84,0xFC,0xC7,0xFC,0x01,0x49,0x00,0x3D,0x9C,0xF0,0x81,0x49,0xFF,0xEF,0xDB, +0xE6,0x03,0xE9,0x04,0xF0,0x01,0x49,0xFF,0xF1,0x74,0xF0,0x01,0x44,0x12,0x33,0x48, +0x3C,0x24,0x05,0xAF,0x49,0xFF,0xF1,0x86,0xF0,0x01,0x44,0x12,0x33,0x48,0x44,0x22, +0x15,0xDA,0x44,0x32,0x15,0xD8,0x49,0xFF,0xF1,0xBC,0x3C,0x13,0xF7,0xC7,0x3C,0xF7, +0xF9,0xF5,0x3C,0x24,0x05,0xAF,0x84,0x1E,0xFE,0x0E,0xE0,0x4F,0x3C,0x0B,0xF7,0xC7, +0xE8,0x05,0x58,0x00,0x00,0x01,0x3C,0x0B,0xF7,0xC7,0xFC,0x81,0xFC,0x40,0x84,0x20, +0x84,0x4C,0x44,0x02,0x13,0x40,0x49,0x00,0x4B,0xA7,0x84,0x00,0x3C,0x0B,0xF7,0xC7, +0x84,0x01,0x49,0x00,0x0E,0x4E,0x84,0x03,0x49,0x00,0x0E,0x5E,0x84,0x20,0x44,0x20, +0x0C,0x94,0x44,0x02,0x33,0x88,0x49,0x00,0x4B,0x97,0x49,0x00,0x0E,0x9B,0x49,0x00, +0x2A,0xF6,0x5A,0x00,0x01,0x05,0x44,0x00,0x00,0x5A,0xD5,0x03,0x44,0x00,0x00,0x7D, +0x3C,0x08,0x05,0xAF,0x84,0x00,0x3E,0x07,0xF1,0x4C,0x84,0x01,0x49,0xFF,0xFC,0xDC, +0x44,0x00,0x00,0xB3,0x3C,0x08,0x05,0x9A,0x44,0x00,0x18,0x7F,0x3C,0x08,0x05,0x9B, +0x44,0x00,0x00,0xCA,0x3C,0x08,0x05,0x9C,0x44,0x00,0x31,0x9A,0x3C,0x08,0x05,0x9D, +0x49,0x00,0x02,0x01,0x84,0x01,0x49,0x00,0x02,0x09,0x84,0x04,0x3E,0x00,0x0B,0x44, +0x84,0x05,0x3E,0x00,0x0B,0x46,0x44,0x00,0x00,0x40,0x3E,0x00,0x0B,0x45,0x84,0x0A, +0x3E,0x00,0x0B,0x47,0x3C,0x70,0x05,0x9A,0x84,0x01,0x3E,0x00,0x0B,0x48,0x3C,0x50, +0x05,0x9C,0x3C,0x04,0x05,0x9B,0x97,0x3B,0x84,0x60,0x2E,0x97,0xDE,0x16,0x40,0xA0, +0x10,0x01,0x96,0x6B,0x3C,0x64,0x05,0x9D,0x80,0x43,0x44,0x82,0x30,0x20,0x8A,0x80, +0x45,0xE0,0x00,0x11,0x96,0x10,0xE2,0x09,0x88,0x6A,0xE8,0x09,0x98,0x23,0x40,0x00, +0x78,0x16,0x88,0x07,0x38,0x04,0x09,0x09,0x8C,0x41,0xD5,0xF5,0x84,0x60,0x9B,0xF1, +0x2E,0x47,0xDE,0x17,0x8A,0x26,0x80,0x43,0x44,0x92,0x33,0x08,0xFA,0xCF,0x96,0x10, +0xE2,0x04,0x88,0x67,0xE8,0x09,0x98,0x0B,0x40,0x00,0x18,0x16,0x88,0x05,0x38,0x04, +0x89,0x09,0x8C,0x41,0xD5,0xF5,0x3C,0x0D,0xFB,0xD6,0x58,0x00,0x08,0x00,0x3C,0x0F, +0xFB,0xD6,0x3C,0x1D,0xFB,0xD6,0x84,0x01,0x3C,0x0B,0xF7,0xC6,0x44,0x0F,0xFF,0x7F, +0xFE,0x0E,0x3C,0x0F,0xFB,0xD6,0x3C,0x0D,0xFB,0xD6,0x58,0x00,0x00,0x04,0x3C,0x0F, +0xFB,0xD6,0x84,0x00,0x3C,0x0B,0xF7,0xC5,0xFC,0xC0,0x84,0x00,0x3E,0x07,0xF1,0x4C, +0xDD,0x9E,0xFC,0x00,0x2E,0x07,0xE2,0x74,0x96,0x16,0xC0,0x03,0x84,0x04,0xD5,0x02, +0x84,0x01,0x49,0xFF,0xFC,0x59,0xFC,0x80,0xFC,0x00,0x84,0x01,0x49,0x00,0x01,0x96, +0xFC,0x80,0x84,0x00,0x3E,0x07,0xE2,0x74,0x3C,0x0D,0xFB,0xD6,0x96,0x1E,0xC0,0x04, +0x84,0x04,0x3E,0x07,0xE2,0x74,0x2E,0x07,0xE2,0x74,0xC8,0x04,0x84,0x01,0x3E,0x07, +0xE2,0x74,0xDD,0x9E,0xFC,0x00,0x49,0x00,0x29,0xDB,0xC8,0x05,0x2E,0x07,0xE2,0x74, +0x5A,0x08,0x04,0x04,0x84,0x04,0xD5,0x02,0x84,0x01,0x49,0xFF,0xFC,0x35,0x49,0xFF, +0xFF,0xE2,0x2E,0x07,0xE2,0x74,0x2E,0x57,0xF1,0x4C,0xD0,0x07,0x3E,0x07,0xF1,0x4C, +0x49,0xFF,0xFF,0xC9,0x49,0xFF,0xFF,0xD2,0xFC,0x80,0xFC,0x42,0x81,0x21,0x80,0xC2, +0xB0,0x41,0x84,0x40,0x81,0x40,0x80,0xE3,0x49,0xFF,0xF0,0x54,0xF2,0x01,0x22,0x15, +0x00,0x8A,0x22,0x05,0x00,0x8B,0x22,0x41,0x00,0x06,0x9B,0x0C,0x22,0x11,0x00,0x07, +0xF4,0x82,0x8A,0x01,0xF0,0x83,0xB0,0x02,0x49,0x00,0x08,0x27,0xE0,0x09,0xE8,0x1A, +0x84,0x20,0x84,0x4C,0x44,0x32,0x30,0x44,0x80,0x03,0x42,0x00,0x88,0x73,0x00,0x40, +0x00,0x0A,0xCC,0x0D,0xF1,0x01,0x22,0x20,0x80,0x06,0x22,0x10,0x80,0x07,0xB6,0x40, +0xA8,0x41,0x10,0x70,0x00,0x0A,0xAD,0x84,0x84,0x01,0xFC,0xC2,0x8C,0x21,0x5A,0x18, +0x0B,0xED,0x84,0x00,0xFC,0xC2,0xFC,0x41,0x3C,0x63,0xF9,0xF7,0x84,0x0A,0xFF,0x84, +0x2E,0x00,0x11,0x99,0x97,0xB1,0x3C,0x17,0xF9,0xF6,0xC0,0x07,0xC6,0x06,0x44,0x00, +0x00,0x64,0xFE,0x44,0x96,0x49,0xC9,0x0B,0x44,0x02,0x13,0x2C,0x84,0x20,0x84,0x4B, +0x49,0x00,0x4A,0x82,0x84,0x00,0x3E,0x07,0xF1,0x3A,0xFC,0xC1,0x2E,0x07,0xF1,0x3A, +0xC8,0x18,0x44,0x22,0x33,0x88,0x84,0x0B,0x52,0x40,0xB2,0x64,0x52,0x53,0x19,0x32, +0x00,0x31,0x01,0x0D,0xC3,0x17,0x22,0x71,0x00,0x8F,0x22,0x31,0x00,0x8E,0xE0,0xE4, +0xE8,0x11,0xE0,0xC3,0xE8,0x0F,0xE0,0x65,0xE8,0x0D,0x84,0x01,0x3E,0x07,0xF1,0x3A, +0x44,0x92,0x33,0x90,0x44,0xA2,0x13,0x2C,0x50,0x84,0x8C,0x8C,0x52,0x70,0xB2,0x64, +0xD5,0x07,0x8E,0x01,0x96,0x00,0x50,0x21,0x01,0x24,0xC8,0xE3,0xD5,0xF2,0x00,0x04, +0x81,0x05,0xC0,0x1F,0xB0,0x41,0x84,0x40,0x80,0x09,0x49,0xFF,0xEF,0xDB,0xF1,0x01, +0x2E,0x20,0x11,0x99,0xE6,0x42,0x22,0x00,0x80,0x08,0x22,0x10,0x80,0x09,0xE9,0x1E, +0x2E,0x27,0xF1,0x3A,0x5A,0x28,0x01,0x1B,0xE0,0xE1,0xE8,0x0E,0xE0,0x06,0xE9,0x05, +0x52,0x13,0x19,0x32,0xE0,0x20,0xE8,0x08,0x84,0x04,0x10,0x04,0x81,0x05,0x84,0x01, +0x10,0x05,0x00,0x00,0xD5,0x0B,0x00,0x05,0x00,0x00,0x5A,0x08,0x01,0x08,0x84,0x00, +0x10,0x05,0x00,0x00,0x84,0x02,0x10,0x04,0x81,0x05,0x50,0x94,0x81,0x24,0x8D,0x41, +0x4C,0x94,0x7F,0xCF,0xFC,0xC1,0x84,0xA0,0x80,0x25,0x44,0x32,0x33,0x88,0x44,0x20, +0x0C,0x8C,0x98,0x2B,0x00,0x00,0x01,0x0D,0x8E,0x02,0xE6,0x02,0xE8,0x03,0x8C,0x21, +0x96,0x48,0x50,0x52,0x81,0x24,0xDA,0xF6,0xC1,0x05,0x84,0x01,0x3C,0x0F,0xFC,0x52, +0xDD,0x9E,0x3C,0x0D,0xFC,0x52,0x5A,0x08,0x01,0x07,0x3E,0x07,0xF4,0xA8,0x3C,0x1F, +0xFC,0x52,0xDD,0x9E,0x3C,0x1F,0xFC,0x52,0x80,0x01,0xDD,0x9E,0x4E,0x05,0x00,0x22, +0xE4,0x02,0xE9,0x20,0x40,0x50,0x08,0x0A,0x84,0x22,0xCD,0x05,0x8E,0x22,0x96,0x4A, +0x84,0x40,0xD5,0x07,0xD0,0xFC,0x8C,0x22,0x96,0x4A,0x40,0x50,0x04,0x0E,0xD5,0xF6, +0x4E,0x15,0x00,0x0E,0x94,0x91,0x9C,0xD1,0x40,0x50,0x04,0x0E,0x42,0xF1,0x8C,0x24, +0xE0,0xAF,0x8E,0x22,0x40,0x21,0xBC,0x1A,0x96,0x4A,0xD5,0xF3,0x80,0x02,0xDD,0x9E, +0x84,0x00,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xFF,0xDB,0xFC,0x80,0x9A,0xCB,0x8A,0x02, +0xFE,0xDC,0x42,0x30,0x00,0x73,0x44,0x00,0x00,0x64,0x40,0x01,0x80,0x16,0xDD,0x9E, +0xFE,0x5C,0x42,0x10,0x08,0x73,0x80,0x01,0xDD,0x9E,0xB4,0x20,0x84,0x61,0x4E,0x14, +0x00,0x03,0x84,0x7F,0x4E,0x14,0x00,0x03,0xFE,0x4A,0x84,0x40,0x40,0x40,0x88,0x0E, +0xC4,0x04,0x8C,0x41,0x96,0x90,0xD5,0xFB,0x52,0x21,0x00,0x1F,0x96,0x90,0x40,0x10, +0x88,0x0C,0xFE,0x5C,0xB6,0x20,0x80,0x02,0xDD,0x9E,0x46,0x18,0x00,0x00,0x4C,0x00, +0x80,0x11,0xC0,0x10,0x4E,0x04,0x00,0x03,0xFE,0x02,0xFA,0xAF,0x40,0x10,0x14,0x0E, +0x96,0x46,0xC9,0x04,0x8E,0xA1,0x97,0x68,0xD5,0xFA,0x9C,0x29,0x96,0x00,0xDD,0x9E, +0xFA,0x10,0xDD,0x9E,0x84,0x60,0x80,0x43,0xE2,0x61,0xE8,0x07,0x38,0x40,0x0D,0x11, +0x8C,0x61,0x88,0x44,0x96,0xD8,0xD5,0xF9,0x4E,0x26,0x00,0x03,0x84,0x41,0x40,0x21, +0x04,0x56,0x84,0x80,0x96,0x93,0x80,0x64,0xE2,0x81,0xE8,0x09,0x38,0x50,0x11,0x11, +0x8C,0x81,0x8A,0xA2,0x42,0x32,0x94,0x73,0x97,0x20,0xD5,0xF7,0xFC,0x00,0x80,0x03, +0x4E,0x36,0x00,0x03,0x84,0x01,0x40,0x00,0x04,0x16,0x49,0xFF,0xFF,0x9D,0x96,0x03, +0xFC,0x80,0x84,0x00,0x84,0x20,0x3E,0x07,0xF4,0x04,0x3C,0x1F,0xFD,0x00,0x3E,0x17, +0xF1,0x51,0x3E,0x07,0xF3,0xFD,0xDD,0x9E,0xFC,0x00,0x5A,0x08,0x04,0x07,0x44,0x02, +0x2D,0x2C,0x44,0x12,0x10,0x58,0xD5,0x05,0x44,0x02,0x2D,0x2C,0x44,0x12,0x10,0x50, +0x84,0x48,0x49,0x00,0x49,0x33,0xFC,0x80,0xA7,0x08,0xA6,0xC0,0xE2,0x64,0x40,0x32, +0x3C,0x1A,0xAE,0xD0,0xA7,0x01,0xA6,0xC9,0xE2,0x83,0x40,0x32,0x3C,0x1A,0xAE,0xD1, +0xA7,0x0A,0xA6,0xC2,0xA6,0x4B,0xA6,0x03,0xE2,0x64,0x40,0x32,0x3C,0x1A,0xE2,0x01, +0x40,0x10,0x3C,0x1A,0xAE,0xD2,0xAE,0x53,0xDD,0x9E,0xFC,0x48,0x51,0xCF,0x80,0x14, +0x80,0xE1,0x81,0x20,0x84,0x20,0x81,0x42,0x80,0x1C,0xFA,0x5C,0x81,0x05,0xF3,0x83, +0x80,0xC4,0x49,0x00,0x49,0x31,0xA6,0x7B,0x2F,0xE7,0xDE,0x16,0xA6,0x3A,0x80,0x41, +0x42,0x20,0x78,0x73,0x38,0x54,0x89,0x01,0x8A,0xA8,0x96,0xAB,0xF2,0x81,0x4E,0x22, +0x00,0x82,0x44,0x22,0x30,0x20,0x44,0x40,0x00,0xFF,0x38,0x11,0x05,0x01,0x85,0x20, +0xF1,0x82,0x44,0x12,0x33,0x08,0x80,0x4A,0x38,0x80,0x81,0x01,0x80,0x1C,0x45,0xC0, +0xFF,0xFF,0x40,0x11,0x28,0x01,0xF3,0x03,0x96,0x48,0xE2,0x23,0xE8,0x27,0x08,0x41, +0x00,0x01,0x80,0x66,0x44,0x10,0x00,0x38,0x42,0x32,0x04,0x73,0x00,0xF1,0x80,0x30, +0x5A,0xF8,0x01,0xF1,0x38,0x10,0x12,0x02,0xC9,0xED,0xA0,0x5B,0xA0,0xDC,0xF5,0x02, +0x40,0x34,0x0C,0x01,0x9A,0x69,0xFE,0xDC,0x42,0x30,0x84,0x73,0x92,0x63,0xC3,0x07, +0x40,0xFE,0x0C,0x06,0xE8,0x05,0x44,0x30,0xFF,0xFF,0xD5,0x02,0x80,0x6F,0x40,0x3E, +0x0C,0x77,0x38,0x30,0x12,0x0A,0x89,0x23,0xD5,0xD5,0x84,0x20,0x50,0x23,0x00,0x1C, +0x80,0xA1,0xB0,0x05,0x55,0xC0,0x80,0xFF,0x38,0x30,0x06,0x02,0xC3,0x20,0xF4,0x01, +0xB4,0x02,0xFE,0xE4,0x04,0x41,0x7F,0xFC,0x04,0xFF,0x80,0x02,0x40,0x31,0xA4,0x77, +0xFF,0x04,0x40,0xA0,0x0C,0x00,0x42,0x41,0xBC,0x73,0x40,0x42,0x28,0x97,0x14,0x41, +0x7F,0xFC,0x04,0x41,0x7F,0xFD,0x8C,0xA1,0xFE,0x24,0x42,0x01,0xA0,0x73,0x40,0x00, +0x28,0x17,0x97,0x68,0x14,0x01,0x7F,0xFD,0xB7,0x42,0x80,0x9C,0x8C,0x21,0x50,0x21, +0x00,0x38,0x5A,0x18,0x0B,0xD8,0x5A,0x58,0x01,0x16,0x44,0x00,0x00,0x38,0x42,0x62, +0x00,0x73,0x00,0x03,0x00,0x2E,0xF2,0x18,0x8C,0x01,0x10,0x03,0x00,0x2E,0xA6,0x3B, +0xA6,0x7A,0x88,0x02,0x42,0x00,0xF8,0x73,0x00,0x13,0x00,0x29,0x58,0x10,0x80,0x20, +0xAE,0x40,0xFC,0xC8,0xFC,0x47,0x3C,0x0D,0xFB,0xD6,0x54,0x00,0x20,0x00,0xC8,0x06, +0x44,0x00,0x03,0x20,0x44,0x20,0x08,0x34,0xD5,0x05,0x44,0x00,0x00,0xC8,0x44,0x20, +0x04,0x1A,0x3C,0x1D,0xFB,0xD6,0x54,0x10,0xA0,0x00,0xC9,0x04,0x44,0x70,0x05,0xDC, +0xD5,0x03,0x44,0x70,0x02,0xEE,0x3C,0x1D,0xFB,0xD6,0x54,0x10,0xA0,0x00,0xC9,0x03, +0x84,0x22,0xD5,0x02,0x84,0x21,0x3C,0x33,0xF7,0xC5,0x96,0xC6,0xC3,0x04,0xFA,0x64, +0xF3,0x81,0xD5,0x02,0xF1,0x81,0x42,0xA1,0x08,0x24,0xF2,0x01,0xFE,0x04,0x42,0x31, +0x28,0x24,0x44,0x20,0x00,0x64,0x40,0x00,0x08,0x16,0xFF,0xFC,0xF0,0x85,0x42,0x00, +0x9C,0x24,0xF0,0x82,0x40,0x00,0x08,0x16,0xF0,0x86,0x46,0x00,0x08,0x95,0x50,0x00, +0x04,0x40,0x40,0x31,0x88,0x76,0xFE,0x0C,0xF3,0x84,0xF0,0x83,0x44,0x62,0x33,0x90, +0x85,0x20,0x02,0x03,0x00,0x80,0x4E,0x02,0x00,0xBF,0xB0,0x49,0x84,0x40,0x80,0x06, +0x49,0xFF,0xED,0xE0,0xB0,0x4A,0x84,0x41,0x80,0x06,0x49,0xFF,0xED,0xDB,0xB0,0x4B, +0x84,0x42,0x80,0x06,0x49,0xFF,0xED,0xD6,0xB0,0x4C,0x84,0x43,0x80,0x06,0x49,0xFF, +0xED,0xD1,0xB0,0x4D,0x84,0x44,0x80,0x06,0x49,0xFF,0xED,0xCC,0xF1,0x09,0x87,0xC4, +0x22,0x20,0x80,0x04,0x22,0x00,0x80,0x05,0x12,0x20,0x80,0x08,0x12,0x00,0x80,0x09, +0x02,0x33,0x00,0x80,0xE6,0x65,0xE8,0x04,0x9E,0x59,0x41,0xE0,0x80,0x13,0x44,0x40, +0x01,0x24,0x44,0x12,0x34,0xA8,0x42,0x14,0x90,0x73,0xA0,0x49,0x4E,0x15,0x00,0x25, +0x22,0xF3,0x00,0x89,0x22,0x43,0x00,0x88,0x8A,0x0F,0x8A,0x44,0xFE,0x04,0x42,0x01, +0x08,0x73,0x44,0x22,0x71,0x00,0xE0,0x40,0xE8,0x17,0x40,0x00,0xD8,0x08,0x00,0x53, +0x01,0x18,0x90,0x1A,0xD8,0x06,0x96,0x4B,0x00,0x53,0x01,0x19,0x90,0x2A,0xD1,0x0C, +0x44,0x10,0x01,0x24,0x44,0x02,0x34,0xA8,0x42,0x04,0x84,0x73,0xA6,0x87,0x44,0x1F, +0xFF,0x80,0xFE,0x57,0xAE,0x47,0x44,0x40,0x00,0x49,0x84,0x00,0x42,0x24,0x90,0x24, +0x80,0x20,0xB1,0x49,0xF2,0x87,0xE2,0x3E,0xE8,0x2F,0x9C,0x89,0x38,0x42,0x86,0x02, +0x38,0x82,0x8A,0x02,0x38,0x22,0x86,0x02,0x22,0xF1,0x00,0x04,0x22,0x24,0x00,0x04, +0x22,0x84,0x00,0x05,0x40,0x27,0x88,0x01,0x22,0xF2,0x00,0x05,0x40,0x87,0xA0,0x01, +0xE6,0x22,0xE8,0x10,0xF4,0x07,0x40,0xF2,0x04,0x00,0x50,0xF7,0x80,0x24,0x40,0xF7, +0x88,0x08,0x44,0x42,0x33,0x88,0x40,0xF2,0x3C,0x00,0x12,0x27,0x80,0x02,0x12,0x87, +0x80,0x03,0x42,0x84,0x20,0x24,0x42,0x81,0x08,0x73,0xE0,0x08,0x8C,0x21,0x40,0x04, +0x3C,0x1B,0x96,0x48,0xD5,0xD1,0xE6,0x62,0xE8,0x03,0xF0,0x04,0xD5,0x0B,0x44,0x20, +0x01,0x24,0x44,0x12,0x34,0xA8,0x42,0x14,0x88,0x73,0xA0,0x49,0x4E,0x15,0x00,0x06, +0xF0,0x05,0x14,0x03,0x00,0x3D,0xD5,0x1D,0x98,0x78,0xE0,0x27,0xE9,0x05,0xE1,0x41, +0x40,0x15,0x3C,0x1B,0xD5,0x02,0x80,0x27,0xF2,0x01,0x94,0x02,0xFE,0x54,0x44,0x20, +0x00,0x64,0x40,0x10,0x88,0x36,0x14,0x13,0x00,0x3D,0xF1,0x02,0xE0,0x01,0xE9,0x08, +0xF1,0x03,0xE0,0x20,0x40,0x10,0x3C,0x1A,0x40,0x00,0x88,0x16,0xD5,0x02,0xF0,0x06, +0x14,0x03,0x00,0x3C,0x8D,0x21,0x50,0x63,0x01,0x24,0x5A,0x90,0x0B,0x04,0x48,0xFF, +0xFF,0x3A,0xFC,0xC7,0xFC,0x42,0x44,0x62,0x30,0x44,0x81,0x20,0x81,0x41,0x81,0x02, +0x83,0x83,0x50,0x73,0x00,0x84,0x00,0x03,0x00,0x0A,0xC8,0x06,0x8C,0xCC,0x4C,0x63, +0xFF,0xFC,0x84,0x00,0xFC,0xC2,0xB4,0x26,0x40,0x04,0x84,0x01,0xB6,0x1F,0xA0,0x31, +0x40,0x14,0x04,0x01,0x40,0x25,0x00,0x01,0x40,0x0E,0x00,0x01,0xF0,0x83,0x80,0x1F, +0xF1,0x82,0xF2,0x81,0x49,0x00,0x04,0xE1,0xA4,0x74,0xE0,0x01,0xE8,0xE8,0xB0,0x02, +0x49,0x00,0x04,0xDB,0xA4,0x74,0xE0,0x20,0xE8,0xE2,0x84,0x01,0xFC,0xC2,0xFC,0x43, +0x94,0xDD,0x40,0xA0,0x8C,0x00,0x80,0xE0,0x00,0x05,0x00,0x00,0x44,0x80,0x01,0x24, +0x42,0x00,0x20,0x24,0x8C,0x08,0x44,0x62,0x33,0x88,0x81,0x22,0x88,0x06,0xB0,0x41, +0x84,0x40,0x49,0xFF,0xEC,0xDF,0x2E,0x00,0x11,0x99,0xE6,0x03,0xE9,0x03,0x84,0x00, +0xFC,0xC3,0xF2,0x01,0x44,0x00,0x00,0x38,0x42,0x74,0x80,0x73,0x22,0x11,0x00,0x08, +0xA0,0x3E,0x8A,0x01,0xF0,0x82,0x22,0x01,0x00,0x09,0xA0,0xBF,0x8A,0x40,0xF2,0x83, +0x00,0x25,0x00,0x00,0x42,0x61,0x20,0x73,0x50,0x23,0x01,0x00,0x22,0x31,0x00,0x02, +0x8A,0x23,0xF1,0x84,0x22,0x11,0x00,0x03,0x8A,0x01,0x04,0x13,0x80,0x0A,0xF0,0x85, +0x44,0x00,0x00,0x64,0xFE,0x0C,0x04,0x13,0x00,0x40,0x40,0x00,0x04,0x16,0x5E,0xF0, +0x00,0x33,0xE8,0xD6,0xE4,0x1F,0xE8,0x04,0x44,0x60,0x01,0x90,0xD5,0x03,0x44,0x60, +0x02,0x8A,0xB0,0x04,0x49,0x00,0x04,0x89,0x5E,0xF0,0x02,0x58,0xE8,0xC9,0xB0,0x02, +0x49,0x00,0x04,0x83,0x40,0x03,0x00,0x07,0xFC,0xC3,0xFC,0x40,0x51,0xFF,0xFD,0xE8, +0x81,0x00,0xA6,0x00,0xF1,0x84,0x4E,0x02,0x01,0x84,0x4E,0x22,0x01,0x82,0xE6,0x0C, +0x80,0x20,0xE9,0x02,0x84,0x2B,0x96,0x08,0xE6,0x4C,0xF0,0x83,0x80,0x02,0xE9,0x02, +0x84,0x0B,0x96,0x00,0xF0,0x82,0x46,0x30,0x50,0x00,0x84,0x00,0xB0,0x8D,0x84,0x20, +0x88,0x40,0x38,0x31,0x06,0x0A,0x8C,0x21,0x5A,0x18,0x0B,0xFD,0x50,0x00,0x00,0x2C, +0x5A,0x09,0xE4,0xF6,0x3C,0x03,0xF7,0xC5,0x96,0x06,0x56,0x00,0x00,0x01,0xF0,0x89, +0x49,0x00,0x25,0xDD,0xC0,0x04,0x3C,0x03,0xF7,0xC5,0x96,0x06,0xF0,0x85,0xF0,0x04, +0x87,0x80,0x9D,0x84,0x81,0x3C,0x54,0x0E,0x00,0xFF,0xF0,0x88,0xB0,0x4D,0xFA,0x1C, +0x42,0x1E,0x00,0x73,0x84,0x00,0x50,0xA4,0x00,0x18,0xF1,0x87,0xF0,0x81,0x00,0x0F, +0x80,0x04,0xF0,0x8A,0x84,0x00,0xF0,0x8C,0x00,0x05,0x00,0x23,0x5A,0x00,0xFF,0x04, +0x48,0x00,0x00,0xD7,0xB4,0xE6,0xA1,0x31,0xA0,0xB2,0xA0,0xF3,0x88,0x47,0x88,0x64, +0x04,0x15,0x00,0x01,0xB4,0x0A,0x49,0xFF,0xFC,0xE3,0xA1,0x36,0xF0,0x86,0x04,0x15, +0x00,0x01,0xB4,0x0A,0xB4,0x46,0xA0,0xF1,0xF4,0x8B,0x04,0x75,0x00,0x04,0x49,0xFF, +0xFF,0x1B,0x5A,0x08,0x01,0x04,0x48,0x00,0x00,0xBC,0x80,0x08,0xF1,0x04,0xF2,0x0A, +0xF3,0x08,0x49,0xFF,0xFF,0x3E,0x5A,0x08,0x01,0x04,0x48,0x00,0x00,0xB2,0xF4,0x0B, +0xE0,0xE4,0x80,0x04,0x40,0x03,0xBC,0x1A,0xE0,0x87,0x94,0x05,0x40,0x43,0xBC,0x1A, +0x40,0x70,0x10,0xF6,0xF0,0x05,0x5A,0x08,0x01,0x32,0x00,0x04,0x00,0x00,0x5A,0x08, +0x01,0x2E,0x00,0x13,0x7F,0xFC,0x44,0x00,0x01,0x24,0xFE,0x0C,0x44,0x12,0x33,0x88, +0x88,0x20,0x00,0x10,0x81,0x0D,0x5A,0x18,0x02,0x22,0x2E,0x10,0x11,0x99,0x5A,0x18, +0x01,0x1E,0x44,0x12,0x34,0xA8,0x88,0x01,0x00,0x25,0x7F,0xF4,0xA0,0x01,0x40,0x10, +0x58,0x08,0x90,0x3A,0x96,0x48,0x96,0x03,0xE2,0x22,0x90,0x0A,0xE9,0x0F,0x00,0x25, +0x7F,0xF5,0xE2,0x41,0xE9,0x0B,0x00,0x15,0x7F,0xF6,0x96,0x00,0xE2,0x01,0xE9,0x06, +0x00,0x15,0x7F,0xF7,0xE2,0x20,0x4E,0xF2,0x00,0xD3,0xF5,0x06,0x46,0x00,0x50,0x00, +0xE0,0x05,0xE8,0x02,0x80,0xA0,0xF0,0x09,0xC0,0x0A,0x5E,0xF3,0x80,0x20,0xE9,0x07, +0x5E,0xF3,0x80,0x41,0xE9,0x05,0x44,0x70,0x00,0x40,0xD5,0x02,0xFA,0xF0,0xA0,0x34, +0xE0,0x05,0xE8,0x5A,0xA0,0x75,0xE0,0x01,0xE8,0x5B,0xB4,0x6A,0xB4,0x46,0x04,0x45, +0x00,0x01,0x9A,0x9A,0xA0,0x73,0xA0,0xF1,0xA0,0x32,0x9A,0xE3,0x42,0x40,0x84,0x24, +0x42,0x40,0x00,0x73,0x42,0x91,0x8C,0x24,0xF5,0x8A,0xF4,0x86,0x42,0x91,0x08,0x73, +0x49,0xFF,0xFC,0x68,0xF4,0x06,0xF5,0x0A,0x4E,0x04,0x00,0x03,0xFE,0x02,0x44,0x10, +0x7F,0xFF,0xE0,0x20,0xE8,0x08,0xE0,0x89,0x90,0x01,0xE8,0x03,0x91,0x22,0xD5,0xFA, +0x90,0x82,0xD5,0xF8,0x4E,0x92,0x00,0x23,0xC4,0x23,0xFE,0x04,0xF0,0x8C,0xB0,0x0C, +0xF4,0x8B,0xF5,0x8A,0x49,0xFF,0xFC,0x53,0xF0,0x86,0xF0,0x0C,0x40,0x90,0x25,0x36, +0xB0,0x0C,0x14,0x9F,0x80,0x0C,0x49,0xFF,0xFC,0x4A,0xF1,0x06,0xF4,0x0B,0x88,0x01, +0x96,0x40,0xF0,0x0C,0xF5,0x0A,0x40,0x40,0x10,0x96,0xE6,0x3F,0xE9,0x05,0x9E,0x09, +0x90,0x81,0x96,0x40,0xD5,0xFB,0xF4,0x8C,0xD5,0x04,0x80,0x29,0xD5,0x02,0x80,0x24, +0x84,0x01,0x40,0x00,0x04,0x0C,0x90,0x07,0xF1,0x0C,0x94,0x06,0xE0,0x01,0xE8,0x08, +0xA0,0x35,0xE0,0x05,0xE9,0x05,0xFF,0x7C,0x40,0x92,0x94,0x0A,0xD5,0x03,0x46,0x90, +0x50,0x00,0xF1,0x01,0xF0,0x07,0x50,0xA5,0x00,0x38,0x38,0x90,0x06,0x0A,0x80,0x01, +0x8C,0x01,0xF0,0x81,0x00,0x0F,0x80,0x04,0xF1,0x03,0xE2,0x01,0x4E,0xF3,0xFF,0x11, +0x51,0xCE,0x00,0x01,0xF1,0x02,0x54,0x0E,0x00,0xFF,0xE2,0x01,0x50,0x63,0x00,0x20, +0x4E,0xF3,0xFE,0xFB,0xF0,0x02,0xF1,0x03,0xF2,0x03,0xE2,0x01,0xF1,0x02,0xB1,0x8D, +0x40,0x11,0x3C,0x1B,0x80,0x06,0x49,0xFF,0xEE,0x5F,0x44,0x70,0x01,0x24,0x44,0x22, +0x2F,0x5C,0x84,0x20,0x84,0x0B,0x46,0x30,0x50,0x00,0x44,0x40,0x00,0x38,0x44,0x52, +0x33,0x88,0x85,0x41,0x87,0x9F,0x0C,0x91,0x00,0x01,0x81,0xE9,0x42,0xF0,0x80,0x73, +0x38,0xF3,0x3E,0x02,0x4C,0xF1,0xC0,0x05,0x15,0xC1,0x7F,0xFF,0xD5,0x18,0x4E,0x95, +0x00,0x17,0x05,0xEF,0x80,0x04,0x40,0xF0,0x94,0x08,0x38,0xFF,0x3C,0x00,0x83,0xC8, +0x43,0xE4,0x90,0x73,0x81,0x25,0x42,0x97,0x9C,0x73,0x10,0xFF,0x00,0x3B,0x81,0xE9, +0x10,0xA4,0x81,0x0E,0x04,0x91,0x7F,0xFF,0x10,0x97,0x81,0x22,0x8C,0x21,0x04,0xFF, +0x80,0x02,0x54,0x90,0x80,0xFF,0xE3,0x2F,0xE9,0xD7,0xD5,0x0A,0xF0,0x06,0xA0,0x75, +0x40,0x00,0x1C,0x16,0x94,0x05,0xE0,0x01,0x4E,0xF2,0xFF,0x29,0xD5,0x9B,0x51,0xFF, +0x82,0x18,0xFC,0xC0,0xFC,0x40,0x84,0x81,0x40,0x42,0x04,0x0C,0xE4,0x02,0x40,0x20, +0x04,0x0C,0x95,0xA1,0x9D,0xE5,0x50,0x92,0x7F,0xFB,0xE9,0x23,0x84,0x60,0x90,0x01, +0x8C,0x61,0x5A,0x08,0x01,0xFE,0x40,0x21,0x0C,0x0E,0x40,0x01,0x84,0x0C,0x85,0x00, +0xE0,0x49,0xE9,0x03,0xE0,0xE2,0xE8,0x16,0x80,0x68,0xE0,0x46,0xE8,0x06,0xFE,0x94, +0x40,0x21,0x04,0x0E,0x8C,0x61,0xD5,0xFA,0x81,0x03,0x81,0x44,0x84,0xA0,0xD3,0x04, +0x91,0x41,0x8C,0xA1,0xD5,0xFD,0xE4,0xAA,0x88,0x0A,0x90,0x41,0xE9,0xEA,0xD5,0x02, +0x84,0x00,0xFC,0xC0,0xFC,0x58,0xF0,0x8F,0x44,0x02,0x00,0x98,0xF1,0x88,0xB0,0x5B, +0xF2,0x81,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0xA4,0x00,0xAC,0x08,0x44,0x12, +0x00,0xAC,0xB0,0x17,0x3A,0x20,0x94,0x00,0x3A,0x20,0x14,0x20,0xF0,0x01,0xC8,0x09, +0x3C,0x04,0x05,0x9B,0x3C,0x14,0x05,0x9A,0x9A,0x41,0x2E,0x07,0xDE,0x16,0xD5,0x08, +0x3C,0x04,0x05,0x9D,0x3C,0x14,0x05,0x9C,0x9A,0x41,0x2E,0x07,0xDE,0x17,0x8E,0x01, +0x96,0x02,0x40,0x00,0x80,0x16,0x96,0x03,0xF0,0x8D,0x84,0x00,0x44,0x62,0x13,0x4C, +0xF0,0x84,0xF5,0x04,0xF1,0x08,0x4C,0x50,0x82,0x0D,0x00,0x03,0x00,0x3C,0x4E,0x02, +0x02,0x01,0x04,0x03,0x00,0x0A,0xF0,0x85,0x4E,0x07,0x01,0xFC,0xF0,0x01,0xC8,0x08, +0x00,0x53,0x00,0x37,0x4E,0x52,0x01,0xF6,0x2E,0x07,0xDE,0x16,0xD5,0x07,0x00,0x53, +0x00,0x38,0x4E,0x52,0x01,0xEF,0x2E,0x07,0xDE,0x17,0x8E,0x01,0x4C,0x50,0x01,0xEA, +0x00,0x03,0x00,0x37,0xF0,0x82,0x00,0x03,0x00,0x38,0xF0,0x83,0x84,0x02,0xF0,0x8E, +0x84,0x20,0x84,0x46,0xB0,0x11,0x49,0x00,0x44,0xF7,0xB0,0x20,0x84,0x20,0xFA,0x42, +0x49,0x00,0x44,0xF2,0x84,0x00,0x50,0xAF,0x80,0x6C,0xF0,0x86,0x00,0x05,0x00,0x00, +0xF1,0x02,0xF0,0x89,0x88,0x01,0x96,0x00,0xF0,0x87,0x20,0x0F,0x80,0x1C,0x20,0x15, +0x00,0x01,0x4E,0x05,0x00,0xD1,0xF2,0x03,0x96,0x48,0x99,0xCA,0x97,0xF8,0xF1,0x8A, +0x96,0x7A,0x4E,0x15,0x00,0xC9,0x2E,0x97,0xDE,0x16,0xE0,0x09,0x4E,0xF2,0x00,0xC4, +0x2E,0x27,0xDE,0x17,0xE0,0x22,0xF2,0x8B,0x4E,0xF2,0x00,0xBE,0x42,0x00,0xA4,0x73, +0xF2,0x0F,0x94,0x41,0x88,0x22,0xF1,0x8C,0x22,0x10,0x80,0x00,0x84,0x60,0x4E,0x15, +0x00,0x06,0xF2,0x06,0x80,0x61,0x88,0x41,0xF2,0x86,0xF2,0x08,0x5A,0x20,0x02,0x04, +0x48,0x00,0x00,0x9A,0x2E,0x57,0xF1,0x9A,0x2E,0x27,0xF1,0xD2,0x4C,0x51,0x40,0x94, +0x2E,0x47,0xF1,0x96,0x2E,0x27,0xF1,0xCE,0x88,0x44,0xE4,0x54,0x4E,0xF2,0x00,0x8C, +0x45,0xC2,0x30,0xC8,0x44,0x8F,0xFF,0xDF,0x38,0x0E,0x00,0x00,0x84,0x21,0x40,0x00, +0x20,0x02,0x3E,0x17,0xF4,0x13,0x5A,0x00,0x1F,0x04,0x48,0x00,0x00,0x81,0x84,0x20, +0xFA,0x5C,0xB0,0x25,0x49,0x00,0x44,0x98,0x84,0x40,0x80,0x9C,0x80,0xA8,0x80,0x22, +0x51,0xEF,0x80,0x5C,0x44,0x82,0x2F,0xF0,0x51,0xCF,0x80,0x54,0xF3,0x07,0x38,0x01, +0x78,0x00,0x88,0x03,0x96,0x00,0x40,0x3F,0x08,0x00,0xE2,0x09,0x20,0x31,0x80,0x01, +0xE8,0x18,0x88,0x67,0x04,0xFF,0x80,0x0B,0x96,0xD8,0xE2,0x6F,0xE8,0x12,0x88,0x04, +0x42,0x01,0xA4,0x73,0xA6,0x00,0x40,0x30,0x14,0x02,0x5A,0x30,0x1F,0x0B,0x96,0x27, +0x38,0x34,0x00,0x00,0x5A,0x30,0xFF,0x06,0x38,0x0E,0x04,0x08,0x8C,0x21,0x96,0x49, +0x8C,0x42,0x5A,0x28,0x10,0xDD,0xF2,0x07,0x44,0x02,0x30,0x20,0x50,0x8F,0x80,0x54, +0x38,0x90,0x09,0x01,0x44,0x02,0x33,0x08,0x45,0xC0,0x00,0x38,0x39,0xE0,0x1D,0x01, +0x84,0x00,0x80,0x60,0x44,0x70,0xFF,0xFF,0xE2,0x01,0xE8,0x29,0x38,0x44,0x00,0x00, +0x44,0x52,0x13,0x58,0x42,0x52,0x70,0x73,0x00,0xF2,0x80,0x30,0x5A,0xF8,0x01,0x1D, +0xB0,0xA5,0x38,0x21,0x12,0x02,0xCA,0x18,0xA0,0xAB,0xA1,0x6C,0x40,0x24,0x88,0x01, +0x40,0x5F,0x14,0x01,0xFF,0x6C,0x42,0x51,0x08,0x73,0x92,0xA5,0xC5,0x06,0xE2,0xE5, +0xE8,0x05,0x44,0x50,0xFF,0xFF,0xD5,0x02,0x80,0xAF,0xB0,0xA5,0x40,0x53,0x94,0xB7, +0x38,0x51,0x12,0x0A,0x88,0x65,0x8C,0x01,0x96,0x00,0xD5,0xD7,0xF0,0x0C,0xF2,0x04, +0x22,0x10,0x00,0x00,0xB0,0x25,0x38,0x00,0x0A,0x02,0xFE,0x0C,0x40,0x30,0x0C,0x77, +0x96,0xDB,0xD5,0x05,0x84,0x00,0x3E,0x07,0xF4,0x13,0x80,0x61,0xF0,0x0A,0xF1,0x09, +0x8C,0x01,0x8C,0x21,0x96,0x48,0x96,0x00,0x84,0x43,0x42,0x00,0x88,0x73,0xB0,0x60, +0x38,0x30,0x81,0x09,0x8D,0x42,0x50,0x0F,0x80,0x7E,0x4C,0xA0,0x7F,0x21,0xB0,0xA0, +0x84,0x20,0x50,0xAF,0x80,0x44,0x84,0x00,0xF3,0x01,0x38,0x41,0x01,0x01,0xCB,0x07, +0x38,0x35,0x05,0x01,0x88,0x64,0x38,0x35,0x05,0x09,0xD5,0x06,0x38,0x35,0x01,0x01, +0x88,0x64,0x38,0x35,0x01,0x09,0x8C,0x01,0x5A,0x08,0x03,0xF0,0x8C,0x21,0x8C,0x46, +0x5A,0x18,0x03,0xEB,0xF0,0x08,0x5A,0x08,0x01,0x25,0x22,0x0F,0x80,0x23,0x22,0xFF, +0x80,0x22,0xE0,0x0F,0xE8,0x09,0xF0,0x01,0xC8,0x04,0xF0,0x02,0x8E,0x01,0xD5,0x0C, +0xF0,0x03,0x8E,0x01,0xD5,0x0E,0x22,0xFF,0x80,0x24,0xE0,0x0F,0xE8,0x0C,0xF0,0x01, +0xC8,0x06,0xF0,0x02,0x8C,0x01,0x96,0x00,0xF0,0x82,0xD5,0x05,0xF0,0x03,0x8C,0x01, +0x96,0x00,0xF0,0x83,0xF0,0x0E,0x5A,0x00,0x01,0x05,0x84,0x01,0x48,0xFF,0xFE,0xD1, +0x2E,0x07,0xF4,0x13,0x5A,0x08,0x01,0x07,0xA0,0x36,0x83,0x86,0xB8,0x88,0xA0,0x37, +0xB8,0x89,0xF0,0x06,0x44,0x70,0x00,0x64,0xF1,0x05,0xFF,0xC4,0x44,0x00,0x00,0x55, +0xFE,0x0C,0xE0,0xE0,0x4E,0xF3,0x00,0x9E,0xF0,0x06,0xE0,0x01,0xE8,0x08,0x40,0x73, +0x84,0xF6,0x50,0x93,0xFF,0xAB,0x52,0x73,0x80,0x64,0xD5,0x03,0x84,0xE0,0x85,0x21, +0x22,0x15,0x00,0x00,0x22,0x05,0x00,0x01,0xE0,0x01,0xE8,0x03,0x12,0x15,0x00,0x01, +0x22,0x0F,0x80,0x24,0x22,0x2F,0x80,0x23,0xE0,0x40,0xE8,0x03,0x12,0x0F,0x80,0x23, +0x88,0x01,0x22,0x2F,0x80,0x23,0x44,0x10,0x00,0x64,0xFE,0x0C,0x44,0x10,0x00,0x82, +0xFE,0x54,0xE0,0x20,0xE9,0x1B,0x44,0x10,0x00,0x5A,0xFE,0x54,0xE0,0x01,0xE9,0x18, +0x84,0x7E,0x94,0x51,0xFE,0x9C,0x40,0x10,0x04,0x36,0x40,0x00,0x08,0x16,0x50,0x10, +0xFF,0xD3,0x50,0x00,0x00,0x41,0x42,0x30,0x1C,0x24,0x42,0xF4,0x84,0x24,0xE0,0x6F, +0x40,0x70,0xBC,0x1B,0x40,0x90,0x3C,0x1B,0xD5,0x03,0x84,0xE1,0x85,0x20,0x85,0x00, +0x51,0xCF,0x80,0x4C,0xB0,0x11,0x38,0x00,0x21,0x11,0x4E,0x06,0x00,0x06,0xB0,0x51, +0x84,0x01,0x38,0x00,0xA1,0x09,0x38,0x05,0x21,0x11,0x84,0x28,0x49,0xFF,0xFD,0xE4, +0x38,0x0E,0x21,0x09,0x8D,0x01,0x5A,0x88,0x03,0xEF,0x02,0x0E,0x00,0x01,0x22,0x1E, +0x00,0x02,0x22,0x2E,0x00,0x00,0x94,0x01,0x8A,0x01,0x8A,0x02,0x96,0x03,0xC0,0x08, +0x8A,0x22,0xF2,0x0D,0x94,0x01,0xFE,0x54,0x40,0x00,0x80,0x16,0x96,0x03,0xF1,0x01, +0x40,0x24,0x9C,0x00,0xC9,0x18,0xF3,0x02,0x44,0x12,0x30,0x20,0x38,0x10,0x8D,0x11, +0x88,0x01,0xA0,0x76,0xFF,0xCC,0x42,0x70,0x24,0x73,0x40,0x73,0x88,0xF6,0x4E,0x75, +0x00,0x08,0x3C,0x23,0xEF,0x08,0xE0,0x47,0x40,0x71,0x3C,0x1B,0xD5,0x02,0xF7,0x01, +0xA9,0xF6,0xD5,0x17,0xF3,0x03,0x44,0x12,0x33,0x08,0x38,0x10,0x8D,0x11,0x88,0x01, +0xA0,0x77,0xFF,0xCC,0x42,0x70,0x24,0x73,0x40,0x73,0x88,0xF6,0x4E,0x75,0x00,0x08, +0x3C,0x03,0xEF,0x09,0xE0,0x07,0x40,0x70,0x3C,0x1B,0xD5,0x02,0x84,0xE0,0xA9,0xF7, +0xF0,0x04,0x50,0x63,0x00,0x38,0x8C,0x01,0x96,0x00,0xF0,0x84,0x48,0xFF,0xFD,0xF3, +0xFC,0xD8,0xFC,0x41,0x80,0xE0,0x84,0x48,0x80,0xC1,0x80,0x1F,0x84,0x20,0x49,0x00, +0x43,0x0B,0x84,0x60,0x3C,0x9D,0xFB,0xA4,0x2E,0x4F,0xF4,0x12,0x50,0x03,0x80,0x1C, +0x80,0xA3,0x80,0x43,0xD6,0x18,0x00,0x10,0x00,0x14,0x5A,0x18,0x01,0x10,0xE6,0x42, +0xB4,0xE0,0xE8,0x03,0x38,0x7F,0x8A,0x0A,0x00,0x10,0x00,0x12,0x8C,0x41,0x88,0x61, +0xE1,0x27,0x96,0x90,0x96,0xD9,0xE8,0x02,0x84,0x80,0x8C,0xA1,0x97,0x68,0x50,0x00, +0x00,0x38,0xD5,0xE9,0x5A,0x28,0x02,0x17,0xE6,0x79,0xE8,0x14,0xF1,0x01,0xB4,0x1F, +0x80,0xA1,0xE0,0x01,0x40,0x50,0x3C,0x1A,0xE0,0x20,0x40,0x00,0xBC,0x1B,0x84,0x25, +0xFE,0x0C,0x40,0xF0,0x09,0xF6,0xE0,0xAF,0xE8,0x05,0x8C,0x81,0x3E,0x47,0xF4,0x12, +0xD5,0x11,0x8E,0x81,0xE6,0x79,0x3E,0x47,0xF4,0x12,0xE9,0x0C,0x3C,0x03,0xFA,0x08, +0xE6,0x19,0xE9,0x08,0x84,0x01,0x3C,0x0F,0xFD,0x03,0x84,0x00,0x3E,0x07,0xF4,0x12, +0xD5,0x07,0x2E,0x07,0xF4,0x08,0xC8,0x04,0xCA,0x03,0x3C,0x2F,0xFD,0x03,0x2E,0x17, +0xF4,0x12,0x3E,0x27,0xF4,0x08,0x80,0x01,0x96,0x4A,0xE4,0x2C,0x3C,0x3B,0xFA,0x08, +0xE9,0x03,0x84,0x0B,0xD5,0x05,0x96,0x42,0x4E,0x14,0x00,0x03,0x84,0x00,0x96,0x42, +0x3E,0x07,0xF4,0x12,0xC1,0x0A,0x3C,0x0D,0xFD,0x03,0xC8,0x07,0x3C,0x03,0xF7,0xC7, +0x58,0x00,0x00,0x40,0x3C,0x0B,0xF7,0xC7,0xFC,0xC1,0xFC,0x01,0x44,0x62,0x13,0x4C, +0x84,0x40,0xA6,0x70,0xF0,0x81,0x49,0xFF,0xFD,0x47,0xF0,0x01,0xA6,0x70,0x84,0x41, +0x49,0xFF,0xFD,0x42,0xFC,0x81,0xFC,0x00,0xB4,0x40,0x80,0xA2,0x4E,0x24,0x00,0x03, +0xFF,0x52,0x84,0xC0,0x50,0x43,0x00,0x0F,0x40,0x12,0x90,0x0E,0xC1,0x03,0x8C,0xC1, +0xD5,0xFA,0xA0,0x41,0x80,0x61,0x4E,0x14,0x00,0x03,0xFE,0xCA,0x40,0x31,0x90,0x0E, +0xCB,0xF7,0x40,0x21,0x18,0x0E,0x40,0x10,0x98,0x0E,0xB6,0x40,0xA8,0x41,0x42,0x00, +0x84,0x24,0x42,0x01,0x08,0x73,0x49,0xFF,0xF8,0x97,0x40,0x00,0x18,0x0C,0xFC,0x80, +0xFC,0x41,0x80,0xC0,0x81,0x23,0x22,0x00,0x80,0x08,0x22,0x31,0x00,0x08,0x8A,0x03, +0xB6,0x1F,0x22,0x00,0x80,0x09,0x22,0x11,0x00,0x09,0x8A,0x01,0xF0,0x81,0x80,0x1F, +0x49,0xFF,0xFF,0xCB,0x80,0xE0,0x80,0x06,0x49,0xFF,0xFF,0xC7,0x94,0x79,0xE0,0x20, +0xE8,0x3C,0x84,0xA0,0x80,0x25,0x80,0x45,0xFA,0x71,0x4C,0x54,0x80,0x09,0x40,0x13, +0x94,0x1A,0xFE,0x5C,0x90,0x25,0x88,0x41,0xE0,0x02,0xE8,0x04,0xFA,0x30,0x84,0x40, +0xD5,0x04,0x8C,0xA1,0x97,0x68,0xD5,0xF2,0x50,0x30,0xFF,0xE0,0x96,0xD8,0xE2,0x69, +0xE8,0x04,0x88,0x41,0x8C,0x21,0xD5,0xF9,0xE2,0xA9,0xE9,0x0C,0xB4,0x26,0xA0,0x31, +0x94,0x4D,0x94,0x05,0x40,0x10,0x88,0x36,0x40,0x00,0x08,0x16,0xB6,0x26,0xA8,0x31, +0xD5,0x12,0x5A,0x50,0x01,0x13,0xB4,0x26,0xFA,0x51,0xFE,0x7C,0x40,0x10,0x80,0x36, +0xFE,0x54,0x90,0x25,0xB6,0x26,0xA0,0x71,0xFF,0xCC,0x40,0x03,0x80,0x16,0xFE,0x84, +0x90,0x45,0xA8,0xB1,0x84,0x01,0xFC,0xC1,0x84,0x00,0xFC,0xC1,0xFC,0x22,0x80,0xC0, +0x50,0x70,0x0C,0x8C,0x00,0x03,0x01,0x05,0xC0,0x42,0xB0,0x41,0x84,0x40,0x80,0x06, +0x49,0xFF,0xE7,0x98,0xF0,0x01,0x22,0x20,0x00,0x04,0x22,0x10,0x00,0x05,0xAC,0x86, +0xAC,0x47,0x12,0x20,0x00,0x08,0x12,0x10,0x00,0x09,0x02,0x03,0x00,0x80,0x5A,0x08, +0x01,0x07,0x12,0x23,0x00,0x8A,0x12,0x13,0x00,0x8B,0xD5,0x1E,0x02,0x33,0x00,0x81, +0x5A,0x38,0x01,0x26,0xE6,0x04,0xE8,0x23,0x22,0x03,0x00,0x8A,0x9A,0x82,0x22,0x03, +0x00,0x8B,0xF2,0x82,0x9A,0x41,0xB0,0x02,0xF1,0x83,0x49,0xFF,0xFF,0x56,0x5E,0xF0, +0x00,0x64,0xE8,0x15,0xF0,0x01,0x22,0x10,0x00,0x04,0x12,0x13,0x00,0x8A,0x22,0x00, +0x00,0x05,0x12,0x03,0x00,0x8B,0x04,0x03,0x00,0x47,0x40,0x10,0x58,0x08,0x96,0x03, +0x90,0x3A,0x90,0x0A,0x10,0x13,0x01,0x18,0x10,0x03,0x01,0x19,0x50,0x63,0x01,0x24, +0x4C,0x63,0xFF,0xBA,0xFC,0xA2,0xFC,0x46,0xFA,0x44,0x80,0xC0,0x00,0xA0,0x80,0x0C, +0x00,0x80,0x80,0x0D,0xB0,0x02,0x84,0x20,0xB1,0xC7,0x49,0x00,0x41,0xBD,0x80,0x07, +0x84,0x20,0xFA,0x44,0x49,0x00,0x41,0xB8,0x51,0xC3,0x0C,0x8C,0x00,0x03,0x01,0x05, +0x5A,0x08,0x02,0x69,0x85,0x24,0x80,0x06,0xB0,0x41,0x80,0x49,0x49,0xFF,0xE7,0x3A, +0x4E,0xA2,0x00,0x0D,0x5A,0xA8,0x01,0x15,0xF0,0x01,0xB0,0x82,0x22,0x10,0x00,0x06, +0x38,0x11,0x26,0x0A,0x22,0x00,0x00,0x07,0xD5,0x09,0xF0,0x01,0xB0,0x82,0x22,0x10, +0x00,0x04,0x38,0x11,0x26,0x0A,0x22,0x00,0x00,0x05,0x38,0x03,0xA6,0x0A,0x4E,0x92, +0x00,0x07,0x50,0x04,0xFF,0xFF,0x54,0x90,0x00,0xFF,0xD5,0xDE,0xF1,0x01,0x5A,0x80, +0x01,0x05,0x5A,0x80,0x02,0x08,0xD5,0x38,0x02,0x03,0x00,0x81,0xE6,0x02,0xE8,0x12, +0xD5,0x33,0x02,0x03,0x00,0x81,0x5A,0x08,0x02,0x18,0x02,0x03,0x00,0x80,0xE6,0x02, +0xE9,0x2B,0x04,0x03,0x00,0x48,0x96,0x0E,0xC0,0x05,0xF0,0x03,0xAC,0x0E,0xA0,0x39, +0xD5,0x22,0xF2,0x02,0xF0,0x03,0x88,0x02,0x90,0x01,0xAC,0x0E,0xB4,0x47,0xA0,0x39, +0x88,0x02,0x90,0x01,0xD5,0x18,0xE6,0x03,0xE9,0x17,0x02,0x03,0x00,0x80,0xE6,0x03, +0xE9,0x13,0xF2,0x02,0xF0,0x04,0x88,0x02,0x40,0x20,0x08,0x0A,0xF0,0x03,0x90,0x01, +0x88,0x02,0xAC,0x0E,0xB4,0x47,0xA0,0x3A,0x88,0x02,0x40,0x20,0x08,0x0A,0xA0,0x39, +0x90,0x01,0x88,0x02,0xAC,0x0F,0xA4,0x0E,0x12,0x00,0x80,0x08,0xA4,0x0F,0x12,0x00, +0x80,0x09,0x50,0x63,0x01,0x24,0x4C,0x6E,0x7F,0x93,0xFC,0xC6,0xFC,0x40,0xB4,0xE0, +0xA1,0x42,0xA1,0x09,0xB4,0xC1,0x04,0x90,0x00,0x01,0xA0,0x0A,0x42,0x33,0x90,0x24, +0x42,0x12,0x90,0x24,0x42,0x10,0x24,0x75,0x42,0x33,0x24,0x75,0xFE,0x3C,0x42,0x03, +0x14,0x75,0xCB,0x05,0xC9,0x0C,0x5C,0x00,0x00,0x01,0xFC,0xC0,0x40,0x00,0x0C,0x16, +0x40,0x10,0x8C,0x36,0xA8,0x11,0xB6,0x22,0x84,0x02,0xFC,0xC0,0x80,0x03,0xFC,0xC0, +0xFC,0x49,0x81,0x40,0x00,0x0F,0x80,0x68,0x81,0x21,0xF0,0x83,0x84,0x00,0xF0,0x87, +0xF0,0x88,0xF0,0x89,0xF0,0x8A,0xF0,0x8B,0xF0,0x8C,0x02,0x05,0x00,0x80,0x80,0xC2, +0xE6,0x06,0xF3,0x85,0x83,0x84,0xF5,0x82,0x80,0xE0,0xE9,0x02,0x84,0xE5,0x84,0x03, +0xFE,0x34,0x97,0xF9,0xF0,0x84,0x85,0x00,0x40,0x14,0x08,0x08,0xB0,0x8D,0x88,0x22, +0x80,0x0A,0x54,0x24,0x00,0xFF,0x8D,0x01,0x49,0xFF,0xE6,0x8C,0x5A,0x88,0x05,0xF6, +0xF2,0x0D,0xF0,0x0E,0xF4,0x09,0x22,0x31,0x00,0x06,0x22,0x10,0x00,0x08,0x85,0x00, +0x9A,0x59,0x22,0x31,0x00,0x07,0x22,0x20,0x00,0x09,0xF1,0x81,0x41,0xE1,0x88,0x01, +0xF1,0x87,0x15,0xEF,0x80,0x08,0xF3,0x0A,0xB1,0x4D,0x50,0x24,0x00,0x01,0x96,0x90, +0xE2,0x47,0xE8,0x17,0x50,0x81,0x7F,0xFF,0x38,0xF2,0xA2,0x02,0x38,0x82,0x8A,0x02, +0x22,0x17,0x80,0x06,0x22,0x84,0x00,0x08,0x8A,0x28,0x22,0x87,0x80,0x07,0x38,0xF2, +0x8A,0x02,0x88,0x81,0x22,0xF7,0x80,0x09,0x8B,0x0F,0x88,0x68,0x81,0x02,0xD5,0xE6, +0xE6,0xE3,0xF4,0x89,0xF3,0x8A,0xE9,0x11,0xF3,0x0F,0x22,0x40,0x00,0x06,0xF1,0x01, +0x22,0x21,0x80,0x08,0x22,0x00,0x00,0x07,0x8A,0x44,0x88,0x22,0xF1,0x8B,0x22,0x11, +0x80,0x09,0x9A,0x08,0x88,0x1E,0xF0,0x8C,0xF1,0x09,0x4E,0x14,0x00,0x03,0xFE,0x4A, +0x44,0x00,0x7F,0xFF,0xE0,0x01,0x80,0x20,0xE9,0x07,0xF0,0x0A,0x4E,0x04,0x00,0x03, +0xFE,0x02,0xE0,0x20,0xE8,0x04,0x84,0x00,0xF0,0x89,0xF0,0x8A,0xF1,0x0B,0x4E,0x14, +0x00,0x03,0xFE,0x4A,0x44,0x00,0x7F,0xFF,0xE0,0x01,0x80,0x20,0xE9,0x07,0xF0,0x0C, +0x4E,0x04,0x00,0x03,0xFE,0x02,0xE0,0x20,0xE8,0x04,0x84,0x00,0xF0,0x8B,0xF0,0x8C, +0xB0,0x07,0x49,0xFF,0xFE,0x02,0x4E,0x07,0x00,0x06,0xB0,0x07,0x49,0xFF,0xFD,0xFD, +0xD5,0x02,0x84,0x01,0xF1,0x04,0xE0,0x20,0xE9,0x1F,0xE0,0xC0,0xE8,0x1A,0xF2,0x07, +0xF4,0x08,0x50,0x13,0x7F,0xF6,0x96,0x49,0x42,0x31,0x04,0x24,0xFE,0x64,0x40,0x31, +0x80,0x76,0x40,0x00,0x80,0x16,0x8A,0x43,0x9A,0x20,0x84,0x63,0xFE,0x9C,0x84,0xA2, +0xFE,0xC4,0x40,0x21,0x14,0x56,0x40,0x31,0x94,0x76,0xF2,0x87,0xF3,0x88,0xD5,0x04, +0x84,0x00,0xF0,0x87,0xF0,0x88,0xB0,0x0B,0x49,0xFF,0xFD,0xD7,0x4E,0x07,0x00,0x06, +0xB0,0x0B,0x49,0xFF,0xFD,0xD2,0xD5,0x02,0x84,0x01,0x04,0x25,0x00,0x47,0x46,0x11, +0x00,0x00,0xFE,0x56,0xC1,0x04,0x84,0x00,0xF0,0x8B,0xD5,0x16,0x84,0x23,0x95,0xB2, +0x40,0x63,0x04,0xD6,0x96,0x71,0xE0,0x20,0xE8,0xF7,0xF2,0x0B,0x8E,0xCA,0x97,0xB1, +0xF1,0x0C,0x42,0x31,0x18,0x24,0x40,0x31,0x80,0x76,0xFF,0x8C,0x8A,0x43,0x40,0x03, +0x00,0x16,0xF2,0x8B,0x9A,0x08,0xF0,0x8C,0xB0,0x09,0x49,0xFF,0xFD,0xAE,0x4E,0x07, +0x00,0x06,0xB0,0x09,0x49,0xFF,0xFD,0xA9,0xD5,0x02,0x84,0x01,0x04,0x35,0x00,0x47, +0x46,0x11,0x00,0x00,0xFE,0xCE,0xC3,0x05,0x84,0x00,0xF0,0x89,0xF0,0x8A,0xD5,0x15, +0xF1,0x05,0x94,0x8A,0x96,0x51,0xE0,0x20,0xE8,0x12,0xF4,0x09,0xF2,0x0A,0x92,0x21, +0x42,0x52,0x04,0x24,0xFE,0x54,0x40,0x52,0x80,0xB6,0x40,0x10,0x80,0x36,0x8A,0x85, +0x9A,0x51,0xF4,0x89,0xF1,0x8A,0x80,0x03,0x80,0x60,0xD5,0x31,0x5A,0x88,0x04,0x27, +0xF0,0x07,0xC8,0x24,0xF1,0x08,0xC9,0x25,0xF0,0x0B,0xC8,0x22,0xF1,0x0C,0xC9,0x21, +0x84,0x21,0x80,0x01,0x80,0x61,0xB0,0x8D,0xE2,0x27,0xE8,0x16,0x9F,0x09,0x38,0x51, +0x12,0x02,0x38,0x41,0x06,0x02,0x22,0xA2,0x80,0x06,0x22,0x62,0x00,0x06,0x4C,0xA3, +0x00,0x03,0x84,0x60,0x22,0x52,0x80,0x07,0x22,0x42,0x00,0x07,0xD4,0x02,0x84,0x00, +0x8C,0x21,0x96,0x48,0xD5,0xEA,0xCB,0x07,0xD5,0x04,0x80,0x03,0xD5,0x02,0x80,0x01, +0x84,0x60,0xF3,0x89,0xC8,0x03,0xF0,0x8A,0xD5,0x02,0x84,0x01,0xF1,0x09,0xF2,0x02, +0xF5,0x03,0x42,0x41,0x04,0x24,0x84,0x24,0xF2,0x07,0x40,0x42,0x04,0x96,0x42,0x4E, +0x08,0x73,0xF2,0x0B,0xF7,0x02,0x42,0x42,0x88,0x73,0xF2,0x0A,0xF6,0x08,0xFE,0xBC, +0x40,0x11,0x04,0x36,0x42,0x1E,0x18,0x73,0xF2,0x0C,0xF6,0x03,0x44,0x50,0x00,0x64, +0x42,0x13,0x08,0x73,0x40,0x42,0x14,0x96,0x40,0x10,0x94,0x36,0x5A,0x38,0x01,0x15, +0xF2,0x0D,0x22,0x51,0x00,0x06,0x3C,0x27,0xF7,0x3C,0x4C,0x22,0x80,0x08,0x3C,0x37, +0xF7,0x3D,0x3C,0x23,0xEF,0x08,0x8A,0x43,0xDA,0x07,0xF2,0x0E,0x22,0x21,0x00,0x08, +0x8A,0xA2,0xB6,0xA9,0xD5,0x02,0xB6,0x89,0x5A,0x08,0x01,0x16,0xF0,0x0D,0x22,0x50, +0x00,0x07,0x3C,0x07,0xF7,0x42,0x4C,0x02,0x80,0x08,0x3C,0x27,0xF7,0x43,0x3C,0x03, +0xEF,0x09,0x8A,0x02,0xD8,0x08,0xF0,0x0E,0x22,0x00,0x00,0x09,0x8A,0xA0,0x14,0x54, +0x80,0x01,0xFC,0xC9,0x14,0x14,0x80,0x01,0xFC,0xC9,0xFC,0x43,0xB1,0xC2,0xB5,0x00, +0x3A,0x23,0x94,0x20,0x00,0x4F,0x80,0x38,0x04,0x90,0x00,0x01,0x4E,0x42,0x00,0x8E, +0x4E,0x85,0x00,0x03,0x80,0x43,0x4E,0x95,0x00,0x04,0xA1,0xFB,0xD5,0x02,0xA1,0xFA, +0x5A,0x48,0x03,0x26,0x80,0x28,0x4E,0x84,0x00,0x04,0x52,0x14,0x00,0x00,0xE0,0x41, +0xE9,0x04,0x84,0x20,0xB6,0x20,0xD5,0x08,0x84,0x21,0x4E,0x84,0x00,0x03,0x84,0x3F, +0x42,0x81,0x04,0x75,0xB7,0x00,0x80,0x29,0x4E,0x94,0x00,0x04,0x52,0x14,0x80,0x00, +0xE0,0xE1,0xE9,0x04,0x84,0x20,0xA8,0x41,0xFC,0xC3,0x84,0x21,0x4E,0x94,0x00,0x03, +0x84,0x3F,0x42,0x93,0x84,0x75,0x14,0x90,0x00,0x01,0xFC,0xC3,0x81,0x40,0x5A,0x40, +0x02,0x04,0x80,0xC1,0xD5,0x38,0x42,0x53,0xA0,0x24,0x42,0x41,0x24,0x24,0x84,0xC0, +0xFE,0xEA,0x52,0xF2,0x00,0x00,0x51,0xC3,0x00,0x0F,0x80,0x25,0x4E,0x54,0x00,0x03, +0x80,0x23,0x40,0x10,0xF0,0x0E,0xC1,0x04,0x8C,0xC1,0x97,0xB0,0xD5,0xF5,0x80,0x04, +0x4E,0x44,0x00,0x03,0x80,0x0F,0x40,0x00,0x70,0x0E,0xC8,0xF7,0x40,0x42,0x18,0x0E, +0x40,0x52,0x98,0x0E,0x42,0x02,0x10,0x24,0x42,0x02,0x94,0x73,0xF2,0x81,0x49,0xFF, +0xF5,0x5B,0x40,0x60,0x18,0x0C,0xF2,0x01,0xC6,0x30,0x42,0x04,0xA4,0x24,0x42,0x04, +0x20,0x73,0xFF,0xD4,0x49,0xFF,0xF5,0x50,0xFE,0x3C,0x40,0x60,0x18,0xD6,0x4E,0x64, +0x00,0x03,0xFF,0xB2,0x80,0x0A,0x49,0xFF,0xFC,0x90,0x84,0x65,0x42,0x13,0x0C,0x24, +0xE0,0x20,0xE9,0x1B,0xE0,0xC0,0xE9,0x06,0x84,0x00,0xB6,0x0A,0x14,0x05,0x00,0x01, +0xFC,0xC3,0x42,0x24,0x18,0x24,0x42,0x64,0x98,0x24,0x40,0x21,0x00,0x56,0xB4,0x8A, +0x40,0x63,0x00,0xD6,0x80,0x2A,0xA0,0x09,0x9A,0xA2,0x9B,0x86,0xFE,0x9C,0xFE,0xF4, +0x90,0x42,0x90,0x62,0xB6,0x4A,0xA8,0xC9,0xFC,0xC3,0x84,0x4A,0xFE,0x54,0xE0,0x20, +0xE8,0x04,0x8E,0x0A,0x96,0x01,0xDD,0x9E,0x96,0x09,0xDD,0x9E,0xB4,0x60,0x4E,0x35, +0x00,0x0B,0xE0,0x23,0xE9,0x08,0xA0,0x01,0x4E,0x05,0x00,0x06,0xE0,0x40,0x56,0x07, +0x80,0x01,0xDD,0x9E,0x84,0x00,0xDD,0x9E,0xA7,0x60,0x5C,0xF2,0x80,0x3C,0xE8,0x0F, +0x95,0x6A,0x88,0xA3,0xAE,0x2B,0xA6,0x20,0x94,0x02,0x88,0x03,0xAE,0x42,0xA6,0x20, +0x38,0x21,0x82,0x09,0xA6,0x20,0x8C,0x01,0xAE,0x20,0xDD,0x9E,0xFC,0x40,0x84,0xC0, +0x44,0x70,0x7F,0xFF,0x80,0x86,0x38,0x91,0x9A,0x11,0x54,0xA3,0x00,0xFF,0xE0,0xE9, +0x8C,0xC1,0x40,0x74,0xBC,0x1A,0x54,0x93,0x00,0xFF,0x40,0x45,0x3C,0x1A,0xE3,0x25, +0xE9,0xF3,0xE0,0xE2,0xE8,0x06,0x95,0x22,0x88,0x64,0xAE,0x1B,0xAE,0x5A,0xAC,0x98, +0xFC,0xC0,0xFC,0x5A,0x81,0x22,0x00,0x2F,0x80,0xF8,0x12,0x1F,0x80,0x19,0xF2,0x89, +0x00,0x2F,0x80,0xFC,0xF1,0x40,0xF2,0x85,0x00,0x2F,0x81,0x04,0x12,0x0F,0x80,0x18, +0xF2,0x87,0x84,0x00,0x2E,0x27,0xDE,0x16,0xAC,0x08,0xF2,0x81,0xF1,0x05,0x2E,0x27, +0xDE,0x17,0xF3,0x86,0xB6,0x9F,0xF5,0x83,0xF2,0x88,0x5A,0x18,0x01,0x04,0xF1,0x3D, +0xAE,0x08,0x85,0x01,0x87,0x80,0x4E,0x82,0x01,0x42,0x50,0x04,0x7F,0xFF,0xB0,0x4C, +0xB0,0x8C,0x38,0x60,0x82,0x11,0x94,0x42,0x88,0x22,0x54,0x80,0x00,0xFF,0x22,0x70, +0x80,0x01,0xF0,0x01,0xFE,0x3C,0xF0,0x82,0xF1,0x02,0xB4,0x1F,0x88,0x01,0x38,0x00, +0x18,0x00,0x40,0x50,0x24,0x02,0x4C,0x54,0xFF,0xE8,0x40,0x14,0xA4,0x05,0x81,0x46, +0xF1,0x8A,0x40,0x50,0x24,0x02,0x4C,0x54,0x80,0x11,0x50,0x25,0x7F,0xFF,0x96,0x10, +0xF0,0x84,0x8E,0xC1,0xB4,0x1F,0xF1,0x02,0x97,0xB3,0x88,0x06,0x38,0x00,0x04,0x00, +0x40,0x14,0xA4,0x05,0xF1,0x8A,0xD5,0x73,0xF1,0x01,0xE1,0x41,0xE8,0xEF,0xF1,0x0A, +0xFE,0x0E,0xF1,0x02,0x54,0x00,0x00,0xE0,0x40,0x55,0x04,0x00,0xF1,0x06,0xFE,0x0F, +0xB4,0x3F,0x38,0x00,0x94,0x08,0xF0,0x40,0xF1,0x40,0xA4,0x00,0x8C,0x01,0xAC,0x08, +0xF0,0x05,0x5A,0x08,0x01,0x14,0xF0,0x03,0x80,0x27,0xF3,0x3C,0x38,0x00,0x15,0x11, +0xF4,0x3D,0xF0,0x84,0xF2,0x04,0x80,0x0A,0xF5,0x8B,0x49,0xFF,0xFF,0x5F,0xF0,0x04, +0xF5,0x0B,0xE0,0x1C,0x40,0x0E,0x3C,0x1B,0x83,0x80,0xF0,0x07,0x5A,0x08,0x01,0x0E, +0xF0,0x03,0x38,0x00,0x15,0x11,0x40,0xFE,0x00,0x07,0xE8,0x07,0xF1,0x42,0x83,0x80, +0x10,0xA0,0x80,0x00,0xF1,0x43,0xAF,0xC8,0x50,0x05,0x00,0x01,0x40,0xA0,0x00,0x11, +0xB4,0x1F,0xF1,0x02,0x88,0x0A,0x38,0x00,0x04,0x00,0xD5,0xAC,0x4E,0x65,0x00,0x34, +0xF1,0x0A,0xFE,0x0E,0xF1,0x02,0x54,0x00,0x00,0xE0,0x40,0xA3,0x04,0x00,0xF1,0x06, +0xFE,0x0F,0xB4,0x3F,0x38,0x00,0xA8,0x08,0xF0,0x40,0xF1,0x40,0xA4,0x00,0x8C,0x01, +0xAC,0x08,0xF0,0x05,0x5A,0x08,0x01,0x12,0xF0,0x03,0x80,0x27,0xF3,0x3C,0x38,0x50, +0x29,0x11,0xF4,0x3D,0x80,0x45,0x80,0x06,0xF5,0x8B,0x49,0xFF,0xFF,0x1F,0xF5,0x0B, +0xE0,0xBC,0x40,0x5E,0x3C,0x1B,0x83,0x85,0xF0,0x07,0x5A,0x00,0x01,0x15,0x8E,0xC1, +0xB4,0x1F,0x97,0xB3,0xF1,0x02,0x88,0x06,0x38,0x00,0x04,0x00,0x40,0x50,0x24,0x02, +0x4C,0x54,0xBF,0xCE,0xF0,0x09,0x8C,0xC1,0x97,0xB0,0x5A,0x00,0x08,0x11,0x84,0x40, +0x80,0x02,0xD5,0x15,0xF0,0x03,0x38,0x00,0x29,0x11,0x40,0xFE,0x00,0x07,0xE8,0xE8, +0xF1,0x42,0x83,0x80,0xAF,0x88,0xF1,0x43,0xAF,0xC8,0xD5,0xE2,0xF0,0x01,0x9E,0x81, +0xF0,0x04,0x40,0x20,0x08,0x07,0x84,0x00,0x40,0x00,0x18,0x06,0xF1,0x08,0x8E,0x21, +0xE0,0xE1,0xE8,0x40,0x97,0xF9,0x8A,0xC0,0x9C,0xF9,0xF0,0x01,0x96,0xDB,0x42,0x51, +0x80,0x24,0xF0,0x04,0x80,0x26,0x40,0xA0,0x08,0x00,0xB4,0x1F,0x41,0xE0,0x14,0x00, +0xE1,0x41,0xE9,0x2C,0x80,0x01,0x84,0x80,0xB4,0x3F,0x88,0x20,0x38,0x10,0x94,0x00, +0x40,0x14,0x84,0x02,0x4C,0x14,0x80,0x11,0x80,0x20,0xC4,0x19,0xB1,0x0C,0x8E,0x01, +0x38,0x02,0x22,0x09,0x40,0x04,0x08,0x08,0x88,0x04,0xAC,0xC1,0x50,0x04,0x00,0x01, +0x54,0x80,0x00,0xFF,0xD5,0x0C,0xF1,0x01,0xE0,0x01,0xE8,0xEF,0x8C,0x01,0x96,0x03, +0x84,0x81,0xD5,0xE3,0xE1,0x41,0xE9,0xDD,0x8C,0x21,0x96,0x4B,0x38,0x0F,0x04,0x00, +0x40,0x04,0x80,0x02,0x4C,0x04,0xFF,0xF8,0xD5,0xD4,0xE4,0x62,0xE8,0x07,0x48,0xFF, +0xFE,0xFC,0xE4,0xE2,0x4E,0xF3,0xFE,0xF9,0x8A,0xC0,0xF0,0x01,0x8E,0xE1,0x97,0xFB, +0x42,0x33,0x80,0x24,0xF0,0x04,0x88,0x02,0x80,0x40,0xB4,0x1F,0x99,0x03,0xE0,0x46, +0x4E,0xF3,0xFE,0xEB,0x80,0x06,0x84,0x20,0xB4,0xBF,0x88,0xA0,0x38,0x52,0x8C,0x00, +0x40,0x54,0x94,0x02,0x4C,0x54,0x80,0x11,0x80,0xC0,0xC1,0x19,0xB0,0x4C,0x8E,0x01, +0x38,0x00,0xA2,0x09,0x40,0x04,0x08,0x08,0x88,0x01,0xAD,0xC1,0x50,0x04,0x00,0x01, +0x54,0x80,0x00,0xFF,0xD5,0x0C,0xF5,0x01,0xE0,0x05,0xE8,0xEF,0x8C,0x01,0x96,0x03, +0x84,0x21,0xD5,0xE3,0xE0,0x46,0xE9,0xDC,0x8C,0xC1,0x97,0xB3,0x38,0x52,0x18,0x00, +0x40,0x54,0x94,0x02,0x4C,0x54,0xFF,0xF8,0xD5,0xD3,0x80,0x1C,0xFC,0xDA,0x84,0x20, +0x44,0x22,0x15,0xCC,0x9D,0x02,0xE6,0x24,0x80,0x60,0x40,0x32,0x3C,0x1A,0x38,0x31, +0x04,0x08,0x8C,0x21,0x5A,0x18,0x0B,0xF9,0xDD,0x9E,0x44,0x12,0x15,0xCC,0x38,0x00, +0x80,0x00,0xDD,0x9E,0x84,0x20,0x44,0x22,0x15,0xC0,0x38,0x01,0x04,0x08,0x8C,0x21, +0x5A,0x18,0x0B,0xFD,0xDD,0x9E,0x44,0x12,0x15,0xC0,0x38,0x00,0x80,0x00,0xDD,0x9E, +0x44,0x30,0x01,0x24,0x44,0x22,0x33,0x88,0x42,0x20,0x0C,0x73,0x10,0x11,0x01,0x0D, +0xDD,0x9E,0x44,0x22,0x34,0xAB,0x44,0x30,0x01,0x24,0xC1,0x17,0xFE,0xC4,0x99,0x13, +0x8C,0x45,0x38,0x01,0x0C,0x02,0x92,0x05,0x8C,0x01,0x96,0x1F,0x54,0x10,0x00,0x07, +0x94,0x8D,0xA6,0x65,0x92,0x03,0x96,0x67,0xFE,0x57,0xAE,0x65,0xA6,0x66,0x54,0x10, +0x80,0xFE,0xFE,0x0F,0xAE,0x26,0xDD,0x9E,0x42,0x20,0x0C,0x73,0xA6,0x55,0x96,0x67, +0xAE,0x55,0xA6,0x56,0x54,0x10,0x80,0xFE,0xAE,0x56,0xDD,0x9E,0x44,0x20,0x01,0x24, +0x44,0x12,0x34,0xB0,0x42,0x10,0x08,0x73,0xB4,0x01,0x92,0x05,0x96,0x1F,0xDD,0x9E, +0x84,0x00,0x3C,0x0B,0xFA,0x0C,0xDD,0x9E,0x3C,0x23,0xFA,0x0C,0x84,0x20,0x40,0x31, +0x04,0x0E,0x96,0xC6,0x96,0x08,0xC3,0x07,0x8C,0x21,0x5A,0x18,0x0B,0xFA,0x44,0x00, +0x00,0xFF,0xDD,0x9E,0x84,0x61,0x40,0x11,0x84,0x0C,0xFE,0x8F,0x3C,0x2B,0xFA,0x0C, +0xDD,0x9E,0x84,0x21,0x40,0x00,0x80,0x0C,0x3C,0x13,0xFA,0x0C,0xFE,0x03,0xFE,0x0E, +0x3C,0x0B,0xFA,0x0C,0xDD,0x9E,0xFC,0x00,0x49,0x00,0x2F,0xE4,0xC8,0x05,0x84,0x01, +0x3E,0x07,0xE2,0xCC,0xFC,0x80,0x84,0x02,0x3E,0x07,0xE2,0xCC,0x49,0x00,0x18,0x82, +0xFC,0x80,0xFC,0x00,0x49,0x00,0x17,0xEA,0x84,0x01,0x49,0x00,0x0F,0x33,0x49,0x00, +0x0F,0x20,0xFC,0x80,0xFC,0x06,0x84,0x00,0x3E,0x07,0xF4,0x20,0x3C,0x03,0xF7,0xC7, +0x96,0x0E,0x96,0x01,0xC0,0x02,0x84,0x01,0x3E,0x07,0xF4,0x1A,0x84,0x07,0x49,0x00, +0x37,0x12,0x5A,0x08,0x01,0x08,0x84,0x07,0x84,0x20,0x49,0x00,0x36,0xF1,0x49,0x00, +0x1B,0xA9,0x2E,0x07,0xE2,0xCC,0x5A,0x00,0x01,0x05,0x5A,0x00,0x03,0x32,0xD5,0x50, +0x49,0x00,0x1B,0x2B,0x5A,0x08,0x01,0x0F,0x84,0x00,0x49,0x00,0x18,0xB6,0x84,0x01, +0x49,0x00,0x2F,0xB4,0x84,0x03,0x3E,0x07,0xE2,0xCC,0x84,0x00,0x3C,0x0B,0xFA,0x0E, +0xD5,0x3C,0x49,0x00,0x18,0x40,0x5A,0x00,0x01,0xF1,0x49,0x00,0x2F,0xA4,0x5A,0x08, +0x01,0x38,0x2E,0x07,0xF4,0x1A,0x5A,0x08,0x01,0x06,0x3C,0x03,0xFA,0x0E,0x8C,0x01, +0xD5,0x02,0x84,0x00,0x3C,0x0B,0xFA,0x0E,0x3C,0x03,0xFA,0x0E,0xE6,0x0A,0xE9,0x28, +0x84,0x00,0x49,0x00,0x2F,0x93,0x84,0x00,0x3C,0x0B,0xFA,0x0E,0xD5,0x21,0x84,0x00, +0x49,0x00,0x4E,0xA7,0x80,0xC0,0x5A,0x08,0x01,0x19,0x49,0x00,0x1B,0x6F,0x49,0x00, +0x1B,0x5B,0x84,0x00,0x49,0x00,0x2D,0x9F,0x84,0x00,0x49,0x00,0x18,0x91,0x49,0x00, +0x17,0x85,0x84,0x00,0x3C,0x0B,0xFA,0x0F,0x3C,0x0B,0xFA,0x0E,0x3E,0x67,0xE2,0xCC, +0x49,0x00,0x0C,0xA7,0x84,0x02,0xD5,0x02,0x84,0x01,0x3E,0x07,0xF4,0x20,0x2E,0x07, +0xE2,0xCC,0x8E,0x03,0xE6,0x02,0x3C,0x0D,0xF8,0xEA,0xE8,0x0B,0xB6,0x1F,0xF0,0x81, +0xF0,0x82,0xF0,0x83,0xF0,0x84,0xF0,0x85,0xF0,0x86,0xF0,0x87,0xF0,0x88,0xD5,0x1C, +0x44,0x12,0x00,0x01,0xB6,0x3F,0x44,0x11,0x00,0x02,0xF1,0x81,0x44,0x10,0x80,0x04, +0xF1,0x82,0x44,0x10,0x40,0x08,0xF1,0x83,0x44,0x10,0x20,0x10,0xF1,0x84,0x44,0x10, +0x10,0x20,0xF1,0x85,0x44,0x10,0x08,0x40,0xF1,0x86,0x44,0x10,0x04,0x80,0xF1,0x87, +0x44,0x10,0x03,0x00,0xF1,0x88,0xF0,0x89,0xF0,0x8A,0xF0,0x8B,0x80,0x1F,0x49,0xFF, +0xD8,0xEB,0x2E,0x07,0xF4,0x20,0xFC,0x86,0xDD,0x9E,0x3C,0xF7,0xF7,0x92,0x5E,0xF7, +0x80,0xB4,0xE8,0x0C,0xFC,0x00,0x49,0x00,0x1B,0x7A,0x80,0x20,0x84,0x00,0x5A,0x10, +0x01,0x03,0x80,0x20,0x49,0x00,0x12,0xA1,0xFC,0x80,0xDD,0x9E,0x44,0x24,0x10,0x14, +0xA6,0x10,0x44,0x14,0x10,0x14,0x96,0x06,0xC0,0xFC,0xA6,0x08,0x54,0x00,0x00,0xFE, +0xAE,0x08,0xDD,0x9E,0xFC,0x20,0x80,0xC1,0x44,0x14,0x10,0x14,0x80,0xE0,0xA6,0x08, +0x54,0x00,0x00,0xFE,0xAE,0x08,0x84,0x00,0x49,0x00,0x0C,0x03,0x49,0x00,0x0B,0xCD, +0x40,0x00,0x00,0x09,0x88,0xE6,0x4C,0x63,0x80,0x07,0x08,0x03,0x00,0x01,0x49,0x00, +0x0B,0xD2,0xD5,0xFA,0x84,0x01,0x49,0x00,0x0B,0xF4,0xFC,0xA0,0xFC,0x01,0x84,0x06, +0x10,0x0F,0x80,0x04,0xB0,0x41,0x84,0x01,0x49,0xFF,0xFF,0xDE,0xFC,0x81,0xFC,0x00, +0x44,0x14,0x10,0x14,0xA6,0x08,0x54,0x00,0x00,0xFE,0xAE,0x08,0x84,0x00,0x49,0x00, +0x0B,0xE0,0x49,0x00,0x0B,0xAA,0x40,0x00,0x00,0x09,0x84,0x05,0x49,0x00,0x0B,0xB3, +0x44,0x00,0x00,0xFF,0x49,0x00,0x0B,0xAF,0x44,0x04,0x10,0x10,0xA7,0x80,0x84,0x01, +0x97,0xB0,0x49,0x00,0x0B,0xCE,0x80,0x06,0xFC,0x80,0xFC,0x40,0x44,0x14,0x10,0x14, +0x80,0xC0,0xA6,0x08,0x54,0x00,0x00,0xFE,0xAE,0x08,0x44,0x04,0x10,0x00,0x84,0x20, +0xAE,0x40,0x44,0x04,0x10,0x04,0x44,0x10,0x00,0x55,0xAE,0x40,0x44,0x1F,0xFF,0xAA, +0xAE,0x41,0x44,0x10,0x00,0x66,0xAE,0x42,0x40,0x00,0x00,0x09,0x44,0x74,0x10,0x08, +0x44,0x00,0x00,0x9F,0xB6,0x07,0x49,0xFF,0xFF,0x93,0x50,0x93,0x00,0x03,0x44,0x80, +0x00,0xFF,0x44,0xA4,0x10,0x10,0xB7,0x07,0x49,0xFF,0xFF,0x8A,0x00,0x05,0x00,0x00, +0x18,0x03,0x00,0x01,0x4C,0x64,0xFF,0xF9,0x44,0x04,0x10,0x00,0x84,0x21,0xAE,0x40, +0xFC,0xC0,0xFC,0x00,0x80,0xC0,0x49,0xFF,0xFF,0xA3,0x84,0x00,0x49,0x00,0x0B,0x91, +0x49,0x00,0x0B,0x5B,0xFA,0x10,0x49,0x00,0x0B,0x66,0x5C,0xF3,0x00,0x40,0x80,0x26, +0xE9,0x03,0x44,0x10,0x00,0x3F,0x96,0x08,0x40,0x00,0x30,0x08,0x49,0x00,0x0B,0x69, +0x84,0x01,0x49,0x00,0x0B,0x7E,0x40,0x00,0x00,0x09,0x40,0x00,0x00,0x09,0x40,0x00, +0x00,0x09,0x49,0xFF,0xFF,0x8E,0x96,0x06,0xC0,0x05,0x84,0x0A,0x49,0xFF,0xDF,0x6F, +0xD5,0xF9,0xFC,0x80,0xFC,0x43,0x83,0x80,0x84,0x00,0xF0,0x85,0xB0,0x05,0x81,0x01, +0x81,0x42,0x49,0xFF,0xFF,0x9C,0xF0,0x05,0x44,0x5E,0xFF,0xFF,0xFF,0x46,0x46,0x00, +0x03,0x02,0x50,0x00,0x05,0xC2,0xD0,0x04,0x44,0x90,0x01,0x00,0xD5,0x02,0xFB,0x30, +0x84,0xC0,0x44,0x74,0x10,0x08,0x49,0xFF,0xFF,0x63,0x44,0x04,0x10,0x00,0x84,0x20, +0xAE,0x40,0x44,0x04,0x10,0x04,0x44,0x10,0x00,0x55,0xAE,0x40,0x44,0x1F,0xFF,0xAA, +0xAE,0x41,0x44,0x10,0x00,0x66,0xAE,0x42,0x40,0x03,0x20,0x00,0x40,0x20,0x40,0x09, +0x40,0x10,0x20,0x09,0x84,0x62,0x96,0x00,0x96,0x48,0x96,0x97,0xF0,0x81,0xF1,0x82, +0xF2,0x83,0xB6,0x67,0x49,0xFF,0xFF,0x1C,0xF2,0x03,0xB6,0x47,0x49,0xFF,0xFF,0x18, +0xF1,0x02,0xB6,0x27,0x49,0xFF,0xFF,0x14,0xF0,0x01,0xB6,0x07,0x49,0xFF,0xFF,0x10, +0x40,0x00,0x00,0x09,0x38,0x0E,0x18,0x00,0x8C,0xC1,0xB6,0x07,0x97,0xB1,0x49,0xFF, +0xFF,0x07,0x40,0x03,0x20,0x00,0x40,0x00,0x24,0x37,0xC1,0x03,0x4C,0x65,0x7F,0xF4, +0x44,0x04,0x10,0x00,0x84,0x21,0xAE,0x40,0x40,0x00,0x00,0x09,0x40,0x00,0x00,0x09, +0x49,0xFF,0xFF,0x27,0x96,0x06,0xC0,0x05,0x84,0x02,0x49,0xFF,0xDF,0x08,0xD5,0xF9, +0x4C,0x65,0x7F,0xB3,0xFC,0xC3,0x40,0x00,0x60,0x08,0x46,0x20,0x4C,0x11,0xFE,0x0D, +0x50,0x21,0x0D,0xB7,0x84,0x28,0x94,0xC1,0x4E,0x04,0x00,0x05,0x40,0x01,0x88,0x03, +0xD5,0x02,0x80,0x03,0x8E,0x21,0x96,0x48,0xC9,0xF7,0xDD,0x9E,0xFC,0x41,0x84,0x1F, +0xF0,0x81,0x84,0xC0,0x44,0x92,0x10,0x00,0x44,0x70,0x0F,0xFC,0x5C,0xF3,0x01,0x00, +0xE8,0x04,0x38,0x04,0x98,0x00,0xD5,0x03,0x44,0x00,0x00,0xFF,0xF1,0x01,0x49,0xFF, +0xFF,0xDC,0x8C,0xC1,0xF0,0x81,0x4C,0x63,0xFF,0xF3,0xF0,0x01,0xFC,0xC1,0x2E,0x07, +0xE2,0xCD,0x5A,0x00,0x01,0x14,0xFC,0x00,0x2E,0x07,0xE2,0xCD,0x5A,0x08,0x02,0x05, +0x84,0x03,0x3E,0x07,0xE2,0xCD,0x2E,0x07,0xE2,0xCD,0x5A,0x08,0x04,0x05,0x84,0x01, +0x3E,0x07,0xE2,0xCD,0x49,0xFF,0xEF,0xAB,0xFC,0x80,0xDD,0x9E,0xFC,0x00,0x49,0x00, +0x1D,0xA3,0x80,0xC0,0xC8,0x06,0x49,0xFF,0xF0,0x90,0x40,0x03,0x00,0x06,0xFC,0x80, +0x84,0x01,0xFC,0x80,0xFC,0x42,0x44,0x70,0x01,0x24,0x44,0x22,0x33,0x88,0xFE,0x3C, +0x40,0xA1,0x00,0x00,0x50,0x95,0x01,0x08,0x00,0x34,0x80,0x05,0xE6,0x62,0xE9,0x74, +0x8C,0x08,0x99,0xC2,0x80,0xC1,0x84,0x40,0xB0,0x41,0x80,0x07,0x49,0xFF,0xE0,0x22, +0x80,0x07,0xB0,0x42,0x84,0x41,0x49,0xFF,0xE0,0x1D,0x02,0x05,0x00,0x84,0x5A,0x08, +0x01,0x09,0xF0,0x01,0x02,0x10,0x00,0x08,0x02,0x00,0x00,0x09,0xAC,0x72,0xD5,0x41, +0x02,0x04,0x80,0x01,0x5A,0x00,0x01,0x04,0x5A,0x08,0x02,0x12,0xF2,0x01,0xF1,0x02, +0x22,0x31,0x00,0x08,0x22,0x00,0x80,0x08,0x88,0x03,0x90,0x01,0xAC,0x32,0x22,0x21, +0x00,0x09,0x22,0x00,0x80,0x09,0x88,0x02,0x90,0x01,0xD5,0x2B,0x80,0x07,0xB0,0x43, +0x84,0x42,0x49,0xFF,0xDF,0xF7,0xF2,0x03,0xF0,0x01,0xF7,0x02,0x22,0x41,0x00,0x08, +0x22,0x10,0x00,0x08,0x22,0x31,0x00,0x09,0x22,0x23,0x80,0x08,0x9B,0x0C,0x90,0x81, +0x40,0x91,0x0C,0x08,0x9A,0x8A,0x9A,0x54,0x95,0x62,0x88,0xA9,0x94,0x49,0x88,0x25, +0x22,0x00,0x00,0x09,0x90,0x23,0xAC,0x72,0x22,0x13,0x80,0x09,0x9A,0xC3,0x90,0x61, +0x95,0x0B,0x9A,0x41,0x94,0x9A,0x9A,0x0B,0x88,0x44,0x94,0x01,0x88,0x02,0x90,0x03, +0xA4,0x72,0xAC,0x33,0x80,0x01,0x96,0x4B,0x5E,0xF0,0x99,0x33,0xE9,0x03,0x44,0x00, +0x19,0x32,0x96,0x43,0x4E,0x14,0x00,0x03,0x84,0x00,0xA4,0x73,0xAC,0x32,0x80,0x01, +0x96,0x4B,0x5E,0xF0,0xB2,0x65,0xE9,0x03,0x44,0x00,0x32,0x64,0x96,0x43,0x4E,0x14, +0x00,0x03,0x84,0x00,0xAC,0x33,0xFC,0xC2,0x04,0x00,0x00,0x47,0x46,0x10,0x10,0x00, +0xFE,0x46,0xC1,0x09,0x40,0x10,0x50,0x09,0x92,0x10,0xFE,0x0D,0x96,0x1F,0x5C,0x00, +0x00,0x01,0xDD,0x9E,0x84,0x01,0xDD,0x9E,0xFC,0x20,0x04,0x60,0x00,0x47,0x84,0x4C, +0x92,0xD4,0x97,0x9F,0x80,0xE0,0x42,0x03,0x08,0x73,0x50,0x00,0x00,0x94,0x49,0x00, +0x39,0xE5,0x8C,0xC1,0x84,0x26,0x40,0x23,0x04,0xD6,0x02,0x23,0x80,0x8F,0x97,0x70, +0x96,0x9F,0x50,0x03,0x81,0x1B,0xDA,0x0B,0x8C,0xA1,0x40,0x52,0x84,0x36,0x54,0x50, +0x80,0x0F,0xA6,0x43,0x54,0x10,0x80,0xF0,0xFE,0x6F,0xAE,0x43,0xA6,0x43,0x95,0xB4, +0x96,0x5F,0xFF,0x8F,0xA6,0x44,0xAF,0x83,0x58,0x10,0x80,0x01,0xAE,0x44,0xFC,0xA0, +0xFC,0x42,0x3A,0x0F,0x84,0x20,0x80,0xE0,0x2E,0x07,0xEE,0x21,0x80,0xC1,0xC0,0x02, +0x9B,0xD7,0x2E,0x07,0xEE,0x22,0xC0,0x02,0x9B,0x9E,0x2E,0x07,0xEE,0x23,0xC0,0x0B, +0x40,0x93,0x00,0x13,0x96,0x11,0x96,0x61,0x80,0xC7,0x80,0x85,0x80,0x43,0x80,0xE9, +0x80,0xA1,0x80,0x60,0x42,0x03,0x90,0x24,0x42,0x13,0x14,0x24,0x40,0x00,0x08,0x17, +0x40,0x10,0x8C,0x37,0xFC,0xC2,0xFC,0x47,0x49,0x00,0x1C,0xB6,0xF0,0x84,0x44,0x62, +0x16,0x14,0x44,0x92,0x33,0x90,0x85,0x40,0xB1,0xCB,0x54,0x05,0x00,0xFF,0xF0,0x85, +0x84,0x00,0x10,0x03,0x00,0x08,0x10,0x03,0x80,0x08,0x2E,0x07,0xF4,0xA8,0x5A,0x08, +0x01,0x04,0x48,0x00,0x00,0x95,0x00,0x44,0x81,0x05,0x9E,0x22,0xE6,0x02,0x4E,0xF2, +0x00,0x8F,0x44,0x20,0x01,0x24,0x44,0x02,0x34,0xB0,0x42,0x25,0x08,0x24,0x38,0x10, +0x08,0x02,0x40,0x30,0xAC,0x09,0x96,0xC6,0x4E,0x33,0x00,0x82,0x44,0x32,0x15,0xC0, +0x92,0x25,0x38,0x31,0xA8,0x00,0x96,0x5F,0xE0,0x61,0xE8,0x09,0x5A,0x48,0x03,0x08, +0x8E,0x05,0x88,0x02,0xA6,0x46,0x58,0x10,0x80,0x08,0xAE,0x46,0xB0,0x47,0x84,0x40, +0x80,0x09,0x49,0xFF,0xDF,0x17,0xF0,0x07,0x50,0x8F,0x80,0x24,0x22,0x20,0x00,0x08, +0xAC,0xB2,0x22,0x10,0x00,0x09,0xB4,0x00,0xF2,0x89,0xB6,0x06,0x84,0x01,0x10,0x03, +0x00,0x08,0xF1,0x8A,0x3C,0x03,0xEF,0x08,0xAC,0x73,0xF0,0x81,0xF2,0x01,0x3C,0x03, +0xEF,0x09,0xF0,0x82,0xF3,0x02,0x3C,0x03,0xEF,0x0C,0xF0,0x83,0xF4,0x03,0x3D,0xC3, +0xEF,0x0D,0x3A,0x04,0x04,0x00,0x80,0xBC,0x49,0xFF,0xFF,0x7C,0xF0,0x89,0xAC,0x32, +0x02,0x04,0x80,0x81,0x14,0x14,0x00,0x01,0xE6,0x02,0xAC,0x73,0xE8,0x05,0x00,0x14, +0x81,0x05,0x5A,0x18,0x03,0x2B,0x84,0x41,0xB0,0x48,0x80,0x09,0x49,0xFF,0xDE,0xE2, +0xF0,0x05,0x80,0x27,0x49,0xFF,0xFE,0xA8,0xF0,0x07,0xF2,0x01,0xF3,0x02,0xB4,0x20, +0xF0,0x08,0xF4,0x03,0x80,0xBC,0xB4,0x00,0x88,0x01,0x84,0x22,0x40,0x00,0x04,0x16, +0xB6,0x07,0x84,0x01,0x22,0x13,0x80,0x02,0x10,0x03,0x80,0x08,0x22,0x03,0x80,0x03, +0xF1,0x89,0xF0,0x8A,0x3A,0x04,0x04,0x00,0x49,0xFF,0xFF,0x4C,0xB6,0x08,0x14,0x14, +0x00,0x01,0xAC,0x3A,0xAC,0x7B,0xD5,0x09,0x5A,0x08,0x01,0x08,0x3A,0x23,0x10,0x00, +0x3A,0x23,0x90,0x20,0x10,0x03,0x80,0x08,0xF0,0x04,0xC8,0x05,0x80,0x09,0x80,0x27, +0x49,0xFF,0xFF,0x0C,0x80,0x09,0x80,0x26,0x49,0xFF,0xFF,0x08,0x8D,0x41,0x8C,0xCC, +0x50,0x94,0x81,0x24,0x5A,0xA0,0x0A,0x04,0x48,0xFF,0xFF,0x59,0xFC,0xC7,0xFC,0x00, +0x2E,0x17,0xF6,0x28,0xC1,0x08,0x49,0x00,0x27,0x08,0x49,0x00,0x27,0x12,0x49,0x00, +0x1B,0xD8,0xD5,0x07,0x49,0x00,0x27,0x01,0x49,0x00,0x27,0x39,0x49,0x00,0x1B,0xD6, +0x49,0x00,0x1B,0xDA,0xFC,0x80,0xFC,0x01,0x84,0x00,0x49,0x00,0x1B,0xF3,0x44,0x12, +0x16,0x14,0x84,0x00,0x49,0x00,0x1C,0x42,0xF0,0x81,0x84,0x27,0x84,0x00,0x49,0x00, +0x1D,0x42,0xF0,0x01,0xFC,0x81,0xFC,0x20,0x3C,0x2D,0xFF,0x13,0x5A,0x20,0x01,0x3E, +0x80,0xE1,0x80,0xC0,0x49,0x00,0x1B,0xD8,0xC8,0x2E,0x5A,0x68,0x01,0x05,0x49,0x00, +0x1B,0xD9,0xD5,0x14,0x49,0xFF,0xFF,0xE1,0x80,0xC0,0xC8,0x10,0x84,0x01,0x49,0xFF, +0xDB,0xF2,0x80,0x06,0x84,0x21,0x49,0xFF,0xDB,0x89,0x3E,0x67,0xF4,0xAE,0x3E,0x67, +0xF4,0xA8,0x3C,0x6F,0xFC,0x52,0x5A,0x70,0x01,0x21,0x84,0x01,0x84,0x2F,0x49,0x00, +0x33,0x01,0x84,0x01,0x80,0x20,0x49,0x00,0x33,0x0B,0x84,0x01,0x49,0xFF,0xDB,0xB4, +0x84,0x00,0x49,0x00,0x1B,0x85,0x49,0x00,0x1B,0x97,0x84,0x00,0x49,0x00,0x1D,0x13, +0x84,0x01,0xD5,0x0C,0x84,0x01,0x49,0xFF,0xDB,0xCE,0x84,0x00,0x84,0x21,0x49,0xFF, +0xDB,0x65,0x84,0x00,0x3E,0x07,0xF4,0xAE,0x84,0x00,0xFC,0xA0,0xFC,0x00,0xC0,0x0B, +0x5A,0x08,0x01,0x05,0x49,0x00,0x2A,0x6D,0xD5,0x06,0x84,0xC0,0x5A,0x08,0x02,0x05, +0x49,0x00,0x2A,0x6A,0x80,0xC0,0x84,0x02,0x49,0x00,0x1B,0x94,0x84,0x02,0x44,0x12, +0x16,0x14,0x49,0x00,0x1B,0xE3,0xC6,0x04,0x80,0x06,0x49,0x00,0x1C,0x9E,0x49,0x00, +0x2A,0x64,0x49,0x00,0x1C,0xAC,0x84,0x02,0x84,0x27,0x49,0x00,0x1C,0xDC,0xFC,0x80, +0x3C,0x0D,0xFF,0x13,0x5A,0x00,0x01,0x16,0xFC,0x00,0x49,0x00,0x1B,0x75,0x80,0xC0, +0xC8,0x04,0x49,0xFF,0xFF,0x82,0xD5,0x07,0x5A,0x00,0x01,0x0B,0x49,0x00,0x1B,0x6F, +0x49,0xFF,0xFF,0xCE,0x80,0x06,0x49,0x00,0x1B,0x3B,0x49,0x00,0x1B,0x4D,0xFC,0x80, +0xDD,0x9E,0xFC,0x00,0x49,0x00,0x17,0xD3,0x5A,0x08,0x01,0x06,0x84,0x00,0x44,0x10, +0x07,0xD0,0xD5,0x04,0x84,0x00,0x44,0x10,0x75,0x30,0x49,0x00,0x32,0x9B,0x84,0x00, +0x84,0x21,0x49,0x00,0x32,0xA5,0x84,0x00,0x49,0x00,0x17,0xCA,0xFC,0x80,0x3E,0x07, +0xF4,0xAC,0xDD,0x9E,0x2E,0x07,0xF4,0xAF,0xDD,0x9E,0xFC,0x00,0x49,0x00,0x15,0x0F, +0x49,0xFF,0xFB,0x92,0x3E,0x07,0xF4,0xAD,0x49,0xFF,0xFC,0x30,0x49,0xFF,0xFB,0x83, +0xFC,0x80,0xFC,0x41,0x2E,0x07,0xF4,0xFB,0x96,0x0E,0xC0,0x0C,0x2E,0x07,0xF4,0xFB, +0x84,0x20,0x54,0x00,0x00,0xFD,0x3E,0x07,0xF4,0xFB,0x3E,0x17,0xF4,0x9F,0x3E,0x17, +0xF6,0x28,0x49,0x00,0x17,0x9C,0xC0,0x50,0x2E,0x07,0xF4,0x9F,0xC8,0x4D,0x2E,0x07, +0xF4,0xFB,0x96,0x06,0xC0,0x08,0x46,0x05,0xB9,0x2E,0x44,0x14,0x00,0x54,0x50,0x00, +0x07,0xF4,0xB6,0x01,0x44,0x64,0x80,0x80,0x46,0xAF,0xEF,0xFF,0xB5,0x26,0xB4,0xE6, +0x40,0x04,0xE0,0x09,0x54,0x90,0x00,0x01,0xB4,0x06,0x50,0xA5,0x0F,0xFF,0x40,0x00, +0x28,0x02,0xB6,0x06,0xB4,0x06,0x46,0x8F,0xDF,0xFF,0x44,0x11,0xE0,0x00,0x50,0x84, +0x0F,0xFF,0x44,0x21,0xF3,0xEE,0x8A,0x41,0x40,0x00,0x20,0x02,0x96,0x91,0xB6,0x06, +0x44,0x00,0xDD,0x40,0x49,0x00,0x2F,0x7A,0x49,0x00,0x0D,0x7A,0x84,0x01,0x3E,0x07, +0xF4,0x9F,0x49,0x00,0x1A,0x51,0x46,0x08,0x88,0x88,0x44,0x14,0x00,0x54,0x50,0x00, +0x08,0x88,0xB6,0x01,0xB4,0x06,0x40,0x94,0xE0,0x08,0x40,0x00,0x28,0x02,0x40,0x90, +0x24,0x04,0xB7,0x26,0xB4,0x06,0x92,0xF9,0x97,0xC6,0x40,0x73,0xE4,0x08,0x40,0x00, +0x20,0x02,0xFF,0xC7,0xB6,0xE6,0x2E,0x07,0xF4,0xFB,0x96,0x06,0xC0,0x1A,0x44,0x14, +0x00,0x54,0x46,0x0A,0x67,0xC9,0x50,0x00,0x0D,0xFE,0xB6,0x01,0x2E,0x07,0xF4,0xFB, +0x44,0x17,0x10,0x08,0x58,0x00,0x00,0x04,0x3E,0x07,0xF4,0xFB,0x2E,0x07,0xF4,0xFB, +0x54,0x00,0x00,0xFE,0x3E,0x07,0xF4,0xFB,0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01, +0x84,0x00,0x3E,0x07,0xF4,0xAB,0x49,0x00,0x17,0x2A,0x80,0x60,0x2E,0x07,0xF4,0x9F, +0xCB,0x48,0x5A,0x08,0x01,0x3E,0x44,0x64,0x80,0x80,0x46,0x8F,0xEF,0xFF,0xB5,0x26, +0xB4,0xE6,0x40,0x04,0xE0,0x09,0x54,0x90,0x00,0x01,0xB4,0x06,0x50,0x84,0x0F,0xFF, +0x40,0x00,0x20,0x02,0xF3,0x81,0xB6,0x06,0xB4,0x06,0x46,0xAF,0xDF,0xFF,0x50,0xA5, +0x0F,0xFF,0x40,0x00,0x28,0x02,0xB6,0x06,0x44,0x20,0xFD,0xBE,0x44,0x00,0xDD,0x40, +0x80,0x20,0x8A,0x40,0x49,0x00,0x2F,0x12,0x49,0x00,0x0D,0x12,0xF3,0x01,0x44,0x04, +0x00,0x54,0x3E,0x37,0xF4,0x9F,0xB6,0x60,0x49,0x00,0x19,0xE6,0xB4,0x06,0x40,0x94, +0xE0,0x08,0x40,0x00,0x20,0x02,0x40,0x90,0x24,0x04,0xB7,0x26,0xB4,0x06,0x92,0xF9, +0x97,0xC6,0x40,0x73,0xE4,0x08,0x40,0x00,0x28,0x02,0xFF,0xC7,0xB6,0xE6,0x49,0x00, +0x3B,0x99,0x2E,0x07,0xF1,0x5C,0xC0,0x2A,0x84,0x01,0x3E,0x07,0xF4,0xAB,0xD5,0x26, +0xC0,0x25,0x3C,0x0D,0xFF,0x13,0xC8,0x04,0x49,0x00,0x45,0x3E,0xD5,0x03,0x49,0xFF, +0xDE,0x3E,0x49,0xFF,0xFB,0x54,0x3C,0x0D,0xFB,0xD6,0x54,0x00,0x10,0x00,0xC0,0x11, +0x3C,0xF7,0xF7,0x8E,0x5E,0xF7,0xFE,0x70,0xE8,0x11,0x84,0x01,0x3C,0x1D,0xFB,0xD6, +0x3E,0x07,0xF4,0xAB,0x44,0x0F,0xEF,0xFF,0xFE,0x0E,0x3C,0x0F,0xFB,0xD6,0xD5,0x06, +0x3C,0xF7,0xF7,0x92,0x5E,0xF7,0x80,0xC8,0xE8,0xD8,0xFC,0xC1,0xFC,0x00,0x49,0x00, +0x2F,0x74,0x5A,0x08,0x01,0x0A,0x49,0x00,0x16,0xB2,0xC8,0x03,0x84,0x04,0xD5,0x02, +0x84,0x03,0x3E,0x07,0xF4,0xB1,0xFC,0x80,0xFC,0x00,0x49,0x00,0x12,0x79,0x49,0xFF, +0xFC,0x8F,0x80,0xC0,0x5A,0x08,0x01,0x06,0x49,0xFF,0xFD,0x77,0x3E,0x67,0xF4,0xAC, +0xFC,0x80,0x2E,0x07,0xF4,0xAD,0x5A,0x08,0x01,0x06,0x84,0x22,0x3E,0x17,0xF4,0xB3, +0xDD,0x9E,0x5A,0x08,0x02,0x07,0x84,0x01,0x3E,0x07,0xF4,0xB3,0x84,0x01,0xDD,0x9E, +0x84,0x00,0xDD,0x9E,0xFC,0x00,0x49,0x00,0x16,0x8A,0xC8,0x03,0x49,0x00,0x16,0xDB, +0x49,0x00,0x11,0xB0,0x49,0x00,0x0E,0xE8,0x49,0x00,0x2A,0xD0,0x49,0x00,0x2A,0x2A, +0x49,0x00,0x12,0x40,0x49,0x00,0x28,0xFF,0x49,0x00,0x2D,0x26,0x49,0x00,0x2A,0x22, +0x49,0x00,0x13,0x3E,0x49,0x00,0x16,0x73,0xC8,0x04,0x49,0x00,0x2B,0x7F,0xD5,0x05, +0x2E,0x07,0xF4,0xFB,0x96,0x06,0xC8,0xFA,0x49,0xFF,0xFA,0x2F,0x49,0x00,0x2C,0x66, +0x49,0xFF,0xEB,0x56,0x49,0xFF,0xFE,0x8F,0x49,0x00,0x05,0x88,0x49,0x00,0x16,0x5F, +0x80,0x40,0x5A,0x08,0x01,0x08,0x44,0x00,0x07,0xD0,0x84,0x20,0x80,0x62,0x49,0x00, +0x30,0x88,0x84,0x01,0x3E,0x07,0xF4,0xB3,0x49,0x00,0x16,0x51,0xC8,0x04,0x84,0x01, +0x49,0x00,0x2E,0x12,0xFC,0x80,0xFC,0x00,0x49,0x00,0x29,0xDE,0x49,0x00,0x29,0xDD, +0xC0,0x08,0x49,0x00,0x28,0xBE,0x49,0x00,0x28,0x93,0x84,0x02,0x3E,0x07,0xF4,0xB3, +0xFC,0x80,0xFC,0x01,0x2E,0x07,0xF4,0xB0,0x5A,0x00,0x01,0x2E,0xC0,0x04,0x5A,0x00, +0x02,0x37,0xD5,0x69,0x49,0x00,0x28,0xB7,0x84,0x00,0x49,0x00,0x2A,0xCF,0x49,0x00, +0x16,0x2E,0x80,0xC0,0xC8,0x1C,0x49,0x00,0x29,0xD5,0xC0,0x15,0x80,0x06,0x49,0x00, +0x12,0xEF,0x80,0x06,0x49,0x00,0x28,0x94,0x80,0x06,0x49,0x00,0x27,0xDE,0x49,0x00, +0x29,0xCC,0xB6,0x1F,0x49,0x00,0x29,0xCC,0xF0,0x81,0xB4,0x3F,0x80,0x06,0xF2,0x01, +0x49,0x00,0x2A,0x42,0x84,0x02,0x84,0x20,0x49,0x00,0x13,0xBD,0x84,0x01,0x49,0x00, +0x2A,0xAD,0xD5,0x3E,0x49,0x00,0x29,0xA0,0x49,0x00,0x29,0x9F,0xC0,0x3C,0x49,0x00, +0x28,0x80,0x84,0x00,0x49,0x00,0x0D,0xAF,0x84,0x02,0xD5,0x33,0x49,0x00,0x29,0x9D, +0xC0,0x32,0x2E,0x07,0xF4,0xB4,0xC8,0x0C,0x44,0x14,0x50,0x28,0xB4,0x01,0x92,0x03, +0x96,0x06,0x5A,0x00,0x01,0x06,0xB4,0x01,0x92,0x01,0x96,0x06,0xC8,0x05,0x2E,0x07, +0xF4,0xAF,0x5A,0x00,0x02,0x21,0x3C,0x0D,0xFF,0x15,0x5A,0x00,0x01,0x1D,0x49,0x00, +0x28,0x60,0x84,0x01,0x49,0x00,0x0D,0x8F,0x5A,0x08,0x01,0x11,0x49,0x00,0x15,0xDF, +0xC8,0x05,0x49,0x00,0x29,0x87,0x49,0x00,0x13,0xFC,0x49,0x00,0x14,0x49,0x84,0x00, +0x49,0x00,0x27,0xA9,0x84,0x01,0x3E,0x07,0xF4,0xB3,0x49,0x00,0x28,0x5E,0x84,0x01, +0x3E,0x07,0xF4,0xB0,0xFC,0x81,0xFC,0x00,0x84,0x01,0x84,0x20,0x49,0x00,0x30,0xA8, +0x84,0x01,0x49,0x00,0x1A,0xB8,0x84,0x00,0x3E,0x07,0xF4,0xAC,0xFC,0x80,0xFC,0x00, +0x2E,0x07,0xF4,0x9E,0x5A,0x00,0x01,0x3C,0xC0,0x07,0x5A,0x08,0x02,0x04,0x48,0x00, +0x00,0x81,0x48,0x00,0x00,0xD3,0x3C,0x0D,0xFB,0xD6,0x54,0x00,0x10,0x00,0xC0,0x65, +0x2E,0x07,0xEF,0x93,0x2E,0x17,0xEF,0xAF,0x8A,0x01,0x4E,0x04,0x00,0x03,0xFE,0x02, +0xE4,0x02,0xE8,0x16,0x2E,0x07,0xEF,0x92,0x2E,0x17,0xEF,0xAE,0x8A,0x01,0x4E,0x04, +0x00,0x03,0xFE,0x02,0xE4,0x02,0xE8,0x0C,0x3C,0x17,0xF7,0xD8,0x84,0x03,0xFE,0x0C, +0x85,0xE5,0x40,0xF0,0x3D,0xF6,0x3C,0x07,0xF7,0xD9,0xE0,0x0F,0xE8,0x05,0x2E,0x07, +0xEF,0xA8,0x4E,0x02,0x00,0x8C,0x3C,0xF7,0xF7,0x92,0x5E,0xF7,0x81,0x91,0xE9,0x2E, +0x2E,0x07,0xEF,0xA8,0x5A,0x08,0x01,0x2B,0x48,0x00,0x00,0x81,0x2E,0x07,0xEF,0x93, +0x2E,0x17,0xEF,0xAF,0x8A,0x01,0x4E,0x04,0x00,0x03,0xFE,0x02,0xE4,0x02,0xE8,0x22, +0x2E,0x07,0xEF,0x92,0x2E,0x17,0xEF,0xAE,0x8A,0x01,0x4E,0x04,0x00,0x03,0xFE,0x02, +0xE4,0x02,0xE8,0x18,0x3C,0x17,0xF7,0xD8,0x84,0x03,0xFE,0x0C,0x85,0xE5,0x40,0xF0, +0x3D,0xF6,0x3C,0x07,0xF7,0xD9,0xE0,0x0F,0xE9,0x0D,0x3C,0xF7,0xF7,0x92,0x5E,0xF7, +0x81,0x91,0xE8,0x1A,0x84,0x00,0x3E,0x07,0xF4,0x9D,0x84,0x02,0x3E,0x07,0xF4,0x9E, +0xD5,0x74,0x2E,0x07,0xEF,0xA8,0xC8,0xF2,0x2E,0x07,0xF4,0x9D,0x8C,0x01,0x96,0x00, +0xE6,0x02,0x3E,0x07,0xF4,0x9D,0xE9,0x0D,0x84,0x00,0x3E,0x07,0xF4,0x9E,0x49,0x00, +0x0C,0x27,0x84,0x04,0xD5,0x60,0x2E,0x07,0xEF,0xA8,0x5A,0x08,0x01,0xE5,0xD5,0xED, +0x3C,0x07,0xF7,0xDA,0x3C,0x17,0xF7,0x8E,0xFE,0x02,0xE0,0x20,0xE9,0xEE,0xD5,0x55, +0x2E,0x07,0xEF,0x93,0x2E,0x17,0xEF,0xAF,0x8A,0x01,0x4E,0x04,0x00,0x03,0xFE,0x02, +0xE4,0x02,0xE8,0x16,0x2E,0x07,0xEF,0x92,0x2E,0x17,0xEF,0xAE,0x8A,0x01,0x4E,0x04, +0x00,0x03,0xFE,0x02,0xE4,0x02,0xE8,0x0C,0x3C,0x17,0xF7,0xD8,0x84,0x03,0xFE,0x0C, +0x85,0xE5,0x40,0xF0,0x3D,0xF6,0x3C,0x07,0xF7,0xD9,0xE0,0x0F,0xE8,0x04,0x2E,0x07, +0xEF,0xA8,0xC0,0x0A,0x3C,0xF7,0xF7,0x92,0x5E,0xF7,0x81,0x91,0xE9,0x11,0x2E,0x07, +0xEF,0xA8,0x5A,0x08,0x01,0x0E,0x3C,0x07,0xF7,0xDA,0x3C,0x17,0xF7,0x8E,0xFE,0x02, +0xE0,0x20,0xE9,0xBB,0x84,0x00,0x3E,0x07,0xF4,0x9D,0x84,0x01,0xD5,0xA8,0x2E,0x07, +0xF4,0x9D,0x8C,0x01,0x96,0x00,0xE6,0x02,0x3E,0x07,0xF4,0x9D,0xE9,0x16,0x84,0x00, +0x3E,0x07,0xF4,0x9E,0x49,0xFF,0xFF,0x29,0x49,0x00,0x0B,0xD2,0x49,0xFF,0xD9,0x93, +0xE6,0x03,0xE9,0x03,0xFA,0x0E,0xD5,0x03,0x44,0x00,0x45,0xF6,0x84,0x22,0x49,0x00, +0x2D,0x63,0x84,0x01,0x3E,0x07,0xF4,0xB1,0xFC,0x80,0xFC,0x20,0x49,0x00,0x18,0x6C, +0x5A,0x08,0x02,0x08,0x49,0xFF,0xFD,0x07,0x84,0x00,0x3E,0x07,0xF4,0xB1,0xD5,0x0C, +0x49,0xFF,0xD9,0x79,0xE6,0x03,0xE9,0xF7,0x49,0x00,0x14,0xD1,0xC0,0xF4,0x3C,0x0D, +0xFF,0x13,0x5A,0x00,0x01,0xF1,0x2E,0x07,0xF4,0xB1,0xC8,0x44,0x2E,0x17,0xF4,0xAB, +0x5A,0x18,0x01,0x04,0x49,0x00,0x2F,0x9B,0x84,0x00,0x49,0x00,0x2F,0xBC,0x5A,0x00, +0x01,0x0E,0x3C,0x0D,0xFB,0xD6,0x54,0x00,0x10,0x00,0xC0,0x3A,0x2E,0x07,0xEF,0xB6, +0xC8,0x37,0x49,0x00,0x14,0xB4,0x5A,0x08,0x01,0x34,0x49,0x00,0x18,0x3D,0x5A,0x00, +0x02,0x30,0x49,0x00,0x14,0xAC,0x5A,0x08,0x01,0x28,0x2E,0x07,0xF4,0xA0,0x8C,0x01, +0x3E,0x07,0xF4,0xA0,0x49,0x00,0x14,0xA3,0x80,0xC0,0xC8,0x0E,0x84,0x01,0x80,0x26, +0x49,0x00,0x2F,0x7E,0x80,0x06,0x44,0x10,0x75,0x30,0x49,0x00,0x2F,0x6B,0x80,0x06, +0x84,0x21,0x49,0x00,0x2F,0x75,0x2E,0x07,0xF4,0xA0,0x4E,0x02,0x00,0xDE,0x84,0xC0, +0x3E,0x60,0x0A,0xDC,0x49,0xFF,0xFE,0xC1,0x84,0x01,0x3E,0x07,0xF4,0xB1,0x3E,0x67, +0xF4,0xA0,0x84,0xE1,0xD5,0x06,0x49,0x00,0x14,0x13,0x4E,0x02,0x00,0xC4,0x84,0xE0, +0x2E,0x07,0xF4,0xB1,0x5A,0x08,0x03,0x04,0x49,0xFF,0xFE,0xBB,0x2E,0x67,0xF4,0xB1, +0x5A,0x68,0x01,0x0C,0x80,0x06,0x49,0x00,0x14,0x7B,0x49,0x00,0x2B,0x12,0x84,0x02, +0x3E,0x07,0xF4,0xB1,0x3E,0x67,0xF4,0xA9,0x2E,0x07,0xF4,0xB1,0x5A,0x00,0x02,0x04, +0x48,0x00,0x00,0x87,0x2E,0x07,0xF4,0xA9,0x5A,0x08,0x01,0x1D,0x49,0x00,0x0B,0x3C, +0x84,0x00,0x3E,0x07,0xF4,0xA9,0x49,0x00,0x2C,0xDF,0xFA,0x18,0x49,0x00,0x2C,0xE7, +0x49,0xFF,0xD8,0xF9,0xE6,0x03,0xE9,0x03,0xFA,0x18,0xD5,0x03,0x44,0x00,0x46,0x00, +0x49,0x00,0x2C,0xDD,0x49,0xFF,0xFD,0x94,0x49,0x00,0x0B,0x2A,0x3E,0x07,0xE2,0xCE, +0xD5,0x67,0x2E,0x07,0xF4,0xAB,0x5A,0x08,0x01,0x06,0x84,0x04,0x3E,0x07,0xF4,0xB1, +0xD5,0x5F,0x2E,0x07,0xF4,0x9C,0x84,0xC0,0x5A,0x08,0x01,0x13,0x84,0x00,0x3E,0x07, +0xF4,0x9C,0x49,0x00,0x14,0x34,0x5A,0x08,0x01,0x06,0x49,0x00,0x0B,0x21,0x3E,0x07, +0xE2,0xCE,0x3C,0x67,0xF7,0x92,0x44,0x00,0x00,0x82,0x40,0x60,0x18,0x07,0x2E,0x07, +0xE2,0xCE,0x49,0x00,0x0B,0x48,0x5A,0x08,0x01,0x44,0xCE,0x42,0x2E,0x67,0xF6,0x27, +0x97,0xB0,0x5A,0x68,0x01,0x37,0x49,0x00,0x14,0x1A,0xC8,0x33,0x49,0x00,0x28,0xB6, +0x49,0xFF,0xCD,0x6D,0xC8,0x2E,0x84,0x0C,0xFA,0x2E,0x49,0x00,0x2E,0xE3,0x84,0x0C, +0x80,0x26,0x49,0x00,0x2E,0xED,0x80,0x06,0x49,0xFF,0xCD,0x57,0x49,0xFF,0xCD,0x5F, +0x5A,0x00,0x01,0x0C,0x84,0x0C,0x49,0x00,0x2E,0xFE,0x5A,0x08,0x01,0xF9,0x84,0x00, +0x3E,0x07,0xF6,0x27,0x3E,0x07,0xF6,0x26,0x84,0x0C,0x84,0x20,0x49,0x00,0x2E,0xD8, +0x2E,0x67,0xF6,0x27,0x97,0xB0,0x5A,0x68,0x01,0x0D,0x80,0x06,0x49,0x00,0x25,0xC3, +0x84,0x00,0x49,0xFF,0xCC,0x2D,0x80,0x06,0x49,0x00,0x25,0xC9,0x3E,0x67,0xF6,0x26, +0x49,0x00,0x0A,0xC2,0x49,0xFF,0xFD,0x2C,0x84,0x01,0x3E,0x07,0xF4,0x9C,0x2E,0x07, +0xF4,0xB1,0x5A,0x08,0x04,0x0E,0x3C,0x1D,0xFB,0xD6,0x44,0x0F,0xEF,0xFF,0xFE,0x0E, +0x3C,0x0F,0xFB,0xD6,0x49,0xFF,0xFB,0xFF,0x84,0x00,0x3E,0x07,0xF4,0xB1,0x49,0x00, +0x13,0xCE,0x80,0x40,0x5A,0x08,0x01,0x21,0x2E,0x10,0x0A,0xDC,0xC1,0x05,0x8E,0x21, +0x3E,0x10,0x0A,0xDC,0xD5,0x19,0x44,0x00,0x07,0xD0,0x80,0x62,0x49,0x00,0x2D,0xF1, +0xD5,0x13,0x49,0x00,0x27,0x67,0x4E,0x03,0xFF,0x3C,0x49,0x00,0x13,0xB8,0x4E,0x02, +0xFF,0x0E,0x48,0xFF,0xFF,0x36,0x49,0x00,0x13,0xB2,0x5A,0x00,0x01,0x04,0x48,0xFF, +0xFF,0x2A,0x48,0xFF,0xFF,0x1E,0x80,0x07,0xFC,0xA0,0xFC,0x00,0x49,0x00,0x27,0x45, +0xC0,0x6A,0x49,0xFF,0xF9,0x76,0x2E,0x07,0xE2,0xCD,0x5A,0x08,0x03,0x05,0x49,0x00, +0x26,0x2C,0xD5,0x52,0x49,0x00,0x26,0x15,0x49,0xFF,0xE8,0x5E,0x49,0xFF,0xFB,0xDF, +0x49,0x00,0x26,0x23,0x49,0xFF,0xFC,0xF7,0x5A,0x08,0x01,0x08,0x84,0x00,0x49,0x00, +0x13,0x97,0x49,0xFF,0xDA,0xF4,0xD5,0x4F,0x49,0xFF,0xD8,0x9E,0x2E,0x17,0xE2,0xCF, +0x5A,0x00,0x01,0x0C,0x5A,0x10,0x01,0x0C,0x3C,0x0D,0xFB,0xD6,0x96,0x36,0xC8,0x05, +0x2E,0x07,0xEF,0xB6,0x5A,0x08,0x01,0x1E,0x84,0x0A,0xC1,0x02,0x84,0x05,0x3E,0x07, +0xEF,0x18,0x84,0x06,0xC1,0x02,0x84,0x05,0x3C,0x1D,0xFB,0xD6,0x3E,0x07,0xEF,0x17, +0x44,0x0F,0xFF,0xBF,0xFE,0x0E,0x3C,0x0F,0xFB,0xD6,0x84,0x23,0x84,0x00,0x3E,0x07, +0xEF,0xB6,0x3E,0x07,0xE2,0xCF,0x3E,0x17,0xF4,0xB3,0x3E,0x07,0xF4,0xB0,0xD5,0x23, +0x49,0xFF,0xFB,0xB1,0x2E,0x07,0xF4,0x21,0xC0,0x18,0x5A,0x08,0x01,0x12,0x49,0x00, +0x25,0xB8,0xC0,0x03,0x49,0x00,0x18,0x1E,0x44,0x00,0x04,0x84,0x49,0x00,0x16,0x51, +0x84,0x00,0x3E,0x07,0xF4,0x21,0x84,0x01,0x3E,0x07,0xF4,0xB3,0xD5,0x0C,0x5A,0x08, +0x02,0xF5,0x49,0x00,0x25,0xA9,0xD5,0xEE,0x49,0xFF,0xFE,0x61,0xC8,0xF5,0x49,0xFF, +0xFC,0x95,0xD5,0xF2,0xFC,0x80,0x00,0x00,0xFC,0x40,0x49,0x00,0x16,0xC5,0x80,0xE0, +0x49,0x00,0x18,0x25,0x5A,0x08,0x01,0x05,0x84,0x20,0x49,0x00,0x2E,0x11,0x84,0x01, +0x49,0x00,0x2E,0x29,0x5A,0x08,0x01,0x07,0x84,0x20,0x49,0x00,0x2E,0x09,0x49,0x00, +0x16,0x9B,0x5A,0x78,0x02,0x5C,0x2E,0x07,0xF4,0xAC,0x5A,0x00,0x01,0x04,0x48,0x00, +0x00,0x8F,0x49,0x00,0x18,0x0C,0x5A,0x00,0x01,0x04,0x48,0x00,0x00,0x89,0x2E,0x07, +0xF4,0xA8,0x5A,0x08,0x01,0x05,0x84,0x00,0x3E,0x07,0xF4,0xA8,0x44,0x64,0x80,0x80, +0x44,0x0B,0xFF,0xFF,0xB4,0x26,0xFE,0x0E,0xB6,0x06,0xB4,0x26,0x46,0x0F,0xFE,0xFF, +0x50,0x00,0x0F,0xFF,0xFE,0x0E,0xB6,0x06,0xB4,0x26,0x46,0x0F,0xFD,0xFF,0x50,0x00, +0x0F,0xFF,0xFE,0x0E,0xB6,0x06,0x84,0x00,0x49,0xFF,0xFB,0x0C,0x84,0x00,0x3E,0x07, +0xF4,0xAC,0x84,0x00,0x49,0x00,0x17,0xE7,0xB4,0x26,0x44,0x04,0x00,0x00,0xFE,0x0F, +0xB6,0x06,0xB4,0x26,0x46,0x00,0x01,0x00,0xFE,0x0F,0xB6,0x06,0xB4,0x26,0x46,0x00, +0x02,0x00,0xFE,0x0F,0xB6,0x06,0x44,0x10,0x01,0x90,0x84,0x01,0x49,0x00,0x2D,0xB2, +0x84,0x01,0x80,0x20,0x49,0x00,0x2D,0xBC,0x49,0x00,0x17,0xC9,0x80,0xC0,0xC8,0x47, +0x84,0x01,0x49,0x00,0x2D,0xD0,0x81,0x20,0x5A,0x08,0x01,0xF8,0x80,0x26,0x49,0x00, +0x2D,0xAF,0x80,0x09,0x49,0x00,0x17,0xBF,0xD5,0x3A,0xCF,0x39,0x2E,0x07,0xF4,0xAE, +0x44,0x15,0x10,0x20,0xB6,0x01,0xC8,0x26,0x2E,0x67,0xF4,0xAC,0x5A,0x68,0x01,0x23, +0x80,0x26,0x80,0x07,0x49,0xFF,0xD6,0x84,0x80,0x06,0x49,0xFF,0xD6,0x45,0x80,0x06, +0x49,0xFF,0xD6,0x54,0x80,0x06,0x80,0x26,0x49,0xFF,0xD6,0x00,0x80,0x07,0x80,0x26, +0x49,0xFF,0xFA,0x5B,0x5A,0x08,0x01,0x08,0x3E,0x07,0xF4,0xAE,0x80,0x07,0x49,0x00, +0x17,0x9A,0xD5,0x08,0x80,0x06,0x49,0xFF,0xD6,0x56,0x80,0x07,0x80,0x26,0x49,0xFF, +0xD5,0xED,0x2E,0x67,0xF4,0xAE,0xCE,0x0B,0x2E,0x07,0xF4,0xA8,0x5A,0x08,0x01,0x08, +0x49,0x00,0x17,0x85,0x5A,0x08,0x01,0x04,0x3E,0x67,0xF4,0xA8,0x2E,0x07,0xF4,0xB3, +0xC0,0x19,0x5A,0x78,0x01,0x0E,0x84,0x04,0x3E,0x07,0xF4,0xB3,0x84,0x00,0x49,0x00, +0x27,0x25,0x84,0x00,0x49,0x00,0x01,0xAB,0x49,0x00,0x24,0xFB,0xD5,0x0B,0x5A,0x08, +0x04,0x0A,0x84,0x01,0x3E,0x07,0xF4,0xB3,0x84,0x01,0x49,0x00,0x27,0x17,0x49,0x00, +0x24,0xFA,0x2E,0x07,0xF4,0xB3,0xE6,0x05,0xE8,0x19,0x44,0xF0,0x6F,0x08,0x38,0x07, +0x80,0x00,0x40,0xF0,0x3C,0x00,0xDD,0x0F,0x06,0x12,0x18,0x1E,0x0C,0x00,0x49,0xFF, +0xFB,0xDB,0xD5,0x0C,0x49,0x00,0x20,0xEA,0xD5,0x09,0x49,0xFF,0xFC,0x16,0xD5,0x06, +0x49,0xFF,0xFE,0xB5,0xD5,0x03,0x49,0xFF,0xFC,0x1E,0xFC,0xC0,0xFC,0x40,0x2E,0x07, +0xF4,0xFB,0x84,0xC1,0x96,0x06,0xC0,0x2C,0x2E,0x07,0xF4,0xFB,0x58,0x00,0x00,0x02, +0x3E,0x07,0xF4,0xFB,0x49,0x00,0x07,0xD4,0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x58, +0x84,0x61,0x49,0x00,0x07,0x55,0xFA,0x04,0x49,0xFF,0xD6,0xF2,0x84,0x00,0x80,0x80, +0xFA,0x2F,0xFA,0x40,0x84,0x61,0x49,0x00,0x07,0x4B,0x44,0x00,0x00,0x32,0x49,0xFF, +0xD6,0xE7,0x84,0x00,0x49,0x00,0x29,0xF8,0x84,0x01,0x49,0x00,0x12,0x33,0x3E,0x67, +0xF4,0xAF,0x3E,0x67,0xF6,0x2A,0x49,0x00,0x11,0xF6,0x49,0x00,0x12,0xEC,0x84,0xC0, +0x84,0xE1,0x49,0x00,0x2C,0xD8,0x49,0x00,0x2C,0xAE,0x2E,0x07,0xF4,0xAF,0xE6,0x05, +0xE8,0xF9,0x44,0xF0,0x6F,0xB0,0x38,0x07,0x81,0x01,0x40,0xF0,0x3C,0x00,0xDD,0x0F, +0x0A,0x00,0x12,0x00,0x5E,0x00,0xDE,0x00,0x9A,0x01,0x49,0x00,0x12,0x5D,0x48,0x00, +0x00,0xE8,0x84,0x01,0x3E,0x77,0xF4,0xB2,0x49,0x00,0x2C,0x81,0x3E,0x67,0xF4,0xB3, +0x3E,0x67,0xF4,0xB1,0x3E,0x67,0xF4,0xAA,0x49,0x00,0x12,0x01,0x5A,0x08,0x01,0x17, +0x49,0x00,0x12,0x03,0x5A,0x08,0x02,0x04,0x84,0x03,0xD5,0x02,0x84,0x04,0x3E,0x07, +0xF4,0xAF,0x2E,0x07,0xF6,0x25,0xC0,0x03,0x84,0x04,0xD5,0x05,0x2E,0x07,0xF6,0x24, +0xC0,0xC9,0x84,0x03,0x3E,0x07,0xF4,0xAF,0xD5,0xC5,0x84,0x02,0xD5,0xFC,0x49,0x00, +0x11,0x90,0x49,0x00,0x11,0xA0,0x3E,0x67,0xF4,0xB4,0x49,0x00,0x11,0x93,0x81,0x20, +0x5A,0x08,0x01,0x23,0x3E,0x07,0xF4,0xAA,0x84,0x00,0x49,0x00,0x26,0x77,0x49,0x00, +0x07,0x5F,0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x58,0x80,0x69,0x49,0x00,0x06,0xE0, +0xFA,0x04,0x49,0xFF,0xD6,0x7D,0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x40,0x80,0x69, +0x49,0x00,0x06,0xD6,0x44,0x00,0x00,0x32,0x49,0xFF,0xD6,0x72,0x84,0x00,0x3E,0x67, +0xF4,0xB2,0x49,0x00,0x29,0x81,0x49,0x00,0x11,0x86,0x2E,0x17,0xF4,0xAA,0x5A,0x08, +0x01,0x0B,0x84,0x00,0x3C,0x0F,0xFF,0x15,0x5A,0x18,0x01,0x06,0x49,0x00,0x12,0x73, +0x48,0x00,0x00,0x87,0xC9,0x87,0x49,0xFF,0xFE,0x71,0x48,0xFF,0xFF,0x84,0x2E,0x07, +0xF6,0x2C,0xC8,0x04,0x2E,0x07,0xF6,0x2B,0xC0,0x1A,0x2E,0x07,0xF6,0x24,0x54,0x90, +0x00,0xFF,0x4E,0x93,0x00,0x15,0x80,0x09,0x3E,0x77,0xF6,0x25,0x3E,0x77,0xF4,0xAA, +0x49,0x00,0x26,0x34,0x3E,0x97,0xF4,0xB2,0x49,0x00,0x11,0x5D,0x5A,0x08,0x01,0x08, +0x2E,0x07,0xF4,0xAA,0x3C,0x9F,0xFF,0x15,0x5A,0x00,0x01,0xDA,0x3E,0x67,0xF6,0x24, +0x2E,0x07,0xF6,0x25,0xC8,0x05,0x49,0x00,0x11,0x35,0x49,0x00,0x11,0x4C,0x49,0x00, +0x11,0x3A,0x81,0x20,0x5A,0x08,0x01,0x22,0x3E,0x07,0xF4,0xAA,0x84,0x00,0x49,0x00, +0x26,0x15,0x49,0x00,0x06,0xFD,0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x41,0x80,0x69, +0x49,0x00,0x06,0x7E,0x44,0x00,0x00,0x96,0x49,0xFF,0xD6,0x1A,0x84,0x00,0x80,0x80, +0xFA,0x2F,0xFA,0x59,0x80,0x69,0x49,0x00,0x06,0x73,0xFA,0x04,0x49,0xFF,0xD6,0x10, +0x49,0x00,0x11,0xC7,0x3E,0x67,0xF4,0xB2,0x49,0x00,0x11,0x03,0x5A,0x08,0x01,0x0A, +0x3E,0x67,0xF6,0x28,0x49,0x00,0x29,0x18,0x2E,0x07,0xF4,0xAA,0x5A,0x00,0x01,0x29, +0x2E,0x07,0xF4,0xAA,0x4E,0x03,0xFF,0x27,0xD5,0x9F,0x3E,0x67,0xF6,0x2C,0x2E,0x07, +0xF6,0x25,0xC0,0x22,0x2E,0x07,0xF6,0x2A,0xC0,0x1F,0x84,0x00,0x3E,0x77,0xF4,0xAA, +0x49,0x00,0x25,0xDC,0x2E,0xA7,0xF4,0xAA,0x85,0x20,0x3E,0x67,0xF4,0xB2,0x3C,0x9F, +0xFF,0x15,0x5A,0xA8,0x01,0x12,0x3E,0x77,0xF6,0x24,0x3E,0x67,0xF6,0x25,0x3E,0x67, +0xF6,0x2A,0x49,0x00,0x11,0xF0,0x80,0x0A,0x80,0x29,0x49,0xFF,0xD4,0x77,0x3E,0x77, +0xF4,0xAF,0x48,0xFF,0xFF,0x00,0x49,0x00,0x10,0xDE,0x81,0x20,0x5A,0x08,0x01,0x22, +0x3E,0x07,0xF4,0xAA,0x84,0x00,0x49,0x00,0x25,0xB9,0x49,0x00,0x06,0xA1,0x84,0x00, +0x80,0x80,0xFA,0x2F,0xFA,0x41,0x80,0x69,0x49,0x00,0x06,0x22,0x44,0x00,0x00,0x96, +0x49,0xFF,0xD5,0xBE,0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x59,0x80,0x69,0x49,0x00, +0x06,0x17,0xFA,0x04,0x49,0xFF,0xD5,0xB4,0x49,0x00,0x11,0x6B,0x3E,0x67,0xF4,0xB2, +0x49,0x00,0x10,0xA7,0x5A,0x08,0x01,0x08,0x49,0x00,0x28,0xBE,0x2E,0x07,0xF4,0xAA, +0x5A,0x00,0x01,0xCF,0x2E,0x07,0xF4,0xAA,0x4E,0x03,0xFE,0xCD,0x44,0x10,0x00,0xEB, +0x49,0x00,0x2B,0xA5,0x49,0x00,0x10,0xD2,0x84,0x0A,0x49,0xFF,0xD5,0x99,0x84,0x01, +0x44,0x10,0x00,0xEB,0x49,0x00,0x2B,0x9B,0x48,0xFF,0xFE,0xBD,0x2E,0x07,0xF4,0xB2, +0xDD,0x9E,0x3E,0x07,0xF4,0xB2,0xDD,0x9E,0xDD,0x9E,0x46,0x10,0x00,0x81,0xC8,0x06, +0x04,0x00,0x80,0x33,0x58,0x00,0x02,0x00,0xD5,0x06,0x04,0x20,0x80,0x33,0x44,0x0F, +0xFD,0xFF,0xFE,0x16,0x14,0x00,0x80,0x33,0xDD,0x9E,0x44,0x24,0x2C,0x14,0x84,0x30, +0xB4,0x62,0x96,0x1F,0xFE,0x5E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x24,0x2C,0x14, +0x96,0x1F,0xB4,0x62,0x40,0x10,0x20,0x08,0x44,0x0F,0xF0,0xFF,0xFE,0x1E,0xFE,0x0F, +0xB6,0x02,0xDD,0x9E,0xDD,0x9E,0xFC,0x00,0x44,0x24,0x80,0x10,0x84,0x01,0xB4,0x22, +0x96,0x46,0xC1,0x0B,0xAE,0x10,0x3E,0x07,0xF4,0xC3,0x3E,0x07,0xF4,0xC0,0x3C,0x0D, +0xFD,0x2E,0x8C,0x01,0x3C,0x0F,0xFD,0x2E,0x44,0x04,0x80,0x10,0xB4,0x00,0x92,0x0A, +0x96,0x06,0xC0,0x0E,0x44,0x04,0x80,0x11,0x84,0x24,0xAE,0x40,0x49,0x00,0x01,0x7A, +0x44,0x07,0x20,0x00,0xB4,0x00,0x92,0x08,0x96,0x06,0x49,0x00,0x01,0x58,0x44,0x04, +0x80,0x10,0x84,0x21,0xB4,0x00,0x92,0x08,0x96,0x06,0xC0,0x08,0x44,0x04,0x80,0x11, +0xAE,0x40,0x3E,0x17,0xF4,0xC1,0x3E,0x17,0xF4,0xC0,0x44,0x04,0x80,0x10,0xB4,0x20, +0x92,0x27,0x96,0x46,0xC1,0x04,0x44,0x1F,0xFF,0x80,0xAE,0x40,0xB4,0x00,0x92,0x05, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x10,0xFA,0x30,0xAE,0x40,0x44,0x04,0x80,0x10, +0xB4,0x20,0x92,0x26,0x96,0x46,0xC1,0x04,0x44,0x10,0x00,0x40,0xAE,0x40,0xB4,0x00, +0x92,0x18,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x13,0x84,0x21,0xAE,0x40,0x44,0x04, +0x80,0x10,0xB4,0x00,0x92,0x15,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x12,0xFA,0x30, +0xAE,0x40,0xFC,0x80,0xFC,0x00,0x44,0x24,0x80,0x10,0x84,0x21,0xB4,0x02,0x92,0x04, +0x96,0x06,0xC0,0x14,0xFA,0x00,0xAE,0x10,0x3E,0x17,0xF4,0xC2,0x3E,0x17,0xF4,0xC0, +0x3C,0x0D,0xFD,0x2F,0x8C,0x01,0x3C,0x0F,0xFD,0x2F,0x46,0x00,0x00,0x81,0x04,0x00, +0x00,0xF0,0x92,0x03,0x96,0x06,0x49,0x00,0x01,0x02,0x44,0x14,0x80,0x10,0xB4,0x01, +0x92,0x0B,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x11,0x84,0x48,0xAE,0x80,0xB4,0x01, +0x92,0x03,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x10,0x84,0x28,0xAE,0x40,0x44,0x04, +0x80,0x10,0xB4,0x20,0x92,0x22,0x96,0x46,0xC1,0x03,0x84,0x24,0xAE,0x40,0xB4,0x00, +0x92,0x01,0x96,0x06,0xC0,0x0E,0x44,0x04,0x80,0x90,0xB4,0x00,0x92,0x01,0x96,0x06, +0x5A,0x08,0x01,0x08,0x44,0x14,0x80,0x10,0x84,0x42,0xAE,0x88,0x3E,0x07,0xF4,0xB4, +0x44,0x14,0x80,0x10,0xB4,0x01,0x92,0x19,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x13, +0x84,0x42,0xAE,0x80,0xB4,0x01,0x92,0x16,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x12, +0x44,0x10,0x00,0x40,0xAE,0x40,0xFC,0x80,0xFC,0x00,0x80,0xC0,0x49,0xFF,0xCB,0xD4, +0x46,0x20,0x00,0x81,0x97,0x86,0x94,0x32,0x04,0x61,0x03,0x93,0x84,0x3B,0xFF,0x8E, +0xFF,0x87,0x14,0x61,0x03,0x93,0x49,0xFF,0xCB,0xC0,0xFC,0x80,0x44,0x24,0x50,0x1C, +0x40,0x00,0x40,0x08,0xB4,0x22,0x96,0x49,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x24, +0x50,0x1C,0x44,0x1F,0x00,0xFF,0xB4,0x62,0x40,0x00,0x20,0x08,0xFE,0x5E,0xFE,0x0F, +0xB6,0x02,0xDD,0x9E,0x3E,0x07,0xF4,0xC4,0xDD,0x9E,0x44,0x07,0x21,0x00,0x46,0x10, +0x20,0x00,0xB4,0x40,0xFE,0x57,0xB6,0x20,0x80,0x20,0xB4,0x01,0x92,0x19,0x96,0x06, +0xC8,0xFD,0xDD,0x9E,0x44,0x27,0x21,0x1C,0x96,0x1F,0x40,0x10,0x60,0x08,0xB4,0x62, +0x46,0x0F,0x0F,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E, +0x44,0x24,0x80,0x84,0x96,0x06,0xB4,0x62,0x40,0x10,0x40,0x08,0x44,0x0E,0xFF,0xFF, +0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x04,0x80,0x04,0xA6,0x02,0x92,0x01, +0x96,0x06,0xC0,0x08,0x44,0x04,0x80,0x06,0x84,0x22,0xAE,0x40,0x84,0x01,0x3E,0x07, +0xF4,0xC5,0x44,0x04,0x80,0x04,0x84,0x21,0xA6,0x02,0x96,0x06,0xC0,0x06,0x44,0x04, +0x80,0x06,0xAE,0x40,0x3E,0x17,0xF4,0xC4,0xDD,0x9E,0x44,0x04,0x80,0x04,0xA6,0x03, +0x92,0x01,0x96,0x06,0xDD,0x9E,0x44,0x04,0x10,0x04,0x44,0x10,0x00,0x55,0xAE,0x40, +0x44,0x1F,0xFF,0xAA,0xAE,0x41,0x44,0x10,0x00,0x66,0xAE,0x42,0x40,0x00,0x00,0x09, +0xDD,0x9E,0x44,0x14,0x10,0x08,0xB6,0x01,0x44,0x14,0x80,0x04,0xA6,0x0B,0x92,0x01, +0x96,0x06,0xC0,0xFD,0x44,0x04,0x80,0x07,0x84,0x22,0xAE,0x40,0xDD,0x9E,0xFC,0x00, +0x80,0xC0,0x92,0x10,0x96,0x00,0x49,0xFF,0xFF,0xEE,0x40,0x03,0x20,0x09,0x96,0x00, +0x49,0xFF,0xFF,0xE9,0x96,0x30,0x49,0xFF,0xFF,0xE6,0xFC,0x80,0x44,0x24,0x10,0x00, +0x96,0x06,0xA6,0x53,0x54,0x10,0x80,0xFE,0xFE,0x0F,0xAE,0x13,0xDD,0x9E,0x44,0x14, +0x10,0x00,0xAE,0x08,0xDD,0x9E,0x44,0x04,0x10,0x12,0x84,0x20,0xAE,0x40,0xDD,0x9E, +0x44,0x14,0x10,0x0C,0xB6,0x01,0xDD,0x9E,0x44,0x24,0x10,0x14,0x96,0x06,0xA6,0x53, +0x54,0x10,0x80,0xFE,0xFE,0x0F,0xAE,0x13,0xDD,0x9E,0x44,0x14,0x10,0x10,0xAE,0x0B, +0xDD,0x9E,0x44,0x14,0x10,0x10,0xAE,0x08,0xDD,0x9E,0x3E,0x07,0xE2,0xD4,0xDD,0x9E, +0x2E,0x07,0xE2,0xD4,0xDD,0x9E,0x44,0x37,0x20,0x00,0x54,0x10,0x00,0x01,0xB4,0x83, +0x40,0x20,0xA0,0x08,0x44,0x1F,0xFE,0xFF,0xFE,0x66,0xFE,0x57,0xB6,0x23,0x3E,0x07, +0xE2,0xD4,0xDD,0x9E,0x44,0x07,0x20,0x00,0xB4,0x00,0x92,0x18,0x96,0x06,0xDD,0x9E, +0x84,0x01,0x3E,0x07,0xE2,0xD5,0xDD,0x9E,0x2E,0x07,0xE2,0xD5,0xDD,0x9E,0x84,0x00, +0x3E,0x07,0xE2,0xD5,0xDD,0x9E,0xC8,0x07,0x44,0x17,0x10,0x18,0xA6,0x08,0x54,0x00, +0x00,0xFE,0xD5,0x08,0x5A,0x08,0x01,0x0F,0x44,0x17,0x10,0x18,0xA6,0x08,0x58,0x00, +0x00,0x01,0xAE,0x08,0x44,0x17,0x10,0x0C,0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01, +0xDD,0x9E,0x5A,0x08,0x02,0x0D,0x44,0x17,0x10,0x18,0xA6,0x08,0x58,0x00,0x00,0x01, +0xAE,0x08,0x44,0x07,0x10,0x0C,0xB4,0x20,0x84,0x20,0xB6,0x20,0xDD,0x9E,0x3C,0x0D, +0xFD,0x36,0xC0,0x0B,0xA4,0x80,0x3C,0x13,0xFA,0x68,0x8E,0x21,0xE0,0x41,0xE8,0x05, +0xA4,0x40,0x8C,0x21,0x96,0x49,0xAC,0x40,0xA4,0x80,0x3C,0x13,0xFA,0x6A,0xE2,0x41, +0xE9,0x0C,0x84,0x20,0xAC,0x40,0x44,0x06,0x00,0x34,0x44,0x10,0x00,0x5A,0xB6,0x20, +0x84,0x01,0x3E,0x07,0xE2,0xD6,0xD5,0x0B,0x3C,0x1D,0xFD,0x38,0xC1,0x08,0xA4,0x00, +0x88,0x01,0x44,0x16,0x00,0x34,0xA6,0x00,0x96,0x00,0xB6,0x01,0x44,0x06,0x00,0x00, +0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x08,0x01,0x0B,0x44,0x06,0x00,0x30,0xB4,0x20, +0x58,0x10,0x80,0x01,0xB6,0x20,0xB4,0x20,0x96,0x46,0xC9,0xFE,0xDD,0x9E,0xFC,0x40, +0x3C,0x0D,0xFD,0x36,0x84,0x20,0xAC,0x40,0x3C,0x1D,0xFD,0x38,0xC1,0x08,0xA4,0x00, +0x88,0x01,0x44,0x16,0x00,0x34,0xA6,0x00,0x96,0x00,0xB6,0x01,0x84,0xE0,0x44,0x94, +0x80,0x00,0x44,0xA4,0x80,0x80,0x00,0x64,0x80,0x02,0xB4,0x0A,0x92,0xC3,0x92,0x13, +0x96,0x06,0xFF,0x86,0xC6,0x16,0x44,0x04,0x80,0x02,0x84,0x28,0xAE,0x40,0x44,0x06, +0x00,0x00,0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x08,0x01,0x32,0x44,0x06,0x00,0x30, +0xB4,0x20,0x58,0x10,0x80,0x01,0xB6,0x20,0xB4,0x20,0x96,0x46,0xC9,0xFE,0xFC,0xC0, +0x00,0x04,0x80,0x02,0x40,0x10,0x10,0x09,0xB4,0x0A,0x92,0x14,0x96,0x06,0xFE,0x0E, +0xC0,0x08,0x44,0x04,0x80,0x02,0xFA,0x20,0xAE,0x40,0x49,0xFF,0xFF,0x8A,0x80,0xE6, +0x00,0x04,0x80,0x02,0x40,0x10,0x18,0x09,0xB4,0x0A,0x92,0x16,0x96,0x06,0xFE,0x0E, +0xC0,0x07,0x44,0x04,0x80,0x02,0x44,0x10,0x00,0x40,0xAE,0x40,0xFC,0xC0,0x84,0x01, +0x8C,0xE1,0x49,0xFF,0xD3,0x0C,0x5C,0xF3,0xA7,0x11,0xE9,0xBE,0xFC,0xC0,0x44,0x16, +0x00,0x34,0xB6,0x01,0xDD,0x9E,0x3C,0x0F,0xFD,0x39,0x02,0x0F,0x80,0x00,0x3C,0x4B, +0xFA,0x6A,0x3C,0x1F,0xFD,0x38,0x3C,0x5B,0xFA,0x69,0x3C,0x2F,0xFD,0x37,0x3C,0x3F, +0xFD,0x36,0x3C,0x0B,0xFA,0x68,0xDD,0x9E,0x3C,0x0B,0xFA,0x6A,0xDD,0x9E,0x3E,0x07, +0xE2,0xD6,0xDD,0x9E,0x2E,0x07,0xE2,0xD6,0xDD,0x9E,0x3C,0x0F,0xFD,0x33,0xDD,0x9E, +0x3C,0x0F,0xFD,0x32,0xDD,0x9E,0xFC,0x20,0x44,0x14,0x80,0x00,0x44,0x04,0x80,0x80, +0xA6,0x8A,0xB4,0x00,0x92,0x10,0x96,0x06,0xFE,0x16,0xC0,0x05,0x44,0x04,0x80,0x02, +0x84,0x41,0xAE,0x80,0xA6,0x0A,0x40,0x10,0x04,0x09,0x44,0x04,0x80,0x80,0xB4,0x00, +0x92,0x11,0x96,0x06,0xFE,0x0E,0xC0,0x05,0x44,0x04,0x80,0x02,0x84,0x22,0xAE,0x40, +0x44,0x04,0x80,0x00,0xA6,0x02,0x40,0x10,0x08,0x09,0x44,0x04,0x80,0x80,0xB4,0x00, +0x92,0x12,0x96,0x06,0xFE,0x0E,0x4E,0x02,0x00,0xA4,0x44,0x04,0x80,0x02,0x84,0x24, +0xAE,0x40,0x3C,0x0D,0xFD,0x37,0x3C,0x2D,0xFD,0x39,0x84,0x20,0xAC,0x40,0xC2,0x06, +0x44,0x16,0x00,0x28,0xB4,0x21,0x96,0x48,0xAE,0x50,0xC0,0x0B,0xA4,0x80,0x3C,0x13, +0xFA,0x69,0x8E,0x21,0xE0,0x41,0xE8,0x05,0xA4,0x40,0x8C,0x21,0x96,0x49,0xAC,0x40, +0x44,0x06,0x00,0x00,0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x00,0x01,0x06,0x84,0xC0, +0x44,0x76,0x00,0x30,0xD5,0x12,0x44,0x06,0x00,0x30,0xB4,0x20,0x58,0x10,0x80,0x01, +0xB6,0x20,0xB4,0x20,0x96,0x46,0xC9,0xFE,0xD5,0xF3,0x84,0x01,0x8C,0xC1,0x49,0xFF, +0xD2,0x86,0x5C,0xF3,0x08,0x01,0xE8,0x66,0x44,0x34,0x80,0x00,0x44,0x24,0x80,0x80, +0xA6,0x1A,0x40,0x10,0x0C,0x09,0xB4,0x02,0x92,0x13,0x96,0x06,0xFE,0x0E,0xC0,0x16, +0x44,0x04,0x80,0x02,0x84,0x28,0xAE,0x40,0x44,0x06,0x00,0x00,0xB4,0x00,0x92,0x08, +0x96,0x06,0x5A,0x08,0x01,0x50,0x44,0x06,0x00,0x30,0xB4,0x20,0x58,0x10,0x80,0x01, +0xB6,0x20,0xB4,0x20,0x96,0x46,0xC9,0xFE,0xD5,0x45,0xA6,0x1A,0x40,0x10,0x10,0x09, +0xB4,0x02,0x92,0x14,0x96,0x06,0xFE,0x0E,0xC0,0x2D,0x44,0x04,0x80,0x02,0xFA,0x20, +0xAE,0x40,0x3C,0x2D,0xFD,0x39,0x3C,0x0D,0xFD,0x37,0xC2,0x08,0xA4,0x40,0x88,0x22, +0x44,0x26,0x00,0x38,0xB4,0x42,0x96,0x90,0xAE,0x88,0xC0,0x0B,0xA4,0x80,0x3C,0x13, +0xFA,0x69,0x8E,0x21,0xE0,0x41,0xE8,0x05,0xA4,0x40,0x8C,0x21,0x96,0x49,0xAC,0x40, +0x44,0x06,0x00,0x00,0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x00,0x01,0x04,0x84,0xC0, +0xD5,0x09,0xB4,0x07,0x58,0x00,0x00,0x01,0xB6,0x07,0xB4,0x07,0x96,0x06,0xC8,0xFE, +0xD5,0xF7,0x44,0x04,0x80,0x00,0xA6,0x02,0x40,0x10,0x14,0x09,0x44,0x04,0x80,0x80, +0xB4,0x00,0x92,0x15,0x96,0x06,0xFE,0x0E,0xC0,0x99,0x44,0x04,0x80,0x02,0xFA,0x30, +0xAE,0x40,0x3C,0x0D,0xFD,0x33,0xC0,0x04,0x3C,0x0D,0xFD,0x33,0xDD,0x20,0x44,0x04, +0x80,0x00,0xA6,0x02,0x40,0x10,0x0C,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x13, +0x96,0x06,0xFE,0x0E,0xC8,0x14,0x44,0x04,0x80,0x00,0xA6,0x02,0x40,0x10,0x10,0x09, +0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x14,0x96,0x06,0xFE,0x0E,0xC0,0x1D,0x44,0x04, +0x80,0x02,0xFA,0x20,0xAE,0x40,0x49,0xFF,0xFE,0x64,0xD5,0x16,0x44,0x04,0x80,0x02, +0x84,0x28,0xAE,0x40,0x44,0x06,0x00,0x00,0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x08, +0x01,0xE4,0x44,0x06,0x00,0x30,0xB4,0x20,0x58,0x10,0x80,0x01,0xB6,0x20,0xB4,0x20, +0x96,0x46,0xC9,0xFE,0xD5,0xD9,0x44,0x14,0x80,0x00,0xA6,0x0A,0x40,0x20,0x14,0x09, +0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x15,0x96,0x06,0xFE,0x16,0xC0,0x05,0x44,0x04, +0x80,0x02,0xFA,0x50,0xAE,0x80,0xA6,0x0A,0x40,0x10,0x18,0x09,0x44,0x04,0x80,0x80, +0xB4,0x00,0x92,0x16,0x96,0x06,0xFE,0x0E,0xC0,0x06,0x44,0x04,0x80,0x02,0x44,0x10, +0x00,0x40,0xAE,0x40,0xFC,0xA0,0x46,0x20,0x00,0x83,0x96,0x06,0x04,0x31,0x00,0x14, +0x94,0x41,0x84,0x1D,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x14,0xDD,0x9E,0x46,0x00, +0x00,0x83,0x04,0x00,0x00,0x16,0x92,0x10,0x54,0x00,0x03,0xFF,0xDD,0x9E,0xFC,0x00, +0x46,0x60,0x00,0x83,0x44,0x01,0x00,0x00,0xA0,0x71,0xFE,0x0F,0xA8,0x31,0x84,0x01, +0x49,0xFF,0xD1,0xA5,0xA0,0x71,0x44,0x0E,0xFF,0xFF,0xFE,0x0E,0xA8,0x31,0xFC,0x80, +0x46,0x20,0x00,0x80,0x84,0x3E,0x04,0x31,0x00,0x77,0x96,0x06,0xFE,0x5E,0xFE,0x0F, +0x14,0x01,0x00,0x77,0xDD,0x9E,0x40,0x21,0x40,0x08,0x40,0x10,0xA0,0x08,0x88,0x22, +0x88,0x20,0x46,0x00,0x00,0x80,0x14,0x10,0x00,0x78,0xDD,0x9E,0xFC,0x41,0xF5,0x81, +0x81,0x00,0x81,0x22,0x80,0xE3,0x80,0xC4,0x46,0x50,0x00,0x80,0xC0,0x03,0x5A,0x08, +0x01,0x18,0x83,0x85,0xBA,0x77,0x46,0x1F,0xEF,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x56, +0xB9,0xF7,0x84,0x23,0x49,0xFF,0xC4,0xAB,0x38,0x14,0x99,0x01,0x84,0x02,0x49,0xFF, +0xCB,0x07,0x38,0x03,0x98,0x00,0x84,0x22,0x49,0xFF,0xCC,0x05,0xFC,0xC1,0x81,0x41, +0x83,0x85,0xB9,0x77,0x46,0x00,0x10,0x00,0xFE,0x0F,0xB8,0xF7,0x84,0x23,0x84,0x01, +0x49,0xFF,0xC4,0x95,0x50,0x25,0x7F,0xFF,0x80,0x06,0xF1,0x01,0x96,0x90,0x49,0xFF, +0xFF,0xC4,0xFC,0xC1,0x46,0x20,0x00,0x80,0x96,0x06,0x04,0x31,0x00,0x75,0x40,0x10, +0x28,0x08,0x44,0x0F,0xFB,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x75,0xDD,0x9E, +0x46,0x20,0x00,0x91,0x96,0x06,0x04,0x31,0x00,0x14,0x94,0x41,0x84,0x1D,0xFE,0x1E, +0xFE,0x0F,0x14,0x01,0x00,0x14,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0x44,0x14, +0x00,0x48,0x84,0x1F,0xB6,0x01,0x44,0x14,0x00,0x4C,0xB6,0x01,0xDD,0x9E,0xC8,0x04, +0x44,0x07,0x20,0x14,0xD5,0x03,0x44,0x07,0x20,0x18,0xB4,0x00,0x40,0x00,0x30,0x08, +0x92,0x0C,0xDD,0x9E,0xFC,0x00,0x80,0xC1,0x49,0xFF,0xCD,0x34,0x84,0x40,0x50,0x00, +0x09,0x48,0x80,0x22,0xE2,0x46,0xE8,0x04,0xAA,0x41,0x8C,0x41,0xD5,0xFC,0xFC,0x80, +0xFC,0x00,0x44,0x04,0x00,0x9C,0xA6,0x00,0xE6,0x03,0xE9,0x24,0x44,0x64,0x0C,0x40, +0x84,0x41,0xA6,0x32,0x80,0x62,0x58,0x00,0x00,0x08,0xAE,0x32,0x44,0x14,0x04,0x40, +0x44,0x04,0x08,0x40,0x49,0xFF,0xC8,0x26,0xA6,0x32,0x84,0x41,0x54,0x00,0x00,0xF7, +0xAE,0x32,0x44,0x14,0x04,0x40,0x44,0x04,0x08,0x40,0x80,0x62,0x49,0xFF,0xC8,0x1A, +0x44,0x07,0x20,0xC0,0x46,0x10,0x20,0x00,0xB4,0x40,0xFE,0x57,0xB6,0x20,0x80,0x20, +0xD5,0x3C,0x49,0x00,0x0C,0x44,0xC8,0xDB,0x44,0x64,0x50,0x28,0xB4,0x06,0x92,0x10, +0x96,0x06,0x5A,0x00,0x01,0x05,0x44,0x64,0x50,0x28,0xD5,0x25,0x2E,0x07,0xF4,0xB4, +0xC8,0x0E,0xB4,0x06,0x92,0x03,0x96,0x06,0xC8,0x0A,0xB4,0x06,0x92,0x01,0x96,0x06, +0xC0,0x06,0x3C,0x0D,0xFF,0x15,0x5A,0x08,0x01,0xEB,0xD5,0xEE,0x49,0xFF,0xF4,0x6C, +0x5A,0x08,0x02,0xF9,0xD5,0xE9,0x2E,0x07,0xF4,0xB4,0xC8,0x12,0xB4,0x06,0x92,0x03, +0x96,0x06,0xC8,0x0E,0xB4,0x06,0x92,0x01,0x96,0x06,0xC0,0x0A,0x3C,0x0D,0xFF,0x15, +0x5A,0x00,0x01,0xAE,0xB4,0x06,0x92,0x10,0x96,0x06,0xC0,0xEE,0xD5,0xA8,0x49,0xFF, +0xF4,0x53,0x5A,0x08,0x02,0xF5,0xD5,0xA3,0xB4,0x01,0x92,0x19,0x96,0x06,0xC8,0xFD, +0x84,0x01,0x49,0xFF,0xFC,0xCC,0xFC,0x80,0x44,0x34,0x00,0x54,0x84,0x21,0xB4,0x43, +0x40,0x00,0x80,0x0C,0xFE,0x03,0xFE,0x16,0xB6,0x03,0xDD,0x9E,0x44,0x04,0x00,0x50, +0x44,0x1F,0x98,0x81,0xAC,0x40,0x84,0x21,0xAC,0x41,0xDD,0x9E,0xFC,0x00,0x80,0xC0, +0x44,0x04,0x80,0x90,0x54,0x13,0x00,0x01,0xB4,0x80,0x84,0x5D,0x94,0xC9,0xFE,0xA6, +0xFE,0x9F,0xB6,0x40,0x46,0x00,0x00,0x81,0x84,0x5E,0x83,0x80,0xBB,0x15,0xFE,0x9E, +0xFE,0x57,0xB9,0x95,0x84,0x00,0x3E,0x07,0xF4,0xB4,0x44,0x04,0x80,0x10,0x84,0x22, +0xAE,0x40,0x49,0xFF,0xD0,0x78,0xE6,0x03,0xE9,0x2A,0x44,0x14,0x00,0x18,0xA6,0x0A, +0x5A,0x68,0x01,0x13,0x54,0x00,0x00,0xFB,0xAE,0x0A,0x44,0x14,0x50,0x10,0xB4,0x01, +0x92,0x08,0x40,0x00,0x20,0x08,0xB6,0x01,0x44,0x14,0x70,0x00,0x44,0x0E,0xFF,0xFF, +0xB4,0x41,0xFE,0x16,0xD5,0x13,0x58,0x00,0x00,0x04,0xAE,0x0A,0x44,0x14,0x50,0x10, +0xB4,0x01,0x92,0x08,0x40,0x00,0x20,0x08,0x58,0x00,0x00,0x98,0xB6,0x01,0x44,0x14, +0x70,0x00,0x44,0x01,0x00,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0xFC,0x80,0x46,0x00, +0x00,0x91,0xA0,0x02,0x96,0x01,0xDD,0x9E,0xDD,0x9E,0x46,0x30,0x00,0x91,0x58,0x20, +0x00,0x01,0x14,0x21,0x80,0x11,0x44,0x20,0xFF,0xFE,0xFE,0x16,0x14,0x01,0x80,0x11, +0x46,0x00,0x20,0x00,0xFE,0x47,0x44,0x07,0x20,0xC0,0xB6,0x20,0xDD,0x9E,0x46,0x10, +0x00,0x81,0x44,0x02,0x00,0x00,0x04,0x20,0x80,0x6E,0xFE,0x17,0x14,0x00,0x80,0x6E, +0xDD,0x9E,0x44,0x27,0x30,0x10,0xB4,0x22,0x92,0x21,0x96,0x46,0x5A,0x10,0x01,0xFD, +0xFC,0x00,0x44,0x17,0x30,0x00,0xB6,0x01,0x84,0x02,0x49,0xFF,0xCE,0x9A,0xFC,0x80, +0xFC,0x00,0x46,0x61,0xFF,0xF9,0x50,0x03,0x05,0x27,0x49,0xFF,0xFF,0xEC,0x50,0x03, +0x04,0x87,0x49,0xFF,0xFF,0xE8,0xFC,0x80,0xFC,0x00,0x46,0x61,0xFF,0xF9,0x50,0x03, +0x05,0x00,0x49,0xFF,0xFF,0xE0,0x50,0x03,0x04,0x00,0x49,0xFF,0xFF,0xDC,0xFC,0x80, +0xFC,0x00,0x46,0x11,0xFF,0xFF,0x50,0x10,0x8F,0x00,0xFE,0x0F,0x49,0xFF,0xFF,0xD3, +0xFC,0x80,0xFC,0x00,0x46,0x11,0xFF,0xFF,0xFE,0x0F,0x49,0xFF,0xFF,0xCC,0xFC,0x80, +0xFC,0x00,0x46,0x01,0xFF,0xFF,0x50,0x00,0x02,0xBB,0x49,0xFF,0xFF,0xC4,0xFC,0x80, +0xFC,0x00,0x46,0x01,0xFF,0xFF,0x50,0x00,0x03,0xCC,0x49,0xFF,0xFF,0xBC,0xFC,0x80, +0xFC,0x00,0x44,0x67,0x30,0x04,0x49,0xFF,0xFF,0xC5,0x49,0xFF,0xCE,0x4D,0xB4,0x26, +0x84,0x1E,0xFE,0x0E,0xB6,0x06,0x44,0x00,0x03,0xE8,0x49,0xFF,0xCE,0x52,0xB4,0x06, +0x58,0x00,0x00,0x01,0xB6,0x06,0x44,0x00,0x03,0xE8,0x49,0xFF,0xCE,0x4A,0x49,0xFF, +0xFF,0xD9,0x49,0xFF,0xCE,0x39,0x46,0x01,0xFF,0xFF,0x49,0xFF,0xFF,0x9C,0x49,0xFF, +0xCE,0x33,0x49,0xFF,0xCF,0xC0,0xE6,0x03,0xE8,0x0B,0x49,0xFF,0xFF,0xD3,0x49,0xFF, +0xCE,0x2B,0x46,0x01,0xFF,0xFF,0x49,0xFF,0xFF,0x8E,0x49,0xFF,0xCE,0x25,0x44,0x67, +0x30,0x04,0x44,0x00,0x03,0xE8,0x49,0xFF,0xCE,0x2C,0xB4,0x26,0x84,0x1E,0xFE,0x0E, +0xB6,0x06,0x44,0x00,0x03,0xE8,0x49,0xFF,0xCE,0x24,0xB4,0x06,0x58,0x00,0x00,0x01, +0xB6,0x06,0x44,0x00,0x03,0xE8,0x49,0xFF,0xCE,0x1C,0x44,0x04,0x80,0x0A,0x84,0x24, +0xAE,0x40,0x84,0x22,0xAE,0x40,0x84,0x21,0xAE,0x40,0xFC,0x80,0xFC,0x41,0xF0,0x81, +0x80,0xE1,0x80,0xC2,0x81,0x43,0x81,0x24,0x49,0xFF,0xFF,0x74,0xF0,0x01,0x5A,0x00, +0xFF,0x06,0x49,0xFF,0xFF,0x87,0x49,0xFF,0xCD,0xF7,0x40,0xA5,0x20,0x08,0x40,0x95, +0x24,0x04,0x40,0x63,0x40,0x08,0x40,0x64,0x98,0x04,0x40,0x03,0xE0,0x08,0xFE,0x37, +0x49,0xFF,0xFF,0x51,0x49,0xFF,0xFF,0x6A,0xFC,0xC1,0x44,0x27,0x30,0x10,0xB4,0x22, +0x92,0x21,0x96,0x46,0x5A,0x10,0x01,0xFD,0xFC,0x20,0x44,0x14,0x80,0x0A,0x84,0x42, +0xAE,0x88,0x44,0x17,0x30,0x00,0x44,0x60,0x10,0x00,0xB6,0x01,0x44,0x74,0x80,0x08, +0xB4,0x07,0x92,0x11,0x96,0x06,0xC0,0x0D,0x44,0x04,0x80,0x08,0xB4,0x00,0x92,0x12, +0x96,0x06,0xC8,0x10,0x44,0x07,0x30,0x14,0xB4,0x00,0x92,0x10,0x96,0x00,0xFC,0xA0, +0x2E,0x07,0xF4,0xF0,0xC8,0xF2,0x84,0x01,0x8E,0xC1,0x49,0xFF,0xCD,0xCA,0xCE,0xE9, +0xD5,0xEC,0x44,0x00,0xFF,0xFF,0xFC,0xA0,0xFC,0x41,0xF0,0x81,0x40,0x21,0x20,0x08, +0x46,0x02,0xF0,0x00,0x40,0x91,0x00,0x04,0x40,0x10,0xC0,0x08,0x40,0x94,0x84,0x04, +0x84,0xC0,0x49,0xFF,0xFF,0x1F,0xF0,0x01,0x49,0xFF,0xFF,0x34,0x49,0xFF,0xCD,0xA4, +0x80,0x09,0x49,0xFF,0xFF,0xBC,0x5C,0xF0,0x01,0x00,0x80,0xE0,0xE9,0x08,0x8C,0xC1, +0x84,0x01,0x97,0xB0,0x49,0xFF,0xCF,0x34,0x5A,0x68,0x04,0xED,0x49,0xFF,0xFF,0x16, +0x5A,0x60,0x04,0x04,0x80,0x07,0xFC,0xC1,0x84,0x00,0xFC,0xC1,0xFC,0x00,0x44,0x17, +0x30,0x08,0xB4,0x01,0x92,0x05,0x94,0x05,0x58,0x00,0x00,0x01,0xB6,0x01,0x49,0xFF, +0xFE,0xF9,0x49,0xFF,0xCF,0x10,0xE6,0x03,0xE8,0x07,0x49,0xFF,0xFF,0x23,0x46,0x01, +0xFF,0xFF,0x49,0xFF,0xFE,0xE0,0x84,0x06,0xFA,0x2F,0x44,0x20,0x00,0xAC,0x84,0x61, +0x84,0x80,0x49,0xFF,0xFF,0x6D,0x84,0x06,0xFA,0x2F,0x44,0x20,0x00,0xAD,0x84,0x61, +0x84,0x80,0x49,0xFF,0xFF,0x65,0x44,0x04,0x80,0x0A,0x84,0x24,0xAE,0x40,0x84,0x22, +0xAE,0x40,0x44,0x04,0x80,0x88,0x44,0x14,0x00,0x00,0xB4,0x40,0xFE,0x57,0xB6,0x20, +0xB4,0x40,0x44,0x12,0x00,0x00,0xFE,0x57,0xB6,0x20,0x49,0xFF,0xFE,0xD7,0xFC,0x80, +0xFC,0x20,0x84,0x2C,0x84,0x41,0x84,0x05,0x49,0xFF,0xFF,0x98,0x97,0xC0,0x84,0x2D, +0x84,0x41,0x84,0x05,0x49,0xFF,0xFF,0x92,0x97,0x80,0x80,0x87,0x84,0x05,0xFA,0x2F, +0x44,0x20,0x00,0xC0,0x84,0x61,0x49,0xFF,0xFF,0x3B,0x80,0x86,0x84,0x05,0xFA,0x2F, +0x44,0x20,0x00,0xC1,0x84,0x61,0x49,0xFF,0xFF,0x33,0x80,0x87,0x84,0x05,0xFA,0x2F, +0x44,0x20,0x00,0xC2,0x84,0x61,0x49,0xFF,0xFF,0x2B,0x80,0x86,0x84,0x05,0xFA,0x2F, +0x44,0x20,0x00,0xC3,0x84,0x61,0x49,0xFF,0xFF,0x23,0x80,0x87,0x84,0x05,0xFA,0x2F, +0x44,0x20,0x00,0xC4,0x84,0x61,0x49,0xFF,0xFF,0x1B,0x80,0x86,0x84,0x05,0xFA,0x2F, +0x44,0x20,0x00,0xC5,0x84,0x61,0x49,0xFF,0xFF,0x13,0x80,0x87,0x84,0x05,0xFA,0x2F, +0x44,0x20,0x00,0xC6,0x84,0x61,0x49,0xFF,0xFF,0x0B,0x84,0x05,0xFA,0x2F,0x44,0x20, +0x00,0xC7,0x84,0x61,0x80,0x86,0x49,0xFF,0xFF,0x03,0xFC,0xA0,0x44,0x04,0x80,0x0A, +0x84,0x24,0xAE,0x40,0x44,0x17,0x21,0x04,0x46,0x38,0x00,0x00,0xB4,0x01,0x92,0x14, +0x40,0x00,0x50,0x08,0xB6,0x01,0x44,0x07,0x21,0x08,0xB4,0x20,0x92,0x28,0x40,0x10, +0xA0,0x08,0xB6,0x20,0xB4,0x40,0x46,0x1F,0xCF,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x8E, +0xB6,0x40,0xB4,0x40,0xFE,0x9F,0xB6,0x40,0x44,0x27,0x21,0x10,0xB4,0x02,0x94,0x01, +0x92,0x01,0xB6,0x02,0x44,0x27,0x21,0x14,0xB4,0x02,0x92,0x14,0x40,0x00,0x50,0x08, +0xB6,0x02,0x44,0x07,0x21,0x18,0xB4,0x40,0x92,0x48,0x40,0x21,0x20,0x08,0xB6,0x40, +0xB4,0x40,0xFE,0x56,0xB6,0x20,0xB4,0x20,0xFE,0x5F,0xB6,0x20,0x44,0x17,0x21,0x1C, +0xB4,0x01,0x92,0x11,0x40,0x00,0x44,0x08,0xB6,0x01,0xB4,0x41,0x46,0x0F,0x0F,0xFF, +0x50,0x00,0x0F,0xFF,0xFE,0x16,0xB6,0x01,0x44,0x17,0x21,0x00,0x46,0x0F,0xFF,0x0F, +0xB4,0x41,0x50,0x00,0x0F,0xFF,0xFE,0x16,0xB6,0x01,0x44,0x04,0x80,0x07,0x84,0x22, +0xAE,0x40,0x44,0x04,0x10,0x00,0x44,0x24,0x10,0x10,0xAE,0x42,0x84,0x21,0xAE,0x40, +0x84,0x20,0xAE,0x53,0xA6,0x43,0x54,0x10,0x80,0xFE,0xAE,0x43,0x44,0x04,0x10,0x0C, +0x84,0x20,0xB6,0x20,0x84,0x1F,0xAE,0x10,0xDD,0x9E,0x3C,0x0F,0xFD,0x3D,0xDD,0x9E, +0xC8,0x04,0x44,0x05,0x00,0x04,0xD5,0x03,0x44,0x05,0x00,0x14,0xA4,0x00,0x96,0x01, +0xDD,0x9E,0x44,0x04,0x80,0x00,0xA6,0x03,0x96,0x06,0xC0,0x0D,0x44,0x04,0x80,0x03, +0x84,0x21,0xAE,0x40,0x3C,0x0D,0xFD,0x3D,0xC0,0x06,0xFC,0x00,0x3C,0x0D,0xFD,0x3D, +0xDD,0x20,0xFC,0x80,0xDD,0x9E,0x46,0x20,0x00,0x81,0x84,0x3E,0x04,0x31,0x00,0x14, +0x96,0x06,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x14,0xDD,0x9E,0x44,0x14,0x70,0x08, +0x5A,0x08,0x01,0x09,0xB4,0x01,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x78,0x23, +0xD5,0x05,0xB4,0x01,0x92,0x10,0x40,0x00,0x40,0x08,0xB6,0x01,0xDD,0x9E,0x44,0x14, +0x00,0x0C,0xAE,0x09,0xDD,0x9E,0x44,0x05,0x10,0x00,0xB4,0x00,0x92,0x08,0x96,0x17, +0xDD,0x9E,0x44,0x25,0x10,0x00,0x96,0x17,0xB4,0x62,0x40,0x10,0x20,0x08,0x44,0x0F, +0xF8,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x24,0x80,0x84,0x96,0x06, +0xB4,0x62,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02, +0xDD,0x9E,0x44,0x25,0x10,0x00,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x0F, +0xB6,0x02,0xDD,0x9E,0x84,0x00,0x3E,0x07,0xF4,0xFA,0xDD,0x9E,0xFC,0x00,0x49,0x00, +0x09,0x1E,0x5A,0x08,0x01,0x04,0x84,0x02,0xD5,0x02,0x84,0x04,0x3E,0x07,0xE2,0xD7, +0x2E,0x07,0xE2,0xD7,0x49,0xFF,0xCB,0x34,0x84,0x04,0xFC,0x80,0xFC,0x00,0x3C,0x0D, +0xFB,0xD6,0x54,0x00,0x10,0x00,0xC0,0x08,0x2E,0x07,0xEF,0xA8,0x5A,0x00,0x01,0x1D, +0x2E,0x07,0xE2,0xD7,0xD5,0x0D,0x3C,0xF7,0xF7,0x92,0x2E,0x07,0xE2,0xD7,0x5E,0xF7, +0x80,0x64,0xE8,0x0C,0x3C,0xF7,0xF7,0x8E,0x5E,0xF7,0xFF,0x9D,0xE9,0x07,0xE4,0x03, +0xE8,0x03,0x8C,0x01,0xD5,0x06,0x84,0x04,0xD5,0x07,0xE4,0x03,0xE9,0x04,0x8E,0x01, +0x96,0x00,0xD5,0x02,0x84,0x02,0x3E,0x07,0xE2,0xD7,0x2E,0x07,0xE2,0xD7,0x49,0xFF, +0xCB,0x07,0x2E,0x07,0xE2,0xD7,0x5A,0x08,0x04,0x04,0x84,0x02,0xFC,0x80,0x84,0x04, +0xFC,0x80,0x2E,0x17,0xF4,0xFA,0x8C,0x21,0x96,0x48,0xE2,0x20,0x3E,0x17,0xF4,0xFA, +0x56,0x07,0x80,0x01,0xDD,0x9E,0xFC,0x42,0x81,0x40,0xC1,0x05,0x84,0xE8,0x5A,0x18, +0x01,0x07,0xD5,0x03,0x44,0x70,0x00,0x64,0x84,0xC1,0xD5,0x03,0x84,0xE1,0x84,0xC0, +0x49,0x00,0x1C,0x73,0x81,0x20,0x4E,0xA3,0x00,0x11,0x49,0xFF,0xC9,0x7B,0xF0,0x81, +0x49,0x00,0x1B,0x22,0xF0,0x82,0xF1,0x01,0x44,0x00,0x02,0x40,0xF2,0x02,0x80,0x66, +0x80,0x87,0x49,0x00,0x03,0x6F,0xFC,0xC2,0x5A,0xA8,0x01,0x1E,0x49,0x00,0x1B,0x17, +0xF0,0x82,0x4E,0x93,0x00,0x05,0x49,0x00,0x1C,0xD4,0xD5,0x03,0x49,0x00,0x1C,0xCE, +0xF0,0x81,0x80,0x09,0x49,0xFF,0xFC,0x1D,0xF0,0x83,0x44,0x10,0x00,0x42,0xF0,0x02, +0xF2,0x01,0xF3,0x03,0xFD,0x23,0x49,0x00,0x03,0x68,0xF0,0x01,0x44,0x10,0x00,0x42, +0x49,0xFF,0xC5,0x3D,0xFC,0xC2,0xFC,0x20,0x51,0xFF,0xFB,0x80,0x44,0x10,0x00,0xC0, +0x84,0x40,0x80,0xE0,0x50,0x0F,0x81,0x80,0x49,0x00,0x02,0xC8,0x80,0x1F,0x44,0x10, +0x00,0xC0,0x49,0x00,0x02,0xD2,0x84,0xC0,0x49,0xFF,0xCD,0x25,0xE6,0x03,0x50,0x0F, +0x81,0x80,0xE8,0x10,0x38,0x00,0x1A,0x02,0x90,0x08,0x96,0x43,0x38,0x0F,0x99,0x11, +0x50,0x00,0x7F,0xC0,0x94,0x05,0x9A,0x08,0x40,0x00,0x20,0x08,0x38,0x03,0x9A,0x0A, +0xD5,0x0C,0x38,0x10,0x1A,0x02,0x38,0x0F,0x99,0x11,0x90,0x28,0x96,0x4B,0x8A,0x20, +0x40,0x10,0xA0,0x08,0x38,0x13,0x9A,0x0A,0x8C,0xC1,0x5A,0x68,0xC0,0xDF,0x80,0x07, +0x80,0x26,0x84,0x40,0x44,0x30,0x02,0x52,0x49,0x00,0x03,0x00,0x51,0xFF,0x84,0x80, +0xFC,0xA0,0xFC,0x21,0x80,0xC0,0x2E,0x0F,0xF4,0xF9,0xC8,0x19,0x2E,0x1F,0xF4,0xF8, +0xC9,0x16,0xCE,0x42,0x49,0xFF,0xF9,0x16,0x49,0xFF,0xFB,0xC3,0x80,0xE0,0x49,0x00, +0x1B,0xF4,0x49,0xFF,0xC8,0xFF,0x80,0x26,0x38,0x23,0x85,0x11,0x40,0x21,0x20,0x08, +0x38,0x20,0x06,0x0A,0x8C,0x21,0x5A,0x1A,0x40,0xF9,0xD5,0x2E,0x2E,0x17,0xEF,0x18, +0xE0,0x20,0xE9,0x2A,0x2E,0xFF,0xF4,0xF8,0x2E,0x17,0xEF,0x17,0xE0,0x2F,0xE9,0x24, +0xCE,0x23,0x49,0x00,0x1A,0x8E,0xF0,0x81,0x49,0xFF,0xCC,0xCD,0xE6,0x03,0xE9,0x04, +0xF0,0x01,0x49,0xFF,0xCE,0x66,0x3C,0x14,0x05,0xAF,0xF5,0x01,0x84,0x03,0xFE,0x44, +0x50,0x22,0x84,0x80,0xD5,0x33,0x8C,0x01,0x5A,0x00,0x12,0x2E,0x38,0xF2,0x81,0x11, +0xE0,0x2F,0xE8,0xFA,0x84,0x00,0x3E,0x07,0xF4,0xF8,0x49,0x00,0x1A,0x61,0x84,0x00, +0x84,0x21,0x49,0xFF,0xFF,0x3A,0x2E,0x1F,0xF4,0xF9,0x2E,0x07,0xEF,0x18,0xE0,0x01, +0xE9,0x07,0x2E,0x0F,0xF4,0xF8,0x2E,0x27,0xEF,0x17,0xE0,0x40,0xE8,0x0A,0x5A,0x68, +0x01,0x11,0x84,0x00,0x3E,0x07,0xF4,0xF9,0x3E,0x07,0xF4,0xF8,0x80,0x06,0xD5,0x10, +0x5A,0x68,0x01,0x08,0x8C,0x21,0x8C,0x01,0x3E,0x17,0xF4,0xF9,0x3E,0x07,0xF4,0xF8, +0x84,0x00,0xD5,0x06,0x50,0x52,0x80,0x24,0xD2,0xD9,0x84,0x00,0xD5,0xD0,0xFC,0xA1, +0x44,0x04,0x00,0x54,0x46,0x1C,0x9A,0xE7,0xB4,0xA0,0x50,0x10,0x83,0xDB,0xD1,0x27, +0x46,0x18,0x88,0x88,0x50,0x10,0x88,0x88,0xD9,0x08,0x44,0x15,0x10,0x10,0xB4,0x21, +0x40,0x10,0xA0,0x08,0xC1,0x1C,0xD5,0x06,0x46,0x1F,0x38,0xA9,0x50,0x10,0x84,0xEF, +0xD9,0x0D,0x46,0x14,0xE1,0xD5,0x50,0x10,0x8C,0x63,0xB6,0x20,0x2E,0x07,0xF4,0xFB, +0x58,0x00,0x00,0x01,0x3E,0x07,0xF4,0xFB,0xDD,0x9E,0x46,0x1A,0x67,0xC9,0x50,0x10, +0x8D,0xFE,0xD9,0x05,0x46,0x1B,0xEE,0xFF,0x8C,0x2D,0xB6,0x20,0xDD,0x9E,0x4E,0x05, +0x00,0x19,0x8E,0x01,0x40,0x10,0x04,0x0A,0xFE,0x0F,0x40,0x10,0x08,0x0A,0xFE,0x0F, +0x40,0x10,0x10,0x0A,0xFE,0x0F,0x40,0x10,0x20,0x0A,0xFE,0x0F,0x40,0x10,0x40,0x0A, +0xFE,0x47,0x8C,0x21,0x84,0x00,0x90,0x21,0xC1,0x03,0x8C,0x01,0xD5,0xFD,0xDD,0x9E, +0x84,0x00,0xDD,0x9E,0xFC,0x4D,0x44,0x02,0x00,0xD4,0x50,0xFF,0x80,0x18,0x80,0xC0, +0x80,0x2F,0x3A,0x23,0x14,0x04,0x3A,0x20,0x94,0x24,0x81,0x46,0x83,0x81,0x3A,0x25, +0x14,0x04,0x44,0x92,0x00,0xFC,0x3A,0x2E,0x14,0x24,0x80,0x89,0x3A,0x25,0x0C,0x00, +0x80,0xBF,0x3A,0x2E,0x0C,0x20,0x3A,0x22,0x0C,0x04,0x3A,0x22,0x8C,0x24,0x45,0xE2, +0x16,0xF8,0xA5,0xE0,0x3A,0x27,0x94,0x04,0x81,0xFE,0x81,0x1F,0x3A,0x27,0x94,0x24, +0x3A,0x20,0x94,0x04,0x80,0x2F,0x3A,0x20,0x94,0x24,0x3A,0x2E,0x0C,0x00,0x3A,0x20, +0x8C,0x20,0x44,0x12,0x16,0xEC,0x3A,0x24,0x0C,0x04,0x3A,0x20,0x8C,0x24,0xAD,0xC8, +0xB0,0x50,0x3A,0x20,0x14,0x04,0x80,0x01,0x3A,0x20,0x14,0x24,0x81,0x00,0x3A,0x23, +0x14,0x04,0x3A,0x24,0x14,0x24,0xB1,0x83,0x3A,0x25,0x0C,0x00,0x80,0x86,0x3A,0x24, +0x0C,0x20,0x3A,0x24,0x8C,0x04,0x44,0x92,0x04,0xD4,0x3A,0x22,0x0C,0x24,0x3A,0x20, +0x94,0x04,0x80,0x29,0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x04,0x80,0x01,0x3A,0x20, +0x14,0x24,0x3A,0x24,0x0C,0x00,0x3A,0x20,0x0C,0x20,0x44,0x02,0x04,0xC8,0x3A,0x23, +0x0C,0x04,0x3A,0x20,0x0C,0x24,0xAD,0xC0,0xFC,0xCD,0xFC,0x48,0x83,0x81,0x50,0xAF, +0x80,0x14,0x44,0x12,0x01,0x08,0x80,0xC0,0x80,0x0A,0x81,0x22,0x3A,0x20,0x8C,0x04, +0x3A,0x20,0x0C,0x24,0xA4,0x48,0xFA,0x40,0xAC,0x40,0x50,0x8F,0x80,0x30,0x84,0x20, +0xB0,0x08,0x49,0x00,0x27,0xC1,0x80,0x08,0x84,0x20,0xFA,0x40,0x49,0x00,0x27,0xBC, +0x5A,0x98,0x01,0x03,0x87,0x80,0xC6,0x04,0x44,0x12,0x17,0x9C,0xD5,0x03,0x44,0x12, +0x17,0xA8,0x58,0x04,0x80,0x01,0x8C,0x01,0x84,0xE0,0xB6,0x1F,0x8D,0x21,0x84,0x83, +0x84,0x61,0x38,0x05,0x1C,0x00,0xF3,0x83,0xF4,0x82,0x38,0x60,0x80,0x00,0xB4,0x1F, +0x8C,0xC1,0xFF,0x84,0x97,0xB1,0x40,0x63,0x24,0xD6,0x80,0x06,0xF1,0x81,0x49,0xFF, +0xFF,0x48,0xF4,0x02,0x97,0x78,0x40,0x52,0x90,0xB7,0xF3,0x03,0x38,0x24,0x16,0x02, +0x8C,0x08,0x41,0xE1,0x28,0x08,0x40,0x20,0x70,0x01,0x40,0x01,0x80,0x0C,0x40,0x60, +0x18,0xD7,0xB0,0x08,0x94,0x94,0x38,0x00,0x16,0x02,0x88,0x5E,0x40,0x00,0x28,0x08, +0x88,0xC0,0xB0,0x08,0x8C,0xE1,0x38,0x24,0x16,0x0A,0x38,0x60,0x16,0x0A,0xF1,0x01, +0x5A,0x78,0x0A,0xD1,0x80,0x28,0x49,0xFF,0xC0,0x52,0xFC,0xC8,0x80,0x80,0x84,0x40, +0x9A,0xE0,0x96,0xD8,0xE2,0x61,0xE8,0x08,0x08,0x32,0x00,0x01,0xE2,0x62,0x40,0x31, +0x3C,0x1B,0x80,0x43,0xD5,0xF6,0x9C,0x11,0x96,0x00,0xDD,0x9E,0xFC,0x40,0x51,0xFF, +0xFB,0xE0,0x44,0x20,0x04,0x00,0x81,0x40,0x81,0x21,0xB0,0x08,0x84,0x20,0x49,0x00, +0x27,0x5B,0xB1,0x81,0x44,0x12,0x01,0x08,0x80,0x06,0x3A,0x20,0x8C,0x04,0x3A,0x20, +0x0C,0x24,0xA4,0x48,0xB1,0xC4,0xAC,0x40,0xFA,0x40,0x84,0x20,0x80,0x07,0x49,0x00, +0x27,0x4B,0x84,0x2A,0x4E,0xA3,0x00,0x3D,0x44,0x02,0x17,0xA8,0x49,0xFF,0xFF,0xD0, +0x80,0x20,0x80,0x4A,0x84,0xA3,0x44,0xA2,0x16,0xF8,0x45,0xE2,0x16,0xEC,0x96,0x10, +0x40,0x00,0x14,0x17,0x40,0x30,0x20,0x08,0xB1,0x08,0x41,0xC2,0x0C,0x00,0x84,0x60, +0x54,0x81,0x80,0xFF,0xE3,0x01,0xE8,0x12,0x38,0x83,0x08,0x00,0x38,0x85,0x22,0x02, +0x38,0x84,0x0D,0x01,0x54,0xF4,0x03,0xFF,0x38,0x8E,0x0E,0x02,0x40,0x84,0x28,0x08, +0x89,0x0F,0x38,0x8E,0x0E,0x0A,0x8C,0x61,0xD5,0xEC,0x38,0x33,0x08,0x00,0x8C,0x41, +0x38,0x3F,0x0C,0x00,0x8A,0x69,0x54,0x81,0x83,0xFF,0x38,0x33,0x82,0x02,0x40,0x31, +0xA8,0x08,0x88,0x68,0x38,0x33,0x82,0x0A,0x5A,0x28,0x0A,0xD3,0xD5,0x3B,0x44,0x02, +0x17,0x9C,0x49,0xFF,0xFF,0x95,0x80,0x20,0x84,0x40,0x84,0xA3,0x44,0xA2,0x04,0xD4, +0x45,0xE2,0x04,0xC8,0x97,0x10,0x40,0x42,0x14,0x97,0x40,0x32,0x20,0x08,0xB0,0x08, +0x41,0xC0,0x0C,0x00,0x84,0x60,0x54,0x81,0x80,0xFF,0xE3,0x01,0xE8,0x12,0x38,0x83, +0x08,0x00,0x38,0x85,0x22,0x02,0x38,0x84,0x0D,0x01,0x54,0xF4,0x03,0xFF,0x38,0x8E, +0x0E,0x02,0x40,0x84,0x28,0x08,0x89,0x0F,0x38,0x8E,0x0E,0x0A,0x8C,0x61,0xD5,0xEC, +0x38,0x33,0x08,0x00,0x8C,0x41,0x38,0x3F,0x0C,0x00,0x8A,0x69,0x54,0x81,0x83,0xFF, +0x38,0x33,0x92,0x02,0x40,0x31,0xA8,0x08,0x88,0x68,0x38,0x33,0x92,0x0A,0x5A,0x28, +0x0A,0xD3,0xB0,0x08,0x49,0xFF,0xBF,0xFA,0x80,0x07,0x49,0xFF,0xC0,0x30,0x51,0xFF, +0x84,0x20,0xFC,0xC0,0xFC,0x00,0x49,0x00,0x18,0x8C,0x50,0x30,0x04,0x80,0x50,0x50, +0x00,0x22,0x50,0x20,0x00,0x10,0x80,0x20,0x22,0x40,0x80,0x00,0x22,0x62,0x80,0x00, +0x1A,0x60,0x80,0x01,0x1A,0x42,0xFF,0xFF,0xDA,0xF8,0x50,0x00,0x00,0x24,0x4C,0x01, +0xFF,0xF0,0xFC,0x80,0xFC,0x00,0x49,0x00,0x18,0x74,0x50,0x20,0x04,0x5C,0x50,0x40, +0x02,0x40,0x50,0x30,0x00,0x24,0x80,0x22,0x22,0x60,0x80,0x00,0x22,0x50,0x00,0x00, +0x1A,0x60,0x00,0x01,0x1A,0x50,0x80,0x01,0x4C,0x01,0xFF,0xF8,0x50,0x21,0x7F,0xDC, +0x4C,0x02,0x7F,0xF1,0xFC,0x80,0xFC,0x41,0x80,0xE0,0x80,0x02,0xF3,0x81,0x81,0x44, +0x80,0xC5,0x81,0x21,0x49,0xFF,0xF9,0x6D,0x81,0x00,0xF0,0x01,0x49,0xFF,0xC6,0xAA, +0x40,0x44,0x28,0x00,0x95,0x72,0x84,0x60,0x84,0x20,0x98,0x99,0x96,0x91,0xC7,0x0B, +0x95,0x92,0x88,0xC5,0x38,0xA2,0x09,0x01,0x38,0x60,0x18,0x02,0x90,0xC8,0x8A,0xCA, +0x38,0x63,0x89,0x09,0x4E,0x92,0x00,0x06,0x38,0x62,0x09,0x11,0x38,0x64,0x89,0x09, +0x8C,0x21,0x5A,0x18,0x12,0xEC,0x8C,0x72,0x96,0xD9,0x5A,0x3A,0x40,0xE7,0x49,0xFF, +0xFF,0xA3,0x49,0xFF,0xFF,0xB9,0xFC,0xC1,0xFC,0x00,0x80,0x43,0x80,0x64,0x84,0x80, +0x80,0xA4,0x49,0xFF,0xFF,0xCA,0xFC,0x80,0xFC,0x20,0xFD,0x30,0x80,0x02,0x49,0xFF, +0xC6,0x79,0x95,0xFA,0x80,0xA6,0x88,0xE6,0x50,0x00,0x09,0x48,0xD7,0x04,0xA2,0x41, +0xAA,0x69,0xD5,0xFD,0xFC,0xA0,0xFC,0x20,0xFD,0x30,0x84,0x00,0x49,0xFF,0xF9,0x29, +0x95,0xF9,0x80,0xA6,0x88,0xE6,0x50,0x00,0x04,0xA4,0xD7,0x06,0x2A,0x10,0x00,0x01, +0x1A,0x12,0x80,0x01,0xD5,0xFB,0xFC,0xA0,0xFC,0x20,0x80,0xE0,0x80,0x02,0x80,0xC1, +0x49,0xFF,0xC6,0x58,0x84,0x40,0x96,0x51,0xE2,0x26,0xE8,0x07,0x38,0x10,0x0A,0x02, +0x38,0x13,0x8A,0x0A,0x8C,0x41,0xD5,0xF8,0xFC,0xA0,0xFC,0x40,0x80,0xC0,0x80,0x02, +0x81,0x23,0x80,0xE1,0x49,0xFF,0xF9,0x05,0x81,0x40,0x84,0x6C,0x5A,0x98,0x02,0x07, +0x49,0x00,0x19,0x30,0x84,0x63,0xC0,0x02,0x80,0x69,0x80,0x0A,0x40,0x91,0x84,0x08, +0x84,0x20,0x40,0xA1,0x80,0x13,0x96,0x89,0xE2,0x47,0xE8,0x1E,0x84,0xA0,0x80,0x85, +0x40,0x82,0x80,0x13,0xE3,0x0A,0xE8,0x06,0x38,0x80,0x15,0x11,0x8C,0xA1,0x88,0x88, +0xD5,0xF8,0x5C,0xF1,0x00,0x40,0x40,0x42,0x0C,0x96,0xE8,0x09,0x54,0x51,0x00,0x01, +0x95,0x6D,0x92,0x41,0x88,0x45,0x38,0x43,0x09,0x09,0xD5,0x03,0x38,0x43,0x05,0x09, +0x8C,0x21,0x88,0x09,0xD5,0xE1,0xFC,0xC0,0xFC,0x40,0x81,0x20,0x95,0x9A,0x80,0x02, +0x80,0xE1,0x97,0xB1,0x49,0xFF,0xC6,0x0E,0x88,0xC0,0x84,0x40,0x96,0x51,0xE2,0x27, +0xE8,0x07,0x38,0x04,0x8A,0x02,0x38,0x03,0x0A,0x0A,0x8C,0x41,0xD5,0xF8,0xFC,0xC0, +0xFC,0x00,0x94,0x02,0x88,0x01,0x4C,0x10,0x00,0x0F,0xB4,0xC1,0x2A,0x51,0x00,0x01, +0x40,0x52,0xA0,0x08,0x8A,0xA6,0xFF,0xA4,0x42,0x61,0x94,0x73,0x40,0x63,0x10,0xD6, +0xAB,0x89,0xD5,0xF2,0xFC,0x80,0xFC,0x40,0x84,0xE0,0x97,0xB9,0xE2,0xC1,0xE8,0x12, +0x38,0x91,0x9E,0x02,0xB4,0xC0,0x40,0x94,0xA0,0x08,0x8B,0x26,0xFF,0xAC,0x42,0x62, +0x24,0x73,0x40,0x63,0x14,0xD6,0xAB,0x81,0x90,0xC8,0x38,0x61,0x1D,0x09,0x8C,0xE1, +0xD5,0xED,0xFC,0xC0,0x2E,0x07,0xF6,0x23,0xDD,0x9E,0xFC,0x01,0x84,0x1F,0xB6,0x1F, +0xF0,0x81,0x80,0x1F,0x49,0xFF,0xC1,0xB2,0x84,0x01,0x49,0xFF,0xC1,0xA4,0x84,0x01, +0x49,0xFF,0xC2,0x1A,0x84,0x22,0x84,0x01,0x80,0x61,0x80,0xA0,0x44,0x40,0x00,0x3F, +0x84,0x44,0x49,0xFF,0xC1,0x1D,0x84,0x01,0x49,0xFF,0xF7,0xE7,0x84,0x01,0x80,0x20, +0x80,0x40,0x49,0xFF,0xC1,0x5A,0x84,0x0A,0x49,0xFF,0xC1,0x82,0x46,0x00,0x42,0x10, +0x50,0x00,0x08,0x20,0x80,0x20,0x84,0x40,0x49,0xFF,0xC1,0x6D,0x49,0xFF,0xC3,0xD0, +0x84,0x01,0x49,0xFF,0xC3,0xBF,0x84,0x00,0x49,0xFF,0xF8,0x3E,0x44,0x04,0x55,0x08, +0x44,0x1F,0xFF,0x7F,0xB4,0x40,0xFE,0x56,0xB6,0x20,0xB4,0x20,0x58,0x10,0x80,0x10, +0xB6,0x20,0x84,0x21,0x49,0xFF,0xC0,0x7B,0x84,0x06,0x3E,0x07,0xF6,0x23,0xFC,0x81, +0xFC,0x54,0x44,0x02,0x01,0x20,0x50,0xAF,0x80,0x10,0x80,0x20,0x80,0x8A,0x3A,0x20, +0x8C,0x04,0x3A,0x22,0x0C,0x24,0x50,0x9F,0x80,0x1C,0xA4,0x48,0x3A,0x20,0x0C,0x04, +0x80,0x09,0xF1,0x81,0x3A,0x20,0x0C,0x24,0x44,0x12,0x01,0x2C,0xB0,0x0A,0x80,0xC0, +0x3A,0x20,0x94,0x04,0x3A,0x23,0x14,0x24,0xB4,0x21,0xB1,0x94,0xF1,0x83,0x44,0x12, +0x01,0x40,0x81,0xE1,0xF1,0x82,0x3A,0x27,0x94,0x04,0x3A,0x23,0x14,0x24,0x81,0x0F, +0x83,0xC6,0x3A,0x24,0x14,0x04,0x3A,0x2F,0x14,0x24,0x83,0x86,0xB1,0xCF,0x44,0x62, +0x01,0x68,0x3A,0x24,0x0C,0x00,0x80,0x27,0x3A,0x2F,0x0C,0x20,0x3A,0x23,0x14,0x04, +0x3A,0x20,0x94,0x24,0xB4,0x46,0x50,0x14,0x7F,0xE0,0xB1,0x9E,0xF2,0x82,0x3A,0x20, +0x94,0x04,0x80,0x26,0x3A,0x20,0x94,0x24,0x3A,0x27,0x94,0x04,0x81,0xE1,0x3A,0x27, +0x94,0x24,0x3A,0x24,0x0C,0x00,0x3A,0x27,0x8C,0x20,0x44,0x82,0x17,0x4C,0x3A,0x23, +0x94,0x04,0x3A,0x24,0x14,0x24,0xF3,0x02,0x44,0x72,0x17,0x24,0xB6,0x68,0x3A,0x23, +0x14,0x04,0x80,0xC7,0x3A,0x23,0x14,0x24,0x3A,0x20,0x94,0x04,0x80,0x26,0x44,0x62, +0x17,0x60,0x3A,0x20,0x94,0x24,0x3A,0x27,0x8C,0x00,0x3A,0x20,0x8C,0x20,0x44,0x12, +0x17,0xA8,0x3A,0x25,0x0C,0x04,0x3A,0x20,0x8C,0x24,0x80,0x41,0x02,0x1F,0x80,0x02, +0xAC,0x50,0x44,0x12,0x17,0x9C,0x3A,0x24,0x8C,0x04,0x3A,0x20,0x8C,0x24,0x80,0x41, +0x02,0x1F,0x80,0x02,0xAC,0x50,0x44,0x12,0x17,0x88,0x3A,0x20,0x14,0x04,0x80,0x01, +0xF1,0x03,0x3A,0x20,0x14,0x24,0xB6,0x20,0xB0,0x14,0x80,0x26,0x3A,0x20,0x14,0x04, +0x3A,0x20,0x94,0x24,0x80,0x01,0x3A,0x2E,0x14,0x04,0x3A,0x20,0x14,0x24,0x3A,0x2F, +0x0C,0x00,0x3A,0x20,0x0C,0x20,0xFC,0xD4,0xFC,0x00,0x49,0xFF,0xC0,0x40,0xFC,0x80, +0xFC,0x00,0xC8,0x06,0x44,0x02,0x17,0x60,0x44,0x12,0x17,0x88,0xD5,0x05,0x44,0x02, +0x17,0x24,0x44,0x12,0x17,0x4C,0x49,0xFF,0xC1,0x2C,0xFC,0x80,0xFC,0x00,0x49,0x00, +0x16,0x9C,0x80,0xC0,0x49,0x00,0x07,0xB8,0xC0,0x74,0x2E,0x07,0xF6,0x23,0xAC,0x30, +0x49,0x00,0x17,0xD0,0x2E,0x17,0xF6,0x23,0xC8,0x04,0x44,0x02,0x17,0x60,0xD5,0x03, +0x44,0x02,0x17,0x24,0x38,0x00,0x05,0x11,0x46,0x10,0x00,0x81,0xAC,0x31,0x3C,0x03, +0xFA,0x99,0x44,0x32,0x17,0xB8,0xAC,0x32,0x3C,0x03,0xFA,0xE3,0xAC,0x33,0x2E,0x07, +0xF6,0x1B,0x50,0x00,0x00,0x64,0xAC,0x34,0x2E,0x07,0xF6,0x1A,0x50,0x00,0x00,0xC8, +0xAC,0x35,0x2E,0x07,0xF6,0x19,0x50,0x00,0x01,0x2C,0xAC,0x36,0x3C,0x0D,0xF8,0xEB, +0xAC,0x37,0x83,0x81,0xB8,0x20,0x54,0x00,0x07,0xFF,0x12,0x03,0x00,0x08,0xB8,0x23, +0x50,0x13,0x00,0x16,0x96,0x1F,0x12,0x03,0x00,0x09,0x44,0x0F,0xFF,0x9C,0x12,0x03, +0x00,0x0A,0x84,0x00,0x38,0x21,0x82,0x02,0x8C,0x01,0x1A,0x20,0x80,0x01,0x5A,0x08, +0x14,0xFB,0x3C,0x03,0xF7,0xBC,0x12,0x03,0x00,0x0B,0x3C,0x03,0xF7,0xBD,0x12,0x03, +0x00,0x0C,0x3C,0x03,0xF7,0xBE,0x12,0x03,0x00,0x0D,0x3C,0x03,0xF9,0xF5,0x12,0x03, +0x00,0x21,0x3C,0x03,0xF9,0xF4,0x12,0x03,0x00,0x22,0x44,0x00,0x03,0x78,0x12,0x03, +0x00,0x23,0x2E,0x07,0xF6,0x1D,0x12,0x03,0x00,0x24,0x2E,0x07,0xE2,0xCC,0x12,0x03, +0x00,0x25,0x2E,0x07,0xF5,0xC5,0x12,0x03,0x00,0x26,0x49,0x00,0x17,0x6B,0x12,0x03, +0x00,0x27,0x84,0x00,0x12,0x03,0x00,0x28,0x12,0x03,0x00,0x29,0x12,0x03,0x00,0x2A, +0xFC,0x80,0xFC,0x00,0x49,0xFF,0xC0,0x0B,0x49,0xFF,0xF6,0xA3,0x84,0x00,0xFC,0x80, +0x84,0x00,0x3E,0x07,0xF5,0xC5,0x3E,0x07,0xF5,0xC4,0xDD,0x9E,0xFC,0x00,0x80,0x41, +0x84,0x20,0x5A,0x08,0x01,0x03,0x84,0x24,0xCA,0x04,0x44,0x02,0x17,0xA8,0xD5,0x03, +0x44,0x02,0x17,0x9C,0x49,0xFF,0xC2,0xD1,0xFC,0x80,0xFC,0x00,0x80,0xC0,0x5A,0x08, +0x01,0x0B,0x84,0x02,0x49,0xFF,0xC2,0x4D,0x80,0x06,0x84,0x20,0x49,0xFF,0xC2,0x7A, +0x80,0x06,0xD5,0x09,0x84,0x00,0x49,0xFF,0xC2,0x44,0x84,0x00,0x80,0x20,0x49,0xFF, +0xC2,0x71,0x84,0x00,0x49,0xFF,0xC2,0xA3,0xFC,0x80,0xFC,0x01,0xB6,0x1F,0xF1,0x81, +0x49,0xFF,0xFF,0xE5,0xB4,0x1F,0xF1,0x01,0x49,0xFF,0xFF,0xD2,0xFC,0x81,0xFC,0x23, +0x80,0xE0,0xC8,0x04,0x84,0xA4,0x84,0x23,0xD5,0x03,0x84,0xA6,0x84,0x22,0x84,0x40, +0x8E,0xA1,0x80,0x62,0x80,0x82,0x84,0x02,0x97,0x68,0x49,0xFF,0xF6,0x89,0x44,0x22, +0x01,0x7C,0x80,0xC2,0x80,0x3F,0x3A,0x23,0x14,0x04,0x3A,0x20,0x94,0x24,0x3A,0x23, +0x0C,0x00,0x3A,0x20,0x8C,0x20,0x80,0x1F,0x49,0xFF,0xC0,0xF4,0x84,0x00,0x49,0xFF, +0xC4,0x34,0x84,0x0C,0x49,0xFF,0xC4,0x5C,0xE6,0xE2,0xE8,0x05,0x84,0x01,0x80,0x27, +0x49,0xFF,0xFF,0xCD,0xFC,0xA3,0xFC,0x00,0x84,0x46,0xC8,0x02,0x84,0x44,0x84,0x20, +0x3E,0x17,0xF6,0x1D,0x50,0x11,0x00,0x13,0x40,0x10,0x88,0x36,0x3E,0x17,0xF6,0x1E, +0x49,0xFF,0xFF,0xC7,0x84,0x02,0x49,0x00,0x15,0x0E,0xFC,0x80,0xFC,0x49,0x80,0xE0, +0x44,0x02,0x00,0x01,0xF0,0x86,0x44,0x01,0x00,0x02,0xF0,0x87,0x44,0x00,0x80,0x04, +0xF0,0x88,0x44,0x00,0x40,0x08,0xF0,0x89,0x44,0x00,0x20,0x10,0xF0,0x8A,0x44,0x00, +0x10,0x20,0xF0,0x8B,0x44,0x00,0x08,0x40,0xF0,0x8C,0x44,0x00,0x04,0x80,0xF0,0x8D, +0x44,0x00,0x03,0x00,0xF0,0x8E,0x3C,0x0D,0xF8,0xEA,0xF0,0x8F,0xF0,0x90,0xF0,0x91, +0xC7,0x08,0x44,0x92,0x17,0x4C,0x44,0xA2,0x17,0x24,0x85,0x02,0x87,0x85,0xD5,0x07, +0x85,0x03,0x44,0x92,0x17,0x88,0x44,0xA2,0x17,0x60,0x83,0x88,0xB0,0x06,0x49,0xFF, +0xC0,0x6B,0x80,0xDF,0xCF,0x11,0x44,0x02,0x01,0x94,0x80,0x3F,0x3A,0x20,0x14,0x04, +0x3A,0x20,0x94,0x24,0x3A,0x20,0x0C,0x00,0x3A,0x20,0x8C,0x20,0x80,0x1F,0x49,0xFF, +0xC0,0x91,0x80,0x07,0xD5,0x10,0x44,0x02,0x01,0xAC,0x80,0x3F,0x3A,0x20,0x14,0x04, +0x3A,0x20,0x94,0x24,0x3A,0x20,0x0C,0x00,0x3A,0x20,0x8C,0x20,0x80,0x1F,0x49,0xFF, +0xC0,0x81,0x84,0x01,0x49,0x00,0x15,0x7B,0x2E,0x47,0xF6,0x23,0x84,0x00,0x80,0x4A, +0x80,0x69,0x80,0xA4,0x80,0x20,0x49,0xFF,0xF5,0xFB,0x2E,0x17,0xF6,0x23,0x84,0x00, +0x38,0x15,0x05,0x01,0x49,0xFF,0xC1,0x14,0x2E,0x17,0xF6,0x23,0x84,0x05,0x38,0x15, +0x05,0x01,0x49,0xFF,0xC1,0x0D,0x2E,0x07,0xF6,0x23,0x84,0x20,0x38,0x04,0x80,0x00, +0x49,0xFF,0xC2,0x09,0x2E,0x07,0xF6,0x23,0x84,0x23,0x38,0x04,0x80,0x00,0x49,0xFF, +0xC2,0x02,0x44,0x00,0x02,0x40,0x49,0xFF,0xC3,0x98,0x80,0x08,0x49,0xFF,0xC3,0xC0, +0xE6,0xE2,0xE8,0x07,0x2E,0x07,0xF6,0x23,0x40,0xFE,0x00,0x06,0x84,0x01,0xE8,0x02, +0x84,0x00,0x80,0x27,0x49,0xFF,0xFF,0x2B,0xFC,0xC9,0xFC,0x00,0x2E,0x17,0xEF,0x92, +0x2E,0x07,0xEF,0x93,0xE6,0x23,0xE8,0x03,0x84,0x20,0xD5,0x06,0xE6,0x3D,0xE9,0x03, +0xFA,0x2B,0xD5,0x02,0x8E,0x22,0x3E,0x17,0xF6,0x18,0xE6,0x09,0x84,0x29,0x40,0x10, +0x04,0x17,0xE9,0x03,0x52,0x00,0x00,0x08,0x96,0x00,0xC0,0x0E,0x5A,0x00,0x08,0x11, +0x5A,0x00,0x01,0x07,0x9E,0x42,0x96,0x48,0x5A,0x00,0x07,0x0F,0xD5,0x02,0x84,0x20, +0x9C,0xC2,0x96,0xD8,0xD5,0x0B,0x84,0x62,0x84,0x01,0x84,0x20,0xD5,0x07,0x80,0x60, +0x84,0x26,0x84,0x07,0xD5,0x03,0x84,0x68,0x84,0x25,0x84,0x41,0x40,0x51,0x00,0x0C, +0x40,0x41,0x04,0x0C,0xFF,0x2F,0x52,0x10,0x80,0x11,0x40,0x51,0x0C,0x0C,0xFF,0x2F, +0x40,0x11,0x04,0x0C,0x52,0x00,0x00,0x11,0xFE,0x67,0x40,0x01,0x00,0x0C,0xFE,0x0F, +0x52,0x11,0x80,0x11,0x40,0x11,0x04,0x0C,0xFE,0x0F,0x2E,0x17,0xF6,0x18,0x3C,0x0F, +0xF8,0xEA,0xFA,0x0F,0x40,0x00,0x04,0x0C,0x80,0x20,0x84,0x40,0x49,0xFF,0xBE,0xD3, +0xFC,0x80,0xFC,0x49,0xC1,0x07,0x44,0x92,0x17,0x24,0x85,0x42,0x44,0x72,0x17,0x4C, +0xD5,0x06,0x44,0x92,0x17,0x60,0x85,0x43,0x44,0x72,0x17,0x88,0x5A,0x08,0x03,0x32, +0xB1,0x86,0x44,0x12,0x01,0xC4,0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24, +0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x00,0x44,0x12,0x01,0x7C, +0x3A,0x20,0x14,0x20,0x80,0x1F,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20, +0x8C,0x00,0x3A,0x20,0x0C,0x20,0x2E,0x47,0xF6,0x23,0x84,0x20,0x80,0x49,0x80,0x67, +0x80,0xA4,0x84,0x01,0x49,0xFF,0xF5,0x44,0x80,0x06,0x49,0xFF,0xBF,0x85,0x80,0x1F, +0x49,0xFF,0xBF,0xB8,0x84,0x00,0x49,0xFF,0xC2,0xF8,0x81,0x5F,0x84,0x0C,0xD5,0x35, +0x5A,0x08,0x02,0x36,0xB1,0x86,0x44,0x12,0x01,0xF4,0x81,0x06,0x3A,0x20,0x94,0x04, +0x3A,0x24,0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x24,0x14,0x24,0x3A,0x20,0x94,0x00, +0x44,0x12,0x01,0x94,0x81,0xFF,0x3A,0x24,0x14,0x20,0x3A,0x20,0x94,0x04,0x3A,0x27, +0x94,0x24,0x3A,0x20,0x8C,0x00,0x3A,0x27,0x8C,0x20,0x49,0x00,0x14,0x90,0x2E,0x47, +0xF6,0x23,0x84,0x00,0x80,0x20,0x80,0x49,0x80,0x67,0x80,0xA4,0x49,0xFF,0xF5,0x10, +0x80,0x06,0x49,0xFF,0xBF,0x51,0x80,0x1F,0x49,0xFF,0xBF,0x84,0x44,0x00,0x02,0x40, +0x49,0xFF,0xC2,0xC3,0x81,0x1F,0x80,0x0A,0x49,0xFF,0xC2,0xEA,0xFC,0xC9,0xFC,0x49, +0x44,0x12,0x01,0xF4,0xB1,0x86,0x80,0xE0,0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20, +0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x00,0x3A,0x20, +0x14,0x20,0xC7,0x07,0x44,0x82,0x17,0x24,0x85,0x22,0x44,0xA2,0x17,0x4C,0xD5,0x06, +0x44,0x82,0x17,0x60,0x85,0x23,0x44,0xA2,0x17,0x88,0x84,0x00,0x49,0x00,0x14,0x57, +0x2E,0x47,0xF6,0x23,0x84,0x00,0x80,0x20,0x80,0x48,0x80,0x6A,0x80,0xA4,0x49,0xFF, +0xF4,0xD7,0x80,0x06,0x49,0xFF,0xBF,0x18,0x44,0x00,0x02,0x40,0x49,0xFF,0xC2,0x8D, +0x80,0x09,0x49,0xFF,0xC2,0xB5,0x46,0x00,0x42,0x10,0x50,0x00,0x08,0x20,0x80,0x20, +0x84,0x40,0x49,0xFF,0xBE,0x20,0x80,0x1F,0xCF,0x04,0x44,0x12,0x01,0x94,0xD5,0x03, +0x44,0x12,0x01,0xAC,0x80,0xC0,0x3A,0x20,0x94,0x04,0x3A,0x23,0x14,0x24,0x3A,0x20, +0x8C,0x00,0x3A,0x23,0x0C,0x20,0x49,0xFF,0xBF,0x2D,0xFC,0xC9,0xDD,0x9E,0xFC,0x45, +0x80,0xE0,0xF1,0x81,0x80,0xC2,0xF3,0x87,0xF4,0x88,0x49,0xFF,0xF2,0x53,0xB6,0x1F, +0xCF,0x08,0xF0,0x01,0x44,0x80,0x02,0x40,0x85,0x41,0x85,0x22,0xC8,0x11,0xD5,0x07, +0x5A,0x78,0x02,0x08,0xF0,0x01,0xC8,0x09,0x81,0x00,0x85,0x44,0x85,0x23,0xD5,0x08, +0x85,0x00,0x81,0x48,0x81,0x28,0xD5,0x04,0x85,0x00,0x85,0x46,0x81,0x27,0x49,0x00, +0x15,0x1C,0xC8,0x04,0x49,0x00,0x15,0x95,0xD5,0x03,0x49,0x00,0x15,0x8F,0x80,0xE0, +0xB4,0x1F,0x49,0xFF,0xF4,0xDE,0x40,0x14,0x04,0x08,0x88,0x20,0x42,0x05,0x24,0x24, +0x94,0x81,0x94,0x02,0x80,0x69,0xB6,0x1F,0x42,0x03,0x24,0x24,0xF0,0x85,0x96,0x19, +0xF2,0x82,0x84,0xA0,0x92,0x41,0xF0,0x83,0x50,0x03,0x80,0xC0,0xF2,0x84,0x80,0x85, +0x51,0xC3,0x80,0x40,0xF0,0x89,0xF0,0x03,0xE2,0x80,0xE8,0x2C,0xF0,0x05,0x80,0xFC, +0x98,0xA0,0x94,0x91,0x88,0x41,0x85,0x40,0x40,0x05,0x08,0x00,0x50,0x93,0xFF,0xC0, +0xF0,0x86,0x85,0x00,0xF0,0x06,0x39,0xE0,0x20,0x11,0x2A,0x04,0x80,0x01,0x40,0xFF, +0x00,0x01,0x4E,0xF4,0x00,0x05,0x8A,0x1E,0x96,0x01,0xD5,0x03,0x40,0x07,0x80,0x13, +0xE2,0xA0,0x40,0x50,0x3C,0x1B,0xB4,0x1F,0x89,0x00,0x4C,0x93,0xFF,0xED,0xF0,0x02, +0x50,0x74,0x80,0x40,0x89,0x40,0xF0,0x09,0x4C,0x70,0x7F,0xE0,0x8C,0x81,0x97,0x21, +0xD5,0xD3,0x94,0x31,0x81,0x41,0x42,0xA0,0x0C,0x73,0x81,0x01,0x80,0x01,0xFA,0x90, +0x84,0xE0,0xFE,0xF4,0x83,0xCA,0x87,0x80,0xF1,0x04,0xF2,0x01,0x42,0x1E,0x04,0x24, +0x88,0x23,0xCA,0x05,0x8C,0x21,0x38,0x24,0x05,0x01,0xD5,0x03,0x38,0x20,0x05,0x01, +0x80,0x22,0x84,0xC0,0x8C,0xC1,0x04,0xFF,0x80,0x03,0x40,0x93,0x00,0x13,0xE3,0x2F, +0xE8,0x0B,0x38,0x9F,0x19,0x01,0xE2,0x29,0x40,0x14,0xBC,0x1B,0xE3,0x22,0x96,0x49, +0x40,0x24,0xBC,0x1B,0xD5,0xF0,0x8A,0x22,0xE0,0x27,0x40,0x13,0xBC,0x1B,0x97,0xC9, +0xF1,0x02,0x41,0xEF,0x04,0x00,0x5B,0xC0,0x01,0x04,0x87,0x81,0xD5,0xD6,0xB4,0x3F, +0x8E,0x81,0x97,0x21,0x89,0x01,0x88,0x01,0x89,0x41,0xCC,0xCD,0xF0,0x08,0xAD,0x40, +0xF0,0x07,0xAD,0xC0,0xFC,0xC5,0xFC,0x01,0x49,0x00,0x14,0x84,0x84,0xC5,0xC8,0x02, +0x84,0xC3,0x49,0x00,0x14,0x7F,0xF0,0x81,0x84,0x00,0xF1,0x01,0x80,0x40,0x44,0x32, +0x17,0xB6,0x44,0x42,0x17,0x22,0x49,0xFF,0xFF,0x3C,0x3C,0x5D,0xF8,0xEB,0x44,0x10, +0xFF,0xFF,0x3C,0x03,0xFA,0xE3,0xD9,0x04,0x3C,0x0F,0xF8,0xEB,0xD5,0x05,0x88,0xA0, +0x92,0xA1,0x3C,0x5F,0xF8,0xEB,0x49,0x00,0x14,0x65,0xC0,0x05,0x49,0x00,0x14,0x62, +0x5A,0x08,0x01,0x0D,0x2E,0x07,0xF6,0x23,0xE2,0xC0,0xE9,0x08,0x3C,0x03,0xFA,0x99, +0xE6,0x0A,0xE8,0x36,0x84,0x00,0x3C,0x0B,0xFA,0x99,0x3C,0x03,0xFA,0xE3,0x5C,0xF0, +0x02,0x59,0x84,0x00,0xE9,0x04,0x2E,0x07,0xF5,0x31,0x8C,0x01,0x3E,0x07,0xF5,0x31, +0x2E,0x07,0xF5,0x31,0xE6,0x02,0xE9,0x06,0x84,0x00,0x3E,0x07,0xF5,0x31,0x3E,0x07, +0xF6,0x1A,0x2E,0x07,0xF6,0x1A,0xC8,0x0F,0x3C,0x0D,0xF8,0xEB,0x5C,0xF0,0x00,0xC9, +0xE8,0x06,0x3C,0x03,0xFA,0x99,0x5C,0xF0,0x02,0x59,0xE9,0x05,0x2E,0x07,0xF5,0x30, +0x8C,0x01,0xD5,0x02,0x84,0x00,0x3E,0x07,0xF5,0x30,0x2E,0x07,0xF5,0x30,0xE6,0x02, +0x84,0x00,0xE9,0x08,0x84,0x00,0x3E,0x07,0xF5,0x30,0x84,0x01,0xD5,0x03,0x8E,0x0A, +0xD5,0xCB,0xFC,0x81,0x84,0x01,0x3E,0x07,0xF6,0x1B,0xDD,0x9E,0x2E,0x07,0xF6,0x1B, +0xDD,0x9E,0x84,0x00,0x3E,0x07,0xF6,0x1B,0xDD,0x9E,0x2E,0x07,0xF6,0x1A,0xDD,0x9E, +0x84,0x00,0x3E,0x07,0xF6,0x1A,0xDD,0x9E,0x84,0x01,0x3E,0x07,0xF6,0x19,0xDD,0x9E, +0x2E,0x07,0xF6,0x19,0xDD,0x9E,0x84,0x00,0x3E,0x07,0xF6,0x19,0xDD,0x9E,0x2E,0x07, +0xF6,0x2F,0x96,0x00,0xC0,0x05,0x84,0x00,0x3E,0x07,0xF6,0x2F,0x84,0x01,0xDD,0x9E, +0x2E,0x07,0xF6,0x2E,0x96,0x00,0xC0,0x05,0x84,0x00,0x3E,0x07,0xF6,0x2E,0x84,0x01, +0xDD,0x9E,0x2E,0x17,0xF6,0x2D,0x96,0x48,0xC1,0x05,0x84,0x00,0x3E,0x07,0xF6,0x2D, +0xD5,0x07,0x2E,0x07,0xF6,0x29,0x96,0x00,0xC0,0x04,0x3E,0x17,0xF6,0x29,0x84,0x01, +0xDD,0x9E,0x2E,0x07,0xF6,0x2C,0x96,0x00,0xC0,0x05,0x84,0x00,0x3E,0x07,0xF6,0x2C, +0xD5,0x10,0x2E,0x17,0xF6,0x2B,0x96,0x48,0xC1,0x05,0x3E,0x07,0xF6,0x2B,0x84,0x01, +0xD5,0x08,0x2E,0x07,0xF6,0x2A,0x96,0x00,0xC0,0x07,0x3E,0x17,0xF6,0x2A,0x84,0x02, +0x3E,0x07,0xF6,0x31,0x84,0x01,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xBB,0x79,0x5A,0x00, +0x01,0xFE,0x44,0x16,0x20,0x10,0xB4,0x01,0x92,0x01,0x96,0x06,0x5A,0x00,0x01,0xFD, +0x49,0x00,0x18,0xA1,0x80,0xC0,0xC8,0x09,0x84,0x01,0x49,0xFF,0xF3,0x6B,0x64,0x00, +0x00,0x20,0x80,0x06,0x49,0xFF,0xF3,0x66,0xFC,0x80,0x2E,0x07,0xF6,0x32,0xDD,0x9E, +0x3E,0x07,0xF6,0x32,0xDD,0x9E,0x2E,0x07,0xF6,0x31,0xDD,0x9E,0x3E,0x07,0xF6,0x30, +0xDD,0x9E,0xFC,0x40,0x2E,0x07,0xF6,0x32,0xC8,0x1C,0x49,0xFF,0xF4,0x4A,0x3C,0x1D, +0xF8,0xEF,0x84,0xCB,0xFF,0x8C,0xFF,0x84,0x49,0xFF,0xF6,0x9F,0x3C,0x7D,0xF8,0xEF, +0x81,0x20,0x49,0xFF,0xF6,0x9A,0x40,0x03,0x80,0x0D,0x9D,0xC1,0x44,0x00,0x00,0x3C, +0x40,0x00,0x24,0x0C,0x84,0x2A,0xFE,0x0C,0x40,0x63,0x00,0xD7,0x98,0x3E,0xD5,0x21, +0x49,0xFF,0xF4,0x2F,0x80,0xC0,0x84,0x01,0x49,0xFF,0xF6,0x4C,0x42,0xA3,0x00,0x24, +0x84,0x01,0x49,0xFF,0xC3,0x09,0x81,0x20,0x49,0xFF,0xF6,0x7F,0x3C,0x6D,0xF8,0xEF, +0x80,0xE0,0x49,0xFF,0xF6,0x7A,0x40,0x03,0x00,0x0D,0x9D,0x81,0x40,0x25,0x24,0x0C, +0x84,0x6B,0x84,0x0A,0x40,0x00,0x1C,0x0C,0xFE,0x9C,0x40,0x11,0x00,0x36,0x98,0x31, +0x96,0x01,0xFC,0xC0,0xFC,0x00,0x84,0x03,0x49,0xFF,0xF3,0xB0,0x49,0xFF,0xF3,0x21, +0xFC,0x80,0x2E,0x07,0xF4,0xB5,0xC0,0xFE,0xFC,0x00,0x49,0xFF,0xBC,0xE1,0xFC,0x80, +0xFC,0x01,0xF0,0x81,0x84,0x01,0x49,0xFF,0xEE,0xEF,0xF0,0x01,0x49,0xFF,0xF3,0x0E, +0xF0,0x01,0x49,0xFF,0xF3,0x0C,0xF0,0x01,0x49,0xFF,0xF3,0x0A,0xFC,0x81,0xFC,0x00, +0x84,0x00,0x49,0xFF,0xF6,0x2A,0x84,0x00,0x49,0xFF,0xC3,0x8D,0x84,0x00,0x49,0xFF, +0xF6,0x2F,0x44,0x00,0x03,0x41,0x84,0x27,0x84,0x40,0x84,0x61,0x49,0x00,0x19,0xB9, +0x2E,0x07,0xF6,0x31,0xE6,0x02,0xE8,0x08,0x84,0x01,0x84,0x20,0x49,0xFF,0xC2,0xCE, +0x84,0x01,0x49,0xFF,0xFF,0xD7,0x84,0x00,0x84,0x21,0x49,0xFF,0xC2,0xC7,0x84,0x01, +0x80,0x20,0x49,0xFF,0xC3,0x3D,0x84,0x00,0x49,0x00,0x11,0x5F,0x84,0x00,0x49,0x00, +0x11,0x42,0x46,0x00,0x00,0x81,0x83,0x80,0xB9,0x1A,0x92,0x25,0x94,0x4D,0x58,0x10, +0x80,0x09,0xB9,0x9A,0xBA,0x1A,0x44,0x1F,0xE0,0xFF,0xFE,0x56,0x58,0x10,0x85,0x00, +0xB9,0x9A,0xBA,0x1A,0x46,0x1F,0xFE,0x0F,0x50,0x10,0x8F,0xFF,0xFE,0x56,0x44,0x25, +0x00,0x00,0xFE,0x57,0xB9,0x9A,0xBA,0x1A,0x46,0x1E,0x0F,0xFF,0x50,0x10,0x8F,0xFF, +0xFE,0x56,0x46,0x20,0x30,0x00,0xFE,0x57,0xB9,0x9A,0xB9,0x19,0x44,0x21,0x39,0x0A, +0x92,0x31,0x40,0x10,0xC4,0x08,0xFE,0x57,0xB9,0x99,0x84,0x00,0x3E,0x07,0xF6,0x32, +0xFC,0x80,0xFC,0x00,0x84,0x01,0x49,0x00,0x11,0x28,0x84,0x00,0x49,0x00,0x11,0x0B, +0x2E,0x67,0xF6,0x31,0xCE,0x14,0x80,0x06,0x49,0xFF,0xF5,0xD2,0x80,0x06,0x49,0xFF, +0xFF,0x89,0x80,0x06,0x80,0x26,0x49,0xFF,0xC2,0x79,0x49,0xFF,0xC3,0xCC,0xE6,0x03, +0x4E,0xF2,0x00,0xA4,0x49,0xFF,0xF3,0xE6,0x48,0x00,0x00,0xA0,0x5A,0x68,0x01,0x56, +0x84,0x00,0x49,0xFF,0xFF,0x77,0x84,0x00,0x80,0x20,0x49,0xFF,0xC2,0x67,0x44,0x24, +0x2C,0x18,0x46,0x0B,0x67,0xFF,0xB4,0x22,0x50,0x00,0x0F,0xFF,0xFE,0x0E,0x46,0x10, +0x10,0x00,0xFE,0x0F,0xB6,0x02,0x44,0x14,0x24,0x18,0x44,0x04,0x28,0x18,0x80,0x46, +0x80,0x66,0x49,0xFF,0xBA,0xCF,0x44,0x14,0x2C,0x20,0x44,0x0F,0xFF,0xB3,0xB4,0x41, +0x80,0x66,0xFE,0x16,0x58,0x00,0x00,0x48,0xB6,0x01,0x80,0x46,0x44,0x04,0x28,0x20, +0x44,0x14,0x24,0x20,0x49,0xFF,0xBA,0xBE,0x44,0x24,0x2C,0x1C,0x46,0x0F,0xFB,0x3F, +0xB4,0x22,0x50,0x00,0x0F,0xFF,0xFE,0x0E,0x46,0x10,0x04,0x80,0xFE,0x0F,0xB6,0x02, +0x44,0x14,0x24,0x1C,0x44,0x04,0x28,0x1C,0x80,0x46,0x80,0x66,0x49,0xFF,0xBA,0xAA, +0x44,0x14,0x50,0x0C,0x84,0x1E,0xB4,0x41,0xFE,0x16,0xB6,0x01,0x84,0x0F,0x49,0xFF, +0xC3,0x87,0x44,0x24,0x70,0x04,0x44,0x10,0x89,0x12,0xB4,0x02,0x92,0x10,0x40,0x00, +0x40,0x08,0xFE,0x0F,0xB6,0x02,0xD5,0x52,0x46,0x00,0x00,0x81,0x83,0x80,0xB9,0x1A, +0x92,0x25,0x94,0x4D,0x58,0x10,0x80,0x03,0xB9,0x9A,0xBA,0x1A,0x44,0x1F,0xE0,0xFF, +0xFE,0x56,0x58,0x10,0x82,0x00,0xB9,0x9A,0xBA,0x1A,0x46,0x1F,0xFE,0x0F,0x50,0x10, +0x8F,0xFF,0xFE,0x56,0x44,0x21,0x00,0x00,0xFE,0x57,0xB9,0x9A,0xBA,0x1A,0x46,0x1E, +0x0F,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x56,0xB9,0x9A,0xB9,0x19,0x84,0x41,0x92,0x31, +0x40,0x10,0xC4,0x08,0x58,0x10,0xED,0x60,0x80,0x62,0xB9,0x99,0x44,0x00,0x02,0xBC, +0x84,0x20,0x49,0x00,0x18,0xCE,0x84,0x21,0x84,0x00,0x49,0xFF,0xC2,0x61,0x84,0x01, +0x49,0xFF,0xC2,0x68,0x84,0x01,0x80,0x20,0x49,0xFF,0xC1,0xE0,0x84,0x01,0x49,0xFF, +0xC2,0x2D,0x84,0x01,0x49,0xFF,0xC2,0x87,0x49,0xFF,0xC3,0x2D,0xE6,0x03,0xE8,0x03, +0x49,0xFF,0xF3,0x48,0x49,0xFF,0xC1,0x98,0x84,0x00,0xFA,0x2F,0x80,0x40,0x84,0x61, +0x80,0x80,0x49,0xFF,0xF3,0x8D,0x49,0xFF,0xC1,0x8F,0x84,0x00,0x49,0xFF,0xEE,0x90, +0x84,0x00,0x49,0xFF,0xEE,0x96,0x84,0x01,0x3E,0x07,0xF6,0x32,0x2E,0x07,0xF6,0x31, +0x5A,0x08,0x02,0x04,0x49,0xFF,0xC5,0xD3,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xF2,0x70, +0xFC,0x80,0xDD,0x9E,0x84,0x40,0x44,0x42,0x18,0x30,0x96,0xD1,0xE2,0x61,0xE8,0x07, +0x38,0x30,0x08,0x00,0x38,0x32,0x08,0x08,0x8C,0x41,0xD5,0xF8,0xDD,0x9E,0xFC,0x40, +0x22,0xFF,0x80,0x14,0x22,0x8F,0x80,0x16,0x22,0xAF,0x80,0x18,0x00,0x9F,0x80,0x34, +0x00,0x7F,0x80,0x38,0x00,0x6F,0x80,0x3C,0x4E,0x03,0x00,0x99,0x45,0xC7,0x20,0xC0, +0x46,0x0F,0xFF,0x0F,0x05,0xEE,0x00,0x00,0x96,0x5F,0x50,0x00,0x0F,0xFF,0x40,0x10, +0xC0,0x08,0x40,0x0F,0x00,0x02,0xFE,0x0F,0xB6,0x1C,0xC4,0x0C,0x44,0x07,0x20,0xC4, +0x40,0x21,0x30,0x08,0xB4,0x20,0x92,0x4C,0x92,0x34,0x40,0x10,0xD0,0x08,0xFE,0x8F, +0xB6,0x40,0xC5,0x0C,0x44,0x07,0x20,0xCC,0x40,0x31,0xB0,0x08,0xB4,0x20,0x92,0x6C, +0x92,0x34,0x40,0x10,0xD0,0x08,0xFE,0xCF,0xB6,0x60,0x44,0x27,0x20,0xD4,0xF0,0x08, +0xB4,0x22,0x40,0x00,0x30,0x08,0x92,0x34,0x40,0x10,0xD0,0x08,0x92,0x0C,0x44,0x37, +0x20,0xC8,0xFE,0x0F,0xB6,0x02,0xB4,0x03,0x54,0x17,0x80,0xFF,0x92,0x08,0x40,0x00, +0x20,0x08,0x44,0x27,0x20,0xD0,0xFE,0x0F,0xB6,0x03,0xB4,0x02,0x54,0x14,0x00,0xFF, +0x92,0x08,0x40,0x00,0x20,0x08,0xFE,0x0F,0x44,0x17,0x20,0xD8,0xB6,0x02,0xB4,0x01, +0x54,0xA5,0x00,0xFF,0x92,0x08,0x40,0x00,0x20,0x08,0x40,0x00,0x28,0x04,0xB6,0x01, +0x54,0x04,0x80,0x03,0x40,0xA0,0x60,0x08,0xB5,0x23,0x46,0x0F,0xCF,0xFF,0x50,0x00, +0x0F,0xFF,0x40,0x94,0x80,0x02,0x40,0x94,0xA8,0x04,0xB7,0x23,0x97,0xCF,0x40,0x93, +0xE0,0x08,0xB4,0xE2,0x97,0x8F,0xFF,0xC6,0x40,0x73,0xA4,0x04,0xB6,0xE2,0xB4,0xE1, +0x40,0x63,0x60,0x08,0xFE,0x3E,0xFE,0x37,0xB6,0x01,0xF0,0x10,0x44,0x77,0x20,0xDC, +0x40,0x00,0x3C,0x08,0x40,0x60,0x3C,0x09,0xB4,0x07,0x40,0x42,0x7C,0x08,0x92,0x11, +0x40,0x00,0x44,0x08,0xFE,0x37,0xB6,0x07,0xB4,0x03,0x40,0x52,0xFC,0x08,0x94,0x01, +0x92,0x01,0xFE,0x27,0xB6,0x03,0xB4,0x02,0x94,0x01,0x92,0x01,0xFE,0x2F,0xB6,0x02, +0xF0,0x09,0x40,0x20,0x7C,0x08,0xB4,0x01,0x94,0x01,0x92,0x01,0xFE,0x17,0xB6,0x01, +0x84,0x20,0x44,0x07,0x20,0xE0,0x48,0x00,0x00,0x9D,0x5A,0x00,0x01,0x04,0x48,0x00, +0x00,0x9A,0x45,0xC7,0x21,0x00,0x46,0x0F,0xFF,0x0F,0x05,0xEE,0x00,0x00,0x96,0x5F, +0x50,0x00,0x0F,0xFF,0x40,0x10,0xC0,0x08,0x40,0x0F,0x00,0x02,0xFE,0x0F,0xB6,0x1C, +0xC4,0x0C,0x44,0x07,0x21,0x04,0x40,0x21,0x30,0x08,0xB4,0x20,0x92,0x4C,0x92,0x34, +0x40,0x10,0xD0,0x08,0xFE,0x8F,0xB6,0x40,0xC5,0x0C,0x44,0x07,0x21,0x0C,0x40,0x31, +0xB0,0x08,0xB4,0x20,0x92,0x6C,0x92,0x34,0x40,0x10,0xD0,0x08,0xFE,0xCF,0xB6,0x60, +0x44,0x27,0x21,0x14,0xF0,0x08,0xB4,0x22,0x40,0x00,0x30,0x08,0x92,0x34,0x40,0x10, +0xD0,0x08,0x92,0x0C,0xFE,0x0F,0xB6,0x02,0x44,0x27,0x21,0x08,0x54,0x17,0x80,0xFF, +0xB4,0x02,0x54,0x35,0x00,0xFF,0x92,0x08,0x40,0x00,0x20,0x08,0xFE,0x0F,0x44,0x17, +0x21,0x10,0xB6,0x02,0x54,0x04,0x00,0xFF,0xB5,0x01,0x97,0xCF,0x93,0x08,0x40,0x84, +0x20,0x08,0x40,0x84,0x00,0x04,0x44,0x07,0x21,0x18,0xB7,0x01,0xB5,0x40,0x97,0x8F, +0x93,0x48,0x40,0xA5,0x20,0x08,0x40,0xA5,0x0C,0x04,0xB7,0x40,0x54,0x34,0x80,0x03, +0x46,0xAF,0xCF,0xFF,0xB5,0x22,0x50,0xA5,0x0F,0xFF,0x40,0x31,0xE0,0x08,0x40,0x94, +0xA8,0x02,0x40,0x94,0x8C,0x04,0xB7,0x22,0x40,0x33,0xE0,0x08,0xB4,0xE1,0x40,0x42, +0x7C,0x08,0x40,0x73,0xA8,0x02,0xFF,0xDF,0xB6,0xE1,0x40,0x33,0x60,0x08,0xB4,0xC0, +0x44,0x77,0x21,0x1C,0x40,0x63,0x28,0x02,0xFF,0x9F,0xF3,0x10,0xB6,0xC0,0x40,0x31, +0xBC,0x08,0x40,0x61,0xBC,0x09,0xB4,0x67,0x40,0x52,0xFC,0x08,0x92,0x71,0x40,0x31, +0xC4,0x08,0xFE,0xF7,0xB6,0x67,0xB4,0x62,0x94,0xD9,0x92,0x61,0xFF,0x1F,0xB6,0x82, +0xB4,0x41,0x94,0x91,0x92,0x41,0xFF,0x57,0xB6,0xA1,0xF1,0x09,0x40,0x20,0xFC,0x08, +0xB4,0x20,0x94,0x49,0x92,0x21,0xFE,0x57,0xB6,0x20,0x84,0x20,0x44,0x07,0x21,0x20, +0xB6,0x20,0xFC,0xC0,0xFC,0x00,0x84,0x00,0x49,0xFF,0xC1,0x62,0x44,0x16,0x00,0x00, +0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01,0x44,0x02,0x18,0x30,0x44,0x10,0x00,0x79, +0xAE,0x41,0x44,0x1F,0xFF,0x84,0xAE,0x42,0x84,0x39,0xAE,0x43,0xFC,0x80,0x84,0x20, +0x84,0x40,0x3C,0x1B,0xFB,0x1E,0x44,0x42,0x18,0x30,0x80,0x22,0x96,0xD1,0xE2,0x60, +0xE8,0x06,0x38,0x32,0x08,0x00,0x8C,0x41,0x88,0x23,0xD5,0xF9,0xFC,0x00,0x44,0x22, +0x18,0x30,0xFE,0x4A,0x96,0x48,0x38,0x11,0x00,0x08,0x8C,0x01,0x96,0x01,0x49,0xFF, +0xEE,0x9D,0x2E,0x07,0xF6,0x40,0x49,0xFF,0xEE,0x84,0x49,0xFF,0xC1,0x84,0xE6,0x03, +0xE9,0x03,0x49,0xFF,0xED,0x0C,0xFC,0x80,0xFC,0x01,0x84,0x00,0x3E,0x07,0xFC,0x49, +0x84,0x01,0x3E,0x07,0xE3,0xB8,0x84,0x20,0x44,0x00,0x01,0x00,0x49,0xFF,0xB7,0xE8, +0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF,0xB7,0xF2,0x44,0x00,0x01,0x00,0x84,0x21, +0x49,0xFF,0xB7,0xFC,0x44,0x40,0x05,0x78,0xB6,0x9F,0x44,0x12,0x18,0x30,0x44,0x22, +0x18,0x2E,0x44,0x32,0x18,0x2C,0x44,0x50,0x00,0x90,0x44,0x02,0x1D,0xA8,0x49,0xFF, +0xEE,0x5C,0x44,0x00,0x9E,0x2C,0x49,0xFF,0xEE,0x72,0x44,0x00,0x97,0x12,0x49,0xFF, +0xEE,0x71,0x84,0x00,0x49,0xFF,0xB7,0xFE,0x84,0x00,0x3C,0x0B,0xFB,0x1F,0x44,0x00, +0x05,0x77,0x49,0xFF,0xFF,0xA6,0x49,0xFF,0xFF,0x8F,0xFC,0x81,0xFC,0x00,0xC8,0x03, +0xFA,0x1A,0xD5,0x03,0x44,0x00,0x05,0x1B,0x49,0xFF,0xFF,0x9B,0xFC,0x80,0xFC,0x00, +0x84,0x07,0x49,0xFF,0xFF,0x96,0xFC,0x80,0xFC,0x00,0x44,0x00,0x00,0xA9,0x49,0xFF, +0xFF,0x90,0xFC,0x80,0xFC,0x00,0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF,0xB7,0xBE, +0x84,0x00,0x3C,0x0F,0xFD,0x8D,0x3C,0x0D,0xFD,0x8D,0x5C,0xF0,0x00,0x64,0xE8,0x05, +0x3C,0x0D,0xFD,0x8D,0x8C,0x01,0xD5,0xF6,0x44,0x00,0x01,0x00,0x84,0x21,0x49,0xFF, +0xB7,0xAD,0xFC,0x80,0x2E,0x07,0xFC,0x49,0xDD,0x9E,0x2E,0x07,0xE3,0xB8,0xDD,0x9E, +0xFC,0x00,0x44,0x10,0x00,0xFF,0x80,0xC0,0x44,0x20,0x05,0x78,0x44,0x02,0x18,0x30, +0x49,0x00,0x1D,0x02,0xCE,0x06,0x44,0x00,0x00,0x5A,0x3E,0x07,0xF6,0x40,0xFC,0x80, +0x44,0x0F,0xFF,0xA7,0x3E,0x07,0xF6,0x40,0x84,0x05,0x3E,0x07,0xF6,0x41,0xFA,0x0C, +0x3E,0x07,0xF6,0x42,0xFA,0x10,0x3E,0x07,0xF6,0x43,0x84,0x1F,0x3E,0x07,0xF6,0x44, +0xFC,0x80,0xFC,0x00,0x04,0x30,0x00,0x47,0x46,0x40,0x10,0x00,0x40,0x51,0xC0,0x09, +0xFF,0x1E,0x80,0xC0,0x97,0x5F,0xC4,0x26,0x92,0x74,0x96,0xDF,0x4C,0x32,0xC0,0x09, +0x9D,0x5D,0x84,0x66,0x40,0x32,0x8C,0xB6,0x97,0x68,0x84,0x01,0xD5,0x0F,0x50,0x00, +0x01,0x1B,0x9D,0x29,0x84,0x66,0x40,0x42,0x0C,0x76,0x54,0x41,0x80,0x0F,0xA6,0xC3, +0x54,0x31,0x80,0xF0,0xFE,0xE7,0xAE,0xC3,0x84,0x02,0xAE,0x10,0x84,0x4C,0x80,0x01, +0x80,0x26,0x42,0x12,0x88,0x73,0x50,0x10,0x80,0x94,0x49,0x00,0x1C,0x97,0x84,0x01, +0xFC,0x80,0xAF,0x10,0x80,0x04,0xFC,0x80,0xFC,0x42,0x84,0x20,0x80,0xE0,0x84,0x4C, +0xB0,0x01,0x49,0x00,0x1C,0xB1,0x2E,0x07,0xF6,0x33,0x44,0x82,0x33,0x90,0x8C,0x01, +0x3E,0x07,0xF6,0x33,0x85,0x45,0x84,0xC1,0x87,0x80,0x44,0x92,0x18,0x30,0x80,0x08, +0xB0,0x41,0x50,0x2F,0x80,0x03,0x49,0xFF,0xFF,0xB6,0x4E,0x02,0x00,0x9C,0x00,0x14, +0x01,0x05,0x5A,0x18,0x03,0x08,0x00,0x0F,0x80,0x03,0x5A,0x08,0x01,0x04,0x48,0x00, +0x00,0x92,0x8E,0x22,0xE6,0x22,0x4E,0xF2,0x00,0x8E,0x3C,0x0D,0xFB,0xD6,0x96,0x1E, +0xC8,0x06,0x44,0x20,0x00,0x5F,0x44,0x10,0x00,0x3C,0xD5,0x05,0x44,0x20,0x00,0xC8, +0x44,0x10,0x00,0x58,0xF0,0x01,0x5E,0xF0,0x1B,0x59,0xE9,0x21,0x40,0x10,0x08,0x36, +0x5E,0xF0,0x81,0x00,0xE9,0x03,0x44,0x10,0x00,0xFF,0x50,0x00,0xFF,0x92,0xE6,0x14, +0xE8,0x02,0x8C,0x34,0x50,0x00,0xFF,0xA6,0xE6,0x14,0xE8,0x04,0x50,0x10,0x80,0x28, +0xD5,0x2C,0x50,0x00,0xFF,0x69,0xE6,0x14,0xE8,0x03,0x8E,0x34,0xD5,0x26,0x50,0x00, +0xFF,0x55,0xE6,0x14,0xE8,0x22,0x50,0x10,0xFF,0xD8,0xD5,0x1F,0x40,0x10,0x04,0x36, +0x5E,0xF0,0x81,0x00,0xE9,0x03,0x44,0x10,0x00,0xFF,0x50,0x00,0xFF,0xE2,0xE6,0x0A, +0xE8,0x03,0x8C,0x2A,0xD5,0x12,0x50,0x00,0xFF,0xEC,0xE6,0x0A,0xE8,0x03,0x8C,0x34, +0xD5,0x0C,0x50,0x20,0xFF,0xCD,0xE6,0x4A,0xE8,0x03,0x8E,0x2A,0xD5,0x06,0x50,0x20, +0xFF,0xC3,0xE6,0x4A,0x40,0x10,0x3C,0x1B,0x00,0x4F,0x80,0x0C,0x5A,0x48,0x01,0x3B, +0x22,0x0F,0x80,0x04,0x22,0x2F,0x80,0x05,0xCF,0x1F,0x40,0x31,0x20,0x0A,0x54,0x41, +0x80,0x0F,0x40,0x30,0x10,0x0A,0x54,0x31,0x80,0xF0,0xFE,0xE7,0x38,0x34,0x98,0x08, +0x9C,0xF1,0x96,0x00,0x38,0x04,0x8C,0x08,0x9C,0x32,0x96,0x90,0x5E,0xF0,0x80,0xFF, +0x38,0x24,0x80,0x08,0x9C,0x33,0xE9,0x03,0x44,0x10,0x00,0xFE,0x96,0x48,0x38,0x14, +0x80,0x08,0x87,0x81,0xD5,0x17,0x40,0x11,0x20,0x0A,0x54,0x30,0x80,0x0F,0x40,0x10, +0x10,0x0A,0x54,0x10,0x80,0xF0,0xFE,0x5F,0x38,0x14,0xA8,0x08,0x50,0x15,0x00,0x01, +0x96,0x00,0x38,0x04,0x84,0x08,0x50,0x05,0x00,0x02,0x96,0x90,0x38,0x24,0x80,0x08, +0x83,0x84,0x8C,0xC4,0x50,0x84,0x01,0x24,0x8D,0x43,0x5A,0x60,0x29,0x04,0x48,0xFF, +0xFF,0x58,0x80,0x1C,0xFC,0xC2,0xFA,0xB3,0x44,0x22,0x18,0x30,0x44,0x30,0x04,0xA3, +0x80,0x80,0x0A,0x10,0x00,0x01,0x92,0x28,0x38,0x11,0x14,0x08,0x9C,0x69,0xA7,0x20, +0x8C,0xA2,0x38,0x41,0x04,0x08,0xDB,0xF5,0xDD,0x9E,0x44,0x50,0x04,0xA3,0x44,0x22, +0x18,0x30,0x44,0x30,0x05,0x07,0x80,0x80,0x0A,0x10,0x00,0x01,0x92,0x28,0x38,0x11, +0x14,0x08,0x9C,0x69,0xA7,0x20,0x8C,0xA2,0x38,0x41,0x04,0x08,0xDB,0xF5,0xDD,0x9E, +0x44,0x1F,0xFF,0xB7,0x3E,0x17,0xF6,0x40,0x84,0x24,0x3E,0x17,0xF6,0x41,0x44,0x1F, +0xFF,0x85,0x3E,0x17,0xF6,0x42,0x2E,0x17,0xF4,0x21,0x3E,0x17,0xF6,0x43,0x84,0xA4, +0x44,0x22,0x18,0x30,0x44,0x30,0x04,0x84,0x80,0x80,0x0A,0x10,0x00,0x01,0x92,0x28, +0x38,0x11,0x14,0x08,0x9C,0x69,0xA7,0x20,0x8C,0xA2,0x38,0x41,0x04,0x08,0xDB,0xF5, +0xDD,0x9E,0xC8,0x03,0x3E,0x17,0xF6,0x69,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xEC,0xCC, +0xFC,0x80,0xFC,0x00,0x49,0xFF,0xEC,0xC5,0xFC,0x80,0xFC,0x00,0x49,0x00,0x0D,0x6C, +0x2E,0x57,0xFC,0x48,0xCD,0x18,0x84,0x32,0x3E,0x17,0xF6,0x40,0x44,0x22,0x18,0x30, +0x44,0x30,0x04,0x80,0x80,0x80,0x2A,0x10,0x00,0x01,0x9D,0xA9,0x90,0x28,0x96,0x48, +0x38,0x11,0x18,0x08,0x8C,0xA2,0xA6,0x60,0x38,0x11,0x14,0x08,0xDB,0xF4,0x44,0x00, +0x04,0x81,0xD5,0x12,0x5A,0x58,0x01,0x13,0x84,0x12,0x3E,0x07,0xF6,0x40,0x44,0x12, +0x18,0x30,0x80,0x05,0x84,0x40,0x9C,0xC1,0x38,0x20,0x80,0x08,0x8C,0x02,0x38,0x20, +0x8C,0x08,0x5A,0x08,0x65,0xFA,0x49,0xFF,0xFD,0xDC,0xFC,0x80,0xFC,0x41,0x3C,0x23, +0xFB,0x1F,0x2E,0x17,0xFB,0xB8,0x96,0x91,0x96,0x48,0x44,0x62,0x1D,0xA8,0x5A,0x18, +0x35,0x04,0x48,0x00,0x08,0x81,0x5A,0x18,0x30,0x04,0x48,0x00,0x08,0x74,0x5A,0x18, +0x33,0x04,0x48,0x00,0x08,0x70,0x5A,0x18,0x31,0x04,0x48,0x00,0x08,0x8A,0x5A,0x18, +0x34,0x04,0x48,0x00,0x08,0x86,0x84,0x00,0x5A,0x18,0x32,0x04,0x48,0x00,0x08,0x77, +0x5A,0x20,0x03,0x04,0x48,0x00,0x01,0x53,0x5A,0x18,0x53,0x0F,0x2E,0x07,0xFB,0xB9, +0x2E,0x17,0xFB,0xBA,0x40,0x00,0x20,0x08,0xFE,0x0F,0x50,0x00,0x7F,0xB8,0x5C,0x00, +0x00,0x01,0x48,0x00,0x04,0x42,0x5A,0x10,0x01,0x05,0x84,0x00,0x48,0x00,0x04,0x3D, +0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x01,0x16,0x2E,0x17,0xFB,0xBA,0x84,0x00,0x5A,0x18, +0x01,0x05,0x3C,0x0F,0xFF,0x15,0x84,0x06,0x2E,0x17,0xFB,0xBA,0x4E,0x13,0x04,0x2D, +0x84,0x01,0x3C,0x0F,0xFF,0x15,0x49,0xFF,0xBE,0x94,0x84,0x07,0x48,0x00,0x04,0x25, +0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x02,0x13,0x2E,0x07,0xFB,0xBA,0x5A,0x08,0x03,0x04, +0x48,0x00,0x03,0xC6,0x2E,0x07,0xFB,0xBA,0x4E,0x02,0x03,0xC4,0x2E,0x07,0xFB,0xBA, +0x5A,0x08,0x01,0xD5,0x84,0x08,0x48,0x00,0x04,0x10,0x2E,0x07,0xFB,0xB9,0x5A,0x08, +0x03,0x0E,0x2E,0x07,0xFB,0xBA,0xC0,0xCA,0x2E,0x07,0xFB,0xBA,0x5A,0x00,0x01,0xC7, +0x2E,0x07,0xFB,0xBA,0x84,0x00,0x48,0x00,0x04,0x00,0x2E,0x07,0xFB,0xB9,0x5A,0x08, +0x04,0x12,0x2E,0x07,0xFB,0xBA,0xC0,0xBA,0x2E,0x07,0xFB,0xBA,0x5A,0x00,0x01,0xB7, +0x2E,0x07,0xFB,0xBA,0x5A,0x00,0x10,0xB3,0x2E,0x07,0xFB,0xBA,0x84,0x00,0x48,0x00, +0x03,0xEC,0x2E,0x07,0xFB,0xB9,0x5A,0x00,0x05,0xAA,0x2E,0x07,0xFB,0xB9,0x5A,0x08, +0x06,0x11,0x2E,0x07,0xFB,0xBA,0x96,0x00,0x5A,0x08,0x01,0x04,0x3C,0x0F,0xFC,0xFD, +0x2E,0x07,0xFB,0xBA,0x96,0x00,0xC8,0x9A,0x3C,0x0F,0xFC,0xFD,0x48,0x00,0x03,0xD5, +0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x07,0x11,0x2E,0x07,0xFB,0xBA,0x96,0x00,0x5A,0x08, +0x01,0x04,0x3C,0x0F,0xFC,0xFC,0x2E,0x07,0xFB,0xBA,0x96,0x00,0xC8,0x87,0x3C,0x0F, +0xFC,0xFC,0x48,0x00,0x03,0xC2,0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x08,0x0B,0x2E,0x07, +0xFB,0xBA,0x4E,0x02,0xFF,0x7C,0x2E,0x07,0xFB,0xBA,0x84,0x00,0x48,0x00,0x03,0xB5, +0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x09,0x04,0x48,0xFF,0xFF,0x71,0x2E,0x07,0xFB,0xB9, +0x5A,0x08,0x0A,0x33,0x2E,0x07,0xFB,0xBA,0x4E,0x02,0x03,0x56,0x2E,0x07,0xFB,0xBA, +0x5A,0x08,0x01,0x04,0x48,0x00,0x03,0x52,0x2E,0x07,0xFB,0xBA,0x5A,0x08,0x02,0x04, +0x48,0x00,0x03,0x4E,0x2E,0x07,0xFB,0xBA,0x5A,0x08,0x03,0x04,0x48,0x00,0x03,0x4A, +0x2E,0x07,0xFB,0xBA,0x5A,0x08,0x04,0x04,0x48,0x00,0x03,0x46,0x2E,0x07,0xFB,0xBA, +0x5A,0x08,0x05,0x04,0x48,0x00,0x03,0x42,0x2E,0x07,0xFB,0xBA,0x5A,0x08,0x06,0x04, +0x48,0x00,0x03,0x3E,0x2E,0x07,0xFB,0xBA,0x5A,0x00,0x07,0x04,0x48,0xFF,0xFF,0x3F, +0xFA,0x03,0x48,0x00,0x03,0x7A,0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x0B,0x04,0x48,0xFF, +0xFF,0x36,0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x0C,0x09,0x2E,0x07,0xFB,0xBA,0x2E,0x07, +0xFB,0xBA,0x84,0x00,0x48,0x00,0x03,0x69,0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x0F,0x09, +0x2E,0x07,0xFB,0xBA,0x2E,0x07,0xFB,0xBA,0x84,0x00,0x48,0x00,0x03,0x5E,0x2E,0x07, +0xFB,0xB9,0x5A,0x08,0x10,0x09,0x2E,0x07,0xFB,0xBA,0x2E,0x07,0xFB,0xBA,0x84,0x00, +0x48,0x00,0x03,0x53,0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x11,0x1A,0x2E,0x07,0xFB,0xBA, +0xC8,0x07,0x3C,0x0D,0xFB,0xD6,0x58,0x00,0x00,0x08,0x3C,0x0F,0xFB,0xD6,0x2E,0x07, +0xFB,0xBA,0x5A,0x00,0x01,0x04,0x48,0xFF,0xFF,0x02,0x3C,0x1D,0xFB,0xD6,0x84,0x17, +0xFE,0x0E,0x3C,0x0F,0xFB,0xD6,0x84,0x00,0x48,0x00,0x03,0x37,0x2E,0x07,0xFB,0xB9, +0x5A,0x08,0x12,0x09,0x2E,0x07,0xFB,0xBA,0x3C,0x0B,0xF9,0xF7,0x84,0x00,0x48,0x00, +0x03,0x2C,0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x13,0x13,0x2E,0x07,0xFB,0xBA,0x2E,0x07, +0xFB,0xBA,0x5C,0xF0,0x00,0x82,0xE8,0x04,0x2E,0x07,0xFB,0xBA,0xD5,0x03,0x44,0x00, +0x00,0x81,0x3C,0x0B,0xF9,0xF6,0x84,0x00,0x48,0x00,0x03,0x17,0x2E,0x07,0xFB,0xB9, +0x5A,0x00,0x14,0x04,0x48,0xFF,0xFE,0xD3,0x2E,0x07,0xFB,0xBA,0xC8,0x08,0x3C,0x1D, +0xFB,0xD6,0x44,0x0F,0xDF,0xFF,0xFE,0x0E,0x3C,0x0F,0xFB,0xD6,0x2E,0x07,0xFB,0xBA, +0x84,0x00,0x48,0x00,0x03,0x02,0x44,0x00,0x00,0x3C,0x5A,0x28,0x01,0x36,0x5A,0x18, +0x01,0x04,0x48,0x00,0x02,0xB7,0x5A,0x18,0x03,0x04,0x48,0x00,0x02,0xB5,0x5A,0x18, +0x20,0x04,0x48,0x00,0x02,0xB3,0x5A,0x18,0x28,0x04,0x48,0x00,0x02,0xB1,0x5A,0x18, +0x21,0x04,0x48,0x00,0x02,0xAF,0x5A,0x18,0x22,0x04,0x48,0x00,0x02,0xAD,0x5A,0x18, +0x23,0x04,0x48,0x00,0x02,0xAB,0x5A,0x18,0x15,0x04,0x48,0x00,0x02,0xA9,0x5A,0x18, +0x17,0x04,0x48,0x00,0x02,0xA7,0x5A,0x18,0x04,0x04,0x48,0x00,0x02,0xA5,0x5A,0x18, +0xF3,0x04,0x48,0x00,0x02,0xA4,0x5A,0x10,0xFE,0x04,0x48,0x00,0x02,0xCE,0x44,0x00, +0x00,0x31,0x48,0x00,0x02,0xCA,0x5A,0x20,0x02,0x04,0x48,0x00,0x01,0x3A,0x5A,0x18, +0xF6,0x0C,0x2E,0x17,0xFB,0xB9,0x5A,0x10,0xF2,0x04,0x48,0x00,0x02,0xBE,0x44,0x00, +0x00,0x36,0x48,0x00,0x02,0xBA,0x5A,0x18,0x61,0x1D,0x2E,0x17,0xFB,0xB9,0x96,0x48, +0xC9,0x09,0x44,0x00,0x01,0x00,0x49,0xFF,0xB4,0x49,0x44,0x00,0x00,0x40,0x48,0x00, +0x02,0xAC,0x2E,0x17,0xFB,0xB9,0x96,0x48,0x5A,0x10,0x01,0x04,0x48,0x00,0x02,0x7A, +0x44,0x00,0x01,0x00,0x49,0xFF,0xB4,0x3A,0x44,0x00,0x00,0x40,0x48,0x00,0x02,0x9D, +0x5A,0x18,0x62,0x24,0x2E,0x07,0xFB,0xB9,0x96,0x00,0xC8,0x07,0x49,0xFF,0xE9,0xE5, +0x44,0x00,0x00,0x41,0x48,0x00,0x02,0x91,0x2E,0x07,0xFB,0xB9,0x96,0x00,0x5A,0x08, +0x01,0x08,0x49,0xFF,0xE9,0xDA,0x44,0x00,0x00,0x41,0x48,0x00,0x02,0x86,0x2E,0x07, +0xFB,0xB9,0x5A,0x00,0x02,0x04,0x48,0x00,0x02,0x58,0x80,0x02,0x49,0xFF,0xE9,0xCD, +0x44,0x00,0x00,0x41,0x48,0x00,0x02,0x79,0x5A,0x18,0xF0,0x1D,0x2E,0x17,0xFB,0xB9, +0x4E,0x12,0x02,0x4E,0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x01,0x04,0x48,0x00,0x02,0x4A, +0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x02,0x04,0x48,0x00,0x02,0x46,0x2E,0x17,0xFB,0xB9, +0x5A,0x10,0xFA,0x04,0x48,0x00,0x02,0x61,0x84,0x21,0x3E,0x17,0xF6,0x38,0x48,0x00, +0x02,0x5C,0x5A,0x18,0x02,0x15,0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x03,0x04,0x48,0x00, +0x02,0x35,0x2E,0x17,0xFB,0xB9,0x4E,0x12,0x02,0x33,0x2E,0x17,0xFB,0xB9,0x5A,0x10, +0x01,0x04,0x48,0x00,0x02,0x4A,0x84,0x08,0x48,0x00,0x02,0x47,0x5A,0x18,0xFA,0x12, +0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x03,0x04,0x48,0x00,0x02,0x24,0x2E,0x17,0xFB,0xB9, +0x5A,0x10,0x08,0x04,0x48,0x00,0x02,0x39,0x44,0x00,0x00,0x33,0x48,0x00,0x02,0x35, +0x5A,0x18,0x01,0x16,0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x01,0x06,0x84,0x00,0x3C,0x0F, +0xFF,0x15,0x84,0x06,0x2E,0x17,0xFB,0xB9,0x4E,0x13,0x02,0x27,0x84,0x01,0x3C,0x0F, +0xFF,0x15,0x49,0xFF,0xBC,0x8E,0x84,0x07,0x48,0x00,0x02,0x1F,0x5A,0x18,0x0A,0x33, +0x2E,0x17,0xFB,0xB9,0x4E,0x12,0x02,0x01,0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x01,0x04, +0x48,0x00,0x01,0xFD,0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x02,0x04,0x48,0x00,0x01,0xF9, +0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x03,0x04,0x48,0x00,0x01,0xF5,0x2E,0x17,0xFB,0xB9, +0x5A,0x18,0x04,0x04,0x48,0x00,0x01,0xF1,0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x05,0x04, +0x48,0x00,0x01,0xED,0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x06,0x04,0x48,0x00,0x01,0xE9, +0x2E,0x17,0xFB,0xB9,0x5A,0x10,0x07,0x04,0x48,0x00,0x01,0xEF,0xFA,0x03,0x48,0x00, +0x01,0xEC,0x5A,0x18,0x06,0x12,0x2E,0x17,0xFB,0xB9,0x96,0x48,0x5A,0x18,0x01,0x04, +0x3C,0x1F,0xFC,0xFD,0x2E,0x17,0xFB,0xB9,0x96,0x48,0x4E,0x13,0x01,0xDE,0x3C,0x1F, +0xFC,0xFD,0x48,0x00,0x01,0xDA,0x5A,0x18,0x07,0x12,0x2E,0x17,0xFB,0xB9,0x96,0x48, +0x5A,0x18,0x01,0x04,0x3C,0x1F,0xFC,0xFC,0x2E,0x17,0xFB,0xB9,0x96,0x48,0x4E,0x13, +0x01,0xCC,0x3C,0x1F,0xFC,0xFC,0x48,0x00,0x01,0xC8,0x5A,0x18,0x0D,0x04,0x48,0x00, +0x01,0xC4,0x5A,0x18,0x60,0x12,0x2E,0x17,0xFB,0xB9,0x5A,0x18,0x02,0x04,0x48,0x00, +0x01,0xB2,0x2E,0x17,0xFB,0xB9,0x5A,0x10,0x01,0x04,0x48,0x00,0x01,0xB6,0x44,0x00, +0x00,0x35,0x48,0x00,0x01,0xB2,0x5A,0x10,0xB7,0x04,0x48,0x00,0x01,0xAE,0x2E,0x17, +0xFB,0xB9,0x96,0x48,0x5A,0x18,0x01,0x08,0x3E,0x17,0xF4,0x21,0x44,0x00,0x00,0x44, +0x48,0x00,0x01,0xA3,0x2E,0x17,0xFB,0xB9,0x96,0x48,0x5A,0x18,0x02,0x08,0x3E,0x17, +0xF4,0x21,0x44,0x00,0x00,0x44,0x48,0x00,0x01,0x98,0x2E,0x17,0xFB,0xB9,0x5A,0x10, +0x03,0x04,0x48,0x00,0x01,0x92,0x44,0x00,0x00,0x45,0x48,0x00,0x01,0x8E,0x5A,0x10, +0x01,0x04,0x48,0x00,0x01,0x8A,0x2E,0x17,0xFB,0xB9,0x5A,0x10,0x0A,0x04,0x48,0x00, +0x01,0x84,0x2E,0x17,0xFB,0xBA,0x5A,0x18,0x08,0x13,0x5A,0x28,0x06,0x11,0x2E,0x37, +0xFB,0xBB,0x2E,0x07,0xFB,0xBC,0x2E,0x17,0xFB,0xBD,0x40,0x00,0x20,0x08,0x88,0x03, +0x40,0x10,0xC0,0x08,0x88,0x01,0x3C,0x0F,0xF8,0xED,0xFA,0x04,0x2E,0x17,0xFB,0xBA, +0x5A,0x18,0x09,0x19,0x5A,0x28,0x04,0x17,0x2E,0x17,0xFB,0xBB,0x5A,0x18,0x01,0x04, +0x48,0x00,0x01,0x5C,0x2E,0x17,0xFB,0xBB,0x5A,0x18,0x02,0x04,0x48,0x00,0x01,0x58, +0x2E,0x17,0xFB,0xBB,0x5A,0x10,0x03,0x04,0x48,0x00,0x01,0x57,0xFA,0x07,0x48,0x00, +0x01,0x54,0x2E,0x17,0xFB,0xBA,0x5A,0x18,0x10,0x33,0x5A,0x28,0x06,0x31,0x2E,0x17, +0xFB,0xBB,0x5A,0x18,0x01,0x0D,0x2E,0x27,0xFB,0xBC,0x2E,0x17,0xFB,0xBD,0x40,0x10, +0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF1,0xD9,0x48,0x00,0x01,0x3F,0x2E,0x17,0xFB,0xBB, +0x5A,0x18,0x02,0x0D,0x2E,0x27,0xFB,0xBC,0x2E,0x17,0xFB,0xBD,0x40,0x10,0xA0,0x08, +0x88,0x22,0x3C,0x1B,0xF1,0xD9,0x48,0x00,0x01,0x30,0x2E,0x17,0xFB,0xBB,0x5A,0x10, +0x03,0x04,0x48,0x00,0x01,0x2A,0x2E,0x27,0xFB,0xBC,0x2E,0x17,0xFB,0xBD,0x40,0x10, +0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF1,0xD8,0x48,0x00,0x01,0x1F,0x2E,0x17,0xFB,0xBA, +0x5A,0x18,0x11,0x19,0x5A,0x28,0x04,0x17,0x2E,0x17,0xFB,0xBB,0x5A,0x18,0x01,0x04, +0x48,0x00,0x01,0x10,0x2E,0x17,0xFB,0xBB,0x5A,0x18,0x02,0x04,0x48,0x00,0x01,0x0C, +0x2E,0x17,0xFB,0xBB,0x5A,0x10,0x03,0x04,0x48,0x00,0x01,0x07,0xFA,0x0A,0x48,0x00, +0x01,0x04,0x2E,0x17,0xFB,0xBA,0x5A,0x10,0x12,0x04,0x48,0x00,0x00,0xFE,0x5A,0x20, +0x19,0x04,0x48,0x00,0x00,0xFA,0x2E,0x17,0xFB,0xBB,0x5A,0x18,0x01,0x46,0x2E,0x17, +0xFB,0xBC,0x3E,0x17,0xE1,0xFC,0x2E,0x17,0xFB,0xBD,0x3E,0x17,0xE1,0xFE,0x2E,0x17, +0xFB,0xBE,0x3E,0x17,0xE1,0xFD,0x2E,0x17,0xFB,0xBF,0x2E,0x27,0xFB,0xC0,0x40,0x10, +0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF0,0xFD,0x2E,0x17,0xFB,0xC1,0x2E,0x27,0xFB,0xC2, +0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF0,0xFC,0x2E,0x17,0xFB,0xC3,0x2E,0x27, +0xFB,0xC4,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF1,0x00,0x2E,0x17,0xFB,0xC5, +0x2E,0x27,0xFB,0xC6,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF1,0x01,0x2E,0x17, +0xFB,0xC7,0x2E,0x27,0xFB,0xC8,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF1,0x02, +0x2E,0x17,0xFB,0xC9,0x2E,0x27,0xFB,0xCA,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B, +0xF1,0x03,0x48,0x00,0x00,0xB2,0x2E,0x17,0xFB,0xBB,0x5A,0x18,0x02,0x04,0x48,0x00, +0x00,0xAC,0x2E,0x17,0xFB,0xBB,0x5A,0x10,0x03,0x04,0x48,0x00,0x00,0xA6,0x2E,0x17, +0xFB,0xBC,0x3E,0x17,0xE1,0xF0,0x2E,0x17,0xFB,0xBD,0x3E,0x17,0xE1,0xF1,0x2E,0x17, +0xFB,0xBE,0x3E,0x17,0xE1,0xF2,0x2E,0x17,0xFB,0xBF,0x2E,0x27,0xFB,0xC0,0x40,0x10, +0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF0,0xF6,0x2E,0x17,0xFB,0xC1,0x2E,0x27,0xFB,0xC2, +0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF0,0xF7,0x2E,0x17,0xFB,0xC3,0x2E,0x27, +0xFB,0xC4,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF0,0xF2,0x2E,0x17,0xFB,0xC5, +0x2E,0x27,0xFB,0xC6,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF0,0xF3,0x2E,0x17, +0xFB,0xC7,0x2E,0x27,0xFB,0xC8,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF0,0xF4, +0x2E,0x17,0xFB,0xC9,0x2E,0x27,0xFB,0xCA,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B, +0xF0,0xF5,0x2E,0x17,0xFB,0xCB,0x3E,0x17,0xE1,0xF3,0x2E,0x17,0xFB,0xCC,0x3E,0x17, +0xE1,0xF4,0x2E,0x17,0xFB,0xCD,0x3E,0x17,0xE1,0xF5,0xD5,0x56,0x84,0x0A,0xD5,0x54, +0x84,0x09,0xD5,0x52,0x84,0x0B,0xD5,0x50,0x84,0x0C,0xD5,0x4E,0x84,0x0D,0xD5,0x4C, +0x84,0x0E,0xD5,0x4A,0xFA,0x00,0xD5,0x48,0xFA,0x01,0xD5,0x46,0xFA,0x02,0xD5,0x44, +0x84,0x02,0xD5,0x42,0x84,0x05,0xD5,0x40,0xFA,0x19,0xD5,0x3E,0xFA,0x1D,0xD5,0x3C, +0xFA,0x1A,0xD5,0x3A,0xFA,0x1B,0xD5,0x38,0xFA,0x1C,0xD5,0x36,0xFA,0x1E,0xD5,0x34, +0xFA,0x1F,0xD5,0x32,0x44,0x00,0x00,0x43,0xD5,0x2F,0x44,0x00,0x00,0x30,0xD5,0x2C, +0x44,0x00,0x00,0x40,0xD5,0x29,0x44,0x00,0x00,0x41,0xD5,0x26,0x84,0x03,0xD5,0x24, +0xFA,0x0B,0xD5,0x22,0x84,0x04,0xD5,0x20,0x84,0x0A,0xD5,0x1E,0x84,0x09,0xD5,0x1C, +0x44,0x00,0x00,0x32,0xD5,0x19,0x84,0x0B,0xD5,0x17,0x84,0x0C,0xD5,0x15,0x84,0x0D, +0xD5,0x13,0x84,0x0E,0xD5,0x11,0xFA,0x00,0xD5,0x0F,0xFA,0x01,0xD5,0x0D,0xFA,0x02, +0xD5,0x0B,0x44,0x00,0x00,0x34,0xD5,0x08,0xFA,0x05,0xD5,0x06,0xFA,0x06,0xD5,0x04, +0xFA,0x08,0xD5,0x02,0xFA,0x09,0x84,0x20,0x3C,0x1F,0xF8,0xB4,0x5A,0x08,0x01,0x1A, +0x44,0x0F,0xFF,0xA7,0x3E,0x07,0xF6,0x40,0x84,0x05,0x3E,0x07,0xF6,0x41,0xFA,0x0C, +0x3E,0x07,0xF6,0x42,0xFA,0x22,0xFA,0x10,0x3E,0x07,0xF6,0x43,0x3E,0x07,0xF6,0x44, +0x3E,0x17,0xF6,0x45,0x3E,0x07,0xF6,0x46,0x3E,0x17,0xF6,0x47,0x84,0x08,0xD5,0x3B, +0x5A,0x08,0x02,0x2E,0x2E,0x07,0xFC,0x49,0x44,0x1F,0xFF,0x81,0x3E,0x17,0xF6,0x40, +0x3E,0x07,0xF6,0x41,0xC8,0x0C,0x44,0x10,0x00,0x5A,0x3E,0x17,0xF6,0x42,0x3E,0x07, +0xF6,0x43,0xFA,0x1B,0x3E,0x07,0xF6,0x44,0x84,0x05,0xD5,0x25,0x44,0x0F,0xFF,0xA7, +0x3E,0x07,0xF6,0x42,0x84,0x05,0x3E,0x07,0xF6,0x43,0xFA,0x0C,0x3E,0x07,0xF6,0x44, +0xFA,0x22,0xFA,0x10,0x3E,0x07,0xF6,0x45,0x3E,0x17,0xF6,0x46,0x3E,0x07,0xF6,0x47, +0x3E,0x17,0xF6,0x48,0x3E,0x07,0xF6,0x49,0x84,0x0A,0xD5,0x0D,0x5A,0x08,0x05,0x12, +0x84,0x01,0x3E,0x07,0xF6,0x40,0x3E,0x17,0xF6,0x41,0x3E,0x17,0xF6,0x42,0x3E,0x07, +0xF6,0x43,0x84,0x04,0x49,0xFF,0xF9,0x0D,0x49,0xFF,0xE7,0x53,0x48,0x00,0x03,0xAF, +0x5A,0x08,0x29,0x25,0xFA,0x10,0x84,0x7F,0x84,0x47,0x3E,0x07,0xF6,0x40,0x3E,0x17, +0xF6,0x41,0x3E,0x17,0xF6,0x42,0x3E,0x37,0xF6,0x43,0x3E,0x27,0xF6,0x44,0x3E,0x37, +0xF6,0x45,0x3E,0x27,0xF6,0x46,0x84,0x6A,0xFA,0x42,0x3E,0x27,0xF6,0x47,0x3E,0x07, +0xF6,0x48,0x3E,0x37,0xF6,0x49,0x3E,0x17,0xF6,0x4A,0x3E,0x27,0xF6,0x4B,0x3E,0x07, +0xF6,0x4C,0x3E,0x17,0xF6,0x4D,0x84,0x0E,0xD5,0xD6,0x5A,0x08,0x2A,0x1C,0xFA,0x11, +0x3E,0x07,0xF6,0x40,0x44,0x2F,0xFF,0x81,0x84,0x08,0xFA,0x6A,0x3E,0x27,0xF6,0x41, +0x3E,0x07,0xF6,0x42,0x3E,0x17,0xF6,0x43,0x3E,0x37,0xF6,0x44,0x3E,0x27,0xF6,0x45, +0x3E,0x07,0xF6,0x46,0x84,0x01,0x3E,0x17,0xF6,0x47,0x3E,0x07,0xF6,0x48,0x84,0x09, +0xD5,0xBA,0x5A,0x08,0x2B,0x0E,0xFA,0x12,0x3E,0x07,0xF6,0x40,0x84,0x05,0x3E,0x07, +0xF6,0x41,0x84,0x04,0x3E,0x07,0xF6,0x42,0x3E,0x17,0xF6,0x43,0xD5,0xAB,0x5A,0x08, +0x43,0x05,0x2E,0x00,0x0A,0xD4,0xD5,0x5E,0x5A,0x08,0x2C,0x0C,0xFA,0x13,0x3E,0x07, +0xF6,0x40,0x84,0x01,0x3E,0x07,0xF6,0x41,0x3E,0x17,0xF6,0x42,0x84,0x06,0xD5,0x98, +0x5A,0x08,0x2E,0x06,0x3E,0x17,0xF6,0x40,0x84,0x01,0xD5,0x95,0x5A,0x08,0x2F,0x04, +0x84,0x00,0xD5,0x48,0x5A,0x08,0x2D,0x2F,0xFA,0x18,0x3E,0x07,0xF6,0x40,0x84,0x62, +0x84,0x00,0x84,0x26,0x84,0x4C,0x3E,0x37,0xF6,0x41,0x3E,0x07,0xF6,0x42,0x3E,0x17, +0xF6,0x43,0x3E,0x27,0xF6,0x44,0x3E,0x37,0xF6,0x45,0x3E,0x07,0xF6,0x46,0x84,0x64, +0x3E,0x17,0xF6,0x47,0x3E,0x27,0xF6,0x48,0x84,0x41,0x3E,0x27,0xF6,0x49,0x3E,0x07, +0xF6,0x4A,0x3E,0x37,0xF6,0x4B,0x3E,0x37,0xF6,0x4C,0x3E,0x27,0xF6,0x4D,0x3E,0x07, +0xF6,0x4E,0x84,0x03,0x3E,0x07,0xF6,0x4F,0x3E,0x17,0xF6,0x50,0xFA,0x01,0x48,0xFF, +0xFF,0x63,0x5A,0x08,0x1B,0x0A,0x84,0x01,0x3E,0x07,0xFC,0x49,0x84,0x01,0x49,0xFF, +0xE4,0x8A,0x48,0x00,0x03,0x0C,0x5A,0x08,0x30,0x11,0x49,0xFF,0xE4,0x81,0x5A,0x08, +0x01,0x05,0x44,0x00,0x00,0x40,0xD5,0x06,0x49,0xFF,0xE4,0x7A,0xC8,0xB6,0x44,0x00, +0x00,0x41,0x3E,0x07,0xF6,0x40,0xD5,0xB1,0x5A,0x08,0x36,0x06,0x49,0xFF,0xFA,0x47, +0x48,0x00,0x02,0xF5,0x5A,0x08,0x03,0x04,0x84,0x00,0xD5,0x04,0x5A,0x08,0x04,0x07, +0x84,0x02,0x3E,0x07,0xFC,0x49,0x48,0x00,0x02,0xEA,0x5A,0x08,0x06,0x07,0x84,0x01, +0x3E,0x07,0xF6,0x2F,0x48,0x00,0x02,0xE3,0x5A,0x08,0x07,0x07,0x84,0x01,0x3E,0x07, +0xF6,0x2E,0x48,0x00,0x02,0xDC,0x5A,0x08,0x08,0x07,0x84,0x01,0x3E,0x07,0xF6,0x2D, +0x48,0x00,0x02,0xD5,0x5A,0x08,0x09,0x07,0x84,0x01,0x3E,0x07,0xF6,0x2C,0x48,0x00, +0x02,0xCE,0x5A,0x08,0x0A,0x07,0x84,0x01,0x3E,0x07,0xF6,0x2B,0x48,0x00,0x02,0xC7, +0x5A,0x08,0x0B,0x06,0x84,0x01,0x3E,0x07,0xF6,0x29,0xD5,0x0F,0x5A,0x08,0x0C,0x09, +0x84,0x01,0x3E,0x07,0xF6,0x2A,0x3E,0x07,0xF6,0x28,0x48,0x00,0x02,0xB8,0x5A,0x08, +0x0D,0x07,0x84,0x01,0x3E,0x07,0xF6,0x2A,0x84,0x00,0xD5,0xF6,0x5A,0x08,0x32,0x04, +0x84,0x01,0xD5,0x04,0x5A,0x08,0x33,0x07,0x84,0x02,0x3E,0x07,0xE3,0xB8,0x48,0x00, +0x02,0xA6,0x5A,0x08,0x3C,0x35,0x2E,0x57,0xFB,0xB9,0x2E,0x47,0xFB,0xBB,0x2E,0x07, +0xFB,0xBA,0x40,0x42,0x20,0x08,0x2E,0x37,0xFB,0xBD,0x2E,0x27,0xFB,0xBC,0xFF,0x07, +0x84,0x26,0x97,0x68,0x96,0xD8,0x96,0x90,0x84,0x00,0x99,0xE1,0xE0,0xE1,0xE9,0x08, +0x8C,0x21,0x38,0x93,0x04,0x00,0x96,0x49,0x88,0x09,0x96,0x00,0xD5,0xF8,0x4E,0x03, +0x02,0x86,0x5A,0x50,0x02,0x04,0x48,0x00,0x02,0x82,0x40,0x31,0xA0,0x08,0xFE,0x9F, +0x44,0x12,0x10,0x00,0x88,0x41,0x96,0x41,0xE2,0x24,0x4E,0xF2,0x02,0x78,0x9C,0x47, +0x38,0x13,0x04,0x00,0x38,0x11,0x00,0x08,0x8C,0x01,0xD5,0xF6,0x5A,0x08,0x3D,0x29, +0x2E,0x07,0xFB,0xBA,0x2E,0x17,0xFB,0xB9,0x40,0x00,0x20,0x08,0x2E,0x27,0xFB,0xBC, +0xFE,0x0F,0x2E,0x17,0xFB,0xBB,0x40,0x21,0x20,0x08,0xFE,0x8F,0x2E,0x17,0xFB,0xB8, +0x44,0x32,0x10,0x00,0x96,0x48,0x3E,0x17,0xF6,0x40,0x88,0x43,0x84,0x20,0x44,0x42, +0x18,0x30,0x96,0xC9,0xE2,0x60,0xE8,0x08,0x9C,0xC9,0x38,0x11,0x04,0x00,0x38,0x12, +0x0C,0x08,0x80,0x23,0xD5,0xF7,0x8C,0x01,0x96,0x01,0x48,0xFF,0xFE,0x95,0x5A,0x08, +0x3E,0x31,0x2E,0x07,0xFB,0xB9,0x5A,0x00,0x5A,0x04,0x48,0x00,0x02,0x40,0x2E,0x07, +0xFB,0xBA,0x5A,0x00,0xA5,0x04,0x48,0x00,0x02,0x3A,0xFA,0x00,0x49,0xFF,0xD9,0xA3, +0x44,0x11,0x00,0x00,0x44,0x20,0x01,0x00,0x44,0x02,0x10,0x00,0x49,0xFF,0xD9,0xC4, +0x49,0xFF,0xDA,0x3E,0x40,0x10,0x60,0x09,0x10,0x1F,0x80,0x04,0x40,0x10,0x40,0x09, +0x10,0x1F,0x80,0x05,0x40,0x10,0x20,0x09,0x10,0x1F,0x80,0x06,0x10,0x0F,0x80,0x07, +0x44,0x11,0x0F,0xFC,0xB0,0x01,0x84,0x44,0x49,0xFF,0xD9,0xAE,0x48,0x00,0x02,0x17, +0x5A,0x08,0x3F,0x22,0x2E,0x07,0xFB,0xB9,0x5A,0x08,0x01,0x12,0x2E,0x07,0xFB,0xBA, +0x96,0x00,0x5A,0x00,0x01,0x08,0x5A,0x00,0x02,0x04,0x48,0x00,0x02,0x08,0x84,0x04, +0xD5,0x02,0x84,0x02,0x3E,0x07,0xE2,0xCD,0x48,0x00,0x02,0x01,0x44,0x00,0x00,0x35, +0x3E,0x07,0xF6,0x40,0x2E,0x07,0xE2,0xCD,0x96,0x00,0x3E,0x07,0xF6,0x41,0x84,0x02, +0x48,0xFF,0xFE,0x42,0x5A,0x08,0x0E,0x0D,0x2E,0x07,0xEF,0xAA,0x58,0x00,0x00,0x01, +0x3E,0x07,0xEF,0xAA,0x2E,0x07,0xEF,0xAA,0x58,0x00,0x00,0x04,0xD5,0x0D,0x5A,0x08, +0x10,0x13,0x2E,0x07,0xEF,0xAA,0x58,0x00,0x00,0x01,0x3E,0x07,0xEF,0xAA,0x2E,0x07, +0xEF,0xAA,0x58,0x00,0x00,0x02,0x3E,0x07,0xEF,0xAA,0x2E,0x07,0xEF,0xAA,0x54,0x00, +0x00,0xF7,0xD5,0x15,0x5A,0x08,0x11,0x0E,0x2E,0x07,0xEF,0xAB,0x5A,0x08,0x01,0x06, +0x44,0x0F,0xFF,0x91,0x48,0xFF,0xFE,0xCF,0x44,0x0F,0xFF,0x90,0x48,0xFF,0xFE,0xCB, +0x5A,0x08,0x12,0x0A,0x2E,0x07,0xEF,0xAA,0x58,0x00,0x00,0x08,0x3E,0x07,0xEF,0xAA, +0x48,0x00,0x01,0xBD,0x5A,0x08,0x13,0x77,0x3C,0x0D,0xB7,0x75,0x46,0x10,0x0F,0xF0, +0x92,0x18,0x3E,0x07,0xF6,0x40,0x3C,0x0D,0xB7,0x75,0xFE,0x0E,0x92,0x10,0x3E,0x07, +0xF6,0x41,0x3C,0x2D,0xB7,0x75,0x44,0x00,0xFF,0x00,0xFE,0x86,0x92,0x48,0x3E,0x27, +0xF6,0x42,0x3C,0x2D,0xB7,0x75,0x96,0x90,0x3E,0x27,0xF6,0x43,0x3C,0x2D,0xB7,0x76, +0x92,0x58,0x3E,0x27,0xF6,0x44,0x3C,0x2D,0xB7,0x76,0xFE,0x8E,0x92,0x50,0x3E,0x27, +0xF6,0x45,0x3C,0x2D,0xB7,0x76,0xFE,0x86,0x92,0x48,0x3E,0x27,0xF6,0x46,0x3C,0x2D, +0xB7,0x76,0x96,0x90,0x3E,0x27,0xF6,0x47,0x3C,0x2D,0xB7,0x77,0x92,0x58,0x3E,0x27, +0xF6,0x48,0x3C,0x2D,0xB7,0x77,0xFE,0x8E,0x92,0x50,0x3E,0x27,0xF6,0x49,0x3C,0x2D, +0xB7,0x77,0xFE,0x86,0x92,0x48,0x3E,0x27,0xF6,0x4A,0x3C,0x2D,0xB7,0x77,0x96,0x90, +0x3E,0x27,0xF6,0x4B,0x3C,0x2D,0xB7,0x78,0x92,0x58,0x3E,0x27,0xF6,0x4C,0x3C,0x2D, +0xB7,0x78,0xFE,0x8E,0x92,0x50,0x3E,0x27,0xF6,0x4D,0x3C,0x2D,0xB7,0x78,0xFE,0x86, +0x92,0x48,0x3E,0x27,0xF6,0x4E,0x3C,0x2D,0xB7,0x78,0x96,0x90,0x3E,0x27,0xF6,0x4F, +0x3C,0x2D,0xB7,0x79,0x92,0x58,0x3E,0x27,0xF6,0x50,0x3C,0x2D,0xB7,0x79,0xFE,0x56, +0x92,0x30,0x3E,0x17,0xF6,0x51,0x3C,0x1D,0xB7,0x79,0xFE,0x0E,0x92,0x08,0x3E,0x07, +0xF6,0x52,0x3C,0x0D,0xB7,0x79,0x96,0x00,0x3E,0x07,0xF6,0x53,0xFA,0x04,0x48,0xFF, +0xFD,0x93,0x5A,0x08,0x15,0x07,0x84,0x09,0x3E,0x07,0xF6,0x40,0x84,0x01,0xD5,0x07, +0x5A,0x08,0x16,0x0B,0x84,0x09,0x3E,0x07,0xF6,0x40,0x84,0x02,0x3E,0x07,0xF6,0x41, +0x2E,0x07,0xF6,0x3B,0xD5,0x0B,0x5A,0x08,0x17,0x10,0x84,0x09,0x3E,0x07,0xF6,0x40, +0x84,0x03,0x3E,0x07,0xF6,0x41,0x2E,0x07,0xF6,0x39,0x96,0x1F,0x3E,0x07,0xF6,0x42, +0x84,0x03,0x48,0xFF,0xFD,0x71,0x5A,0x08,0x18,0x5B,0xFA,0x21,0x3E,0x17,0xF6,0x40, +0x84,0x21,0x3E,0x17,0xF6,0x41,0x2E,0x27,0xE1,0xFC,0x84,0x20,0x3E,0x17,0xF6,0x42, +0x3E,0x07,0xF6,0x43,0x3E,0x27,0xF6,0x44,0x2E,0x27,0xE1,0xFE,0x3E,0x27,0xF6,0x45, +0x2E,0x27,0xE1,0xFD,0x3E,0x27,0xF6,0x46,0x3C,0x23,0xF0,0xFD,0x40,0x31,0x20,0x09, +0x96,0x90,0x3E,0x37,0xF6,0x47,0x3E,0x27,0xF6,0x48,0x3C,0x23,0xF0,0xFC,0x40,0x31, +0x20,0x09,0x96,0x90,0x3E,0x37,0xF6,0x49,0x3E,0x27,0xF6,0x4A,0x3C,0x23,0xF1,0x00, +0x40,0x31,0x20,0x09,0x96,0x90,0x3E,0x37,0xF6,0x4B,0x3E,0x27,0xF6,0x4C,0x3C,0x23, +0xF1,0x01,0x40,0x31,0x20,0x09,0x96,0x90,0x3E,0x37,0xF6,0x4D,0x3E,0x27,0xF6,0x4E, +0x3C,0x23,0xF1,0x02,0x40,0x31,0x20,0x09,0x96,0x90,0x3E,0x37,0xF6,0x4F,0x3E,0x27, +0xF6,0x50,0x3C,0x23,0xF1,0x03,0x40,0x31,0x20,0x09,0x96,0x90,0x3E,0x37,0xF6,0x51, +0x3E,0x27,0xF6,0x52,0x3E,0x17,0xF6,0x53,0x3E,0x17,0xF6,0x54,0x3E,0x17,0xF6,0x55, +0x3E,0x17,0xF6,0x56,0x3E,0x17,0xF6,0x57,0x48,0xFF,0xFD,0x16,0x5A,0x08,0x19,0x39, +0xFA,0x01,0x3E,0x07,0xF6,0x40,0x84,0x02,0x3E,0x07,0xF6,0x41,0xFA,0x28,0x84,0x00, +0x3E,0x07,0xF6,0x42,0x3E,0x17,0xF6,0x43,0x3E,0x07,0xF6,0x44,0x3E,0x07,0xF6,0x45, +0x3E,0x07,0xF6,0x46,0x3E,0x07,0xF6,0x47,0x3E,0x07,0xF6,0x48,0x3E,0x07,0xF6,0x49, +0x3E,0x07,0xF6,0x4A,0x3E,0x07,0xF6,0x4B,0x3E,0x07,0xF6,0x4C,0x3E,0x07,0xF6,0x4D, +0x3E,0x07,0xF6,0x4E,0x3E,0x07,0xF6,0x4F,0x3E,0x07,0xF6,0x50,0x3E,0x07,0xF6,0x51, +0x3E,0x07,0xF6,0x52,0x3E,0x07,0xF6,0x53,0x3E,0x07,0xF6,0x54,0x3E,0x07,0xF6,0x55, +0x3E,0x07,0xF6,0x56,0x3E,0x07,0xF6,0x57,0xFA,0x08,0x48,0xFF,0xFC,0xDD,0x5A,0x08, +0x1A,0x63,0xFA,0x01,0x3E,0x07,0xF6,0x40,0x84,0x03,0x3E,0x07,0xF6,0x41,0x84,0x20, +0xFA,0x08,0x3E,0x17,0xF6,0x42,0x3E,0x07,0xF6,0x43,0x2E,0x07,0xE1,0xF0,0x3E,0x07, +0xF6,0x44,0x2E,0x07,0xE1,0xF1,0x3E,0x07,0xF6,0x45,0x2E,0x07,0xE1,0xF2,0x3E,0x07, +0xF6,0x46,0x3C,0x03,0xF0,0xF6,0x40,0x20,0x20,0x09,0x96,0x00,0x3E,0x27,0xF6,0x47, +0x3E,0x07,0xF6,0x48,0x3C,0x03,0xF0,0xF7,0x40,0x20,0x20,0x09,0x96,0x00,0x3E,0x27, +0xF6,0x49,0x3E,0x07,0xF6,0x4A,0x3C,0x03,0xF0,0xF2,0x40,0x20,0x20,0x09,0x96,0x00, +0x3E,0x27,0xF6,0x4B,0x3E,0x07,0xF6,0x4C,0x3C,0x03,0xF0,0xF3,0x40,0x20,0x20,0x09, +0x96,0x00,0x3E,0x27,0xF6,0x4D,0x3E,0x07,0xF6,0x4E,0x3C,0x03,0xF0,0xF4,0x40,0x20, +0x20,0x09,0x96,0x00,0x3E,0x27,0xF6,0x4F,0x3E,0x07,0xF6,0x50,0x3C,0x03,0xF0,0xF5, +0x40,0x20,0x20,0x09,0x96,0x00,0x3E,0x27,0xF6,0x51,0x3E,0x07,0xF6,0x52,0x2E,0x07, +0xE1,0xF3,0x3E,0x07,0xF6,0x53,0x2E,0x07,0xE1,0xF4,0x3E,0x07,0xF6,0x54,0x2E,0x07, +0xE1,0xF5,0x3E,0x07,0xF6,0x55,0x3E,0x17,0xF6,0x56,0xFA,0x07,0x3E,0x17,0xF6,0x57, +0x48,0xFF,0xFC,0x7A,0x5A,0x08,0x31,0x1A,0x84,0x1E,0x3E,0x07,0xF6,0x40,0x84,0x01, +0x3E,0x07,0xF6,0x41,0x84,0x02,0x3E,0x07,0xF6,0x42,0x84,0x03,0x3E,0x07,0xF6,0x43, +0x84,0x04,0x3E,0x07,0xF6,0x44,0x84,0x05,0x3E,0x07,0xF6,0x45,0x84,0x06,0x3E,0x07, +0xF6,0x46,0x84,0x07,0x48,0xFF,0xFC,0x60,0x5A,0x08,0x44,0x0C,0x84,0x00,0x49,0xFF, +0xE4,0x20,0x84,0x01,0x3C,0x0F,0xFF,0x13,0x84,0x03,0x3C,0x0F,0xFD,0x29,0xD5,0x06, +0x5A,0x08,0x45,0x05,0x84,0x00,0x3C,0x0F,0xFF,0x13,0x84,0x01,0x3C,0x0F,0xF8,0xB4, +0xFC,0xC1,0x5A,0x20,0x03,0x04,0x48,0xFF,0xF8,0xF0,0x84,0x00,0x3C,0x0F,0xF8,0xB4, +0x48,0xFF,0xFD,0x53,0x5A,0x28,0x03,0x07,0x84,0x00,0x3C,0x0F,0xF8,0xB4,0x48,0xFF, +0xFD,0xDB,0x44,0x00,0x00,0x3F,0x48,0xFF,0xF8,0xE2,0x5A,0x28,0x03,0x06,0x3C,0x0F, +0xF8,0xB4,0x48,0xFF,0xFD,0xA0,0x44,0x00,0x00,0x3E,0x48,0xFF,0xF8,0xD8,0x5A,0x28, +0x03,0x07,0x84,0x00,0x3C,0x0F,0xF8,0xB4,0x48,0xFF,0xFD,0x6C,0x44,0x00,0x00,0x3D, +0x48,0xFF,0xF8,0xCD,0xFC,0x00,0x44,0x04,0x10,0x04,0x44,0x10,0x00,0x55,0xAE,0x40, +0x44,0x1F,0xFF,0xAA,0xAE,0x41,0x44,0x10,0x00,0x66,0xAE,0x42,0x84,0x01,0x49,0xFF, +0xB5,0x40,0xFC,0x80,0x44,0x14,0x10,0x08,0xB6,0x01,0x44,0x14,0x80,0x04,0xA6,0x0B, +0x92,0x01,0x96,0x06,0xC0,0xFD,0x44,0x04,0x80,0x07,0x84,0x22,0xAE,0x40,0xDD,0x9E, +0xFC,0x40,0x44,0x37,0x20,0xC0,0x46,0x10,0x20,0x00,0xB4,0x43,0x44,0x47,0x20,0xC4, +0xFE,0x57,0xB6,0x23,0xB4,0x24,0x44,0x24,0x10,0x10,0x92,0x34,0x40,0x10,0xD0,0x08, +0xFE,0x57,0xB6,0x24,0x44,0x17,0x20,0xC8,0x40,0x00,0x30,0x08,0xB4,0x41,0x84,0xC1, +0x92,0x48,0x40,0x21,0x20,0x08,0xB6,0x41,0xB4,0x81,0x46,0x2F,0xCF,0xFF,0x50,0x21, +0x0F,0xFF,0xFF,0x16,0xB6,0x81,0xB4,0xA1,0x46,0x48,0x00,0x00,0xFF,0x67,0xB6,0xA1, +0x44,0x57,0x20,0xD0,0x44,0x70,0xA0,0x00,0xB4,0x25,0x44,0x94,0x10,0x00,0x94,0x49, +0x92,0x21,0xB6,0x25,0x44,0x57,0x20,0xD4,0x40,0x10,0x30,0x09,0xB4,0x05,0x92,0x14, +0x40,0x00,0x50,0x08,0xFE,0x0F,0xB6,0x05,0x44,0x07,0x20,0xD8,0xB4,0x20,0x92,0x28, +0x40,0x10,0xA0,0x08,0xFE,0x77,0xB6,0x20,0xB4,0x20,0xFE,0x8E,0xB6,0x40,0xB4,0x20, +0x44,0x27,0x20,0xDC,0xFF,0x0F,0xB6,0x80,0xB4,0x22,0x46,0x0F,0x0F,0xFF,0x92,0x31, +0x40,0x10,0xC4,0x08,0xFE,0x7F,0xB6,0x22,0xB4,0x22,0x50,0x00,0x0F,0xFF,0xFE,0x0E, +0x44,0x14,0x80,0x84,0xB6,0x02,0xB4,0x41,0x44,0x0D,0xFF,0xFF,0xFE,0x16,0xB6,0x01, +0xB4,0x23,0x46,0x0F,0xFF,0x0F,0x50,0x00,0x0F,0xFF,0xFE,0x0E,0x44,0x11,0x00,0x00, +0xFE,0x0F,0xB6,0x03,0x84,0x00,0x10,0x64,0x80,0x02,0x10,0x04,0x80,0x00,0x49,0xFF, +0xFF,0x73,0x84,0x0B,0x49,0xFF,0xFF,0x80,0x80,0x06,0x49,0xFF,0xFF,0x7D,0xFA,0x10, +0x49,0xFF,0xFF,0x7A,0x84,0x00,0x49,0xFF,0xFF,0x77,0x00,0x04,0x80,0x03,0x54,0x00, +0x00,0xFE,0x10,0x04,0x80,0x03,0x84,0x00,0x49,0xFF,0xFF,0x6E,0x44,0x04,0x10,0x0C, +0x44,0x14,0x80,0x07,0xB6,0xE0,0x84,0x02,0xAE,0x08,0x44,0x14,0x80,0x06,0xAE,0x08, +0x44,0x04,0x10,0x13,0xAF,0x80,0xFC,0xC0,0xFC,0x00,0x49,0xFF,0xE0,0x99,0x5A,0x08, +0x01,0x0B,0x84,0x00,0x49,0xFF,0xFF,0x66,0x49,0xFF,0xB5,0xA4,0x84,0x00,0x49,0xFF, +0xE0,0x92,0xD5,0x00,0xFC,0x80,0xC0,0x06,0x5A,0x08,0x01,0x08,0x44,0x00,0x00,0x60, +0xDD,0x9E,0x44,0x00,0x00,0x58,0xDD,0x9E,0x44,0x00,0x00,0xFF,0xDD,0x9E,0xFC,0x01, +0x2E,0x17,0xF6,0x3B,0xC9,0x0A,0x2E,0x17,0xF6,0x3A,0xC9,0x0A,0x2E,0x17,0xF6,0x39, +0xC1,0x0E,0x44,0x0F,0xFF,0xAD,0xD5,0x06,0x44,0x0F,0xFF,0xAB,0xD5,0x03,0x44,0x0F, +0xFF,0xAC,0x10,0x0F,0x80,0x00,0x10,0x1F,0x80,0x01,0xD5,0x07,0x44,0x1F,0xFF,0xAA, +0x10,0x1F,0x80,0x00,0x10,0x0F,0x80,0x01,0x84,0x00,0x84,0x28,0x10,0x0F,0x80,0x02, +0x10,0x1F,0x80,0x03,0x10,0x0F,0x80,0x04,0x10,0x0F,0x80,0x05,0x10,0x0F,0x80,0x06, +0x84,0x27,0x80,0x1F,0x49,0xFF,0xF2,0xD0,0xFC,0x81,0xFC,0x36,0x2E,0x17,0xF6,0x3B, +0xC9,0x0A,0x2E,0x17,0xF6,0x3A,0xC9,0x0A,0x2E,0x17,0xF6,0x39,0xC1,0x0E,0x44,0x0F, +0xFF,0xAD,0xD5,0x06,0x44,0x0F,0xFF,0xAB,0xD5,0x03,0x44,0x0F,0xFF,0xAC,0x10,0x0F, +0x80,0x04,0x10,0x1F,0x80,0x05,0xD5,0x07,0x44,0x1F,0xFF,0xAA,0x10,0x1F,0x80,0x04, +0x10,0x0F,0x80,0x05,0x3C,0x37,0xF7,0x9F,0x84,0x00,0x10,0x0F,0x80,0x06,0x44,0x0F, +0xFF,0xAA,0x3C,0x27,0xF7,0x99,0x10,0x0F,0x80,0x07,0x40,0x01,0xA0,0x0A,0x96,0x01, +0x94,0x44,0x40,0x01,0x20,0x0A,0x10,0x3F,0x80,0x09,0x96,0x1F,0x3C,0x37,0xF7,0x94, +0xFE,0x0F,0x10,0x0F,0x80,0x08,0x10,0x2F,0x80,0x0A,0x40,0x01,0xA0,0x0A,0x3C,0x27, +0xF7,0xA5,0x96,0x01,0x94,0x44,0x40,0x01,0x20,0x0A,0x10,0x3F,0x80,0x0C,0x96,0x1F, +0x3C,0x37,0xF7,0x9B,0xFE,0x0F,0x10,0x0F,0x80,0x0B,0x10,0x2F,0x80,0x0D,0x40,0x01, +0xA0,0x0A,0x3C,0x27,0xF7,0x9D,0x96,0x01,0x94,0x44,0x40,0x01,0x20,0x0A,0x10,0x3F, +0x80,0x0F,0x96,0x1F,0x3C,0x37,0xF7,0x9A,0xFE,0x0F,0x10,0x0F,0x80,0x0E,0x10,0x2F, +0x80,0x10,0x40,0x01,0xA0,0x0A,0x3C,0x27,0xF7,0xA2,0x96,0x01,0x94,0x44,0x40,0x01, +0x20,0x0A,0x10,0x3F,0x80,0x12,0x96,0x1F,0x3C,0x37,0xF7,0xB2,0xFE,0x0F,0x10,0x0F, +0x80,0x11,0x10,0x2F,0x80,0x13,0x40,0x01,0xA0,0x0A,0x3C,0x27,0xF7,0xB6,0x96,0x01, +0x94,0x44,0x40,0x01,0x20,0x0A,0x10,0x3F,0x80,0x15,0x96,0x1F,0x3C,0x37,0xF7,0xB3, +0xFE,0x0F,0x10,0x0F,0x80,0x14,0x10,0x2F,0x80,0x16,0x40,0x01,0xA0,0x0A,0x3C,0x27, +0xF7,0xB7,0x96,0x01,0x94,0x44,0x40,0x01,0x20,0x0A,0x10,0x3F,0x80,0x18,0x96,0x1F, +0x3C,0x37,0xF7,0xB4,0xFE,0x0F,0x10,0x0F,0x80,0x17,0x10,0x2F,0x80,0x19,0x40,0x01, +0xA0,0x0A,0x3C,0x27,0xF7,0xB8,0x96,0x01,0x94,0x44,0x40,0x01,0x20,0x0A,0x96,0x1F, +0x10,0x3F,0x80,0x1B,0x3C,0x37,0xF7,0xB5,0xFE,0x0F,0x10,0x0F,0x80,0x1A,0x10,0x2F, +0x80,0x1C,0x40,0x01,0xA0,0x0A,0x3C,0x27,0xF7,0xB9,0x96,0x01,0x94,0x44,0x40,0x01, +0x20,0x0A,0x96,0x1F,0x10,0x3F,0x80,0x1E,0x3C,0x37,0xF7,0x9C,0xFE,0x0F,0x10,0x0F, +0x80,0x1D,0x10,0x2F,0x80,0x1F,0x40,0x01,0xA0,0x0A,0x3C,0x27,0xF7,0xA3,0x96,0x01, +0x94,0x44,0x40,0x01,0x20,0x0A,0x96,0x1F,0x10,0x3F,0x80,0x21,0x3C,0x37,0xF7,0xA0, +0xFE,0x0F,0x10,0x0F,0x80,0x20,0x10,0x2F,0x80,0x22,0x40,0x01,0xA0,0x0A,0x3C,0x27, +0xF7,0x95,0x96,0x01,0x94,0x44,0x40,0x01,0x20,0x0A,0x96,0x1F,0xFE,0x0F,0x10,0x0F, +0x80,0x23,0x2E,0x07,0xEF,0x12,0x10,0x3F,0x80,0x24,0x10,0x0F,0x80,0x26,0x2E,0x07, +0xEF,0x13,0x3C,0x37,0xF7,0x98,0x10,0x0F,0x80,0x27,0x2E,0x07,0xEF,0x11,0x10,0x2F, +0x80,0x25,0x10,0x0F,0x80,0x28,0x3C,0x27,0xF7,0x9E,0x40,0x01,0xA0,0x0A,0x96,0x01, +0x94,0x44,0x40,0x01,0x20,0x0A,0x96,0x1F,0xFE,0x0F,0x10,0x0F,0x80,0x29,0x10,0x3F, +0x80,0x2A,0x10,0x2F,0x80,0x2B,0xB0,0x41,0x84,0x00,0x44,0x72,0x2D,0x50,0x44,0x62, +0x2D,0xAC,0x38,0x53,0x81,0x11,0x38,0x43,0x01,0x11,0x40,0x22,0xA0,0x0A,0x96,0x91, +0x94,0xD4,0x40,0x22,0x20,0x0A,0x96,0x9F,0xFE,0x9F,0x8C,0x01,0x10,0x20,0x80,0x28, +0x10,0x50,0x80,0x29,0x10,0x40,0x80,0x2A,0x8C,0x23,0x5A,0x08,0x28,0xEC,0x3C,0x03, +0xF7,0x96,0x40,0x10,0x20,0x09,0x10,0x0F,0x80,0xA5,0x84,0x00,0x10,0x1F,0x80,0xA4, +0x10,0x0F,0x80,0xA6,0x10,0x0F,0x80,0xA7,0x10,0x0F,0x80,0xA8,0x10,0x0F,0x80,0xA9, +0x10,0x0F,0x80,0xAA,0x10,0x0F,0x80,0xAB,0x10,0x0F,0x80,0xAC,0x44,0x10,0x00,0xA9, +0xB0,0x01,0x49,0xFF,0xF1,0xA1,0xFC,0xB6,0xFC,0x00,0x44,0x00,0x00,0x64,0x49,0xFF, +0xA7,0xF2,0x44,0x00,0x23,0x56,0x49,0xFF,0xA7,0xF9,0x44,0x00,0x1F,0x57,0x49,0xFF, +0xA8,0x00,0x44,0x00,0x01,0x90,0x49,0xFF,0xA8,0x07,0xFC,0x80,0xFC,0x40,0x51,0xFF, +0xFA,0xE0,0x84,0x20,0xFA,0x50,0xB0,0x10,0x49,0x00,0x10,0x86,0xB1,0x98,0x44,0x02, +0x02,0x24,0x80,0x26,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x00, +0xB1,0xE0,0x44,0x02,0x02,0x44,0x3A,0x20,0x94,0x20,0x80,0x27,0x3A,0x20,0x14,0x04, +0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x00,0x3A,0x20,0x94,0x20,0x44,0x12,0x02,0x64, +0xB0,0x0C,0x3A,0x20,0x94,0x00,0x44,0x12,0x02,0x74,0x3A,0x20,0x14,0x20,0xB0,0x07, +0x3A,0x20,0x8C,0x00,0x3A,0x20,0x0C,0x20,0x44,0x02,0x02,0x7C,0x50,0x8F,0x80,0x24, +0x3A,0x20,0x10,0x00,0x3A,0x24,0x10,0x20,0x85,0x40,0x39,0xC4,0x28,0x00,0x40,0x0E, +0x00,0x13,0xC0,0x13,0x5A,0x00,0x03,0x12,0xB0,0x10,0x38,0x00,0x72,0x02,0xC8,0x0D, +0x38,0x03,0x72,0x02,0x40,0x90,0x04,0x08,0x49,0xFF,0xE0,0x74,0x49,0xFF,0xE3,0x21, +0xB0,0x50,0x88,0x09,0x38,0x00,0xF2,0x0A,0x8D,0x41,0x5A,0xA8,0x0C,0xE8,0x84,0xC0, +0xB0,0x10,0x38,0x00,0x1A,0x02,0xF0,0x81,0xC8,0x07,0x8C,0xC1,0x5A,0x68,0x08,0xFA, +0x51,0xFF,0x85,0x20,0xFC,0xC0,0xB0,0x07,0x87,0x80,0x38,0xA3,0x00,0x00,0x40,0x95, +0x04,0x08,0x40,0x04,0x80,0x13,0xF0,0x82,0x94,0x01,0xF0,0x83,0x40,0xFE,0x24,0x07, +0xE8,0xED,0x4F,0xC3,0x00,0x13,0x38,0x83,0x9A,0x01,0x49,0xFF,0xA6,0x92,0x44,0x20, +0x01,0x20,0x80,0x28,0x42,0x10,0x08,0x73,0xB0,0x0C,0x96,0x49,0x38,0x20,0x19,0x01, +0xB0,0x28,0x92,0x42,0x49,0xFF,0xA6,0xEC,0x4D,0xC5,0x40,0x14,0x38,0x83,0x9A,0x01, +0x49,0xFF,0xA6,0x7F,0x44,0x20,0x01,0x20,0x50,0x14,0x02,0x40,0x42,0x10,0x08,0x73, +0xB0,0x0C,0x96,0x49,0x38,0x20,0x19,0x01,0xB0,0x28,0x92,0x42,0x49,0xFF,0xA6,0xD8, +0x40,0x14,0xF0,0x01,0x8E,0x21,0x94,0x4C,0x40,0x0E,0x00,0x13,0x97,0x49,0x40,0x1E, +0x28,0x06,0x94,0xC4,0x84,0x40,0xF1,0x84,0x50,0x8F,0x80,0xA0,0xF4,0x04,0x40,0x11, +0x04,0x09,0xC4,0x03,0x88,0x23,0xD5,0x03,0x88,0x25,0x96,0x49,0x38,0x44,0x06,0x02, +0x54,0xF2,0x00,0x1F,0x5A,0xF0,0x1F,0x1A,0x40,0xF2,0x18,0x09,0x54,0xF7,0x80,0x1F, +0x5A,0xF0,0x1F,0x14,0x04,0xFF,0x80,0x01,0x39,0xE7,0x81,0x01,0x50,0xFF,0x5D,0xEB, +0x5C,0xF7,0x82,0x13,0xE9,0x06,0x50,0xFF,0x64,0x27,0x5C,0xF7,0x82,0x13,0xE8,0x05, +0x50,0x42,0x00,0x41,0x38,0x44,0x06,0x0A,0x38,0x44,0x06,0x02,0x40,0xF2,0x48,0x09, +0x54,0xF7,0x80,0x1F,0x5A,0xF0,0x1F,0x21,0x40,0xF2,0x30,0x09,0x54,0xF7,0x80,0x1F, +0x5A,0xF0,0x1F,0x1B,0x04,0xFF,0x80,0x02,0x05,0xEF,0x80,0x01,0x40,0xF0,0x3C,0x00, +0x40,0xF7,0x80,0x13,0x39,0xEF,0x3D,0x01,0x50,0xFF,0x5D,0xEB,0x5C,0xF7,0x82,0x13, +0xE9,0x06,0x50,0xFF,0x64,0x27,0x5C,0xF7,0x82,0x13,0xE8,0x06,0x44,0xF4,0x10,0x00, +0x88,0x8F,0x38,0x44,0x06,0x0A,0xF1,0x03,0x8C,0x42,0x88,0x01,0x96,0x90,0x96,0x01, +0x5A,0x28,0x20,0xAE,0x50,0x5E,0x00,0x01,0x4C,0x55,0x40,0x16,0x38,0x13,0x9A,0x01, +0xF5,0x85,0xF1,0x84,0x49,0xFF,0xA6,0x05,0x44,0x20,0x01,0x20,0xF1,0x04,0x42,0x10, +0x08,0x73,0xB0,0x0C,0x96,0x49,0x38,0x20,0x19,0x01,0x80,0x08,0x92,0x42,0x49,0xFF, +0xA6,0x7B,0xF5,0x05,0x4C,0x54,0xC0,0x16,0x38,0x13,0x9A,0x01,0xF1,0x84,0x49,0xFF, +0xA5,0xF0,0xF1,0x04,0x44,0x20,0x01,0x20,0x50,0x10,0x82,0x40,0x42,0x10,0x08,0x73, +0xB0,0x0C,0x96,0x49,0x38,0x20,0x19,0x01,0x80,0x08,0x92,0x42,0x49,0xFF,0xA6,0x64, +0x50,0x5E,0x00,0x01,0x55,0xC2,0x80,0xFF,0x48,0xFF,0xFF,0x42,0xFC,0x49,0x44,0x12, +0x02,0x88,0xB1,0x86,0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20, +0x8C,0x00,0x3A,0x20,0x0C,0x20,0x84,0x20,0xB0,0x0C,0xFA,0x48,0x49,0x00,0x0F,0x54, +0x84,0x21,0x10,0x1F,0x80,0x31,0x10,0x1F,0x80,0x3D,0x84,0x02,0x44,0x12,0x02,0xA0, +0x10,0x0F,0x80,0x32,0x10,0x0F,0x80,0x3E,0x80,0x01,0x80,0x9F,0x3A,0x20,0x0C,0x04, +0x3A,0x22,0x0C,0x24,0xB1,0xC3,0x3A,0x20,0x8C,0x04,0xA4,0x00,0x80,0x27,0xAC,0x20, +0x3A,0x20,0x8C,0x24,0xAC,0x08,0x80,0x06,0x49,0xFF,0xAC,0x34,0xB0,0x0C,0x49,0xFF, +0xAC,0x84,0x80,0x1F,0x49,0xFF,0xAC,0x47,0x80,0x07,0x81,0x3F,0x49,0xFF,0xAC,0x96, +0xFC,0xC9,0xFC,0x26,0x44,0x12,0x02,0xAC,0x80,0xDF,0x3A,0x20,0x94,0x04,0x3A,0x23, +0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x23,0x14,0x24,0x3A,0x20,0x94,0x00,0x80,0x1F, +0x80,0xE6,0x3A,0x23,0x14,0x20,0x49,0xFF,0xAB,0xDF,0xFC,0xA6,0xFC,0x2C,0x44,0x12, +0x02,0xDC,0xB1,0x8C,0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20, +0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x00,0x3A,0x20,0x14,0x20,0x84,0x20, +0xB0,0x06,0xFA,0x48,0x49,0x00,0x0F,0x00,0xB1,0xC1,0x44,0x12,0x03,0x0C,0x80,0x07, +0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0xB4,0x21,0xB6,0x20,0x80,0x06,0x49,0xFF, +0xAB,0xBB,0xB0,0x06,0x49,0xFF,0xAB,0xD5,0x80,0x07,0x49,0xFF,0xAB,0xBF,0xFC,0xAC, +0xFC,0x01,0x44,0x12,0x03,0x20,0x80,0x1F,0x3A,0x20,0x8C,0x00,0x3A,0x2F,0x8C,0x20, +0x49,0xFF,0xAB,0xBE,0xFC,0x81,0xFC,0x00,0xC8,0x04,0x49,0xFF,0xFE,0x3F,0xFC,0x80, +0x44,0x00,0x00,0x64,0x49,0xFF,0xA6,0x2F,0x44,0x00,0x13,0xA6,0x49,0xFF,0xA6,0x36, +0x44,0x00,0x0F,0xA6,0x49,0xFF,0xA6,0x3D,0x44,0x00,0x01,0x90,0x49,0xFF,0xA6,0x44, +0xFC,0x80,0xFC,0x00,0xE6,0x06,0xE8,0x06,0x44,0x12,0x03,0xC0,0x38,0x00,0x80,0x00, +0xD5,0x02,0x84,0x00,0x49,0xFF,0xA6,0x4E,0xFC,0x80,0xFC,0x00,0xE6,0x06,0xE8,0x06, +0x44,0x12,0x03,0xB8,0x38,0x00,0x80,0x00,0xD5,0x02,0x84,0x00,0x8C,0x01,0x96,0x00, +0x49,0xFF,0xA6,0x35,0xFC,0x80,0xFC,0x00,0x5A,0x00,0x01,0x0E,0xC0,0x04,0x5A,0x00, +0x02,0x1C,0xFC,0x80,0x84,0x00,0x49,0xFF,0xB2,0x14,0x2E,0x07,0xFC,0x5B,0x49,0xFF, +0xFF,0xC4,0xD5,0x2A,0x49,0xFF,0xB2,0x0D,0x44,0x00,0x00,0x64,0x49,0xFF,0xA5,0xF3, +0x44,0x00,0x23,0x96,0x49,0xFF,0xA5,0xFA,0x44,0x00,0x23,0x96,0x49,0xFF,0xA6,0x01, +0x44,0x00,0x01,0x90,0xD5,0x17,0x84,0x01,0x49,0xFF,0xB1,0xFB,0x44,0x00,0x03,0xE8, +0x49,0xFF,0xA5,0xE1,0x44,0x00,0x27,0x10,0x49,0xFF,0xA5,0xF3,0x46,0x20,0x00,0x81, +0x46,0x12,0x71,0x00,0x83,0x82,0xB8,0x10,0x96,0x01,0xFE,0x0F,0xB8,0x90,0x44,0x00, +0x27,0x10,0x49,0xFF,0xA5,0xF1,0x84,0x00,0x49,0xFF,0xFF,0xB9,0xFC,0x80,0x00,0x00, +0xE6,0x04,0xE8,0x24,0xFC,0x00,0x44,0xF0,0xB8,0x44,0x38,0x07,0x80,0x00,0x40,0xF0, +0x3C,0x00,0xDD,0x0F,0x04,0x14,0x1E,0x22,0x84,0x00,0x49,0xFF,0xA8,0xD5,0x84,0x01, +0x49,0xFF,0xA8,0xC0,0x84,0x01,0xD5,0x0F,0x84,0x00,0x49,0xFF,0xA8,0xCD,0x84,0x01, +0xD5,0x07,0x84,0x01,0xD5,0x02,0x84,0x00,0x49,0xFF,0xA8,0xC6,0x84,0x00,0x49,0xFF, +0xA8,0xB1,0x84,0x00,0x49,0xFF,0xA8,0xB7,0xFC,0x80,0xDD,0x9E,0xFC,0x00,0x49,0xFF, +0xDE,0x79,0x80,0x60,0x3E,0x00,0x0A,0xD0,0x44,0x12,0x23,0xC0,0x44,0x02,0x28,0x40, +0x44,0x20,0x02,0x40,0x2E,0x47,0xFC,0x5A,0x49,0xFF,0xE7,0xD8,0xFC,0x80,0x44,0x02, +0x28,0x40,0xDD,0x9E,0x44,0x02,0x23,0xC0,0xDD,0x9E,0x44,0x02,0x21,0xB0,0xDD,0x9E, +0x44,0x02,0x1E,0xB0,0xDD,0x9E,0x44,0x02,0x1E,0x4C,0xDD,0x9E,0xFC,0x00,0xC0,0x02, +0x84,0x01,0x49,0xFF,0xA5,0xDB,0x84,0x00,0x49,0xFF,0xA5,0xCA,0xFC,0x80,0xFC,0x00, +0x84,0x00,0x80,0x20,0x49,0xFF,0xA7,0xDA,0x84,0x00,0x84,0x21,0x49,0xFF,0xA7,0xD6, +0xFC,0x80,0xFC,0x00,0x84,0x01,0x84,0x20,0x49,0xFF,0xA7,0xD0,0x84,0x01,0x80,0x20, +0x49,0xFF,0xA7,0xCC,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xDE,0x3C,0x52,0x10,0x00,0x01, +0x96,0x48,0x84,0x01,0x49,0xFF,0xA7,0xC2,0xFC,0x80,0xFC,0x49,0x80,0x20,0x44,0x02, +0x03,0x28,0x50,0xAF,0x80,0x0C,0x3A,0x20,0x10,0x00,0x44,0x02,0x03,0x34,0x3A,0x2F, +0x90,0x20,0x3A,0x20,0x10,0x00,0x3A,0x25,0x10,0x20,0x44,0x22,0x03,0x40,0xB0,0x06, +0x3A,0x21,0x10,0x00,0x3A,0x20,0x10,0x20,0x44,0x22,0x03,0x4C,0x50,0x9F,0x80,0x24, +0x3A,0x21,0x10,0x00,0x3A,0x24,0x90,0x20,0x44,0x22,0x02,0x7C,0xB1,0xCC,0x3A,0x21, +0x10,0x00,0x3A,0x23,0x90,0x20,0x44,0x22,0x03,0x58,0xB1,0x8F,0x3A,0x21,0x10,0x00, +0x80,0xBF,0x3A,0x23,0x10,0x20,0xC9,0x03,0x80,0x05,0xD5,0x12,0x5A,0x18,0x01,0x04, +0x80,0x0A,0xD5,0x0E,0x5A,0x10,0x02,0x0D,0x5A,0x18,0x03,0x04,0x80,0x09,0xD5,0x08, +0x5A,0x18,0x04,0x04,0x80,0x07,0xD5,0x04,0x5A,0x18,0x05,0x06,0x80,0x06,0x49,0xFF, +0xA4,0xD8,0xFC,0xC9,0x5A,0x10,0x06,0xEA,0xFC,0xC9,0xFC,0x03,0x84,0x20,0x84,0x4C, +0x80,0xC0,0x80,0x1F,0x49,0x00,0x0D,0xB8,0x44,0x12,0x03,0x64,0xB0,0x03,0x3A,0x20, +0x90,0x00,0x3A,0x20,0x10,0x20,0xCE,0x03,0x80,0x1F,0xD5,0x03,0x5A,0x68,0x01,0x04, +0x49,0xFF,0xA4,0xD3,0xFC,0x83,0xFC,0x00,0x84,0x00,0x49,0xFF,0xFF,0xA0,0x84,0x00, +0x49,0xFF,0xFF,0xE5,0x84,0x00,0x49,0xFF,0xA7,0xB7,0x84,0x00,0x49,0xFF,0xA7,0xE6, +0x49,0xFF,0xFE,0x36,0x49,0xFF,0xFE,0x84,0x49,0xFF,0xFE,0xAC,0x84,0x00,0x49,0xFF, +0xAD,0xC9,0x44,0x00,0x02,0x40,0x49,0xFF,0xAD,0xDB,0x44,0x00,0x02,0x40,0x49,0xFF, +0xAD,0xCC,0x84,0x09,0x49,0xFF,0xAD,0xDF,0x84,0x03,0x49,0xFF,0xAD,0xE5,0x44,0x62, +0x17,0x60,0x44,0x10,0x00,0xF0,0x84,0x00,0x49,0xFF,0xAC,0x6D,0x49,0xFF,0xE7,0xC4, +0x38,0x13,0x01,0x01,0x84,0x00,0x49,0xFF,0xAB,0x1B,0x44,0x10,0x00,0xF0,0x84,0x02, +0x49,0xFF,0xAC,0x61,0x49,0xFF,0xE7,0xB8,0x38,0x13,0x01,0x01,0x84,0x02,0x49,0xFF, +0xAB,0x0F,0x44,0x10,0x00,0xF0,0x84,0x05,0x49,0xFF,0xAC,0x55,0x49,0xFF,0xE7,0xAC, +0x38,0x13,0x01,0x01,0x46,0x60,0x00,0x81,0x84,0x05,0x49,0xFF,0xAB,0x01,0x49,0xFF, +0xA8,0x9B,0x04,0x03,0x03,0x91,0x92,0x0A,0x40,0x00,0x28,0x08,0x58,0x00,0x01,0xC0, +0x14,0x03,0x03,0x91,0x49,0xFF,0xA8,0x89,0x04,0x03,0x00,0x2C,0x46,0x1F,0xFC,0x0F, +0x92,0x06,0x94,0x06,0x58,0x00,0x00,0x2D,0x14,0x03,0x00,0x2C,0x04,0x03,0x00,0x2C, +0x50,0x10,0x8F,0xFF,0x46,0x20,0x02,0xD0,0xFE,0x0E,0xFE,0x17,0x14,0x03,0x00,0x2C, +0x04,0x03,0x00,0x2D,0x92,0x06,0x94,0x06,0x58,0x00,0x00,0x0A,0x14,0x03,0x00,0x2D, +0x04,0x03,0x00,0x2D,0xFE,0x46,0x46,0x00,0x00,0xA0,0xFE,0x47,0x14,0x13,0x00,0x2D, +0x04,0x13,0x00,0x2D,0x46,0x0C,0x0F,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x0E,0x46,0x10, +0xA0,0x00,0xFE,0x0F,0x14,0x03,0x00,0x2D,0x04,0x03,0x00,0x2F,0x92,0x06,0x94,0x06, +0x58,0x00,0x00,0x04,0x14,0x03,0x00,0x2F,0x44,0x00,0x02,0x80,0x49,0xFF,0xAB,0xF2, +0x84,0x00,0x49,0xFF,0xFE,0xE5,0x49,0xFF,0xFC,0x71,0x49,0xFF,0xAB,0xE9,0x3E,0x07, +0xFC,0x5B,0xFC,0x80,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xDD,0x50,0xC0,0x04,0x49,0xFF, +0xDD,0x50,0x84,0x01,0xFC,0x80,0x2E,0x07,0xF4,0xC2,0x96,0x00,0xC0,0x05,0x84,0x00, +0x3E,0x07,0xF4,0xC2,0x84,0x01,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xAB,0xD1,0xFC,0x80, +0x2E,0x07,0xFC,0x5B,0xDD,0x9E,0x2E,0x07,0xFC,0x5A,0xDD,0x9E,0x2E,0x07,0xFC,0x59, +0xDD,0x9E,0x2E,0x07,0xFC,0x58,0xDD,0x9E,0x3E,0x07,0xFC,0x58,0xDD,0x9E,0xFC,0x00, +0x80,0xC0,0x49,0xFF,0xAC,0xBE,0x80,0x06,0x49,0xFF,0xA3,0x47,0x84,0x00,0x84,0x2C, +0x5A,0x68,0x01,0x1F,0x49,0xFF,0xAC,0x1B,0x84,0x02,0x84,0x2A,0x49,0xFF,0xAC,0x17, +0x84,0x03,0x84,0x2A,0x49,0xFF,0xAC,0x13,0x84,0x05,0x84,0x2C,0x49,0xFF,0xAC,0x0F, +0x84,0x07,0x84,0x2C,0x49,0xFF,0xAC,0x0B,0x84,0x00,0x80,0x20,0x49,0xFF,0xA2,0xCC, +0x84,0x00,0x84,0x22,0x49,0xFF,0xA2,0xC8,0x44,0x02,0x22,0xB8,0xD5,0x41,0x49,0xFF, +0xAB,0xFE,0x84,0x01,0x84,0x2C,0x49,0xFF,0xAB,0xFA,0x84,0x02,0x84,0x2A,0x49,0xFF, +0xAB,0xF6,0x84,0x03,0x84,0x2A,0x49,0xFF,0xAB,0xF2,0x84,0x04,0x84,0x2C,0x49,0xFF, +0xAB,0xEE,0x84,0x05,0x84,0x2C,0x49,0xFF,0xAB,0xEA,0x84,0x06,0x84,0x2C,0x49,0xFF, +0xAB,0xE6,0x84,0x07,0x84,0x2C,0x49,0xFF,0xAB,0xE2,0x84,0x01,0x84,0x20,0x49,0xFF, +0xA2,0xA3,0x84,0x01,0x80,0x20,0x49,0xFF,0xA2,0x9F,0x84,0x00,0x84,0x22,0x49,0xFF, +0xA2,0x9B,0x84,0x00,0x84,0x23,0x49,0xFF,0xA2,0x97,0x84,0x01,0x84,0x24,0x49,0xFF, +0xA2,0x93,0x84,0x01,0x84,0x25,0x49,0xFF,0xA2,0x8F,0x84,0x01,0x84,0x26,0x49,0xFF, +0xA2,0x8B,0x84,0x01,0x84,0x27,0x49,0xFF,0xA2,0x87,0x44,0x02,0x23,0x3C,0x44,0x10, +0x00,0x42,0x49,0xFF,0xA8,0x84,0xFC,0x80,0x44,0x02,0x22,0xB8,0xDD,0x9E,0x44,0x02, +0x23,0x3C,0xDD,0x9E,0xFC,0x21,0x84,0xC2,0xF0,0x81,0x80,0xE2,0x80,0x01,0x5A,0x10, +0x01,0x03,0x84,0xC1,0x49,0xFF,0xFF,0x85,0xCF,0x0C,0x84,0x03,0x49,0xFF,0xA5,0x26, +0x84,0x03,0x49,0xFF,0xA8,0xB0,0xF0,0x01,0x80,0x26,0x49,0xFF,0xE4,0xF9,0xFC,0xA1, +0x84,0x02,0x49,0xFF,0xA5,0x1B,0x84,0x02,0x49,0xFF,0xA8,0xA5,0xF0,0x01,0x80,0x26, +0x84,0x40,0x49,0xFF,0xE4,0x7C,0xFC,0xA1,0xFC,0x00,0x84,0x00,0x49,0xFF,0xFD,0x83, +0x84,0x00,0x84,0x20,0x3E,0x07,0xFC,0x5A,0x3E,0x07,0xFC,0x59,0x80,0x41,0x2E,0x07, +0xFC,0x5B,0x49,0xFF,0xFF,0xD1,0xFC,0x80,0xFC,0x20,0x44,0x14,0x80,0x90,0x44,0x0F, +0xFF,0xEF,0xB4,0x41,0x46,0x70,0x00,0x81,0xFE,0x16,0xB6,0x01,0x44,0x04,0x80,0x10, +0xFA,0x20,0xAE,0x40,0xFA,0xC2,0x50,0x73,0x83,0xD4,0xB4,0x07,0x92,0x0B,0x96,0x27, +0xC0,0x07,0x8E,0xC1,0xC6,0x05,0x84,0x01,0x49,0xFF,0xB0,0x3A,0xD5,0xF7,0x44,0x04, +0x80,0x10,0xFA,0x20,0xAE,0x40,0x44,0x14,0x80,0x90,0xB4,0x01,0x58,0x00,0x00,0x10, +0xB6,0x01,0xFC,0xA0,0xFC,0x00,0x49,0xFF,0xEB,0x7A,0x5A,0x08,0x01,0x09,0x44,0x14, +0x50,0x28,0xB4,0x01,0x92,0x01,0x96,0x06,0x5A,0x00,0x01,0xFD,0xFC,0x80,0xFC,0x00, +0x80,0xC0,0x5A,0x08,0x01,0x04,0x49,0xFF,0xFF,0xEF,0x80,0x06,0x49,0x00,0x05,0xDF, +0x80,0x06,0x49,0xFF,0xA3,0x9A,0xFC,0x80,0xFC,0x20,0x84,0xE0,0x80,0xC0,0x84,0x00, +0x49,0xFF,0xFF,0xEF,0x49,0xFF,0xFF,0xBA,0x49,0xFF,0xDE,0xEC,0x3E,0x77,0xF4,0xC3, +0x49,0xFF,0xDC,0x3F,0x3E,0x77,0xF4,0xC2,0x5A,0x68,0x01,0x05,0x80,0x06,0x49,0xFF, +0xFF,0xE0,0xFC,0xA0,0xFC,0x00,0x3C,0x6D,0xFF,0x14,0xC6,0x0A,0x84,0x01,0x49,0xFF, +0xFF,0xE5,0x49,0xFF,0xFD,0xC8,0x84,0x00,0x3C,0x0F,0xFF,0x14,0xFC,0x80,0x49,0xFF, +0xEB,0x3E,0x5A,0x00,0x01,0xF5,0x3E,0x67,0xF4,0xC3,0x49,0xFF,0xDC,0x22,0x3E,0x67, +0xF4,0xC2,0x49,0xFF,0xFD,0xB8,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xFD,0xAA,0x46,0x00, +0x00,0x81,0x04,0x00,0x00,0xF5,0x92,0x0B,0x96,0x27,0xC8,0x04,0x49,0xFF,0xEB,0x27, +0xC0,0x05,0x84,0x00,0x49,0xFF,0xFF,0xC2,0x84,0x01,0x3C,0x0F,0xFF,0x14,0xFC,0x80, +0xFC,0x00,0x49,0xFF,0xFF,0xD1,0x44,0x64,0x50,0x28,0x2E,0x07,0xF4,0xC2,0xC0,0x0F, +0x84,0xC0,0x3E,0x67,0xF4,0xC3,0x49,0xFF,0xDB,0xFC,0x3E,0x67,0xF4,0xC2,0x49,0xFF, +0xFD,0x88,0x49,0xFF,0xFB,0x1D,0x49,0xFF,0xFF,0xD9,0xFC,0x80,0x2E,0x07,0xF4,0xB4, +0xC8,0x0F,0xB4,0x06,0x92,0x03,0x96,0x06,0x5A,0x00,0x01,0x0B,0xB4,0x06,0x92,0x01, +0x96,0x06,0xC0,0x06,0x3C,0x0D,0xFF,0x15,0x5A,0x08,0x01,0xE1,0xD5,0xE2,0x49,0xFF, +0xD3,0x3B,0x5A,0x08,0x02,0xF9,0xD5,0xDD,0xFC,0x49,0x2E,0x67,0xFC,0x5B,0x84,0x00, +0x49,0xFF,0xFE,0xA7,0x84,0x02,0x49,0xFF,0xA4,0x49,0x80,0x06,0x84,0x20,0x84,0x41, +0x49,0xFF,0xE3,0xAD,0x84,0x04,0x49,0xFF,0xFD,0x7A,0xB1,0x86,0x44,0x12,0x03,0x70, +0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x20, +0x14,0x24,0x3A,0x20,0x94,0x00,0x3A,0x20,0x14,0x20,0x44,0x02,0x03,0xA0,0x80,0x3F, +0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0x3A,0x20,0x0C,0x00,0x3A,0x20,0x8C,0x20, +0x80,0x1F,0x49,0xFF,0xA8,0x5F,0x80,0x06,0x49,0xFF,0xA8,0x26,0x84,0x00,0x3E,0x07, +0xF4,0xC1,0x80,0xFF,0x49,0xFF,0xFF,0x70,0x44,0x94,0x50,0x28,0x49,0xFF,0xA1,0xB6, +0x2E,0x07,0xF4,0xC1,0xC0,0x2C,0x84,0x00,0x3E,0x07,0xF4,0xC1,0x49,0xFF,0xFF,0x7E, +0x49,0xFF,0xFF,0x90,0x84,0x00,0x49,0xFF,0xFD,0x42,0x44,0x12,0x02,0xDC,0x80,0x06, +0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24, +0x3A,0x20,0x94,0x00,0x3A,0x20,0x14,0x20,0x44,0x02,0x02,0x88,0x80,0x27,0x3A,0x20, +0x14,0x04,0x3A,0x20,0x94,0x24,0x3A,0x20,0x0C,0x00,0x3A,0x20,0x8C,0x20,0x80,0x07, +0x49,0xFF,0xA8,0x28,0x80,0x06,0x49,0xFF,0xA7,0xEF,0xFC,0xC9,0x2E,0x07,0xF4,0xB4, +0xC8,0x0F,0xB4,0x09,0x92,0x03,0x96,0x06,0x5A,0x00,0x01,0x0B,0xB4,0x09,0x92,0x01, +0x96,0x06,0xC0,0x06,0x3C,0x0D,0xFF,0x15,0x5A,0x08,0x01,0xC4,0xD5,0xC5,0x49,0xFF, +0xD2,0xBB,0x5A,0x08,0x02,0xF9,0xD5,0xC0,0xFC,0x21,0xB6,0x1F,0x2E,0x07,0xFC,0x5A, +0x49,0xFF,0xAB,0x28,0xF0,0x81,0xB4,0x1F,0x49,0xFF,0xA5,0x50,0x44,0x10,0x02,0x40, +0xB4,0x1F,0x49,0xFF,0xAB,0x2A,0x84,0x02,0x49,0xFF,0xFC,0x8C,0x49,0xFF,0xFF,0x14, +0x49,0xFF,0xEA,0x5D,0x5A,0x08,0x01,0x1E,0x84,0xC2,0x44,0x74,0x50,0x28,0x2E,0x07, +0xF4,0xC2,0xC8,0x32,0x2E,0x07,0xF4,0xB4,0xC8,0x0F,0xB4,0x07,0x92,0x03,0x96,0x06, +0x5A,0x00,0x01,0x0B,0xB4,0x07,0x92,0x01,0x96,0x06,0xC0,0x06,0x3C,0x0D,0xFF,0x15, +0x5A,0x08,0x01,0xEF,0xD5,0x21,0x49,0xFF,0xD2,0x87,0x5A,0x08,0x02,0xF9,0xD5,0x1C, +0x44,0x64,0x50,0x28,0x2E,0x07,0xF4,0xC2,0xC8,0x22,0x2E,0x07,0xF4,0xB4,0xC8,0x0F, +0xB4,0x06,0x92,0x03,0x96,0x06,0x5A,0x00,0x01,0x0B,0xB4,0x06,0x92,0x01,0x96,0x06, +0xC0,0x06,0x3C,0x0D,0xFF,0x15,0x5A,0x08,0x01,0xEF,0xD5,0x11,0x49,0xFF,0xD2,0x6C, +0x5A,0x08,0x02,0xF9,0xD5,0x0C,0x49,0xFF,0xDB,0x0C,0x84,0x00,0x3E,0x07,0xF4,0xC2, +0x3E,0x07,0xF4,0xC3,0x5A,0x60,0x01,0xDE,0x84,0xC1,0xD5,0xC2,0x84,0xC0,0x3E,0x67, +0xF4,0xC3,0x49,0xFF,0xDA,0xFE,0x3E,0x67,0xF4,0xC2,0x49,0xFF,0xFE,0xDF,0x44,0x10, +0x02,0x40,0xB4,0x5F,0xF0,0x01,0x49,0xFF,0xE4,0x69,0x84,0x01,0x49,0xFF,0xFC,0x32, +0x84,0x01,0x49,0xFF,0xFE,0xA3,0xFC,0xA1,0xFC,0x00,0x2E,0x07,0xFC,0x5B,0x49,0xFF, +0xE6,0xC7,0x84,0x00,0x49,0xFF,0xFB,0xCF,0x84,0x20,0x2E,0x27,0xFC,0x59,0x2E,0x07, +0xFC,0x5B,0x49,0xFF,0xFE,0x21,0x84,0x00,0x49,0xFF,0xFF,0x80,0x2E,0x17,0xFC,0x5A, +0x2E,0x27,0xFC,0x59,0x2E,0x07,0xFC,0x5B,0x49,0xFF,0xFE,0x16,0x2E,0x07,0xFC,0x5B, +0x49,0xFF,0xE6,0xAE,0x2E,0x07,0xFC,0x5B,0x49,0xFF,0xE8,0x03,0x49,0xFF,0xE9,0xDF, +0xC8,0x09,0x2E,0x07,0xFC,0x5B,0x49,0xFF,0xFB,0x98,0x2E,0x07,0xFC,0x5B,0x49,0xFF, +0xFC,0x47,0x84,0x01,0x49,0xFF,0xFB,0xFE,0x49,0xFF,0xE5,0x90,0x49,0xFF,0xFE,0x84, +0xFC,0x80,0xFC,0x21,0x84,0x00,0x49,0xFF,0xFE,0x69,0x49,0xFF,0xDA,0xA5,0xF0,0x81, +0x84,0x00,0x49,0xFF,0xA4,0xAB,0x44,0x10,0x00,0xC0,0x84,0x00,0x49,0xFF,0xDD,0x44, +0x84,0x05,0x49,0xFF,0xFB,0x90,0x84,0x05,0x49,0xFF,0xFB,0x99,0x84,0x05,0x49,0xFF, +0xFC,0x4E,0x49,0xFF,0xFB,0x28,0x84,0x02,0x49,0xFF,0xFB,0xDC,0x84,0x01,0x49,0xFF, +0xFE,0x4D,0x84,0xCA,0x49,0xFF,0xFC,0x2F,0x44,0x74,0x50,0x28,0x84,0x00,0x3E,0x07, +0xF4,0xC3,0x2E,0x07,0xF4,0xC3,0xC8,0x15,0x2E,0x07,0xF4,0xB4,0xC8,0x0E,0xB4,0x07, +0x92,0x03,0x96,0x06,0xC8,0x0A,0xB4,0x07,0x92,0x01,0x96,0x06,0xC0,0x06,0x3C,0x0D, +0xFF,0x15,0x5A,0x08,0x01,0xF0,0xD5,0x05,0x49,0xFF,0xD1,0xD6,0x5A,0x08,0x02,0xF9, +0x84,0x00,0x3E,0x07,0xF4,0xC2,0x2E,0x07,0xF4,0xC2,0xC8,0x15,0x2E,0x07,0xF4,0xB4, +0xC8,0x0E,0xB4,0x07,0x92,0x03,0x96,0x06,0xC8,0x0A,0xB4,0x07,0x92,0x01,0x96,0x06, +0xC0,0x06,0x3C,0x0D,0xFF,0x15,0x5A,0x08,0x01,0xF0,0xD5,0x05,0x49,0xFF,0xD1,0xBC, +0x5A,0x08,0x02,0xF9,0x8E,0xC1,0x97,0xB0,0xCE,0xCA,0x80,0x06,0x49,0xFF,0xFE,0x0E, +0x49,0xFF,0xFA,0xF6,0x80,0x06,0x49,0xFF,0xFC,0x02,0x80,0x06,0x49,0xFF,0xFB,0x47, +0x84,0x03,0x49,0xFF,0xFB,0x8F,0xF0,0x01,0x49,0xFF,0xA4,0x48,0xFC,0xA1,0xFC,0x00, +0x49,0xFF,0xFF,0x91,0x44,0x02,0x1E,0xB0,0x44,0x10,0x00,0xC0,0x84,0x40,0x49,0xFF, +0xE3,0x95,0xFC,0x80,0xFC,0x00,0x2E,0x07,0xFC,0x5B,0x49,0xFF,0xE6,0x19,0x2E,0x17, +0xFC,0x5B,0x84,0x03,0x49,0xFF,0xE6,0xF7,0x84,0x03,0x49,0xFF,0xFB,0x1C,0x2E,0x07, +0xFC,0x5B,0x84,0x20,0x2E,0x27,0xFC,0x59,0x49,0xFF,0xFD,0x6E,0x49,0xFF,0xE9,0x3F, +0xC8,0x04,0x84,0x01,0x49,0xFF,0xFD,0xDA,0x84,0x01,0x49,0xFF,0xFB,0x63,0x44,0x64, +0x50,0x28,0x49,0xFF,0xFD,0xE9,0x2E,0x07,0xF4,0xC2,0xC0,0x1D,0x84,0xC0,0x3E,0x67, +0xF4,0xC3,0x49,0xFF,0xDA,0x16,0x3E,0x67,0xF4,0xC2,0x49,0xFF,0xFD,0xF7,0x44,0x10, +0x00,0x42,0x84,0x40,0x84,0x63,0x44,0x02,0x23,0x3C,0x49,0xFF,0xE3,0x90,0x84,0x00, +0x49,0xFF,0xFA,0xF1,0x2E,0x07,0xFC,0x5B,0x49,0xFF,0xE7,0x3B,0x84,0x01,0x49,0xFF, +0xFB,0x41,0xFC,0x80,0x2E,0x07,0xF4,0xB4,0xC8,0x0F,0xB4,0x06,0x92,0x03,0x96,0x06, +0x5A,0x00,0x01,0x0B,0xB4,0x06,0x92,0x01,0x96,0x06,0xC0,0x06,0x3C,0x0D,0xFF,0x15, +0x5A,0x08,0x01,0xD3,0xD5,0xD4,0x49,0xFF,0xD1,0x47,0x5A,0x08,0x02,0xF9,0xD5,0xCF, +0xFC,0x46,0x80,0xC0,0x84,0xE1,0x81,0x22,0xF1,0x8B,0x49,0xFF,0xD9,0x28,0xB6,0xDF, +0x84,0xC0,0x80,0x27,0x44,0x24,0x10,0x10,0x80,0x66,0x80,0x87,0x80,0xA6,0x80,0x07, +0xF7,0x81,0xF6,0x82,0xF6,0x83,0xF7,0x84,0xF6,0x85,0xF6,0x86,0xF6,0x87,0x14,0x9F, +0x80,0x08,0x49,0xFF,0xEA,0x8E,0x80,0x06,0x49,0xFF,0xD9,0x1E,0x80,0x07,0x49,0xFF, +0xD9,0x29,0x80,0x06,0x49,0xFF,0xD9,0x08,0x80,0x06,0x49,0xFF,0xD9,0x82,0x49,0xFF, +0xD9,0x4C,0x44,0x00,0x00,0x3B,0x49,0xFF,0xD9,0x56,0xF0,0x0B,0x49,0xFF,0xD9,0x61, +0x80,0x07,0x49,0xFF,0xD9,0x6D,0x80,0x06,0x49,0xFF,0xD9,0x4D,0x49,0xFF,0xD9,0x75, +0x80,0x09,0x49,0xFF,0xD9,0x77,0x80,0x06,0x49,0xFF,0xD9,0x78,0x80,0x07,0x49,0xFF, +0xD9,0x75,0x40,0x00,0x00,0x09,0x44,0x04,0x80,0x07,0x84,0x22,0xAE,0x40,0x80,0x07, +0x49,0xFF,0xD9,0x75,0xFC,0xC6,0xFC,0x00,0x44,0x04,0x30,0x10,0xB4,0x00,0x92,0x08, +0x96,0x00,0xC0,0x15,0x44,0x14,0x30,0x08,0x84,0x1E,0xB4,0x41,0x44,0x64,0x30,0x0C, +0xFE,0x16,0xB6,0x01,0xB4,0x06,0x58,0x00,0x00,0x01,0xB6,0x06,0x84,0x01,0x49,0xFF, +0xAD,0x4F,0xB4,0x06,0x58,0x00,0x00,0x02,0xB6,0x06,0xFC,0x80,0x44,0x14,0x00,0x40, +0x46,0x20,0x81,0x00,0xB6,0x41,0x44,0x64,0x30,0x0C,0xB6,0x01,0xB4,0x06,0x92,0x04, +0x96,0x06,0xC8,0xE1,0x44,0x00,0x00,0x64,0x49,0xFF,0xAD,0x31,0x3C,0x00,0x05,0x69, +0x8C,0x01,0x96,0x01,0x5C,0xF0,0x00,0x64,0x3C,0x08,0x05,0x69,0xE9,0xF0,0xD5,0xD3, +0xFC,0x00,0x84,0x01,0x49,0xFF,0xA1,0x1C,0x84,0x03,0x49,0xFF,0xA1,0x3C,0x84,0x00, +0x49,0xFF,0xA1,0xC2,0x84,0x00,0x49,0xFF,0xA1,0x46,0x84,0x03,0x49,0xFF,0xA1,0x64, +0x84,0x00,0x49,0xFF,0xA1,0x6F,0x84,0x01,0x49,0xFF,0xD8,0x70,0xFC,0x80,0xFC,0x00, +0x84,0x00,0x44,0x10,0x00,0xF0,0x49,0xFF,0xA7,0xEE,0x84,0x02,0x44,0x10,0x00,0xF0, +0x49,0xFF,0xA7,0xE9,0x84,0x01,0x44,0x10,0x00,0xF0,0x49,0xFF,0xA7,0xE4,0x84,0x03, +0x44,0x10,0x00,0xF0,0x49,0xFF,0xA7,0xDF,0x84,0x04,0x44,0x10,0x00,0xF0,0x49,0xFF, +0xA7,0xDA,0x44,0x10,0x00,0xF0,0x84,0x05,0x49,0xFF,0xA7,0xD5,0x84,0x01,0x49,0xFF, +0xD7,0x6E,0x84,0x03,0x84,0x2A,0x49,0xFF,0xA8,0x22,0x84,0x00,0x84,0x23,0x49,0xFF, +0x9E,0xE3,0xFC,0x80,0xFC,0x01,0xF0,0x81,0x49,0xFF,0xA9,0x50,0xE6,0x03,0xE9,0x04, +0xF0,0x01,0x49,0xFF,0xDC,0x45,0xFC,0x81,0xFC,0x00,0x84,0x01,0x49,0xFF,0xA3,0x75, +0x84,0x01,0x49,0xFF,0x9F,0x1F,0x84,0x01,0x49,0xFF,0xA2,0x59,0x84,0x00,0x49,0xFF, +0xFA,0x14,0x84,0x00,0x49,0xFF,0xF9,0xF7,0x84,0x01,0x49,0xFF,0xA1,0x8A,0x84,0x01, +0x49,0xFF,0xA6,0xB7,0x84,0x01,0x49,0xFF,0xA6,0xC4,0x84,0x01,0x49,0xFF,0xA1,0x81, +0x84,0x01,0x49,0xFF,0xA6,0xDC,0x84,0x01,0x49,0xFF,0xA2,0x80,0x84,0x01,0x49,0xFF, +0xA2,0x91,0x84,0x01,0x49,0xFF,0xA2,0xA7,0x49,0xFF,0xA9,0x20,0xE6,0x03,0xE8,0x05, +0x84,0x01,0x84,0x2F,0x49,0xFF,0xA8,0x7E,0x49,0xFF,0xA9,0x18,0xE6,0x03,0xE9,0x03, +0x49,0xFF,0xA9,0x18,0x49,0xFF,0xA9,0x12,0xE6,0x03,0xE8,0x03,0x49,0xFF,0xA9,0x1B, +0x84,0x04,0x49,0xFF,0xA9,0x2C,0xFC,0x80,0xC2,0x19,0xFC,0x00,0x49,0xFF,0xFE,0xF2, +0x44,0x00,0x00,0xFF,0x49,0xFF,0xD8,0xAF,0x49,0xFF,0xD8,0x59,0xC0,0xFE,0x44,0x04, +0x80,0x07,0x84,0x22,0xAE,0x40,0x84,0x00,0x49,0xFF,0xD8,0x0E,0x84,0x01,0x49,0xFF, +0xD8,0x88,0x84,0x00,0x49,0xFF,0xD8,0x7C,0xFC,0x80,0xDD,0x9E,0xC2,0x25,0xFC,0x00, +0x49,0xFF,0xFE,0xD8,0x44,0x00,0x00,0xFF,0x49,0xFF,0xD8,0x95,0x49,0xFF,0xA8,0xE6, +0xE6,0x03,0xE8,0x04,0x84,0x0A,0x49,0xFF,0xAC,0x7B,0x44,0x64,0x80,0x04,0xA6,0x32, +0x96,0x06,0xC0,0xFE,0x49,0xFF,0xD8,0x33,0xC0,0xFB,0x44,0x04,0x80,0x07,0x84,0x22, +0xAE,0x40,0x84,0x00,0x49,0xFF,0xD7,0xE8,0x84,0x01,0x49,0xFF,0xD8,0x62,0x84,0x00, +0x49,0xFF,0xD8,0x56,0xFC,0x80,0xDD,0x9E,0xFC,0x00,0x44,0x37,0x20,0x64,0x84,0x30, +0xB4,0x03,0xFE,0x0E,0x58,0x00,0x00,0x05,0xB6,0x03,0xB4,0x43,0x44,0x0F,0xF0,0xFF, +0xFE,0x86,0x58,0x21,0x05,0x00,0xB6,0x43,0x44,0x27,0x20,0x6C,0xB4,0x62,0xFE,0x5E, +0x58,0x10,0x80,0x05,0xB6,0x22,0xB4,0x22,0xFE,0x0E,0x58,0x00,0x05,0x00,0xB6,0x02, +0x44,0x00,0x00,0x3F,0x49,0xFF,0xA2,0x48,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xA8,0xE9, +0x49,0xFF,0xA9,0x4E,0x49,0xFF,0xA9,0xFC,0x84,0x01,0x49,0xFF,0xA8,0xD3,0x49,0xFF, +0xDB,0xF8,0xFC,0x80,0xFC,0x01,0xF1,0x81,0x49,0xFF,0xA9,0x99,0xF0,0x01,0x49,0xFF, +0xDB,0xDD,0xFC,0x81,0xFC,0x00,0x49,0xFF,0xE7,0x7A,0x5A,0x08,0x01,0x04,0x84,0x00, +0xD5,0x02,0x84,0x04,0x49,0xFF,0xA9,0x94,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xA9,0x87, +0xFC,0x80,0x44,0x04,0x40,0x0C,0xB4,0x00,0x92,0x01,0x96,0x06,0x5A,0x00,0x01,0x09, +0x44,0x07,0x10,0x14,0xB4,0x00,0x92,0x0E,0x56,0x00,0x00,0x01,0x96,0x06,0xDD,0x9E, +0xFC,0x00,0xC0,0x04,0x49,0xFF,0xFF,0xAA,0xFC,0x80,0x44,0x17,0x20,0x64,0x84,0x70, +0xB4,0x41,0xFE,0x9E,0xB6,0x41,0xB4,0x81,0x44,0x2F,0xF0,0xFF,0xFF,0x16,0xB6,0x81, +0x44,0x17,0x20,0x6C,0xB4,0x81,0xFE,0xE6,0xB6,0x61,0xB4,0x61,0xFE,0x9E,0xB6,0x41, +0x49,0xFF,0xA1,0xFA,0xFC,0x80,0xFC,0x42,0x49,0xFF,0x9F,0xA0,0xB6,0x1F,0x49,0xFF, +0xD8,0x1B,0xF0,0x81,0x84,0x00,0x49,0xFF,0xFB,0xD9,0x84,0x00,0x49,0xFF,0xA2,0x1E, +0x84,0x00,0x49,0xFF,0xD8,0x02,0x84,0x00,0x49,0xFF,0xA2,0x2C,0x84,0x01,0x49,0xFF, +0xA2,0x32,0x49,0xFF,0xAB,0xD0,0xE6,0x03,0xE8,0x03,0x49,0xFF,0xFF,0x77,0x84,0x05, +0x49,0xFF,0xF9,0x05,0x84,0x05,0x49,0xFF,0xF8,0xF6,0x84,0x05,0x49,0xFF,0xF9,0xB7, +0x49,0xFF,0xF8,0x91,0x84,0x01,0x49,0xFF,0xFB,0xB9,0x84,0xC2,0x49,0xFF,0xF9,0x9B, +0x44,0x74,0x50,0x28,0x84,0x00,0x3E,0x07,0xF4,0xC3,0x2E,0x07,0xF4,0xC3,0xC8,0x15, +0x2E,0x07,0xF4,0xB4,0xC8,0x0E,0xB4,0x07,0x92,0x03,0x96,0x06,0xC8,0x0A,0xB4,0x07, +0x92,0x01,0x96,0x06,0xC0,0x06,0x3C,0x0D,0xFF,0x15,0x5A,0x08,0x01,0xF0,0xD5,0x05, +0x49,0xFF,0xCF,0x42,0x5A,0x08,0x02,0xF9,0x84,0x00,0x3E,0x07,0xF4,0xC2,0x2E,0x07, +0xF4,0xC2,0xC8,0x15,0x2E,0x07,0xF4,0xB4,0xC8,0x0E,0xB4,0x07,0x92,0x03,0x96,0x06, +0xC8,0x0A,0xB4,0x07,0x92,0x01,0x96,0x06,0xC0,0x06,0x3C,0x0D,0xFF,0x15,0x5A,0x08, +0x01,0xF0,0xD5,0x05,0x49,0xFF,0xCF,0x28,0x5A,0x08,0x02,0xF9,0x84,0x00,0x3E,0x07, +0xF4,0xC2,0x5A,0x60,0x01,0x04,0x84,0xC1,0xD5,0xC6,0x49,0xFF,0xF9,0x52,0x84,0x00, +0x49,0xFF,0xFB,0x74,0x49,0xFF,0xAB,0x77,0xE6,0x03,0xE9,0x04,0x84,0x00,0x49,0xFF, +0x9F,0x1D,0x84,0x00,0x49,0xFF,0xA0,0xFB,0x84,0x00,0x80,0x20,0x49,0xFF,0xAA,0x16, +0x49,0xFF,0xAA,0xCA,0xF0,0x82,0x84,0x00,0x49,0xFF,0xAA,0xBD,0x84,0x00,0x49,0xFF, +0xA9,0x12,0x2E,0x07,0xF4,0xB4,0xC8,0x10,0x44,0x14,0x50,0x28,0xB4,0x01,0x92,0x03, +0x96,0x06,0xC8,0x0A,0xB4,0x01,0x92,0x01,0x96,0x06,0xC0,0x06,0x3C,0x0D,0xFF,0x15, +0x5A,0x08,0x01,0x0B,0xD5,0x05,0x49,0xFF,0xCE,0xEF,0x5A,0x08,0x02,0xF9,0x84,0xC0, +0x80,0xE6,0x81,0x26,0xD5,0x31,0x49,0xFF,0xAB,0x46,0xE6,0x03,0xE8,0x0D,0x46,0x00, +0x00,0x91,0x04,0x70,0x00,0x11,0x44,0x07,0x20,0xC0,0xB4,0xC0,0x80,0x07,0x80,0x26, +0x49,0xFF,0xDA,0xF5,0xD5,0x05,0x84,0xC0,0x49,0xFF,0xA9,0x98,0x80,0xE6,0x49,0xFF, +0xE6,0x8E,0x80,0x40,0x5A,0x08,0x01,0x08,0x44,0x00,0x0D,0xAC,0x84,0x20,0x80,0x62, +0x49,0x00,0x00,0xB7,0x46,0x00,0x00,0x91,0x85,0x21,0xA0,0x43,0x92,0x26,0x94,0x4E, +0x58,0x10,0x80,0x20,0xA8,0x43,0x49,0xFF,0xF8,0xFE,0x84,0x01,0x49,0xFF,0xFB,0x09, +0x84,0x01,0x49,0xFF,0xA3,0x8D,0x49,0xFF,0xE6,0x72,0x80,0x40,0x5A,0x08,0x01,0x08, +0x44,0x00,0x0D,0xAC,0x84,0x20,0x80,0x62,0x49,0x00,0x00,0x9B,0x84,0x00,0x49,0xFF, +0xF8,0x3A,0x84,0x00,0x49,0xFF,0xF8,0xFB,0x49,0xFF,0xF7,0xEA,0x49,0xFF,0xE6,0x6B, +0xF0,0x83,0xF1,0x03,0x84,0x01,0x49,0x00,0x01,0x12,0x5A,0x98,0x01,0x0B,0x49,0xFF, +0xA1,0xB7,0x5A,0x00,0x01,0xFE,0x64,0x00,0x00,0x20,0x84,0x01,0x3E,0x07,0xF4,0xC0, +0x84,0x00,0x49,0xFF,0xFA,0xDE,0x49,0xFF,0xF8,0xC4,0x44,0x04,0x80,0x10,0x84,0x21, +0xAE,0x40,0x44,0x14,0x80,0x11,0x84,0x44,0xAE,0x88,0xFA,0x20,0xAE,0x40,0x85,0x20, +0x49,0xFF,0xFA,0x9C,0x3E,0x97,0xF4,0xC3,0x49,0xFF,0xD7,0x23,0x3E,0x97,0xF4,0xC2, +0x49,0xFF,0xAA,0xD9,0xE6,0x03,0xE8,0x06,0x80,0x07,0x80,0x26,0x49,0xFF,0xDA,0x8F, +0xD5,0x06,0x84,0x00,0x49,0xFF,0xA3,0x44,0x49,0xFF,0xA9,0x30,0x44,0x10,0x00,0xEB, +0x84,0x01,0x49,0x00,0x00,0xDC,0xB4,0x1F,0x49,0xFF,0x9E,0x70,0xF0,0x02,0x49,0xFF, +0xAA,0x1A,0x49,0xFF,0xAA,0xC0,0xE6,0x03,0xE8,0x04,0x84,0x00,0x49,0xFF,0xFE,0xBA, +0x84,0x00,0x49,0xFF,0xA1,0x18,0x84,0x20,0x84,0x01,0x49,0xFF,0xA9,0x5F,0x84,0x00, +0x49,0xFF,0xF8,0xA5,0x84,0x00,0x49,0xFF,0xF7,0xEA,0x84,0x01,0x49,0xFF,0xA0,0x37, +0x84,0x01,0x49,0xFF,0xA0,0xFF,0x2E,0x67,0xF4,0xE9,0x44,0x0F,0xFF,0xC8,0x97,0xB0, +0x3E,0x00,0x0A,0xDC,0xC6,0x07,0x84,0x00,0x84,0xC1,0x3E,0x07,0xF4,0xE9,0x3C,0x6E, +0x02,0xB6,0x2E,0x07,0xF4,0xE8,0xC0,0x08,0x84,0x00,0x3E,0x07,0xF4,0xE8,0x49,0xFF, +0xF8,0x59,0x49,0xFF,0xDD,0x5A,0x49,0xFF,0xE1,0xA9,0x49,0xFF,0xE5,0xE8,0x80,0x40, +0x5A,0x08,0x01,0x08,0x44,0x00,0x01,0xF4,0x84,0x20,0x80,0x62,0x49,0x00,0x00,0x11, +0x84,0x00,0x49,0xFF,0xF7,0xB0,0xF0,0x01,0x49,0xFF,0xA0,0xC0,0x84,0x01,0x49,0xFF, +0xFA,0x68,0x49,0xFF,0xF8,0x58,0x49,0xFF,0xFA,0x31,0x80,0x06,0xFC,0xC2,0xFC,0x02, +0xF0,0x83,0xF1,0x81,0xFD,0x01,0xF2,0x82,0xB6,0x7F,0x49,0xFF,0xA8,0xF1,0xF0,0x01, +0xB4,0x3F,0x49,0xFF,0xA9,0x09,0xF0,0x03,0xF1,0x01,0xF2,0x02,0xB4,0x7F,0x49,0xFF, +0xA9,0x27,0xB4,0x1F,0x49,0xFF,0xA9,0x48,0xFC,0x82,0xFC,0x00,0x44,0x00,0xCA,0x1C, +0x49,0xFF,0xDC,0x2D,0x84,0x20,0x80,0x61,0x84,0x41,0x44,0x00,0x00,0x64,0x49,0xFF, +0xFF,0xE0,0x84,0x00,0x80,0x20,0x49,0xFF,0xA9,0x73,0x84,0x00,0x80,0x20,0x49,0xFF, +0xA2,0xCB,0x84,0x00,0x49,0xFF,0xA9,0x76,0x84,0x20,0x84,0x01,0x49,0xFF,0xA8,0xEE, +0x84,0x00,0x49,0xFF,0xA9,0x3B,0x84,0x40,0x84,0x61,0x44,0x00,0x03,0x41,0x84,0x27, +0x49,0xFF,0xFF,0xC7,0x84,0x00,0x84,0x21,0x49,0xFF,0xA9,0x5A,0x84,0x01,0x80,0x20, +0x49,0xFF,0xA2,0xB2,0x49,0x00,0x00,0x5A,0xFC,0x80,0xFC,0x00,0x80,0xC0,0x5A,0x08, +0x01,0x0D,0x84,0x00,0x3E,0x07,0xF4,0xC0,0x44,0x10,0x01,0xF4,0x84,0x02,0x49,0x00, +0x00,0x51,0x84,0x02,0x80,0x26,0xD5,0x03,0x84,0x02,0x84,0x20,0x49,0x00,0x00,0x58, +0xFC,0x80,0xFC,0x00,0x2E,0x07,0xF4,0xC0,0xC0,0x07,0x84,0x02,0x49,0x00,0x00,0x47, +0x84,0x00,0x3E,0x07,0xF4,0xC0,0x84,0x02,0x49,0x00,0x00,0x65,0x5A,0x08,0x01,0x04, +0x49,0xFF,0xE6,0xFD,0xFC,0x80,0xFC,0x00,0x84,0x01,0x49,0xFF,0xDC,0x12,0x84,0x07, +0x49,0xFF,0xDC,0x19,0x84,0x00,0x49,0xFF,0xDC,0x22,0x84,0x00,0x49,0xFF,0xDC,0x2B, +0x44,0x00,0xFF,0x14,0x49,0xFF,0xA9,0x66,0x49,0xFF,0xA9,0x74,0x49,0xFF,0xA9,0x6B, +0xFC,0x80,0xFC,0x00,0x49,0xFF,0xA9,0x67,0xFC,0x80,0xFC,0x00,0x5A,0x08,0x01,0x0B, +0xFE,0x0B,0x96,0x01,0x49,0xFF,0xA9,0x56,0x49,0xFF,0xA9,0x64,0x49,0xFF,0xA9,0x5B, +0xFC,0x80,0x49,0xFF,0xA9,0x6F,0xFC,0x80,0x3C,0x00,0x05,0x90,0x3C,0x10,0x05,0x90, +0x96,0x01,0x4C,0x00,0xFF,0xFB,0xDD,0x9E,0x84,0x00,0x3C,0x08,0x05,0x6F,0xDD,0x9E, +0x44,0x22,0x2C,0xD0,0x38,0x11,0x01,0x09,0xDD,0x9E,0xFC,0x00,0x80,0xC0,0x49,0xFF, +0xFF,0xED,0x44,0x12,0x2C,0xF0,0x38,0x00,0x99,0x09,0xFC,0x80,0x80,0x60,0x5A,0x18, +0x01,0x10,0xFC,0x20,0x80,0xC1,0x80,0xE0,0x49,0xFF,0xFF,0xF1,0x3C,0x20,0x05,0x6F, +0x40,0x13,0x1C,0x0C,0xFE,0x57,0x96,0x49,0x3C,0x18,0x05,0x6F,0xFC,0xA0,0x84,0x41, +0x3C,0x00,0x05,0x6F,0x40,0x11,0x0C,0x0C,0xFE,0x4B,0xFE,0x46,0x3C,0x18,0x05,0x6F, +0xDD,0x9E,0x3C,0x10,0x05,0x6F,0x40,0x10,0x80,0x0E,0x96,0x46,0xC9,0x03,0x80,0x01, +0xDD,0x9E,0xFC,0x00,0x80,0xC0,0x49,0xFF,0xFF,0xC1,0x44,0x12,0x2C,0xF0,0x44,0x22, +0x2C,0xD0,0x38,0x10,0x99,0x01,0x38,0x21,0x19,0x01,0x8A,0x01,0x96,0x01,0xE2,0x02, +0x56,0x07,0x80,0x01,0xFC,0x80,0xFC,0x00,0x80,0xC0,0x49,0xFF,0xFF,0xAF,0x44,0x12, +0x2C,0xF0,0x38,0x10,0x99,0x01,0x8A,0x01,0x96,0x01,0xFC,0x80,0x3C,0x00,0x05,0x90, +0x8C,0x01,0x96,0x01,0x3C,0x08,0x05,0x90,0xDD,0x9E,0x00,0x00,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x02,0x13,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0xF4,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0xD5,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0xB6,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0x97,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0x78,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0x59,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0x3A,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0x94,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x12,0xA4,0x02,0x64,0x22,0x04,0x02,0x3A,0x1F,0x88,0x3C, +0x64,0x12,0x00,0x02,0x9E,0x4A,0x64,0x12,0x00,0x03,0x44,0x10,0x00,0xA4,0x38,0x10, +0x82,0x02,0xDD,0x21,0x3A,0x0F,0x84,0x04,0x64,0x02,0x00,0x43,0x64,0x00,0x00,0x08, +0x64,0x02,0xA4,0x03,0x64,0x12,0x04,0x03,0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0x94,0x04, +0x3A,0x0F,0x80,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0x94,0x3C,0x3A,0xFF,0xBF,0xBC, +0x44,0x10,0x00,0xA4,0x38,0x10,0x82,0x02,0xDD,0x21,0x3A,0xFF,0xBF,0x84,0x3A,0x1F, +0x94,0x04,0x3A,0x0F,0x80,0x04,0x64,0x00,0x00,0x04,0xD5,0x00,0x3A,0x0F,0x80,0x3C, +0x84,0x00,0xD5,0xEB,0x3A,0x0F,0x80,0x3C,0x84,0x01,0xD5,0xE7,0x3A,0x0F,0x80,0x3C, +0x84,0x02,0xD5,0xE3,0x3A,0x0F,0x80,0x3C,0x84,0x03,0xD5,0xDF,0x3A,0x0F,0x80,0x3C, +0x84,0x04,0xD5,0xDB,0x3A,0x0F,0x80,0x3C,0x84,0x05,0xD5,0xD7,0x3A,0x0F,0x80,0x3C, +0x84,0x06,0xD5,0xD3,0x3A,0x0F,0x80,0x3C,0x84,0x07,0xD5,0xCF,0x3A,0x0F,0x80,0x3C, +0x84,0x08,0xD5,0xCB,0x3A,0x0F,0x80,0x3C,0x84,0x09,0xD5,0xC7,0x3A,0x0F,0x80,0x3C, +0x84,0x0A,0xD5,0xC3,0x3A,0x0F,0x80,0x3C,0x84,0x0B,0xD5,0xBF,0x3A,0x0F,0x80,0x3C, +0x84,0x0C,0xD5,0xBB,0x3A,0x0F,0x80,0x3C,0x84,0x0D,0xD5,0xB7,0x3A,0x0F,0x80,0x3C, +0x84,0x0E,0xD5,0xB3,0x3A,0x0F,0x80,0x3C,0x84,0x0F,0xD5,0xAF,0x3A,0x0F,0x80,0x3C, +0xFA,0x00,0xD5,0xAB,0x3A,0x0F,0x80,0x3C,0xFA,0x01,0xD5,0xA7,0x3A,0x0F,0x80,0x3C, +0xFA,0x02,0xD5,0xA3,0x3A,0x0F,0x80,0x3C,0xFA,0x03,0xD5,0x9F,0x3A,0x0F,0x80,0x3C, +0xFA,0x04,0xD5,0x9B,0x3A,0x0F,0x80,0x3C,0xFA,0x05,0xD5,0x97,0x3A,0x0F,0x80,0x3C, +0xFA,0x06,0xD5,0x93,0x3A,0x0F,0x80,0x3C,0xFA,0x07,0xD5,0x8F,0x3A,0x0F,0x80,0x3C, +0xFA,0x08,0xD5,0x8B,0x3A,0x0F,0x80,0x3C,0xFA,0x09,0xD5,0x87,0x3A,0x0F,0x80,0x3C, +0xFA,0x0A,0xD5,0x83,0x3A,0x0F,0x80,0x3C,0xFA,0x0B,0x48,0xFF,0xFF,0x7F,0x3A,0x0F, +0x80,0x3C,0xFA,0x0C,0x48,0xFF,0xFF,0x7A,0x3A,0x0F,0x80,0x3C,0xFA,0x0D,0x48,0xFF, +0xFF,0x75,0x3A,0x0F,0x80,0x3C,0xFA,0x0E,0x48,0xFF,0xFF,0x70,0x3A,0x0F,0x80,0x3C, +0x44,0x00,0x00,0x1F,0x48,0xFF,0xFF,0x6A,0x84,0x01,0x64,0x04,0xC0,0x02,0x44,0x02, +0x00,0x01,0x64,0x04,0xE0,0x03,0x45,0xD2,0x21,0xF0,0x3F,0xC8,0x00,0x00,0x45,0xF2, +0x5F,0xF4,0x84,0x00,0x42,0x0E,0x00,0x21,0x49,0x00,0x00,0x42,0x49,0x00,0x03,0x4D, +0xD5,0x00,0x92,0x00,0xFC,0x00,0x44,0x32,0x11,0x00,0x44,0x22,0x10,0x00,0x9A,0x9A, +0x44,0x02,0x10,0x00,0x44,0x11,0x10,0x00,0x49,0xFF,0xFB,0x22,0x49,0xFF,0xD9,0x08, +0x44,0x32,0x05,0xB0,0x44,0x22,0x00,0x00,0x9A,0x9A,0x44,0x02,0x00,0x00,0x44,0x11, +0x00,0x00,0x49,0xFF,0xFB,0x15,0x49,0xFF,0xD8,0xFB,0x44,0x02,0x11,0x00,0x44,0x22, +0x40,0x1C,0x84,0x20,0x8A,0x40,0x49,0x00,0x03,0x7F,0xFC,0x80,0x84,0x00,0x64,0x05, +0xE4,0x03,0x84,0x1F,0x64,0x03,0x04,0x03,0x64,0x03,0x24,0x03,0x64,0x12,0x24,0x02, +0x44,0x0F,0x0F,0xFF,0xFE,0x0E,0x64,0x02,0x24,0x03,0x64,0x12,0x00,0x02,0x84,0x18, +0xFE,0x0E,0x64,0x02,0x00,0x03,0x64,0x00,0x00,0x08,0xDD,0x9E,0xFC,0x00,0x49,0xFF, +0xFF,0xE7,0x64,0x00,0x80,0x02,0x92,0x1E,0xC0,0x06,0x64,0x00,0x84,0x02,0x96,0x2E, +0xC0,0x02,0xD5,0x00,0x49,0xFF,0xFF,0xB8,0x64,0x12,0x00,0x43,0x64,0x00,0x00,0x08, +0x64,0x00,0x00,0x08,0xFC,0x80,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E, +0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0x44,0x04,0x80,0x04,0xA6,0x01,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x05,0x84,0x21,0xAE,0x40,0xDD,0x9E,0x44,0x04,0x80,0x01, +0xA6,0x00,0xC8,0x05,0xFC,0x00,0x49,0xFF,0xD4,0x60,0xFC,0x80,0xDD,0x9E,0xFC,0x00, +0x44,0x04,0x80,0x00,0xA6,0x03,0x49,0xFF,0xD9,0x16,0xFC,0x80,0x44,0x14,0x80,0x04, +0x44,0x04,0x80,0x84,0xA6,0x88,0xB4,0x00,0x96,0x06,0xFE,0x16,0xC0,0x03,0x84,0x01, +0xAE,0x08,0xDD,0x9E,0xFC,0x00,0x44,0x04,0x80,0x00,0xA6,0x03,0x49,0xFF,0xA6,0x5B, +0xFC,0x80,0x44,0x14,0x80,0x14,0xA6,0x08,0x96,0x06,0xC0,0x09,0x84,0x01,0xAE,0x08, +0x44,0x14,0x80,0x94,0xB4,0x01,0x58,0x00,0x00,0x01,0xB6,0x01,0x44,0x14,0x80,0x14, +0xA6,0x08,0x92,0x01,0x96,0x06,0xC0,0x09,0x84,0x02,0xAE,0x08,0x44,0x14,0x80,0x94, +0xB4,0x01,0x58,0x00,0x00,0x02,0xB6,0x01,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xD2,0xB6, +0xFC,0x80,0x44,0x04,0x80,0x04,0xA6,0x02,0x92,0x02,0x96,0x06,0xC0,0x05,0x44,0x04, +0x80,0x06,0x84,0x24,0xAE,0x40,0xDD,0x9E,0x44,0x14,0x80,0x04,0xA6,0x0B,0x92,0x01, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x07,0x84,0x42,0xAE,0x80,0xA6,0x0B,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x07,0x84,0x21,0xAE,0x40,0xDD,0x9E,0x44,0x04,0x80,0x08, +0xB4,0x20,0x92,0x24,0x96,0x46,0xC1,0x03,0xFA,0x20,0xAE,0x40,0xB4,0x00,0x84,0x21, +0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x08,0xAE,0x40,0x3E,0x17,0xF4,0xE9,0x44,0x04, +0x80,0x08,0xB4,0x20,0x92,0x21,0x96,0x46,0xC1,0x06,0x84,0x22,0xAE,0x40,0x84,0x21, +0x3E,0x17,0xF4,0xE8,0xB4,0x00,0x92,0x02,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x08, +0x84,0x24,0xAE,0x40,0xDD,0x9E,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xD1,0x66,0xFC,0x80, +0xFC,0x00,0x49,0xFF,0xD1,0xC1,0xFC,0x80,0xFC,0x00,0x49,0xFF,0x9A,0x76,0xFC,0x80, +0x44,0x14,0x80,0x08,0xB4,0x01,0x92,0x08,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x09, +0x84,0x41,0xAE,0x80,0xB4,0x01,0x92,0x09,0x96,0x06,0xC0,0x0F,0x44,0x04,0x80,0x09, +0x84,0x22,0xAE,0x40,0x84,0x01,0x3E,0x07,0xF4,0xF2,0x44,0x04,0x50,0x28,0xB4,0x00, +0x92,0x06,0x96,0x1F,0x3E,0x07,0xF4,0xF1,0xDD,0x9E,0xFC,0x00,0x44,0x04,0x80,0x08, +0xB4,0x00,0x92,0x12,0x96,0x06,0xC0,0x58,0x44,0x14,0x80,0x88,0xB4,0x01,0x92,0x12, +0x96,0x06,0xC0,0x52,0x44,0x04,0x80,0x0A,0x84,0x44,0xAE,0x80,0xB4,0x41,0x44,0x0D, +0xFF,0xFF,0xFE,0x16,0x44,0x67,0x30,0x04,0xB6,0x01,0xB4,0x26,0x84,0x1E,0xFE,0x0E, +0xB6,0x06,0x84,0x0A,0x49,0xFF,0xA6,0x7B,0xB4,0x06,0x58,0x00,0x00,0x01,0xB6,0x06, +0x84,0x0A,0x49,0xFF,0xA6,0x74,0x49,0xFF,0xD6,0x7D,0x44,0x00,0x00,0x87,0x49,0xFF, +0xD6,0x72,0x44,0x17,0x30,0x10,0xB4,0x01,0x96,0x06,0xC0,0xFE,0x44,0x17,0x30,0x10, +0xB4,0x01,0x92,0x03,0x96,0x06,0x5A,0x00,0x01,0xFD,0x44,0x67,0x30,0x04,0x84,0x0A, +0x49,0xFF,0xA6,0x5D,0xB4,0x26,0x84,0x1E,0xFE,0x0E,0xB6,0x06,0x84,0x0A,0x49,0xFF, +0xA6,0x56,0xB4,0x06,0x58,0x00,0x00,0x01,0xB6,0x06,0x84,0x0A,0x49,0xFF,0xA6,0x4F, +0x44,0x14,0x80,0x88,0x84,0x01,0x3E,0x07,0xF4,0xF0,0xB4,0x41,0x44,0x02,0x00,0x00, +0xFE,0x17,0xB6,0x01,0x44,0x04,0x80,0x0A,0x84,0x22,0xAE,0x40,0x3C,0x0D,0xFD,0x3B, +0x8C,0x01,0x3C,0x0F,0xFD,0x3B,0x44,0x04,0x80,0x08,0x84,0x21,0xB4,0x00,0x92,0x10, +0x96,0x06,0xC0,0x0C,0x44,0x04,0x80,0x88,0xB4,0x00,0x92,0x10,0x96,0x06,0xC0,0x06, +0x44,0x04,0x80,0x0A,0x3E,0x17,0xF4,0xF3,0xAE,0x40,0x44,0x04,0x80,0x08,0xB4,0x00, +0x92,0x11,0x96,0x06,0xC0,0x0B,0x44,0x04,0x80,0x88,0xB4,0x00,0x92,0x11,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x0A,0x84,0x22,0xAE,0x40,0xFC,0x80,0x44,0x14,0x80,0x08, +0x84,0x41,0xB4,0x01,0x92,0x18,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0B,0xAE,0x80, +0x3E,0x27,0xF4,0xB5,0xB4,0x01,0x92,0x19,0x96,0x06,0xC0,0x1D,0x44,0x04,0x80,0x0B, +0x84,0x22,0xAE,0x40,0x84,0x00,0x3E,0x07,0xF4,0xB5,0x46,0x00,0x00,0x81,0x44,0x1F, +0xFE,0xFF,0x50,0x30,0x00,0x70,0xB4,0x43,0xFE,0x56,0xB6,0x23,0xB4,0x43,0x44,0x1E, +0xFF,0xFF,0xFE,0x56,0xB6,0x23,0xB4,0x43,0x46,0x1F,0xEF,0xFF,0x50,0x10,0x8F,0xFF, +0xFE,0x56,0xB6,0x23,0x44,0x04,0x80,0x08,0xB4,0x00,0x92,0x1A,0x96,0x06,0xC0,0x0E, +0x44,0x14,0x70,0x08,0xB4,0x01,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x78,0x23, +0xB6,0x01,0x44,0x04,0x80,0x0B,0x84,0x24,0xAE,0x40,0x44,0x04,0x80,0x08,0xB4,0x00, +0x92,0x1B,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0B,0x84,0x28,0xAE,0x40,0xDD,0x9E, +0x44,0x04,0x80,0x04,0xA6,0x02,0x92,0x03,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x06, +0x84,0x28,0xAE,0x40,0xDD,0x9E,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x10,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x0E,0x84,0x41,0xAE,0x80,0xB4,0x01,0x92,0x11,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x0E,0x84,0x22,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01, +0x92,0x12,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0E,0x84,0x44,0xAE,0x80,0xB4,0x01, +0x92,0x13,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0E,0x84,0x28,0xAE,0x40,0x44,0x14, +0x80,0x0C,0xB4,0x01,0x92,0x14,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0E,0xFA,0x40, +0xAE,0x80,0xB4,0x01,0x92,0x15,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0E,0xFA,0x30, +0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x16,0x96,0x06,0xC0,0x06,0x44,0x04, +0x80,0x0E,0x44,0x20,0x00,0x40,0xAE,0x80,0xB4,0x01,0x92,0x17,0x96,0x06,0xC0,0x06, +0x44,0x04,0x80,0x0E,0x44,0x1F,0xFF,0x80,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01, +0x92,0x18,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F,0x84,0x41,0xAE,0x80,0xB4,0x01, +0x92,0x19,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F,0x84,0x22,0xAE,0x40,0x44,0x14, +0x80,0x0C,0xB4,0x01,0x92,0x1A,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F,0x84,0x44, +0xAE,0x80,0xB4,0x01,0x92,0x1B,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F,0x84,0x28, +0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x1C,0x96,0x06,0xC0,0x05,0x44,0x04, +0x80,0x0F,0xFA,0x40,0xAE,0x80,0xB4,0x01,0x92,0x1D,0x96,0x06,0xC0,0x05,0x44,0x04, +0x80,0x0F,0xFA,0x30,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x1E,0x96,0x06, +0xC0,0x06,0x44,0x04,0x80,0x0F,0x44,0x20,0x00,0x40,0xAE,0x80,0xB4,0x01,0x4E,0x04, +0x00,0x07,0x44,0x04,0x80,0x0F,0x44,0x1F,0xFF,0x80,0xAE,0x40,0xDD,0x9E,0x44,0x04, +0x80,0x0C,0xB4,0x20,0x96,0x46,0xC1,0x03,0x84,0x21,0xAE,0x40,0xB4,0x00,0x92,0x01, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0C,0x84,0x22,0xAE,0x40,0x44,0x04,0x80,0x0C, +0xB4,0x20,0x92,0x22,0x96,0x46,0xC1,0x03,0x84,0x24,0xAE,0x40,0xB4,0x00,0x92,0x03, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0C,0x84,0x28,0xAE,0x40,0x44,0x04,0x80,0x0C, +0xB4,0x20,0x92,0x24,0x96,0x46,0xC1,0x03,0xFA,0x20,0xAE,0x40,0xB4,0x00,0x92,0x05, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0C,0xFA,0x30,0xAE,0x40,0x44,0x04,0x80,0x0C, +0xB4,0x20,0x92,0x26,0x96,0x46,0xC1,0x04,0x44,0x10,0x00,0x40,0xAE,0x40,0xB4,0x00, +0x92,0x07,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0C,0x44,0x1F,0xFF,0x80,0xAE,0x40, +0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x08,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0D, +0x84,0x41,0xAE,0x80,0xB4,0x01,0x92,0x09,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0D, +0x84,0x22,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x0A,0x96,0x06,0xC0,0x05, +0x44,0x04,0x80,0x0D,0x84,0x44,0xAE,0x80,0xB4,0x01,0x92,0x0B,0x96,0x06,0xC0,0x05, +0x44,0x04,0x80,0x0F,0x84,0x28,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x0C, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0D,0xFA,0x40,0xAE,0x80,0xB4,0x01,0x92,0x0D, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0D,0xFA,0x30,0xAE,0x40,0x44,0x14,0x80,0x0C, +0xB4,0x01,0x92,0x0E,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0D,0x44,0x20,0x00,0x40, +0xAE,0x80,0xB4,0x01,0x92,0x0F,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0D,0x44,0x1F, +0xFF,0x80,0xAE,0x40,0xDD,0x9E,0x44,0x04,0x80,0x00,0x44,0x14,0x80,0x80,0xA6,0x80, +0xB4,0x21,0x96,0x46,0xFE,0x56,0xC1,0x03,0x84,0x21,0xAE,0x40,0xA6,0x00,0x40,0x10, +0x04,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x01,0x96,0x06,0xFE,0x0E,0xC0,0x05, +0x44,0x04,0x80,0x00,0x84,0x22,0xAE,0x40,0x44,0x14,0x80,0x00,0xA6,0x08,0x40,0x20, +0x08,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x02,0x96,0x06,0xFE,0x16,0xC0,0x03, +0x84,0x04,0xAE,0x08,0xA6,0x08,0x40,0x10,0x0C,0x09,0x44,0x04,0x80,0x80,0xB4,0x00, +0x92,0x03,0x96,0x06,0xFE,0x0E,0xC0,0x05,0x44,0x04,0x80,0x00,0x84,0x28,0xAE,0x40, +0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E, +0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xFC,0x00,0x44,0x07,0x10,0x18,0x84,0x20,0xAE,0x41, +0x44,0x16,0x20,0x04,0x46,0x00,0x10,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0x44,0x00, +0x01,0x00,0x84,0x20,0x49,0xFF,0x9A,0xC4,0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF, +0x9A,0xCE,0x44,0x00,0x01,0x00,0x84,0x21,0x49,0xFF,0x9A,0xD8,0x49,0xFF,0xE2,0xC6, +0x44,0x14,0x30,0x34,0x46,0x00,0x04,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0x49,0xFF, +0xD5,0x1F,0x49,0xFF,0xD5,0x57,0x49,0x00,0x12,0x46,0x49,0xFF,0xD7,0xAB,0x49,0xFF, +0xCD,0x37,0x84,0x00,0xFC,0x80,0x00,0x00,0x80,0x60,0x54,0xF1,0x00,0x03,0xE9,0x1B, +0xE6,0x44,0xE9,0x19,0x54,0x41,0x80,0x03,0x54,0x50,0x80,0x03,0xDC,0x14,0xC5,0x0A, +0x52,0x52,0x80,0x04,0x9A,0x95,0x99,0x69,0x08,0x40,0x80,0x01,0x18,0x41,0x80,0x01, +0xD9,0xFC,0x40,0x51,0x08,0x09,0xC5,0x07,0x95,0x6A,0x99,0x69,0x96,0x8F,0xA3,0x09, +0xAB,0x19,0xD9,0xFE,0xC2,0x07,0x99,0x4A,0x08,0x40,0x80,0x01,0x18,0x41,0x80,0x01, +0xD9,0xFC,0xDD,0x9E,0x80,0x60,0xE6,0x44,0xE9,0x1A,0x54,0x51,0x80,0x03,0xC5,0x08, +0x52,0x52,0x80,0x04,0x9A,0x95,0x99,0x6B,0x18,0x11,0x80,0x01,0xDB,0xFE,0x40,0x51, +0x08,0x09,0x96,0x8F,0xC5,0x0C,0x95,0x6A,0x99,0x5D,0x96,0x48,0x40,0x40,0xA0,0x08, +0xFE,0x67,0x40,0x40,0xC0,0x08,0xFE,0x67,0xAA,0x59,0xDB,0xFF,0x99,0x5A,0xD3,0x04, +0x18,0x11,0x80,0x01,0xD5,0xFD,0xDD,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFC,0x45,0x3C,0x13,0xF7,0xC7,0x84,0x00,0x3E,0x07,0xF1,0x5C,0x44,0x0F,0xFF,0xBF, +0xFE,0x0E,0x3C,0x13,0xF7,0xC5,0x3C,0x0B,0xF7,0xC7,0x84,0x1D,0xFE,0x0E,0x3C,0x0B, +0xF7,0xC5,0x49,0xFF,0xDA,0xDF,0x5A,0x00,0x01,0x06,0x3C,0x0C,0x02,0xB6,0x5A,0x08, +0x01,0x0A,0x3C,0x03,0xF7,0xC5,0x58,0x00,0x00,0x03,0x3C,0x0B,0xF7,0xC5,0x49,0xFF, +0xDA,0xD4,0x3C,0x23,0xF7,0xC5,0x54,0x01,0x00,0x01,0xC0,0x06,0x3C,0x13,0xF8,0x9C, +0x8C,0x21,0x3C,0x1B,0xF8,0x9C,0x3C,0x03,0xF8,0x9C,0xE6,0x03,0xE9,0x08,0x84,0x1E, +0xFE,0x16,0x3C,0x0B,0xF7,0xC5,0x84,0x00,0x3C,0x0B,0xF8,0x9C,0x3C,0xF7,0xF9,0xF5, +0x5E,0xF7,0x80,0x5A,0xE8,0x0B,0x3C,0x03,0xF9,0xF4,0x50,0x00,0x00,0x59,0x96,0x01, +0x5C,0xF0,0x00,0xB3,0xE8,0x03,0x49,0xFF,0xDA,0x9E,0x49,0xFF,0xED,0x6A,0x80,0xC0, +0x49,0xFF,0xA2,0x19,0x49,0xFF,0xB0,0xB8,0x80,0x06,0x49,0xFF,0xAD,0x0D,0x3C,0x0D, +0xFB,0xE0,0x5A,0x08,0x01,0x0C,0x49,0xFF,0xDA,0x8B,0xC8,0x08,0x49,0xFF,0xDA,0x8F, +0xC8,0x05,0x49,0xFF,0x9F,0xC4,0x48,0x00,0x02,0xAB,0x49,0xFF,0xAD,0x97,0x44,0x02, +0x13,0x58,0x2E,0x17,0xF1,0x5C,0x49,0xFF,0xB8,0x76,0x44,0x02,0x2F,0x88,0xB6,0x1F, +0x44,0x02,0x30,0xC8,0xF0,0x81,0x3C,0x10,0x05,0x95,0x3C,0x00,0x05,0x93,0x3C,0x20, +0x05,0x97,0x3C,0x30,0x05,0x99,0x3C,0x90,0x05,0x92,0x3C,0x70,0x05,0x94,0x3C,0x50, +0x05,0x96,0x3C,0x40,0x05,0x98,0x40,0x00,0x40,0x08,0x40,0x10,0xC0,0x08,0x40,0x21, +0x40,0x08,0x40,0x31,0xC0,0x08,0x40,0x00,0x24,0x04,0xFE,0x7F,0xFE,0xAF,0xFE,0xE7, +0xF6,0x82,0x44,0x42,0x33,0x90,0x44,0x52,0x13,0x4C,0x49,0x00,0x03,0x63,0x80,0x06, +0x44,0x12,0x13,0x58,0x2E,0x27,0xF1,0x5C,0x3C,0x34,0x05,0x92,0x49,0xFF,0xB8,0xB7, +0x2E,0x00,0x0B,0x32,0x3C,0x17,0xF7,0xA6,0x50,0x00,0x00,0x64,0x44,0x90,0x00,0x64, +0xFE,0x0C,0x40,0x00,0x24,0x16,0x44,0x72,0x33,0x88,0x40,0x90,0x00,0x11,0x81,0x47, +0x84,0xC0,0x02,0x05,0x00,0x84,0xC0,0x08,0x00,0x05,0x01,0x22,0x80,0x26,0x00,0x25, +0x01,0x0E,0x49,0xFF,0xAD,0xD6,0x8C,0xC1,0x97,0xB0,0x50,0xA5,0x01,0x24,0x5A,0x68, +0x0B,0xF2,0x84,0x60,0x44,0x62,0x13,0x4C,0x44,0x82,0x34,0xA8,0x2E,0x07,0xF1,0x5C, +0xE2,0x60,0xE8,0x1B,0x44,0x00,0x00,0x38,0x80,0x26,0x42,0x11,0x80,0x73,0x00,0x10, +0x80,0x3B,0x50,0xA1,0x80,0x01,0x5A,0x18,0xFF,0x25,0x80,0x26,0x42,0x15,0x00,0x73, +0xA6,0x8C,0x5A,0x28,0x01,0x1F,0xF2,0x85,0xF3,0x84,0x49,0xFF,0xBE,0x1F,0xE6,0x0B, +0x80,0x20,0xF3,0x04,0xF2,0x05,0xE9,0x09,0x49,0xFF,0xB2,0x6E,0x3C,0x0D,0xFB,0xD6, +0x96,0x1E,0xC0,0x12,0x84,0x04,0xD5,0x11,0x44,0x00,0x01,0x24,0x80,0x88,0x42,0x40, +0x80,0x73,0xA6,0x27,0x58,0x00,0x00,0x10,0xAE,0x27,0x80,0x03,0x49,0xFF,0xAD,0x99, +0x54,0x35,0x00,0xFF,0xD5,0xCC,0x84,0x03,0x49,0xFF,0xBD,0xB6,0x3C,0x0C,0x02,0xB6, +0xC8,0x06,0x85,0x40,0x44,0x72,0x33,0x90,0x80,0xCA,0xD5,0x2A,0x84,0xC0,0x00,0x03, +0x81,0x0E,0x5A,0x08,0x01,0x0E,0x00,0x03,0x81,0x0D,0xC8,0x0A,0x22,0xF3,0x80,0x8A, +0x5E,0xF7,0x80,0xC9,0xE9,0x05,0x80,0x06,0x84,0x22,0x49,0xFF,0xBD,0xAB,0x8C,0xC1, +0x97,0xB0,0x50,0x73,0x81,0x24,0x5A,0x68,0x0B,0xEC,0xD5,0xE4,0x00,0x13,0x81,0x06, +0x5A,0x10,0x01,0x2C,0x00,0x03,0x81,0x05,0x5A,0x08,0x02,0x04,0x48,0x00,0x01,0x18, +0x8D,0x41,0x50,0x73,0x81,0x24,0x5A,0xA8,0x0B,0x04,0x48,0x00,0x01,0x30,0x54,0x05, +0x00,0xFF,0xF0,0x84,0xB0,0x47,0x80,0x07,0x84,0x40,0x49,0xFF,0xA0,0x4B,0x00,0x03, +0x81,0x05,0xE6,0x05,0xE8,0xE8,0x44,0xF0,0xDF,0xB4,0x38,0x07,0x82,0x02,0x40,0xF0, +0x3C,0x00,0xDD,0x0F,0xB8,0xFF,0xFF,0xFF,0x8A,0x00,0x00,0x00,0xF8,0x00,0x00,0x00, +0x6C,0x00,0x00,0x00,0xB0,0x01,0x00,0x00,0x3C,0x0D,0xFB,0xD6,0x8C,0xC1,0x54,0x00, +0x08,0x00,0x97,0xB0,0xC0,0x17,0xF0,0x07,0x22,0x23,0x80,0x86,0x00,0x00,0x00,0x14, +0x5C,0xF0,0x00,0x21,0xE9,0x0A,0x3C,0x00,0x05,0x93,0x91,0x21,0x96,0xC3,0xE1,0x23, +0x40,0x04,0xBC,0x1A,0x40,0x90,0x00,0x11,0xE0,0x49,0xF0,0x04,0xE8,0x04,0x84,0x20, +0xD5,0x02,0xF0,0x04,0x49,0xFF,0xBD,0x5F,0xF0,0x04,0x49,0xFF,0xBD,0x81,0x81,0x00, +0xF0,0x04,0x49,0xFF,0xBD,0x3C,0xE2,0x08,0x84,0x21,0xF0,0x04,0xE8,0x0E,0xD5,0x0C, +0x00,0x03,0x81,0x06,0x5A,0x08,0x01,0x66,0xF0,0x04,0x8C,0xC1,0x84,0x20,0x49,0xFF, +0xBD,0x4A,0x97,0xB0,0xF0,0x04,0x84,0x22,0x49,0xFF,0xBD,0x3C,0xD5,0x9C,0x00,0x13, +0x81,0x06,0x5A,0x18,0x02,0x04,0x48,0x00,0x00,0xA0,0x5A,0x18,0x01,0x95,0x3C,0x0D, +0xFB,0xD6,0x8C,0xC1,0x54,0x00,0x08,0x00,0x97,0xB0,0xC0,0x17,0xF0,0x07,0x22,0x23, +0x80,0x86,0x00,0x00,0x00,0x14,0x5C,0xF0,0x00,0x21,0xE9,0x0A,0x3C,0x00,0x05,0x93, +0x91,0x21,0x96,0xC3,0xE1,0x23,0x40,0x04,0xBC,0x1A,0x40,0x90,0x00,0x11,0xE0,0x49, +0xF0,0x04,0xE8,0x04,0x84,0x20,0xD5,0x02,0xF0,0x04,0x49,0xFF,0xBD,0x1C,0xF0,0x04, +0x49,0xFF,0xBD,0x3E,0x81,0x00,0xF0,0x04,0x49,0xFF,0xBC,0xF9,0xE2,0x08,0x4E,0xF2, +0xFF,0x6B,0xF0,0x04,0x84,0x22,0x49,0xFF,0xBD,0x05,0xD5,0x1D,0xF0,0x04,0x84,0x20, +0x49,0xFF,0xBD,0x09,0x00,0x03,0x81,0x06,0x5A,0x08,0x02,0x14,0x84,0x21,0xF0,0x04, +0x49,0xFF,0xBD,0x01,0xF0,0x04,0x49,0xFF,0xBD,0x23,0x81,0x00,0xF0,0x04,0x49,0xFF, +0xBC,0xEC,0xE2,0x08,0xF0,0x04,0xE9,0x59,0x84,0x23,0x49,0xFF,0xBC,0xEB,0xD5,0x63, +0x8C,0xC1,0x97,0xB0,0xF0,0x04,0x84,0x20,0x49,0xFF,0xBC,0xED,0x48,0xFF,0xFF,0x44, +0x5A,0x00,0x02,0x04,0x48,0xFF,0xFF,0x40,0xF0,0x04,0x84,0x21,0x49,0xFF,0xBC,0xE3, +0x44,0x10,0x01,0x2C,0x44,0x20,0x02,0xBC,0x84,0x65,0x80,0x07,0x49,0xFF,0xAF,0x37, +0xF0,0x04,0x49,0xFF,0xBC,0xFD,0x81,0x00,0xF0,0x04,0x49,0xFF,0xBC,0xC6,0xE2,0x08, +0xE8,0x0B,0x44,0x10,0x01,0x24,0x44,0x02,0x34,0xAB,0x42,0x05,0x04,0x73,0xA6,0x46, +0x58,0x10,0x80,0x08,0xAE,0x46,0x44,0x80,0x01,0x24,0x44,0x02,0x34,0xB0,0x42,0x05, +0x20,0x73,0xB4,0x00,0x92,0x0B,0x96,0x06,0x5A,0x08,0x01,0x2E,0x80,0x07,0x49,0xFF, +0xBF,0xBD,0x5A,0x08,0x01,0x29,0xF0,0x04,0x49,0xFF,0xBC,0xFD,0x80,0x07,0x84,0x20, +0x80,0x48,0xD5,0x19,0x00,0x03,0x81,0x06,0x5A,0x08,0x02,0x1A,0x84,0x21,0xF0,0x04, +0x49,0xFF,0xBC,0xA9,0xF0,0x04,0x49,0xFF,0xBC,0xCB,0x44,0x12,0x15,0xC0,0x38,0x10, +0xA8,0x00,0xE2,0x20,0xE8,0x10,0xF0,0x04,0x49,0xFF,0xBC,0xE5,0x80,0x07,0x84,0x20, +0x44,0x20,0x01,0x24,0x49,0xFF,0xF9,0xC0,0x48,0xFF,0xFE,0xEE,0xF0,0x04,0x84,0x20, +0x49,0xFF,0xBC,0x91,0x8C,0xC1,0x97,0xB0,0x48,0xFF,0xFE,0xE6,0x02,0x53,0x80,0x81, +0x44,0x00,0xFF,0xFF,0x4C,0x50,0x3E,0xE6,0x22,0x13,0x80,0x12,0x22,0x03,0x80,0x04, +0x8C,0xA1,0x8A,0x01,0xF0,0x88,0x22,0x13,0x80,0x13,0x22,0x03,0x80,0x05,0x12,0x53, +0x80,0x81,0x8A,0x01,0xF0,0x89,0xB0,0x08,0x49,0xFF,0xB7,0x0F,0x02,0x13,0x80,0x84, +0x88,0x01,0x12,0x03,0x80,0x84,0x48,0xFF,0xFE,0xCD,0x3C,0x13,0xF7,0xC7,0x84,0x1D, +0xFE,0x0E,0xC6,0x03,0x58,0x00,0x00,0x02,0x3C,0x0B,0xF7,0xC7,0x2E,0x00,0x11,0x9C, +0x3E,0x00,0x11,0x9D,0x2E,0x00,0x11,0x9B,0x3E,0x00,0x11,0x9C,0x2E,0x00,0x11,0x9A, +0x3E,0x00,0x11,0x9B,0x2E,0x00,0x11,0x99,0x3E,0x00,0x11,0x9A,0x84,0x00,0x3E,0x60, +0x11,0x99,0x3C,0x0E,0x02,0xB6,0x49,0xFF,0xEC,0x81,0x3C,0x13,0xF7,0xC7,0x5A,0x08, +0x01,0x09,0x54,0x00,0x80,0x01,0x3E,0x07,0xF1,0x56,0x3E,0x07,0xF1,0x57,0xD5,0x05, +0x54,0x00,0x80,0x01,0x3E,0x07,0xF1,0x56,0x96,0x4E,0x84,0x02,0xC9,0x30,0x2E,0x07, +0xF1,0x50,0xE6,0x04,0xE8,0x3C,0x44,0xF0,0xE2,0x64,0x38,0x07,0x80,0x00,0x40,0xF0, +0x3C,0x00,0xDD,0x0F,0x04,0x16,0x4E,0x36,0x2E,0x07,0xF1,0x56,0x5A,0x08,0x01,0x30, +0x3E,0x07,0xF1,0x50,0x2E,0x07,0xF1,0x54,0xD5,0x0D,0x2E,0x07,0xF1,0x56,0x5A,0x00, +0x01,0x06,0x2E,0x07,0xF1,0x57,0x5A,0x08,0x01,0x12,0x2E,0x07,0xF1,0x54,0x5A,0x00, +0xFF,0x1F,0x8C,0x01,0x3E,0x07,0xF1,0x54,0xD5,0x1A,0x2E,0x07,0xF1,0x56,0x5A,0x00, +0x01,0x10,0x2E,0x07,0xF1,0x57,0x5A,0x00,0x01,0x0C,0x84,0x00,0x3E,0x07,0xF1,0x50, +0xD5,0x0E,0x84,0x03,0x3E,0x07,0xF1,0x50,0x2E,0x07,0xF1,0x55,0xD5,0x05,0x2E,0x07, +0xF1,0x55,0x5A,0x00,0xFF,0x05,0x8C,0x01,0x3E,0x07,0xF1,0x55,0x2E,0x07,0xF1,0x50, +0x5A,0x08,0x01,0x06,0x84,0x00,0x3E,0x07,0xF1,0x55,0xD5,0x06,0x84,0x20,0x3E,0x17, +0xF1,0x54,0x5A,0x08,0x03,0xF9,0x49,0xFF,0x9E,0x09,0x49,0xFF,0x9D,0x33,0x49,0xFF, +0xAE,0x7C,0x84,0x00,0x44,0x32,0x30,0x44,0x98,0x83,0x00,0x11,0x00,0x0A,0xC1,0x04, +0x8E,0x21,0x10,0x11,0x00,0x0A,0x8C,0x0C,0x5A,0x08,0x84,0xF8,0x2E,0x07,0xF1,0x50, +0x5A,0x00,0x01,0x19,0xC0,0x07,0x5A,0x08,0x03,0x1B,0x2E,0x07,0xF1,0x55,0xE6,0x1F, +0xD5,0x15,0x49,0xFF,0xD8,0x5C,0x5A,0x00,0x01,0x06,0x49,0xFF,0xD7,0xE9,0x5A,0x08, +0x01,0x05,0x84,0x00,0x84,0x21,0xD5,0x03,0x84,0x00,0x80,0x20,0x49,0xFF,0xCF,0x7D, +0xD5,0x06,0x2E,0x07,0xF1,0x54,0x5C,0xF0,0x00,0xC9,0xE8,0xF4,0xFC,0xC5,0x92,0x00, +0xFC,0x21,0x80,0xC1,0x84,0x20,0x3E,0x17,0xF3,0xFC,0x44,0x10,0x00,0xFF,0x3C,0x1B, +0xF7,0xA8,0x2E,0x10,0x0B,0x40,0x85,0xE3,0x40,0x10,0xBC,0x37,0xE2,0x26,0xF0,0x81, +0x84,0xE0,0xE8,0x30,0x3C,0x13,0xFA,0x03,0xE6,0x2B,0xE8,0x03,0x84,0x00,0xD5,0x27, +0x5C,0xF0,0x80,0x29,0xE9,0x06,0xFA,0x2E,0x49,0xFF,0xAF,0x2E,0x3C,0x0B,0xF7,0xA8, +0x3C,0x03,0xFA,0x03,0x2E,0x10,0x0B,0x40,0xE2,0x01,0xE9,0xF1,0x92,0x01,0x5C,0xF0, +0x00,0x33,0x80,0x20,0xE9,0x03,0x44,0x10,0x00,0x32,0xF0,0x01,0x54,0x10,0xFF,0xFF, +0x49,0xFF,0xAF,0x1A,0x5E,0xF0,0x00,0x5F,0xE9,0x07,0x3C,0xF7,0xF9,0xFC,0x84,0x21, +0x5E,0xF7,0x80,0x5F,0xE8,0x02,0x84,0x22,0x3E,0x17,0xF3,0xFC,0x3C,0x0B,0xF9,0xFC, +0x84,0xE1,0x3C,0x0D,0xFD,0x00,0xC8,0x1B,0x2E,0x10,0x0B,0x40,0x5A,0x78,0x01,0x0A, +0x3C,0x03,0xFA,0x03,0xE2,0x20,0xE8,0x05,0x84,0x01,0x3C,0x0F,0xFD,0x00,0xD5,0x05, +0x84,0x03,0xFE,0x0C,0xE0,0x06,0xE9,0xF9,0x2E,0x07,0xEF,0x16,0x2E,0x10,0x0B,0x42, +0xE2,0x20,0xE8,0x13,0x84,0x00,0x3C,0x0F,0xFD,0x00,0xD5,0x0F,0x49,0xFF,0xD7,0x78, +0xC0,0x04,0x44,0xF0,0x01,0xC2,0xD5,0x03,0x44,0xF0,0x00,0x96,0x5A,0x70,0x01,0x06, +0x3C,0x17,0xF9,0xF5,0xE0,0x2F,0xD5,0xEE,0x2E,0x17,0xF1,0x51,0x3C,0x0D,0xFD,0x00, +0xE6,0x24,0xE8,0x40,0x44,0xF0,0xE4,0x44,0x38,0x17,0x84,0x00,0x40,0xF0,0xBC,0x00, +0x4A,0x00,0x3C,0x00,0x04,0x28,0x42,0x68,0x5A,0x08,0x01,0x0E,0x2E,0x27,0xF3,0xFA, +0x84,0x20,0x3E,0x17,0xF3,0xFA,0x5A,0x20,0xFF,0x2E,0x3E,0x07,0xF1,0x51,0x3E,0x07, +0xF3,0xFD,0xD5,0x28,0x84,0x00,0x3E,0x07,0xF3,0xFA,0xD5,0x24,0x2E,0x17,0xF3,0xFD, +0x2E,0x20,0x0B,0x44,0xE2,0x22,0xE8,0x05,0x8C,0x21,0x3E,0x17,0xF3,0xFD,0xD5,0x1A, +0x84,0x22,0xC0,0x0E,0xD5,0x17,0xC8,0x11,0x2E,0x27,0xF4,0x04,0x2E,0x10,0x0B,0x46, +0x8C,0x41,0x96,0x90,0xE2,0x22,0x3E,0x27,0xF4,0x04,0xE8,0x0C,0x84,0x23,0x3E,0x17, +0xF1,0x51,0x3E,0x07,0xF4,0x04,0xD5,0x06,0x84,0x01,0xD5,0x02,0x84,0x00,0x3E,0x07, +0xF1,0x51,0x2E,0x17,0xF3,0xFC,0x2E,0x07,0xF3,0xFB,0x5A,0x18,0x01,0x04,0x8C,0x04, +0xD5,0x0D,0x5A,0x18,0x02,0x09,0x3C,0x13,0xFA,0x03,0x5C,0xF0,0x80,0x38,0xE9,0x03, +0x8E,0x01,0xD5,0x04,0xE6,0xC4,0xE9,0xFD,0x8C,0x01,0x3E,0x07,0xF3,0xFB,0x2E,0x07, +0xF3,0xFB,0x80,0x20,0x96,0x02,0x5E,0xF0,0x00,0x3D,0xE9,0x04,0x44,0x10,0x00,0x3C, +0xD5,0x05,0x96,0x0A,0x4E,0x04,0x00,0x03,0x84,0x20,0x96,0x8A,0x5E,0xF1,0x00,0x29, +0x3E,0x17,0xF3,0xFB,0xE9,0x05,0x49,0xFF,0xAE,0x96,0x84,0x00,0xD5,0x09,0x2E,0x07, +0xF1,0x51,0xC0,0x06,0xC2,0x04,0x8E,0x21,0x3E,0x17,0xF3,0xFB,0x84,0x01,0xFC,0xA1, +0xFC,0x40,0x51,0xFF,0xFD,0x58,0xB1,0x8E,0x80,0xE4,0x3A,0x03,0x0C,0x20,0x00,0x03, +0x00,0x0C,0x44,0x12,0x00,0x88,0xF0,0x82,0xB0,0x19,0x81,0x25,0x3A,0x20,0x94,0x00, +0x3A,0x20,0x14,0x20,0xA4,0x34,0x3C,0x6D,0xFB,0xD6,0x54,0x63,0x20,0x00,0x4E,0x63, +0x04,0x6E,0xF0,0x84,0x44,0x10,0x00,0xFF,0x84,0x4B,0xB0,0x16,0xF7,0x8A,0x49,0xFF, +0xF7,0xDB,0xB0,0x32,0x80,0x26,0x44,0x20,0x01,0xE0,0x49,0xFF,0xF7,0xD5,0x3C,0x0D, +0xFB,0xD6,0x83,0x89,0x54,0x00,0x20,0x00,0xC0,0x13,0xF0,0x04,0xF1,0x02,0x90,0x01, +0xF0,0x84,0x84,0x06,0xFE,0x44,0x5E,0xF0,0x81,0xF9,0x80,0x01,0xE8,0x06,0x84,0x25, +0x40,0x00,0x04,0x16,0x96,0x00,0xD5,0x03,0x44,0x00,0x00,0x64,0xF0,0x82,0x3C,0x03, +0xF7,0xC7,0x96,0x36,0xC0,0x0B,0xF1,0x02,0x00,0x0F,0x80,0x08,0x5C,0xF0,0x80,0x55, +0xE8,0x03,0x44,0x00,0x00,0x55,0x96,0x00,0xF0,0x82,0x04,0x2F,0x80,0xB2,0x2E,0x37, +0xDE,0x16,0x51,0xEF,0x80,0x50,0x2E,0x07,0xDE,0x17,0xF0,0x86,0xA6,0x10,0x94,0x02, +0x88,0x02,0xF0,0x88,0x84,0x00,0xF0,0x83,0xF0,0x08,0x4C,0x20,0x00,0xAE,0x84,0x80, +0xA7,0x55,0x00,0x91,0x00,0x04,0x80,0x04,0xB1,0xD9,0x44,0xAF,0xFF,0xDF,0x38,0x12, +0x1C,0x00,0x99,0xBC,0x88,0x25,0x96,0x48,0xE2,0x23,0x20,0x63,0x00,0x01,0xE8,0x25, +0x88,0xC9,0x04,0x8F,0x80,0x06,0x97,0xB0,0xE2,0xC8,0xE8,0x1F,0x04,0x8F,0x80,0xB3, +0x88,0x28,0x42,0x13,0x0C,0x73,0xA7,0x88,0x40,0x13,0x28,0x02,0x5A,0x10,0x1F,0x16, +0x97,0xA7,0x84,0x20,0x54,0x80,0x80,0xFF,0x4C,0x80,0x40,0x07,0x38,0x6F,0x00,0x08, +0x8C,0x01,0x96,0x00,0xD5,0x0A,0x38,0x8F,0x04,0x00,0x4C,0x83,0x00,0x07,0x8C,0x21, +0x54,0xF0,0x80,0xFF,0xE2,0x0F,0xE8,0xEF,0x8C,0x82,0x5A,0x48,0x10,0xD2,0x42,0x54, +0x8C,0x73,0x04,0x1F,0x80,0xB4,0x95,0x69,0x88,0x25,0xF1,0x87,0x84,0xC0,0x4C,0x60, +0x00,0x69,0x9D,0xF1,0x96,0x78,0xF1,0x85,0x80,0xA1,0xD0,0x61,0x38,0x1F,0x18,0x00, +0x44,0x42,0x2F,0xF0,0x44,0x72,0x2F,0xF0,0x38,0xF2,0x04,0x00,0x38,0x4F,0x14,0x00, +0x38,0x83,0x90,0x00,0x5A,0xF0,0xFF,0x51,0x5A,0x80,0xFF,0x4F,0xF7,0x07,0x81,0x3C, +0x22,0xA3,0x80,0x00,0x44,0x70,0x00,0x64,0x42,0xA5,0x1C,0x24,0x44,0x70,0x00,0x38, +0x42,0x97,0x9C,0x73,0x50,0x94,0x80,0x30,0x00,0xF4,0x80,0x07,0x00,0x94,0x80,0x08, +0x04,0x7F,0x80,0xB4,0x42,0xF4,0x8C,0x73,0x38,0x93,0xBD,0x11,0x44,0xF0,0x00,0x38, +0x80,0xFC,0x42,0x74,0x3C,0x73,0x50,0x83,0x80,0x30,0x00,0xF4,0x00,0x07,0x00,0x84, +0x00,0x08,0x04,0x7F,0x80,0xB4,0x42,0xF4,0x0C,0x73,0x38,0x83,0xBD,0x11,0x40,0x95, +0x25,0x37,0x40,0xA5,0x21,0x57,0xE3,0x49,0xE8,0x04,0x54,0x94,0x80,0xFF,0xD5,0x03, +0x54,0x95,0x00,0xFF,0xF7,0x03,0xE6,0xF4,0xE8,0x17,0x04,0xAF,0x80,0x03,0x85,0x03, +0xB1,0xE3,0x42,0x75,0x20,0x73,0xE2,0x24,0x81,0x04,0x40,0x80,0xBC,0x1B,0xE2,0x81, +0x40,0x12,0x3C,0x1A,0xAE,0x79,0xF1,0x03,0x10,0x83,0x80,0x00,0x8C,0x21,0x96,0x48, +0x10,0x93,0x80,0x02,0xF1,0x83,0x8C,0xA1,0x97,0x68,0xD5,0xA0,0xF6,0x05,0xD5,0x98, +0x8C,0x44,0x48,0xFF,0xFF,0x53,0x3C,0x03,0xF7,0xA7,0x5C,0xF0,0x00,0x24,0x84,0x00, +0xE9,0x16,0x80,0x3C,0x84,0x00,0x08,0x20,0x80,0x3E,0x2E,0x37,0xEF,0x15,0x80,0xA0, +0xD2,0x0B,0xA7,0x08,0x4C,0x41,0xC0,0x04,0x8C,0x01,0x96,0x00,0x8C,0xA1,0x97,0x68, +0x50,0x10,0x80,0x38,0xD5,0xF6,0x84,0x21,0x40,0x00,0x80,0x06,0xF0,0x85,0x46,0x00, +0x08,0x95,0x85,0x00,0x50,0x00,0x04,0x3F,0x80,0xE8,0xF0,0x89,0x00,0x0E,0x00,0x00, +0xE2,0xE0,0x4E,0xF2,0x01,0x10,0xB0,0x16,0x44,0x90,0x00,0x38,0x38,0x70,0x1C,0x08, +0x9C,0x39,0x96,0x00,0xF0,0x87,0x80,0xC0,0x42,0x03,0xA4,0x24,0xF0,0x88,0x88,0x1C, +0xF0,0x86,0x00,0x0E,0x00,0x00,0xE2,0xC0,0x4E,0xF2,0x00,0xFA,0xF0,0x06,0x00,0x10, +0x00,0x3B,0x5A,0x10,0xFF,0x27,0x80,0x1C,0x42,0x03,0x24,0x73,0x00,0x30,0x00,0x3B, +0x44,0x02,0x33,0x88,0x5A,0x30,0xFF,0x14,0x44,0x20,0x01,0x24,0x80,0x80,0x42,0x40, +0x88,0x73,0x00,0x42,0x01,0x0D,0x5A,0x48,0x02,0x0B,0x80,0x80,0x42,0x41,0x88,0x73, +0x00,0x22,0x01,0x0D,0x5A,0x28,0x02,0x04,0x48,0x00,0x00,0xD6,0x44,0x20,0x01,0x24, +0x42,0x00,0x88,0x73,0x00,0x00,0x01,0x0C,0x5A,0x08,0x01,0x04,0x48,0x00,0x00,0xCC, +0x80,0x1C,0x42,0x03,0x24,0x73,0x00,0x00,0x00,0x3B,0x5A,0x00,0xFF,0x0E,0x44,0x30, +0x01,0x24,0x44,0x22,0x33,0x88,0x42,0x20,0x0C,0x73,0x00,0x21,0x01,0x0C,0x5A,0x28, +0x01,0x04,0x48,0x00,0x00,0xB9,0xE7,0x14,0x4E,0xF2,0x00,0xB6,0xF2,0x06,0x80,0x7C, +0x42,0x33,0x24,0x73,0xA0,0x96,0xA0,0xDE,0x44,0x40,0x00,0x38,0x9A,0xD3,0x4E,0x34, +0x00,0x03,0xFE,0xDA,0x80,0x5C,0x80,0xBC,0x42,0x23,0x90,0x73,0x42,0x53,0x10,0x73, +0xA0,0x97,0xA1,0x2F,0x8A,0x44,0x4E,0x24,0x00,0x03,0xFE,0x92,0xFE,0x94,0x42,0x21, +0x8C,0x73,0xF3,0x09,0xE0,0x62,0xE8,0x16,0xF3,0x05,0x5A,0x30,0x01,0x04,0x48,0x00, +0x00,0x93,0x9C,0xF9,0x80,0x9C,0x42,0x41,0xA4,0x73,0x2E,0x57,0xEF,0x15,0xA6,0xE6, +0x4C,0x51,0xC0,0x8A,0x9C,0xF1,0x80,0x9C,0x42,0x41,0xA4,0x73,0xA6,0xE6,0x4C,0x32, +0xC0,0x83,0xF5,0x08,0xFA,0x68,0xB1,0x32,0x42,0x44,0x0C,0x73,0x88,0xBC,0x8C,0xAC, +0xB6,0xA4,0x80,0xBC,0x42,0x53,0x24,0x73,0x8C,0xAC,0x50,0x32,0x00,0x10,0xA9,0x61, +0xA8,0xA2,0x10,0x72,0x00,0x10,0xF4,0x06,0xAF,0x99,0xB0,0xA3,0x84,0xA0,0x51,0xE2, +0x00,0x30,0xF4,0x03,0xD4,0x19,0x20,0xAF,0x00,0x05,0xA7,0x10,0x4C,0xA2,0x40,0x11, +0x80,0x9C,0x42,0x43,0x24,0x73,0x20,0xA2,0x00,0x35,0xA7,0x11,0x4C,0xA2,0x40,0x09, +0xA7,0x1B,0x00,0xA1,0x00,0x02,0xE3,0x44,0x40,0x45,0x3C,0x1A,0xAF,0x1B,0x8C,0xA1, +0x97,0x68,0x8C,0x43,0xD5,0xE7,0xFA,0x48,0x5A,0x10,0xFF,0x1F,0x5A,0x00,0xFF,0x19, +0x44,0x32,0x33,0x88,0x44,0x50,0x01,0x24,0x80,0x83,0x42,0x40,0x94,0x73,0x42,0x30, +0x14,0x73,0x00,0xA2,0x01,0x0D,0x00,0x51,0x81,0x0D,0xE2,0xAA,0xE9,0x09,0xE3,0x45, +0xE9,0x0D,0x02,0x42,0x00,0x84,0x02,0x31,0x80,0x84,0xE2,0x83,0xE9,0x07,0xB0,0x32, +0x42,0x04,0x08,0x73,0xD5,0x0D,0x5A,0x00,0xFF,0x08,0xB0,0x72,0x42,0x14,0x08,0x73, +0x10,0x00,0x80,0x12,0xD5,0x07,0xB0,0x32,0x42,0x04,0x08,0x73,0x84,0x3F,0x10,0x10, +0x00,0x12,0xFA,0x08,0xB0,0x72,0x42,0x14,0x00,0x73,0x50,0x30,0x80,0x10,0xA6,0x1A, +0x81,0x41,0xF3,0x8B,0x5A,0x00,0xFF,0x14,0x44,0x10,0x01,0x24,0xF2,0x0A,0x42,0x20, +0x04,0x73,0x80,0x02,0xB0,0x53,0x84,0x40,0x49,0xFF,0x9B,0x5C,0xF0,0x13,0xF3,0x0B, +0xB4,0x20,0x14,0x15,0x00,0x03,0x00,0x00,0x00,0x14,0xAE,0x1C,0x50,0x04,0x00,0x01, +0x54,0x80,0x00,0xFF,0x8C,0xC1,0x97,0xB0,0x48,0xFF,0xFF,0x05,0xF7,0x07,0x48,0xFF, +0xFE,0xEF,0xB1,0xB2,0x80,0x06,0x85,0x20,0x4C,0x94,0x00,0x3A,0x50,0x14,0x80,0x01, +0x54,0x90,0x80,0xFF,0x81,0x49,0x4C,0xA4,0x00,0x31,0xFA,0x48,0xB0,0x72,0x42,0x15, +0x08,0x73,0xA0,0xC2,0xA0,0x8A,0xE0,0x43,0xE8,0x23,0xB1,0xDD,0x83,0xC0,0x81,0xE7, +0x3A,0x2F,0x14,0x04,0x3A,0x27,0x94,0x24,0x3A,0x2F,0x0C,0x00,0x80,0xE1,0x3A,0x27, +0x8C,0x20,0x3A,0x23,0x94,0x04,0xF7,0x83,0x80,0xE0,0x3A,0x23,0x94,0x24,0xF2,0x03, +0x3A,0x21,0x0C,0x00,0x3A,0x2F,0x0C,0x20,0xB0,0x9D,0x80,0xE2,0x3A,0x23,0x94,0x04, +0x3A,0x20,0x94,0x24,0xF1,0x03,0x3A,0x27,0x8C,0x00,0x3A,0x20,0x8C,0x20,0x50,0x15, +0x00,0x01,0x54,0xA0,0x80,0xFF,0xD5,0xD0,0x8C,0x18,0xD5,0xC7,0xF0,0x04,0x44,0x10, +0x00,0x64,0xFE,0x04,0xFE,0x0C,0xF0,0x83,0xB0,0x72,0xFA,0x08,0x42,0x14,0x80,0x73, +0xF1,0x8D,0x44,0x90,0x00,0x38,0xF0,0x0D,0x4C,0x60,0x01,0x56,0x00,0x03,0x00,0x11, +0xB0,0x56,0x38,0x50,0x80,0x00,0x00,0x03,0x00,0x10,0x38,0x70,0x80,0x00,0x4C,0x53, +0x81,0x48,0xF0,0x05,0x5A,0x08,0x01,0x4F,0xE2,0xE5,0x80,0x07,0x40,0x02,0xBC,0x1B, +0x80,0x3C,0x42,0x10,0x24,0x73,0x00,0x10,0x80,0x3B,0x5A,0x10,0xFF,0x0B,0x44,0x20, +0x01,0x24,0x44,0x02,0x34,0xA8,0x42,0x00,0x88,0x73,0xA0,0x01,0x4E,0x04,0x00,0x6D, +0xE2,0xA7,0x80,0x07,0x40,0x02,0xBC,0x1B,0x80,0x3C,0x42,0x10,0x24,0x73,0x00,0x10, +0x80,0x3B,0x5A,0x10,0xFF,0x0B,0x44,0x20,0x01,0x24,0x44,0x02,0x34,0xA8,0x42,0x00, +0x88,0x73,0xA0,0x01,0x4E,0x04,0x00,0x59,0x00,0x03,0x00,0x13,0x5C,0xF0,0x00,0x47, +0x4E,0xF3,0x01,0x17,0x80,0x1C,0x42,0x03,0xA4,0x73,0x00,0x20,0x00,0x3B,0x5A,0x20, +0xFF,0x5A,0x44,0x02,0x33,0x88,0x44,0x10,0x01,0x24,0x80,0x60,0x42,0x31,0x04,0x73, +0x02,0x21,0x80,0x85,0xC2,0x4F,0x80,0x5C,0x42,0x22,0xA4,0x73,0x00,0x21,0x00,0x3B, +0x5A,0x20,0xFF,0x49,0x42,0x01,0x04,0x73,0x02,0x00,0x00,0x85,0xC0,0x43,0x48,0x00, +0x00,0xF8,0x3C,0x03,0xF7,0xC7,0x96,0x36,0xC0,0x07,0xA0,0x32,0xF1,0x03,0xE0,0x01, +0x4E,0xF2,0x00,0xEF,0xD5,0x31,0xE2,0xE5,0x80,0x07,0x40,0x02,0xBC,0x1B,0x80,0x3C, +0x42,0x10,0x24,0x73,0x00,0x10,0x80,0x3B,0x5A,0x10,0xFF,0x0B,0x44,0x20,0x01,0x24, +0x44,0x02,0x34,0xA8,0x42,0x00,0x88,0x73,0xA0,0x01,0x4E,0x04,0x00,0x16,0xE2,0xA7, +0x80,0x07,0x40,0x02,0xBC,0x1B,0x80,0x3C,0x42,0x10,0x24,0x73,0x00,0x10,0x80,0x3B, +0x5A,0x10,0xFF,0x0F,0x44,0x20,0x01,0x24,0x44,0x02,0x34,0xA8,0x42,0x00,0x88,0x73, +0xA0,0x01,0x4E,0x05,0x00,0x06,0xA0,0x32,0xF1,0x03,0xE0,0x01,0xD5,0x09,0xA0,0x32, +0xF1,0x03,0xE0,0x01,0xE9,0x07,0x00,0x03,0x00,0x13,0xF1,0x02,0xE2,0x20,0x4E,0xF2, +0x00,0xB8,0xE2,0xA7,0x81,0x47,0x40,0xA2,0xBC,0x1B,0xE2,0xE5,0x40,0x72,0xBC,0x1B, +0x80,0x3C,0x42,0x13,0xA4,0x73,0x50,0x10,0x80,0x30,0x00,0x40,0x80,0x0B,0x5A,0x48, +0xFF,0x04,0x48,0x00,0x01,0x47,0x80,0x5C,0x42,0x25,0x24,0x73,0x50,0x21,0x00,0x30, +0x00,0xF1,0x00,0x0B,0x80,0xAA,0x5A,0xF0,0xFF,0x04,0x48,0x00,0x00,0xF7,0x50,0x05, +0x00,0x01,0x80,0x3C,0x42,0x10,0x24,0x73,0x80,0x01,0x84,0x20,0xAE,0x44,0x42,0x05, +0x24,0x24,0x40,0x3E,0x00,0x00,0x50,0x51,0x80,0x30,0xF0,0x87,0xA6,0x2F,0x04,0xF1, +0x80,0x0A,0xF0,0x89,0x00,0x01,0x80,0x38,0xF0,0x8A,0x42,0x03,0xA4,0x24,0xF0,0x88, +0x88,0x1C,0x50,0x80,0x00,0x30,0x00,0x14,0x00,0x07,0xA0,0x86,0xF1,0x8B,0x00,0x14, +0x00,0x08,0xF1,0x8C,0x04,0x10,0x00,0x0A,0xF1,0x84,0xF4,0x04,0x88,0x2F,0xFE,0xA4, +0xA1,0x1E,0xF1,0x86,0x42,0x27,0x90,0x73,0xF4,0x06,0x40,0x21,0x10,0x56,0xA8,0x86, +0x50,0x20,0x00,0x18,0xF4,0x04,0xA0,0x51,0xF5,0x84,0xFE,0x64,0xA1,0x1F,0x42,0x17, +0x90,0x73,0xF4,0x06,0x40,0x10,0x90,0x36,0xA8,0x51,0x00,0x11,0x80,0x3A,0x00,0x24, +0x00,0x0A,0x14,0x40,0x00,0x0A,0x88,0x22,0x10,0x14,0x00,0x0A,0x00,0x24,0x00,0x09, +0x00,0x11,0x80,0x39,0x88,0x22,0x10,0x14,0x00,0x09,0x02,0x10,0x00,0x19,0x02,0x21, +0x80,0x19,0x96,0xCB,0x97,0x13,0xE0,0x83,0x40,0x11,0x3C,0x1A,0x12,0x10,0x00,0x19, +0xF0,0x08,0x40,0x1E,0x00,0x00,0xF0,0x07,0x8C,0x2C,0x88,0x1C,0x8C,0x0C,0x80,0x41, +0x49,0xFF,0xAA,0xFC,0xF5,0x04,0x00,0x02,0x80,0x0B,0x5A,0x08,0xFF,0x04,0x48,0x00, +0x00,0xC3,0x10,0x04,0x00,0x0B,0xF2,0x0A,0x2E,0x07,0xDE,0x16,0xF1,0x09,0xF3,0x0C, +0x42,0x11,0x00,0x73,0xF2,0x0B,0x42,0x21,0x80,0x73,0x80,0x02,0x04,0x2F,0x80,0xB4, +0x38,0xF1,0x05,0x11,0x38,0x01,0x01,0x11,0xE0,0x0F,0xE8,0x11,0x80,0x3C,0x42,0x15, +0x24,0x73,0x50,0x10,0x80,0x30,0x80,0x1C,0x42,0x03,0xA4,0x73,0xA6,0x8F,0x50,0x00, +0x00,0x30,0x00,0x10,0x80,0x08,0xAE,0x87,0x10,0x10,0x00,0x08,0xB0,0x96,0x00,0x3E, +0x00,0x00,0x80,0x02,0x9A,0x42,0x96,0x48,0xE2,0x23,0x4E,0xF3,0x00,0x9B,0x8C,0xD8, +0x48,0xFF,0xFE,0xAB,0x84,0xC0,0x44,0x72,0x2F,0xF0,0x04,0x0F,0x80,0xB2,0xA6,0x00, +0xE2,0xC0,0x4E,0xF2,0x00,0x9C,0x04,0x0F,0x80,0xB2,0x94,0x72,0x88,0x01,0xB1,0x59, +0xA6,0x85,0xA6,0x04,0xF2,0x82,0xF0,0x83,0x84,0x40,0x2E,0x97,0xDE,0x16,0x80,0x62, +0x2E,0x07,0xDE,0x17,0x45,0xEF,0xFF,0xDF,0xF0,0x84,0x50,0x8F,0x80,0x50,0x50,0xAF, +0x80,0x58,0xF4,0x02,0x38,0x01,0x14,0x00,0x88,0x04,0x96,0x00,0x99,0x2A,0xE2,0x09, +0x20,0x42,0x00,0x01,0xE8,0x1E,0x04,0xFF,0x80,0x03,0x88,0x8F,0x04,0xFF,0x80,0x04, +0x97,0x20,0xE2,0x8F,0xE8,0x16,0x04,0xFF,0x80,0xB3,0x88,0x0F,0x42,0x02,0x24,0x73, +0xA6,0x00,0x40,0x40,0x78,0x02,0x5A,0x40,0x1F,0x0D,0x96,0x27,0x38,0x03,0x80,0x00, +0x5A,0x00,0xFF,0x08,0x38,0x05,0x00,0x00,0x38,0x04,0x0C,0x08,0x8C,0x61,0x96,0xD8, +0x8C,0x42,0x5A,0x28,0x10,0xD8,0x50,0x5F,0x82,0xC8,0xB4,0x05,0xB0,0x94,0x88,0x20, +0xA0,0x29,0x8C,0x22,0xB6,0x1F,0x50,0x4E,0x00,0x0C,0xA0,0x2A,0x84,0xAA,0x8C,0xC1, +0x49,0xFF,0xAA,0x85,0x97,0xB0,0xD5,0xAA,0x44,0x32,0x33,0x88,0x44,0x00,0x01,0x24, +0x81,0x03,0x42,0x82,0x00,0x73,0x50,0x44,0x01,0x08,0x01,0xE2,0x00,0x05,0x42,0x07, +0x80,0x24,0x88,0x03,0x5B,0xE8,0x01,0x1A,0x50,0x30,0x01,0x08,0x00,0xF1,0x80,0x05, +0x5A,0xF8,0x01,0x0B,0x02,0x00,0x00,0x84,0x02,0x84,0x00,0x84,0xE3,0x00,0x84,0x02, +0xE9,0x04,0xAE,0x1E,0xD5,0x13,0x84,0x02,0xAE,0x26,0x84,0x1F,0x81,0x47,0x10,0x00, +0x80,0x0B,0x80,0xE5,0x48,0xFF,0xFE,0xE5,0x50,0x00,0x01,0x08,0xA6,0x45,0x5A,0x10, +0x01,0x04,0x48,0xFF,0xFF,0x76,0x84,0x22,0xAE,0x46,0x84,0x1F,0x10,0x01,0x00,0x0B, +0x48,0xFF,0xFE,0xD7,0x00,0x04,0x00,0x0B,0x10,0x02,0x80,0x0B,0x48,0xFF,0xFF,0x3D, +0x08,0x10,0x00,0x01,0x4C,0xA0,0xFF,0x60,0x10,0x70,0x7F,0xFF,0x48,0xFF,0xFF,0x5C, +0x80,0x0A,0x81,0x47,0x80,0xE0,0x48,0xFF,0xFE,0xC4,0x51,0xFF,0x82,0xA8,0xFC,0xC0, +0xFC,0x58,0xF2,0x87,0x44,0x22,0x00,0xBC,0xF1,0x84,0xB0,0x6C,0xF3,0x88,0xF4,0x93, +0x3A,0x21,0x14,0x00,0x3A,0x20,0x94,0x20,0x84,0xE0,0x3C,0x13,0xEF,0x08,0x80,0xC0, +0xF1,0x91,0xF2,0x11,0x3C,0x13,0xEF,0x09,0xF7,0xA3,0xF1,0x92,0xF1,0x07,0xF7,0xA4, +0x22,0x10,0x80,0x00,0xF1,0x8D,0xF1,0x07,0xA4,0x49,0x9A,0x51,0x96,0x4B,0xF1,0x8E, +0xF1,0x08,0xF2,0x12,0x22,0x10,0x80,0x00,0xF1,0x8F,0xF1,0x08,0xA4,0x49,0x9A,0x51, +0x96,0x4B,0xF1,0x90,0x2E,0x17,0xF4,0x13,0x5A,0x10,0x01,0x04,0x48,0x00,0x00,0x84, +0x80,0x47,0xB0,0x5E,0x49,0xFF,0x98,0xCE,0xB0,0x5F,0x80,0x47,0x50,0x03,0x01,0x24, +0x49,0xFF,0x98,0xC8,0xF4,0x1E,0xF1,0x1F,0x22,0x32,0x00,0x08,0x22,0x50,0x80,0x08, +0x9B,0xDD,0x4E,0x74,0x00,0x03,0xFF,0xFA,0x22,0x02,0x00,0x09,0x22,0x90,0x80,0x09, +0x40,0x20,0x24,0x01,0x4E,0x24,0x00,0x03,0xFE,0x92,0xFE,0x94,0x42,0x23,0x9C,0x73, +0x46,0x70,0x00,0xE0,0x50,0x73,0x8F,0xFF,0xE0,0xE2,0xE9,0x5D,0x2E,0x70,0x12,0xBA, +0x44,0x22,0x13,0x4C,0xE0,0x65,0x81,0x42,0x44,0x50,0x00,0x38,0x42,0xA3,0x94,0x73, +0x04,0x75,0x00,0x08,0xE8,0x10,0xE0,0xE3,0x40,0x33,0xBC,0x1B,0x12,0x32,0x00,0x08, +0x2E,0x70,0x13,0xDE,0x22,0x30,0x80,0x08,0x42,0x23,0x94,0x73,0x04,0x21,0x00,0x08, +0xE0,0x62,0xD5,0x0F,0xE0,0x67,0x40,0x33,0xBC,0x1B,0x12,0x32,0x00,0x08,0x2E,0x70, +0x13,0xDE,0x22,0x30,0x80,0x08,0x42,0x23,0x94,0x73,0x04,0x21,0x00,0x08,0xE0,0x43, +0x40,0x31,0x3C,0x1B,0x12,0x30,0x80,0x08,0x2E,0x30,0x12,0xBA,0x44,0x22,0x13,0x4C, +0x44,0x50,0x00,0x38,0x80,0xE2,0x42,0x71,0x94,0x73,0xE0,0x09,0x04,0x33,0x80,0x09, +0xE8,0x10,0xE0,0x60,0x40,0x01,0xBC,0x1B,0x12,0x02,0x00,0x09,0x2E,0x00,0x13,0xDE, +0x22,0x30,0x80,0x09,0x42,0x20,0x14,0x73,0x04,0x01,0x00,0x09,0xE0,0x60,0xD5,0x0F, +0xE0,0x03,0x40,0x01,0xBC,0x1B,0x12,0x02,0x00,0x09,0x2E,0x00,0x13,0xDE,0x22,0x30, +0x80,0x09,0x42,0x20,0x14,0x73,0x04,0x01,0x00,0x09,0xE0,0x03,0x40,0x30,0x3C,0x1B, +0x12,0x30,0x80,0x09,0xF0,0x11,0x84,0xE0,0x92,0x01,0xF0,0x97,0xF0,0x12,0xF7,0x94, +0x92,0x01,0xF0,0x98,0x44,0x00,0x00,0x64,0xF0,0x83,0xF0,0x8B,0xF0,0x8A,0xF0,0x89, +0x3C,0x03,0xEF,0x08,0xF0,0x85,0x3C,0x03,0xEF,0x09,0xF0,0x86,0xF0,0x05,0x92,0x03, +0xF0,0x99,0xF0,0x06,0x92,0x03,0xF0,0x96,0x96,0x38,0xF0,0x95,0x00,0x03,0x01,0x05, +0x4E,0x02,0x04,0xAB,0x04,0x23,0x00,0x48,0x54,0x21,0x08,0x00,0x4E,0x23,0x04,0xA5, +0xB0,0x5E,0x80,0x06,0x49,0xFF,0x98,0x26,0xB0,0x5F,0x84,0x41,0x80,0x06,0x49,0xFF, +0x98,0x21,0xB0,0x60,0x84,0x42,0x80,0x06,0x49,0xFF,0x98,0x1C,0xB0,0x61,0x84,0x43, +0x80,0x06,0x49,0xFF,0x98,0x17,0xB0,0x62,0x84,0x44,0x80,0x06,0x49,0xFF,0x98,0x12, +0xF0,0x04,0x84,0x23,0x00,0x20,0x00,0x0E,0x44,0x02,0x04,0xA8,0x42,0x01,0x04,0x73, +0xF0,0x8C,0x02,0x03,0x00,0x81,0xE6,0x02,0x4E,0xF2,0x00,0xEB,0x02,0x03,0x00,0x80, +0x5A,0x00,0x02,0x04,0x48,0x00,0x00,0xE5,0x44,0x22,0x00,0xCC,0xB0,0x27,0x3A,0x21, +0x0C,0x00,0x3A,0x20,0x0C,0x20,0xF4,0x1E,0x3C,0x93,0xEF,0x08,0x22,0x52,0x00,0x06, +0x3C,0xA3,0xEF,0x09,0xF0,0x07,0xF1,0x1F,0x22,0x00,0x00,0x00,0x4C,0x02,0x80,0xD1, +0xF0,0x07,0x22,0x00,0x00,0x01,0x40,0x04,0x80,0x01,0x4C,0x50,0x00,0xCA,0xF0,0x08, +0x22,0x52,0x00,0x07,0x22,0x00,0x00,0x00,0x4C,0x02,0x80,0xC3,0xF0,0x08,0x22,0x00, +0x00,0x01,0x40,0x05,0x00,0x01,0x4C,0x50,0x00,0xBC,0x22,0x02,0x00,0x04,0x40,0x34, +0x88,0x09,0x40,0x24,0x80,0x01,0x22,0x42,0x00,0x05,0x4E,0x24,0x00,0x03,0xFE,0x92, +0x96,0x93,0xE0,0x62,0xE8,0x10,0x40,0x25,0x10,0x01,0x40,0x55,0x08,0x09,0x4E,0x24, +0x00,0x03,0xFE,0x92,0x96,0x93,0xE0,0xA2,0xE8,0x06,0xE0,0x60,0xE8,0x04,0xE0,0xA4, +0x4E,0xF3,0x00,0x9F,0x22,0x50,0x80,0x04,0x22,0x30,0x80,0x05,0x9A,0x85,0x8A,0x83, +0x84,0x03,0xFF,0x04,0x84,0x02,0x40,0x82,0x01,0x16,0xF2,0xA5,0x14,0x8F,0x80,0x26, +0xCA,0x03,0x4E,0x82,0x00,0x8E,0xB0,0x25,0xF3,0x9D,0xF2,0x9C,0xF5,0x9B,0xF1,0x9A, +0x49,0xFF,0xAF,0x83,0x5E,0xF0,0x00,0xFA,0x4E,0xF3,0x00,0x83,0xF5,0x1B,0xF2,0x1C, +0xF3,0x1D,0x9A,0x2A,0x40,0x81,0xA0,0x01,0xF1,0x1A,0x4E,0x07,0x00,0x08,0xE0,0x09, +0xE8,0x05,0x4E,0x87,0x00,0x04,0xE1,0x0A,0xE9,0x73,0x22,0x50,0x80,0x06,0xF4,0x25, +0x22,0x10,0x80,0x07,0xF2,0x26,0xFE,0x64,0xFE,0x92,0x42,0x11,0x14,0x73,0xF2,0xA9, +0xF4,0xAA,0xF1,0xAB,0x4E,0x06,0x00,0x06,0xB0,0x29,0x44,0x12,0x04,0x9C,0xD5,0x07, +0xE0,0x09,0x84,0x00,0xE9,0x07,0xB0,0x29,0x44,0x12,0x04,0x90,0xB0,0xA7,0x49,0xFF, +0xB0,0x9F,0xF1,0x27,0x4E,0x15,0x00,0x09,0xE1,0x21,0xE9,0x06,0xF2,0x28,0x4E,0x25, +0x00,0x04,0xE1,0x42,0xE8,0x4B,0x4E,0x86,0x00,0x06,0xB0,0x29,0x44,0x12,0x04,0x84, +0xD5,0x06,0xE1,0x0A,0xE9,0x07,0xB0,0x29,0x44,0x12,0x04,0x78,0xB0,0xA7,0x49,0xFF, +0xB0,0x87,0x5A,0x08,0x02,0x3E,0xF1,0x27,0x4E,0x15,0x00,0x06,0xE1,0x21,0x40,0x90, +0xBC,0x1A,0xD5,0x02,0x85,0x20,0xF0,0x28,0x3C,0x9F,0xF8,0xA0,0x4E,0x05,0x00,0x06, +0xE0,0x0A,0x40,0xA0,0x3C,0x1B,0xD5,0x02,0x85,0x40,0x50,0x93,0x01,0x1B,0x84,0x01, +0x3C,0xAF,0xF8,0xA1,0x12,0x03,0x00,0x81,0x00,0x04,0x80,0x05,0x84,0x22,0x58,0x00, +0x00,0x02,0x10,0x04,0x80,0x05,0xF0,0x15,0x49,0xFF,0xB4,0x74,0xF0,0x15,0x84,0x20, +0x49,0xFF,0xB4,0x79,0xF0,0x1E,0x3C,0x27,0xF1,0x40,0x3C,0x17,0xF1,0x42,0x12,0x20, +0x00,0x08,0x12,0x10,0x00,0x09,0xAC,0x86,0xAC,0x47,0x00,0x04,0x80,0x04,0x54,0x00, +0x00,0xEF,0x10,0x04,0x80,0x04,0x48,0x00,0x03,0x7A,0x5A,0x00,0x02,0xC9,0x02,0xA3, +0x00,0x81,0x5A,0xA8,0x01,0x3E,0x04,0x13,0x00,0x47,0x46,0x01,0x00,0x00,0xFE,0x0E, +0x4E,0x02,0x03,0x4E,0xF0,0x13,0x5A,0x00,0x01,0x04,0x48,0x00,0x03,0x49,0x44,0x02, +0x04,0x68,0xF1,0x11,0xF2,0x12,0x49,0xFF,0xB2,0x83,0x5A,0x00,0x01,0x04,0x48,0x00, +0x03,0x3F,0xF1,0x1E,0x3C,0x2D,0xF8,0x9F,0x3C,0x3D,0xF8,0x9E,0x22,0x00,0x80,0x07, +0x22,0x40,0x80,0x06,0x8A,0x02,0x8A,0x83,0xFE,0x04,0x42,0x02,0x10,0x73,0x5E,0xF0, +0x27,0x10,0x4E,0xF2,0x03,0x2D,0x5E,0xF0,0x19,0x00,0xE8,0x04,0x12,0x30,0x80,0x08, +0xD5,0x0B,0x22,0x00,0x80,0x08,0x88,0x03,0x90,0x01,0x12,0x00,0x80,0x08,0x22,0x00, +0x80,0x09,0x88,0x40,0x90,0x41,0x12,0x20,0x80,0x09,0x48,0x00,0x03,0x3B,0xE7,0x42, +0x4E,0xF3,0x03,0x35,0x04,0x03,0x00,0x47,0x8C,0x0F,0x40,0x00,0x70,0x08,0x90,0x1C, +0x80,0x20,0x4E,0x04,0x00,0x03,0x84,0x20,0x50,0x03,0x01,0x1B,0xA6,0x81,0x96,0x5F, +0x54,0x21,0x00,0xF0,0xFE,0x57,0xAE,0x41,0x3C,0x0D,0xFB,0xD6,0x96,0x1E,0xC8,0x04, +0xF0,0x04,0xB4,0x00,0xD5,0x03,0x44,0x00,0x6D,0x60,0x04,0x9F,0x80,0x1E,0xB4,0x29, +0xE0,0x01,0xE8,0x09,0x50,0x13,0x01,0x1B,0xA6,0x09,0x54,0x00,0x00,0xF0,0x58,0x00, +0x00,0x08,0xAE,0x09,0x04,0x03,0x00,0x47,0x54,0x10,0x00,0x0F,0x50,0x03,0x01,0x1B, +0xC9,0x05,0xA6,0x44,0x54,0x10,0x80,0xDF,0xD5,0x04,0xA6,0x44,0x58,0x10,0x80,0x20, +0xAE,0x44,0x04,0x23,0x00,0x47,0x46,0x01,0x00,0x00,0xFE,0x16,0xC0,0x21,0x00,0x03, +0x01,0x05,0x5A,0x08,0x02,0x1E,0x2E,0x37,0xF4,0x13,0x46,0x14,0x00,0x00,0x02,0x03, +0x00,0x85,0xFE,0x56,0xC3,0x0C,0x5E,0xF0,0x00,0x65,0xE9,0x05,0x8E,0x0A,0x96,0x01, +0x48,0x00,0x00,0x86,0x44,0x00,0x00,0x64,0x48,0x00,0x00,0x82,0xC1,0x05,0xF1,0x04, +0x00,0x10,0x80,0x09,0xD5,0x7A,0xF1,0x04,0x00,0x10,0x80,0x08,0xD5,0x76,0x5C,0xF5, +0x00,0x33,0xE9,0x33,0x46,0x12,0x00,0x00,0xFE,0x56,0xC1,0x2F,0xF0,0x13,0x5A,0x08, +0x01,0x2D,0x3C,0x0D,0xFD,0x05,0x84,0x27,0xFE,0x0C,0xB4,0x29,0x90,0x03,0xE0,0x20, +0xE9,0x05,0x00,0x03,0x01,0x05,0x5A,0x08,0x03,0x21,0xF2,0x20,0xF0,0x1F,0x22,0xF1, +0x00,0x09,0x22,0x30,0x00,0x08,0x22,0x00,0x00,0x09,0x22,0x11,0x00,0x08,0x8A,0x0F, +0x9A,0x59,0xFE,0x04,0x42,0x00,0x84,0x73,0x44,0x10,0x9C,0x3F,0xE0,0x20,0xE9,0x0D, +0xF0,0x04,0xA4,0x42,0x84,0x0A,0xFE,0x0C,0x12,0x03,0x00,0x85,0x44,0x02,0x04,0xA8, +0xF0,0x8C,0x84,0x01,0xF0,0x94,0xD5,0x45,0x00,0x03,0x01,0x05,0x5A,0x08,0x03,0x22, +0xF1,0x04,0x02,0x03,0x00,0x85,0x00,0x10,0x80,0x0B,0x49,0xFF,0xB1,0xB0,0xE7,0x46, +0x12,0x03,0x00,0x85,0xE8,0x36,0x22,0x13,0x00,0x88,0x22,0x04,0x80,0x04,0x8A,0x01, +0xF0,0xA3,0x22,0x13,0x00,0x89,0x22,0x04,0x80,0x05,0x8A,0x01,0xF0,0xA4,0xB0,0x23, +0x49,0xFF,0xAE,0x0B,0x5E,0xF0,0x03,0xE8,0xE8,0x24,0x44,0x00,0x03,0xE8,0xD5,0x1F, +0xF0,0x1F,0xF1,0x0D,0x22,0x50,0x00,0x08,0xD1,0x09,0xF1,0x0E,0xD1,0x07,0x22,0x50, +0x00,0x09,0xF0,0x0F,0xD0,0x03,0xF0,0x10,0xD8,0x0B,0xF0,0x04,0x00,0x10,0x00,0x0A, +0x84,0x03,0xFE,0x44,0x90,0x21,0x02,0x03,0x00,0x85,0x96,0x48,0xD5,0x06,0xF1,0x04, +0x02,0x03,0x00,0x85,0x00,0x10,0x80,0x0A,0x49,0xFF,0xB1,0x79,0x12,0x03,0x00,0x85, +0xF0,0x14,0x02,0x93,0x00,0x85,0xC8,0x55,0x00,0x03,0x01,0x05,0x5A,0x00,0x03,0x52, +0xF2,0x1F,0xF0,0x0E,0xF1,0x0D,0x22,0x31,0x00,0x08,0xF4,0x0F,0x8A,0x03,0x9A,0x59, +0xE0,0x20,0x40,0x10,0x3C,0x1A,0x22,0x21,0x00,0x09,0xF0,0x10,0x9B,0x14,0x8A,0x02, +0xE0,0x80,0x40,0x02,0x3C,0x1B,0x50,0x41,0xFD,0x30,0x97,0x21,0x5C,0xF2,0x0A,0x05, +0x80,0x89,0x14,0x9F,0x80,0x0A,0x96,0x4B,0x96,0x03,0x95,0x22,0xE8,0x04,0xE0,0x82, +0x40,0x01,0x3C,0x1A,0xE0,0x24,0xE8,0x0F,0xF5,0x17,0x90,0x22,0xE0,0x65,0x96,0x4B, +0xE8,0x05,0xF1,0x89,0x14,0x9F,0x80,0x03,0xD5,0x04,0xF1,0x83,0x14,0x9F,0x80,0x09, +0x85,0x02,0xD5,0x06,0x14,0x9F,0x80,0x03,0x14,0x9F,0x80,0x09,0x85,0x01,0xE0,0x04, +0xE8,0x0D,0xF1,0x18,0x90,0x02,0xE0,0x41,0xE8,0x04,0x96,0x03,0xF0,0x8B,0xD5,0x04, +0x14,0x9F,0x80,0x0B,0xF0,0x8A,0x85,0x02,0xD5,0x03,0x14,0x9F,0x80,0x0B,0xF0,0x0B, +0xC0,0x0A,0xF0,0x0A,0xC0,0x08,0xF0,0x09,0xC0,0x06,0xF0,0x03,0xC8,0x05,0xD5,0x03, +0x85,0x01,0xD5,0x02,0x85,0x03,0x04,0x03,0x00,0x48,0x54,0x10,0x00,0x01,0xF0,0x1F, +0xC9,0x0E,0xF2,0x1E,0x22,0x30,0x00,0x08,0x22,0x00,0x00,0x09,0x22,0x11,0x00,0x06, +0x8A,0x23,0xF1,0xA3,0x22,0x11,0x00,0x07,0x9A,0x08,0xD5,0x0C,0x22,0x20,0x00,0x08, +0x04,0x13,0x00,0x3A,0x8A,0x22,0xF1,0xA3,0x22,0x10,0x00,0x09,0x04,0x03,0x00,0x3B, +0x8A,0x01,0xF0,0xA4,0x00,0x03,0x01,0x05,0x5A,0x08,0x02,0x08,0x50,0x13,0x01,0x1B, +0xA6,0x0D,0x54,0x00,0x00,0xFE,0xAE,0x0D,0x04,0x03,0x00,0x48,0x96,0x06,0x4E,0x03, +0x01,0x26,0x44,0x12,0x00,0xCC,0xB0,0x27,0x3A,0x20,0x8C,0x00,0x3A,0x20,0x0C,0x20, +0x00,0x03,0x01,0x06,0x04,0xAF,0x80,0x1F,0xF4,0x22,0x5A,0x08,0x01,0x0B,0x00,0x13, +0x01,0x05,0x84,0x00,0x5A,0x10,0x03,0x04,0x48,0x00,0x01,0x03,0x48,0x00,0x00,0xDC, +0x02,0x03,0x00,0x80,0xE6,0x05,0xE9,0xF4,0x02,0x03,0x00,0x84,0x5C,0xF0,0x07,0xD0, +0xE9,0xEF,0xF0,0x07,0x23,0xE5,0x00,0x08,0x22,0x50,0x00,0x00,0x4C,0x5F,0x3F,0xE9, +0x22,0x00,0x00,0x01,0xF1,0x05,0x9A,0x08,0x4D,0xE0,0x3F,0xE3,0xF0,0x08,0x22,0x55, +0x00,0x09,0x22,0x00,0x00,0x00,0x4C,0x02,0xBF,0xDC,0xF0,0x08,0xF1,0x06,0x22,0x00, +0x00,0x01,0x9A,0x08,0xD0,0xD5,0x22,0x25,0x00,0x04,0xF3,0x05,0x02,0x0F,0x80,0x32, +0x8A,0x62,0x22,0x15,0x00,0x05,0xF0,0x95,0x4E,0x34,0x00,0x03,0xFE,0xDA,0xF0,0x15, +0x96,0xDB,0xE0,0x03,0xE8,0x10,0xF3,0x06,0x8A,0x61,0x4E,0x34,0x00,0x03,0xFE,0xDA, +0xF0,0x16,0x96,0xDB,0xE0,0x03,0xE8,0x07,0xF0,0x15,0xE0,0x02,0xE8,0x04,0xF0,0x16, +0xE0,0x01,0xE9,0xB6,0xF0,0x23,0xC8,0x03,0xF0,0x24,0xC0,0xB2,0x22,0x02,0x00,0x04, +0x5A,0x07,0xFF,0xAF,0x22,0x32,0x00,0x05,0x5A,0x37,0xFF,0xAB,0x22,0xF2,0x00,0x09, +0x22,0x42,0x00,0x08,0x4D,0xE2,0x40,0x04,0x4C,0x57,0xBF,0xA3,0x9B,0x10,0x9A,0xCB, +0x84,0x05,0x84,0xA4,0xFF,0x04,0xFE,0xC4,0x40,0x42,0x14,0x96,0x40,0x31,0x94,0x76, +0xF4,0xA5,0xF3,0xA6,0xCC,0x02,0xC3,0x94,0xB0,0x25,0xF3,0x9C,0xF4,0x9B,0xF1,0x9A, +0xF2,0x95,0x49,0xFF,0xAC,0xDA,0x5E,0xF0,0x00,0x32,0xE9,0x8A,0xF2,0x15,0xF4,0x1B, +0xF1,0x1A,0xF3,0x1C,0x88,0x44,0x88,0x61,0x4E,0x27,0x00,0x0B,0xF0,0x05,0xE0,0x40, +0xE8,0x07,0x4E,0x37,0x00,0x06,0xF0,0x06,0xE0,0x60,0x4E,0xF3,0xFF,0x7A,0xF1,0x23, +0x22,0x05,0x00,0x09,0xF4,0x24,0x22,0x55,0x00,0x08,0xFF,0x22,0xF1,0xAA,0xFE,0x44, +0x42,0x12,0x14,0x73,0xF4,0xA9,0xF1,0xAB,0x4E,0x26,0x00,0x07,0xF3,0x95,0xB0,0x29, +0x44,0x12,0x04,0x9C,0xD5,0x09,0xF0,0x05,0xE0,0x40,0x84,0x00,0xE9,0x09,0xF3,0x95, +0xB0,0x29,0x44,0x12,0x04,0x90,0xB0,0xA7,0x49,0xFF,0xAD,0xF2,0xF3,0x15,0xF1,0x27, +0x4E,0x15,0x00,0x0C,0xF2,0x05,0xE0,0x41,0xE9,0x08,0xF2,0x28,0x4E,0x25,0x00,0x06, +0xF4,0x06,0xE0,0x82,0x4E,0xF2,0x01,0x39,0x4E,0x36,0x00,0x06,0xB0,0x29,0x44,0x12, +0x04,0x84,0xD5,0x07,0xF1,0x06,0xE0,0x61,0xE9,0x07,0xB0,0x29,0x44,0x12,0x04,0x78, +0xB0,0xA7,0x49,0xFF,0xAD,0xD5,0x5A,0x00,0x02,0x04,0x48,0xFF,0xFF,0x3A,0xF1,0x27, +0x4E,0x15,0x00,0x07,0xF0,0x05,0xE0,0x01,0x40,0x10,0x3C,0x1B,0xD5,0x02,0x84,0x20, +0xF0,0x28,0x4E,0x05,0x00,0x07,0xF2,0x06,0xE0,0x02,0x40,0x01,0x3C,0x1A,0xD5,0x02, +0x84,0x00,0x22,0x25,0x00,0x08,0x22,0xF5,0x00,0x09,0x8A,0x22,0x8A,0x0F,0xF1,0xA3, +0xF0,0xA4,0xD5,0x34,0xF0,0x09,0xB0,0xAC,0xF0,0xAC,0xF0,0x03,0xB7,0x1F,0xF0,0xAD, +0xF0,0x0B,0xF6,0x81,0xF0,0xAE,0xF0,0x0A,0x80,0x29,0xF0,0xAF,0x3A,0x21,0x14,0x00, +0xB0,0x23,0x49,0xFF,0xAF,0x54,0x04,0x03,0x00,0x48,0x54,0x00,0x01,0xE0,0x5A,0x08, +0x20,0x35,0xF1,0x1F,0xF0,0x23,0x22,0x20,0x80,0x08,0x22,0x10,0x80,0x09,0x88,0x02, +0x14,0x03,0x00,0x3A,0xF0,0x24,0x88,0x01,0x14,0x03,0x00,0x3B,0xD5,0x26,0xF0,0xA3, +0xF0,0xA4,0xF0,0x0C,0xB0,0x63,0x80,0x49,0xA7,0x00,0xA7,0x41,0xA6,0x02,0xFA,0x6E, +0xB6,0x1F,0x80,0x06,0x49,0xFF,0xAD,0xA6,0xD5,0x3E,0x04,0x03,0x00,0x48,0x96,0x06, +0xC8,0x14,0xF1,0x1F,0xF0,0x23,0x22,0x20,0x80,0x08,0x22,0x10,0x80,0x09,0x88,0x02, +0x14,0x03,0x00,0x3A,0xF0,0x24,0x88,0x01,0x50,0x13,0x01,0x1B,0x14,0x03,0x00,0x3B, +0xA6,0x0D,0x58,0x00,0x00,0x01,0xAE,0x0D,0x44,0x02,0x15,0xC0,0xF1,0x1F,0x38,0x30, +0x1C,0x00,0x00,0x03,0x01,0x05,0xF2,0x20,0x5A,0x00,0x03,0x1A,0x44,0x02,0x15,0xC0, +0x50,0x33,0x01,0x1B,0x38,0x00,0x1C,0x00,0x8C,0x01,0x96,0x00,0x54,0x10,0x00,0x07, +0x94,0x8D,0xA6,0x5D,0x92,0x03,0x96,0x67,0xFE,0x57,0xAE,0x5D,0x54,0x10,0x00,0x01, +0xA6,0x1E,0x54,0x00,0x00,0xFE,0xFE,0x0F,0xAE,0x1E,0xD5,0x05,0xB0,0x23,0x49,0xFF, +0xAC,0x21,0xC0,0xE5,0xF3,0x23,0xF0,0x1E,0xF1,0x1F,0xCB,0x03,0xF2,0x24,0xC2,0x0B, +0x02,0x20,0x80,0x08,0x02,0x10,0x80,0x09,0x88,0x43,0x12,0x20,0x00,0x08,0xF2,0x24, +0x88,0x22,0xD5,0x07,0x22,0x20,0x80,0x08,0x22,0x10,0x80,0x09,0x12,0x20,0x00,0x08, +0x12,0x10,0x00,0x09,0x04,0x13,0x00,0x47,0x46,0x01,0x00,0x00,0xFE,0x0E,0xC0,0x19, +0xF0,0x23,0xC8,0x03,0xF0,0x24,0xC0,0x0C,0x50,0x13,0x01,0x1B,0xA6,0x0C,0x54,0x00, +0x00,0xEF,0xAE,0x0C,0x44,0x0F,0xFF,0x9C,0x3C,0x0F,0xF8,0x9E,0xD5,0x08,0xF0,0x1E, +0x22,0x10,0x00,0x08,0x3C,0x1F,0xF8,0x9E,0x22,0x00,0x00,0x09,0x3C,0x0F,0xF8,0x9F, +0xF0,0x1E,0xF2,0x0D,0x22,0x10,0x00,0x08,0xE0,0x22,0xE9,0x07,0xF2,0x0E,0xE0,0x22, +0x40,0x20,0xBC,0x1B,0x80,0x22,0xD5,0x02,0xF1,0x0D,0x12,0x10,0x00,0x08,0xF2,0x0F, +0x22,0x10,0x00,0x09,0xE0,0x22,0xE9,0x07,0xF2,0x10,0xE0,0x22,0x40,0x20,0xBC,0x1B, +0x80,0x22,0xD5,0x02,0xF1,0x0F,0x12,0x10,0x00,0x09,0xD5,0x20,0x00,0x03,0x01,0x05, +0x5A,0x08,0x03,0x1D,0x00,0x03,0x01,0x06,0x5A,0x00,0x01,0x19,0x44,0x02,0x15,0xC0, +0x50,0x33,0x01,0x1B,0x38,0x00,0x1C,0x00,0x8C,0x01,0x96,0x00,0x54,0x10,0x00,0x07, +0x94,0x8D,0xA6,0x5D,0x92,0x03,0x96,0x67,0xFE,0x57,0xAE,0x5D,0x54,0x10,0x00,0x01, +0xA6,0x1E,0x54,0x00,0x00,0xFE,0xFE,0x0F,0xAE,0x1E,0xF0,0x13,0x5A,0x08,0x01,0x0D, +0x02,0x03,0x00,0x80,0xE6,0x02,0xE9,0x08,0xF0,0x1E,0xB4,0x20,0x3C,0x0D,0xFD,0x05, +0x88,0x01,0x90,0x01,0xD5,0x02,0x84,0x00,0x3C,0x0F,0xFD,0x05,0x02,0x03,0x00,0x81, +0xE6,0x02,0xE8,0x0A,0xF0,0x1E,0x22,0x10,0x00,0x08,0x12,0x13,0x00,0x7E,0x22,0x00, +0x00,0x09,0x12,0x03,0x00,0x7F,0x8C,0xE1,0x50,0x63,0x01,0x24,0x5A,0x70,0x0B,0x04, +0x48,0xFF,0xFB,0x4C,0xFC,0xD8,0x5A,0x00,0x02,0x04,0x48,0xFF,0xFE,0x12,0x48,0xFF, +0xFE,0xDB,0xFC,0x00,0x49,0xFF,0xE4,0x99,0x49,0x00,0x00,0xF6,0x49,0xFF,0xE7,0x8F, +0x49,0xFF,0xE7,0xE3,0x49,0xFF,0xE4,0xC6,0x49,0xFF,0xE4,0xDB,0x49,0xFF,0xE5,0x0E, +0x49,0xFF,0xC8,0x25,0x49,0xFF,0xE5,0xAB,0x49,0xFF,0xE0,0x2F,0x84,0x00,0x3E,0x07, +0xE2,0xCF,0xFC,0x80,0x44,0x04,0x00,0x54,0x84,0x20,0xB6,0x20,0xDD,0x9E,0xFC,0x44, +0x81,0x00,0x84,0x00,0x12,0x0F,0x80,0x0F,0x4E,0x82,0x00,0x0D,0x44,0x02,0x17,0x4C, +0xF0,0x84,0x44,0x02,0x17,0x24,0xF0,0x82,0x84,0x02,0x85,0x45,0xF0,0x83,0x84,0xC6, +0xD5,0x0B,0x44,0x02,0x17,0x88,0x85,0x43,0xF0,0x84,0x44,0x02,0x17,0x60,0xF0,0x82, +0x14,0xAF,0x80,0x03,0x84,0xC4,0x46,0x97,0xFF,0xFF,0x84,0x00,0x80,0xA6,0x50,0x94, +0x8F,0xFF,0xF0,0x81,0x2E,0x07,0xF6,0x1D,0xF7,0x01,0x42,0x73,0x00,0x73,0x97,0xF8, +0xE6,0xF4,0xE8,0x39,0x84,0x02,0x80,0x28,0xF2,0x01,0x44,0x32,0x17,0xB6,0x50,0x4F, +0x80,0x1E,0xF5,0x85,0x49,0xFF,0xCB,0x6D,0xE7,0x02,0xF5,0x05,0xE8,0x0C,0xE3,0x47, +0xE9,0x0A,0x02,0x0F,0x80,0x0F,0xE6,0x0A,0xE8,0x03,0x84,0x00,0xD5,0x02,0x8E,0x0A, +0x12,0x0F,0x80,0x0F,0x44,0x02,0x17,0xB8,0x38,0x10,0x1E,0x02,0x3C,0x03,0xFA,0xE3, +0xC1,0x08,0x94,0x02,0x84,0x46,0x42,0x00,0x88,0x73,0x84,0x2A,0x40,0x00,0x04,0x16, +0x44,0x12,0x17,0xB8,0x38,0x00,0x9E,0x0A,0x44,0x02,0x17,0xB8,0x38,0x00,0x1E,0x02, +0xE0,0x09,0xE8,0x09,0x02,0x1F,0x80,0x0F,0x5C,0xF0,0x82,0x58,0x40,0x90,0x3C,0x1B, +0x40,0x53,0xBC,0x1B,0xF0,0x01,0x8C,0x01,0x96,0x00,0xF0,0x81,0x4C,0x03,0x7F,0xBC, +0x44,0x00,0xFF,0xFF,0xE7,0x02,0x3C,0x0F,0xF8,0xEB,0xE8,0x1E,0xE3,0x47,0xE9,0x1C, +0x84,0x00,0x80,0x20,0x44,0x42,0x17,0xB8,0x38,0x22,0x06,0x02,0x8C,0x21,0xE0,0x40, +0x96,0x48,0x40,0x20,0x3C,0x1B,0xE3,0x41,0x44,0x32,0x17,0xB8,0x96,0x11,0xE8,0xF5, +0x84,0x20,0x38,0x01,0x86,0x0A,0x8C,0x21,0x96,0x88,0xE3,0x42,0xE8,0xFB,0xE3,0x45, +0xE9,0x03,0x81,0x20,0x84,0xA0,0x2E,0x47,0xF6,0x1D,0xC4,0x05,0x3C,0x03,0xFB,0x10, +0xE1,0x20,0xE8,0x05,0x3E,0x57,0xF6,0x22,0x3C,0x9B,0xFB,0x10,0x3C,0x03,0xFB,0x10, +0x5C,0xF0,0x00,0x50,0xE8,0x09,0x2E,0x07,0xF6,0x22,0x3E,0x07,0xF6,0x23,0x84,0x00, +0x3E,0x07,0xF6,0x1C,0xD5,0x20,0x8C,0x81,0x2E,0x17,0xF6,0x1E,0x97,0x20,0xE2,0x81, +0x3E,0x47,0xF6,0x1D,0xE9,0x1A,0x2E,0x17,0xF6,0x22,0x5C,0xF0,0x00,0x78,0x3E,0x17, +0xF6,0x23,0x84,0x01,0xE9,0x02,0x84,0x02,0x3E,0x07,0xF6,0x1C,0x84,0x01,0x3E,0x07, +0xF6,0x1A,0x84,0x21,0x84,0x07,0x49,0xFF,0xE7,0x53,0x84,0x07,0x44,0x10,0x00,0x64, +0x49,0xFF,0xE7,0x40,0x84,0x01,0xD5,0x16,0xFF,0x34,0x97,0x20,0x88,0xC4,0xE4,0xD5, +0xE9,0x02,0xFA,0xC4,0x9F,0x71,0x84,0x02,0xF1,0x03,0xF2,0x02,0xF3,0x04,0x97,0x68, +0x49,0xFF,0xBF,0x7E,0xE7,0x02,0x84,0x00,0xE8,0x05,0x80,0x28,0x49,0xFF,0xC8,0xD7, +0x84,0x00,0xFC,0xC4,0xFC,0x40,0x44,0x64,0x80,0x88,0x46,0xA0,0x10,0x00,0xB4,0x06, +0x46,0x90,0x20,0x00,0x40,0x00,0x28,0x04,0xB6,0x06,0xB4,0x06,0x44,0x74,0x55,0x08, +0x40,0x00,0x24,0x04,0xB6,0x06,0xB4,0x27,0x44,0x0F,0xFF,0xBF,0xFE,0x0E,0xB6,0x07, +0x84,0x21,0x80,0x07,0x49,0xFF,0x87,0xDB,0x44,0x04,0x58,0x88,0x84,0x37,0xB4,0x40, +0xFE,0x56,0xB6,0x20,0x84,0x21,0x49,0xFF,0x87,0xA7,0xB4,0x27,0x44,0x0F,0xFF,0x7F, +0xFE,0x0E,0xB6,0x07,0xB4,0x27,0x44,0x0F,0xFF,0xEF,0xFE,0x0E,0xB6,0x07,0x84,0x21, +0x80,0x07,0x49,0xFF,0x87,0xC4,0xB4,0x06,0x40,0xA0,0x28,0x04,0xB7,0x46,0xB4,0x06, +0x40,0x90,0x24,0x04,0xB7,0x26,0x49,0xFF,0x8D,0x31,0xE6,0x03,0xE8,0x1F,0x44,0x14, +0x2C,0x0C,0x46,0x00,0x01,0x00,0xB4,0x41,0xFE,0x17,0x84,0x41,0xB6,0x01,0x80,0x62, +0x44,0x04,0x28,0x0C,0x44,0x14,0x24,0x0C,0x49,0xFF,0x87,0xD4,0x44,0x14,0x2C,0x18, +0x46,0x00,0x04,0x00,0xB4,0x41,0xFE,0x17,0x84,0x41,0xB6,0x01,0x80,0x62,0x44,0x04, +0x28,0x18,0x44,0x14,0x24,0x18,0x49,0xFF,0x87,0xC5,0x49,0xFF,0x8D,0x0F,0xE6,0x03, +0xE8,0x2B,0x44,0x14,0x2C,0x14,0xB4,0x01,0x58,0x00,0x10,0x00,0xB6,0x01,0x84,0x05, +0x49,0xFF,0xBB,0x25,0x84,0x41,0x80,0x62,0x44,0x04,0x28,0x14,0x44,0x14,0x24,0x14, +0x49,0xFF,0x87,0xB0,0x44,0x04,0x2C,0x1C,0x44,0x1B,0xFF,0xFF,0xB4,0x40,0xFE,0x56, +0xB6,0x20,0xB4,0x40,0x46,0x10,0x00,0x80,0xFE,0x57,0xB6,0x20,0xB4,0x40,0x46,0x10, +0x04,0x00,0xFE,0x57,0x84,0x41,0xB6,0x20,0x80,0x62,0x44,0x04,0x28,0x1C,0x44,0x14, +0x24,0x1C,0x49,0xFF,0x87,0x97,0x46,0x60,0x00,0x81,0x49,0xFF,0x87,0xA5,0x04,0x13, +0x03,0xA0,0x84,0x10,0xFE,0x0E,0x14,0x03,0x03,0xA0,0x04,0x13,0x03,0x9F,0x46,0x0F, +0x0F,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x46,0x46,0x20,0x40,0x00,0xFE,0x57,0x14,0x13, +0x03,0x9F,0x04,0x13,0x03,0x9F,0x46,0x27,0x00,0x00,0x94,0x4C,0x92,0x24,0xFE,0x57, +0x14,0x13,0x03,0x9F,0x04,0x13,0x03,0x9E,0xFE,0x0E,0x46,0x10,0x70,0x00,0xFE,0x0F, +0x14,0x03,0x03,0x9E,0x49,0xFF,0x87,0x79,0x46,0x00,0x03,0x33,0x50,0x00,0x03,0x33, +0x44,0x14,0x50,0x0C,0x14,0x03,0x00,0x34,0x14,0x03,0x00,0x36,0xB4,0x01,0x58,0x00, +0x00,0x01,0xB6,0x01,0x44,0x04,0x00,0x90,0x84,0x2A,0xAC,0x40,0x84,0x00,0x49,0xFF, +0xBC,0x7C,0x44,0x16,0x20,0x04,0x46,0x00,0x10,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01, +0x44,0x14,0x2C,0x18,0x46,0x0B,0xFF,0xFF,0xB4,0x41,0x50,0x00,0x0F,0xFF,0xFE,0x16, +0xB6,0x01,0x44,0x14,0x2C,0x1C,0x44,0x0F,0xFF,0xEF,0xB4,0x41,0xFE,0x16,0x84,0x41, +0xB6,0x01,0x80,0x62,0x44,0x04,0x28,0x18,0x44,0x14,0x24,0x18,0x49,0xFF,0x87,0x3A, +0x84,0x41,0x44,0x04,0x28,0x1C,0x44,0x14,0x24,0x1C,0x80,0x62,0x49,0xFF,0x87,0x32, +0x49,0xFF,0x8C,0x7C,0xE6,0x03,0xE8,0x10,0x44,0x14,0x2C,0x04,0x46,0x00,0x00,0x80, +0xB4,0x41,0xFE,0x17,0x84,0x41,0xB6,0x01,0x80,0x62,0x44,0x04,0x28,0x04,0x44,0x14, +0x24,0x04,0x49,0xFF,0x87,0x1F,0x49,0xFF,0x8C,0x69,0xE6,0x03,0xE9,0x40,0x84,0x08, +0x49,0xFF,0xBA,0x85,0x84,0x00,0x49,0xFF,0xBA,0x8B,0x84,0x41,0x80,0x62,0x44,0x04, +0x28,0x14,0x44,0x14,0x24,0x14,0x49,0xFF,0x87,0x0D,0x44,0x14,0x2C,0x0C,0x46,0x0F, +0xFE,0xFF,0xB4,0x41,0x50,0x00,0x0F,0xFF,0xFE,0x16,0x84,0x41,0xB6,0x01,0x80,0x62, +0x44,0x04,0x28,0x0C,0x44,0x14,0x24,0x0C,0x49,0xFF,0x86,0xFC,0x44,0x04,0x2C,0x04, +0x46,0x10,0x08,0x00,0xB4,0x40,0xFE,0x57,0xB6,0x20,0xB4,0x40,0x46,0x1F,0xFB,0xFF, +0x50,0x10,0x8F,0xFF,0xFE,0x56,0xB6,0x20,0xB4,0x40,0x46,0x10,0x00,0x80,0xFE,0x57, +0xB6,0x20,0xB4,0x40,0x44,0x14,0x00,0x00,0xFE,0x57,0x84,0x41,0xB6,0x20,0x80,0x62, +0x44,0x04,0x28,0x04,0x44,0x14,0x24,0x04,0x49,0xFF,0x86,0xDC,0xFC,0xC0,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x40,0xDD,0x00,0x00,0x40,0xDD,0x00,0x00,0xBE,0xFD,0x00,0x00, +0x00,0xE0,0x01,0x00,0xEE,0xF3,0x01,0x00,0x24,0x01,0x00,0x00,0x50,0x1D,0x00,0x00, +0x81,0x08,0x00,0x1A,0x02,0x00,0x06,0x0C,0x02,0x00,0x06,0x0C,0x01,0x00,0x04,0x04, +0x01,0x00,0x03,0x06,0x01,0x00,0x06,0x00,0x05,0x04,0x00,0x00,0xA9,0xC8,0xB9,0x7E, +0x32,0x19,0x64,0x32,0x33,0x11,0x12,0x20,0xFF,0x07,0xFF,0x07,0x05,0x0A,0x0B,0x00, +0x00,0xFF,0xFF,0x00,0x01,0x00,0x00,0x01,0x01,0x01,0xFF,0x01,0x01,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00,0x5C,0x54,0x47,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37, +0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37, +0x37,0x37,0x37,0x37,0x00,0x00,0x31,0x00,0x94,0x00,0xFA,0x00,0x66,0x01,0xD9,0x01, +0x57,0x02,0xE6,0x02,0x8A,0x03,0x4F,0x04,0x44,0x05,0x84,0x06,0x42,0x08,0xEB,0x0A, +0x98,0x0F,0x55,0x1A,0xF3,0x07,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x01,0x00,0x00,0x01, +0x01,0x01,0xFF,0x01,0x01,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x01,0x00,0x00,0x01, +0xFF,0xFF,0x01,0xFF,0xFF,0x01,0x01,0x01,0x00,0xFF,0xFF,0x00,0x01,0x00,0x00,0x01, +0xFF,0xFF,0x01,0xFF,0xFF,0x01,0x01,0x01,0xFF,0xFF,0x00,0xFF,0x01,0xFF,0xFF,0x00, +0x00,0x00,0x01,0x00,0xFF,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0xFF,0xFF,0x00, +0x01,0x00,0x00,0x01,0xFF,0xFF,0x01,0xFF,0xFF,0x01,0x01,0x01,0x64,0x00,0x00,0x00, +0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x9C,0xFF,0xFF,0xFF, +0x9C,0xFF,0xFF,0xFF,0x94,0x05,0x02,0x00,0x8C,0x05,0x02,0x00,0x80,0x05,0x02,0x00, +0x74,0x05,0x02,0x00,0x64,0x05,0x02,0x00,0x54,0x05,0x02,0x00,0x40,0x05,0x02,0x00, +0x2C,0x05,0x02,0x00,0x14,0x05,0x02,0x00,0xFC,0x04,0x02,0x00,0x0A,0x0B,0x0B,0x0B, +0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00,0x01,0x05,0x00,0x07,0x02,0x06,0x04,0x08, +0x03,0x09,0x00,0x00,0x01,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x00,0x00, +0x01,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x00,0x00,0x05,0x05,0x05,0x05, +0x05,0x05,0x08,0x08,0x08,0x09,0x07,0x06,0x03,0x02,0x08,0x09,0x04,0x09,0x09,0x08, +0x30,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x62,0x01, +0x50,0x01,0x44,0x01,0x74,0x01,0x96,0x01,0x84,0x02,0xC4,0x02,0x5A,0x01,0x46,0x01, +0xEE,0x01,0x30,0x01,0x44,0x01,0x50,0x01,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x08, +0x08,0x09,0x07,0x06,0x03,0x02,0x08,0x09,0x04,0x09,0x09,0x08,0x00,0x01,0x02,0x03, +0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04, +0x03,0x02,0x01,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x00,0x01,0x02, +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x02,0x01,0x00,0x00,0x01,0x02,0x03, +0x04,0x05,0x06,0x07,0x08,0x00,0x00,0x01,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, +0x08,0x00,0x01,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00, +0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00, +0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00, +0x38,0x70,0x00,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x04,0x80,0x00,0x00, +0x08,0x40,0x00,0x00,0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x40,0x08,0x00,0x00, +0x80,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00, +0x38,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x52,0x02,0x00,0x00,0x52,0x02,0x00,0x00,0x92,0x02,0x00,0x00, +0xD2,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xE0,0x00,0x00,0x00, +0xF0,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x40,0x02,0x00,0x00,0xC0,0x00,0xC0,0x00, +0x40,0x00,0x40,0x00,0x00,0x09,0x09,0x00,0x03,0x03,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x04,0x04,0x04,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, +0x08,0x00,0x01,0x02,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x02,0x01,0x00, +0x00,0x01,0x02,0x03,0x04,0x00,0x01,0x02,0x03,0x04,0x00,0x00,0x07,0x80,0x03,0x00, +0x38,0x70,0x00,0x00,0xC0,0x0F,0x00,0x00,0x08,0x40,0x00,0x00,0x10,0x20,0x00,0x00, +0x20,0x10,0x00,0x00,0x40,0x08,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x03,0x00,0x00, +0x07,0x80,0x03,0x00,0x38,0x70,0x00,0x00,0xC0,0x0F,0x00,0x00,0x01,0x00,0x02,0x00, +0x02,0x00,0x01,0x00,0x04,0x80,0x00,0x00,0x08,0x40,0x00,0x00,0x10,0x20,0x00,0x00, +0x20,0x10,0x00,0x00,0x40,0x08,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x03,0x00,0x00, +0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x07,0x80,0x03,0x00, +0x38,0x70,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x03,0x03,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x03,0x03, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x03,0x03,0x03,0x03, +0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x04,0x80,0x00,0x00,0x08,0x40,0x00,0x00, +0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x40,0x08,0x00,0x00,0x80,0x04,0x00,0x00, +0x00,0x03,0x00,0x00,0x07,0x80,0x03,0x00,0x38,0x70,0x00,0x00,0xC0,0x0F,0x00,0x00, +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x00,0x01,0x02,0x00,0x01,0x02,0x03, +0x04,0x05,0x06,0x07,0x08,0x00,0x01,0x02,0x0B,0x02,0x0B,0x0B,0x0B,0x02,0x00,0x00, +0x0B,0x02,0x0B,0x0B,0x0B,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x0A,0x00,0x00,0x00,0xDC,0x00,0x0A,0x05,0xF3,0x01,0xA0,0x05,0x04,0x00,0x96,0x00, +0x01,0x14,0x96,0x05,0x04,0x64,0x00,0x00,0x2C,0x01,0x46,0x00,0x01,0x0A,0x08,0x00, +0x27,0x00,0x27,0x00,0xA9,0x02,0x79,0x05,0x00,0x04,0x02,0x00,0x04,0x04,0x02,0x00, +0x01,0x00,0x00,0x00,0x10,0x04,0x02,0x00,0x02,0x01,0x00,0x14,0x14,0x14,0x14,0x00, +0x2F,0x2F,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x33,0x00,0x4D,0x00, +0x66,0x00,0x80,0x00,0x9A,0x00,0xB3,0x00,0xCD,0x00,0xE6,0x00,0x00,0x01,0x00,0x00, +0x39,0x00,0x71,0x00,0xA7,0x00,0xDA,0x00,0x0A,0x01,0x36,0x01,0x5E,0x01,0x83,0x01, +0xA4,0x01,0xC2,0x01,0x01,0x00,0x00,0x00,0xF1,0xD8,0xFF,0xFF,0xF1,0xD8,0xFF,0xFF, +0xF1,0xD8,0xFF,0xFF,0xF1,0xD8,0xFF,0xFF,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x64,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x19,0x00,0x00,0x01,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x3C,0x0C,0x18,0x32,0x0D, +0x1B,0x28,0x0E,0x17,0x1E,0x0F,0x17,0x14,0x11,0x1D,0x00,0x00,0x01,0x01,0x04,0x01, +0x01,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x0A,0x0B,0x0B,0x0B,0x0C,0x0C,0x0C,0x0C, +0x0C,0x0C,0x00,0x00,0x94,0x05,0x02,0x00,0x8C,0x05,0x02,0x00,0x80,0x05,0x02,0x00, +0x74,0x05,0x02,0x00,0x64,0x05,0x02,0x00,0x54,0x05,0x02,0x00,0x40,0x05,0x02,0x00, +0x2C,0x05,0x02,0x00,0x14,0x05,0x02,0x00,0xFC,0x04,0x02,0x00,0x5D,0x00,0x44,0x00, +0x5A,0x00,0x72,0x00,0x8A,0x00,0xA3,0x00,0xBB,0x00,0xD0,0x00,0xE3,0x00,0xF2,0x00, +0xFD,0x00,0x02,0x01,0x61,0x00,0x4D,0x00,0x68,0x00,0x84,0x00,0xA2,0x00,0xBF,0x00, +0xDA,0x00,0xF2,0x00,0x06,0x01,0x13,0x01,0x1A,0x01,0x00,0x00,0x65,0x00,0x58,0x00, +0x79,0x00,0x9D,0x00,0xC1,0x00,0xE3,0x00,0x02,0x01,0x1C,0x01,0x2E,0x01,0x37,0x01, +0x6A,0x00,0x67,0x00,0x91,0x00,0xBE,0x00,0xEA,0x00,0x13,0x01,0x35,0x01,0x4E,0x01, +0x5B,0x01,0x00,0x00,0x72,0x00,0x7C,0x00,0xB2,0x00,0xEB,0x00,0x23,0x01,0x52,0x01, +0x75,0x01,0x87,0x01,0x7C,0x00,0x99,0x00,0xE2,0x00,0x2E,0x01,0x72,0x01,0xA5,0x01, +0xC1,0x01,0x00,0x00,0x45,0x00,0x63,0x00,0x96,0x00,0xC8,0x00,0xF0,0x00,0x07,0x01, +0x51,0x00,0x88,0x00,0xD3,0x00,0x15,0x01,0x3C,0x01,0x00,0x00,0x67,0x00,0xCC,0x00, +0x40,0x01,0x8A,0x01,0x99,0x00,0x66,0x01,0x38,0x70,0x00,0x00,0xFF,0xFF,0x00,0x00, +0xFF,0x00,0xFF,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x75,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA7,0x9A,0x7E,0xD7, +0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x64,0x00,0xC8,0x00,0x58,0x02,0x60,0x09,0x5A,0x00,0xDC,0x00,0x4B,0x0F,0x28,0x5A, +0xFA,0x00,0xC2,0x01,0xB0,0x04,0xB8,0x0B,0x64,0x00,0xDC,0x00,0x4B,0x0F,0x28,0x64, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x3C,0x50,0x10,0x32,0x32,0x37,0x3C, +0x96,0x00,0x9C,0xFF,0x28,0x23,0x04,0x00,0x2C,0x01,0x38,0xFF,0x32,0x23,0x04,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x04,0x01, +0x90,0x01,0x90,0x01,0x00,0x00,0x00,0x00,0x04,0x01,0x16,0x01,0xD4,0x01,0xF4,0x01, +0x50,0x46,0x00,0x00,0xC8,0x00,0x01,0x01,0x14,0x14,0x0C,0x20,0x00,0x02,0x02,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x5B,0x00,0x26,0x02,0x20,0x03,0x64,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x28,0x00,0x26,0x02,0x20,0x03,0x58,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x0D,0x0D,0x3C,0x46,0x3C,0x00,0x08,0x04,0x1E,0x32,0x0F,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x43,0xF6,0x7B,0xA7, +0x48,0x00,0x3D,0x84,0x48,0x00,0x3B,0xC4,0x48,0x00,0x3B,0xE2,0x48,0x00,0x3C,0x00, +0x48,0x00,0x3C,0x1E,0x48,0x00,0x3C,0x3C,0x48,0x00,0x3C,0x5A,0x48,0x00,0x3C,0x78, +0x48,0x00,0x3C,0x96,0x48,0x00,0x3C,0xEC,0x48,0x00,0x3C,0xEE,0x48,0x00,0x3C,0xF0, +0x48,0x00,0x3C,0xF2,0x48,0x00,0x3C,0xF4,0x48,0x00,0x3C,0xF6,0x48,0x00,0x3C,0xF8, +0x48,0x00,0x3C,0xFA,0x48,0x00,0x3C,0xFC,0x48,0x00,0x3C,0xFE,0x48,0x00,0x3D,0x00, +0x48,0x00,0x3D,0x02,0x48,0x00,0x3D,0x04,0x48,0x00,0x3D,0x06,0x48,0x00,0x3D,0x08, +0x48,0x00,0x3D,0x0A,0x48,0x00,0x3D,0x0C,0x48,0x00,0x3D,0x0E,0x48,0x00,0x3D,0x10, +0x48,0x00,0x3D,0x12,0x48,0x00,0x3D,0x14,0x48,0x00,0x3D,0x16,0x48,0x00,0x3D,0x18, +0x48,0x00,0x3D,0x1A,0x48,0x00,0x3D,0x1C,0x48,0x00,0x3D,0x1E,0x48,0x00,0x3D,0x20, +0x48,0x00,0x3D,0x22,0x48,0x00,0x3D,0x25,0x48,0x00,0x3D,0x28,0x48,0x00,0x3D,0x2B, +0x48,0x00,0x3D,0x2E,0xC4,0x7B,0x00,0x00,0xC6,0x7B,0x00,0x00,0xDA,0x7B,0x00,0x00, +0xEC,0x7B,0x00,0x00,0xFA,0x7B,0x00,0x00,0x12,0x7C,0x00,0x00,0x20,0x7C,0x00,0x00, +0x58,0x7C,0x00,0x00,0x60,0x7C,0x00,0x00,0x76,0x7C,0x00,0x00,0x9A,0x7C,0x00,0x00, +0xE4,0x7C,0x00,0x00,0xE6,0x7C,0x00,0x00,0xEE,0x7C,0x00,0x00,0xF6,0x7C,0x00,0x00, +0xFE,0x7C,0x00,0x00,0x38,0x7D,0x00,0x00,0x3A,0x7E,0x00,0x00,0xCE,0x7E,0x00,0x00, +0xE4,0x7E,0x00,0x00,0x0C,0x80,0x00,0x00,0x24,0x81,0x00,0x00,0x90,0x81,0x00,0x00, +0x92,0x81,0x00,0x00,0x94,0x81,0x00,0x00,0x96,0x81,0x00,0x00,0x98,0x81,0x00,0x00, +0x9A,0x81,0x00,0x00,0x9C,0x81,0x00,0x00,0x9E,0x81,0x00,0x00,0xA0,0x81,0x00,0x00, +0xA2,0x81,0x00,0x00,0xE6,0x28,0xE8,0x4C,0x96,0x06,0x46,0x20,0x00,0x81,0x44,0xF0, +0x01,0x3C,0x38,0x17,0x84,0x00,0x40,0xF0,0xBC,0x00,0xDD,0x0F,0x08,0x16,0x24,0x32, +0x40,0x4E,0x5C,0x6A,0x40,0x00,0x40,0x08,0x04,0x31,0x00,0x29,0x44,0x1E,0xFF,0xFF, +0xD5,0x33,0x40,0x00,0x44,0x08,0x04,0x31,0x00,0x29,0x44,0x1D,0xFF,0xFF,0xD5,0x2C, +0x40,0x00,0x48,0x08,0x04,0x31,0x00,0x29,0x44,0x1B,0xFF,0xFF,0xD5,0x25,0x40,0x00, +0x4C,0x08,0x04,0x31,0x00,0x29,0x46,0x1F,0xFF,0x7F,0xD5,0x1C,0x40,0x00,0x50,0x08, +0x04,0x31,0x00,0x29,0x46,0x1F,0xFE,0xFF,0xD5,0x15,0x40,0x00,0x54,0x08,0x04,0x31, +0x00,0x29,0x46,0x1F,0xFD,0xFF,0xD5,0x0E,0x40,0x00,0x58,0x08,0x04,0x31,0x00,0x29, +0x46,0x1F,0xFB,0xFF,0xD5,0x07,0x40,0x00,0x5C,0x08,0x04,0x31,0x00,0x29,0x46,0x1F, +0xF7,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x29,0xDD,0x9E, +0x44,0x24,0x80,0x90,0x96,0x06,0xB4,0x62,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF, +0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x46,0x10,0x00,0x82,0xA0,0x0A,0x58,0x00, +0x00,0x01,0xA8,0x0A,0xDD,0x9E,0x46,0x20,0x00,0x82,0x96,0x06,0xA0,0xD5,0x40,0x10, +0x40,0x08,0x44,0x0E,0xFF,0xFF,0xFE,0x1E,0xFE,0x0F,0xA8,0x15,0xDD,0x9E,0x46,0x00, +0x00,0x82,0xA0,0x05,0x92,0x10,0x96,0x06,0xDD,0x9E,0xFC,0x40,0x46,0x60,0x00,0x81, +0x96,0x2F,0x40,0x90,0x20,0x08,0x04,0x03,0x00,0x2A,0x44,0x7F,0xC0,0xFF,0xFE,0x3E, +0x40,0x00,0x24,0x04,0x14,0x03,0x00,0x2A,0x96,0x6F,0x40,0x90,0xC0,0x08,0x46,0x0F, +0xFC,0x0F,0x04,0x13,0x00,0x2A,0x50,0x00,0x0F,0xFF,0xFE,0x46,0x40,0x10,0xA4,0x04, +0x14,0x13,0x00,0x2A,0x96,0xAF,0x04,0x93,0x00,0x2A,0x40,0x11,0x60,0x08,0x46,0x2C, +0x0F,0xFF,0x50,0x21,0x0F,0xFF,0x40,0x24,0x88,0x02,0xFE,0x8F,0x14,0x23,0x00,0x2A, +0x04,0x13,0x00,0x2B,0x96,0xEF,0x92,0x26,0x94,0x4E,0xFE,0x5F,0x14,0x13,0x00,0x2B, +0x97,0x2F,0x40,0x12,0x20,0x08,0x04,0x43,0x00,0x2B,0x97,0x6F,0xFF,0x3E,0xFF,0x0F, +0x14,0x43,0x00,0x2B,0x04,0x13,0x00,0x2B,0x40,0x52,0xC0,0x08,0xFE,0x0E,0xFE,0x2F, +0x14,0x03,0x00,0x2B,0x49,0x00,0x04,0x80,0x00,0x0F,0x80,0x20,0x54,0x10,0x00,0x3F, +0x04,0x03,0x03,0x98,0x92,0x06,0x94,0x06,0xFE,0x0F,0x14,0x03,0x03,0x98,0x00,0x0F, +0x80,0x24,0x04,0x23,0x03,0x99,0x96,0x2F,0x94,0x46,0x44,0x0F,0xF0,0x3F,0xFE,0x16, +0xFE,0x0F,0x14,0x03,0x03,0x99,0x49,0x00,0x04,0x60,0xFC,0xC0,0x46,0x30,0x00,0x82, +0x44,0x41,0x00,0x00,0xB4,0xA3,0x54,0x10,0x87,0xFF,0xFF,0x2F,0xB6,0x83,0xB4,0x83, +0x94,0x92,0x92,0x8B,0x40,0x42,0x2C,0x08,0xFF,0x0F,0xB6,0x83,0x88,0x40,0x4C,0x01, +0x00,0x05,0xA0,0x59,0xAA,0x41,0xD5,0xFC,0xB4,0x23,0x44,0x0E,0xFF,0xFF,0xFE,0x0E, +0xB6,0x03,0xDD,0x9E,0x46,0x30,0x00,0x82,0x44,0x41,0x00,0x00,0xB4,0xA3,0x54,0x10, +0x87,0xFF,0xFF,0x2F,0xB6,0x83,0xB4,0x83,0x94,0x92,0x92,0x8B,0x40,0x42,0x2C,0x08, +0xFF,0x0F,0xB6,0x83,0x88,0x40,0x80,0x23,0x4C,0x01,0x00,0x05,0xA3,0x01,0xA9,0x09, +0xD5,0xFC,0xB4,0x23,0x44,0x0E,0xFF,0xFF,0xFE,0x0E,0xB6,0x03,0xDD,0x9E,0xFC,0x00, +0x46,0x50,0x00,0x80,0x46,0x3F,0xFF,0x00,0x9D,0x99,0x9D,0x2E,0x94,0xA9,0x88,0x40, +0x38,0x11,0x18,0x00,0x38,0x21,0x0C,0x00,0x94,0x4C,0xFE,0x57,0x96,0x48,0x18,0x12, +0x80,0x01,0xDC,0xF5,0xFC,0x80,0xFC,0x00,0x46,0x10,0x00,0x80,0x46,0x2F,0xFE,0xFF, +0x50,0x50,0x80,0x08,0x50,0x61,0x0F,0xF1,0x50,0x41,0x0F,0xF0,0x50,0x30,0x80,0x0E, +0x94,0xA9,0x88,0x40,0x38,0x11,0x18,0x00,0x38,0x21,0x10,0x00,0x94,0x4C,0xFE,0x57, +0x96,0x48,0x18,0x12,0x80,0x01,0xDB,0xF5,0xFC,0x80,0x46,0x20,0x00,0x80,0x84,0x7E, +0x50,0x51,0x01,0xC4,0xB4,0x85,0x96,0x06,0xFE,0xE6,0xFE,0x1F,0xB6,0x05,0x96,0x57, +0xB4,0x65,0x40,0x00,0xA0,0x08,0x44,0x1F,0xF8,0xFF,0xFE,0x5E,0xFE,0x47,0xB6,0x25, +0xDD,0x9E,0x46,0x20,0x00,0x81,0x40,0x00,0x40,0x08,0x04,0x11,0x00,0x11,0x96,0x49, +0xFE,0x0F,0x14,0x01,0x00,0x11,0xDD,0x9E,0x46,0x20,0x00,0x81,0x40,0x00,0x40,0x08, +0x04,0x11,0x00,0x10,0x96,0x49,0xFE,0x0F,0x14,0x01,0x00,0x10,0xDD,0x9E,0x46,0x20, +0x00,0x81,0x04,0x11,0x00,0x10,0x92,0x30,0x40,0x10,0xC0,0x08,0xFE,0x0F,0x14,0x01, +0x00,0x10,0xDD,0x9E,0x46,0x20,0x00,0x81,0x04,0x11,0x00,0x11,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x0F,0x14,0x01,0x00,0x11,0xDD,0x9E,0x46,0x20,0x00,0x81,0x84,0x30, +0x04,0x31,0x00,0x12,0x96,0x1F,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E, +0x46,0x20,0x00,0x80,0x84,0x30,0x04,0x31,0x00,0x70,0x96,0x1F,0xFE,0x5E,0xFE,0x0F, +0x14,0x01,0x00,0x70,0xDD,0x9E,0x46,0x20,0x00,0x81,0x84,0x3E,0x04,0x31,0x00,0x13, +0x96,0x06,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x13,0xDD,0x9E,0x46,0x20,0x00,0x81, +0x96,0x06,0x04,0x31,0x00,0x12,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF,0xFE,0x1E, +0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E,0x46,0x20,0x00,0x81,0x96,0x0F,0x40,0x10, +0x48,0x08,0x04,0x31,0x00,0x12,0x46,0x0F,0xFF,0x3F,0x50,0x00,0x0F,0xFF,0xFE,0x1E, +0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E,0x46,0x00,0x00,0x81,0x04,0x00,0x00,0x12, +0x92,0x12,0x96,0x0F,0xDD,0x9E,0x44,0x14,0x80,0x10,0xB4,0x01,0x92,0x0D,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x11,0xFA,0x50,0xAE,0x80,0xB4,0x01,0x92,0x0E,0x96,0x06, +0xC0,0x06,0x44,0x04,0x80,0x11,0x44,0x10,0x00,0x40,0xAE,0x40,0x44,0x14,0x80,0x10, +0xB4,0x01,0x92,0x0F,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x11,0x44,0x2F,0xFF,0x80, +0xAE,0x80,0xB4,0x01,0x92,0x09,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x11,0x84,0x22, +0xAE,0x40,0x44,0x14,0x80,0x10,0xB4,0x01,0x92,0x0C,0x96,0x06,0xC0,0x05,0x44,0x04, +0x80,0x11,0xFA,0x40,0xAE,0x80,0xB4,0x01,0x92,0x17,0x96,0x06,0xC0,0x06,0x44,0x04, +0x80,0x12,0x44,0x1F,0xFF,0x80,0xAE,0x40,0xDD,0x9E,0x00,0x00,0x46,0x10,0x00,0x81, +0x04,0x30,0x80,0x39,0xC0,0x0B,0x5A,0x00,0x01,0x0D,0x5A,0x00,0x02,0x0E,0x84,0x40, +0x5A,0x08,0x03,0x0D,0x46,0x23,0xF3,0xC0,0xD5,0x09,0x46,0x23,0x00,0x00,0xD5,0x06, +0x46,0x23,0x51,0x40,0xD5,0x03,0x46,0x23,0xA2,0x80,0x46,0x1C,0x0C,0x3F,0x50,0x10, +0x8F,0xFF,0x40,0x01,0x84,0x02,0x46,0x10,0x00,0x81,0xFE,0x17,0x14,0x00,0x80,0x39, +0xDD,0x9E,0x46,0x20,0x00,0x81,0x96,0x0F,0x40,0x10,0x58,0x08,0x04,0x31,0x00,0x39, +0x46,0x0F,0xF3,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x39, +0xDD,0x9E,0x46,0x10,0x00,0x81,0x04,0x30,0x80,0x39,0xC0,0x11,0x5A,0x00,0x01,0x09, +0x5A,0x00,0x02,0x0A,0x5A,0x08,0x03,0x0B,0x44,0x03,0xFF,0xC0,0xD5,0x08,0x44,0x01, +0x55,0x40,0xD5,0x05,0x44,0x02,0xAA,0x80,0xD5,0x02,0x84,0x00,0x44,0x23,0xFF,0xC0, +0x44,0x1C,0x00,0x3F,0xFE,0x5E,0xFE,0x16,0xFE,0x0F,0x46,0x10,0x00,0x81,0x14,0x00, +0x80,0x39,0xDD,0x9E,0x46,0x20,0x00,0x81,0x96,0x0F,0x04,0x31,0x00,0x39,0x40,0x10, +0x28,0x08,0x44,0x0F,0xF3,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x39,0xDD,0x9E, +0x46,0x20,0x00,0x81,0x46,0x31,0x55,0x10,0x50,0x31,0x84,0x40,0x50,0x51,0x00,0xE4, +0xB4,0x25,0xA8,0xE9,0xA1,0x2A,0x84,0x78,0xFE,0xE6,0xE6,0x05,0xA8,0xEA,0xE8,0x3A, +0x44,0xF0,0x06,0x10,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00,0x4A,0x00,0x3C,0x00, +0x06,0x1C,0x28,0x3E,0x54,0x00,0x46,0x03,0xA3,0x2A,0x92,0x26,0x50,0x00,0x03,0x00, +0x94,0x4E,0x14,0x01,0x00,0x38,0x58,0x10,0x80,0x3A,0xD5,0x22,0x84,0x00,0x92,0x26, +0x14,0x01,0x00,0x38,0x94,0x4E,0xD5,0x1C,0x46,0x05,0x55,0x55,0x92,0x26,0x50,0x00, +0x05,0x55,0x94,0x4E,0x14,0x01,0x00,0x38,0x58,0x10,0x80,0x15,0xD5,0x11,0x46,0x0A, +0xAA,0xAA,0x92,0x26,0x50,0x00,0x0A,0xAA,0x94,0x4E,0x14,0x01,0x00,0x38,0x58,0x10, +0x80,0x2A,0xD5,0x06,0x84,0x1F,0x14,0x01,0x00,0x38,0x58,0x10,0x80,0x3F,0x14,0x11, +0x00,0x39,0xDD,0x9E,0xDD,0x9E,0x44,0x24,0x50,0x00,0x96,0x06,0xB4,0x62,0x94,0x42, +0x84,0x1B,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x04,0x50,0x28,0xB4,0x00, +0x92,0x04,0x96,0x06,0xDD,0x9E,0x92,0x00,0x46,0x20,0x00,0x83,0x84,0x3C,0x04,0x31, +0x00,0x10,0x96,0x0F,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x10,0xDD,0x9E,0x46,0x20, +0x00,0x83,0x96,0x06,0x04,0x31,0x00,0x10,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF, +0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x10,0xDD,0x9E,0xFC,0x40,0x46,0x20,0x00,0x83, +0x44,0x5F,0xFE,0xFF,0x83,0x82,0xBB,0x18,0x46,0x40,0x0F,0x03,0xFE,0xEE,0xBB,0x98, +0xBB,0x18,0x50,0x42,0x0C,0x0F,0x92,0x68,0x40,0x31,0xA0,0x08,0x58,0x31,0x80,0x46, +0xBB,0x98,0xBF,0x39,0xBE,0x3A,0x04,0x91,0x00,0x3B,0xFF,0xE6,0xFF,0xA6,0x40,0x44, +0x90,0x02,0x04,0x90,0x80,0x02,0xBB,0x3C,0xB5,0x41,0x89,0x24,0xA1,0x0B,0x96,0xDF, +0x88,0xEA,0x04,0xA0,0x80,0x01,0x98,0x5C,0xBB,0x18,0x88,0xCA,0x58,0x31,0x81,0x00, +0xBB,0x98,0xBB,0x18,0x92,0x68,0x40,0x31,0xA0,0x08,0x58,0x31,0x80,0x46,0xBB,0x98, +0xBF,0xB9,0xBE,0xBA,0x14,0x91,0x00,0x3B,0x96,0xC9,0xB9,0x3C,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x5F,0xB9,0xBC,0xB4,0x20,0xB9,0xB9,0xA0,0x41,0xB9,0xBA,0xA0,0x42, +0xB9,0xBB,0xA4,0x46,0xB8,0x3C,0x92,0x10,0x40,0x00,0x40,0x08,0xFE,0x0F,0xB8,0xBC, +0xB8,0x18,0xFF,0x46,0xBD,0x98,0xFC,0xC0,0xFC,0x20,0x46,0x20,0x00,0x83,0x44,0x3F, +0xFE,0xFF,0x83,0x82,0xBC,0x18,0x94,0x4A,0xFE,0xE6,0xBB,0x98,0xBB,0x18,0x50,0x51, +0x00,0xE4,0x92,0x68,0x40,0x31,0xA0,0x08,0x58,0x31,0x80,0x48,0xBB,0x98,0xBB,0x18, +0x50,0x61,0x00,0xE8,0x58,0x31,0x81,0x00,0xBB,0x98,0x50,0x71,0x00,0xEC,0x88,0x20, +0x50,0x21,0x00,0xF0,0x46,0x30,0x00,0x83,0x4C,0x00,0x80,0x12,0xA2,0xC1,0xB6,0x65, +0x83,0x80,0xBB,0x3F,0x02,0x40,0x01,0x7E,0xB6,0x66,0xBB,0x7F,0xB6,0x67,0xB4,0x62, +0x92,0x70,0x40,0x31,0xC0,0x08,0xFE,0xE7,0xB6,0x62,0xD5,0xED,0x83,0x83,0xB9,0x18, +0x44,0x0F,0xFE,0xFF,0xFE,0x0E,0xB8,0x98,0xFC,0xA0,0xFC,0x20,0x46,0x10,0x00,0x83, +0x44,0x2F,0xFE,0xFF,0x83,0x81,0xBB,0x18,0x46,0x40,0xF0,0x3C,0xFE,0x9E,0xBA,0x98, +0xBA,0x18,0x50,0x32,0x00,0xF0,0x92,0x48,0x40,0x21,0x20,0x08,0x58,0x21,0x00,0x46, +0xBA,0x98,0xBE,0x39,0xB4,0x80,0xBD,0x3A,0xFF,0x9E,0x88,0xC4,0xA1,0x01,0xBF,0x3B, +0xFF,0x5E,0x88,0xA4,0xA1,0x02,0xBA,0x3C,0xFE,0xFE,0x88,0x83,0xA0,0xC3,0x54,0x21, +0x00,0xF0,0xBE,0xB9,0x98,0x13,0xBD,0xBA,0xBC,0xBB,0x96,0x81,0xB8,0x3C,0x92,0x10, +0x40,0x00,0x40,0x08,0xFE,0x17,0xB8,0xBC,0xFC,0xA0,0x44,0x14,0x80,0x90,0x84,0x5E, +0xB4,0x61,0x96,0x06,0xFE,0x9E,0xFE,0x87,0xB6,0x41,0xB4,0x81,0x44,0x2F,0xFF,0xEF, +0x94,0xC4,0xFE,0xA6,0xFE,0x9F,0xB6,0x41,0xB4,0x61,0x44,0x2F,0xFB,0xFF,0xFE,0x9E, +0x40,0x00,0x28,0x08,0xFE,0x17,0xB6,0x01,0x46,0x10,0x00,0x80,0x84,0x18,0x50,0x30, +0x82,0x6C,0xB4,0x43,0xFE,0x16,0xB6,0x03,0xB4,0x43,0x44,0x0F,0xF0,0xFF,0xFE,0x16, +0x58,0x00,0x0A,0x00,0xB6,0x03,0xDD,0x9E,0x52,0x00,0x00,0x01,0x46,0x20,0x00,0x80, +0x96,0x06,0xC9,0x08,0x40,0x10,0x20,0x08,0x04,0x31,0x00,0x79,0x44,0x0F,0xFE,0xFF, +0xD5,0x07,0x40,0x10,0x40,0x08,0x04,0x31,0x00,0x79,0x44,0x0E,0xFF,0xFF,0xFE,0x1E, +0xFE,0x0F,0x14,0x01,0x00,0x79,0xDD,0x9E,0x46,0x10,0x00,0x82,0x5A,0x08,0x01,0x0B, +0x50,0x30,0x80,0x20,0xB4,0x03,0x58,0x00,0x00,0x02,0xB6,0x03,0xB4,0x43,0x84,0x1E, +0xD5,0x04,0x04,0x20,0x80,0x08,0x84,0x1D,0xFE,0x16,0x14,0x00,0x80,0x08,0xDD,0x9E, +0x46,0x30,0x00,0x83,0x54,0x10,0x00,0x01,0x50,0x51,0x83,0xB8,0xB4,0x85,0x40,0x20, +0xA0,0x08,0x44,0x1F,0xFE,0xFF,0xFE,0x66,0xFE,0x57,0xB6,0x25,0xB4,0x25,0xE6,0x01, +0x44,0x0F,0xFD,0xFF,0x40,0xF7,0xA4,0x08,0xFE,0x0E,0x40,0x00,0x3C,0x04,0xB6,0x05, +0xDD,0x9E,0x46,0x30,0x00,0x83,0x54,0x10,0x00,0x01,0x50,0x51,0x83,0xB8,0xB4,0x85, +0x40,0x20,0xA8,0x08,0x44,0x1F,0xFB,0xFF,0xFE,0x66,0xFE,0x57,0xB6,0x25,0xB4,0x25, +0xE6,0x01,0x44,0x0F,0xF7,0xFF,0x40,0xF7,0xAC,0x08,0xFE,0x0E,0x40,0x00,0x3C,0x04, +0xB6,0x05,0xDD,0x9E,0x44,0x27,0x20,0x68,0x96,0x01,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x70,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x78,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x80,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x88,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x47,0xB6,0x22,0x44,0x27,0x20,0x90,0xB4,0x22,0x92,0x30,0x40,0x10, +0xC0,0x08,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xC8,0x0A,0x44,0x17,0x20,0x00,0x46,0x0F, +0xEF,0xFF,0xB4,0x41,0x50,0x00,0x0F,0xFF,0xFE,0x16,0xD5,0x09,0x5A,0x08,0x01,0x09, +0x44,0x17,0x20,0x00,0x46,0x00,0x10,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0xDD,0x9E, +0x44,0x27,0x20,0x00,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x0F,0xB6,0x02, +0xDD,0x9E,0x44,0x27,0x20,0x04,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x0F, +0xB6,0x02,0xDD,0x9E,0x44,0x27,0x20,0x00,0x96,0x06,0xB4,0x62,0x40,0x10,0x40,0x08, +0x44,0x0E,0xFF,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xC9,0x06,0x44,0x27, +0x10,0x00,0xB4,0x22,0xFE,0x0F,0xD5,0x08,0x5A,0x18,0x01,0x08,0x44,0x27,0x10,0x00, +0xFE,0x03,0xB4,0x22,0xFE,0x0E,0xB6,0x02,0xDD,0x9E,0x5A,0x18,0x01,0x07,0x44,0x27, +0x10,0x04,0xB4,0x22,0xFE,0x0F,0xD5,0x07,0xC9,0x07,0x44,0x27,0x10,0x04,0xFE,0x03, +0xB4,0x22,0xFE,0x0E,0xB6,0x02,0xDD,0x9E,0x5A,0x18,0x01,0x07,0x44,0x27,0x10,0x08, +0xB4,0x22,0xFE,0x0F,0xD5,0x07,0xC9,0x07,0x44,0x27,0x10,0x08,0xFE,0x03,0xB4,0x22, +0xFE,0x0E,0xB6,0x02,0xDD,0x9E,0x44,0x16,0x00,0x00,0x5A,0x08,0x01,0x06,0xB4,0x01, +0x58,0x00,0x00,0x01,0xD5,0x04,0xB4,0x41,0x84,0x1E,0xFE,0x16,0xB6,0x01,0xDD,0x9E, +0x44,0x16,0x00,0x00,0xB4,0x41,0x5A,0x08,0x01,0x06,0x44,0x01,0x00,0x00,0xFE,0x17, +0xD5,0x04,0x44,0x0E,0xFF,0xFF,0xFE,0x16,0xB6,0x01,0xDD,0x9E,0x44,0x06,0x00,0x00, +0xB4,0x00,0x92,0x1C,0x96,0x06,0xDD,0x9E,0x44,0x16,0x00,0x30,0x5A,0x08,0x01,0x06, +0xB4,0x01,0x58,0x00,0x01,0x00,0xD5,0x05,0xB4,0x41,0x44,0x0F,0xFE,0xFF,0xFE,0x16, +0xB6,0x01,0xDD,0x9E,0x44,0x36,0x38,0x14,0x40,0x00,0x20,0x08,0x40,0x20,0x20,0x09, +0xB4,0x03,0x96,0x6F,0x92,0x18,0x40,0x00,0x60,0x08,0xFE,0x17,0x44,0x26,0x38,0x08, +0xB6,0x03,0xB4,0x62,0x40,0x00,0xE0,0x08,0x46,0x1C,0x0F,0xFF,0x50,0x10,0x8F,0xFF, +0xFE,0x5E,0xFE,0x47,0xB6,0x22,0x44,0x16,0x38,0x04,0x44,0x01,0x00,0x00,0xB4,0x41, +0xFE,0x17,0xB6,0x01,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x03,0x96,0x06,0xC0,0xFD, +0x44,0x04,0x80,0x0C,0x84,0x28,0xAE,0x40,0xDD,0x9E,0x44,0x36,0x34,0x14,0x40,0x00, +0x20,0x08,0x40,0x20,0x20,0x09,0xB4,0x03,0x96,0x6F,0x92,0x18,0x40,0x00,0x60,0x08, +0xFE,0x17,0x44,0x26,0x34,0x08,0xB6,0x03,0xB4,0x62,0x40,0x00,0xE0,0x08,0x46,0x1C, +0x0F,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x5E,0xFE,0x47,0xB6,0x22,0x44,0x16,0x34,0x04, +0x44,0x01,0x00,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0x44,0x14,0x80,0x0C,0xB4,0x01, +0x92,0x13,0x96,0x06,0xC0,0xFD,0x44,0x04,0x80,0x0E,0x84,0x28,0xAE,0x40,0xDD,0x9E, +0xFC,0x01,0xB6,0x3F,0x80,0x22,0xF3,0x81,0x49,0xFF,0xFF,0xA6,0xB4,0x1F,0xF1,0x01, +0x49,0xFF,0xFF,0xCD,0xFC,0x81,0x44,0x16,0x3C,0x04,0xB4,0x01,0x58,0x00,0x00,0x01, +0xB6,0x01,0xDD,0x9E,0x44,0x26,0x38,0x04,0xB4,0x22,0x44,0x06,0x38,0x04,0x92,0x28, +0x96,0x46,0xC9,0xFB,0xB4,0x40,0x84,0x3E,0xFE,0x56,0xB6,0x20,0x80,0x20,0xB4,0x01, +0x92,0x08,0x96,0x06,0xC8,0xFD,0x44,0x26,0x34,0x04,0xB4,0x22,0x44,0x06,0x34,0x04, +0x92,0x28,0x96,0x46,0xC9,0xFB,0xB4,0x40,0x84,0x3E,0xFE,0x56,0xB6,0x20,0x80,0x20, +0xB4,0x01,0x92,0x08,0x96,0x06,0xC8,0xFD,0xDD,0x9E,0xFC,0x00,0x46,0x60,0x00,0x83, +0x83,0x86,0xB8,0x27,0x58,0x00,0x00,0x01,0xB8,0xA7,0xB8,0x27,0x58,0x00,0x01,0x00, +0xB8,0xA7,0x84,0x01,0x49,0x00,0x08,0x9B,0xB9,0x27,0x84,0x1E,0xFE,0x0E,0xB8,0xA7, +0xB9,0x27,0x44,0x0F,0xFE,0xFF,0xFE,0x0E,0xB8,0xA7,0xFC,0x80,0xFC,0x40,0x46,0x60, +0x00,0x83,0x84,0xFE,0x83,0x86,0x04,0x93,0x00,0x14,0x96,0x06,0x40,0x74,0x9C,0x02, +0xFE,0x3F,0xB8,0x94,0x96,0x5F,0xBF,0x14,0x40,0x00,0xE0,0x08,0x46,0x1F,0x0F,0xFF, +0x50,0x10,0x8F,0xFF,0xFE,0x7E,0xFE,0x47,0xB9,0x94,0x97,0x2F,0xB9,0x14,0x40,0x02, +0x44,0x08,0x46,0x4F,0xF8,0x1F,0x50,0x42,0x0F,0xFF,0xFF,0x0E,0xFF,0x07,0xBC,0x94, +0x97,0x6F,0x40,0x02,0xAC,0x08,0xBD,0x14,0x44,0x1E,0x07,0xFF,0xFF,0x4E,0xFF,0x47, +0xBD,0x94,0xB8,0x15,0x54,0x21,0x03,0xFF,0x92,0x0A,0x40,0x00,0x28,0x08,0xFE,0x17, +0xB8,0x95,0x96,0xF7,0x40,0x01,0xC0,0x08,0xB9,0x15,0x46,0x3F,0xF8,0x0F,0x50,0x31, +0x8F,0xFF,0xFE,0xCE,0xFE,0xC7,0xBB,0x95,0xFC,0xC0,0x46,0x00,0x00,0x83,0x04,0x00, +0x00,0x16,0x96,0x01,0xDD,0x9E,0xFC,0x00,0x46,0x40,0x00,0x83,0x84,0x61,0x83,0x84, +0xBE,0x13,0x84,0xBE,0xFE,0x1E,0xFF,0x76,0xFE,0x2F,0xB8,0x93,0xFE,0x5E,0x40,0x30, +0xA0,0x08,0xB9,0x60,0x44,0x0F,0xFE,0xFF,0xFE,0x46,0xFE,0x5F,0xB9,0xE0,0x96,0xA7, +0x40,0x01,0x20,0x08,0xBA,0x13,0x44,0x1F,0xE0,0xFF,0xFE,0x8E,0xFE,0x87,0xBA,0x93, +0xFC,0x80,0x46,0x30,0x00,0x83,0x96,0x8F,0x50,0x41,0x81,0x84,0xB6,0x04,0xA8,0x61, +0xA0,0x62,0x84,0x1C,0xFE,0x0E,0xFE,0x87,0xA8,0xA2,0xDD,0x9E,0x46,0x20,0x00,0x83, +0x96,0x27,0x04,0x11,0x00,0x60,0x92,0x25,0x94,0x4D,0xFE,0x47,0x14,0x11,0x00,0x60, +0xDD,0x9E,0x46,0x20,0x00,0x83,0x84,0x3E,0x04,0x31,0x00,0x12,0x96,0x06,0xFE,0x5E, +0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E,0xB4,0x40,0x46,0x10,0x00,0x80,0x14,0x20, +0x80,0x48,0xA0,0x01,0x14,0x00,0x80,0x4A,0xDD,0x9E,0xFC,0x40,0x46,0x20,0x00,0x83, +0x50,0x61,0x00,0xE4,0x83,0x82,0xBB,0x18,0x50,0x71,0x00,0xE8,0x58,0x31,0x81,0x00, +0xBB,0x98,0xBB,0x18,0x50,0x91,0x00,0xEC,0x92,0x68,0x40,0x31,0xA0,0x08,0x58,0x31, +0x80,0x88,0xBB,0x98,0x8C,0x02,0x84,0xA0,0x50,0x21,0x00,0xF0,0x46,0x30,0x00,0x83, +0xD1,0x22,0x22,0x30,0x00,0x00,0x22,0x40,0x7F,0xFF,0x40,0x31,0xC0,0x08,0x88,0x64, +0xB6,0x66,0x22,0x30,0x00,0x02,0x22,0x40,0x00,0x01,0x40,0x31,0xC0,0x08,0x88,0x64, +0xB6,0x67,0x22,0x30,0x00,0x04,0x22,0x40,0x00,0x03,0x40,0x31,0xC0,0x08,0x88,0x64, +0xB6,0x69,0xB4,0x62,0x8C,0xA1,0x92,0x70,0x40,0x31,0xC0,0x08,0xB6,0x62,0x97,0x68, +0x8C,0x0C,0xD5,0xDD,0x83,0x83,0xB9,0x18,0x44,0x0F,0xFE,0xFF,0xFE,0x0E,0xB8,0x98, +0xFC,0xC0,0x46,0x20,0x00,0x83,0x96,0x0F,0x04,0x31,0x00,0x12,0x40,0x10,0x40,0x08, +0x44,0x0C,0xFF,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x12,0xDD,0x9E,0xFC,0x00, +0x84,0x40,0x44,0x64,0x00,0xC0,0x38,0x30,0x88,0x00,0x38,0x40,0x09,0x01,0x99,0x56, +0x40,0x31,0xB0,0x08,0x95,0x69,0xFE,0xE7,0x96,0xD9,0x8C,0x41,0xAC,0xE8,0x5A,0x28, +0x14,0xF4,0xFC,0x80,0x46,0x20,0x00,0x83,0x96,0x06,0x04,0x31,0x00,0x26,0x94,0x41, +0x84,0x1D,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x26,0xDD,0x9E,0x46,0x20,0x00,0x81, +0x96,0x06,0xA0,0xD5,0x40,0x10,0x20,0x08,0x44,0x0F,0xFE,0xFF,0xFE,0x1E,0xFE,0x0F, +0xA8,0x15,0xDD,0x9E,0xC9,0x08,0x46,0x20,0x00,0x91,0x84,0x3E,0xB4,0x62,0x96,0x06, +0xFE,0x5E,0xD5,0x0A,0x5A,0x18,0x01,0x0B,0x46,0x20,0x00,0x91,0x96,0x06,0xB4,0x62, +0x94,0x41,0x84,0x1D,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xFC,0x00,0x44,0x00, +0x00,0xC8,0x49,0x00,0x07,0x6C,0x44,0x14,0x50,0x0C,0x46,0x60,0x00,0x81,0xB4,0x01, +0x58,0x00,0x00,0x04,0xB6,0x01,0xFA,0x18,0x49,0x00,0x07,0x6A,0x83,0x86,0xB8,0x1C, +0x58,0x00,0x01,0x00,0xB8,0x9C,0x84,0x01,0x49,0x00,0x07,0x62,0xB9,0x1C,0x44,0x01, +0x00,0x00,0xFE,0x0F,0xB8,0x9C,0x44,0x00,0x01,0xF4,0x49,0x00,0x07,0x50,0xB9,0x1C, +0x46,0x00,0x10,0x00,0xFE,0x0F,0xB8,0x9C,0x44,0x00,0x01,0xF4,0x49,0x00,0x07,0x47, +0xFC,0x80,0x00,0x00,0x46,0x10,0x00,0x80,0x50,0x50,0x80,0x80,0x50,0x10,0x80,0xB0, +0xA2,0x81,0xAA,0xA9,0xD9,0xFE,0xDD,0x9E,0x46,0x10,0x00,0x80,0x50,0x50,0x80,0xB0, +0x50,0x10,0x80,0xC4,0xA2,0x81,0xAA,0xA9,0xD9,0xFE,0xDD,0x9E,0xB4,0x40,0x46,0x10, +0x00,0x80,0x14,0x20,0x80,0x47,0xA0,0x01,0x14,0x00,0x80,0x49,0xDD,0x9E,0x46,0x10, +0x00,0x80,0x50,0x50,0x81,0x40,0x50,0x30,0x81,0x4C,0xA6,0x41,0xA6,0x80,0x94,0x4C, +0xFE,0x57,0x96,0x48,0xAE,0x68,0x00,0x10,0x00,0x0D,0x00,0x20,0x00,0x0C,0x94,0x4C, +0xFE,0x57,0x96,0x48,0x10,0x12,0x80,0x0C,0x8C,0xA1,0x8C,0x02,0xDB,0xEF,0xDD,0x9E, +0x46,0x10,0x00,0x80,0x50,0x50,0x80,0x40,0x50,0x30,0x80,0x46,0xA6,0x41,0xA6,0x80, +0x94,0x4C,0xFE,0x57,0x96,0x48,0xAE,0x68,0x00,0x10,0x00,0x0D,0x00,0x20,0x00,0x0C, +0x94,0x4C,0xFE,0x57,0x96,0x48,0x10,0x12,0x80,0x0C,0x8C,0xA1,0x8C,0x02,0xDB,0xEF, +0xDD,0x9E,0xA6,0x81,0x80,0xA0,0x94,0x94,0x08,0x12,0x80,0x05,0xFE,0x8F,0x46,0x10, +0x00,0x80,0x96,0x90,0x10,0x20,0x80,0x48,0xA6,0xA9,0xA6,0xC5,0x94,0x94,0xFE,0x9F, +0x96,0x90,0x10,0x20,0x80,0x54,0xA6,0x83,0xA6,0xC2,0x94,0x94,0xFE,0x9F,0x96,0x90, +0x10,0x20,0x80,0x49,0xA6,0xAB,0xA6,0xEA,0x94,0x94,0xFE,0x9F,0x96,0x90,0x10,0x20, +0x80,0x55,0xA6,0x84,0x84,0x0F,0xFE,0x86,0x40,0x31,0x40,0x08,0x46,0x4F,0xFF,0x0F, +0x04,0x20,0x80,0x12,0x50,0x42,0x0F,0xFF,0xFE,0xA6,0xFE,0x9F,0x14,0x20,0x80,0x12, +0xA6,0xAC,0xFE,0x16,0x40,0x20,0x40,0x08,0x04,0x00,0x80,0x15,0xFE,0x26,0xFE,0x17, +0x14,0x00,0x80,0x15,0xDD,0x9E,0x46,0x10,0x00,0x80,0x50,0x50,0x80,0x58,0x50,0x30, +0x80,0x5E,0xA6,0x41,0xA6,0x80,0x94,0x4C,0xFE,0x57,0x96,0x48,0xAE,0x68,0x00,0x10, +0x00,0x0D,0x00,0x20,0x00,0x0C,0x94,0x4C,0xFE,0x57,0x96,0x48,0x10,0x12,0x80,0x0C, +0x8C,0xA1,0x8C,0x02,0xDB,0xEF,0xDD,0x9E,0xA6,0x81,0x80,0xA0,0x94,0x94,0x08,0x12, +0x80,0x05,0xFE,0x8F,0x46,0x10,0x00,0x80,0x96,0x90,0x10,0x20,0x80,0x60,0xA6,0xA9, +0xA6,0xC5,0x94,0x94,0xFE,0x9F,0x96,0x90,0x10,0x20,0x80,0x6C,0xA6,0x83,0xA6,0xC2, +0x94,0x94,0xFE,0x9F,0x96,0x90,0x10,0x20,0x80,0x61,0xA6,0xAB,0xA6,0xEA,0x94,0x94, +0xFE,0x9F,0x96,0x90,0x10,0x20,0x80,0x6D,0xA6,0x84,0x84,0x0F,0xFE,0x86,0x40,0x31, +0x40,0x08,0x46,0x4F,0xFF,0x0F,0x04,0x20,0x80,0x18,0x50,0x42,0x0F,0xFF,0xFE,0xA6, +0xFE,0x9F,0x14,0x20,0x80,0x18,0xA6,0xAC,0xFE,0x16,0x40,0x20,0x40,0x08,0x04,0x00, +0x80,0x1B,0xFE,0x26,0xFE,0x17,0x14,0x00,0x80,0x1B,0xDD,0x9E,0xE6,0x06,0xE8,0x57, +0xFC,0x20,0x46,0x70,0x00,0x81,0x44,0xF0,0x10,0x74,0x38,0x07,0x80,0x00,0x40,0xF0, +0x3C,0x00,0xDD,0x0F,0x06,0x16,0x34,0x62,0x76,0x44,0x04,0x03,0x80,0x20,0x54,0x10, +0x87,0xFF,0x92,0x0B,0x40,0x00,0x2C,0x08,0xD5,0x0C,0x54,0x10,0x87,0xFF,0x40,0x00, +0xC0,0x08,0x04,0x23,0x80,0x20,0x46,0x1F,0x80,0x0F,0x50,0x10,0x8F,0xFF,0xFE,0x56, +0xFE,0x47,0x14,0x13,0x80,0x20,0xFC,0xA0,0x04,0x03,0x80,0x21,0x54,0x10,0x87,0xFF, +0x92,0x0B,0x40,0x00,0x2C,0x08,0xD5,0x0C,0x54,0x10,0x87,0xFF,0x40,0x00,0xC0,0x08, +0x04,0x23,0x80,0x21,0x46,0x1F,0x80,0x0F,0x50,0x10,0x8F,0xFF,0xFE,0x56,0xFE,0x47, +0x14,0x13,0x80,0x21,0xFC,0xA0,0x83,0x87,0xB8,0x22,0x54,0x10,0x87,0xFF,0x92,0x0B, +0x40,0x00,0x2C,0x08,0xFE,0x47,0xB9,0xA2,0xFC,0xA0,0x80,0xC1,0x49,0xFF,0xFD,0x54, +0x54,0x13,0x03,0xFF,0x95,0x8E,0x04,0x13,0x83,0x98,0x44,0x0F,0x00,0x3F,0xFE,0x46, +0xFE,0x77,0x14,0x13,0x83,0x98,0x49,0xFF,0xFD,0x40,0xFC,0xA0,0xDD,0x9E,0x46,0x20, +0x00,0x83,0x96,0x06,0x40,0x10,0x60,0x08,0x04,0x31,0x00,0xC0,0x46,0x0F,0xEF,0xFF, +0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0xC0,0xDD,0x9E,0x46,0x20, +0x00,0x83,0x96,0x06,0x40,0x10,0x64,0x08,0x04,0x31,0x00,0xC0,0x46,0x0F,0xDF,0xFF, +0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0xC0,0xDD,0x9E,0x46,0x20, +0x00,0x83,0x96,0x0F,0x04,0x31,0x00,0x0F,0x40,0x10,0x20,0x08,0x44,0x0F,0xFC,0xFF, +0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x0F,0xDD,0x9E,0x46,0x20,0x00,0x83,0x84,0x3E, +0x04,0x31,0x00,0x0F,0x96,0x06,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x0F,0xDD,0x9E, +0x46,0x20,0x00,0x83,0x96,0x06,0x04,0x31,0x00,0x0F,0x40,0x10,0x28,0x08,0x44,0x0F, +0xFB,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x0F,0xDD,0x9E,0x46,0x10,0x00,0x83, +0x44,0x01,0x00,0x00,0x04,0x20,0x80,0x0E,0xFE,0x17,0x14,0x00,0x80,0x0E,0xDD,0x9E, +0x46,0x20,0x00,0x83,0x46,0x3F,0x7F,0xFF,0x50,0x51,0x00,0x38,0xB4,0x85,0x50,0x31, +0x8F,0xFF,0xFE,0xE6,0xB6,0x65,0xB4,0x85,0x46,0x3E,0xFF,0xFF,0x50,0x31,0x8F,0xFF, +0xFE,0xE6,0xB6,0x65,0x5A,0x08,0x01,0x04,0x84,0x1F,0xD5,0x02,0x84,0x00,0x14,0x01, +0x00,0x0B,0x14,0x01,0x00,0x0C,0x04,0x01,0x00,0x33,0x5A,0x18,0x01,0x0B,0x58,0x00, +0x0F,0xFF,0x14,0x01,0x00,0x33,0x04,0x01,0x00,0x34,0x58,0x00,0x0F,0xFF,0xD5,0x0B, +0x92,0x0C,0x40,0x00,0x30,0x08,0x14,0x01,0x00,0x33,0x04,0x01,0x00,0x34,0x92,0x0C, +0x40,0x00,0x30,0x08,0x14,0x01,0x00,0x34,0xDD,0x9E,0x46,0x10,0x00,0x83,0x96,0x06, +0x50,0x50,0x80,0x38,0xB4,0x85,0x44,0x2F,0xFE,0xFF,0x40,0x30,0x20,0x08,0xFE,0xA6, +0xFE,0x9F,0xB6,0x45,0xB4,0x65,0x44,0x2F,0xFD,0xFF,0x40,0x00,0x24,0x08,0xFE,0x9E, +0xFE,0x17,0xB6,0x05,0xDD,0x9E,0x46,0x20,0x00,0x81,0x50,0x51,0x00,0x90,0x50,0x31, +0x00,0x9A,0x08,0x20,0x00,0x01,0x88,0x41,0x96,0x90,0x18,0x22,0x80,0x01,0xDB,0xFA, +0xDD,0x9E,0xE6,0x25,0xE8,0x33,0x96,0x1F,0x46,0x20,0x00,0x81,0x44,0xF0,0x12,0x7C, +0x38,0x17,0x84,0x00,0x40,0xF0,0xBC,0x00,0x4A,0x00,0x3C,0x00,0x06,0x0E,0x1A,0x28, +0x36,0x00,0x04,0x31,0x00,0x23,0x84,0x30,0xD5,0x1D,0x94,0x04,0x04,0x31,0x00,0x23, +0x44,0x1F,0xFF,0x0F,0xD5,0x17,0x40,0x00,0x20,0x08,0x04,0x31,0x00,0x23,0x44,0x1F, +0xF0,0xFF,0xD5,0x10,0x40,0x00,0x30,0x08,0x04,0x31,0x00,0x23,0x44,0x1F,0x0F,0xFF, +0xD5,0x09,0x46,0x1F,0xFF,0x0F,0x40,0x00,0x40,0x08,0x04,0x31,0x00,0x23,0x50,0x10, +0x8F,0xFF,0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x23,0xDD,0x9E,0x84,0x00,0xDD,0x9E, +0x46,0x20,0x00,0x81,0x54,0x00,0x03,0xFF,0x40,0x10,0x40,0x08,0x04,0x31,0x00,0x49, +0x46,0x0F,0xC0,0x0F,0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x49, +0xDD,0x9E,0xE6,0x06,0xE8,0x52,0xFC,0x20,0x46,0x70,0x00,0x81,0x54,0x60,0x83,0xFF, +0x44,0xF0,0x13,0x10,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00,0x4A,0x00,0x3C,0x00, +0x06,0x2E,0x46,0x56,0x66,0x16,0x83,0x87,0xB9,0x30,0x92,0x2A,0x40,0x10,0xA8,0x08, +0xFF,0x8F,0xBE,0xB0,0xFC,0xA0,0x83,0x87,0xB8,0x31,0x46,0x2F,0xC0,0x0F,0x50,0x21, +0x0F,0xFF,0x40,0x63,0x40,0x08,0xFE,0x16,0xFE,0x37,0xB8,0xB1,0xFC,0xA0,0x83,0x87, +0xB8,0x30,0x46,0x2F,0xC0,0x0F,0x50,0x21,0x0F,0xFF,0x40,0x63,0x40,0x08,0xFE,0x16, +0xFE,0x37,0xB8,0xB0,0xFC,0xA0,0x83,0x87,0xB9,0x31,0x92,0x2A,0x40,0x10,0xA8,0x08, +0xFF,0x8F,0xBE,0xB1,0xFC,0xA0,0x83,0x87,0xB9,0x32,0x92,0x2A,0x40,0x10,0xA8,0x08, +0xFF,0x8F,0xBE,0xB2,0xFC,0xA0,0x49,0xFF,0xFC,0x0F,0x40,0x13,0x40,0x08,0x04,0x03, +0x83,0x98,0x46,0x6F,0xC0,0x0F,0x50,0x63,0x0F,0xFF,0xFF,0x86,0xFF,0x8F,0x14,0x63, +0x83,0x98,0x49,0xFF,0xFB,0xFA,0xFC,0xA0,0xDD,0x9E,0x54,0x20,0x80,0x03,0xE6,0x08, +0x54,0x10,0x80,0x0C,0x90,0x22,0x4E,0xF2,0x00,0x93,0x96,0x4F,0x46,0x30,0x00,0x81, +0x96,0x8F,0x44,0xF0,0x13,0xC0,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00,0xDD,0x0F, +0x08,0x24,0x40,0x5E,0x7C,0x9C,0xBC,0xE8,0x50,0x51,0x80,0x9C,0xB4,0x85,0x84,0x1C, +0xFE,0x26,0xFE,0x47,0xB6,0x25,0xB4,0x25,0x44,0x0C,0xFF,0xFF,0x40,0x21,0x40,0x08, +0xFE,0x0E,0xD5,0x72,0x50,0x51,0x80,0x9C,0xB4,0x85,0x84,0x13,0xFE,0x26,0x94,0x4A, +0xFE,0x47,0xB6,0x25,0x40,0x21,0x48,0x08,0xB4,0x05,0x46,0x1F,0xFF,0x3F,0xD5,0x4E, +0x50,0x51,0x80,0x9C,0xB4,0x85,0x44,0x0F,0xFF,0xCF,0xFE,0x26,0x94,0x4C,0xFE,0x47, +0xB6,0x25,0x40,0x21,0x50,0x08,0xB4,0x05,0x46,0x1F,0xFC,0xFF,0xD5,0x3F,0x50,0x51, +0x80,0x9C,0xB4,0x85,0x44,0x0F,0xFF,0x3F,0xFE,0x26,0x94,0x4E,0xFE,0x47,0xB6,0x25, +0x40,0x21,0x58,0x08,0xB4,0x05,0x46,0x1F,0xF3,0xFF,0xD5,0x30,0x50,0x51,0x80,0x9C, +0xB4,0x85,0x44,0x0F,0xFC,0xFF,0xFE,0x26,0x40,0x10,0xA0,0x08,0xFE,0x47,0xB6,0x25, +0x40,0x21,0x60,0x08,0xB4,0x05,0x46,0x1F,0xCF,0xFF,0xD5,0x20,0x50,0x51,0x80,0x9C, +0xB4,0x85,0x44,0x0F,0xF3,0xFF,0xFE,0x26,0x40,0x10,0xA8,0x08,0xFE,0x47,0xB6,0x25, +0x40,0x21,0x68,0x08,0xB4,0x05,0x46,0x1F,0x3F,0xFF,0xD5,0x10,0x50,0x51,0x80,0x9C, +0xB4,0x85,0x44,0x0F,0xCF,0xFF,0xFE,0x26,0x40,0x10,0xB0,0x08,0xFE,0x47,0xB6,0x25, +0x40,0x21,0x70,0x08,0xB4,0x05,0x46,0x1C,0xFF,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x0E, +0xFE,0x17,0x14,0x01,0x80,0x27,0xDD,0x9E,0x50,0x51,0x80,0x9C,0xB4,0x85,0x44,0x0F, +0x3F,0xFF,0xFE,0x26,0x40,0x10,0xB8,0x08,0xFE,0x47,0xB6,0x25,0xB4,0x05,0x40,0x21, +0x78,0x08,0x94,0x02,0x92,0x02,0xFE,0x87,0x14,0x21,0x80,0x27,0xDD,0x9E,0xDD,0x9E, +0xFC,0x40,0x80,0xE0,0x44,0x04,0x34,0x38,0x5A,0x78,0x01,0x2B,0x80,0xC1,0xB4,0x20, +0x44,0x9F,0xE0,0xFF,0x58,0x10,0x80,0x02,0xB6,0x20,0x80,0x27,0x49,0xFF,0xFB,0x17, +0x44,0x04,0x34,0x50,0x97,0xA7,0xB4,0x20,0x40,0x63,0x20,0x08,0x40,0x10,0xA4,0x02, +0xFE,0x77,0xB6,0x20,0x80,0x27,0x49,0xFF,0xFB,0x0A,0x44,0x04,0x38,0x3C,0xB4,0x20, +0x58,0x10,0x80,0x02,0xB6,0x20,0x80,0x27,0x49,0xFF,0xFA,0xD6,0x44,0x04,0x38,0x58, +0xB4,0x20,0x40,0x10,0xA4,0x02,0xFF,0x8F,0xB6,0xC0,0x80,0x27,0xD5,0x0E,0xB4,0x20, +0x84,0xDD,0xFE,0x76,0xB6,0x20,0x84,0x21,0x49,0xFF,0xFA,0xF1,0x44,0x04,0x38,0x3C, +0xB4,0x20,0xFF,0x8E,0xB6,0xC0,0x84,0x21,0x49,0xFF,0xFA,0xBE,0xFC,0xC0,0x92,0x00, +0xC8,0x04,0x44,0x07,0x20,0x0C,0xD5,0x03,0x44,0x07,0x20,0x10,0xB4,0x00,0x40,0x00, +0x30,0x08,0x92,0x0C,0xDD,0x9E,0xFC,0x00,0x80,0xC1,0x49,0xFF,0xFF,0xF3,0x84,0x40, +0x80,0x22,0xE2,0x46,0xE8,0x05,0x38,0x10,0x0A,0x0A,0x8C,0x41,0xD5,0xFB,0xFC,0x80, +0x44,0x27,0x20,0x1C,0x54,0x00,0x0F,0xFF,0xB4,0x22,0x92,0x2C,0x40,0x10,0xB0,0x08, +0xFE,0x47,0xB6,0x22,0xDD,0x9E,0x44,0x27,0x20,0x34,0x54,0x00,0x0F,0xFF,0xB4,0x22, +0x92,0x2C,0x40,0x10,0xB0,0x08,0xFE,0x47,0xB6,0x22,0xDD,0x9E,0x44,0x27,0x20,0x38, +0x54,0x00,0x0F,0xFF,0xB4,0x22,0x92,0x2C,0x40,0x10,0xB0,0x08,0xFE,0x47,0xB6,0x22, +0xDD,0x9E,0x44,0x27,0x20,0x54,0x84,0x30,0xB4,0x62,0x96,0x1F,0xFE,0x5E,0xFE,0x0F, +0xB6,0x02,0xDD,0x9E,0x44,0x27,0x20,0x54,0x96,0x1F,0xB4,0x62,0x40,0x10,0x20,0x08, +0x44,0x0F,0xF0,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x27,0x20,0x58, +0x96,0x1F,0x40,0x10,0x40,0x08,0xB4,0x62,0x46,0x0F,0xFF,0x0F,0x50,0x00,0x0F,0xFF, +0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x04,0x00,0x9C,0xA6,0x00,0xDD,0x9E, +0x46,0x10,0x00,0x81,0x04,0x00,0x80,0x6E,0x58,0x00,0x00,0x01,0x14,0x00,0x80,0x6E, +0xDD,0x9E,0xFC,0x00,0x44,0x04,0x2C,0x1C,0x84,0x41,0xB4,0x20,0x80,0x62,0x58,0x10, +0x81,0x00,0xB6,0x20,0xB4,0x20,0x58,0x10,0x80,0x80,0xB6,0x20,0x44,0x04,0x28,0x1C, +0x44,0x14,0x24,0x1C,0x49,0xFF,0xFA,0x96,0xFC,0x80,0x46,0x20,0x00,0x80,0x84,0x30, +0x50,0x41,0x01,0xD0,0xB4,0x64,0x96,0x1F,0xFE,0x5E,0xFE,0x47,0xB6,0x24,0xB4,0x64, +0x44,0x1F,0xFF,0x0F,0x94,0x04,0xFE,0x5E,0xFE,0x0F,0xB6,0x04,0xDD,0x9E,0x00,0x00, +0x44,0x24,0x80,0x88,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x47,0xB6,0x22, +0xB4,0x62,0x84,0x3D,0x94,0x01,0xFE,0x5E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xFC,0x00, +0x44,0x64,0x00,0x18,0x84,0x41,0xAE,0xB0,0xA6,0x72,0x84,0x1E,0xFE,0x46,0xAE,0x72, +0xA6,0x72,0x44,0x30,0x98,0x81,0x58,0x10,0x80,0x02,0xAE,0x72,0xA6,0x72,0x58,0x10, +0x80,0x04,0xAE,0x72,0xA6,0x73,0x58,0x10,0x80,0x02,0xAE,0x73,0xA6,0x73,0x58,0x10, +0x80,0x04,0xAE,0x73,0xA6,0x73,0x58,0x10,0x80,0x08,0xAE,0x73,0xA6,0x73,0x58,0x10, +0x80,0x10,0xAE,0x73,0x44,0x14,0x00,0x10,0xB6,0x61,0xAE,0xB1,0xA6,0x72,0x58,0x10, +0x80,0x10,0xAE,0x72,0xA6,0x72,0x54,0x10,0x80,0xDF,0xAE,0x72,0xA6,0xB2,0x44,0x1F, +0xFF,0x80,0xFE,0x57,0xAE,0x72,0xA6,0x73,0xFE,0x0E,0xAE,0x33,0xA6,0x33,0x58,0x00, +0x00,0x20,0xAE,0x33,0xA6,0x33,0x58,0x00,0x00,0x40,0xAE,0x33,0x49,0x00,0x03,0x0B, +0xE6,0x03,0x44,0x14,0x50,0x10,0xA6,0x32,0xE9,0x10,0x54,0x00,0x00,0xFB,0xAE,0x32, +0xB4,0x01,0x92,0x08,0x40,0x00,0x20,0x08,0xB6,0x01,0x44,0x14,0x70,0x00,0x44,0x0E, +0xFF,0xFF,0xB4,0x41,0xFE,0x16,0xD5,0x11,0x58,0x00,0x00,0x04,0xAE,0x32,0xB4,0x01, +0x92,0x08,0x40,0x00,0x20,0x08,0x58,0x00,0x00,0x98,0xB6,0x01,0x44,0x14,0x70,0x00, +0x44,0x01,0x00,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0xFC,0x80,0x44,0x37,0x20,0x44, +0x46,0x0F,0xC0,0x0F,0xB4,0x23,0x50,0x00,0x0F,0xFF,0xFE,0x46,0x46,0x20,0x24,0x00, +0xFE,0x57,0xB6,0x23,0x44,0x37,0x20,0x48,0x44,0x23,0x00,0x00,0xB4,0x23,0xFE,0x46, +0xFE,0x57,0x44,0x27,0x20,0x4C,0xB6,0x23,0xB4,0x22,0x46,0x30,0x0C,0x00,0x92,0x2C, +0x40,0x10,0xB0,0x08,0x58,0x10,0x82,0x52,0xB6,0x22,0xB4,0x22,0xFE,0x46,0xFE,0x5F, +0xB6,0x22,0x44,0x27,0x20,0x50,0x46,0x30,0x00,0x90,0xB4,0x22,0x92,0x2C,0x40,0x10, +0xB0,0x08,0x58,0x10,0x82,0x40,0xB6,0x22,0xB4,0x22,0xFE,0x0E,0xB6,0x02,0x44,0x27, +0x20,0x04,0x46,0x0F,0xFF,0x0F,0xB4,0x22,0x50,0x00,0x0F,0xFF,0xFE,0x46,0xFE,0x5F, +0xB6,0x22,0xB4,0x62,0x46,0x1F,0xF0,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x5E,0x46,0x30, +0x03,0x00,0xFE,0x5F,0xB6,0x22,0x46,0x20,0x00,0x80,0x44,0x1F,0xF0,0xFF,0x50,0x41, +0x01,0xC0,0xB4,0x64,0xFE,0x5E,0x58,0x10,0x88,0x00,0xB6,0x24,0xB4,0x24,0xFE,0x0E, +0x44,0x12,0x00,0x00,0xFE,0x0F,0xB6,0x04,0xDD,0x9E,0x46,0x20,0x00,0x91,0x40,0x00, +0x40,0x08,0xA0,0x56,0x96,0x49,0xFE,0x0F,0xA8,0x16,0xDD,0x9E,0xE6,0x05,0xE8,0x31, +0x46,0x10,0x00,0x91,0x44,0xF0,0x18,0x34,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00, +0x4A,0x00,0x3C,0x00,0x06,0x14,0x22,0x30,0x3E,0x00,0xA0,0x0A,0x92,0x10,0x40,0x00, +0x40,0x08,0x58,0x00,0x00,0x0A,0xD5,0x1C,0xA0,0x0A,0x92,0x10,0x40,0x00,0x40,0x08, +0x58,0x00,0x00,0x23,0xD5,0x15,0xA0,0x0A,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00, +0x00,0x46,0xD5,0x0E,0xA0,0x0A,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x00,0x96, +0xD5,0x07,0xA0,0x0A,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x01,0xF4,0xA8,0x0A, +0xDD,0x9E,0x46,0x2F,0xFC,0x0F,0x46,0x10,0x00,0x91,0x50,0x21,0x0F,0xFF,0x5A,0x08, +0x01,0x08,0x04,0x00,0x80,0x0E,0xFE,0x86,0x44,0x02,0x00,0x00,0xD5,0x06,0x04,0x00, +0x80,0x0E,0xFE,0x86,0x44,0x01,0x00,0x00,0xFE,0x87,0x14,0x20,0x80,0x0E,0xA0,0x09, +0x92,0x06,0x94,0x06,0x58,0x00,0x00,0x01,0xA8,0x09,0xDD,0x9E,0xFC,0x00,0x46,0x60, +0x00,0x91,0x84,0x01,0xA8,0x31,0x44,0x00,0x01,0xF4,0xA8,0x32,0x83,0x86,0xB9,0x0A, +0x46,0x0F,0xC0,0x0F,0x50,0x00,0x0C,0x00,0xFE,0x46,0x58,0x10,0x80,0x01,0xB9,0x8A, +0xB9,0x0B,0xFE,0x0E,0x58,0x00,0x02,0x40,0xB8,0x8B,0xB9,0x0C,0x44,0x0F,0xC0,0xC0, +0xFE,0x0E,0x58,0x00,0x20,0x01,0xB8,0x8C,0xB9,0x0D,0x46,0x0E,0x0E,0x0E,0x50,0x00, +0x00,0xE0,0xFE,0x0E,0x46,0x10,0x60,0x11,0x50,0x10,0x82,0x01,0xFE,0x0F,0xB8,0x8D, +0xB9,0x0E,0x46,0x0F,0xFC,0x0C,0x50,0x00,0x00,0xF3,0xFE,0x0E,0x44,0x11,0x01,0x0C, +0xFE,0x0F,0xB8,0x8E,0x49,0xFF,0xFE,0x72,0xE6,0x03,0xA0,0x36,0x92,0x10,0x40,0x00, +0x40,0x08,0xE9,0x1F,0x58,0x00,0x00,0x28,0xA8,0x36,0x83,0x86,0xB8,0x08,0x92,0x10, +0x40,0x00,0x40,0x08,0x58,0x00,0x00,0x28,0xB8,0x88,0xA0,0x35,0x92,0x10,0x40,0x00, +0x40,0x08,0x58,0x00,0x00,0x28,0xA8,0x35,0xA0,0x37,0x92,0x10,0x40,0x00,0x40,0x08, +0x58,0x00,0x00,0x28,0xA8,0x37,0xA0,0x76,0x46,0x00,0x02,0x80,0x96,0x49,0xD5,0x1E, +0x58,0x00,0x46,0x00,0xA8,0x36,0x83,0x86,0xB8,0x08,0x92,0x10,0x40,0x00,0x40,0x08, +0x58,0x00,0x46,0x00,0xB8,0x88,0xA0,0x35,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00, +0x46,0x00,0xA8,0x35,0xA0,0x37,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x46,0x00, +0xA8,0x37,0xA0,0x76,0x46,0x04,0x60,0x00,0x96,0x49,0xFE,0x47,0xA8,0x76,0x83,0x86, +0xB9,0x08,0x96,0x49,0xFE,0x47,0xB9,0x88,0xA0,0x75,0x96,0x49,0xFE,0x47,0xA8,0x75, +0xA0,0x77,0x96,0x49,0xFE,0x0F,0xA8,0x37,0x46,0x00,0x00,0x91,0x83,0x80,0xB9,0x12, +0x58,0x10,0xBF,0x3F,0xB9,0x92,0xBA,0x13,0x44,0x1E,0xE0,0x80,0xFE,0x56,0x44,0x21, +0x00,0x48,0xFE,0x57,0xB9,0x93,0xFC,0x80,0x46,0x00,0x00,0x91,0x50,0x30,0x00,0x44, +0xB4,0x23,0x58,0x10,0x80,0x01,0xB6,0x23,0xB4,0x43,0x84,0x3E,0xFE,0x56,0xB6,0x23, +0xDD,0x9E,0x92,0x00,0x44,0x17,0x30,0x10,0xB4,0x01,0x96,0x06,0xC0,0xFE,0x44,0x17, +0x30,0x10,0xB4,0x01,0x92,0x03,0x96,0x06,0x5A,0x00,0x01,0xFD,0xDD,0x9E,0x84,0xA0, +0xD0,0x05,0x40,0x00,0x00,0x09,0x8C,0xA1,0xD5,0xFC,0xDD,0x9E,0xC9,0x08,0x44,0x24, +0x00,0x0C,0x96,0x06,0xA6,0x50,0x54,0x10,0x80,0xFE,0xD5,0x0A,0x5A,0x18,0x01,0x0B, +0x44,0x24,0x00,0x0C,0x96,0x06,0xA6,0x50,0x94,0x01,0x54,0x10,0x80,0xFD,0xFE,0x0F, +0xAE,0x10,0xDD,0x9E,0xC8,0x04,0x44,0x05,0x00,0x00,0xD5,0x03,0x44,0x05,0x00,0x10, +0xA6,0x02,0xDD,0x9E,0xC9,0x04,0x44,0x15,0x00,0x00,0xD5,0x05,0x5A,0x18,0x01,0x05, +0x44,0x15,0x00,0x10,0xAE,0x0A,0xDD,0x9E,0xC9,0x0A,0x44,0x24,0x80,0x80,0x96,0x06, +0x40,0x10,0x60,0x08,0xB4,0x62,0x46,0x0F,0xEF,0xFF,0xD5,0x0B,0x5A,0x18,0x01,0x0F, +0x44,0x24,0x80,0x80,0x96,0x06,0x40,0x10,0x64,0x08,0xB4,0x62,0x46,0x0F,0xDF,0xFF, +0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0xCA,0x0C,0x44,0x40, +0xFA,0x00,0x42,0x20,0x10,0x24,0x40,0x11,0x04,0x0E,0x44,0x20,0x00,0x64,0x40,0x10, +0x88,0x36,0xD5,0x0E,0x3C,0x2D,0xFB,0xC6,0xFE,0x84,0x44,0x00,0x03,0xE8,0x40,0x21, +0x00,0x57,0x40,0x11,0x04,0x0D,0x44,0x20,0x00,0x64,0x40,0x10,0x88,0x37,0x96,0x49, +0xCB,0x04,0x44,0x05,0x00,0x04,0xD5,0x05,0x5A,0x38,0x01,0x05,0x44,0x05,0x00,0x14, +0xAC,0x40,0xDD,0x9E,0xC8,0x08,0x44,0x14,0x80,0x03,0x84,0x01,0xAE,0x08,0x44,0x15, +0x00,0x08,0xD5,0x09,0x5A,0x08,0x01,0x09,0x44,0x14,0x80,0x03,0x84,0x42,0xAE,0x88, +0x44,0x15,0x00,0x18,0xAE,0x09,0xDD,0x9E,0xC8,0x08,0x44,0x04,0x80,0x03,0x84,0x21, +0xAE,0x40,0x44,0x15,0x00,0x08,0xD5,0x09,0x5A,0x08,0x01,0x0C,0x44,0x04,0x80,0x03, +0x84,0x22,0xAE,0x40,0x44,0x15,0x00,0x18,0xA6,0x08,0x58,0x00,0x00,0x02,0xAE,0x08, +0xDD,0x9E,0xC8,0x08,0x44,0x04,0x80,0x03,0x84,0x21,0xAE,0x40,0x44,0x15,0x00,0x08, +0xD5,0x09,0x5A,0x08,0x01,0x0C,0x44,0x04,0x80,0x03,0x84,0x22,0xAE,0x40,0x44,0x15, +0x00,0x18,0xA6,0x08,0x54,0x00,0x00,0xFD,0xAE,0x08,0xDD,0x9E,0xC9,0x04,0x44,0x15, +0x00,0x00,0xD5,0x05,0x5A,0x18,0x01,0x05,0x44,0x15,0x00,0x10,0xAE,0x08,0xDD,0x9E, +0x84,0x21,0xC0,0x04,0x5A,0x08,0x01,0x06,0x84,0x22,0x44,0x04,0x80,0x03,0xAE,0x40, +0xDD,0x9E,0x44,0x04,0x80,0x00,0xA6,0x03,0x92,0x01,0x96,0x06,0xC0,0x1A,0xFC,0x00, +0x44,0x04,0x80,0x03,0x84,0x22,0xAE,0x40,0x49,0x00,0x10,0x4E,0xC8,0x11,0x3C,0x0D, +0xFB,0x8C,0xC0,0x0E,0x49,0x00,0x0E,0x89,0x80,0xC0,0xC8,0x0A,0x49,0x00,0x01,0x7C, +0x49,0x00,0x11,0x84,0xC0,0x05,0x80,0x06,0x80,0x26,0x49,0x00,0x00,0xE1,0xFC,0x80, +0xDD,0x9E,0x46,0x20,0x00,0x81,0x84,0x3E,0xA0,0xD5,0x96,0x06,0xFE,0x5E,0xFE,0x0F, +0xA8,0x15,0xDD,0x9E,0x46,0x00,0x00,0x81,0xA0,0x05,0x96,0x06,0xDD,0x9E,0x44,0x24, +0x50,0x14,0x84,0x3E,0xB4,0x62,0x96,0x06,0xFE,0x5E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E, +0x44,0x25,0x10,0x04,0xB4,0x22,0x92,0x30,0x40,0x10,0xC0,0x08,0xFE,0x0F,0xB6,0x02, +0xDD,0x9E,0x44,0x15,0x10,0x0C,0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01,0xDD,0x9E, +0x44,0x15,0x10,0x0C,0xB4,0x01,0x92,0x08,0x40,0x00,0x20,0x08,0x58,0x00,0x00,0x01, +0xB6,0x01,0x44,0x15,0x10,0x18,0xB4,0x01,0x96,0x00,0x5A,0x00,0x5A,0xFE,0xDD,0x9E, +0xFC,0x40,0x44,0x00,0x01,0x2C,0x49,0x00,0x00,0x72,0x44,0x75,0x10,0x0C,0x44,0x9F, +0xFF,0x98,0x84,0x00,0xAE,0x38,0xFA,0x18,0x10,0x93,0x80,0x00,0x49,0x00,0x00,0x67, +0x44,0x05,0x10,0x18,0x44,0x65,0x10,0x0C,0xB4,0x00,0x96,0x00,0x5A,0x00,0xA5,0xF3, +0xB4,0x06,0x92,0x08,0x40,0x00,0x20,0x08,0xB6,0x06,0xFC,0xC0,0xC0,0x04,0x5A,0x00, +0x01,0x1F,0xDD,0x9E,0x44,0x14,0x80,0x82,0x44,0x22,0x00,0x00,0xAE,0x08,0x44,0x14, +0x80,0x00,0x44,0x04,0x80,0x80,0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x44,0x24, +0x00,0x00,0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x46,0x20,0x01,0x00,0xB6,0x41, +0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x46,0x20,0x00,0x80,0xD5,0x23,0x44,0x04,0x80,0x82, +0x84,0x20,0xAE,0x40,0x44,0x14,0x80,0x00,0x44,0x04,0x80,0x80,0x44,0x21,0x00,0x00, +0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x44,0x22,0x00,0x00,0xB6,0x41,0xB4,0x60, +0xFE,0x9F,0xB6,0x40,0x44,0x24,0x00,0x00,0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40, +0x46,0x20,0x00,0x80,0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x46,0x20,0x01,0x00, +0xB6,0x41,0xB4,0x60,0xFE,0x9F,0xB6,0x40,0x46,0x20,0x02,0x00,0xB6,0x41,0xB4,0x60, +0xFE,0x9F,0xB6,0x40,0x46,0x20,0x04,0x00,0xB6,0x41,0xB4,0x20,0xFE,0x8F,0xB6,0x40, +0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xFC,0x72,0xFC,0x80,0x84,0x2E,0xFE,0x0C,0x8E,0x01, +0x5A,0x07,0xFF,0x05,0x40,0x00,0x00,0x09,0xD5,0xFB,0xDD,0x9E,0x44,0x10,0x36,0xB0, +0xFE,0x0C,0x8E,0x01,0x5A,0x07,0xFF,0x05,0x40,0x00,0x00,0x09,0xD5,0xFB,0xDD,0x9E, +0xFC,0x00,0x49,0x00,0x19,0x51,0xC8,0x05,0x84,0x01,0x3E,0x07,0xEE,0x2C,0xFC,0x80, +0x84,0x02,0x3E,0x07,0xEE,0x2C,0x49,0x00,0x0C,0x82,0xFC,0x80,0xFC,0x01,0x84,0x00, +0x49,0x00,0x0F,0x70,0x44,0x12,0x04,0xE4,0x84,0x00,0x49,0x00,0x0F,0xBF,0xF0,0x81, +0x84,0x27,0x84,0x00,0x49,0x00,0x10,0x9E,0xF0,0x01,0xFC,0x81,0xFC,0x20,0x3C,0x2D, +0xFD,0xC2,0x5A,0x20,0x01,0x3E,0x80,0xE1,0x80,0xC0,0x49,0x00,0x0F,0x55,0xC8,0x2E, +0x5A,0x68,0x01,0x05,0x49,0x00,0x0F,0x56,0xD5,0x14,0x49,0xFF,0xFF,0xE1,0x80,0xC0, +0xC8,0x10,0x84,0x01,0x49,0xFF,0xFE,0xC7,0x80,0x06,0x84,0x21,0x49,0xFF,0xFE,0x5E, +0x3E,0x67,0xEF,0xB7,0x3E,0x67,0xEF,0xB4,0x3C,0x6F,0xFB,0xCE,0x5A,0x70,0x01,0x21, +0x84,0x01,0x84,0x2F,0x49,0x00,0x2C,0x92,0x84,0x01,0x80,0x20,0x49,0x00,0x2C,0x9C, +0x84,0x01,0x49,0xFF,0xFE,0x89,0x84,0x00,0x49,0x00,0x0F,0x0D,0x49,0x00,0x0F,0x14, +0x84,0x00,0x49,0x00,0x10,0x6F,0x84,0x01,0xD5,0x0C,0x84,0x01,0x49,0xFF,0xFE,0xA3, +0x84,0x00,0x84,0x21,0x49,0xFF,0xFE,0x3A,0x84,0x00,0x3E,0x07,0xEF,0xB7,0x84,0x00, +0xFC,0xA0,0xFC,0x00,0xC0,0x0B,0x5A,0x08,0x01,0x05,0x49,0x00,0x17,0xCA,0xD5,0x06, +0x84,0xC0,0x5A,0x08,0x02,0x05,0x49,0x00,0x17,0xC7,0x80,0xC0,0x84,0x02,0x49,0x00, +0x0F,0x11,0x84,0x02,0x44,0x12,0x04,0xE4,0x49,0x00,0x0F,0x60,0xC6,0x04,0x80,0x06, +0x49,0x00,0x10,0x1B,0x49,0x00,0x17,0xBB,0x49,0x00,0x10,0x29,0x84,0x02,0x84,0x27, +0x49,0x00,0x10,0x38,0xFC,0x80,0x3C,0x0D,0xFD,0xC2,0x5A,0x00,0x01,0x16,0xFC,0x00, +0x49,0x00,0x0E,0xF2,0x80,0xC0,0xC8,0x04,0x49,0xFF,0xFF,0x82,0xD5,0x07,0x5A,0x00, +0x01,0x0B,0x49,0x00,0x0E,0xEC,0x49,0xFF,0xFF,0xCE,0x80,0x06,0x49,0x00,0x0E,0xC3, +0x49,0x00,0x0E,0xCA,0xFC,0x80,0xDD,0x9E,0xFC,0x00,0x49,0x00,0x0D,0x1E,0x5A,0x08, +0x01,0x06,0x84,0x00,0x44,0x10,0x07,0xD0,0xD5,0x04,0x84,0x00,0x44,0x10,0x75,0x30, +0x49,0x00,0x2C,0x2C,0x84,0x00,0x84,0x21,0x49,0x00,0x2C,0x36,0x84,0x00,0x49,0x00, +0x0D,0x15,0xFC,0x80,0x3E,0x07,0xEF,0xB6,0xDD,0x9E,0xFC,0x00,0x64,0x12,0x00,0x43, +0x64,0x00,0x00,0x08,0x64,0x00,0x00,0x08,0x49,0x00,0x29,0x76,0x49,0x00,0x29,0xA9, +0x49,0x00,0x2B,0x9F,0x84,0x00,0x44,0x10,0x00,0xEB,0x49,0x00,0x2B,0xF4,0x49,0x00, +0x2A,0xE5,0x49,0x00,0x2A,0xFA,0x49,0x00,0x2B,0x2D,0x49,0x00,0x0A,0xD0,0x49,0x00, +0x17,0xE4,0x84,0x00,0x3E,0x07,0xEE,0x2D,0xFC,0x80,0x2E,0x07,0xEF,0xB8,0xDD,0x9E, +0xFC,0x00,0x49,0x00,0x0B,0x07,0x49,0x00,0x08,0x97,0x49,0x00,0x19,0x0D,0x49,0x00, +0x18,0x73,0x49,0x00,0x0B,0x9E,0x49,0x00,0x17,0x68,0x49,0x00,0x18,0x6D,0x49,0x00, +0x0B,0xDD,0x49,0x00,0x0C,0xD2,0xC8,0x04,0x49,0x00,0x19,0xBD,0xD5,0x05,0x2E,0x07, +0xF0,0x00,0x96,0x06,0xC8,0xFA,0x49,0xFF,0xFF,0x0D,0x49,0x00,0x1A,0x28,0x49,0xFF, +0xFF,0xA5,0x49,0x00,0x01,0x19,0x49,0x00,0x0C,0xC0,0x80,0x40,0x5A,0x08,0x01,0x08, +0x44,0x00,0x07,0xD0,0x84,0x20,0x80,0x62,0x49,0x00,0x2B,0x45,0x84,0x04,0x3E,0x07, +0xEF,0xBB,0x84,0x00,0x49,0x00,0x19,0x30,0x84,0x00,0x49,0x00,0x01,0x06,0x49,0x00, +0x17,0x32,0x49,0x00,0x0C,0xAA,0xC8,0x04,0x84,0x01,0x49,0x00,0x2A,0xD9,0xFC,0x80, +0xFC,0x20,0x49,0x00,0x0E,0x61,0x80,0xE0,0x49,0x00,0x0F,0xA0,0x5A,0x08,0x01,0x05, +0x84,0x20,0x49,0x00,0x2B,0xC1,0x84,0x01,0x49,0x00,0x2B,0xD9,0x5A,0x08,0x01,0x07, +0x84,0x20,0x49,0x00,0x2B,0xB9,0x49,0x00,0x0E,0x37,0x5A,0x78,0x02,0x5C,0x2E,0x07, +0xEF,0xB6,0x5A,0x00,0x01,0x04,0x48,0x00,0x00,0x8F,0x49,0x00,0x0F,0x87,0x5A,0x00, +0x01,0x04,0x48,0x00,0x00,0x89,0x2E,0x07,0xEF,0xB4,0x5A,0x08,0x01,0x05,0x84,0x00, +0x3E,0x07,0xEF,0xB4,0x44,0x64,0x80,0x80,0x44,0x0B,0xFF,0xFF,0xB4,0x26,0xFE,0x0E, +0xB6,0x06,0xB4,0x26,0x46,0x0F,0xFE,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x0E,0xB6,0x06, +0xB4,0x26,0x46,0x0F,0xFD,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x0E,0xB6,0x06,0x84,0x00, +0x49,0xFF,0xFF,0x2B,0x84,0x00,0x3E,0x07,0xEF,0xB6,0x84,0x00,0x49,0x00,0x0F,0x62, +0xB4,0x26,0x44,0x04,0x00,0x00,0xFE,0x0F,0xB6,0x06,0xB4,0x26,0x46,0x00,0x01,0x00, +0xFE,0x0F,0xB6,0x06,0xB4,0x26,0x46,0x00,0x02,0x00,0xFE,0x0F,0xB6,0x06,0x44,0x10, +0x01,0x90,0x84,0x01,0x49,0x00,0x2B,0x62,0x84,0x01,0x80,0x20,0x49,0x00,0x2B,0x6C, +0x49,0x00,0x0F,0x44,0x80,0xC0,0xC8,0x47,0x84,0x01,0x49,0x00,0x2B,0x80,0x80,0xE0, +0x5A,0x08,0x01,0xF8,0x80,0x26,0x49,0x00,0x2B,0x5F,0x80,0x07,0x49,0x00,0x0F,0x3A, +0xD5,0x3A,0xCF,0x39,0x2E,0x07,0xEF,0xB7,0x44,0x15,0x10,0x20,0xB6,0x01,0xC8,0x26, +0x2E,0x67,0xEF,0xB6,0x5A,0x68,0x01,0x23,0x80,0x26,0x80,0x07,0x49,0xFF,0xFD,0x78, +0x80,0x06,0x49,0xFF,0xFD,0x39,0x80,0x06,0x49,0xFF,0xFD,0x48,0x80,0x06,0x80,0x26, +0x49,0xFF,0xFC,0xF4,0x80,0x07,0x80,0x26,0x49,0xFF,0xFE,0x7A,0x5A,0x08,0x01,0x08, +0x3E,0x07,0xEF,0xB7,0x80,0x07,0x49,0x00,0x0F,0x15,0xD5,0x08,0x80,0x06,0x49,0xFF, +0xFD,0x4A,0x80,0x07,0x80,0x26,0x49,0xFF,0xFC,0xE1,0x2E,0x67,0xEF,0xB7,0xCE,0x0B, +0x2E,0x07,0xEF,0xB4,0x5A,0x08,0x01,0x08,0x49,0x00,0x0F,0x00,0x5A,0x08,0x01,0x04, +0x3E,0x67,0xEF,0xB4,0x2E,0x07,0xEF,0xBB,0xC0,0x04,0x5A,0x00,0x04,0x06,0xFC,0xA0, +0x49,0xFF,0xFF,0x10,0xFC,0xA0,0x49,0x00,0x13,0xBA,0xFC,0xA0,0xFC,0x20,0x84,0xC0, +0x84,0xE2,0x49,0x00,0x2A,0xE4,0x2E,0x07,0xEF,0xB8,0x5A,0x00,0x01,0x0A,0xC0,0x04, +0x5A,0x00,0x02,0x2B,0xD5,0xF7,0x49,0x00,0x0B,0xEC,0x84,0x01,0xD5,0x1A,0x3E,0x07, +0xEF,0xBA,0x3E,0x67,0xEF,0xBB,0x3E,0x67,0xEF,0xB9,0x3E,0x67,0xEF,0xB5,0x49,0x00, +0x0B,0xD4,0x5A,0x08,0x01,0x17,0x49,0x00,0x0B,0xD6,0x5A,0x08,0x02,0x04,0x84,0x03, +0xD5,0x02,0x84,0x04,0x3E,0x07,0xEF,0xB8,0x2E,0x07,0xF0,0xCC,0xC0,0x05,0x84,0x04, +0x3E,0x07,0xEF,0xB8,0xD5,0xD7,0x2E,0x07,0xF0,0xCB,0xC0,0xD4,0x84,0x03,0xD5,0xF9, +0x3E,0x77,0xEF,0xB8,0xD5,0xCF,0x49,0x00,0x0B,0x9F,0x49,0x00,0x0B,0xA6,0x2E,0x07, +0xEF,0xB5,0x3E,0x67,0xEF,0xBC,0xC8,0xC6,0x49,0xFF,0xFF,0x0C,0xD5,0xC3,0x3E,0x07, +0xEF,0xBA,0xDD,0x9E,0xDD,0x9E,0x46,0x10,0x00,0x81,0xC8,0x06,0x04,0x00,0x80,0x33, +0x58,0x00,0x02,0x00,0xD5,0x06,0x04,0x20,0x80,0x33,0x44,0x0F,0xFD,0xFF,0xFE,0x16, +0x14,0x00,0x80,0x33,0xDD,0x9E,0x44,0x24,0x2C,0x14,0x84,0x30,0xB4,0x62,0x96,0x1F, +0xFE,0x5E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x24,0x2C,0x14,0x96,0x1F,0xB4,0x62, +0x40,0x10,0x20,0x08,0x44,0x0F,0xF0,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E, +0xFC,0x20,0x80,0xC0,0x49,0x00,0x03,0x69,0x49,0x00,0x03,0x4D,0x44,0x14,0x24,0x04, +0x44,0x5F,0xFF,0xEF,0xB4,0x01,0x84,0x41,0xFE,0x2E,0xB6,0x01,0xB4,0x01,0x40,0x33, +0x08,0x02,0x44,0x4F,0xFF,0xDF,0x94,0xDD,0xFE,0x26,0xFE,0x1F,0xB6,0x01,0x44,0x04, +0x28,0x04,0xB4,0xC0,0xFF,0xAE,0xB6,0xC0,0xB4,0xC0,0xFF,0xA6,0xFF,0x9F,0xB6,0xC0, +0x44,0x64,0x2C,0x04,0xB4,0xE6,0xFF,0x7E,0xB6,0xA6,0xB4,0xA6,0xFF,0x2E,0xFE,0xE7, +0xB6,0x66,0x80,0x62,0x49,0xFF,0xF4,0xAE,0x49,0x00,0x03,0x32,0x49,0x00,0x03,0x4A, +0xFC,0xA0,0xFC,0x00,0x44,0x24,0x80,0x10,0x84,0x01,0xB4,0x22,0x96,0x46,0xC1,0x0B, +0xAE,0x10,0x3E,0x07,0xEF,0xCC,0x3E,0x07,0xEF,0xC9,0x3C,0x0D,0xFB,0xF0,0x8C,0x01, +0x3C,0x0F,0xFB,0xF0,0x44,0x04,0x80,0x10,0xB4,0x00,0x92,0x0A,0x96,0x06,0xC0,0x0E, +0x44,0x04,0x80,0x11,0x84,0x24,0xAE,0x40,0x49,0x00,0x01,0x05,0x44,0x07,0x20,0x00, +0xB4,0x00,0x92,0x08,0x96,0x06,0x49,0x00,0x00,0xE9,0x44,0x04,0x80,0x10,0x84,0x21, +0xB4,0x00,0x92,0x08,0x96,0x06,0xC0,0x08,0x44,0x04,0x80,0x11,0xAE,0x40,0x3E,0x17, +0xEF,0xCA,0x3E,0x17,0xEF,0xC9,0x44,0x04,0x80,0x10,0xB4,0x20,0x92,0x27,0x96,0x46, +0xC1,0x04,0x44,0x1F,0xFF,0x80,0xAE,0x40,0xB4,0x00,0x92,0x05,0x96,0x06,0xC0,0x05, +0x44,0x04,0x80,0x10,0xFA,0x30,0xAE,0x40,0x44,0x04,0x80,0x10,0xB4,0x20,0x92,0x26, +0x96,0x46,0xC1,0x04,0x44,0x10,0x00,0x40,0xAE,0x40,0xB4,0x00,0x92,0x18,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x13,0x84,0x21,0xAE,0x40,0x44,0x04,0x80,0x10,0xB4,0x00, +0x92,0x15,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x12,0xFA,0x30,0xAE,0x40,0xFC,0x80, +0xFC,0x00,0x44,0x24,0x80,0x10,0x84,0x21,0xB4,0x02,0x92,0x04,0x96,0x06,0xC0,0x14, +0xFA,0x00,0xAE,0x10,0x3E,0x17,0xEF,0xCB,0x3E,0x17,0xEF,0xC9,0x3C,0x0D,0xFB,0xF1, +0x8C,0x01,0x3C,0x0F,0xFB,0xF1,0x46,0x00,0x00,0x81,0x04,0x00,0x00,0xF0,0x92,0x03, +0x96,0x06,0x49,0x00,0x00,0x93,0x44,0x14,0x80,0x10,0xB4,0x01,0x92,0x0B,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x11,0x84,0x48,0xAE,0x80,0xB4,0x01,0x92,0x03,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x10,0x84,0x28,0xAE,0x40,0x44,0x04,0x80,0x10,0xB4,0x20, +0x92,0x22,0x96,0x46,0xC1,0x03,0x84,0x24,0xAE,0x40,0xB4,0x00,0x92,0x01,0x96,0x06, +0xC0,0x0E,0x44,0x04,0x80,0x90,0xB4,0x00,0x92,0x01,0x96,0x06,0x5A,0x08,0x01,0x08, +0x44,0x14,0x80,0x10,0x84,0x42,0xAE,0x88,0x3E,0x07,0xEF,0xBC,0x44,0x14,0x80,0x10, +0xB4,0x01,0x92,0x19,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x13,0x84,0x42,0xAE,0x80, +0xB4,0x01,0x92,0x16,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x12,0x44,0x10,0x00,0x40, +0xAE,0x40,0xFC,0x80,0xFC,0x00,0x80,0xC0,0x49,0xFF,0xF3,0xFE,0x46,0x20,0x00,0x81, +0x97,0x86,0x94,0x32,0x04,0x61,0x03,0x93,0x84,0x3B,0xFF,0x8E,0xFF,0x87,0x14,0x61, +0x03,0x93,0x49,0xFF,0xF3,0xEA,0xFC,0x80,0x44,0x04,0x50,0x28,0xB4,0x00,0x92,0x01, +0x96,0x06,0xDD,0x9E,0x44,0x24,0x50,0x1C,0x40,0x00,0x40,0x08,0xB4,0x22,0x96,0x49, +0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x24,0x50,0x1C,0x44,0x1F,0x00,0xFF,0xB4,0x62, +0x40,0x00,0x20,0x08,0xFE,0x5E,0xFE,0x0F,0xB6,0x02,0xDD,0x9E,0x44,0x07,0x21,0x00, +0x46,0x10,0x20,0x00,0xB4,0x40,0xFE,0x57,0xB6,0x20,0x80,0x20,0xB4,0x01,0x92,0x19, +0x96,0x06,0xC8,0xFD,0xDD,0x9E,0x44,0x04,0x80,0x04,0xA6,0x02,0x92,0x01,0x96,0x06, +0xC0,0x08,0x44,0x04,0x80,0x06,0x84,0x22,0xAE,0x40,0x84,0x01,0x3E,0x07,0xEF,0xCE, +0x44,0x04,0x80,0x04,0x84,0x21,0xA6,0x02,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x06, +0xAE,0x40,0x3E,0x17,0xEF,0xCD,0xDD,0x9E,0x3E,0x07,0xEE,0x34,0xDD,0x9E,0x2E,0x07, +0xEE,0x34,0xDD,0x9E,0x44,0x37,0x20,0x00,0x54,0x10,0x00,0x01,0xB4,0x83,0x40,0x20, +0xA0,0x08,0x44,0x1F,0xFE,0xFF,0xFE,0x66,0xFE,0x57,0xB6,0x23,0x3E,0x07,0xEE,0x34, +0xDD,0x9E,0x84,0x01,0x3E,0x07,0xEE,0x35,0xDD,0x9E,0x84,0x00,0x3E,0x07,0xEE,0x35, +0xDD,0x9E,0xC8,0x07,0x44,0x17,0x10,0x18,0xA6,0x08,0x54,0x00,0x00,0xFE,0xD5,0x08, +0x5A,0x08,0x01,0x0F,0x44,0x17,0x10,0x18,0xA6,0x08,0x58,0x00,0x00,0x01,0xAE,0x08, +0x44,0x17,0x10,0x0C,0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01,0xDD,0x9E,0x5A,0x08, +0x02,0x0D,0x44,0x17,0x10,0x18,0xA6,0x08,0x58,0x00,0x00,0x01,0xAE,0x08,0x44,0x07, +0x10,0x0C,0xB4,0x20,0x84,0x20,0xB6,0x20,0xDD,0x9E,0x3C,0x0D,0xFB,0xF8,0xC0,0x0B, +0xA4,0x80,0x3C,0x13,0xF7,0xEC,0x8E,0x21,0xE0,0x41,0xE8,0x05,0xA4,0x40,0x8C,0x21, +0x96,0x49,0xAC,0x40,0xA4,0x80,0x3C,0x13,0xF7,0xEE,0xE2,0x41,0xE9,0x0C,0x84,0x20, +0xAC,0x40,0x44,0x06,0x00,0x34,0x44,0x10,0x00,0x5A,0xB6,0x20,0x84,0x01,0x3E,0x07, +0xEE,0x36,0xD5,0x0B,0x3C,0x1D,0xFB,0xFA,0xC1,0x08,0xA4,0x00,0x88,0x01,0x44,0x16, +0x00,0x34,0xA6,0x00,0x96,0x00,0xB6,0x01,0x44,0x06,0x00,0x00,0xB4,0x00,0x92,0x08, +0x96,0x06,0x5A,0x08,0x01,0x0B,0x44,0x06,0x00,0x30,0xB4,0x20,0x58,0x10,0x80,0x01, +0xB6,0x20,0xB4,0x20,0x96,0x46,0xC9,0xFE,0xDD,0x9E,0xFC,0x40,0x3C,0x0D,0xFB,0xF8, +0x84,0x20,0xAC,0x40,0x3C,0x1D,0xFB,0xFA,0xC1,0x08,0xA4,0x00,0x88,0x01,0x44,0x16, +0x00,0x34,0xA6,0x00,0x96,0x00,0xB6,0x01,0x84,0xE0,0x44,0x94,0x80,0x00,0x44,0xA4, +0x80,0x80,0x00,0x64,0x80,0x02,0xB4,0x0A,0x92,0xC3,0x92,0x13,0x96,0x06,0xFF,0x86, +0xC6,0x16,0x44,0x04,0x80,0x02,0x84,0x28,0xAE,0x40,0x44,0x06,0x00,0x00,0xB4,0x00, +0x92,0x08,0x96,0x06,0x5A,0x08,0x01,0x32,0x44,0x06,0x00,0x30,0xB4,0x20,0x58,0x10, +0x80,0x01,0xB6,0x20,0xB4,0x20,0x96,0x46,0xC9,0xFE,0xFC,0xC0,0x00,0x04,0x80,0x02, +0x40,0x10,0x10,0x09,0xB4,0x0A,0x92,0x14,0x96,0x06,0xFE,0x0E,0xC0,0x08,0x44,0x04, +0x80,0x02,0xFA,0x20,0xAE,0x40,0x49,0xFF,0xFF,0x8A,0x80,0xE6,0x00,0x04,0x80,0x02, +0x40,0x10,0x18,0x09,0xB4,0x0A,0x92,0x16,0x96,0x06,0xFE,0x0E,0xC0,0x07,0x44,0x04, +0x80,0x02,0x44,0x10,0x00,0x40,0xAE,0x40,0xFC,0xC0,0x84,0x01,0x8C,0xE1,0x49,0xFF, +0xFB,0xAE,0x5C,0xF3,0xA7,0x11,0xE9,0xBE,0xFC,0xC0,0x44,0x16,0x00,0x34,0xB6,0x01, +0xDD,0x9E,0x3C,0x0F,0xFB,0xFB,0x02,0x0F,0x80,0x00,0x3C,0x4B,0xF7,0xEE,0x3C,0x1F, +0xFB,0xFA,0x3C,0x5B,0xF7,0xED,0x3C,0x2F,0xFB,0xF9,0x3C,0x3F,0xFB,0xF8,0x3C,0x0B, +0xF7,0xEC,0xDD,0x9E,0x3C,0x0B,0xF7,0xEE,0xDD,0x9E,0x3E,0x07,0xEE,0x36,0xDD,0x9E, +0x2E,0x07,0xEE,0x36,0xDD,0x9E,0x3C,0x0F,0xFB,0xF5,0xDD,0x9E,0x3C,0x0F,0xFB,0xF4, +0xDD,0x9E,0xFC,0x20,0x44,0x14,0x80,0x00,0x44,0x04,0x80,0x80,0xA6,0x8A,0xB4,0x00, +0x92,0x10,0x96,0x06,0xFE,0x16,0xC0,0x05,0x44,0x04,0x80,0x02,0x84,0x41,0xAE,0x80, +0xA6,0x0A,0x40,0x10,0x04,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x11,0x96,0x06, +0xFE,0x0E,0xC0,0x05,0x44,0x04,0x80,0x02,0x84,0x22,0xAE,0x40,0x44,0x04,0x80,0x00, +0xA6,0x02,0x40,0x10,0x08,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x12,0x96,0x06, +0xFE,0x0E,0x4E,0x02,0x00,0xA4,0x44,0x04,0x80,0x02,0x84,0x24,0xAE,0x40,0x3C,0x0D, +0xFB,0xF9,0x3C,0x2D,0xFB,0xFB,0x84,0x20,0xAC,0x40,0xC2,0x06,0x44,0x16,0x00,0x28, +0xB4,0x21,0x96,0x48,0xAE,0x50,0xC0,0x0B,0xA4,0x80,0x3C,0x13,0xF7,0xED,0x8E,0x21, +0xE0,0x41,0xE8,0x05,0xA4,0x40,0x8C,0x21,0x96,0x49,0xAC,0x40,0x44,0x06,0x00,0x00, +0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x00,0x01,0x06,0x84,0xC0,0x44,0x76,0x00,0x30, +0xD5,0x12,0x44,0x06,0x00,0x30,0xB4,0x20,0x58,0x10,0x80,0x01,0xB6,0x20,0xB4,0x20, +0x96,0x46,0xC9,0xFE,0xD5,0xF3,0x84,0x01,0x8C,0xC1,0x49,0xFF,0xFB,0x28,0x5C,0xF3, +0x08,0x01,0xE8,0x66,0x44,0x34,0x80,0x00,0x44,0x24,0x80,0x80,0xA6,0x1A,0x40,0x10, +0x0C,0x09,0xB4,0x02,0x92,0x13,0x96,0x06,0xFE,0x0E,0xC0,0x16,0x44,0x04,0x80,0x02, +0x84,0x28,0xAE,0x40,0x44,0x06,0x00,0x00,0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x08, +0x01,0x50,0x44,0x06,0x00,0x30,0xB4,0x20,0x58,0x10,0x80,0x01,0xB6,0x20,0xB4,0x20, +0x96,0x46,0xC9,0xFE,0xD5,0x45,0xA6,0x1A,0x40,0x10,0x10,0x09,0xB4,0x02,0x92,0x14, +0x96,0x06,0xFE,0x0E,0xC0,0x2D,0x44,0x04,0x80,0x02,0xFA,0x20,0xAE,0x40,0x3C,0x2D, +0xFB,0xFB,0x3C,0x0D,0xFB,0xF9,0xC2,0x08,0xA4,0x40,0x88,0x22,0x44,0x26,0x00,0x38, +0xB4,0x42,0x96,0x90,0xAE,0x88,0xC0,0x0B,0xA4,0x80,0x3C,0x13,0xF7,0xED,0x8E,0x21, +0xE0,0x41,0xE8,0x05,0xA4,0x40,0x8C,0x21,0x96,0x49,0xAC,0x40,0x44,0x06,0x00,0x00, +0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x00,0x01,0x04,0x84,0xC0,0xD5,0x09,0xB4,0x07, +0x58,0x00,0x00,0x01,0xB6,0x07,0xB4,0x07,0x96,0x06,0xC8,0xFE,0xD5,0xF7,0x44,0x04, +0x80,0x00,0xA6,0x02,0x40,0x10,0x14,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x15, +0x96,0x06,0xFE,0x0E,0xC0,0x99,0x44,0x04,0x80,0x02,0xFA,0x30,0xAE,0x40,0x3C,0x0D, +0xFB,0xF5,0xC0,0x04,0x3C,0x0D,0xFB,0xF5,0xDD,0x20,0x44,0x04,0x80,0x00,0xA6,0x02, +0x40,0x10,0x0C,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x13,0x96,0x06,0xFE,0x0E, +0xC8,0x14,0x44,0x04,0x80,0x00,0xA6,0x02,0x40,0x10,0x10,0x09,0x44,0x04,0x80,0x80, +0xB4,0x00,0x92,0x14,0x96,0x06,0xFE,0x0E,0xC0,0x1D,0x44,0x04,0x80,0x02,0xFA,0x20, +0xAE,0x40,0x49,0xFF,0xFE,0x64,0xD5,0x16,0x44,0x04,0x80,0x02,0x84,0x28,0xAE,0x40, +0x44,0x06,0x00,0x00,0xB4,0x00,0x92,0x08,0x96,0x06,0x5A,0x08,0x01,0xE4,0x44,0x06, +0x00,0x30,0xB4,0x20,0x58,0x10,0x80,0x01,0xB6,0x20,0xB4,0x20,0x96,0x46,0xC9,0xFE, +0xD5,0xD9,0x44,0x14,0x80,0x00,0xA6,0x0A,0x40,0x20,0x14,0x09,0x44,0x04,0x80,0x80, +0xB4,0x00,0x92,0x15,0x96,0x06,0xFE,0x16,0xC0,0x05,0x44,0x04,0x80,0x02,0xFA,0x50, +0xAE,0x80,0xA6,0x0A,0x40,0x10,0x18,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x16, +0x96,0x06,0xFE,0x0E,0xC0,0x06,0x44,0x04,0x80,0x02,0x44,0x10,0x00,0x40,0xAE,0x40, +0xFC,0xA0,0x44,0x16,0x38,0x20,0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01,0x44,0x16, +0x34,0x20,0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01,0xDD,0x9E,0x44,0x26,0x38,0x20, +0x44,0x0F,0xFE,0xFF,0xB4,0x22,0xFE,0x46,0xB6,0x22,0x44,0x16,0x34,0x20,0xB4,0x41, +0xFE,0x16,0xB6,0x01,0xDD,0x9E,0x44,0x16,0x38,0x20,0xB4,0x01,0x58,0x00,0x00,0x01, +0xB6,0x01,0x44,0x16,0x34,0x20,0xB4,0x01,0x58,0x00,0x00,0x01,0xB6,0x01,0xDD,0x9E, +0x44,0x26,0x38,0x20,0x84,0x1E,0xB4,0x22,0xFE,0x46,0xB6,0x22,0x44,0x16,0x34,0x20, +0xB4,0x41,0xFE,0x16,0xB6,0x01,0xDD,0x9E,0x46,0x20,0x00,0x83,0x96,0x06,0x04,0x31, +0x00,0x14,0x94,0x41,0x84,0x1D,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x14,0xDD,0x9E, +0x46,0x20,0x00,0x83,0x96,0x06,0x04,0x31,0x00,0x14,0x94,0x43,0x84,0x17,0xFE,0x1E, +0xFE,0x0F,0x14,0x01,0x00,0x14,0xDD,0x9E,0x40,0x21,0x40,0x08,0x40,0x10,0xA0,0x08, +0x88,0x22,0x88,0x20,0x46,0x00,0x00,0x80,0x14,0x10,0x00,0x78,0xDD,0x9E,0xFC,0x41, +0xF5,0x81,0x81,0x00,0x81,0x22,0x80,0xE3,0x80,0xC4,0x46,0x50,0x00,0x80,0xC0,0x03, +0x5A,0x08,0x01,0x18,0x83,0x85,0xBA,0x77,0x46,0x1F,0xEF,0xFF,0x50,0x10,0x8F,0xFF, +0xFE,0x56,0xB9,0xF7,0x84,0x23,0x49,0xFF,0xED,0x32,0x38,0x14,0x99,0x01,0x84,0x02, +0x49,0xFF,0xF3,0x8E,0x38,0x03,0x98,0x00,0x84,0x22,0x49,0xFF,0xF4,0x8C,0xFC,0xC1, +0x81,0x41,0x83,0x85,0xB9,0x77,0x46,0x00,0x10,0x00,0xFE,0x0F,0xB8,0xF7,0x84,0x23, +0x84,0x01,0x49,0xFF,0xED,0x1C,0x50,0x25,0x7F,0xFF,0x80,0x06,0xF1,0x01,0x96,0x90, +0x49,0xFF,0xFF,0xC4,0xFC,0xC1,0x46,0x20,0x00,0x80,0x96,0x06,0x04,0x31,0x00,0x75, +0x40,0x10,0x28,0x08,0x44,0x0F,0xFB,0xFF,0xFE,0x1E,0xFE,0x0F,0x14,0x01,0x00,0x75, +0xDD,0x9E,0x44,0x14,0x00,0x48,0x84,0x1F,0xB6,0x01,0x44,0x14,0x00,0x4C,0xB6,0x01, +0xDD,0x9E,0x00,0x00,0xE6,0x04,0xE8,0x2E,0x96,0x5F,0x46,0x20,0x00,0x81,0x44,0xF0, +0x29,0xBC,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00,0xDD,0x0F,0x04,0x12,0x20,0x34, +0x40,0x10,0xC0,0x08,0x04,0x31,0x00,0x32,0x46,0x0F,0xFF,0x0F,0xD5,0x0E,0x40,0x10, +0xD0,0x08,0x04,0x31,0x00,0x32,0x46,0x0F,0xF0,0xFF,0xD5,0x07,0x40,0x10,0xE0,0x08, +0x04,0x31,0x00,0x32,0x46,0x0F,0x0F,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xD5,0x07, +0x04,0x01,0x00,0x32,0x40,0x10,0xF0,0x08,0x94,0x04,0x92,0x04,0xFE,0x47,0x14,0x11, +0x00,0x32,0xDD,0x9E,0xE6,0x08,0xE8,0x43,0x96,0x4F,0x46,0x20,0x00,0x81,0x44,0xF0, +0x2A,0x1C,0x38,0x07,0x80,0x00,0x40,0xF0,0x3C,0x00,0xDD,0x0F,0x08,0x10,0x1A,0x26, +0x32,0x40,0x4E,0x5C,0x04,0x31,0x00,0x28,0x84,0x1C,0xD5,0x2D,0x94,0x4A,0x04,0x31, +0x00,0x28,0x84,0x13,0xD5,0x28,0x94,0x4C,0x04,0x31,0x00,0x28,0x44,0x0F,0xFF,0xCF, +0xD5,0x22,0x94,0x4E,0x04,0x31,0x00,0x28,0x44,0x0F,0xFF,0x3F,0xD5,0x1C,0x40,0x10, +0xA0,0x08,0x04,0x31,0x00,0x28,0x44,0x0F,0xFC,0xFF,0xD5,0x15,0x40,0x10,0xA8,0x08, +0x04,0x31,0x00,0x28,0x44,0x0F,0xF3,0xFF,0xD5,0x0E,0x40,0x10,0xB0,0x08,0x04,0x31, +0x00,0x28,0x44,0x0F,0xCF,0xFF,0xD5,0x07,0x40,0x10,0xB8,0x08,0x04,0x31,0x00,0x28, +0x44,0x0F,0x3F,0xFF,0xFE,0x1E,0xFE,0x47,0x14,0x11,0x00,0x28,0xDD,0x9E,0x92,0x00, +0xC8,0x04,0x44,0x07,0x20,0x14,0xD5,0x03,0x44,0x07,0x20,0x18,0xB4,0x00,0x40,0x00, +0x30,0x08,0x92,0x0C,0xDD,0x9E,0xFC,0x00,0x44,0x04,0x00,0x9C,0xA6,0x00,0xE6,0x03, +0xE9,0x24,0x44,0x64,0x0C,0x40,0x84,0x41,0xA6,0x32,0x80,0x62,0x58,0x00,0x00,0x08, +0xAE,0x32,0x44,0x14,0x04,0x40,0x44,0x04,0x08,0x40,0x49,0xFF,0xF0,0x53,0xA6,0x32, +0x84,0x41,0x54,0x00,0x00,0xF7,0xAE,0x32,0x44,0x14,0x04,0x40,0x44,0x04,0x08,0x40, +0x80,0x62,0x49,0xFF,0xF0,0x47,0x44,0x07,0x20,0xC0,0x46,0x10,0x20,0x00,0xB4,0x40, +0xFE,0x57,0xB6,0x20,0x80,0x20,0xD5,0x44,0x49,0x00,0x06,0xE7,0xC8,0xDB,0x44,0x64, +0x50,0x28,0xB4,0x06,0x92,0x10,0x96,0x06,0x5A,0x08,0x01,0x1B,0x2E,0x07,0xEF,0xBC, +0xC8,0x13,0xB4,0x06,0x92,0x03,0x96,0x06,0xC8,0x0F,0xB4,0x06,0x92,0x01,0x96,0x06, +0xC0,0x0B,0x3C,0x0D,0xFD,0xC3,0x5A,0x00,0x01,0x0C,0x49,0x00,0x25,0xB6,0x2E,0x07, +0xEF,0xC8,0xC0,0xE8,0xD5,0x05,0x49,0xFF,0xF9,0xE2,0x5A,0x08,0x02,0xF4,0x44,0x64, +0x50,0x28,0xB4,0x06,0x92,0x10,0x96,0x06,0xC8,0xB5,0x2E,0x07,0xEF,0xBC,0xC8,0x13, +0xB4,0x06,0x92,0x03,0x96,0x06,0xC8,0x0F,0xB4,0x06,0x92,0x01,0x96,0x06,0xC0,0x0B, +0x3C,0x0D,0xFD,0xC3,0x5A,0x00,0x01,0xA7,0x49,0x00,0x25,0x97,0x2E,0x07,0xEF,0xC8, +0xC0,0xE9,0xD5,0xA0,0x49,0xFF,0xF9,0xC3,0x5A,0x08,0x02,0xF4,0xD5,0x9B,0xB4,0x01, +0x92,0x19,0x96,0x06,0xC8,0xFD,0x84,0x01,0x49,0xFF,0xFC,0x58,0xFC,0x80,0x44,0x34, +0x00,0x54,0x84,0x21,0xB4,0x43,0x40,0x00,0x80,0x0C,0xFE,0x03,0xFE,0x16,0xB6,0x03, +0xDD,0x9E,0xFC,0x00,0x80,0xC0,0x44,0x04,0x80,0x90,0x54,0x13,0x00,0x01,0xB4,0x80, +0x84,0x5D,0x94,0xC9,0xFE,0xA6,0xFE,0x9F,0xB6,0x40,0x46,0x00,0x00,0x81,0x84,0x5E, +0x83,0x80,0xBB,0x15,0xFE,0x9E,0xFE,0x57,0xB9,0x95,0x84,0x00,0x3E,0x07,0xEF,0xBC, +0x44,0x04,0x80,0x10,0x84,0x22,0xAE,0x40,0x49,0xFF,0xF8,0xA5,0xE6,0x03,0xE9,0x2A, +0x44,0x14,0x00,0x18,0xA6,0x0A,0x5A,0x68,0x01,0x13,0x54,0x00,0x00,0xFB,0xAE,0x0A, +0x44,0x14,0x50,0x10,0xB4,0x01,0x92,0x08,0x40,0x00,0x20,0x08,0xB6,0x01,0x44,0x14, +0x70,0x00,0x44,0x0E,0xFF,0xFF,0xB4,0x41,0xFE,0x16,0xD5,0x13,0x58,0x00,0x00,0x04, +0xAE,0x0A,0x44,0x14,0x50,0x10,0xB4,0x01,0x92,0x08,0x40,0x00,0x20,0x08,0x58,0x00, +0x00,0x98,0xB6,0x01,0x44,0x14,0x70,0x00,0x44,0x01,0x00,0x00,0xB4,0x41,0xFE,0x17, +0xB6,0x01,0xFC,0x80,0x46,0x10,0x00,0x81,0x44,0x02,0x00,0x00,0x04,0x20,0x80,0x6E, +0xFE,0x17,0x14,0x00,0x80,0x6E,0xDD,0x9E,0x44,0x27,0x30,0x10,0xB4,0x22,0x92,0x21, +0x96,0x46,0x5A,0x10,0x01,0xFD,0xFC,0x00,0x44,0x17,0x30,0x00,0xB6,0x01,0x84,0x02, +0x49,0xFF,0xF6,0xDF,0xFC,0x80,0xFC,0x00,0x46,0x61,0xFF,0xF9,0x50,0x03,0x05,0x27, +0x49,0xFF,0xFF,0xEC,0x50,0x03,0x04,0x87,0x49,0xFF,0xFF,0xE8,0xFC,0x80,0xFC,0x00, +0x46,0x61,0xFF,0xF9,0x50,0x03,0x05,0x00,0x49,0xFF,0xFF,0xE0,0x50,0x03,0x04,0x00, +0x49,0xFF,0xFF,0xDC,0xFC,0x80,0xFC,0x00,0x46,0x11,0xFF,0xFF,0x50,0x10,0x8F,0x00, +0xFE,0x0F,0x49,0xFF,0xFF,0xD3,0xFC,0x80,0xFC,0x00,0x46,0x11,0xFF,0xFF,0xFE,0x0F, +0x49,0xFF,0xFF,0xCC,0xFC,0x80,0xFC,0x00,0x46,0x01,0xFF,0xFF,0x50,0x00,0x02,0xBB, +0x49,0xFF,0xFF,0xC4,0xFC,0x80,0xFC,0x00,0x46,0x01,0xFF,0xFF,0x50,0x00,0x03,0xCC, +0x49,0xFF,0xFF,0xBC,0xFC,0x80,0xFC,0x00,0x44,0x67,0x30,0x04,0x49,0xFF,0xFF,0xC5, +0x49,0xFF,0xF6,0x92,0xB4,0x26,0x84,0x1E,0xFE,0x0E,0xB6,0x06,0x44,0x00,0x03,0xE8, +0x49,0xFF,0xF6,0x97,0xB4,0x06,0x58,0x00,0x00,0x01,0xB6,0x06,0x44,0x00,0x03,0xE8, +0x49,0xFF,0xF6,0x8F,0x49,0xFF,0xFF,0xD9,0x49,0xFF,0xF6,0x7E,0x46,0x01,0xFF,0xFF, +0x49,0xFF,0xFF,0x9C,0x49,0xFF,0xF6,0x78,0x49,0xFF,0xF8,0x05,0xE6,0x03,0xE8,0x0B, +0x49,0xFF,0xFF,0xD3,0x49,0xFF,0xF6,0x70,0x46,0x01,0xFF,0xFF,0x49,0xFF,0xFF,0x8E, +0x49,0xFF,0xF6,0x6A,0x44,0x67,0x30,0x04,0x44,0x00,0x03,0xE8,0x49,0xFF,0xF6,0x71, +0xB4,0x26,0x84,0x1E,0xFE,0x0E,0xB6,0x06,0x44,0x00,0x03,0xE8,0x49,0xFF,0xF6,0x69, +0xB4,0x06,0x58,0x00,0x00,0x01,0xB6,0x06,0x44,0x00,0x03,0xE8,0x49,0xFF,0xF6,0x61, +0x44,0x04,0x80,0x0A,0x84,0x24,0xAE,0x40,0x84,0x22,0xAE,0x40,0x84,0x21,0xAE,0x40, +0xFC,0x80,0xFC,0x41,0xF0,0x81,0x80,0xE1,0x80,0xC2,0x81,0x43,0x81,0x24,0x49,0xFF, +0xFF,0x74,0xF0,0x01,0x5A,0x00,0xFF,0x06,0x49,0xFF,0xFF,0x87,0x49,0xFF,0xF6,0x3C, +0x40,0xA5,0x20,0x08,0x40,0x95,0x24,0x04,0x40,0x63,0x40,0x08,0x40,0x64,0x98,0x04, +0x40,0x03,0xE0,0x08,0xFE,0x37,0x49,0xFF,0xFF,0x51,0x49,0xFF,0xFF,0x6A,0xFC,0xC1, +0x44,0x27,0x30,0x10,0xB4,0x22,0x92,0x21,0x96,0x46,0x5A,0x10,0x01,0xFD,0xFC,0x20, +0x44,0x14,0x80,0x0A,0x84,0x42,0xAE,0x88,0x44,0x17,0x30,0x00,0x44,0x60,0x10,0x00, +0xB6,0x01,0x44,0x74,0x80,0x08,0xB4,0x07,0x92,0x11,0x96,0x06,0xC0,0x0D,0x44,0x04, +0x80,0x08,0xB4,0x00,0x92,0x12,0x96,0x06,0xC8,0x10,0x44,0x07,0x30,0x14,0xB4,0x00, +0x92,0x10,0x96,0x00,0xFC,0xA0,0x2E,0x07,0xEF,0xF8,0xC8,0xF2,0x84,0x01,0x8E,0xC1, +0x49,0xFF,0xF6,0x0F,0xCE,0xE9,0xD5,0xEC,0x44,0x00,0xFF,0xFF,0xFC,0xA0,0xFC,0x41, +0xF0,0x81,0x40,0x21,0x20,0x08,0x46,0x02,0xF0,0x00,0x40,0x91,0x00,0x04,0x40,0x10, +0xC0,0x08,0x40,0x94,0x84,0x04,0x84,0xC0,0x49,0xFF,0xFF,0x1F,0xF0,0x01,0x49,0xFF, +0xFF,0x34,0x49,0xFF,0xF5,0xE9,0x80,0x09,0x49,0xFF,0xFF,0xBC,0x5C,0xF0,0x01,0x00, +0x80,0xE0,0xE9,0x08,0x8C,0xC1,0x84,0x01,0x97,0xB0,0x49,0xFF,0xF7,0x79,0x5A,0x68, +0x04,0xED,0x49,0xFF,0xFF,0x16,0x5A,0x60,0x04,0x04,0x80,0x07,0xFC,0xC1,0x84,0x00, +0xFC,0xC1,0xFC,0x00,0x44,0x17,0x30,0x08,0xB4,0x01,0x92,0x05,0x94,0x05,0x58,0x00, +0x00,0x01,0xB6,0x01,0x49,0xFF,0xFE,0xF9,0x49,0xFF,0xF7,0x55,0xE6,0x03,0xE8,0x07, +0x49,0xFF,0xFF,0x23,0x46,0x01,0xFF,0xFF,0x49,0xFF,0xFE,0xE0,0x84,0x06,0xFA,0x2F, +0x44,0x20,0x00,0xAC,0x84,0x61,0x84,0x80,0x49,0xFF,0xFF,0x6D,0x84,0x06,0xFA,0x2F, +0x44,0x20,0x00,0xAD,0x84,0x61,0x84,0x80,0x49,0xFF,0xFF,0x65,0x44,0x04,0x80,0x0A, +0x84,0x24,0xAE,0x40,0x84,0x22,0xAE,0x40,0x44,0x04,0x80,0x88,0x44,0x14,0x00,0x00, +0xB4,0x40,0xFE,0x57,0xB6,0x20,0xB4,0x40,0x44,0x12,0x00,0x00,0xFE,0x57,0xB6,0x20, +0x49,0xFF,0xFE,0xD7,0xFC,0x80,0xFC,0x20,0x84,0x2C,0x84,0x41,0x84,0x05,0x49,0xFF, +0xFF,0x98,0x97,0xC0,0x84,0x2D,0x84,0x41,0x84,0x05,0x49,0xFF,0xFF,0x92,0x97,0x80, +0x80,0x87,0x84,0x05,0xFA,0x2F,0x44,0x20,0x00,0xC0,0x84,0x61,0x49,0xFF,0xFF,0x3B, +0x80,0x86,0x84,0x05,0xFA,0x2F,0x44,0x20,0x00,0xC1,0x84,0x61,0x49,0xFF,0xFF,0x33, +0x80,0x87,0x84,0x05,0xFA,0x2F,0x44,0x20,0x00,0xC2,0x84,0x61,0x49,0xFF,0xFF,0x2B, +0x80,0x86,0x84,0x05,0xFA,0x2F,0x44,0x20,0x00,0xC3,0x84,0x61,0x49,0xFF,0xFF,0x23, +0x80,0x87,0x84,0x05,0xFA,0x2F,0x44,0x20,0x00,0xC4,0x84,0x61,0x49,0xFF,0xFF,0x1B, +0x80,0x86,0x84,0x05,0xFA,0x2F,0x44,0x20,0x00,0xC5,0x84,0x61,0x49,0xFF,0xFF,0x13, +0x80,0x87,0x84,0x05,0xFA,0x2F,0x44,0x20,0x00,0xC6,0x84,0x61,0x49,0xFF,0xFF,0x0B, +0x84,0x05,0xFA,0x2F,0x44,0x20,0x00,0xC7,0x84,0x61,0x80,0x86,0x49,0xFF,0xFF,0x03, +0xFC,0xA0,0xFC,0x00,0x44,0x10,0x00,0x60,0x84,0x41,0x84,0x06,0x49,0xFF,0xFF,0x49, +0x80,0xC0,0x44,0x10,0x00,0x61,0x84,0x41,0x84,0x06,0x49,0xFF,0xFF,0x42,0x96,0x00, +0x97,0xB0,0x40,0x00,0x20,0x08,0xFE,0x37,0xFC,0x80,0x3C,0x0F,0xFB,0xFF,0xDD,0x9E, +0x44,0x04,0x80,0x00,0xA6,0x03,0x96,0x06,0xC0,0x0D,0x44,0x04,0x80,0x03,0x84,0x21, +0xAE,0x40,0x3C,0x0D,0xFB,0xFF,0xC0,0x06,0xFC,0x00,0x3C,0x0D,0xFB,0xFF,0xDD,0x20, +0xFC,0x80,0xDD,0x9E,0x46,0x20,0x00,0x81,0x84,0x3E,0x04,0x31,0x00,0x14,0x96,0x06, +0xFE,0x5E,0xFE,0x0F,0x14,0x01,0x00,0x14,0xDD,0x9E,0x44,0x14,0x70,0x08,0x5A,0x08, +0x01,0x09,0xB4,0x01,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x78,0x23,0xD5,0x05, +0xB4,0x01,0x92,0x10,0x40,0x00,0x40,0x08,0xB6,0x01,0xDD,0x9E,0xDD,0x9E,0x4E,0x05, +0x00,0x19,0x8E,0x01,0x40,0x10,0x04,0x0A,0xFE,0x0F,0x40,0x10,0x08,0x0A,0xFE,0x0F, +0x40,0x10,0x10,0x0A,0xFE,0x0F,0x40,0x10,0x20,0x0A,0xFE,0x0F,0x40,0x10,0x40,0x0A, +0xFE,0x47,0x8C,0x21,0x84,0x00,0x90,0x21,0xC1,0x03,0x8C,0x01,0xD5,0xFD,0xDD,0x9E, +0x84,0x00,0xDD,0x9E,0xFC,0x4D,0x44,0x02,0x00,0x10,0x50,0xFF,0x80,0x18,0x80,0xC0, +0x80,0x2F,0x3A,0x23,0x14,0x04,0x3A,0x20,0x94,0x24,0x81,0x46,0x83,0x81,0x3A,0x25, +0x14,0x04,0x44,0x92,0x00,0x38,0x3A,0x2E,0x14,0x24,0x80,0x89,0x3A,0x25,0x0C,0x00, +0x80,0xBF,0x3A,0x2E,0x0C,0x20,0x3A,0x22,0x0C,0x04,0x3A,0x22,0x8C,0x24,0x45,0xE2, +0x05,0xB8,0xA5,0xE0,0x3A,0x27,0x94,0x04,0x81,0xFE,0x81,0x1F,0x3A,0x27,0x94,0x24, +0x3A,0x20,0x94,0x04,0x80,0x2F,0x3A,0x20,0x94,0x24,0x3A,0x2E,0x0C,0x00,0x3A,0x20, +0x8C,0x20,0x44,0x12,0x05,0xAC,0x3A,0x24,0x0C,0x04,0x3A,0x20,0x8C,0x24,0xAD,0xC8, +0xB0,0x50,0x3A,0x20,0x14,0x04,0x80,0x01,0x3A,0x20,0x14,0x24,0x81,0x00,0x3A,0x23, +0x14,0x04,0x3A,0x24,0x14,0x24,0xB1,0x83,0x3A,0x25,0x0C,0x00,0x80,0x86,0x3A,0x24, +0x0C,0x20,0x3A,0x24,0x8C,0x04,0x44,0x92,0x03,0xEC,0x3A,0x22,0x0C,0x24,0x3A,0x20, +0x94,0x04,0x80,0x29,0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x04,0x80,0x01,0x3A,0x20, +0x14,0x24,0x3A,0x24,0x0C,0x00,0x3A,0x20,0x0C,0x20,0x44,0x02,0x03,0xE0,0x3A,0x23, +0x0C,0x04,0x3A,0x20,0x0C,0x24,0xAD,0xC0,0xFC,0xCD,0xFC,0x48,0x83,0x81,0x50,0xAF, +0x80,0x14,0x44,0x12,0x00,0x44,0x80,0xC0,0x80,0x0A,0x81,0x22,0x3A,0x20,0x8C,0x04, +0x3A,0x20,0x0C,0x24,0xA4,0x48,0xFA,0x40,0xAC,0x40,0x50,0x8F,0x80,0x30,0x84,0x20, +0xB0,0x08,0x49,0x00,0x28,0x97,0x80,0x08,0x84,0x20,0xFA,0x40,0x49,0x00,0x28,0x92, +0x5A,0x98,0x01,0x03,0x87,0x80,0xC6,0x04,0x44,0x12,0x06,0x58,0xD5,0x03,0x44,0x12, +0x06,0x64,0x58,0x04,0x80,0x01,0x8C,0x01,0x84,0xE0,0xB6,0x1F,0x8D,0x21,0x84,0x83, +0x84,0x61,0x38,0x05,0x1C,0x00,0xF3,0x83,0xF4,0x82,0x38,0x60,0x80,0x00,0xB4,0x1F, +0x8C,0xC1,0xFF,0x84,0x97,0xB1,0x40,0x63,0x24,0xD6,0x80,0x06,0xF1,0x81,0x49,0xFF, +0xFF,0x48,0xF4,0x02,0x97,0x78,0x40,0x52,0x90,0xB7,0xF3,0x03,0x38,0x24,0x16,0x02, +0x8C,0x08,0x41,0xE1,0x28,0x08,0x40,0x20,0x70,0x01,0x40,0x01,0x80,0x0C,0x40,0x60, +0x18,0xD7,0xB0,0x08,0x94,0x94,0x38,0x00,0x16,0x02,0x88,0x5E,0x40,0x00,0x28,0x08, +0x88,0xC0,0xB0,0x08,0x8C,0xE1,0x38,0x24,0x16,0x0A,0x38,0x60,0x16,0x0A,0xF1,0x01, +0x5A,0x78,0x0A,0xD1,0x80,0x28,0x49,0xFF,0xEA,0x8A,0xFC,0xC8,0x80,0x80,0x84,0x40, +0x9A,0xE0,0x96,0xD8,0xE2,0x61,0xE8,0x08,0x08,0x32,0x00,0x01,0xE2,0x62,0x40,0x31, +0x3C,0x1B,0x80,0x43,0xD5,0xF6,0x9C,0x11,0x96,0x00,0xDD,0x9E,0xFC,0x40,0x51,0xFF, +0xFB,0xE0,0x44,0x20,0x04,0x00,0x81,0x40,0x81,0x21,0xB0,0x08,0x84,0x20,0x49,0x00, +0x28,0x31,0xB1,0x81,0x44,0x12,0x00,0x44,0x80,0x06,0x3A,0x20,0x8C,0x04,0x3A,0x20, +0x0C,0x24,0xA4,0x48,0xB1,0xC4,0xAC,0x40,0xFA,0x40,0x84,0x20,0x80,0x07,0x49,0x00, +0x28,0x21,0x84,0x2A,0x4E,0xA3,0x00,0x3D,0x44,0x02,0x06,0x64,0x49,0xFF,0xFF,0xD0, +0x80,0x20,0x80,0x4A,0x84,0xA3,0x44,0xA2,0x05,0xB8,0x45,0xE2,0x05,0xAC,0x96,0x10, +0x40,0x00,0x14,0x17,0x40,0x30,0x20,0x08,0xB1,0x08,0x41,0xC2,0x0C,0x00,0x84,0x60, +0x54,0x81,0x80,0xFF,0xE3,0x01,0xE8,0x12,0x38,0x83,0x08,0x00,0x38,0x85,0x22,0x02, +0x38,0x84,0x0D,0x01,0x54,0xF4,0x03,0xFF,0x38,0x8E,0x0E,0x02,0x40,0x84,0x28,0x08, +0x89,0x0F,0x38,0x8E,0x0E,0x0A,0x8C,0x61,0xD5,0xEC,0x38,0x33,0x08,0x00,0x8C,0x41, +0x38,0x3F,0x0C,0x00,0x8A,0x69,0x54,0x81,0x83,0xFF,0x38,0x33,0x82,0x02,0x40,0x31, +0xA8,0x08,0x88,0x68,0x38,0x33,0x82,0x0A,0x5A,0x28,0x0A,0xD3,0xD5,0x3B,0x44,0x02, +0x06,0x58,0x49,0xFF,0xFF,0x95,0x80,0x20,0x84,0x40,0x84,0xA3,0x44,0xA2,0x03,0xEC, +0x45,0xE2,0x03,0xE0,0x97,0x10,0x40,0x42,0x14,0x97,0x40,0x32,0x20,0x08,0xB0,0x08, +0x41,0xC0,0x0C,0x00,0x84,0x60,0x54,0x81,0x80,0xFF,0xE3,0x01,0xE8,0x12,0x38,0x83, +0x08,0x00,0x38,0x85,0x22,0x02,0x38,0x84,0x0D,0x01,0x54,0xF4,0x03,0xFF,0x38,0x8E, +0x0E,0x02,0x40,0x84,0x28,0x08,0x89,0x0F,0x38,0x8E,0x0E,0x0A,0x8C,0x61,0xD5,0xEC, +0x38,0x33,0x08,0x00,0x8C,0x41,0x38,0x3F,0x0C,0x00,0x8A,0x69,0x54,0x81,0x83,0xFF, +0x38,0x33,0x92,0x02,0x40,0x31,0xA8,0x08,0x88,0x68,0x38,0x33,0x92,0x0A,0x5A,0x28, +0x0A,0xD3,0xB0,0x08,0x49,0xFF,0xEA,0x32,0x80,0x07,0x49,0xFF,0xEA,0x68,0x51,0xFF, +0x84,0x20,0xFC,0xC0,0xFC,0x20,0x49,0x00,0x0D,0x4C,0x80,0xC0,0x49,0x00,0x0D,0x4C, +0x80,0xA6,0x50,0x43,0x04,0x80,0x50,0x32,0x80,0x22,0x50,0x20,0x00,0x22,0x84,0x20, +0x38,0x62,0x85,0x11,0x22,0x71,0x80,0x00,0x38,0x72,0x85,0x09,0x1A,0x61,0xFF,0xFF, +0x38,0x60,0x05,0x11,0x22,0x71,0x00,0x00,0x38,0x70,0x05,0x09,0x8C,0x21,0x1A,0x61, +0x7F,0xFF,0x5A,0x18,0x09,0xEF,0x50,0x52,0x80,0x24,0x50,0x00,0x00,0x24,0xDC,0xE4, +0xFC,0xA0,0xFC,0x40,0x49,0x00,0x0D,0x25,0x80,0xC0,0x49,0x00,0x0D,0x25,0x80,0xA6, +0x84,0x40,0x52,0x11,0x04,0x5C,0x99,0x31,0x98,0xC2,0x88,0x20,0x50,0x72,0x80,0x24, +0x22,0x92,0x80,0x00,0x22,0xA2,0x00,0x00,0x1A,0xA2,0x80,0x01,0x1A,0x92,0x00,0x01, +0x22,0x91,0x80,0x00,0x22,0xA0,0x80,0x00,0x1A,0xA1,0x80,0x01,0x1A,0x90,0x80,0x01, +0xDF,0xF0,0x50,0x21,0x00,0x24,0x5A,0x2A,0x40,0xE6,0xFC,0xC0,0xFC,0x41,0x80,0xE0, +0x80,0x02,0xF3,0x81,0x81,0x44,0x80,0xC5,0x81,0x21,0x49,0xFF,0xFB,0x6B,0x81,0x00, +0xF0,0x01,0x49,0xFF,0xF0,0xC7,0x40,0x44,0x28,0x00,0x95,0x72,0x84,0x60,0x84,0x20, +0x98,0x99,0x96,0x91,0xC7,0x0B,0x95,0x92,0x88,0xC5,0x38,0xA2,0x09,0x01,0x38,0x60, +0x18,0x02,0x90,0xC8,0x8A,0xCA,0x38,0x63,0x89,0x09,0x4E,0x92,0x00,0x06,0x38,0x62, +0x09,0x11,0x38,0x64,0x89,0x09,0x8C,0x21,0x5A,0x18,0x12,0xEC,0x8C,0x72,0x96,0xD9, +0x5A,0x3A,0x40,0xE7,0x49,0xFF,0xFF,0x88,0x49,0xFF,0xFF,0xAD,0xFC,0xC1,0xFC,0x00, +0x80,0x43,0x80,0x64,0x84,0x80,0x80,0xA4,0x49,0xFF,0xFF,0xCA,0xFC,0x80,0xFC,0x20, +0x80,0xE0,0x80,0x02,0x80,0xC1,0x49,0xFF,0xFB,0x35,0x84,0x40,0x96,0x51,0xE2,0x26, +0xE8,0x07,0x38,0x10,0x09,0x11,0x38,0x13,0x89,0x09,0x8C,0x41,0xD5,0xF8,0xFC,0xA0, +0xFC,0x20,0xFD,0x30,0x84,0x00,0x49,0xFF,0xFB,0x25,0x95,0xF9,0x80,0xA6,0x88,0xE6, +0x50,0x00,0x04,0xA4,0xD7,0x06,0x2A,0x10,0x00,0x01,0x1A,0x12,0x80,0x01,0xD5,0xFB, +0xFC,0xA0,0xFC,0x20,0x80,0xE0,0x80,0x02,0x80,0xC1,0x49,0xFF,0xF0,0x73,0x84,0x40, +0x96,0x51,0xE2,0x26,0xE8,0x07,0x38,0x10,0x0A,0x02,0x38,0x13,0x8A,0x0A,0x8C,0x41, +0xD5,0xF8,0xFC,0xA0,0x2E,0x07,0xF0,0xCA,0xDD,0x9E,0xFC,0x01,0x84,0x1F,0xB6,0x1F, +0xF0,0x81,0x80,0x1F,0x49,0xFF,0xEC,0x42,0x84,0x01,0x49,0xFF,0xEC,0x34,0x84,0x01, +0x49,0xFF,0xEC,0xAA,0x84,0x22,0x84,0x01,0x80,0x61,0x80,0xA0,0x44,0x40,0x00,0x3F, +0x84,0x44,0x49,0xFF,0xEB,0xAD,0x84,0x01,0x49,0xFF,0xFA,0x08,0x84,0x01,0x80,0x20, +0x80,0x40,0x49,0xFF,0xEB,0xEA,0x84,0x0A,0x49,0xFF,0xEC,0x12,0x46,0x00,0x42,0x10, +0x50,0x00,0x08,0x20,0x80,0x20,0x84,0x40,0x49,0xFF,0xEB,0xFD,0x49,0xFF,0xEE,0x60, +0x84,0x01,0x49,0xFF,0xEE,0x4F,0x84,0x00,0x49,0xFF,0xFA,0x47,0x44,0x04,0x55,0x08, +0x44,0x1F,0xFF,0x7F,0xB4,0x40,0xFE,0x56,0xB6,0x20,0xB4,0x20,0x58,0x10,0x80,0x10, +0xB6,0x20,0x84,0x21,0x49,0xFF,0xEB,0x0B,0x84,0x06,0x3E,0x07,0xF0,0xCA,0xFC,0x81, +0xFC,0x52,0x44,0x02,0x00,0x5C,0x80,0x20,0x80,0x9F,0x3A,0x20,0x8C,0x04,0x3A,0x22, +0x0C,0x24,0x50,0xAF,0x80,0x0C,0xA4,0x48,0x3A,0x20,0x0C,0x04,0x80,0x0A,0xAC,0x60, +0x3A,0x20,0x0C,0x24,0x50,0x9F,0x80,0x18,0xAC,0x40,0x44,0x02,0x00,0x68,0x80,0x29, +0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0xB4,0x00,0xB1,0x90,0xB6,0x01,0x44,0x12, +0x00,0x7C,0x80,0x01,0x80,0xE6,0x3A,0x20,0x14,0x04,0x81,0xE0,0x3A,0x23,0x94,0x24, +0x3A,0x27,0x94,0x04,0x3A,0x23,0x94,0x24,0x3A,0x27,0x8C,0x00,0x3A,0x23,0x8C,0x20, +0x44,0x22,0x00,0xA4,0x51,0xCF,0x80,0x2C,0x80,0xE2,0x83,0xDC,0x3A,0x23,0x94,0x04, +0x3A,0x2F,0x14,0x24,0xB4,0x67,0xB1,0xDA,0xB6,0x7E,0x3A,0x20,0x94,0x04,0x80,0x27, +0x81,0x1F,0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x04,0x80,0x01,0x3A,0x20,0x14,0x24, +0x3A,0x27,0x8C,0x00,0x3A,0x20,0x0C,0x20,0x49,0xFF,0xF3,0xBD,0xE6,0x03,0xE9,0x07, +0x2E,0x07,0xF0,0xCA,0x44,0x10,0x01,0x32,0x38,0x13,0x01,0x09,0x44,0x02,0x06,0x08, +0x3A,0x2E,0x14,0x04,0x3A,0x20,0x14,0x24,0x80,0x20,0xB4,0x1C,0xB6,0x01,0x44,0x12, +0x05,0xE0,0x80,0x01,0x3A,0x23,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x23,0x94,0x04, +0x3A,0x20,0x14,0x24,0x3A,0x23,0x8C,0x00,0x3A,0x20,0x0C,0x20,0x44,0x02,0x06,0x64, +0x3A,0x24,0x0C,0x04,0x3A,0x20,0x0C,0x24,0x80,0x20,0x02,0x04,0x00,0x00,0xAC,0x08, +0x44,0x02,0x06,0x58,0x3A,0x25,0x0C,0x04,0x3A,0x20,0x0C,0x24,0x80,0x20,0x02,0x05, +0x00,0x00,0xAC,0x08,0x44,0x02,0x06,0x44,0x3A,0x24,0x94,0x04,0x3A,0x20,0x14,0x24, +0x80,0x20,0xB4,0x09,0xB6,0x01,0x44,0x12,0x06,0x1C,0x80,0x01,0x3A,0x23,0x14,0x04, +0x3A,0x20,0x14,0x24,0x3A,0x23,0x14,0x04,0x3A,0x20,0x14,0x24,0x3A,0x23,0x0C,0x00, +0x3A,0x20,0x0C,0x20,0xFC,0xD2,0xFC,0x00,0x49,0xFF,0xEA,0xC9,0xFC,0x80,0xFC,0x00, +0xC8,0x06,0x44,0x02,0x06,0x1C,0x44,0x12,0x06,0x44,0xD5,0x05,0x44,0x02,0x05,0xE0, +0x44,0x12,0x06,0x08,0x49,0xFF,0xEB,0xB5,0xFC,0x80,0x84,0x00,0x3E,0x07,0xF0,0xC9, +0x3E,0x07,0xF0,0xC8,0xDD,0x9E,0xFC,0x00,0x80,0x41,0x84,0x20,0x5A,0x08,0x01,0x03, +0x84,0x24,0xCA,0x04,0x44,0x02,0x06,0x64,0xD5,0x03,0x44,0x02,0x06,0x58,0x49,0xFF, +0xED,0xDC,0xFC,0x80,0xFC,0x00,0x80,0xC0,0x5A,0x08,0x01,0x0B,0x84,0x02,0x49,0xFF, +0xED,0x58,0x80,0x06,0x84,0x20,0x49,0xFF,0xED,0x85,0x80,0x06,0xD5,0x09,0x84,0x00, +0x49,0xFF,0xED,0x4F,0x84,0x00,0x80,0x20,0x49,0xFF,0xED,0x7C,0x84,0x00,0x49,0xFF, +0xED,0xAE,0xFC,0x80,0xFC,0x01,0xB6,0x1F,0xF1,0x81,0x49,0xFF,0xFF,0xE5,0xB4,0x1F, +0xF1,0x01,0x49,0xFF,0xFF,0xD2,0xFC,0x81,0xFC,0x49,0x80,0xE0,0x44,0x02,0x00,0x01, +0xF0,0x86,0x44,0x01,0x00,0x02,0xF0,0x87,0x44,0x00,0x80,0x04,0xF0,0x88,0x44,0x00, +0x40,0x08,0xF0,0x89,0x44,0x00,0x20,0x10,0xF0,0x8A,0x44,0x00,0x10,0x20,0xF0,0x8B, +0x44,0x00,0x08,0x40,0xF0,0x8C,0x44,0x00,0x04,0x80,0xF0,0x8D,0x44,0x00,0x03,0x00, +0xF0,0x8E,0x3C,0x0D,0xFB,0xC2,0xF0,0x8F,0xF0,0x90,0xF0,0x91,0xC7,0x08,0x44,0x92, +0x06,0x08,0x44,0xA2,0x05,0xE0,0x85,0x02,0x87,0x85,0xD5,0x07,0x85,0x03,0x44,0x92, +0x06,0x44,0x44,0xA2,0x06,0x1C,0x83,0x88,0xB0,0x06,0x49,0xFF,0xEB,0xB5,0x80,0xDF, +0xCF,0x11,0x44,0x02,0x00,0xD0,0x80,0x3F,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24, +0x3A,0x20,0x0C,0x00,0x3A,0x20,0x8C,0x20,0x80,0x1F,0x49,0xFF,0xEB,0xDB,0x80,0x07, +0xD5,0x10,0x44,0x02,0x00,0xE8,0x80,0x3F,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24, +0x3A,0x20,0x0C,0x00,0x3A,0x20,0x8C,0x20,0x80,0x1F,0x49,0xFF,0xEB,0xCB,0x84,0x01, +0x49,0x00,0x0B,0x3D,0x2E,0x47,0xF0,0xCA,0x84,0x00,0x80,0x4A,0x80,0x69,0x80,0xA4, +0x80,0x20,0x49,0xFF,0xF8,0xBE,0x2E,0x17,0xF0,0xCA,0x84,0x00,0x38,0x15,0x05,0x01, +0x49,0xFF,0xEC,0x5E,0x2E,0x17,0xF0,0xCA,0x84,0x05,0x38,0x15,0x05,0x01,0x49,0xFF, +0xEC,0x57,0x2E,0x07,0xF0,0xCA,0x84,0x20,0x38,0x04,0x80,0x00,0x49,0xFF,0xED,0x53, +0x2E,0x07,0xF0,0xCA,0x84,0x23,0x38,0x04,0x80,0x00,0x49,0xFF,0xED,0x4C,0x44,0x00, +0x02,0x40,0x49,0xFF,0xEE,0xE2,0x80,0x08,0x49,0xFF,0xEF,0x0A,0xE6,0xE2,0xE8,0x07, +0x2E,0x07,0xF0,0xCA,0x40,0xFE,0x00,0x06,0x84,0x01,0xE8,0x02,0x84,0x00,0x80,0x27, +0x49,0xFF,0xFF,0x6A,0xFC,0xC9,0xFC,0x49,0x44,0x12,0x01,0x30,0xB1,0x86,0x80,0xE0, +0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x20, +0x14,0x24,0x3A,0x20,0x94,0x00,0x3A,0x20,0x14,0x20,0xC7,0x07,0x44,0x82,0x05,0xE0, +0x85,0x22,0x44,0xA2,0x06,0x08,0xD5,0x06,0x44,0x82,0x06,0x1C,0x85,0x23,0x44,0xA2, +0x06,0x44,0x84,0x00,0x49,0x00,0x0A,0xE3,0x2E,0x47,0xF0,0xCA,0x84,0x00,0x80,0x20, +0x80,0x48,0x80,0x6A,0x80,0xA4,0x49,0xFF,0xF8,0x64,0x80,0x06,0x49,0xFF,0xEB,0x2C, +0x44,0x00,0x02,0x40,0x49,0xFF,0xEE,0xA1,0x80,0x09,0x49,0xFF,0xEE,0xC9,0x46,0x00, +0x42,0x10,0x50,0x00,0x08,0x20,0x80,0x20,0x84,0x40,0x49,0xFF,0xEA,0x34,0x80,0x1F, +0xCF,0x04,0x44,0x12,0x00,0xD0,0xD5,0x03,0x44,0x12,0x00,0xE8,0x80,0xC0,0x3A,0x20, +0x94,0x04,0x3A,0x23,0x14,0x24,0x3A,0x20,0x8C,0x00,0x3A,0x23,0x0C,0x20,0x49,0xFF, +0xEB,0x41,0xFC,0xC9,0x2E,0x07,0xF0,0xD1,0x96,0x00,0xC0,0x05,0x84,0x00,0x3E,0x07, +0xF0,0xD1,0x84,0x01,0xDD,0x9E,0x2E,0x17,0xF0,0xD0,0x96,0x48,0xC1,0x05,0x84,0x00, +0x3E,0x07,0xF0,0xD0,0xD5,0x07,0x2E,0x07,0xF0,0xCF,0x96,0x00,0xC0,0x04,0x3E,0x17, +0xF0,0xCF,0x84,0x01,0xDD,0x9E,0x2E,0x07,0xF0,0xD4,0xDD,0x9E,0x3E,0x07,0xF0,0xD4, +0xDD,0x9E,0x2E,0x07,0xF0,0xD3,0xDD,0x9E,0x3E,0x07,0xF0,0xD2,0xDD,0x9E,0xFC,0x00, +0x84,0x03,0x49,0xFF,0xF9,0x56,0x49,0xFF,0xF8,0x56,0xFC,0x80,0xDD,0x9E,0xFC,0x20, +0x49,0xFF,0xF5,0x64,0x2E,0x17,0xF0,0xE4,0x5A,0x10,0x01,0x04,0x48,0x00,0x00,0x80, +0x5A,0x08,0x01,0x06,0x3C,0x0D,0xFC,0x38,0x4E,0x02,0x01,0x08,0x49,0xFF,0xFA,0xAB, +0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x41,0x84,0x61,0x49,0xFF,0xFA,0x2C,0x44,0x00, +0x00,0x96,0x49,0xFF,0xF2,0x0D,0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x59,0x84,0x61, +0x49,0xFF,0xFA,0x21,0xFA,0x04,0x49,0xFF,0xF2,0x03,0x49,0xFF,0xEA,0x89,0x84,0x00, +0x49,0xFF,0xFB,0x42,0x84,0x00,0x49,0xFF,0xF1,0x46,0x84,0x00,0x49,0xFF,0xFB,0x47, +0x84,0x40,0x84,0x61,0x44,0x00,0x03,0x41,0x84,0x27,0x49,0x00,0x1E,0x44,0x84,0x00, +0x84,0x21,0x49,0xFF,0xF0,0x8B,0x84,0x01,0x80,0x20,0x49,0xFF,0xF1,0x01,0x84,0x00, +0x49,0x00,0x09,0xAB,0x84,0x00,0x49,0x00,0x09,0x8E,0x84,0x00,0x49,0xFF,0xFF,0xA8, +0x46,0x00,0x00,0x81,0x44,0x60,0x08,0x01,0x83,0x80,0xB9,0x1A,0x44,0x74,0x50,0x28, +0x92,0x25,0x94,0x4D,0x58,0x10,0x80,0x09,0xB9,0x9A,0xBA,0x1A,0x44,0x1F,0xE0,0xFF, +0xFE,0x56,0x58,0x10,0x85,0x00,0xB9,0x9A,0xBA,0x1A,0x46,0x1F,0xFE,0x0F,0x50,0x10, +0x8F,0xFF,0xFE,0x56,0x44,0x25,0x00,0x00,0xFE,0x57,0xB9,0x9A,0xBA,0x1A,0x46,0x1E, +0x0F,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x56,0x46,0x20,0x30,0x00,0xFE,0x57,0xB9,0x9A, +0xB9,0x19,0x44,0x21,0x39,0x0A,0x92,0x31,0x40,0x10,0xC4,0x08,0xFE,0x57,0xB9,0x99, +0xB4,0x07,0x92,0x01,0x96,0x06,0x5A,0x08,0x01,0x04,0x48,0x00,0x00,0x97,0x8E,0xC1, +0x84,0x01,0x97,0xB1,0x49,0xFF,0xF1,0x9B,0xCE,0xF4,0xFC,0xA0,0x5A,0x10,0x02,0x04, +0x48,0x00,0x00,0x8C,0xC8,0x05,0x3C,0x0D,0xFC,0x38,0x4E,0x02,0x00,0x87,0x49,0xFF, +0xFA,0x2A,0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x58,0x84,0x61,0x49,0xFF,0xF9,0xAB, +0xFA,0x04,0x49,0xFF,0xF1,0x8D,0x84,0x00,0x80,0x80,0xFA,0x2F,0xFA,0x40,0x84,0x61, +0x49,0xFF,0xF9,0xA1,0x44,0x00,0x00,0x32,0x49,0xFF,0xF1,0x82,0x84,0x01,0x49,0x00, +0x09,0x44,0x84,0x00,0x49,0x00,0x09,0x27,0x46,0x00,0x00,0x81,0x83,0x80,0xB9,0x1A, +0x92,0x25,0x94,0x4D,0x58,0x10,0x80,0x03,0xB9,0x9A,0xBA,0x1A,0x44,0x1F,0xE0,0xFF, +0xFE,0x56,0x58,0x10,0x82,0x00,0xB9,0x9A,0xBA,0x1A,0x46,0x1F,0xFE,0x0F,0x50,0x10, +0x8F,0xFF,0xFE,0x56,0x44,0x21,0x00,0x00,0xFE,0x57,0xB9,0x9A,0xBA,0x1A,0x46,0x1E, +0x0F,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x56,0xB9,0x9A,0xB9,0x19,0x84,0x41,0x92,0x31, +0x40,0x10,0xC4,0x08,0x58,0x10,0xED,0x60,0x80,0x62,0xB9,0x99,0x44,0x00,0x03,0x41, +0x84,0x20,0x49,0x00,0x1D,0xA0,0x84,0x21,0x84,0x00,0x49,0xFF,0xF0,0x61,0x84,0x01, +0x49,0xFF,0xF0,0x68,0x84,0x01,0x80,0x20,0x49,0xFF,0xEF,0xE0,0x84,0x01,0x49,0xFF, +0xF0,0x2D,0x84,0x01,0x49,0xFF,0xF0,0x87,0x49,0xFF,0xF1,0x2D,0xE6,0x03,0xE8,0x03, +0x49,0xFF,0xF9,0x03,0x49,0xFF,0xEF,0x98,0x84,0x00,0x80,0x40,0x80,0x80,0xFA,0x2F, +0x84,0x61,0x49,0xFF,0xF9,0x48,0x49,0xFF,0xEF,0x8F,0x84,0x00,0x49,0xFF,0xF4,0x6C, +0x84,0x00,0x49,0xFF,0xF4,0x72,0x84,0x01,0x49,0xFF,0xFE,0xEA,0x44,0x60,0x08,0x01, +0x44,0x74,0x50,0x28,0xB4,0x07,0x92,0x01,0x96,0x06,0xC0,0x07,0x8E,0xC1,0x84,0x01, +0x97,0xB1,0x49,0xFF,0xF1,0x0C,0xCE,0xF7,0xFC,0xA0,0xFC,0x00,0x84,0x00,0x49,0xFF, +0xF0,0xAF,0x44,0x16,0x00,0x00,0xB4,0x01,0x58,0x00,0x01,0x00,0xB6,0x01,0x44,0x02, +0x06,0xA4,0x44,0x10,0x00,0x79,0xAE,0x41,0x44,0x1F,0xFF,0x84,0xAE,0x42,0x84,0x39, +0xAE,0x43,0xFC,0x80,0x84,0x20,0x84,0x40,0x3C,0x1B,0xF8,0x7C,0x44,0x42,0x06,0xA4, +0x80,0x22,0x96,0xD1,0xE2,0x60,0xE8,0x06,0x38,0x32,0x08,0x00,0x8C,0x41,0x88,0x23, +0xD5,0xF9,0xFC,0x00,0x44,0x22,0x06,0xA4,0xFE,0x4A,0x96,0x48,0x38,0x11,0x00,0x08, +0x8C,0x01,0x96,0x01,0x49,0xFF,0xF5,0x48,0x2E,0x07,0xF0,0xFC,0x49,0xFF,0xF5,0x2F, +0x49,0xFF,0xF0,0xD1,0xE6,0x03,0xE9,0x03,0x49,0xFF,0xF4,0x32,0xFC,0x80,0xFC,0x01, +0x84,0x00,0x3E,0x07,0xF7,0x06,0x84,0x01,0x3E,0x07,0xEF,0x15,0x84,0x20,0x44,0x00, +0x01,0x00,0x49,0xFF,0xE7,0x35,0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF,0xE7,0x3F, +0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF,0xE7,0x49,0x44,0x40,0x05,0x78,0xB6,0x9F, +0x44,0x12,0x06,0xA4,0x44,0x22,0x06,0xA2,0x44,0x32,0x06,0xA0,0x44,0x50,0x00,0x90, +0x44,0x02,0x0C,0x1C,0x49,0xFF,0xF5,0x07,0x44,0x00,0x3F,0x66,0x49,0xFF,0xF5,0x1D, +0x44,0x00,0x38,0xEC,0x49,0xFF,0xF5,0x1C,0x84,0x00,0x49,0xFF,0xE7,0x4B,0x84,0x00, +0x3C,0x0B,0xF8,0x7D,0x44,0x00,0x05,0x77,0x49,0xFF,0xFF,0xA6,0x49,0xFF,0xFF,0x8F, +0xFC,0x81,0xFC,0x00,0xC8,0x03,0xFA,0x1A,0xD5,0x03,0x44,0x00,0x05,0x1B,0x49,0xFF, +0xFF,0x9B,0xFC,0x80,0xFC,0x00,0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF,0xE7,0x16, +0x84,0x00,0x3C,0x0F,0xFC,0x36,0x3C,0x0D,0xFC,0x36,0x5C,0xF0,0x00,0x64,0xE8,0x05, +0x3C,0x0D,0xFC,0x36,0x8C,0x01,0xD5,0xF6,0x44,0x00,0x01,0x00,0x84,0x21,0x49,0xFF, +0xE7,0x05,0xFC,0x80,0x2E,0x07,0xF7,0x06,0xDD,0x9E,0x2E,0x07,0xEF,0x15,0xDD,0x9E, +0xFC,0x00,0x44,0x10,0x00,0xFF,0x80,0xC0,0x44,0x20,0x05,0x78,0x44,0x02,0x06,0xA4, +0x49,0x00,0x22,0xF8,0xCE,0x06,0x44,0x00,0x00,0x5A,0x3E,0x07,0xF0,0xFC,0xFC,0x80, +0x44,0x0F,0xFF,0xA7,0x3E,0x07,0xF0,0xFC,0x84,0x05,0x3E,0x07,0xF0,0xFD,0xFA,0x0C, +0x3E,0x07,0xF0,0xFE,0xFA,0x10,0x3E,0x07,0xF0,0xFF,0x84,0x1F,0x3E,0x07,0xF1,0x00, +0xFC,0x80,0xFC,0x00,0x04,0x30,0x00,0x47,0x46,0x40,0x10,0x00,0x40,0x51,0xC0,0x09, +0xFF,0x1E,0x80,0xC0,0x97,0x5F,0xC4,0x26,0x92,0x74,0x96,0xDF,0x4C,0x32,0xC0,0x09, +0x9D,0x5D,0x84,0x66,0x40,0x32,0x8C,0xB6,0x97,0x68,0x84,0x01,0xD5,0x0F,0x50,0x00, +0x01,0x1B,0x9D,0x29,0x84,0x66,0x40,0x42,0x0C,0x76,0x54,0x41,0x80,0x0F,0xA6,0xC3, +0x54,0x31,0x80,0xF0,0xFE,0xE7,0xAE,0xC3,0x84,0x02,0xAE,0x10,0x84,0x4C,0x80,0x01, +0x80,0x26,0x42,0x12,0x88,0x73,0x50,0x10,0x80,0x94,0x49,0x00,0x22,0x8D,0x84,0x01, +0xFC,0x80,0xAF,0x10,0x80,0x04,0xFC,0x80,0xFC,0x42,0x84,0x20,0x80,0xE0,0x84,0x4C, +0xB0,0x01,0x49,0x00,0x22,0xA7,0x2E,0x07,0xF0,0xD5,0x44,0x82,0x1B,0x14,0x8C,0x01, +0x3E,0x07,0xF0,0xD5,0x85,0x45,0x84,0xC1,0x87,0x80,0x44,0x92,0x06,0xA4,0x80,0x08, +0xB0,0x41,0x50,0x2F,0x80,0x03,0x49,0xFF,0xFF,0xB6,0x4E,0x02,0x00,0x9C,0x00,0x14, +0x01,0x05,0x5A,0x18,0x03,0x08,0x00,0x0F,0x80,0x03,0x5A,0x08,0x01,0x04,0x48,0x00, +0x00,0x92,0x8E,0x22,0xE6,0x22,0x4E,0xF2,0x00,0x8E,0x3C,0x0D,0xFB,0xCA,0x96,0x1E, +0xC8,0x06,0x44,0x20,0x00,0x5F,0x44,0x10,0x00,0x3C,0xD5,0x05,0x44,0x20,0x00,0xC8, +0x44,0x10,0x00,0x58,0xF0,0x01,0x5E,0xF0,0x1B,0x59,0xE9,0x21,0x40,0x10,0x08,0x36, +0x5E,0xF0,0x81,0x00,0xE9,0x03,0x44,0x10,0x00,0xFF,0x50,0x00,0xFF,0x92,0xE6,0x14, +0xE8,0x02,0x8C,0x34,0x50,0x00,0xFF,0xA6,0xE6,0x14,0xE8,0x04,0x50,0x10,0x80,0x28, +0xD5,0x2C,0x50,0x00,0xFF,0x69,0xE6,0x14,0xE8,0x03,0x8E,0x34,0xD5,0x26,0x50,0x00, +0xFF,0x55,0xE6,0x14,0xE8,0x22,0x50,0x10,0xFF,0xD8,0xD5,0x1F,0x40,0x10,0x04,0x36, +0x5E,0xF0,0x81,0x00,0xE9,0x03,0x44,0x10,0x00,0xFF,0x50,0x00,0xFF,0xE2,0xE6,0x0A, +0xE8,0x03,0x8C,0x2A,0xD5,0x12,0x50,0x00,0xFF,0xEC,0xE6,0x0A,0xE8,0x03,0x8C,0x34, +0xD5,0x0C,0x50,0x20,0xFF,0xCD,0xE6,0x4A,0xE8,0x03,0x8E,0x2A,0xD5,0x06,0x50,0x20, +0xFF,0xC3,0xE6,0x4A,0x40,0x10,0x3C,0x1B,0x00,0x4F,0x80,0x0C,0x5A,0x48,0x01,0x3B, +0x22,0x0F,0x80,0x04,0x22,0x2F,0x80,0x05,0xCF,0x1F,0x40,0x31,0x20,0x0A,0x54,0x41, +0x80,0x0F,0x40,0x30,0x10,0x0A,0x54,0x31,0x80,0xF0,0xFE,0xE7,0x38,0x34,0x98,0x08, +0x9C,0xF1,0x96,0x00,0x38,0x04,0x8C,0x08,0x9C,0x32,0x96,0x90,0x5E,0xF0,0x80,0xFF, +0x38,0x24,0x80,0x08,0x9C,0x33,0xE9,0x03,0x44,0x10,0x00,0xFE,0x96,0x48,0x38,0x14, +0x80,0x08,0x87,0x81,0xD5,0x17,0x40,0x11,0x20,0x0A,0x54,0x30,0x80,0x0F,0x40,0x10, +0x10,0x0A,0x54,0x10,0x80,0xF0,0xFE,0x5F,0x38,0x14,0xA8,0x08,0x50,0x15,0x00,0x01, +0x96,0x00,0x38,0x04,0x84,0x08,0x50,0x05,0x00,0x02,0x96,0x90,0x38,0x24,0x80,0x08, +0x83,0x84,0x8C,0xC4,0x50,0x84,0x01,0x24,0x8D,0x43,0x5A,0x60,0x29,0x04,0x48,0xFF, +0xFF,0x58,0x80,0x1C,0xFC,0xC2,0xFA,0xB3,0x44,0x22,0x06,0xA4,0x44,0x30,0x04,0xA3, +0x80,0x80,0x0A,0x10,0x00,0x01,0x92,0x28,0x38,0x11,0x14,0x08,0x9C,0x69,0xA7,0x20, +0x8C,0xA2,0x38,0x41,0x04,0x08,0xDB,0xF5,0xDD,0x9E,0x44,0x50,0x04,0xA3,0x44,0x22, +0x06,0xA4,0x44,0x30,0x05,0x07,0x80,0x80,0x0A,0x10,0x00,0x01,0x92,0x28,0x38,0x11, +0x14,0x08,0x9C,0x69,0xA7,0x20,0x8C,0xA2,0x38,0x41,0x04,0x08,0xDB,0xF5,0xDD,0x9E, +0xC8,0x03,0x3E,0x17,0xF1,0x25,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xF3,0xA3,0xFC,0x80, +0xFC,0x00,0x49,0xFF,0xF3,0x9C,0xFC,0x80,0xFC,0x20,0x49,0x00,0x07,0x6D,0x2E,0x17, +0xF7,0x04,0xC9,0x23,0x84,0x52,0x3E,0x27,0xF0,0xFC,0x44,0x32,0x06,0xA4,0x80,0x40, +0x44,0x60,0x00,0x4D,0x84,0x01,0x44,0x50,0x04,0x81,0x2E,0x77,0xEF,0xC8,0x9D,0x01, +0xC7,0x06,0x38,0x11,0x80,0x08,0x38,0x61,0x90,0x08,0xD5,0x07,0xA7,0xD1,0x38,0x71, +0x80,0x08,0xA7,0xD0,0x38,0x71,0x90,0x08,0x8C,0x02,0x8C,0x42,0x4C,0x02,0xFF,0xEF, +0x84,0x20,0x3E,0x17,0xEF,0xC8,0xD5,0x12,0x5A,0x18,0x01,0x13,0x84,0x12,0x3E,0x07, +0xF0,0xFC,0x84,0x40,0x80,0x01,0x44,0x12,0x06,0xA4,0x9C,0xC1,0x38,0x20,0x80,0x08, +0x8C,0x02,0x38,0x20,0x8C,0x08,0x5A,0x08,0x65,0xFA,0x49,0xFF,0xFD,0xFD,0xFC,0xA0, +0xFC,0x00,0x2E,0x07,0xEF,0x14,0x3E,0x07,0xF0,0xFC,0x84,0x01,0x49,0xFF,0xFD,0xF4, +0x49,0xFF,0xF2,0xE5,0xFC,0x80,0xFC,0x00,0x3C,0x13,0xF8,0x7D,0x2E,0x07,0xF6,0x74, +0x96,0x49,0x96,0x00,0x44,0x32,0x0C,0x1C,0x5A,0x18,0x03,0x12,0x5A,0x00,0x53,0x04, +0x48,0x00,0x04,0x50,0x2E,0x07,0xF6,0x75,0x2E,0x17,0xF6,0x76,0x40,0x00,0x20,0x08, +0xFE,0x0F,0x50,0x00,0x7F,0xB8,0xE6,0x01,0x48,0x00,0x02,0x3A,0x5A,0x18,0x01,0x36, +0x5A,0x08,0x01,0x04,0x48,0x00,0x02,0x04,0x5A,0x08,0x03,0x04,0x48,0x00,0x02,0x02, +0x5A,0x08,0x20,0x04,0x48,0x00,0x02,0x00,0x5A,0x08,0x28,0x04,0x48,0x00,0x01,0xFF, +0x5A,0x08,0x21,0x04,0x48,0x00,0x01,0xFE,0x5A,0x08,0x22,0x04,0x48,0x00,0x01,0xFD, +0x5A,0x08,0x23,0x04,0x48,0x00,0x01,0xFC,0x5A,0x08,0x15,0x04,0x48,0x00,0x01,0xFB, +0x5A,0x08,0x17,0x04,0x48,0x00,0x01,0xFA,0x5A,0x08,0x04,0x04,0x48,0x00,0x01,0xF9, +0x5A,0x08,0xF3,0x04,0x48,0x00,0x01,0xF8,0x5A,0x00,0xD0,0x04,0x48,0x00,0x04,0x12, +0x44,0xF0,0x00,0x41,0x48,0x00,0x02,0x04,0x5A,0x18,0x02,0x39,0x5A,0x08,0xF6,0x0C, +0x2E,0x07,0xF6,0x75,0x5A,0x00,0xF2,0x04,0x48,0x00,0x04,0x04,0x44,0xF0,0x00,0x36, +0x48,0x00,0x01,0xF6,0x5A,0x08,0x61,0x13,0x2E,0x17,0xF6,0x75,0x96,0x48,0xC1,0x08, +0x2E,0x17,0xF6,0x75,0x96,0x48,0x5A,0x10,0x01,0x04,0x48,0x00,0x01,0xD8,0x44,0x00, +0x01,0x00,0x49,0xFF,0xE5,0x03,0x48,0x00,0x01,0xD2,0x5A,0x00,0x62,0x04,0x48,0x00, +0x03,0xE9,0x2E,0x07,0xF6,0x75,0x96,0x00,0xC0,0x0D,0x2E,0x07,0xF6,0x75,0x96,0x00, +0x5A,0x00,0x01,0x09,0x2E,0x07,0xF6,0x75,0x96,0x00,0x5A,0x00,0x02,0x04,0x48,0x00, +0x01,0xC1,0x49,0xFF,0xF2,0x00,0x48,0x00,0x01,0xBD,0x5A,0x18,0x10,0x68,0x5A,0x00, +0xF1,0x04,0x48,0x00,0x03,0xD6,0x84,0x00,0x44,0x12,0x06,0x90,0x38,0x21,0x80,0x00, +0x38,0x20,0x80,0x08,0x8C,0x01,0x5A,0x08,0x10,0xFB,0x2E,0x07,0xF6,0x75,0x2E,0x57, +0xF6,0x76,0x96,0x00,0x96,0x68,0x40,0x50,0x20,0x08,0x5A,0x00,0x10,0x06,0x5A,0x00, +0x1D,0x04,0xFF,0x4F,0xD5,0x02,0x97,0x69,0x44,0x00,0x1D,0x00,0xD0,0x3B,0x5C,0xF2, +0x9D,0x01,0xE8,0x1B,0x44,0x00,0x04,0x00,0x4C,0x50,0x03,0xAF,0x5C,0xF2,0x84,0x01, +0xE8,0x09,0x5A,0x51,0x00,0x04,0x48,0x00,0x03,0xA5,0x44,0xF0,0x00,0x1C,0x48,0x00, +0x01,0x97,0x44,0x00,0x05,0x00,0xD0,0x22,0x44,0x00,0x08,0x00,0x4C,0x50,0x43,0x9A, +0x44,0xF0,0x00,0x24,0x48,0x00,0x01,0x8C,0x44,0x00,0x32,0x00,0xD0,0x1F,0x5C,0xF2, +0xB2,0x01,0xE8,0x09,0x44,0x00,0x30,0x00,0x4C,0x50,0x43,0x8C,0x44,0xF0,0x00,0x3C, +0x48,0x00,0x01,0x7E,0x44,0x00,0x33,0x00,0xD0,0x15,0x44,0x00,0x34,0x00,0x4C,0x50, +0x43,0x81,0x44,0xF0,0x00,0x3B,0x48,0x00,0x01,0x73,0x44,0xF0,0x00,0x20,0x48,0x00, +0x01,0x6F,0x44,0xF0,0x00,0x37,0x48,0x00,0x01,0x6B,0x44,0xF0,0x00,0x38,0x48,0x00, +0x01,0x67,0x44,0xF0,0x00,0x3A,0x48,0x00,0x01,0x63,0x5A,0x00,0x01,0x04,0x48,0x00, +0x03,0x69,0x2E,0x07,0xF6,0x75,0x5A,0x00,0x0A,0x04,0x48,0x00,0x03,0x63,0x2E,0x07, +0xF6,0x76,0x5A,0x08,0x08,0x15,0x5A,0x18,0x06,0x13,0x2E,0x37,0xF6,0x77,0x2E,0x07, +0xF6,0x78,0x2E,0x27,0xF6,0x79,0x40,0x00,0x20,0x08,0x88,0x03,0x40,0x21,0x40,0x08, +0x88,0x02,0x3C,0x0F,0xFB,0xC4,0x44,0xF0,0x00,0x14,0xD5,0x02,0x85,0xE0,0x2E,0x27, +0xF6,0x76,0x5A,0x28,0x09,0x1A,0x5A,0x18,0x04,0x18,0x2E,0x17,0xF6,0x77,0x5A,0x18, +0x01,0x04,0x48,0x00,0x01,0x2A,0x2E,0x17,0xF6,0x77,0x5A,0x18,0x02,0x04,0x48,0x00, +0x01,0x27,0x2E,0x17,0xF6,0x77,0x5A,0x10,0x03,0x04,0x48,0x00,0x01,0x29,0x44,0xF0, +0x00,0x17,0x48,0x00,0x01,0x25,0x2E,0x27,0xF6,0x76,0x5A,0x28,0x10,0x28,0x5A,0x18, +0x06,0x26,0x2E,0x17,0xF6,0x77,0x5A,0x10,0x01,0x06,0x2E,0x17,0xF6,0x77,0x5A,0x18, +0x02,0x0D,0x2E,0x27,0xF6,0x78,0x2E,0x17,0xF6,0x79,0x40,0x10,0xA0,0x08,0x88,0x22, +0x3C,0x1B,0xF7,0x87,0x48,0x00,0x01,0x0C,0x2E,0x17,0xF6,0x77,0x5A,0x10,0x03,0x04, +0x48,0x00,0x01,0x06,0x2E,0x27,0xF6,0x78,0x2E,0x17,0xF6,0x79,0x40,0x10,0xA0,0x08, +0x88,0x22,0x3C,0x1B,0xF7,0x86,0x48,0x00,0x00,0xFB,0x2E,0x27,0xF6,0x76,0x5A,0x28, +0x11,0x1A,0x5A,0x18,0x04,0x18,0x2E,0x17,0xF6,0x77,0x5A,0x18,0x01,0x04,0x48,0x00, +0x00,0xEA,0x2E,0x17,0xF6,0x77,0x5A,0x18,0x02,0x04,0x48,0x00,0x00,0xE7,0x2E,0x17, +0xF6,0x77,0x5A,0x10,0x03,0x04,0x48,0x00,0x00,0xE3,0x44,0xF0,0x00,0x1A,0x48,0x00, +0x00,0xDF,0x2E,0x27,0xF6,0x76,0x5A,0x20,0x12,0x04,0x48,0x00,0x00,0xD9,0x5A,0x10, +0x19,0x04,0x48,0x00,0x00,0xD5,0x2E,0x17,0xF6,0x77,0x5A,0x18,0x01,0x46,0x2E,0x17, +0xF6,0x78,0x3E,0x17,0xEE,0x20,0x2E,0x17,0xF6,0x79,0x3E,0x17,0xEE,0x22,0x2E,0x17, +0xF6,0x7A,0x3E,0x17,0xEE,0x21,0x2E,0x17,0xF6,0x7B,0x2E,0x27,0xF6,0x7C,0x40,0x10, +0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x0F,0x2E,0x17,0xF6,0x7D,0x2E,0x27,0xF6,0x7E, +0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x0E,0x2E,0x17,0xF6,0x7F,0x2E,0x27, +0xF6,0x80,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x12,0x2E,0x17,0xF6,0x81, +0x2E,0x27,0xF6,0x82,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x13,0x2E,0x17, +0xF6,0x83,0x2E,0x27,0xF6,0x84,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x14, +0x2E,0x17,0xF6,0x85,0x2E,0x27,0xF6,0x86,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B, +0xF7,0x15,0x48,0x00,0x00,0x8D,0x2E,0x17,0xF6,0x77,0x5A,0x18,0x02,0x04,0x48,0x00, +0x00,0x87,0x2E,0x17,0xF6,0x77,0x5A,0x10,0x03,0x04,0x48,0x00,0x00,0x81,0x2E,0x17, +0xF6,0x78,0x3E,0x17,0xEE,0x14,0x2E,0x17,0xF6,0x79,0x3E,0x17,0xEE,0x15,0x2E,0x17, +0xF6,0x7A,0x3E,0x17,0xEE,0x16,0x2E,0x17,0xF6,0x7B,0x2E,0x27,0xF6,0x7C,0x40,0x10, +0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x08,0x2E,0x17,0xF6,0x7D,0x2E,0x27,0xF6,0x7E, +0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x09,0x2E,0x17,0xF6,0x7F,0x2E,0x27, +0xF6,0x80,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x04,0x2E,0x17,0xF6,0x81, +0x2E,0x27,0xF6,0x82,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x05,0x2E,0x17, +0xF6,0x83,0x2E,0x27,0xF6,0x84,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B,0xF7,0x06, +0x2E,0x17,0xF6,0x85,0x2E,0x27,0xF6,0x86,0x40,0x10,0xA0,0x08,0x88,0x22,0x3C,0x1B, +0xF7,0x07,0x2E,0x17,0xF6,0x87,0x3E,0x17,0xEE,0x17,0x2E,0x17,0xF6,0x88,0x3E,0x17, +0xEE,0x18,0x2E,0x17,0xF6,0x89,0x3E,0x17,0xEE,0x19,0xD5,0x31,0x85,0xE2,0xD5,0x2F, +0x85,0xE5,0xD5,0x2D,0x44,0xF0,0x00,0x29,0xD5,0x2A,0x44,0xF0,0x00,0x2D,0xD5,0x27, +0x44,0xF0,0x00,0x2A,0xD5,0x24,0x44,0xF0,0x00,0x2B,0xD5,0x21,0x44,0xF0,0x00,0x2C, +0xD5,0x1E,0x44,0xF0,0x00,0x2E,0xD5,0x1B,0x44,0xF0,0x00,0x2F,0xD5,0x18,0x44,0xF0, +0x00,0x42,0xD5,0x15,0x44,0xF0,0x00,0x30,0xD5,0x12,0x44,0xF0,0x00,0x3F,0xD5,0x0F, +0x44,0xF0,0x00,0x40,0xD5,0x0C,0x44,0xF0,0x00,0x15,0xD5,0x09,0x44,0xF0,0x00,0x16, +0xD5,0x06,0x44,0xF0,0x00,0x18,0xD5,0x03,0x44,0xF0,0x00,0x19,0x84,0x20,0x3C,0x1F, +0xFB,0x8C,0x5A,0xF8,0x01,0x1B,0x44,0x0F,0xFF,0xA7,0x3E,0x07,0xF0,0xFC,0x84,0x05, +0x3E,0x07,0xF0,0xFD,0xFA,0x0C,0x3E,0x07,0xF0,0xFE,0xFA,0x22,0xFA,0x10,0x3E,0x07, +0xF0,0xFF,0x3E,0x07,0xF1,0x00,0x3E,0x17,0xF1,0x01,0x3E,0x07,0xF1,0x02,0x3E,0x17, +0xF1,0x03,0x84,0x08,0x48,0x00,0x01,0xE1,0x5A,0xF8,0x02,0x30,0x2E,0x07,0xF7,0x06, +0x44,0x1F,0xFF,0x81,0x3E,0x17,0xF0,0xFC,0x3E,0x07,0xF0,0xFD,0xC8,0x0D,0x44,0x10, +0x00,0x5A,0x3E,0x17,0xF0,0xFE,0x3E,0x07,0xF0,0xFF,0xFA,0x1B,0x3E,0x07,0xF1,0x00, +0x84,0x05,0x48,0x00,0x01,0xCA,0x44,0x0F,0xFF,0xA7,0x3E,0x07,0xF0,0xFE,0x84,0x05, +0x3E,0x07,0xF0,0xFF,0xFA,0x0C,0x3E,0x07,0xF1,0x00,0xFA,0x22,0xFA,0x10,0x3E,0x07, +0xF1,0x01,0x3E,0x17,0xF1,0x02,0x3E,0x07,0xF1,0x03,0x3E,0x17,0xF1,0x04,0x3E,0x07, +0xF1,0x05,0x84,0x0A,0x48,0x00,0x01,0xB1,0x5A,0xF8,0x05,0x0A,0x84,0x01,0x3E,0x07, +0xF0,0xFC,0x3E,0x17,0xF0,0xFD,0x3E,0x17,0xF0,0xFE,0xD5,0x64,0x5A,0xF8,0x29,0x26, +0xFA,0x10,0x84,0x7F,0x84,0x47,0x3E,0x07,0xF0,0xFC,0x3E,0x17,0xF0,0xFD,0x3E,0x17, +0xF0,0xFE,0x3E,0x37,0xF0,0xFF,0x3E,0x27,0xF1,0x00,0x3E,0x37,0xF1,0x01,0x3E,0x27, +0xF1,0x02,0x84,0x6A,0xFA,0x42,0x3E,0x27,0xF1,0x03,0x3E,0x07,0xF1,0x04,0x3E,0x37, +0xF1,0x05,0x3E,0x17,0xF1,0x06,0x3E,0x27,0xF1,0x07,0x3E,0x07,0xF1,0x08,0x3E,0x17, +0xF1,0x09,0x84,0x0E,0x48,0x00,0x01,0x81,0x5A,0xF8,0x2A,0x1D,0xFA,0x11,0x3E,0x07, +0xF0,0xFC,0x44,0x2F,0xFF,0x81,0x84,0x08,0xFA,0x6A,0x3E,0x27,0xF0,0xFD,0x3E,0x07, +0xF0,0xFE,0x3E,0x17,0xF0,0xFF,0x3E,0x37,0xF1,0x00,0x3E,0x27,0xF1,0x01,0x3E,0x07, +0xF1,0x02,0x84,0x01,0x3E,0x17,0xF1,0x03,0x3E,0x07,0xF1,0x04,0x84,0x09,0x48,0x00, +0x01,0x64,0x5A,0xF8,0x2B,0x10,0xFA,0x12,0x3E,0x07,0xF0,0xFC,0x84,0x05,0x3E,0x07, +0xF0,0xFD,0x84,0x04,0x3E,0x07,0xF0,0xFE,0x3E,0x17,0xF0,0xFF,0x84,0x04,0x48,0x00, +0x01,0x54,0x5A,0xF8,0x42,0x05,0x2E,0x00,0x01,0x84,0xD5,0x17,0x5A,0xF8,0x2C,0x0E, +0xFA,0x13,0x3E,0x07,0xF0,0xFC,0x84,0x01,0x3E,0x07,0xF0,0xFD,0x3E,0x17,0xF0,0xFE, +0x84,0x06,0x3E,0x07,0xF0,0xFF,0xD5,0xEB,0x5A,0xF8,0x2E,0x05,0x3E,0x17,0xF0,0xFC, +0xD5,0x06,0x5A,0xF8,0x2F,0x08,0x84,0x00,0x3E,0x07,0xF0,0xFC,0x84,0x01,0x48,0x00, +0x01,0x34,0x5A,0xF8,0x2D,0x2F,0xFA,0x18,0x3E,0x07,0xF0,0xFC,0x84,0x62,0x84,0x00, +0x84,0x26,0x84,0x4C,0x3E,0x37,0xF0,0xFD,0x3E,0x07,0xF0,0xFE,0x3E,0x17,0xF0,0xFF, +0x3E,0x27,0xF1,0x00,0x3E,0x37,0xF1,0x01,0x3E,0x07,0xF1,0x02,0x84,0x64,0x3E,0x17, +0xF1,0x03,0x3E,0x27,0xF1,0x04,0x84,0x41,0x3E,0x27,0xF1,0x05,0x3E,0x07,0xF1,0x06, +0x3E,0x37,0xF1,0x07,0x3E,0x37,0xF1,0x08,0x3E,0x27,0xF1,0x09,0x3E,0x07,0xF1,0x0A, +0x84,0x03,0x3E,0x07,0xF1,0x0B,0x3E,0x17,0xF1,0x0C,0xFA,0x01,0x48,0x00,0x01,0x05, +0x5A,0xF8,0x1B,0x0A,0x84,0x01,0x3E,0x07,0xF7,0x06,0x84,0x01,0x49,0xFF,0xED,0xB1, +0x48,0x00,0x01,0x04,0x5A,0xF8,0x30,0x06,0x49,0xFF,0xFC,0x9C,0x48,0x00,0x00,0xFE, +0x5A,0xF8,0x36,0x06,0x49,0xFF,0xFC,0x5A,0x48,0x00,0x00,0xF8,0x5A,0xF8,0x41,0x0E, +0x44,0x0F,0xFF,0xD0,0x3E,0x07,0xF0,0xFC,0x3C,0x03,0xF8,0x6F,0x96,0x40,0x3E,0x17, +0xF0,0xFD,0x92,0x08,0x48,0x00,0x00,0xDE,0x5A,0xF8,0x1C,0x08,0x44,0x00,0x00,0x50, +0x3E,0x07,0xEF,0x14,0x84,0x01,0xD5,0x38,0x5A,0xF8,0x1F,0x08,0x44,0x00,0x00,0x50, +0x3E,0x07,0xEF,0x14,0x84,0x04,0xD5,0x30,0x5A,0xF8,0x20,0x08,0x44,0x00,0x00,0x50, +0x3E,0x07,0xEF,0x14,0x84,0x05,0xD5,0x28,0x5A,0xF8,0x24,0x08,0x44,0x00,0x00,0x50, +0x3E,0x07,0xEF,0x14,0x84,0x09,0xD5,0x20,0x5A,0xF8,0x37,0x08,0x44,0x00,0x00,0x50, +0x3E,0x07,0xEF,0x14,0x84,0x0F,0xD5,0x18,0x5A,0xF8,0x38,0x08,0x44,0x00,0x00,0x50, +0x3E,0x07,0xEF,0x14,0xFA,0x00,0xD5,0x10,0x5A,0xF8,0x3A,0x08,0x44,0x00,0x00,0x50, +0x3E,0x07,0xEF,0x14,0xFA,0x02,0xD5,0x08,0x5A,0xF8,0x3B,0x0B,0x44,0x00,0x00,0x50, +0x3E,0x07,0xEF,0x14,0xFA,0x03,0x3E,0x07,0xF7,0x05,0x48,0x00,0x00,0xA7,0x5A,0xF0, +0x3C,0x04,0x48,0x00,0x00,0x8A,0x84,0x11,0x3E,0x07,0xF0,0xFC,0x44,0x00,0x00,0x30, +0x3E,0x07,0xF0,0xFD,0x84,0x01,0x3E,0x07,0xF0,0xFE,0x44,0x00,0x00,0x64,0x3E,0x07, +0xF0,0xFF,0x84,0x00,0x3E,0x07,0xF1,0x00,0x84,0x1F,0x3E,0x07,0xF1,0x01,0x3E,0x07, +0xF1,0x02,0x46,0x00,0x00,0x81,0x44,0x10,0x00,0x9C,0x04,0x00,0x00,0x19,0x85,0xEA, +0x40,0x00,0x3C,0x08,0x92,0x0F,0xFE,0x0C,0x50,0x00,0x03,0xA8,0x40,0x00,0x3C,0x17, +0x8C,0x19,0x44,0xF0,0x03,0xE8,0x40,0x00,0x3C,0x17,0x96,0x01,0x84,0x27,0x5C,0xF0, +0x07,0xD0,0x3E,0x17,0xF1,0x03,0x80,0x20,0xE8,0x03,0x44,0x10,0x07,0xD0,0x96,0x48, +0x3E,0x17,0xF1,0x04,0x84,0x10,0x84,0x20,0x3E,0x17,0xF1,0x05,0x84,0x41,0x3E,0x07, +0xF1,0x06,0x44,0x4F,0xFF,0x90,0x84,0x1F,0x84,0x6A,0x3E,0x37,0xF1,0x07,0x3E,0x07, +0xF1,0x08,0x3E,0x07,0xF1,0x09,0x3E,0x27,0xF1,0x0A,0x3E,0x47,0xF1,0x0B,0x3E,0x07, +0xF1,0x0C,0x3E,0x07,0xF1,0x0D,0x3E,0x27,0xF1,0x0E,0x3E,0x47,0xF1,0x0F,0x44,0x4F, +0xFF,0xC0,0x3E,0x27,0xF1,0x10,0x3E,0x47,0xF1,0x11,0x84,0x82,0x3E,0x47,0xF1,0x12, +0x44,0x4F,0xFF,0x80,0x3E,0x47,0xF1,0x13,0x84,0x8F,0x3E,0x17,0xF1,0x14,0x3E,0x17, +0xF1,0x15,0x3E,0x17,0xF1,0x16,0x3E,0x27,0xF1,0x17,0x3E,0x47,0xF1,0x18,0x84,0x84, +0x3E,0x47,0xF1,0x19,0xFA,0x9D,0x3E,0x47,0xF1,0x1A,0x3E,0x37,0xF1,0x1B,0x3E,0x27, +0xF1,0x1C,0x84,0x4C,0x3E,0x27,0xF1,0x1D,0x84,0x46,0x3E,0x27,0xF1,0x1E,0x3E,0x17, +0xF1,0x1F,0x3E,0x07,0xF1,0x20,0x3E,0x07,0xF1,0x21,0x3E,0x07,0xF1,0x22,0x3E,0x07, +0xF1,0x23,0xFA,0x18,0xD5,0x11,0x5A,0xF8,0x3D,0x15,0x84,0x0F,0x3E,0x07,0xF0,0xFC, +0x84,0x01,0x3E,0x07,0xF0,0xFD,0x44,0x04,0x50,0x28,0xB4,0x00,0x92,0x01,0x96,0x06, +0x3E,0x07,0xF0,0xFE,0x84,0x03,0x49,0xFF,0xF9,0x9F,0x49,0xFF,0xEE,0x90,0xD5,0x05, +0x5A,0xF8,0x3E,0x04,0x49,0xFF,0xF8,0x6D,0x84,0x01,0x3C,0x0F,0xFB,0x8C,0xFC,0x80, +0x85,0xE0,0x48,0xFF,0xFD,0xF5,0x44,0xF0,0x00,0x1F,0x48,0xFF,0xFD,0xF1,0x5A,0x08, +0x0F,0xF5,0x2E,0x07,0xF6,0x75,0x5A,0x00,0x01,0x0E,0x2E,0x07,0xF6,0x75,0x5A,0x08, +0x02,0xF1,0x2E,0x07,0xF6,0x77,0x3E,0x07,0xF0,0xE4,0x44,0xF0,0x00,0x3E,0x48,0xFF, +0xFD,0xDF,0x44,0xF0,0x00,0x3D,0x48,0xFF,0xFD,0xDB,0xFC,0x00,0x2E,0x07,0xEF,0x14, +0x5A,0x08,0x52,0x06,0x44,0x00,0x00,0x51,0x3E,0x07,0xEF,0x14,0x2E,0x07,0xF7,0x05, +0x5A,0x08,0x01,0x08,0x84,0xC0,0x3E,0x67,0xF7,0x04,0x49,0x00,0x07,0xC6,0xD5,0x32, +0x5A,0x08,0x04,0x08,0x84,0xC0,0x3E,0x67,0xF7,0x04,0x49,0x00,0x09,0xD3,0xD5,0x2A, +0x5A,0x08,0x05,0x08,0x84,0xC0,0x3E,0x67,0xF7,0x04,0x49,0x00,0x0D,0x94,0xD5,0x22, +0x5A,0x00,0x09,0xFA,0x5A,0x08,0x0F,0x0E,0x2E,0x07,0xF6,0x76,0x84,0xC0,0x2E,0x17, +0xF6,0x77,0x2E,0x27,0xF6,0x78,0x3E,0x67,0xF7,0x04,0x49,0x00,0x0F,0x1E,0xD5,0x12, +0x54,0x10,0x00,0xFD,0x5A,0x18,0x10,0x08,0x84,0xC0,0x3E,0x67,0xF7,0x04,0x49,0x00, +0x10,0x9B,0xD5,0x08,0x5A,0x08,0x13,0x09,0x84,0xC0,0x3E,0x67,0xF7,0x04,0x49,0x00, +0x12,0xEB,0x3E,0x67,0xF7,0x05,0xFC,0x80,0xFC,0x00,0x44,0x00,0x00,0x64,0x49,0xFF, +0xDD,0x6A,0x44,0x00,0x23,0x56,0x49,0xFF,0xDD,0x71,0x44,0x00,0x1F,0x57,0x49,0xFF, +0xDD,0x78,0x44,0x00,0x01,0x90,0x49,0xFF,0xDD,0x7F,0xFC,0x80,0xFC,0x40,0x51,0xFF, +0xFA,0xE0,0x84,0x20,0xFA,0x50,0xB0,0x10,0x49,0x00,0x1C,0x9C,0xB1,0x98,0x44,0x02, +0x01,0x60,0x80,0x26,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x00, +0xB1,0xE0,0x44,0x02,0x01,0x80,0x3A,0x20,0x94,0x20,0x80,0x27,0x3A,0x20,0x14,0x04, +0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x00,0x3A,0x20,0x94,0x20,0x44,0x12,0x01,0xA0, +0xB0,0x0C,0x3A,0x20,0x94,0x00,0x44,0x12,0x01,0xB0,0x3A,0x20,0x14,0x20,0xB0,0x07, +0x3A,0x20,0x8C,0x00,0x3A,0x20,0x0C,0x20,0x44,0x02,0x01,0xB8,0x50,0x8F,0x80,0x24, +0x3A,0x20,0x10,0x00,0x3A,0x24,0x10,0x20,0x85,0x40,0x39,0xC4,0x28,0x00,0x40,0x0E, +0x00,0x13,0xC0,0x13,0x5A,0x00,0x03,0x12,0xB0,0x10,0x38,0x00,0x72,0x02,0xC8,0x0D, +0x38,0x03,0x72,0x02,0x40,0x90,0x04,0x08,0x49,0xFF,0xED,0x53,0x49,0xFF,0xF0,0x7A, +0xB0,0x50,0x88,0x09,0x38,0x00,0xF2,0x0A,0x8D,0x41,0x5A,0xA8,0x0C,0xE8,0x84,0xC0, +0xB0,0x10,0x38,0x00,0x1A,0x02,0xF0,0x81,0xC8,0x07,0x8C,0xC1,0x5A,0x68,0x08,0xFA, +0x51,0xFF,0x85,0x20,0xFC,0xC0,0xB0,0x07,0x87,0x80,0x38,0xA3,0x00,0x00,0x40,0x95, +0x04,0x08,0x40,0x04,0x80,0x13,0xF0,0x82,0x94,0x01,0xF0,0x83,0x40,0xFE,0x24,0x07, +0xE8,0xED,0x4F,0xC3,0x00,0x13,0x38,0x83,0x9A,0x01,0x49,0xFF,0xDC,0x0A,0x44,0x20, +0x01,0x20,0x80,0x28,0x42,0x10,0x08,0x73,0xB0,0x0C,0x96,0x49,0x38,0x20,0x19,0x01, +0xB0,0x28,0x92,0x42,0x49,0xFF,0xDC,0x64,0x4D,0xC5,0x40,0x14,0x38,0x83,0x9A,0x01, +0x49,0xFF,0xDB,0xF7,0x44,0x20,0x01,0x20,0x50,0x14,0x02,0x40,0x42,0x10,0x08,0x73, +0xB0,0x0C,0x96,0x49,0x38,0x20,0x19,0x01,0xB0,0x28,0x92,0x42,0x49,0xFF,0xDC,0x50, +0x40,0x14,0xF0,0x01,0x8E,0x21,0x94,0x4C,0x40,0x0E,0x00,0x13,0x97,0x49,0x40,0x1E, +0x28,0x06,0x94,0xC4,0x84,0x40,0xF1,0x84,0x50,0x8F,0x80,0xA0,0xF4,0x04,0x40,0x11, +0x04,0x09,0xC4,0x03,0x88,0x23,0xD5,0x03,0x88,0x25,0x96,0x49,0x38,0x44,0x06,0x02, +0x54,0xF2,0x00,0x1F,0x5A,0xF0,0x1F,0x1A,0x40,0xF2,0x18,0x09,0x54,0xF7,0x80,0x1F, +0x5A,0xF0,0x1F,0x14,0x04,0xFF,0x80,0x01,0x39,0xE7,0x81,0x01,0x50,0xFF,0x5D,0xEB, +0x5C,0xF7,0x82,0x13,0xE9,0x06,0x50,0xFF,0x64,0x27,0x5C,0xF7,0x82,0x13,0xE8,0x05, +0x50,0x42,0x00,0x41,0x38,0x44,0x06,0x0A,0x38,0x44,0x06,0x02,0x40,0xF2,0x48,0x09, +0x54,0xF7,0x80,0x1F,0x5A,0xF0,0x1F,0x21,0x40,0xF2,0x30,0x09,0x54,0xF7,0x80,0x1F, +0x5A,0xF0,0x1F,0x1B,0x04,0xFF,0x80,0x02,0x05,0xEF,0x80,0x01,0x40,0xF0,0x3C,0x00, +0x40,0xF7,0x80,0x13,0x39,0xEF,0x3D,0x01,0x50,0xFF,0x5D,0xEB,0x5C,0xF7,0x82,0x13, +0xE9,0x06,0x50,0xFF,0x64,0x27,0x5C,0xF7,0x82,0x13,0xE8,0x06,0x44,0xF4,0x10,0x00, +0x88,0x8F,0x38,0x44,0x06,0x0A,0xF1,0x03,0x8C,0x42,0x88,0x01,0x96,0x90,0x96,0x01, +0x5A,0x28,0x20,0xAE,0x50,0x5E,0x00,0x01,0x4C,0x55,0x40,0x16,0x38,0x13,0x9A,0x01, +0xF5,0x85,0xF1,0x84,0x49,0xFF,0xDB,0x7D,0x44,0x20,0x01,0x20,0xF1,0x04,0x42,0x10, +0x08,0x73,0xB0,0x0C,0x96,0x49,0x38,0x20,0x19,0x01,0x80,0x08,0x92,0x42,0x49,0xFF, +0xDB,0xF3,0xF5,0x05,0x4C,0x54,0xC0,0x16,0x38,0x13,0x9A,0x01,0xF1,0x84,0x49,0xFF, +0xDB,0x68,0xF1,0x04,0x44,0x20,0x01,0x20,0x50,0x10,0x82,0x40,0x42,0x10,0x08,0x73, +0xB0,0x0C,0x96,0x49,0x38,0x20,0x19,0x01,0x80,0x08,0x92,0x42,0x49,0xFF,0xDB,0xDC, +0x50,0x5E,0x00,0x01,0x55,0xC2,0x80,0xFF,0x48,0xFF,0xFF,0x42,0xFC,0x49,0x44,0x12, +0x01,0xC4,0xB1,0x86,0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20, +0x8C,0x00,0x3A,0x20,0x0C,0x20,0x84,0x20,0xB0,0x0C,0xFA,0x48,0x49,0x00,0x1B,0x6A, +0x84,0x21,0x10,0x1F,0x80,0x31,0x10,0x1F,0x80,0x3D,0x84,0x02,0x44,0x12,0x01,0xDC, +0x10,0x0F,0x80,0x32,0x10,0x0F,0x80,0x3E,0x80,0x01,0x80,0x9F,0x3A,0x20,0x0C,0x04, +0x3A,0x22,0x0C,0x24,0xB1,0xC3,0x3A,0x20,0x8C,0x04,0xA4,0x00,0x80,0x27,0xAC,0x20, +0x3A,0x20,0x8C,0x24,0xAC,0x08,0x80,0x06,0x49,0xFF,0xE1,0xAC,0xB0,0x0C,0x49,0xFF, +0xE1,0xFC,0x80,0x1F,0x49,0xFF,0xE1,0xBF,0x80,0x07,0x81,0x3F,0x49,0xFF,0xE2,0x0E, +0xFC,0xC9,0xFC,0x26,0x44,0x12,0x01,0xE8,0x80,0xDF,0x3A,0x20,0x94,0x04,0x3A,0x23, +0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x23,0x14,0x24,0x3A,0x20,0x94,0x00,0x80,0x1F, +0x80,0xE6,0x3A,0x23,0x14,0x20,0x49,0xFF,0xE1,0x57,0xFC,0xA6,0xFC,0x2C,0x44,0x12, +0x02,0x18,0xB1,0x8C,0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20, +0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x00,0x3A,0x20,0x14,0x20,0x84,0x20, +0xB0,0x06,0xFA,0x48,0x49,0x00,0x1B,0x16,0xB1,0xC1,0x44,0x12,0x02,0x48,0x80,0x07, +0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0xB4,0x21,0xB6,0x20,0x80,0x06,0x49,0xFF, +0xE1,0x33,0xB0,0x06,0x49,0xFF,0xE1,0x4D,0x80,0x07,0x49,0xFF,0xE1,0x37,0xFC,0xAC, +0xFC,0x01,0x44,0x12,0x02,0x5C,0x80,0x1F,0x3A,0x20,0x8C,0x00,0x3A,0x2F,0x8C,0x20, +0x49,0xFF,0xE1,0x36,0xFC,0x81,0xFC,0x00,0xC8,0x04,0x49,0xFF,0xFE,0x3F,0xFC,0x80, +0x44,0x00,0x00,0x64,0x49,0xFF,0xDB,0xA7,0x44,0x00,0x13,0xA6,0x49,0xFF,0xDB,0xAE, +0x44,0x00,0x0F,0xA6,0x49,0xFF,0xDB,0xB5,0x44,0x00,0x01,0x90,0x49,0xFF,0xDB,0xBC, +0xFC,0x80,0xFC,0x00,0xE6,0x06,0xE8,0x06,0x44,0x12,0x02,0xFC,0x38,0x00,0x80,0x00, +0xD5,0x02,0x84,0x00,0x49,0xFF,0xDB,0xC6,0xFC,0x80,0xFC,0x00,0xE6,0x06,0xE8,0x06, +0x44,0x12,0x02,0xF4,0x38,0x00,0x80,0x00,0xD5,0x02,0x84,0x00,0x8C,0x01,0x96,0x00, +0x49,0xFF,0xDB,0xAD,0xFC,0x80,0xFC,0x00,0x5A,0x00,0x01,0x0E,0xC0,0x04,0x5A,0x00, +0x02,0x1C,0xFC,0x80,0x84,0x00,0x49,0xFF,0xE7,0x8C,0x2E,0x07,0xF7,0x12,0x49,0xFF, +0xFF,0xC4,0xD5,0x2A,0x49,0xFF,0xE7,0x85,0x44,0x00,0x00,0x64,0x49,0xFF,0xDB,0x6B, +0x44,0x00,0x23,0x96,0x49,0xFF,0xDB,0x72,0x44,0x00,0x23,0x96,0x49,0xFF,0xDB,0x79, +0x44,0x00,0x01,0x90,0xD5,0x17,0x84,0x01,0x49,0xFF,0xE7,0x73,0x44,0x00,0x03,0xE8, +0x49,0xFF,0xDB,0x59,0x44,0x00,0x27,0x10,0x49,0xFF,0xDB,0x6B,0x46,0x20,0x00,0x81, +0x46,0x12,0x71,0x00,0x83,0x82,0xB8,0x10,0x96,0x01,0xFE,0x0F,0xB8,0x90,0x44,0x00, +0x27,0x10,0x49,0xFF,0xDB,0x69,0x84,0x00,0x49,0xFF,0xFF,0xB9,0xFC,0x80,0x00,0x00, +0xE6,0x04,0xE8,0x24,0xFC,0x00,0x44,0xF0,0x4D,0x54,0x38,0x07,0x80,0x00,0x40,0xF0, +0x3C,0x00,0xDD,0x0F,0x04,0x14,0x1E,0x22,0x84,0x00,0x49,0xFF,0xDE,0x4D,0x84,0x01, +0x49,0xFF,0xDE,0x38,0x84,0x01,0xD5,0x0F,0x84,0x00,0x49,0xFF,0xDE,0x45,0x84,0x01, +0xD5,0x07,0x84,0x01,0xD5,0x02,0x84,0x00,0x49,0xFF,0xDE,0x3E,0x84,0x00,0x49,0xFF, +0xDE,0x29,0x84,0x00,0x49,0xFF,0xDE,0x2F,0xFC,0x80,0xDD,0x9E,0xFC,0x00,0x49,0xFF, +0xEB,0x58,0x80,0x60,0x3E,0x00,0x01,0x80,0x44,0x12,0x0E,0x28,0x44,0x02,0x12,0xA8, +0x44,0x20,0x02,0x40,0x2E,0x47,0xF7,0x11,0x49,0xFF,0xF3,0x33,0xFC,0x80,0x44,0x02, +0x12,0xA8,0xDD,0x9E,0x44,0x02,0x0E,0x28,0xDD,0x9E,0x44,0x02,0x0C,0xBC,0xDD,0x9E, +0xFC,0x00,0xC0,0x02,0x84,0x01,0x49,0xFF,0xDB,0x59,0x84,0x00,0x49,0xFF,0xDB,0x48, +0xFC,0x80,0xFC,0x00,0x84,0x00,0x80,0x20,0x49,0xFF,0xDD,0x58,0x84,0x00,0x84,0x21, +0x49,0xFF,0xDD,0x54,0xFC,0x80,0xFC,0x00,0x84,0x01,0x84,0x20,0x49,0xFF,0xDD,0x4E, +0x84,0x01,0x80,0x20,0x49,0xFF,0xDD,0x4A,0xFC,0x80,0xFC,0x49,0x80,0x20,0x44,0x02, +0x02,0x64,0x50,0xAF,0x80,0x0C,0x3A,0x20,0x10,0x00,0x44,0x02,0x02,0x70,0x3A,0x2F, +0x90,0x20,0x3A,0x20,0x10,0x00,0x3A,0x25,0x10,0x20,0x44,0x22,0x02,0x7C,0xB0,0x06, +0x3A,0x21,0x10,0x00,0x3A,0x20,0x10,0x20,0x44,0x22,0x02,0x88,0x50,0x9F,0x80,0x24, +0x3A,0x21,0x10,0x00,0x3A,0x24,0x90,0x20,0x44,0x22,0x01,0xB8,0xB1,0xCC,0x3A,0x21, +0x10,0x00,0x3A,0x23,0x90,0x20,0x44,0x22,0x02,0x94,0xB1,0x8F,0x3A,0x21,0x10,0x00, +0x80,0xBF,0x3A,0x23,0x10,0x20,0xC9,0x03,0x80,0x05,0xD5,0x12,0x5A,0x18,0x01,0x04, +0x80,0x0A,0xD5,0x0E,0x5A,0x10,0x02,0x0D,0x5A,0x18,0x03,0x04,0x80,0x09,0xD5,0x08, +0x5A,0x18,0x04,0x04,0x80,0x07,0xD5,0x04,0x5A,0x18,0x05,0x06,0x80,0x06,0x49,0xFF, +0xDA,0x60,0xFC,0xC9,0x5A,0x10,0x06,0xEA,0xFC,0xC9,0xFC,0x03,0x84,0x20,0x84,0x4C, +0x80,0xC0,0x80,0x1F,0x49,0x00,0x19,0xDE,0x44,0x12,0x02,0xA0,0xB0,0x03,0x3A,0x20, +0x90,0x00,0x3A,0x20,0x10,0x20,0xCE,0x03,0x80,0x1F,0xD5,0x03,0x5A,0x68,0x01,0x04, +0x49,0xFF,0xDA,0x5B,0xFC,0x83,0xFC,0x00,0x84,0x00,0x49,0xFF,0xFF,0xA0,0x84,0x00, +0x49,0xFF,0xFF,0xE5,0x84,0x00,0x49,0xFF,0xDD,0x3F,0x84,0x00,0x49,0xFF,0xDD,0x6E, +0x49,0xFF,0xFE,0x46,0x49,0xFF,0xFE,0x94,0x49,0xFF,0xFE,0xBC,0x84,0x00,0x49,0xFF, +0xE3,0x51,0x44,0x00,0x02,0x40,0x49,0xFF,0xE3,0x63,0x44,0x00,0x02,0x40,0x49,0xFF, +0xE3,0x54,0x84,0x09,0x49,0xFF,0xE3,0x67,0x84,0x03,0x49,0xFF,0xE3,0x6D,0x44,0x62, +0x06,0x1C,0x44,0x10,0x00,0xF0,0x84,0x00,0x49,0xFF,0xE1,0xF5,0x49,0xFF,0xF2,0xBC, +0x38,0x13,0x01,0x01,0x84,0x00,0x49,0xFF,0xE0,0xA3,0x44,0x10,0x00,0xF0,0x84,0x02, +0x49,0xFF,0xE1,0xE9,0x49,0xFF,0xF2,0xB0,0x38,0x13,0x01,0x01,0x84,0x02,0x49,0xFF, +0xE0,0x97,0x44,0x10,0x00,0xF0,0x84,0x05,0x49,0xFF,0xE1,0xDD,0x49,0xFF,0xF2,0xA4, +0x38,0x13,0x01,0x01,0x46,0x60,0x00,0x81,0x84,0x05,0x49,0xFF,0xE0,0x89,0x49,0xFF, +0xDE,0x23,0x04,0x03,0x03,0x91,0x92,0x0A,0x40,0x00,0x28,0x08,0x58,0x00,0x01,0xC0, +0x14,0x03,0x03,0x91,0x49,0xFF,0xDE,0x11,0x04,0x03,0x00,0x2C,0x46,0x1F,0xFC,0x0F, +0x92,0x06,0x94,0x06,0x58,0x00,0x00,0x2D,0x14,0x03,0x00,0x2C,0x04,0x03,0x00,0x2C, +0x50,0x10,0x8F,0xFF,0x46,0x20,0x02,0xD0,0xFE,0x0E,0xFE,0x17,0x14,0x03,0x00,0x2C, +0x04,0x03,0x00,0x2D,0x92,0x06,0x94,0x06,0x58,0x00,0x00,0x0A,0x14,0x03,0x00,0x2D, +0x04,0x03,0x00,0x2D,0xFE,0x46,0x46,0x00,0x00,0xA0,0xFE,0x47,0x14,0x13,0x00,0x2D, +0x04,0x13,0x00,0x2D,0x46,0x0C,0x0F,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x0E,0x46,0x10, +0xA0,0x00,0xFE,0x0F,0x14,0x03,0x00,0x2D,0x04,0x03,0x00,0x2F,0x92,0x06,0x94,0x06, +0x58,0x00,0x00,0x04,0x14,0x03,0x00,0x2F,0x44,0x00,0x02,0x80,0x49,0xFF,0xE1,0x7A, +0x84,0x00,0x49,0xFF,0xFE,0xEF,0x49,0xFF,0xFC,0x81,0x49,0xFF,0xE1,0x71,0x3E,0x07, +0xF7,0x12,0xFC,0x80,0x2E,0x07,0xF7,0x12,0xDD,0x9E,0x2E,0x07,0xF7,0x11,0xDD,0x9E, +0x2E,0x07,0xF7,0x10,0xDD,0x9E,0xFC,0x00,0x80,0xC0,0x49,0xFF,0xE2,0x62,0x80,0x06, +0x49,0xFF,0xD8,0xEB,0x84,0x00,0x84,0x2C,0x5A,0x68,0x01,0x1F,0x49,0xFF,0xE1,0xBF, +0x84,0x02,0x84,0x2A,0x49,0xFF,0xE1,0xBB,0x84,0x03,0x84,0x2A,0x49,0xFF,0xE1,0xB7, +0x84,0x05,0x84,0x2C,0x49,0xFF,0xE1,0xB3,0x84,0x07,0x84,0x2C,0x49,0xFF,0xE1,0xAF, +0x84,0x00,0x80,0x20,0x49,0xFF,0xD8,0x70,0x84,0x00,0x84,0x22,0x49,0xFF,0xD8,0x6C, +0x44,0x02,0x0D,0x20,0xD5,0x41,0x49,0xFF,0xE1,0xA2,0x84,0x01,0x84,0x2C,0x49,0xFF, +0xE1,0x9E,0x84,0x02,0x84,0x2A,0x49,0xFF,0xE1,0x9A,0x84,0x03,0x84,0x2A,0x49,0xFF, +0xE1,0x96,0x84,0x04,0x84,0x2C,0x49,0xFF,0xE1,0x92,0x84,0x05,0x84,0x2C,0x49,0xFF, +0xE1,0x8E,0x84,0x06,0x84,0x2C,0x49,0xFF,0xE1,0x8A,0x84,0x07,0x84,0x2C,0x49,0xFF, +0xE1,0x86,0x84,0x01,0x84,0x20,0x49,0xFF,0xD8,0x47,0x84,0x01,0x80,0x20,0x49,0xFF, +0xD8,0x43,0x84,0x00,0x84,0x22,0x49,0xFF,0xD8,0x3F,0x84,0x00,0x84,0x23,0x49,0xFF, +0xD8,0x3B,0x84,0x01,0x84,0x24,0x49,0xFF,0xD8,0x37,0x84,0x01,0x84,0x25,0x49,0xFF, +0xD8,0x33,0x84,0x01,0x84,0x26,0x49,0xFF,0xD8,0x2F,0x84,0x01,0x84,0x27,0x49,0xFF, +0xD8,0x2B,0x44,0x02,0x0D,0xA4,0x44,0x10,0x00,0x42,0x49,0xFF,0xDE,0x28,0xFC,0x80, +0xFC,0x21,0x84,0xC2,0xF0,0x81,0x80,0xE2,0x80,0x01,0x5A,0x10,0x01,0x03,0x84,0xC1, +0x49,0xFF,0xFF,0x8B,0xCF,0x0C,0x84,0x03,0x49,0xFF,0xDA,0xD0,0x84,0x03,0x49,0xFF, +0xDE,0x5A,0xF0,0x01,0x80,0x26,0x49,0xFF,0xF0,0x6B,0xFC,0xA1,0x84,0x02,0x49,0xFF, +0xDA,0xC5,0x84,0x02,0x49,0xFF,0xDE,0x4F,0xF0,0x01,0x80,0x26,0x84,0x40,0x49,0xFF, +0xEF,0xEE,0xFC,0xA1,0xFC,0x00,0x84,0x00,0x49,0xFF,0xFD,0xB5,0x84,0x00,0x84,0x20, +0x3E,0x07,0xF7,0x11,0x3E,0x07,0xF7,0x10,0x80,0x41,0x2E,0x07,0xF7,0x12,0x49,0xFF, +0xFF,0xD1,0xFC,0x80,0xFC,0x20,0x44,0x14,0x80,0x90,0x44,0x0F,0xFF,0xEF,0xB4,0x41, +0x46,0x70,0x00,0x81,0xFE,0x16,0xB6,0x01,0x44,0x04,0x80,0x10,0xFA,0x20,0xAE,0x40, +0xFA,0xC2,0x50,0x73,0x83,0xD4,0xB4,0x07,0x92,0x0B,0x96,0x27,0xC0,0x07,0x8E,0xC1, +0xC6,0x05,0x84,0x01,0x49,0xFF,0xE5,0xE4,0xD5,0xF7,0x44,0x04,0x80,0x10,0xFA,0x20, +0xAE,0x40,0x44,0x14,0x80,0x90,0xB4,0x01,0x58,0x00,0x00,0x10,0xB6,0x01,0xFC,0xA0, +0xFC,0x00,0x49,0xFF,0xF3,0x9A,0x5A,0x08,0x01,0x09,0x44,0x14,0x50,0x28,0xB4,0x01, +0x92,0x01,0x96,0x06,0x5A,0x00,0x01,0xFD,0xFC,0x80,0xFC,0x00,0x80,0xC0,0x5A,0x08, +0x01,0x04,0x49,0xFF,0xFF,0xEF,0x80,0x06,0x49,0x00,0x12,0x5B,0x80,0x06,0x49,0xFF, +0xD9,0x44,0xFC,0x80,0xFC,0x20,0x84,0xE0,0x80,0xC0,0x84,0x00,0x49,0xFF,0xFF,0xEF, +0x49,0xFF,0xFF,0xBA,0x49,0xFF,0xEC,0x69,0x3E,0x77,0xEF,0xCC,0x49,0xFF,0xE9,0x47, +0x3E,0x77,0xEF,0xCB,0x5A,0x68,0x01,0x05,0x80,0x06,0x49,0xFF,0xFF,0xE0,0xFC,0xA0, +0xFC,0x00,0x84,0x01,0x49,0xFF,0xFF,0xE8,0x2E,0x07,0xEF,0xCB,0xC0,0x12,0x84,0xC0, +0x3E,0x67,0xEF,0xCC,0x49,0xFF,0xE9,0x33,0x3E,0x67,0xEF,0xCB,0x49,0xFF,0xFD,0xE3, +0x49,0xFF,0xFB,0x7E,0x49,0xFF,0xFD,0xE9,0x84,0x00,0x49,0xFF,0xFF,0xD5,0xFC,0x80, +0x3C,0x0D,0xFD,0xC3,0x5A,0x00,0x01,0xED,0x49,0x00,0x12,0x37,0x2E,0x07,0xEF,0xC8, +0xC0,0xE4,0xD5,0xE6,0xFC,0x00,0x84,0x01,0x49,0xFF,0xFF,0xC6,0x2E,0x07,0xEF,0xCB, +0xC8,0x05,0x3C,0x0D,0xFD,0xC3,0x5A,0x08,0x01,0xFB,0x84,0xC0,0x3E,0x67,0xEF,0xCC, +0x49,0xFF,0xE9,0x0D,0x84,0x00,0x3E,0x67,0xEF,0xCB,0x49,0xFF,0xFF,0xB5,0xFC,0x80, +0xFC,0x01,0xB6,0x1F,0x2E,0x07,0xF7,0x11,0x49,0xFF,0xE1,0x74,0xF0,0x81,0xB4,0x1F, +0x49,0xFF,0xDB,0x9C,0x44,0x10,0x02,0x40,0xB4,0x1F,0x49,0xFF,0xE1,0x76,0x84,0x02, +0x49,0xFF,0xFD,0x60,0x49,0xFF,0xFF,0xD8,0xF0,0x01,0x44,0x10,0x02,0x40,0xB4,0x5F, +0x49,0xFF,0xF0,0xE9,0x84,0x01,0x49,0xFF,0xFD,0x55,0x84,0x01,0x49,0xFF,0xFF,0x94, +0xFC,0x81,0xFC,0x49,0x2E,0x67,0xF7,0x12,0x84,0x00,0x49,0xFF,0xFE,0xAE,0x84,0x02, +0x49,0xFF,0xD9,0xF4,0x80,0x06,0x84,0x20,0x84,0x41,0x49,0xFF,0xEF,0x20,0x84,0x04, +0x49,0xFF,0xFD,0x9D,0xB1,0x86,0x44,0x12,0x02,0xAC,0x80,0x06,0x3A,0x20,0x94,0x04, +0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x00, +0x3A,0x20,0x14,0x20,0x44,0x02,0x02,0xDC,0x80,0x3F,0x3A,0x20,0x14,0x04,0x3A,0x20, +0x94,0x24,0x3A,0x20,0x0C,0x00,0x3A,0x20,0x8C,0x20,0x80,0x1F,0x49,0xFF,0xDE,0x0A, +0x80,0x06,0x49,0xFF,0xDD,0xD1,0x84,0x00,0x3E,0x07,0xEF,0xCA,0x84,0x01,0x80,0xFF, +0x49,0xFF,0xFF,0x5A,0x49,0xFF,0xD7,0x62,0x2E,0x07,0xEF,0xCA,0xC0,0x2D,0x84,0x00, +0x3E,0x07,0xEF,0xCA,0x84,0x00,0x49,0xFF,0xFF,0x4F,0x49,0xFF,0xFF,0x63,0x84,0x00, +0x49,0xFF,0xFD,0x65,0x44,0x12,0x02,0x18,0x80,0x06,0x3A,0x20,0x94,0x04,0x3A,0x20, +0x14,0x24,0x3A,0x20,0x94,0x04,0x3A,0x20,0x14,0x24,0x3A,0x20,0x94,0x00,0x3A,0x20, +0x14,0x20,0x44,0x02,0x01,0xC4,0x80,0x27,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24, +0x3A,0x20,0x0C,0x00,0x3A,0x20,0x8C,0x20,0x80,0x07,0x49,0xFF,0xDD,0xD3,0x80,0x06, +0x49,0xFF,0xDD,0x9A,0xFC,0xC9,0x3C,0x0D,0xFD,0xC3,0x5A,0x00,0x01,0xD2,0x49,0x00, +0x11,0x8C,0x2E,0x07,0xEF,0xC8,0xC0,0xC9,0xD5,0xCB,0xFC,0x00,0x2E,0x07,0xF7,0x12, +0x49,0xFF,0xF1,0xA4,0x84,0x00,0x49,0xFF,0xFC,0x7E,0x84,0x20,0x2E,0x27,0xF7,0x10, +0x2E,0x07,0xF7,0x12,0x49,0xFF,0xFE,0x9E,0x84,0x00,0x49,0xFF,0xFF,0x5B,0x2E,0x17, +0xF7,0x11,0x2E,0x27,0xF7,0x10,0x2E,0x07,0xF7,0x12,0x49,0xFF,0xFE,0x93,0x2E,0x07, +0xF7,0x12,0x49,0xFF,0xF1,0x8B,0x2E,0x07,0xF7,0x12,0x49,0xFF,0xF2,0x16,0x49,0xFF, +0xF2,0x7C,0xC8,0x09,0x2E,0x07,0xF7,0x12,0x49,0xFF,0xFC,0x47,0x2E,0x07,0xF7,0x12, +0x49,0xFF,0xFC,0xF0,0x84,0x01,0x49,0xFF,0xFC,0xAD,0x49,0xFF,0xF1,0x2E,0x49,0xFF, +0xFC,0xFC,0x84,0x01,0x49,0xFF,0xFE,0xE8,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xDE,0x30, +0xFC,0x80,0x46,0x20,0x00,0x82,0x96,0x67,0xA1,0x54,0x44,0x3F,0xFF,0xC1,0x95,0x09, +0xFE,0xEE,0xFE,0xE7,0xA8,0xD4,0xA1,0x54,0x44,0x3F,0xE0,0xFF,0x40,0x40,0xA0,0x08, +0xFE,0xEE,0xFE,0xE7,0xA8,0xD4,0xA0,0xD4,0x46,0x4F,0xFC,0x1F,0x50,0x42,0x0F,0xFF, +0x40,0x50,0xC4,0x08,0xFE,0xE6,0xFE,0xEF,0xA8,0xD4,0xA1,0x14,0x46,0x3E,0x0F,0xFF, +0x50,0x31,0x8F,0xFF,0xFE,0xE6,0x40,0x10,0xE0,0x08,0xFE,0x5F,0xA8,0x54,0xA1,0x14, +0x96,0x06,0x44,0x1F,0xFF,0xBF,0x94,0xC6,0xFE,0x66,0xFE,0x5F,0xA8,0x54,0xA1,0x14, +0x44,0x1F,0xDF,0xFF,0x40,0x30,0x34,0x08,0xFE,0x66,0xFE,0x5F,0xA8,0x54,0xA0,0x54, +0x46,0x3F,0xFB,0xFF,0x50,0x31,0x8F,0xFF,0x40,0x40,0x58,0x08,0xFE,0x5E,0xFE,0x67, +0xA8,0x54,0xA0,0xD4,0x46,0x1D,0xFF,0xFF,0x50,0x10,0x8F,0xFF,0x40,0x00,0x74,0x08, +0xFE,0x5E,0xFE,0x0F,0xA8,0x14,0xDD,0x9E,0xFC,0x00,0x84,0xC0,0x3E,0x67,0xEF,0xCC, +0x49,0xFF,0xE7,0xE5,0x3E,0x67,0xEF,0xCB,0x2E,0x07,0xEF,0xCB,0xC0,0x05,0x84,0x00, +0x3E,0x07,0xEF,0xCB,0xFC,0x80,0x3C,0x0D,0xFD,0xC3,0x5A,0x00,0x01,0xFA,0x49,0x00, +0x10,0xEC,0x2E,0x07,0xEF,0xC8,0xC0,0xF1,0xD5,0xF3,0xFC,0x00,0x49,0xFF,0xFC,0x8D, +0x84,0x01,0x49,0xFF,0xFE,0x79,0x49,0xFF,0xFF,0xE1,0x49,0xFF,0xFC,0x7C,0x49,0xFF, +0xFC,0x57,0x84,0x00,0x49,0xFF,0xFE,0x70,0xFC,0x80,0xFC,0x40,0x84,0xC0,0x44,0x90, +0x20,0x00,0x84,0xA0,0x98,0xEE,0x96,0xD9,0x94,0xD9,0x40,0xA0,0x0C,0x00,0x99,0xCB, +0x22,0x45,0x00,0x00,0x22,0x83,0x80,0x00,0x8A,0x88,0x4E,0x44,0x00,0x03,0xFF,0x22, +0x88,0x62,0x22,0x81,0x80,0x00,0xE1,0x04,0xE8,0x02,0xAD,0x18,0x22,0xF5,0x00,0x00, +0x5E,0xF7,0xBF,0xC1,0xE8,0x06,0x22,0xF3,0x80,0x00,0x5E,0xF7,0xBF,0xC1,0xE9,0x03, +0x12,0x91,0x80,0x00,0x8C,0xA1,0x97,0x69,0x5A,0x58,0x12,0xDE,0x8C,0xD2,0x97,0xB1, +0x5A,0x6A,0x40,0xD9,0xFC,0xC0,0xFC,0x00,0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF, +0xDA,0x7D,0x84,0x21,0x44,0x00,0x01,0x00,0x49,0xFF,0xDA,0x78,0x84,0x08,0x49,0xFF, +0xE3,0xEF,0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF,0xDA,0x70,0x44,0x00,0x00,0x51, +0x3E,0x07,0xEF,0x14,0xFC,0x80,0xFC,0x40,0x44,0x74,0x2C,0x14,0x84,0xCF,0xB5,0x27, +0x40,0x94,0x98,0x02,0x10,0x90,0x00,0x00,0xB4,0x07,0x92,0x08,0xFE,0x36,0xAE,0x08, +0xB4,0x27,0x84,0x01,0x92,0x2C,0xFE,0x46,0xAE,0x50,0x44,0x14,0x24,0x14,0x44,0x24, +0x2C,0x1C,0xB4,0x21,0xFF,0x8E,0xAF,0x98,0xB4,0x22,0x92,0x32,0xFE,0x46,0xAE,0x60, +0xB4,0x22,0x92,0x33,0xFE,0x46,0xAE,0x68,0xB4,0x22,0x92,0x36,0xFE,0x0E,0xF1,0x08, +0xAE,0x08,0xFC,0xC0,0xFC,0x41,0x81,0x21,0xF3,0x81,0x5A,0x08,0xFF,0x05,0x5A,0x18, +0xFF,0x50,0xFC,0xC1,0x5A,0x08,0xFE,0x49,0x5A,0x18,0xFE,0x47,0x44,0x34,0x2C,0x14, +0x96,0x86,0x40,0x01,0x30,0x08,0xB4,0x43,0x44,0x1F,0xEF,0xFF,0xFE,0x8E,0xFE,0x87, +0xB6,0x43,0x84,0x41,0x80,0x62,0x44,0x14,0x24,0x14,0x44,0x04,0x28,0x14,0x80,0xE4, +0x80,0xC5,0x49,0xFF,0xDA,0xB7,0xF0,0x01,0x49,0xFF,0xE5,0xC7,0x44,0x04,0x24,0x14, +0x84,0x21,0x49,0xFF,0xDA,0x84,0x44,0x24,0x2C,0x1C,0x97,0xC6,0x40,0x43,0xC8,0x08, +0xB4,0xE2,0x44,0x0B,0xFF,0xFF,0xFF,0xC6,0xFF,0xE7,0xB6,0xE2,0x97,0x86,0xB4,0x02, +0x40,0x53,0x4C,0x08,0x46,0x6F,0xFF,0x7F,0x50,0x63,0x0F,0xFF,0xFF,0x86,0xFF,0xAF, +0xB6,0xC2,0x00,0x0F,0x80,0x28,0xB4,0x62,0x96,0x06,0x40,0x10,0x58,0x08,0x46,0x0F, +0xFB,0xFF,0x50,0x00,0x0F,0xFF,0xFE,0x1E,0xFE,0x0F,0xB6,0x02,0x44,0x14,0x24,0x1C, +0x44,0x04,0x28,0x1C,0xD5,0x0C,0x49,0xFF,0xE5,0x98,0x5A,0x90,0xFF,0x05,0x80,0x09, +0x49,0xFF,0xE5,0x9C,0x44,0x04,0x28,0x14,0x44,0x14,0x24,0x14,0x84,0x41,0x80,0x62, +0x49,0xFF,0xDA,0x78,0xFC,0xC1,0xFC,0x41,0xB6,0x1F,0x80,0xC1,0xF2,0x81,0x81,0x24, +0x80,0xE5,0x5A,0x30,0xFF,0x06,0x80,0x02,0x84,0x20,0x49,0xFF,0xE9,0xB5,0x5A,0x98, +0x0F,0x04,0x5A,0x70,0x01,0x0C,0x46,0x10,0x00,0x81,0x83,0x81,0xB8,0x33,0x58,0x00, +0x02,0x00,0xB8,0xB3,0x84,0x00,0x49,0xFF,0xFC,0xA8,0x00,0x0F,0x80,0x28,0x5A,0x08, +0x0F,0x06,0x00,0x0F,0x80,0x2C,0x5A,0x00,0x0F,0x04,0x49,0x00,0x0E,0xEF,0x44,0x00, +0xFF,0xFF,0x4C,0x60,0x00,0x0C,0xB4,0x1F,0x80,0x26,0x49,0xFF,0xDE,0x0C,0x50,0x13, +0x00,0x42,0xB4,0x1F,0x96,0x49,0x49,0xFF,0xFE,0x8A,0xFC,0xC1,0xFC,0x42,0x80,0xC1, +0xF0,0x81,0x80,0xE2,0xF3,0x82,0x80,0x24,0x01,0xCF,0x80,0x34,0x00,0x8F,0x80,0x38, +0x00,0xAF,0x80,0x3C,0x04,0x9F,0x80,0x10,0x5A,0x40,0xFF,0x07,0x80,0x03,0xF5,0x83, +0x49,0xFF,0xE9,0x7A,0xF5,0x03,0x5A,0x50,0x0F,0x06,0xF0,0x02,0x80,0x25,0x49,0xFF, +0xDE,0x3E,0x5B,0xC0,0x01,0x07,0x80,0x1C,0x00,0x1F,0x80,0x30,0x49,0xFF,0xD4,0xFC, +0x5A,0x80,0x0F,0x05,0x80,0x08,0x49,0xFF,0xD6,0xF3,0x5A,0xA0,0x0F,0x05,0x80,0x0A, +0x49,0xFF,0xD7,0x21,0x44,0x00,0xFF,0xFF,0x5A,0x90,0x01,0x05,0x4C,0x60,0x40,0x05, +0xFC,0xC2,0x4C,0x60,0x00,0x2F,0xF0,0x01,0x80,0x26,0x49,0xFF,0xDD,0xCC,0x50,0x13, +0x00,0x42,0xF0,0x01,0x96,0x49,0x49,0xFF,0xFE,0x4A,0x5A,0x70,0xFF,0x0C,0xE6,0xF5, +0xE9,0x02,0xFA,0xE3,0x44,0x12,0x06,0x1C,0xF0,0x01,0x38,0x10,0x9D,0x01,0x49,0xFF, +0xFE,0x3E,0x5A,0x98,0x01,0x1A,0x49,0xFF,0xFB,0x30,0x49,0xFF,0xFD,0x8C,0x49,0xFF, +0xFC,0x33,0xF0,0x81,0x49,0xFF,0xFC,0x33,0xF0,0x82,0x49,0xFF,0xFC,0x33,0xF0,0x83, +0xF1,0x02,0xF0,0x01,0xF2,0x03,0x49,0xFF,0xFC,0x9D,0x49,0xFF,0xFB,0x14,0xFC,0xC2, +0x5A,0x78,0xFF,0xDF,0xD5,0xE9,0xFC,0xC2,0xFC,0x03,0xF1,0x81,0xB1,0x03,0x44,0x12, +0x03,0x04,0x80,0xA4,0x3A,0x20,0x8C,0x04,0x3A,0x22,0x8C,0x24,0xA4,0x48,0x9E,0xC1, +0xAC,0x68,0x92,0x28,0xE0,0x23,0x00,0x2F,0x80,0x0C,0xE8,0x03,0x8C,0x21,0xD5,0x04, +0xE0,0x40,0xE9,0x03,0x9C,0x51,0x96,0x08,0x84,0x40,0x38,0x52,0x08,0x00,0x96,0x50, +0x8C,0xA1,0xD8,0x06,0x80,0x01,0xF1,0x01,0x49,0xFF,0xDD,0x35,0xFC,0x83,0x8C,0x41, +0x5A,0x28,0x0A,0xF5,0xFC,0x83,0xFC,0x49,0x49,0xFF,0xFA,0xD6,0x2E,0x77,0xF0,0xEB, +0xF0,0x87,0x2E,0x07,0xF0,0xEC,0x40,0x73,0xA0,0x08,0xFF,0xC7,0x2E,0x07,0xF0,0xED, +0x2E,0x67,0xF0,0xF0,0xF0,0x88,0x2E,0x07,0xF0,0xEE,0x2E,0x87,0xF0,0xF2,0x54,0x90, +0x00,0x01,0x2E,0x07,0xF0,0xEF,0x2E,0xA7,0xF0,0xF3,0xF0,0x89,0x54,0x03,0x00,0x0F, +0x92,0xC4,0xF0,0x8A,0x54,0x03,0x00,0x01,0xF0,0x8B,0x2E,0x07,0xF0,0xF1,0x54,0x10, +0x00,0x0F,0x40,0x60,0x10,0x09,0x84,0x1F,0x10,0x0F,0x80,0x41,0x10,0x0F,0x80,0x42, +0x10,0x0F,0x80,0x43,0x10,0x0F,0x80,0x44,0x10,0x0F,0x80,0x45,0x10,0x0F,0x80,0x46, +0x10,0x0F,0x80,0x47,0x84,0x00,0x3C,0x0B,0xF8,0x6F,0x3E,0x07,0xF0,0xDC,0xF0,0x08, +0xF1,0x8C,0x5A,0x00,0xFF,0x16,0x46,0x00,0x00,0x81,0x04,0x10,0x00,0x23,0x04,0x00, +0x00,0x23,0x96,0x5F,0x92,0x0C,0x96,0x1F,0xF1,0x8E,0xF0,0x8D,0x84,0x20,0xF0,0x08, +0x49,0xFF,0xFF,0x8C,0xF0,0x08,0x84,0x23,0x49,0xFF,0xFF,0x88,0xD5,0x04,0x84,0x00, +0xF0,0x8D,0xF0,0x8E,0x5A,0x88,0xFF,0x04,0x5A,0xA0,0xFF,0x12,0x50,0x0F,0x80,0x47, +0xB6,0x1F,0x50,0x1F,0x80,0x42,0x50,0x0F,0x80,0x41,0x50,0x2F,0x80,0x43,0xB0,0xD1, +0x50,0x4F,0x80,0x45,0x50,0x5F,0x80,0x46,0x49,0xFF,0xFE,0x4F,0x84,0x41,0x80,0x08, +0x80,0x2A,0x80,0xA2,0xB6,0x5F,0x84,0x65,0x84,0x80,0x49,0xFF,0xFE,0x6D,0xF0,0x0B, +0x85,0x40,0xF0,0x81,0xF0,0x0C,0x80,0x27,0xF0,0x82,0x44,0x20,0x00,0xFF,0x80,0x0A, +0x80,0x6A,0xF4,0x09,0xF5,0x0A,0xB7,0x5F,0xF6,0x83,0x14,0xAF,0x80,0x04,0x49,0xFF, +0xFE,0xEF,0xF0,0x0B,0x84,0x63,0xF0,0x81,0xF0,0x0C,0xF5,0x0A,0xB6,0x7F,0x80,0x27, +0x44,0x20,0x00,0xFF,0xF4,0x09,0xF0,0x82,0xF6,0x83,0x84,0x05,0x14,0x9F,0x80,0x04, +0x49,0xFF,0xFE,0xDE,0x49,0xFF,0xFA,0x4F,0x80,0x0A,0x49,0xFF,0xFC,0x45,0x46,0x80, +0x0F,0xC0,0x46,0x50,0x00,0x82,0x44,0xF3,0xF0,0x00,0x41,0xE5,0x10,0x08,0x40,0x45, +0x00,0x13,0x84,0xE0,0xB4,0x05,0x40,0x13,0xF8,0x00,0x92,0x0B,0x40,0x00,0x2C,0x08, +0xFE,0x0F,0xB6,0x05,0xA0,0xE9,0xA0,0x69,0x96,0xD8,0x54,0x91,0x80,0x20,0x54,0x10, +0x8F,0xC0,0x92,0x26,0x40,0x94,0x88,0x08,0x96,0xE7,0xA0,0xA9,0x40,0x34,0x8C,0x04, +0x54,0x90,0x80,0x1F,0x96,0x6E,0x94,0x4A,0xA0,0x29,0x40,0x94,0x84,0x04,0x40,0x21, +0x3C,0x02,0x92,0x4C,0x40,0x94,0xA0,0x08,0x40,0x91,0xA4,0x04,0x40,0x00,0x20,0x02, +0x54,0x31,0x00,0x20,0x92,0x12,0xF1,0x07,0x94,0xDA,0x96,0xA7,0xFE,0x9F,0x54,0x30, +0x00,0x1F,0x96,0x2E,0x94,0x02,0x38,0x90,0x91,0x09,0xFE,0xC7,0x50,0x12,0x00,0x12, +0xF0,0x07,0x96,0x49,0x40,0x31,0xA0,0x08,0xFE,0x9F,0x50,0x42,0x00,0x24,0x8C,0xE1, +0x38,0x20,0x05,0x09,0x97,0x21,0x5A,0x78,0x10,0xBF,0x8D,0x41,0x5A,0xA8,0x09,0xB7, +0xFB,0x41,0x44,0x90,0x02,0x40,0x46,0x30,0x00,0x82,0x80,0xEA,0x81,0x09,0x84,0xA0, +0x55,0xE4,0x87,0xFF,0xB4,0x23,0x40,0x02,0xF8,0x00,0x92,0x2B,0x40,0x10,0xAC,0x08, +0x54,0x00,0x07,0xFF,0xFE,0x0F,0xB6,0x03,0xB4,0x03,0x8C,0xA1,0x92,0x0B,0x40,0x00, +0x2C,0x08,0x40,0x04,0x00,0x04,0xB6,0x03,0xA1,0x19,0xA0,0x59,0xA0,0x99,0x54,0x10, +0x8F,0xC0,0x40,0x00,0x98,0x09,0xF0,0x8F,0x44,0x03,0xF0,0x00,0xFE,0x86,0xA0,0x19, +0x97,0x20,0x46,0x10,0x0F,0xC0,0xFE,0x0E,0x54,0xF2,0x00,0x20,0xF1,0x0F,0x40,0xF7, +0x88,0x08,0x97,0x27,0x40,0x47,0x90,0x04,0x54,0xF0,0x80,0x1F,0x96,0x6E,0x94,0x4A, +0x40,0xF7,0x84,0x04,0xF1,0x07,0x40,0xF7,0xA0,0x08,0x92,0x4C,0x40,0x42,0x3C,0x04, +0x38,0x40,0x9D,0x09,0x54,0x41,0x00,0x20,0x92,0x12,0x95,0x22,0x96,0xA7,0xFE,0xA7, +0x54,0x40,0x00,0x1F,0x96,0x2E,0x94,0x02,0x50,0x13,0x80,0x12,0xFF,0x07,0xF0,0x07, +0x96,0x49,0x40,0x42,0x20,0x08,0xFE,0xA7,0x50,0x73,0x80,0x24,0x54,0x52,0x87,0xFF, +0x38,0x20,0x05,0x09,0x8D,0x01,0x97,0xF9,0x5A,0x58,0x10,0xAE,0x50,0x05,0x7F,0xFF, +0x8D,0x30,0x40,0xA0,0x00,0x13,0x5A,0x9A,0xD0,0xA2,0x49,0xFF,0xEC,0x35,0x49,0xFF, +0xEC,0x5A,0x2E,0x07,0xEF,0xBD,0xC0,0x04,0x49,0xFF,0xEA,0x5D,0xD5,0x03,0x44,0x0F, +0xED,0xED,0x44,0x44,0x80,0x10,0x3C,0x0B,0xF8,0x6F,0xB4,0xA4,0xB4,0x04,0xB4,0x24, +0x40,0x30,0x58,0x09,0xB4,0x04,0x92,0xB6,0x92,0x14,0x40,0x20,0x88,0x09,0x54,0x42, +0x80,0x08,0x54,0x10,0x00,0x01,0x54,0x01,0x80,0x04,0xFE,0x27,0xFE,0x0F,0x54,0x11, +0x00,0x02,0xFE,0x0F,0x3E,0x07,0xF0,0xDC,0xF0,0x08,0x5A,0x00,0xFF,0x0A,0xF0,0x0E, +0x84,0x20,0x49,0xFF,0xDB,0xB0,0xF0,0x0D,0x84,0x23,0x49,0xFF,0xDB,0xAC,0x00,0x7F, +0x80,0x47,0x00,0x0F,0x80,0x41,0x00,0x1F,0x80,0x42,0x00,0x2F,0x80,0x43,0x00,0x3F, +0x80,0x44,0x00,0x4F,0x80,0x45,0x00,0x5F,0x80,0x46,0xB6,0xFF,0x49,0xFF,0xFD,0x4C, +0xF0,0x0C,0xF3,0x09,0xB6,0x1F,0x84,0x00,0x80,0x40,0xF4,0x0A,0xF5,0x0B,0xF6,0x81, +0x44,0x10,0x00,0xF0,0x49,0xFF,0xFD,0xA1,0xF0,0x0C,0x44,0x10,0x00,0xF0,0xB6,0x1F, +0x84,0x43,0x84,0x05,0xF3,0x09,0xF4,0x0A,0xF5,0x0B,0xF6,0x81,0x49,0xFF,0xFD,0x95, +0x49,0xFF,0xFC,0xF3,0xFC,0xC9,0xFC,0x41,0x81,0x00,0x81,0x23,0xF5,0x81,0x80,0xC2, +0x81,0x44,0xB6,0x3F,0x2E,0x77,0xEA,0x5E,0x49,0xFF,0xF9,0x1B,0x83,0x80,0x46,0x00, +0x00,0x80,0xB4,0x3F,0x14,0x80,0x00,0x47,0x14,0x80,0x00,0x49,0x84,0x01,0x49,0xFF, +0xDB,0xB2,0x84,0x04,0xB4,0x3F,0x49,0xFF,0xDB,0xAE,0x49,0xFF,0xF9,0x26,0x49,0xFF, +0xFC,0x7D,0x49,0xFF,0xF9,0x18,0x80,0x1C,0x80,0x29,0x84,0x40,0x49,0xFF,0xEC,0x39, +0xF5,0x01,0xCD,0x14,0x93,0x21,0x96,0x69,0xE2,0x29,0xE8,0x0F,0x40,0x22,0x9C,0x16, +0xC8,0x04,0xC1,0x03,0x8C,0xC2,0x97,0xB1,0x42,0x03,0x1C,0x73,0x38,0x1E,0x15,0x11, +0x38,0x15,0x01,0x09,0x8C,0xA1,0xD5,0xF0,0xFC,0xC1,0x5A,0x58,0x01,0x0F,0x95,0xB1, +0x89,0x46,0x84,0x00,0x96,0x41,0xE2,0x29,0xE8,0x07,0x38,0x1E,0x01,0x11,0x38,0x15, +0x01,0x09,0x8C,0x01,0xD5,0xF8,0xFC,0xC1,0x5A,0x58,0x02,0x1B,0x94,0xF9,0x84,0x40, +0x96,0x51,0xE2,0x29,0xE8,0x15,0x40,0x41,0x1C,0x16,0xC8,0x04,0xC1,0x03,0x8C,0xC1, +0x97,0xB1,0x40,0x51,0x0C,0x96,0xCC,0x04,0xC1,0x03,0x8C,0xC6,0x97,0xB1,0x42,0x03, +0x1C,0x73,0x38,0x1E,0x09,0x11,0x38,0x15,0x01,0x09,0x8C,0x41,0xD5,0xEA,0xFC,0xC1, +0xFC,0x40,0x51,0xFF,0xF5,0xF0,0x49,0xFF,0xF8,0xBF,0xF0,0x87,0x84,0x20,0x44,0x20, +0x04,0x80,0x50,0x0F,0x81,0x10,0x49,0x00,0x13,0x05,0x44,0x02,0x03,0x04,0xB0,0x57, +0x3A,0x20,0x0C,0x04,0x3A,0x20,0x8C,0x24,0xA4,0x00,0xAC,0x08,0x00,0x0F,0x80,0x5C, +0x44,0x12,0x03,0x10,0x8C,0x01,0x96,0x00,0xF0,0x8B,0xB0,0x1A,0x3A,0x20,0x90,0x00, +0x3A,0x20,0x10,0x20,0x84,0x20,0x84,0x4C,0xB0,0x1D,0x49,0x00,0x12,0xEB,0x2E,0x07, +0xF0,0xEB,0x2E,0x17,0xF0,0xEC,0x40,0x00,0x20,0x08,0x2E,0x77,0xF0,0xEF,0x40,0x80, +0x04,0x04,0x2E,0x07,0xF0,0xEE,0x2E,0x67,0xF0,0xED,0xF0,0x86,0x54,0x03,0x80,0x0F, +0xF0,0x88,0x2E,0x07,0xF0,0xF1,0x2E,0xA7,0xF0,0xF0,0xF0,0x8C,0x2E,0x07,0xF0,0xF2, +0x50,0xFF,0x80,0xB0,0xF0,0x8D,0x2E,0x07,0xF0,0xF3,0x92,0xE4,0x54,0x10,0x00,0x0F, +0x92,0x04,0x96,0x06,0xF0,0x8F,0x2E,0x07,0xF0,0xF4,0xF1,0x8E,0x54,0x10,0x00,0x0F, +0x92,0x04,0xF0,0x91,0x84,0x1F,0xF1,0x90,0x10,0x0F,0x80,0x55,0x10,0x0F,0x80,0x56, +0x10,0x0F,0x80,0x57,0x10,0x0F,0x80,0x58,0x10,0x0F,0x80,0x59,0x10,0x0F,0x80,0x5A, +0x10,0x0F,0x80,0x5B,0x2E,0x17,0xEA,0x5F,0x2E,0x07,0xEA,0x5E,0xFE,0x0C,0xF0,0x89, +0x44,0x02,0x03,0x1C,0xB0,0x60,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0x3A,0x20, +0x0C,0x00,0x44,0x02,0x03,0x34,0x3A,0x20,0x8C,0x20,0x80,0x2F,0x3A,0x20,0x14,0x04, +0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x00, +0x44,0x02,0x03,0x64,0x3A,0x20,0x94,0x20,0xB0,0x66,0x3A,0x20,0x14,0x04,0x3A,0x20, +0x94,0x24,0x3A,0x20,0x0C,0x00,0x50,0xFF,0x80,0xE0,0x44,0x02,0x03,0x7C,0x3A,0x20, +0x8C,0x20,0x80,0x2F,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x04, +0x3A,0x20,0x94,0x24,0x3A,0x20,0x14,0x00,0x3A,0x20,0x94,0x20,0xF5,0x07,0x84,0x21, +0x50,0x02,0x84,0x80,0x1A,0x12,0x80,0x01,0xD8,0xFE,0x84,0x00,0x3C,0x0B,0xF8,0x6F, +0x3E,0x07,0xF0,0xDC,0xB0,0x1A,0x49,0xFF,0xD2,0xDC,0xB0,0x1D,0x49,0xFF,0xD2,0xED, +0x46,0x30,0x00,0x80,0x84,0x10,0x04,0x11,0x80,0x70,0x46,0x90,0x00,0x81,0xFE,0x0E, +0x58,0x00,0x00,0x0B,0x14,0x01,0x80,0x70,0xB0,0x2C,0xF3,0x8A,0x49,0xFF,0xD8,0x7C, +0xB0,0x20,0x49,0xFF,0xD8,0xAF,0x84,0x03,0x49,0xFF,0xF7,0xC4,0x84,0x00,0x49,0xFF, +0xE3,0x43,0x44,0x17,0x20,0x1C,0xB4,0x01,0x92,0x0C,0x40,0x00,0x30,0x08,0xB6,0x01, +0x44,0x17,0x20,0x24,0xB4,0x01,0x92,0x0C,0x40,0x00,0x30,0x08,0xB6,0x01,0x04,0x24, +0x80,0x3A,0x46,0x0F,0xF8,0xFF,0x50,0x00,0x0F,0x8F,0xFE,0x16,0x46,0x20,0x05,0x00, +0x50,0x21,0x00,0x40,0xFE,0x17,0x14,0x04,0x80,0x3A,0x04,0x24,0x80,0x3B,0x84,0x18, +0xFE,0x16,0x58,0x00,0x00,0x04,0x14,0x04,0x80,0x3B,0x84,0x00,0x49,0xFF,0xD3,0x88, +0x84,0x03,0x49,0xFF,0xD3,0xB8,0x04,0x24,0x80,0x38,0x46,0x00,0xCC,0x0C,0x50,0x00, +0x0F,0xF3,0xFE,0x16,0x46,0x2A,0x22,0xA2,0xF3,0x0A,0x8C,0x48,0xFE,0x17,0x14,0x04, +0x80,0x38,0x84,0x1F,0x14,0x01,0x80,0x47,0x14,0x01,0x80,0x49,0x04,0x04,0x83,0x97, +0x84,0x41,0x58,0x00,0x02,0x00,0x80,0x62,0x50,0x14,0x86,0x5C,0x14,0x04,0x83,0x97, +0x50,0x04,0x8A,0x5C,0x49,0xFF,0xD6,0x8E,0x84,0x01,0x49,0xFF,0xD9,0x5A,0x46,0x10, +0x00,0x83,0x46,0x0F,0x3F,0xFF,0x04,0x20,0x80,0xEE,0x50,0x00,0x0F,0xFF,0xFE,0x16, +0x44,0x24,0x2C,0x14,0x14,0x00,0x80,0xEE,0xB4,0x02,0x44,0x14,0x2C,0x1C,0xF0,0x92, +0xB4,0x01,0xB4,0x62,0xF0,0x93,0x44,0x0F,0xE0,0xF0,0xFE,0x1E,0x58,0x00,0x00,0x01, +0xB6,0x02,0xB4,0x41,0x46,0x0F,0xFB,0x3F,0x50,0x00,0x0F,0xFF,0xFE,0x16,0x46,0x20, +0x00,0xC0,0xFE,0x17,0x84,0x41,0xB6,0x01,0x80,0x62,0x44,0x04,0x28,0x14,0x44,0x14, +0x24,0x14,0x49,0xFF,0xD6,0x5F,0x84,0x41,0x80,0x62,0x44,0x04,0x28,0x1C,0x44,0x14, +0x24,0x1C,0x49,0xFF,0xD6,0x57,0x84,0x01,0x84,0x20,0x49,0xFF,0xE5,0x9D,0x46,0x20, +0x00,0x82,0x46,0x0C,0x08,0x0C,0xA0,0x54,0x50,0x00,0x00,0x80,0xFE,0x0E,0x44,0x11, +0x00,0x01,0xFE,0x0F,0xA8,0x14,0x44,0x00,0xFF,0xFF,0x4C,0x80,0x00,0x11,0xF5,0x06, +0x40,0x63,0x20,0x08,0xFF,0x77,0xF5,0x86,0xD0,0x0A,0xE2,0xA8,0xE9,0x04,0x14,0x8F, +0x80,0x06,0x81,0x05,0x50,0x64,0x00,0x42,0x97,0xB1,0xD5,0x08,0x44,0x00,0x00,0x40, +0x44,0x60,0x01,0x00,0xF0,0x86,0x44,0x80,0x00,0xC0,0x84,0x01,0x80,0x28,0x49,0xFF, +0xD9,0xEA,0x80,0x26,0x84,0x01,0x49,0xFF,0xFA,0x6A,0x84,0x00,0x84,0x21,0x49,0xFF, +0xD9,0x9A,0x80,0x26,0x84,0x04,0x46,0x60,0x00,0x81,0x49,0xFF,0xFA,0x60,0x84,0x01, +0x84,0x26,0x49,0xFF,0xE5,0x31,0x04,0x13,0x03,0x97,0x46,0x0F,0x81,0xC0,0x50,0x00, +0x0F,0xFF,0xFE,0x0E,0x46,0x10,0x08,0x2D,0xFE,0x0F,0x14,0x03,0x03,0x97,0x04,0x13, +0x03,0x95,0x44,0x0F,0xF0,0x3F,0xFE,0x0E,0x58,0x00,0x00,0x40,0x14,0x03,0x03,0x95, +0x04,0x13,0x03,0x99,0x46,0x0F,0xFC,0x0F,0x50,0x00,0x0F,0xFF,0xFE,0x0E,0x44,0x17, +0x00,0x00,0xFE,0x0F,0x84,0x41,0x80,0x62,0x14,0x03,0x03,0x99,0x50,0x13,0x06,0x5C, +0x50,0x03,0x0A,0x5C,0x49,0xFF,0xD5,0xEE,0x84,0x41,0x80,0x62,0x50,0x03,0x0A,0x54, +0x50,0x13,0x06,0x54,0x49,0xFF,0xD5,0xE6,0x84,0x41,0x80,0x62,0x50,0x03,0x0A,0x64, +0x50,0x13,0x06,0x64,0x49,0xFF,0xD5,0xDE,0x84,0x04,0x80,0x28,0x49,0xFF,0xD9,0x9B, +0x04,0x13,0x00,0x2F,0x44,0x0F,0xC0,0xFF,0xFE,0x46,0x58,0x10,0x84,0x00,0x14,0x13, +0x00,0x2F,0x04,0x13,0x00,0x2D,0xFE,0x46,0x58,0x10,0x81,0x00,0x14,0x13,0x00,0x2D, +0x04,0x13,0x00,0x2C,0xFE,0x0E,0x58,0x00,0x2D,0x00,0x14,0x03,0x00,0x2C,0x84,0x00, +0x49,0xFF,0xE4,0x6C,0x84,0x01,0x49,0xFF,0xE4,0x75,0x84,0x01,0x84,0x20,0x84,0x44, +0x84,0x62,0x44,0x40,0x00,0x30,0xFA,0xA0,0x49,0xFF,0xD6,0x02,0x04,0x13,0x00,0x17, +0x44,0x0F,0xFE,0xFF,0xFE,0x0E,0x14,0x03,0x00,0x17,0xA0,0x36,0x58,0x00,0x00,0x01, +0xA8,0x36,0xF0,0x08,0x5A,0x00,0x0F,0x0A,0x04,0x03,0x00,0x23,0x04,0x9F,0x80,0x08, +0x92,0x04,0x96,0x1F,0xF0,0x8A,0xD5,0x04,0x84,0x00,0xF0,0x8A,0x85,0x2D,0x5A,0xA8, +0xFF,0x05,0xF0,0x0C,0x5A,0x00,0xFF,0x12,0x50,0x0F,0x80,0x5B,0xB6,0x1F,0x50,0x1F, +0x80,0x56,0x50,0x0F,0x80,0x55,0x50,0x2F,0x80,0x57,0xB0,0xD6,0x50,0x4F,0x80,0x59, +0x50,0x5F,0x80,0x5A,0x49,0xFF,0xFA,0x89,0x84,0xC1,0x80,0x0A,0xF1,0x0C,0x80,0x46, +0x84,0x65,0x84,0x80,0x80,0xA6,0xB6,0xDF,0x49,0xFF,0xFA,0xA6,0xF0,0x0F,0x85,0x40, +0xF0,0x81,0xF0,0x10,0x44,0x20,0x00,0xFF,0xF0,0x82,0xF0,0x11,0x80,0x66,0xF4,0x0D, +0xF5,0x0E,0x44,0x10,0xFF,0xFF,0xF0,0x83,0xB6,0xDF,0x80,0x06,0x14,0xAF,0x80,0x04, +0x49,0xFF,0xFB,0x26,0x80,0x0A,0x49,0xFF,0xF8,0x8F,0x46,0x10,0x00,0x80,0x46,0x05, +0x55,0x55,0x50,0x00,0x05,0x55,0x14,0x00,0x80,0x47,0x14,0x00,0x80,0x49,0x49,0xFF, +0xD5,0x8E,0x49,0xFF,0xF6,0x92,0x80,0x06,0x49,0xFF,0xF8,0x7E,0x5A,0x78,0x0F,0x1C, +0xF0,0x0B,0x84,0xE6,0x40,0x64,0x80,0x01,0xE0,0xC7,0xE9,0x1E,0x49,0xFF,0xF9,0xDE, +0x49,0xFF,0xF6,0x79,0x49,0xFF,0xD5,0xD3,0x81,0x40,0x49,0xFF,0xD5,0x78,0x4E,0xA2, +0x00,0x14,0x8C,0xE1,0x97,0xF8,0x84,0x01,0x80,0x27,0x49,0xFF,0xE4,0x55,0x49,0xFF, +0xF6,0x74,0xD5,0xEB,0xF0,0x08,0xE2,0x07,0xE8,0x03,0x9F,0xC1,0x97,0xF8,0x84,0x01, +0x80,0x27,0x49,0xFF,0xE4,0x49,0x49,0xFF,0xF6,0x5E,0x84,0x00,0x49,0xFF,0xF8,0x54, +0xF0,0x0B,0x40,0x64,0x80,0x01,0xE0,0xE6,0xE9,0x06,0x97,0xF0,0x84,0x01,0x80,0x27, +0x49,0xFF,0xE4,0x3A,0xE0,0xE6,0xE8,0x13,0x84,0x20,0x40,0x74,0x9C,0x01,0xB0,0xD7, +0x9C,0x89,0x88,0x23,0x96,0x11,0xA7,0x49,0x8C,0xA1,0xDF,0x06,0x96,0x00,0x84,0x21, +0x49,0xFF,0xD8,0x89,0xD5,0x04,0x80,0x22,0x5A,0x28,0x09,0xF3,0x49,0xFF,0xF6,0x3B, +0x46,0x65,0x55,0x55,0x84,0x01,0x49,0xFF,0xF8,0x2F,0x50,0x63,0x05,0x55,0x84,0x40, +0x80,0x06,0x80,0xA2,0x80,0x28,0xF3,0x09,0x50,0x4F,0x81,0x10,0x49,0xFF,0xFC,0xF5, +0x80,0x06,0x84,0x40,0x46,0x6A,0xAA,0xAA,0x80,0xA2,0x50,0x63,0x0A,0xAA,0xF1,0x06, +0xF3,0x09,0x50,0x4F,0x85,0x90,0x49,0xFF,0xFC,0xE8,0x80,0x06,0x80,0x28,0x84,0x41, +0xF3,0x09,0x50,0x4F,0x81,0x10,0x84,0xA0,0x49,0xFF,0xFC,0xDF,0x80,0x06,0xF1,0x06, +0x84,0x41,0xF3,0x09,0x50,0x4F,0x85,0x90,0x84,0xA0,0x49,0xFF,0xFC,0xD6,0x50,0x0F, +0x81,0x10,0x50,0x1F,0x85,0x90,0xF2,0x07,0x49,0xFF,0xF9,0x91,0xF6,0x09,0x85,0x20, +0x92,0xC2,0x97,0xB1,0x44,0x00,0x00,0xFF,0x40,0xA0,0x24,0x0C,0xFA,0x02,0x42,0x04, +0x80,0x24,0x96,0x01,0xF0,0x89,0x50,0x7F,0x81,0x10,0x80,0x0A,0x80,0x28,0xF2,0x09, +0x80,0x66,0x80,0x87,0x84,0xA1,0x49,0xFF,0xFC,0xB8,0x8D,0x28,0x80,0x0A,0xF1,0x06, +0xF2,0x09,0x80,0x66,0x50,0x4F,0x85,0x90,0x84,0xA1,0x49,0xFF,0xFC,0xAE,0x5A,0x98, +0x20,0xE3,0x80,0x07,0x50,0x1F,0x85,0x90,0xF2,0x07,0x46,0xA0,0x30,0x30,0x49,0xFF, +0xF9,0x66,0x50,0x05,0x03,0x03,0x85,0x20,0xF0,0x8B,0xF7,0x89,0xF0,0x0B,0x40,0x74, +0x80,0x13,0x40,0xA0,0x24,0x0C,0x80,0x0A,0x80,0x28,0x80,0x47,0x80,0x66,0xF4,0x09, +0x84,0xA2,0x49,0xFF,0xFC,0x92,0x8D,0x22,0x80,0x0A,0xF1,0x06,0x80,0x47,0x80,0x66, +0x50,0x4F,0x85,0x90,0x84,0xA2,0x49,0xFF,0xFC,0x88,0x5A,0x98,0x08,0xE9,0xF0,0x09, +0x50,0x1F,0x85,0x90,0xF2,0x07,0x49,0xFF,0xF9,0x42,0x2E,0x07,0xEF,0xBD,0xC0,0x04, +0x49,0xFF,0xE6,0x81,0xD5,0x03,0x44,0x0F,0xED,0xED,0x44,0x44,0x80,0x10,0x3C,0x0B, +0xF8,0x6F,0xB4,0xA4,0xB4,0x04,0xB4,0x24,0x40,0x30,0x58,0x09,0xB4,0x04,0x92,0xB6, +0x92,0x14,0x54,0x42,0x80,0x08,0x40,0x20,0x88,0x09,0x54,0x10,0x00,0x01,0x54,0x01, +0x80,0x04,0xFE,0x27,0xFE,0x0F,0x54,0x11,0x00,0x02,0xFE,0x0F,0x3E,0x07,0xF0,0xDC, +0x46,0x00,0x00,0x80,0x84,0x3F,0x14,0x10,0x00,0x47,0x14,0x10,0x00,0x49,0x04,0x10, +0x04,0x17,0x84,0xDE,0x58,0x10,0x81,0x00,0x14,0x10,0x04,0x17,0x04,0x10,0x04,0x06, +0xFE,0x76,0x14,0x10,0x04,0x06,0x84,0x01,0x49,0xFF,0xD7,0x1B,0xF1,0x12,0x44,0x04, +0x2C,0x14,0x84,0x41,0xB6,0x20,0xF1,0x13,0x44,0x04,0x2C,0x1C,0x80,0x62,0xB6,0x20, +0x44,0x04,0x28,0x14,0x44,0x14,0x24,0x14,0x49,0xFF,0xD4,0x3C,0x84,0x41,0x80,0x62, +0x44,0x04,0x28,0x1C,0x44,0x14,0x24,0x1C,0x49,0xFF,0xD4,0x34,0x46,0x00,0x00,0x82, +0xA0,0x44,0xFF,0x8E,0xA9,0x84,0xA0,0x84,0x44,0x1E,0xFF,0xFF,0xFE,0x56,0xA8,0x44, +0x84,0x01,0x49,0xFF,0xF5,0x0F,0xB0,0x38,0x49,0xFF,0xD5,0xBE,0xB0,0x26,0x49,0xFF, +0xD5,0xF1,0x84,0x01,0x49,0xFF,0xE2,0xCA,0x84,0x00,0x49,0xFF,0xE2,0xD3,0x84,0x01, +0x84,0x22,0x80,0x61,0x80,0xA0,0x84,0x44,0x44,0x40,0x00,0x3F,0x49,0xFF,0xD4,0x60, +0x84,0x20,0x84,0x01,0x49,0xFF,0xE3,0x58,0x49,0x00,0x08,0xA8,0x84,0x00,0x49,0xFF, +0xF5,0x4E,0x84,0x00,0x49,0xFF,0xF5,0x93,0x84,0x00,0x49,0xFF,0xF4,0x94,0xF0,0x08, +0x5A,0x00,0x0F,0x06,0xF0,0x0A,0x84,0x21,0x49,0xFF,0xD7,0x75,0x00,0x6F,0x80,0x5B, +0x00,0x0F,0x80,0x55,0x00,0x1F,0x80,0x56,0x00,0x2F,0x80,0x57,0x00,0x3F,0x80,0x58, +0x00,0x4F,0x80,0x59,0x00,0x5F,0x80,0x5A,0xB6,0xDF,0x49,0xFF,0xF9,0x15,0xF0,0x10, +0x44,0x10,0x00,0xF0,0xB6,0x1F,0xF0,0x11,0xF3,0x0D,0xF0,0x81,0x84,0x01,0x80,0x40, +0xF4,0x0E,0xF5,0x0F,0x49,0xFF,0xF9,0x69,0x49,0xFF,0xF8,0xC7,0x51,0xFF,0x8A,0x10, +0xFC,0xC0,0xFC,0x48,0x2E,0x07,0xF0,0xEB,0x2E,0x17,0xF0,0xEC,0x40,0x00,0x20,0x08, +0xFE,0x0F,0xF0,0x8C,0x2E,0x07,0xF0,0xED,0x2E,0x67,0xF0,0xF0,0xF0,0x87,0x2E,0x07, +0xF0,0xEE,0x2E,0x77,0xF0,0xF2,0x96,0x06,0xF0,0x8D,0x2E,0x07,0xF0,0xEF,0xF0,0x88, +0x54,0x03,0x00,0x0F,0xF0,0x89,0x2E,0x07,0xF0,0xF1,0x92,0xC4,0x54,0xA0,0x00,0x0F, +0x40,0x80,0x10,0x09,0x84,0x1F,0x10,0x0F,0x80,0x39,0x10,0x0F,0x80,0x3A,0x10,0x0F, +0x80,0x3B,0x10,0x0F,0x80,0x3C,0x10,0x0F,0x80,0x3D,0x10,0x0F,0x80,0x3E,0x10,0x0F, +0x80,0x3F,0x2E,0x07,0xF0,0xE9,0x97,0x86,0x5A,0x08,0x08,0x08,0x2E,0x17,0xF0,0xF3, +0x2E,0x97,0xF0,0xF4,0xF1,0x86,0xD5,0x0B,0x5A,0x08,0x05,0x06,0x2E,0x97,0xF0,0xF3, +0xF7,0x86,0xD5,0x05,0x44,0x90,0x00,0xFF,0x14,0x9F,0x80,0x06,0x84,0x20,0x3C,0x1B, +0xF8,0x6F,0x3E,0x17,0xF0,0xDC,0x5A,0x08,0x05,0x26,0x46,0x00,0x00,0x82,0xA0,0x44, +0x58,0x10,0x80,0x01,0xA8,0x44,0xA0,0x84,0x44,0x11,0x00,0x00,0xFE,0x57,0xA8,0x44, +0x84,0x00,0x80,0x20,0x49,0xFF,0xF7,0xC7,0x84,0x00,0x80,0x20,0x49,0xFF,0xE2,0xC4, +0x46,0x10,0x00,0x81,0x44,0x0F,0xFD,0xFF,0x04,0x20,0x80,0x33,0xFE,0x16,0x14,0x00, +0x80,0x33,0x84,0x00,0x84,0x21,0x49,0xFF,0xD7,0x82,0x84,0x00,0x80,0x20,0x49,0xFF, +0xCE,0x43,0x84,0x00,0x49,0xFF,0xD2,0x0A,0x84,0x00,0x49,0xFF,0xD2,0x1B,0xF0,0x07, +0x5A,0x00,0xFF,0x16,0x46,0x00,0x00,0x81,0x04,0x10,0x00,0x23,0x04,0x00,0x00,0x23, +0x96,0x5F,0x92,0x0C,0x96,0x1F,0xF1,0x8B,0xF0,0x8A,0x84,0x20,0xF0,0x07,0x49,0xFF, +0xF9,0x75,0xF0,0x07,0x84,0x23,0x49,0xFF,0xF9,0x71,0xD5,0x04,0x84,0x00,0xF0,0x8A, +0xF0,0x8B,0xF0,0x06,0x5A,0x08,0xFF,0x04,0x5A,0x90,0xFF,0x12,0x50,0x0F,0x80,0x3F, +0xB6,0x1F,0x50,0x1F,0x80,0x3A,0x50,0x0F,0x80,0x39,0x50,0x2F,0x80,0x3B,0xB0,0xCF, +0x50,0x4F,0x80,0x3D,0x50,0x5F,0x80,0x3E,0x49,0xFF,0xF8,0x37,0x84,0x41,0x84,0x01, +0x80,0x29,0x80,0xA2,0x85,0x20,0xB6,0x1F,0x84,0x65,0xF0,0x06,0x84,0x80,0x49,0xFF, +0xF8,0x53,0x80,0x09,0xF1,0x0C,0x44,0x20,0x00,0xFF,0x80,0x69,0xF4,0x08,0xF5,0x09, +0xB7,0x3F,0xF6,0x81,0x14,0xAF,0x80,0x02,0x14,0x8F,0x80,0x03,0x14,0x9F,0x80,0x04, +0x49,0xFF,0xF8,0xD6,0xF0,0x0D,0x84,0x63,0xF0,0x84,0xB6,0x7F,0x84,0x05,0xF6,0x81, +0x14,0xAF,0x80,0x02,0x14,0x8F,0x80,0x03,0xF1,0x0C,0x44,0x20,0x00,0xFF,0xF4,0x08, +0xF5,0x09,0x49,0xFF,0xF8,0xC5,0x2E,0x07,0xF0,0xE9,0x5A,0x08,0x08,0x2A,0x96,0x3A, +0x4E,0x05,0x00,0x04,0x84,0x01,0xD5,0x02,0x80,0x09,0x49,0xFF,0xDE,0x23,0x54,0x13, +0x80,0x01,0x46,0x00,0x00,0x82,0xC9,0x13,0xA0,0x44,0x58,0x10,0x80,0x01,0xA8,0x44, +0xA0,0x84,0x44,0x11,0x00,0x00,0xFE,0x57,0xA8,0x44,0x40,0x03,0x98,0x09,0x54,0x13, +0x80,0x3E,0x96,0x06,0x92,0x21,0x49,0xFF,0xF7,0x2E,0xD5,0x0A,0xA0,0x84,0x84,0x3E, +0xFE,0x56,0xA8,0x44,0xA0,0x84,0x44,0x1E,0xFF,0xFF,0xFE,0x56,0xA8,0x44,0x49,0xFF, +0xF7,0x86,0x2E,0x07,0xEF,0xBD,0xC0,0x04,0x49,0xFF,0xE4,0xD5,0xD5,0x03,0x44,0x0F, +0xED,0xED,0x44,0x44,0x80,0x10,0x3C,0x0B,0xF8,0x6F,0xB4,0xA4,0xB4,0x04,0xB4,0x24, +0x40,0x30,0x58,0x09,0xB4,0x04,0x92,0xB6,0x92,0x14,0x40,0x20,0x88,0x09,0x54,0x42, +0x80,0x08,0x54,0x10,0x00,0x01,0x54,0x01,0x80,0x04,0xFE,0x27,0xFE,0x0F,0x54,0x11, +0x00,0x02,0xFE,0x0F,0x3E,0x07,0xF0,0xDC,0x84,0x01,0x49,0xFF,0xD1,0x57,0x84,0x01, +0x49,0xFF,0xD1,0x68,0x2E,0x07,0xF0,0xE9,0x5A,0x08,0x08,0x08,0x84,0x00,0x49,0xFF, +0xF5,0xD3,0x49,0xFF,0xF3,0xD8,0xD5,0x19,0x5A,0x08,0x05,0x18,0x46,0x00,0x00,0x82, +0x84,0x3E,0xA0,0x84,0xFE,0x56,0xA8,0x44,0xA0,0x84,0x44,0x1E,0xFF,0xFF,0xFE,0x56, +0xA8,0x44,0x46,0x10,0x00,0x81,0x04,0x00,0x80,0x33,0x58,0x00,0x02,0x00,0x14,0x00, +0x80,0x33,0x84,0x00,0x49,0xFF,0xF4,0xD9,0x2E,0x07,0xF0,0xE9,0x5A,0x08,0x08,0x16, +0x54,0x03,0x80,0x01,0xC8,0x0C,0x46,0x00,0x00,0x82,0x84,0x3E,0xA0,0x84,0xFE,0x56, +0xA8,0x44,0xA0,0x84,0x44,0x1E,0xFF,0xFF,0xFE,0x56,0xA8,0x44,0x97,0xFA,0x4E,0x75, +0x00,0x05,0x84,0x00,0x49,0xFF,0xDD,0x9E,0xF0,0x07,0x5A,0x00,0xFF,0x0A,0xF0,0x0B, +0x84,0x20,0x49,0xFF,0xD5,0xE8,0xF0,0x0A,0x84,0x23,0x49,0xFF,0xD5,0xE4,0x00,0x7F, +0x80,0x3F,0x00,0x0F,0x80,0x39,0x00,0x1F,0x80,0x3A,0x00,0x2F,0x80,0x3B,0x00,0x3F, +0x80,0x3C,0x00,0x4F,0x80,0x3D,0x00,0x5F,0x80,0x3E,0xB6,0xFF,0x49,0xFF,0xF7,0x84, +0x84,0x00,0x80,0x40,0xF3,0x08,0xF4,0x09,0x80,0xA6,0xB7,0x5F,0x14,0x8F,0x80,0x01, +0x44,0x10,0x00,0xF0,0x49,0xFF,0xF7,0xD9,0x84,0x05,0x44,0x10,0x00,0xF0,0x84,0x43, +0xF3,0x08,0xF4,0x09,0x80,0xA6,0xB7,0x5F,0x14,0x8F,0x80,0x01,0x49,0xFF,0xF7,0xCD, +0x49,0xFF,0xF7,0x2B,0xFC,0xC8,0xFC,0x40,0x51,0xFF,0xF6,0xB0,0xB0,0x14,0x84,0x20, +0x44,0x20,0x04,0x80,0x49,0x00,0x0D,0xA6,0x84,0x20,0x44,0x20,0x04,0x80,0x50,0x0F, +0x84,0xD0,0x49,0x00,0x0D,0x9F,0x2E,0x67,0xF0,0xEC,0x2E,0x07,0xF0,0xED,0x40,0x63, +0x20,0x08,0xFE,0x37,0xF0,0x8D,0x2E,0x07,0xF0,0xEE,0x2E,0x17,0xF0,0xEB,0xF0,0x86, +0x2E,0x07,0xF0,0xEF,0x2E,0x67,0xF0,0xF3,0xF0,0x87,0x2E,0x07,0xF0,0xF0,0x85,0x4A, +0x54,0x20,0x00,0x0F,0x92,0x04,0x96,0x06,0xF0,0x89,0x2E,0x07,0xF0,0xF1,0xF2,0x88, +0x54,0x90,0x00,0x0F,0x40,0x80,0x10,0x09,0x2E,0x07,0xF0,0xF2,0xF0,0x8E,0x2E,0x07, +0xF0,0xF4,0xF0,0x8F,0x84,0x1F,0x10,0x0F,0x80,0x49,0x10,0x0F,0x80,0x4A,0x10,0x0F, +0x80,0x4B,0x10,0x0F,0x80,0x4C,0x10,0x0F,0x80,0x4D,0x10,0x0F,0x80,0x4E,0x10,0x0F, +0x80,0x4F,0x84,0x00,0x3C,0x0B,0xF8,0x6F,0x3E,0x07,0xF0,0xDC,0x5A,0x10,0xFF,0x03, +0x81,0x41,0x2E,0x07,0xF0,0xEA,0x96,0x06,0xF0,0x8B,0x5A,0x08,0x01,0x14,0x46,0x00, +0x00,0x82,0xA0,0x44,0x58,0x10,0x80,0x01,0xA8,0x44,0xA0,0x84,0x44,0x11,0x00,0x00, +0xFE,0x57,0xA8,0x44,0x84,0x00,0x80,0x20,0x49,0xFF,0xF6,0x25,0xF0,0x0B,0x49,0xFF, +0xDD,0x01,0x49,0xFF,0xF2,0xF6,0xF0,0x91,0x49,0xFF,0xF2,0xF6,0xF0,0x90,0x84,0x00, +0x49,0xFF,0xD0,0x74,0x84,0x00,0x49,0xFF,0xD0,0x85,0xF0,0x06,0x5A,0x00,0xFF,0x16, +0x46,0x00,0x00,0x81,0x04,0x10,0x00,0x23,0x04,0x00,0x00,0x23,0x96,0x5F,0x92,0x0C, +0x96,0x1F,0xF1,0x8C,0xF0,0x8A,0x84,0x20,0xF0,0x06,0x49,0xFF,0xF7,0xDF,0xF0,0x06, +0x84,0x23,0x49,0xFF,0xF7,0xDB,0xD5,0x04,0x84,0x00,0xF0,0x8A,0xF0,0x8C,0xF0,0x0E, +0x5A,0x08,0xFF,0x04,0x5A,0x60,0xFF,0x12,0x50,0x0F,0x80,0x4F,0xB6,0x1F,0x50,0x1F, +0x80,0x4A,0x50,0x0F,0x80,0x49,0x50,0x2F,0x80,0x4B,0xB0,0xD3,0x50,0x4F,0x80,0x4D, +0x50,0x5F,0x80,0x4E,0x49,0xFF,0xF6,0xA1,0x84,0xE1,0x80,0x26,0xF0,0x0E,0x80,0x47, +0x84,0x65,0x84,0x80,0x80,0xA7,0xB6,0xFF,0x49,0xFF,0xF6,0xBE,0xF1,0x09,0x84,0x00, +0x80,0x60,0xB6,0x1F,0xF1,0x81,0xF0,0x84,0xF1,0x0D,0xF2,0x0F,0xF4,0x07,0xF5,0x08, +0x14,0x9F,0x80,0x02,0x14,0x8F,0x80,0x03,0x49,0xFF,0xF7,0x42,0xF0,0x09,0x84,0x63, +0xB6,0x7F,0xF0,0x81,0xF1,0x0D,0x84,0x05,0xF2,0x0F,0xF4,0x07,0xF5,0x08,0x14,0x9F, +0x80,0x02,0x14,0x8F,0x80,0x03,0xF7,0x84,0x49,0xFF,0xF7,0x32,0x49,0xFF,0xF6,0x1F, +0x2E,0x67,0xEF,0xC8,0x97,0xB0,0xC6,0x07,0x2E,0x07,0xEF,0xBD,0xC0,0x3C,0x49,0xFF, +0xE3,0x6A,0xD5,0x3B,0x50,0x7F,0x84,0xD0,0x4C,0x65,0x3F,0xF8,0x49,0xFF,0xF6,0x0F, +0xF2,0x10,0x84,0x00,0xB0,0xD4,0x50,0x45,0x7F,0xFF,0xF1,0x11,0x38,0x10,0x81,0x11, +0xCE,0x10,0x38,0x13,0x81,0x09,0x38,0x11,0x81,0x09,0x5A,0xA8,0x01,0x1F,0xA5,0x50, +0x9A,0x69,0x96,0x49,0x97,0x4B,0xAD,0x50,0x4E,0x54,0x00,0x18,0xFE,0x4A,0xD5,0x14, +0x38,0x53,0x81,0x11,0xE0,0xA1,0xE8,0x03,0x38,0x13,0x81,0x09,0x38,0xF1,0x81,0x11, +0xE0,0x2F,0xE8,0x03,0x38,0x11,0x81,0x09,0x4C,0x62,0x40,0x08,0x38,0x13,0x81,0x01, +0x38,0x51,0x81,0x01,0x8A,0x25,0xAC,0x50,0x8C,0x01,0x8C,0x42,0x5A,0x0A,0x40,0xD7, +0x8C,0xC1,0xD5,0xCB,0x44,0x0F,0xED,0xED,0x44,0x44,0x80,0x10,0x3C,0x0B,0xF8,0x6F, +0xB4,0xA4,0xB4,0x04,0xB4,0x24,0x40,0x30,0x58,0x09,0xB4,0x04,0x92,0xB6,0x92,0x14, +0x40,0x20,0x88,0x09,0x54,0x42,0x80,0x08,0x54,0x10,0x00,0x01,0x54,0x01,0x80,0x04, +0xFE,0x27,0xFE,0x0F,0x54,0x11,0x00,0x02,0xFE,0x0F,0x3E,0x07,0xF0,0xDC,0x46,0x00, +0x00,0x82,0x84,0x3E,0xA0,0x84,0xFE,0x56,0xA8,0x44,0xA0,0x84,0x44,0x1E,0xFF,0xFF, +0xFE,0x56,0xA8,0x44,0x84,0x01,0x49,0xFF,0xCF,0xA9,0x84,0x01,0x49,0xFF,0xCF,0xBA, +0x4E,0xA2,0x00,0x09,0xF0,0x0B,0x5A,0x08,0x01,0x0E,0x84,0x00,0x49,0xFF,0xDC,0x22, +0xD5,0x09,0xF5,0x10,0x80,0x0A,0x50,0x12,0x84,0x80,0x1A,0x02,0x80,0x01,0xD9,0xFE, +0xD5,0xF2,0xF0,0x06,0x5A,0x00,0xFF,0x0A,0xF0,0x0C,0x84,0x20,0x49,0xFF,0xD4,0x63, +0xF0,0x0A,0x84,0x23,0x49,0xFF,0xD4,0x5F,0x00,0x6F,0x80,0x4F,0x00,0x0F,0x80,0x49, +0x00,0x1F,0x80,0x4A,0x00,0x2F,0x80,0x4B,0x00,0x3F,0x80,0x4C,0x00,0x4F,0x80,0x4D, +0x00,0x5F,0x80,0x4E,0xB6,0xDF,0x49,0xFF,0xF5,0xFF,0x84,0x00,0x80,0x40,0xF3,0x07, +0xF4,0x08,0xF5,0x09,0xB7,0x3F,0x14,0x8F,0x80,0x01,0x44,0x10,0x00,0xF0,0x49,0xFF, +0xF6,0x54,0x84,0x05,0x44,0x10,0x00,0xF0,0x84,0x43,0xF3,0x07,0xF4,0x08,0xF5,0x09, +0xB7,0x3F,0x14,0x8F,0x80,0x01,0x49,0xFF,0xF6,0x48,0x49,0xFF,0xF5,0xA6,0x51,0xFF, +0x89,0x50,0xFC,0xC0,0xFC,0x40,0x51,0xFF,0xF5,0x30,0x49,0xFF,0xCD,0x47,0xF0,0x91, +0x84,0x20,0x44,0x20,0x04,0x80,0x50,0x0F,0x81,0xD0,0x49,0x00,0x0C,0x1B,0x44,0x20, +0x04,0x80,0x84,0x20,0x50,0x0F,0x86,0x50,0x49,0x00,0x0C,0x14,0x2E,0x07,0xF0,0xEF, +0x2E,0x87,0xF0,0xEE,0xF0,0x88,0x2E,0x07,0xF0,0xF0,0x2E,0xA7,0xF0,0xF2,0x54,0x10, +0x00,0x0F,0x92,0x04,0x96,0x06,0xF0,0x8A,0x2E,0x07,0xF0,0xF1,0xF1,0x89,0x54,0x10, +0x00,0x0F,0x92,0x04,0xF0,0x8C,0x84,0x1F,0xF1,0x8B,0x10,0x0F,0x80,0x49,0x2E,0x17, +0xF0,0xED,0x10,0x0F,0x80,0x4A,0x10,0x0F,0x80,0x4B,0x10,0x0F,0x80,0x4C,0x10,0x0F, +0x80,0x4D,0x10,0x0F,0x80,0x4E,0x10,0x0F,0x80,0x4F,0x54,0x04,0x00,0x01,0xF0,0x8F, +0x84,0x00,0xF1,0x87,0x2E,0x67,0xF0,0xF3,0x2E,0x77,0xF0,0xEC,0x2E,0x97,0xF0,0xEB, +0x3C,0x0B,0xF8,0x6F,0x3E,0x07,0xF0,0xDC,0x49,0xFF,0xF1,0x8E,0xF0,0x8D,0x84,0x01, +0x49,0xFF,0xDB,0x6B,0x2E,0x07,0xF0,0xE9,0xF1,0x07,0x5A,0x08,0x32,0x12,0x2E,0x77, +0xF0,0xEC,0x2E,0x07,0xF0,0xED,0x40,0x73,0xA0,0x08,0xFF,0xC7,0x2E,0x87,0xF0,0xEE, +0x84,0x01,0x5A,0x90,0xFF,0x17,0x14,0x9F,0x80,0x07,0xF0,0x8F,0xD5,0x15,0x5A,0x00, +0x33,0x06,0x40,0x73,0xA0,0x08,0xFF,0xCF,0xD5,0x0A,0x2E,0x77,0xF0,0xEB,0x2E,0x07, +0xF0,0xEC,0x40,0x73,0xA0,0x08,0xFF,0xC7,0x2E,0x87,0xF0,0xED,0x84,0x00,0xD5,0x03, +0xF0,0x8F,0x84,0x0A,0xF0,0x87,0x5A,0x80,0xFF,0x16,0x46,0x00,0x00,0x81,0x04,0x10, +0x00,0x23,0x04,0x00,0x00,0x23,0x96,0x5F,0x92,0x0C,0x96,0x1F,0xF1,0x90,0xF0,0x8E, +0x84,0x20,0x80,0x08,0x49,0xFF,0xF6,0x52,0x80,0x08,0x84,0x23,0x49,0xFF,0xF6,0x4E, +0xD5,0x04,0x84,0x00,0xF0,0x8E,0xF0,0x90,0x5A,0xA8,0xFF,0x04,0x5A,0x60,0xFF,0x12, +0x50,0x0F,0x80,0x4F,0xB6,0x1F,0x50,0x1F,0x80,0x4A,0x50,0x0F,0x80,0x49,0x50,0x2F, +0x80,0x4B,0xB0,0xD3,0x50,0x4F,0x80,0x4D,0x50,0x5F,0x80,0x4E,0x49,0xFF,0xF5,0x15, +0x85,0x21,0x80,0x0A,0x80,0x26,0x80,0x49,0x84,0x65,0x84,0x80,0x80,0xA9,0xB7,0x3F, +0x49,0xFF,0xF5,0x32,0xF0,0x0A,0x84,0xC0,0xF0,0x81,0xF0,0x0B,0x80,0x27,0xF0,0x82, +0xF0,0x0C,0x44,0x20,0x00,0xFF,0xF0,0x83,0x80,0x66,0x80,0x06,0xF4,0x08,0xF5,0x09, +0xB6,0xDF,0xF6,0x84,0x49,0xFF,0xF5,0xB4,0xF0,0x0A,0x85,0x43,0xF0,0x81,0xF0,0x0B, +0x80,0x27,0xF0,0x82,0xF0,0x0C,0x44,0x20,0x00,0xFF,0xF0,0x83,0xF0,0x0F,0x80,0x6A, +0xF4,0x08,0xF5,0x09,0xF0,0x84,0xB7,0x5F,0x84,0x05,0x49,0xFF,0xF5,0xA1,0x49,0xFF, +0xCD,0x6E,0x80,0x06,0x49,0xFF,0xCC,0x62,0x80,0x06,0x49,0xFF,0xCC,0x51,0x80,0x06, +0x49,0xFF,0xF1,0x1D,0x80,0x06,0x49,0xFF,0xF0,0x66,0x80,0x09,0x49,0xFF,0xF0,0x6F, +0x49,0xFF,0xF0,0x16,0x49,0xFF,0xEF,0xFF,0x80,0x0A,0x49,0xFF,0xF0,0xB3,0x80,0x06, +0x49,0xFF,0xDC,0x32,0x49,0x00,0x04,0xEE,0x84,0x04,0x49,0xFF,0xD6,0x19,0x44,0x00, +0x7F,0xFF,0x49,0x00,0x04,0xF4,0x80,0x06,0x49,0xFF,0xD6,0x45,0x80,0x06,0x49,0xFF, +0xD5,0x39,0x80,0x06,0x49,0xFF,0xCE,0xE6,0x49,0xFF,0xD7,0xEE,0xF0,0x8F,0x80,0x06, +0x49,0xFF,0xD7,0xE1,0x80,0x09,0x49,0xFF,0xD0,0xFB,0x49,0xFF,0xD6,0xE7,0x49,0xFF, +0xCF,0x3F,0x5A,0x00,0x01,0xFE,0x84,0x01,0x49,0xFF,0xF2,0xCE,0x49,0xFF,0xF0,0xDD, +0x46,0x10,0x00,0x91,0x04,0x00,0x80,0x11,0x58,0x00,0x00,0x02,0x14,0x00,0x80,0x11, +0x2E,0x07,0xF0,0xE9,0x5A,0x08,0x32,0x74,0xF0,0x0D,0x84,0x20,0x44,0x20,0x04,0x80, +0x49,0x00,0x0B,0x00,0x2E,0x67,0xEF,0xC8,0x97,0xB0,0xC6,0x09,0x2E,0x07,0xEF,0xBD, +0x4E,0x02,0x00,0xA0,0x49,0xFF,0xE1,0x87,0x48,0x00,0x00,0x9E,0x44,0x74,0x80,0x08, +0xF0,0x07,0x8C,0x02,0xE2,0xC0,0xE8,0xF3,0x84,0x01,0x49,0xFF,0xF2,0x98,0x49,0xFF, +0xF4,0x0D,0xB4,0x07,0x92,0x02,0x96,0x06,0xC8,0x06,0x49,0x00,0x05,0x06,0x2E,0x07, +0xEF,0xC8,0xC0,0xF8,0x84,0x04,0xAE,0x38,0x84,0x00,0x49,0xFF,0xF2,0x88,0xE6,0xC2, +0xE9,0x43,0x50,0x9F,0x80,0x50,0x80,0x09,0x44,0x10,0x00,0xC0,0x49,0xFF,0xE3,0xCA, +0xF2,0x07,0x80,0x09,0xF3,0x0D,0x84,0x20,0x50,0x4F,0x86,0x50,0x50,0x5F,0x81,0xD0, +0x50,0x91,0x00,0x01,0x5A,0x68,0x02,0x17,0xF2,0x07,0x38,0xA0,0x05,0x11,0x38,0xA2, +0x05,0x09,0x38,0xA2,0x85,0x09,0x5A,0x28,0x01,0x24,0xA4,0x98,0x8A,0x4A,0x96,0x91, +0x40,0xA1,0x00,0x11,0x4E,0xA5,0x00,0x05,0x12,0xA1,0x80,0x00,0xD5,0x19,0xFE,0x92, +0xD5,0x16,0x38,0x20,0x05,0x11,0x38,0xA2,0x05,0x11,0xE1,0x42,0xE8,0x03,0x38,0x22, +0x05,0x09,0x38,0xF2,0x85,0x11,0xE0,0x4F,0xE8,0x03,0x38,0x22,0x85,0x09,0x4C,0x64, +0xC0,0x08,0x38,0x22,0x05,0x01,0x38,0xA2,0x85,0x01,0x8A,0x4A,0xAC,0x98,0x8C,0x21, +0x8C,0x66,0x5A,0x18,0xC0,0xD1,0x8C,0xC1,0x97,0xB1,0xD5,0xA3,0x5A,0x08,0x33,0x98, +0x84,0x01,0x49,0xFF,0xF2,0x3C,0x2E,0x07,0xEF,0xC8,0xC0,0x13,0x84,0x00,0xB1,0x94, +0x49,0xFF,0xF2,0x35,0x80,0x06,0x44,0x10,0x00,0xC0,0x49,0xFF,0xE3,0x7B,0x84,0x20, +0xF0,0x0D,0x44,0x20,0x04,0x80,0x49,0x00,0x0A,0x7D,0x84,0x20,0x84,0x66,0xD5,0x15, +0x84,0xE3,0x44,0x64,0x80,0x08,0x49,0xFF,0xF3,0x99,0xB4,0x06,0x92,0x02,0x96,0x06, +0xC8,0x06,0x49,0x00,0x04,0x92,0x2E,0x07,0xEF,0xC8,0xC0,0xF8,0x8E,0xE1,0x84,0x04, +0x97,0xF9,0xAE,0x30,0xCF,0xF1,0xD5,0xDB,0xF4,0x0D,0x42,0x00,0x8C,0x24,0x38,0x23, +0x05,0x11,0x8C,0x21,0x38,0x22,0x00,0x09,0x5A,0x18,0xC0,0xF8,0x48,0xFF,0xFF,0x60, +0x44,0x0F,0xED,0xED,0x44,0x44,0x80,0x10,0x3C,0x0B,0xF8,0x6F,0xB4,0xA4,0xB4,0x04, +0xB4,0x24,0x40,0x30,0x58,0x09,0xB4,0x04,0x92,0xB6,0x92,0x14,0x54,0x42,0x80,0x08, +0x40,0x20,0x88,0x09,0x54,0x10,0x00,0x01,0x54,0x01,0x80,0x04,0xFE,0x27,0xFE,0x0F, +0x54,0x11,0x00,0x02,0xFE,0x0F,0x46,0x10,0x00,0x91,0x3E,0x07,0xF0,0xDC,0x04,0x20, +0x80,0x11,0x84,0x1D,0xFE,0x16,0x14,0x00,0x80,0x11,0x49,0xFF,0xD5,0xFF,0x84,0x00, +0x49,0xFF,0xF1,0xEA,0x84,0x00,0x49,0xFF,0xD9,0xC0,0x84,0x00,0x49,0xFF,0xD0,0x08, +0xF0,0x0F,0x49,0xFF,0xD6,0xE8,0x84,0x01,0x49,0xFF,0xCD,0xE4,0x49,0xFF,0xE4,0x1D, +0x2E,0x07,0xF0,0xCE,0x84,0x00,0x3E,0x07,0xF0,0xCE,0x3E,0x07,0xF0,0xCD,0xF0,0x11, +0x49,0xFF,0xCB,0x2C,0x84,0x00,0x49,0xFF,0xEF,0xEA,0x84,0x00,0x49,0xFF,0xEF,0x33, +0x84,0x00,0x49,0xFF,0xEF,0x3C,0x49,0xFF,0xEE,0xE3,0x84,0x01,0x49,0xFF,0xD4,0x1A, +0x5A,0x80,0xFF,0x0A,0xF0,0x10,0x84,0x20,0x49,0xFF,0xD2,0x0D,0xF0,0x0E,0x84,0x23, +0x49,0xFF,0xD2,0x09,0x00,0x6F,0x80,0x4F,0x00,0x0F,0x80,0x49,0x00,0x1F,0x80,0x4A, +0x00,0x2F,0x80,0x4B,0x00,0x3F,0x80,0x4C,0x00,0x4F,0x80,0x4D,0x00,0x5F,0x80,0x4E, +0xB6,0xDF,0x49,0xFF,0xF3,0xA9,0xF0,0x0B,0xF3,0x08,0xB6,0x1F,0xF0,0x0C,0xF4,0x09, +0xF0,0x81,0x84,0x00,0x80,0x40,0xF5,0x0A,0x44,0x10,0x00,0xF0,0x49,0xFF,0xF3,0xFD, +0xF0,0x0B,0x44,0x10,0x00,0xF0,0xB6,0x1F,0xF0,0x0C,0x84,0x43,0xF0,0x81,0xF3,0x08, +0x84,0x05,0xF4,0x09,0xF5,0x0A,0x49,0xFF,0xF3,0xF0,0x49,0xFF,0xF3,0x4E,0x51,0xFF, +0x8A,0xD0,0xFC,0xC0,0xFC,0x40,0x51,0xFF,0xF6,0x98,0x2E,0x07,0xF0,0xED,0x2E,0x77, +0xF0,0xF0,0xF0,0x8A,0x2E,0x07,0xF0,0xEF,0xFA,0x58,0xF0,0x83,0x54,0x03,0x80,0x0F, +0x92,0xE4,0xF0,0x84,0x54,0x03,0x80,0x01,0xF0,0x85,0x2E,0x07,0xF0,0xF1,0x2E,0x67, +0xF0,0xF4,0x54,0x10,0x00,0x0F,0x92,0x04,0xF1,0x86,0xF0,0x87,0x84,0x20,0xB0,0x10, +0x49,0x00,0x09,0xB0,0x84,0x20,0x44,0x20,0x04,0x80,0xB0,0x1A,0x49,0x00,0x09,0xAA, +0x50,0x0F,0x84,0xE8,0x84,0x20,0x44,0x20,0x04,0x80,0x49,0x00,0x09,0xA3,0x84,0x00, +0x3C,0x0B,0xF8,0x6F,0x3E,0x07,0xF0,0xDC,0x5A,0x60,0xFF,0x04,0x97,0xF1,0xD5,0x02, +0xFA,0xF8,0x49,0xFF,0xEF,0x46,0xF0,0x8C,0x49,0xFF,0xEF,0x46,0x81,0x20,0x84,0x00, +0x80,0x20,0x80,0x80,0x80,0xA0,0x44,0x22,0x06,0x1C,0x44,0x32,0x06,0x44,0x49,0xFF, +0xDC,0xE8,0x49,0xFF,0xEF,0x48,0x84,0x01,0x49,0xFF,0xF1,0x3E,0xF0,0x0A,0x5A,0x00, +0xFF,0x12,0x46,0x00,0x00,0x81,0x50,0x20,0x00,0x8C,0xB4,0x22,0x96,0x5F,0xF1,0x88, +0xB4,0x22,0xB4,0x02,0x92,0x2C,0x96,0x5F,0x92,0x08,0xF1,0x89,0x54,0xA0,0x00,0x0F, +0xD5,0x06,0x85,0x40,0x14,0xAF,0x80,0x09,0x14,0xAF,0x80,0x08,0x46,0x00,0x00,0x82, +0x84,0xC0,0x50,0x80,0x00,0x10,0x44,0x22,0x06,0x1C,0x84,0x00,0x38,0x11,0x19,0x01, +0xF2,0x8B,0x49,0xFF,0xD0,0x65,0xF2,0x0B,0x84,0x05,0x38,0x11,0x19,0x01,0x49,0xFF, +0xD0,0x5F,0xF2,0x0B,0x84,0x02,0x38,0x11,0x19,0x01,0x49,0xFF,0xD0,0x59,0x44,0x22, +0x06,0x44,0x84,0x20,0x38,0x01,0x18,0x00,0xF2,0x8B,0x49,0xFF,0xD1,0x54,0xF2,0x0B, +0x84,0x23,0x38,0x01,0x18,0x00,0x49,0xFF,0xD1,0x4E,0xF2,0x0B,0x84,0x22,0x38,0x01, +0x18,0x00,0x49,0xFF,0xD1,0x48,0x49,0xFF,0xEF,0x08,0x49,0xFF,0xF2,0x5F,0x49,0xFF, +0xEE,0xFA,0x84,0xA0,0x50,0x3F,0x84,0xE8,0x96,0x29,0xE2,0x07,0xF0,0x8B,0xE8,0x44, +0xF3,0x8F,0xF5,0x8E,0x49,0xFF,0xEE,0xF9,0x49,0xFF,0xF2,0x50,0x49,0xFF,0xEE,0xEB, +0x9E,0x79,0x80,0x49,0x84,0x00,0x51,0xEF,0x80,0x68,0xF1,0x8D,0xF3,0x0F,0xF5,0x0E, +0xF1,0x0C,0xF4,0x0B,0x38,0x10,0x81,0x11,0xCC,0x14,0x38,0x11,0x81,0x09,0x38,0x1F, +0x01,0x09,0x5A,0x78,0x01,0x24,0x02,0xF1,0x00,0x00,0x40,0x17,0x84,0x01,0x96,0x49, +0x40,0xF0,0x80,0x11,0x12,0xF1,0x00,0x00,0x4E,0xF4,0x00,0x19,0xFE,0x4A,0xD5,0x15, +0x38,0xF1,0x81,0x11,0x40,0xF7,0x84,0x07,0xE8,0x03,0x38,0x11,0x81,0x09,0x38,0xFF, +0x01,0x11,0xE0,0x2F,0xE8,0x03,0x38,0x1F,0x01,0x09,0xF1,0x0D,0xD9,0x07,0x38,0x11, +0x81,0x01,0x38,0xFF,0x01,0x01,0x8A,0x2F,0xAC,0x50,0x8C,0x01,0x8C,0x42,0x5A,0x0A, +0x40,0xD1,0x8C,0xA1,0xD5,0xBA,0xB4,0x28,0x84,0x1E,0xFE,0x0E,0xB6,0x08,0xB4,0x28, +0x44,0x0E,0xFF,0xFF,0xFE,0x0E,0xB6,0x08,0x84,0x01,0x49,0xFF,0xCC,0x17,0x84,0x01, +0x49,0xFF,0xCC,0x28,0xB0,0x10,0x80,0xA9,0x38,0x00,0x19,0x01,0x50,0x24,0x84,0x80, +0x2A,0x12,0x80,0x01,0xE0,0x20,0x40,0x00,0xBC,0x1A,0x96,0x01,0xDA,0xFA,0xB0,0xD0, +0x38,0x01,0x99,0x09,0x8C,0xC1,0x5A,0x60,0x14,0x04,0x48,0xFF,0xFF,0x66,0x84,0x00, +0x44,0x10,0xFF,0xFF,0x80,0x40,0x38,0x41,0x81,0x01,0x97,0x40,0xE2,0x81,0x8C,0x01, +0x40,0x12,0x3C,0x1B,0x40,0x22,0xBC,0x1B,0x5A,0x08,0x14,0xF7,0x44,0x02,0x06,0x1C, +0x12,0x24,0x80,0x00,0x38,0x00,0x09,0x01,0x12,0x14,0x80,0x03,0x12,0x04,0x80,0x01, +0x44,0x00,0x00,0xF0,0x12,0x04,0x80,0x02,0x2E,0x07,0xEF,0xBD,0xC0,0x04,0x49,0xFF, +0xDF,0x3A,0xD5,0x03,0x44,0x0F,0xED,0xED,0x44,0x44,0x80,0x10,0x3C,0x0B,0xF8,0x6F, +0xB4,0xA4,0xB4,0x04,0xB4,0x24,0x40,0x30,0x58,0x09,0xB4,0x04,0x92,0xB6,0x92,0x14, +0x40,0x20,0x88,0x09,0x54,0x42,0x80,0x08,0x54,0x10,0x00,0x01,0x54,0x01,0x80,0x04, +0xFE,0x27,0xFE,0x0F,0x54,0x11,0x00,0x02,0xFE,0x0F,0x3E,0x07,0xF0,0xDC,0xF0,0x0A, +0x5A,0x00,0xFF,0x0E,0xF0,0x08,0x84,0x20,0x49,0xFF,0xD0,0x8D,0xF0,0x09,0x84,0x23, +0x49,0xFF,0xD0,0x89,0x80,0x0A,0x84,0x22,0x49,0xFF,0xD0,0x85,0xF0,0x06,0xF3,0x03, +0xB6,0x1F,0xF0,0x07,0xF4,0x04,0xF0,0x81,0x84,0x00,0x80,0x40,0xF5,0x05,0x44,0x10, +0x00,0xF0,0x49,0xFF,0xF2,0x8A,0xF0,0x06,0xF3,0x03,0xB6,0x1F,0xF0,0x07,0xF4,0x04, +0xF0,0x81,0xF5,0x05,0x84,0x05,0x44,0x10,0x00,0xF0,0x84,0x43,0x49,0xFF,0xF2,0x7D, +0xF0,0x06,0x44,0x10,0x00,0xF0,0xB6,0x1F,0xF0,0x07,0xF3,0x03,0xF0,0x81,0x84,0x02, +0x80,0x40,0xF4,0x04,0xF5,0x05,0x49,0xFF,0xF2,0x70,0x49,0xFF,0xF1,0xCE,0x51,0xFF, +0x89,0x68,0xFC,0xC0,0xFC,0x00,0x44,0x04,0x30,0x10,0xB4,0x00,0x92,0x08,0x96,0x00, +0xC0,0x15,0x44,0x14,0x30,0x08,0x84,0x1E,0xB4,0x41,0x44,0x64,0x30,0x0C,0xFE,0x16, +0xB6,0x01,0xB4,0x06,0x58,0x00,0x00,0x01,0xB6,0x06,0x84,0x01,0x49,0xFF,0xD5,0xB0, +0xB4,0x06,0x58,0x00,0x00,0x02,0xB6,0x06,0xFC,0x80,0x44,0x14,0x00,0x40,0x46,0x20, +0x81,0x00,0xB6,0x41,0x44,0x64,0x30,0x0C,0xB6,0x01,0xB4,0x06,0x92,0x04,0x96,0x06, +0xC8,0xE1,0x44,0x00,0x00,0x64,0x49,0xFF,0xD5,0x92,0x3C,0x00,0x00,0xC1,0x8C,0x01, +0x96,0x01,0x5C,0xF0,0x00,0x64,0x3C,0x08,0x00,0xC1,0xE9,0xF0,0xD5,0xD3,0xFC,0x40, +0x44,0x64,0x80,0x88,0x46,0xA0,0x10,0x00,0xB4,0x06,0x46,0x90,0x20,0x00,0x40,0x00, +0x28,0x04,0xB6,0x06,0xB4,0x06,0x44,0x74,0x55,0x08,0x40,0x00,0x24,0x04,0xB6,0x06, +0xB4,0x27,0x44,0x0F,0xFF,0xBF,0xFE,0x0E,0xB6,0x07,0x84,0x21,0x80,0x07,0x49,0xFF, +0xCC,0x66,0x44,0x04,0x58,0x88,0x84,0x37,0xB4,0x40,0xFE,0x56,0xB6,0x20,0x84,0x21, +0x49,0xFF,0xCC,0x32,0xB4,0x27,0x44,0x0F,0xFF,0x7F,0xFE,0x0E,0xB6,0x07,0xB4,0x27, +0x44,0x0F,0xFF,0xEF,0xFE,0x0E,0xB6,0x07,0x84,0x21,0x80,0x07,0x49,0xFF,0xCC,0x4F, +0xB4,0x06,0x40,0xA0,0x28,0x04,0xB7,0x46,0xB4,0x06,0x40,0x90,0x24,0x04,0xB7,0x26, +0x49,0xFF,0xD1,0xBC,0xE6,0x03,0xE8,0x1F,0x44,0x14,0x2C,0x0C,0x46,0x00,0x01,0x00, +0xB4,0x41,0xFE,0x17,0x84,0x41,0xB6,0x01,0x80,0x62,0x44,0x04,0x28,0x0C,0x44,0x14, +0x24,0x0C,0x49,0xFF,0xCC,0x5F,0x44,0x14,0x2C,0x18,0x46,0x00,0x04,0x00,0xB4,0x41, +0xFE,0x17,0x84,0x41,0xB6,0x01,0x80,0x62,0x44,0x04,0x28,0x18,0x44,0x14,0x24,0x18, +0x49,0xFF,0xCC,0x50,0x49,0xFF,0xD1,0x9A,0xE6,0x03,0xE8,0x2B,0x44,0x14,0x2C,0x14, +0xB4,0x01,0x58,0x00,0x10,0x00,0xB6,0x01,0x84,0x05,0x49,0xFF,0xD7,0x56,0x84,0x41, +0x80,0x62,0x44,0x04,0x28,0x14,0x44,0x14,0x24,0x14,0x49,0xFF,0xCC,0x3B,0x44,0x04, +0x2C,0x1C,0x44,0x1B,0xFF,0xFF,0xB4,0x40,0xFE,0x56,0xB6,0x20,0xB4,0x40,0x46,0x10, +0x00,0x80,0xFE,0x57,0xB6,0x20,0xB4,0x40,0x46,0x10,0x04,0x00,0xFE,0x57,0x84,0x41, +0xB6,0x20,0x80,0x62,0x44,0x04,0x28,0x1C,0x44,0x14,0x24,0x1C,0x49,0xFF,0xCC,0x22, +0x46,0x60,0x00,0x81,0x49,0xFF,0xCC,0x30,0x04,0x13,0x03,0xA0,0x84,0x10,0xFE,0x0E, +0x14,0x03,0x03,0xA0,0x04,0x13,0x03,0x9F,0x46,0x0F,0x0F,0xFF,0x50,0x00,0x0F,0xFF, +0xFE,0x46,0x46,0x20,0x40,0x00,0xFE,0x57,0x14,0x13,0x03,0x9F,0x04,0x13,0x03,0x9F, +0x46,0x27,0x00,0x00,0x94,0x4C,0x92,0x24,0xFE,0x57,0x14,0x13,0x03,0x9F,0x04,0x13, +0x03,0x9E,0xFE,0x0E,0x46,0x10,0x70,0x00,0xFE,0x0F,0x14,0x03,0x03,0x9E,0x49,0xFF, +0xCC,0x04,0x46,0x00,0x03,0x33,0x50,0x00,0x03,0x33,0x44,0x14,0x50,0x0C,0x14,0x03, +0x00,0x34,0x14,0x03,0x00,0x36,0xB4,0x01,0x58,0x00,0x00,0x01,0xB6,0x01,0x44,0x04, +0x00,0x90,0x84,0x2A,0xAC,0x40,0x84,0x00,0x49,0xFF,0xD8,0x65,0x44,0x16,0x20,0x04, +0x46,0x00,0x10,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0x44,0x14,0x2C,0x18,0x46,0x0B, +0xFF,0xFF,0xB4,0x41,0x50,0x00,0x0F,0xFF,0xFE,0x16,0xB6,0x01,0x44,0x14,0x2C,0x1C, +0x44,0x0F,0xFF,0xEF,0xB4,0x41,0xFE,0x16,0x84,0x41,0xB6,0x01,0x80,0x62,0x44,0x04, +0x28,0x18,0x44,0x14,0x24,0x18,0x49,0xFF,0xCB,0xC5,0x84,0x41,0x44,0x04,0x28,0x1C, +0x44,0x14,0x24,0x1C,0x80,0x62,0x49,0xFF,0xCB,0xBD,0x49,0xFF,0xD1,0x07,0xE6,0x03, +0xE8,0x10,0x44,0x14,0x2C,0x04,0x46,0x00,0x00,0x80,0xB4,0x41,0xFE,0x17,0x84,0x41, +0xB6,0x01,0x80,0x62,0x44,0x04,0x28,0x04,0x44,0x14,0x24,0x04,0x49,0xFF,0xCB,0xAA, +0x49,0xFF,0xD0,0xF4,0xE6,0x03,0xE9,0x40,0x84,0x08,0x49,0xFF,0xD6,0xB6,0x84,0x00, +0x49,0xFF,0xD6,0xBC,0x84,0x41,0x80,0x62,0x44,0x04,0x28,0x14,0x44,0x14,0x24,0x14, +0x49,0xFF,0xCB,0x98,0x44,0x14,0x2C,0x0C,0x46,0x0F,0xFE,0xFF,0xB4,0x41,0x50,0x00, +0x0F,0xFF,0xFE,0x16,0x84,0x41,0xB6,0x01,0x80,0x62,0x44,0x04,0x28,0x0C,0x44,0x14, +0x24,0x0C,0x49,0xFF,0xCB,0x87,0x44,0x04,0x2C,0x04,0x46,0x10,0x08,0x00,0xB4,0x40, +0xFE,0x57,0xB6,0x20,0xB4,0x40,0x46,0x1F,0xFB,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x56, +0xB6,0x20,0xB4,0x40,0x46,0x10,0x00,0x80,0xFE,0x57,0xB6,0x20,0xB4,0x40,0x44,0x14, +0x00,0x00,0xFE,0x57,0x84,0x41,0xB6,0x20,0x80,0x62,0x44,0x04,0x28,0x04,0x44,0x14, +0x24,0x04,0x49,0xFF,0xCB,0x67,0xFC,0xC0,0xFC,0x00,0x84,0x01,0x49,0xFF,0xC8,0x38, +0x84,0x03,0x49,0xFF,0xC8,0x58,0x84,0x00,0x49,0xFF,0xC8,0xDE,0x84,0x00,0x49,0xFF, +0xC8,0x62,0x84,0x03,0x49,0xFF,0xC8,0x80,0x84,0x00,0x49,0xFF,0xC8,0x8B,0x84,0x01, +0x49,0xFF,0xD7,0x62,0xFC,0x80,0xFC,0x00,0x84,0x00,0x44,0x10,0x00,0xF0,0x49,0xFF, +0xCF,0x0A,0x84,0x02,0x44,0x10,0x00,0xF0,0x49,0xFF,0xCF,0x05,0x84,0x01,0x44,0x10, +0x00,0xF0,0x49,0xFF,0xCF,0x00,0x84,0x03,0x44,0x10,0x00,0xF0,0x49,0xFF,0xCE,0xFB, +0x84,0x04,0x44,0x10,0x00,0xF0,0x49,0xFF,0xCE,0xF6,0x44,0x10,0x00,0xF0,0x84,0x05, +0x49,0xFF,0xCE,0xF1,0x84,0x01,0x49,0xFF,0xD6,0x30,0x84,0x03,0x84,0x2A,0x49,0xFF, +0xCF,0x3E,0x84,0x00,0x84,0x23,0x49,0xFF,0xC5,0xFF,0xFC,0x80,0xFC,0x01,0xF0,0x81, +0x49,0xFF,0xD0,0x6C,0xE6,0x03,0xE9,0x04,0xF0,0x01,0x49,0xFF,0xDB,0x34,0xFC,0x81, +0xFC,0x00,0x84,0x01,0x49,0xFF,0xCA,0x91,0x84,0x01,0x49,0xFF,0xC6,0x3B,0x84,0x01, +0x49,0xFF,0xC9,0x75,0x84,0x00,0x49,0xFF,0xEB,0xB8,0x84,0x00,0x49,0xFF,0xEB,0x9B, +0x84,0x01,0x49,0xFF,0xC8,0xA6,0x84,0x01,0x49,0xFF,0xCD,0xD3,0x84,0x01,0x49,0xFF, +0xCD,0xE0,0x84,0x01,0x49,0xFF,0xC8,0x9D,0x84,0x01,0x49,0xFF,0xCD,0xF8,0x84,0x01, +0x49,0xFF,0xC9,0x9C,0x84,0x01,0x49,0xFF,0xC9,0xAD,0x84,0x01,0x49,0xFF,0xC9,0xC3, +0x49,0xFF,0xD0,0x3C,0xE6,0x03,0xE8,0x05,0x84,0x01,0x84,0x2F,0x49,0xFF,0xCF,0x9A, +0x49,0xFF,0xD0,0x34,0xE6,0x03,0xE9,0x03,0x49,0xFF,0xD0,0x34,0x49,0xFF,0xD0,0x2E, +0xE6,0x03,0xE8,0x03,0x49,0xFF,0xD0,0x37,0x84,0x04,0x49,0xFF,0xD0,0x48,0xFC,0x80, +0xFC,0x00,0x49,0xFF,0xD0,0x66,0x49,0xFF,0xD0,0xCB,0x49,0xFF,0xD1,0x79,0x84,0x01, +0x49,0xFF,0xD0,0x50,0x49,0xFF,0xDB,0x30,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xD1,0x17, +0xFC,0x80,0xFC,0x02,0xF0,0x83,0xF1,0x81,0xFD,0x01,0xF2,0x82,0xB6,0x7F,0x49,0xFF, +0xD2,0x1F,0xF0,0x01,0xB4,0x3F,0x49,0xFF,0xD2,0x37,0xF0,0x03,0xF1,0x01,0xF2,0x02, +0xB4,0x7F,0x49,0xFF,0xD2,0x55,0xB4,0x1F,0x49,0xFF,0xD2,0x76,0xFC,0x82,0xFC,0x00, +0x44,0x00,0x77,0x7E,0x49,0xFF,0xDC,0xC3,0x84,0x20,0x80,0x61,0x84,0x41,0x44,0x00, +0x00,0x64,0x49,0xFF,0xFF,0xE0,0x84,0x00,0x80,0x20,0x49,0xFF,0xD2,0xA1,0x84,0x00, +0x80,0x20,0x49,0xFF,0xCB,0xF9,0x84,0x00,0x49,0xFF,0xD2,0xA4,0x84,0x20,0x84,0x01, +0x49,0xFF,0xD2,0x1C,0x84,0x00,0x49,0xFF,0xD2,0x69,0x84,0x40,0x84,0x61,0x44,0x00, +0x03,0x41,0x84,0x27,0x49,0xFF,0xFF,0xC7,0x84,0x00,0x84,0x21,0x49,0xFF,0xD2,0x88, +0x84,0x01,0x80,0x20,0x49,0xFF,0xCB,0xE0,0x49,0x00,0x00,0x44,0xFC,0x80,0xFC,0x00, +0x80,0xC0,0x5A,0x08,0x01,0x0D,0x84,0x00,0x3E,0x07,0xEF,0xC9,0x44,0x10,0x01,0xF4, +0x84,0x02,0x49,0x00,0x00,0x3B,0x84,0x02,0x80,0x26,0xD5,0x03,0x84,0x02,0x84,0x20, +0x49,0x00,0x00,0x42,0xFC,0x80,0xFC,0x00,0x2E,0x07,0xEF,0xC9,0xC0,0x07,0x84,0x02, +0x49,0x00,0x00,0x31,0x84,0x00,0x3E,0x07,0xEF,0xC9,0x84,0x02,0x49,0x00,0x00,0x4F, +0x5A,0x08,0x01,0x04,0x3E,0x07,0xEF,0xC8,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xD2,0xAB, +0xFC,0x80,0xFC,0x00,0x5A,0x08,0x01,0x0B,0xFE,0x0B,0x96,0x01,0x49,0xFF,0xD2,0x9A, +0x49,0xFF,0xD2,0xA8,0x49,0xFF,0xD2,0x9F,0xFC,0x80,0x49,0xFF,0xD2,0xB3,0xFC,0x80, +0x3C,0x00,0x00,0xE4,0x3C,0x10,0x00,0xE4,0x96,0x01,0x4C,0x00,0xFF,0xFB,0xDD,0x9E, +0x84,0x00,0x3C,0x08,0x00,0xC3,0xDD,0x9E,0x44,0x22,0x17,0x30,0x38,0x11,0x01,0x09, +0xDD,0x9E,0xFC,0x00,0x80,0xC0,0x49,0xFF,0xFF,0xED,0x44,0x12,0x17,0x50,0x38,0x00, +0x99,0x09,0xFC,0x80,0x80,0x60,0x5A,0x18,0x01,0x10,0xFC,0x20,0x80,0xC1,0x80,0xE0, +0x49,0xFF,0xFF,0xF1,0x3C,0x20,0x00,0xC3,0x40,0x13,0x1C,0x0C,0xFE,0x57,0x96,0x49, +0x3C,0x18,0x00,0xC3,0xFC,0xA0,0x84,0x41,0x3C,0x00,0x00,0xC3,0x40,0x11,0x0C,0x0C, +0xFE,0x4B,0xFE,0x46,0x3C,0x18,0x00,0xC3,0xDD,0x9E,0x3C,0x10,0x00,0xC3,0x40,0x10, +0x80,0x0E,0x96,0x46,0xC9,0x03,0x80,0x01,0xDD,0x9E,0xFC,0x00,0x80,0xC0,0x49,0xFF, +0xFF,0xC1,0x44,0x12,0x17,0x50,0x44,0x22,0x17,0x30,0x38,0x10,0x99,0x01,0x38,0x21, +0x19,0x01,0x8A,0x01,0x96,0x01,0xE2,0x02,0x56,0x07,0x80,0x01,0xFC,0x80,0x3C,0x00, +0x00,0xE4,0x8C,0x01,0x96,0x01,0x3C,0x08,0x00,0xE4,0xDD,0x9E,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x02,0x02,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0xE3,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0xC4,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0xA5,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0x86,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0x67,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0x48,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0xA4,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x62,0xA4,0x02,0x9D,0xB4,0x64,0x72,0x04,0x02,0x3A,0x6F, +0x9C,0x3C,0x64,0x62,0x00,0x02,0x9F,0xB2,0x64,0x62,0x00,0x03,0x64,0x00,0x00,0x08, +0x49,0x00,0x01,0x29,0x3A,0x6F,0x9C,0x04,0x64,0x62,0xA4,0x03,0x64,0x72,0x04,0x03, +0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0xA4,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0x94,0x3C, +0x3A,0xFF,0xBF,0xBC,0x64,0x12,0xA4,0x02,0x64,0x22,0x04,0x02,0x3A,0x1F,0x88,0x3C, +0x64,0x12,0x00,0x02,0x9E,0x4A,0x64,0x12,0x00,0x03,0x44,0x10,0x00,0xA4,0x38,0x10, +0x82,0x02,0xDD,0x21,0x3A,0x0F,0x84,0x04,0x64,0x02,0x00,0x43,0x64,0x00,0x00,0x08, +0x64,0x02,0xA4,0x03,0x64,0x12,0x04,0x03,0x3A,0xFF,0xBF,0x84,0x3A,0x1F,0x94,0x04, +0x3A,0x0F,0x80,0x04,0x64,0x00,0x00,0x04,0x3A,0x1F,0x94,0x3C,0x3A,0xFF,0xBF,0xBC, +0x44,0x10,0x00,0xA4,0x38,0x10,0x82,0x02,0xDD,0x21,0x3A,0xFF,0xBF,0x84,0x3A,0x1F, +0x94,0x04,0x3A,0x0F,0x80,0x04,0x64,0x00,0x00,0x04,0xD5,0x00,0x3A,0x0F,0x80,0x3C, +0x84,0x00,0xD5,0xEB,0x3A,0x0F,0x80,0x3C,0x84,0x01,0xD5,0xE7,0x3A,0x0F,0x80,0x3C, +0x84,0x02,0xD5,0xE3,0x3A,0x0F,0x80,0x3C,0x84,0x03,0xD5,0xDF,0x3A,0x0F,0x80,0x3C, +0x84,0x04,0xD5,0xDB,0x3A,0x0F,0x80,0x3C,0x84,0x05,0xD5,0xD7,0x3A,0x0F,0x80,0x3C, +0x84,0x06,0xD5,0xD3,0x3A,0x0F,0x80,0x3C,0x84,0x07,0xD5,0xCF,0x3A,0x0F,0x80,0x3C, +0x84,0x08,0xD5,0xCB,0x3A,0x0F,0x80,0x3C,0x84,0x09,0xD5,0xC7,0x3A,0x0F,0x80,0x3C, +0x84,0x0A,0xD5,0xC3,0x3A,0x0F,0x80,0x3C,0x84,0x0B,0xD5,0xBF,0x3A,0x0F,0x80,0x3C, +0x84,0x0C,0xD5,0xBB,0x3A,0x0F,0x80,0x3C,0x84,0x0D,0xD5,0xB7,0x3A,0x0F,0x80,0x3C, +0x84,0x0E,0xD5,0xB3,0x3A,0x0F,0x80,0x3C,0x84,0x0F,0xD5,0xAF,0x3A,0x0F,0x80,0x3C, +0xFA,0x00,0xD5,0xAB,0x3A,0x0F,0x80,0x3C,0xFA,0x01,0xD5,0xA7,0x3A,0x0F,0x80,0x3C, +0xFA,0x02,0xD5,0xA3,0x3A,0x0F,0x80,0x3C,0xFA,0x03,0xD5,0x9F,0x3A,0x0F,0x80,0x3C, +0xFA,0x04,0xD5,0x9B,0x3A,0x0F,0x80,0x3C,0xFA,0x05,0xD5,0x97,0x3A,0x0F,0x80,0x3C, +0xFA,0x06,0xD5,0x93,0x3A,0x0F,0x80,0x3C,0xFA,0x07,0xD5,0x8F,0x3A,0x0F,0x80,0x3C, +0xFA,0x08,0xD5,0x8B,0x3A,0x0F,0x80,0x3C,0xFA,0x09,0xD5,0x87,0x3A,0x0F,0x80,0x3C, +0xFA,0x0A,0xD5,0x83,0x3A,0x0F,0x80,0x3C,0xFA,0x0B,0x48,0xFF,0xFF,0x7F,0x3A,0x0F, +0x80,0x3C,0xFA,0x0C,0x48,0xFF,0xFF,0x7A,0x3A,0x0F,0x80,0x3C,0xFA,0x0D,0x48,0xFF, +0xFF,0x75,0x3A,0x0F,0x80,0x3C,0xFA,0x0E,0x48,0xFF,0xFF,0x70,0x3A,0x0F,0x80,0x3C, +0x44,0x00,0x00,0x1F,0x48,0xFF,0xFF,0x6A,0x84,0x01,0x64,0x04,0xC0,0x02,0x44,0x02, +0x00,0x01,0x64,0x04,0xE0,0x03,0x45,0xD2,0x15,0xA8,0x3F,0xC8,0x00,0x00,0x45,0xF2, +0x5F,0xF8,0x84,0x00,0x42,0x0E,0x00,0x21,0x49,0x00,0x00,0x31,0x49,0x00,0x03,0x3C, +0xD5,0x00,0x92,0x00,0xFC,0x00,0x44,0x02,0x00,0x00,0x44,0x22,0x04,0xC4,0x44,0x10, +0x82,0xA0,0x8A,0x40,0x49,0x00,0x03,0x60,0x44,0x02,0x04,0xC4,0x44,0x22,0x27,0xA0, +0x84,0x20,0x8A,0x40,0x49,0x00,0x03,0x7E,0xFC,0x80,0x84,0x00,0x64,0x05,0xE4,0x03, +0x84,0x1F,0x64,0x03,0x04,0x03,0x64,0x03,0x24,0x03,0x64,0x12,0x24,0x02,0x44,0x0F, +0x0F,0xFF,0xFE,0x0E,0x64,0x02,0x24,0x03,0x64,0x12,0x00,0x02,0x84,0x18,0xFE,0x0E, +0x64,0x02,0x00,0x03,0x64,0x00,0x00,0x08,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xFF,0xE7, +0x64,0x00,0x80,0x02,0x92,0x1E,0xC0,0x06,0x64,0x00,0x84,0x02,0x96,0x2E,0xC0,0x02, +0xD5,0x00,0x49,0xFF,0xFF,0xC9,0x64,0x12,0x00,0x43,0x64,0x00,0x00,0x08,0x64,0x00, +0x00,0x08,0xFC,0x80,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E, +0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0x44,0x04,0x80,0x04,0xA6,0x01,0x96,0x06,0xC0,0x05, +0x44,0x04,0x80,0x05,0x84,0x21,0xAE,0x40,0xDD,0x9E,0x44,0x04,0x80,0x01,0xA6,0x00, +0xC8,0x05,0xFC,0x00,0x49,0xFF,0xD5,0x1F,0xFC,0x80,0xDD,0x9E,0xFC,0x00,0x44,0x04, +0x80,0x00,0xA6,0x03,0x49,0xFF,0xD9,0xD6,0xFC,0x80,0x44,0x14,0x80,0x04,0x44,0x04, +0x80,0x84,0xA6,0x88,0xB4,0x00,0x96,0x06,0xFE,0x16,0xC0,0x03,0x84,0x01,0xAE,0x08, +0xDD,0x9E,0xFC,0x00,0x44,0x04,0x80,0x00,0xA6,0x03,0x49,0xFF,0xCF,0xBC,0xFC,0x80, +0x44,0x14,0x80,0x14,0xA6,0x08,0x96,0x06,0xC0,0x09,0x84,0x01,0xAE,0x08,0x44,0x14, +0x80,0x94,0xB4,0x01,0x58,0x00,0x00,0x01,0xB6,0x01,0x44,0x14,0x80,0x14,0xA6,0x08, +0x92,0x01,0x96,0x06,0xC0,0x09,0x84,0x02,0xAE,0x08,0x44,0x14,0x80,0x94,0xB4,0x01, +0x58,0x00,0x00,0x02,0xB6,0x01,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xD3,0xD6,0xFC,0x80, +0x44,0x04,0x80,0x04,0xA6,0x02,0x92,0x02,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x06, +0x84,0x24,0xAE,0x40,0xDD,0x9E,0x44,0x14,0x80,0x04,0xA6,0x0B,0x92,0x01,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x07,0x84,0x42,0xAE,0x80,0xA6,0x0B,0x96,0x06,0xC0,0x05, +0x44,0x04,0x80,0x07,0x84,0x21,0xAE,0x40,0xDD,0x9E,0x44,0x04,0x80,0x08,0xB4,0x20, +0x92,0x24,0x96,0x46,0xC1,0x03,0xFA,0x20,0xAE,0x40,0xB4,0x00,0x84,0x21,0x96,0x06, +0xC0,0x06,0x44,0x04,0x80,0x08,0xAE,0x40,0x3E,0x17,0xEF,0xF1,0x44,0x04,0x80,0x08, +0xB4,0x20,0x92,0x21,0x96,0x46,0xC1,0x06,0x84,0x22,0xAE,0x40,0x84,0x21,0x3E,0x17, +0xEF,0xF0,0xB4,0x00,0x92,0x02,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x08,0x84,0x24, +0xAE,0x40,0xDD,0x9E,0xDD,0x9E,0xFC,0x00,0x49,0xFF,0xD2,0x9D,0xFC,0x80,0xFC,0x00, +0x49,0xFF,0xD2,0xF8,0xFC,0x80,0xFC,0x00,0x49,0xFF,0xC3,0xD7,0xFC,0x80,0x44,0x14, +0x80,0x08,0xB4,0x01,0x92,0x08,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x09,0x84,0x41, +0xAE,0x80,0xB4,0x01,0x92,0x09,0x96,0x06,0xC0,0x0F,0x44,0x04,0x80,0x09,0x84,0x22, +0xAE,0x40,0x84,0x01,0x3E,0x07,0xEF,0xFA,0x44,0x04,0x50,0x28,0xB4,0x00,0x92,0x06, +0x96,0x1F,0x3E,0x07,0xEF,0xF9,0xDD,0x9E,0xFC,0x00,0x44,0x04,0x80,0x08,0xB4,0x00, +0x92,0x12,0x96,0x06,0xC0,0x58,0x44,0x14,0x80,0x88,0xB4,0x01,0x92,0x12,0x96,0x06, +0xC0,0x52,0x44,0x04,0x80,0x0A,0x84,0x44,0xAE,0x80,0xB4,0x41,0x44,0x0D,0xFF,0xFF, +0xFE,0x16,0x44,0x67,0x30,0x04,0xB6,0x01,0xB4,0x26,0x84,0x1E,0xFE,0x0E,0xB6,0x06, +0x84,0x0A,0x49,0xFF,0xCF,0xDC,0xB4,0x06,0x58,0x00,0x00,0x01,0xB6,0x06,0x84,0x0A, +0x49,0xFF,0xCF,0xD5,0x49,0xFF,0xD7,0x99,0x44,0x00,0x00,0x87,0x49,0xFF,0xD7,0x8E, +0x44,0x17,0x30,0x10,0xB4,0x01,0x96,0x06,0xC0,0xFE,0x44,0x17,0x30,0x10,0xB4,0x01, +0x92,0x03,0x96,0x06,0x5A,0x00,0x01,0xFD,0x44,0x67,0x30,0x04,0x84,0x0A,0x49,0xFF, +0xCF,0xBE,0xB4,0x26,0x84,0x1E,0xFE,0x0E,0xB6,0x06,0x84,0x0A,0x49,0xFF,0xCF,0xB7, +0xB4,0x06,0x58,0x00,0x00,0x01,0xB6,0x06,0x84,0x0A,0x49,0xFF,0xCF,0xB0,0x44,0x14, +0x80,0x88,0x84,0x01,0x3E,0x07,0xEF,0xF8,0xB4,0x41,0x44,0x02,0x00,0x00,0xFE,0x17, +0xB6,0x01,0x44,0x04,0x80,0x0A,0x84,0x22,0xAE,0x40,0x3C,0x0D,0xFB,0xFD,0x8C,0x01, +0x3C,0x0F,0xFB,0xFD,0x44,0x04,0x80,0x08,0x84,0x21,0xB4,0x00,0x92,0x10,0x96,0x06, +0xC0,0x0C,0x44,0x04,0x80,0x88,0xB4,0x00,0x92,0x10,0x96,0x06,0xC0,0x06,0x44,0x04, +0x80,0x0A,0x3E,0x17,0xEF,0xFB,0xAE,0x40,0x44,0x04,0x80,0x08,0xB4,0x00,0x92,0x11, +0x96,0x06,0xC0,0x0B,0x44,0x04,0x80,0x88,0xB4,0x00,0x92,0x11,0x96,0x06,0xC0,0x05, +0x44,0x04,0x80,0x0A,0x84,0x22,0xAE,0x40,0xFC,0x80,0x44,0x14,0x80,0x08,0x84,0x41, +0xB4,0x01,0x92,0x18,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0B,0xAE,0x80,0x3E,0x27, +0xEF,0xBD,0xB4,0x01,0x92,0x19,0x96,0x06,0xC0,0x1D,0x44,0x04,0x80,0x0B,0x84,0x22, +0xAE,0x40,0x84,0x00,0x3E,0x07,0xEF,0xBD,0x46,0x00,0x00,0x81,0x44,0x1F,0xFE,0xFF, +0x50,0x30,0x00,0x70,0xB4,0x43,0xFE,0x56,0xB6,0x23,0xB4,0x43,0x44,0x1E,0xFF,0xFF, +0xFE,0x56,0xB6,0x23,0xB4,0x43,0x46,0x1F,0xEF,0xFF,0x50,0x10,0x8F,0xFF,0xFE,0x56, +0xB6,0x23,0x44,0x04,0x80,0x08,0xB4,0x00,0x92,0x1A,0x96,0x06,0xC0,0x0E,0x44,0x14, +0x70,0x08,0xB4,0x01,0x92,0x10,0x40,0x00,0x40,0x08,0x58,0x00,0x78,0x23,0xB6,0x01, +0x44,0x04,0x80,0x0B,0x84,0x24,0xAE,0x40,0x44,0x04,0x80,0x08,0xB4,0x00,0x92,0x1B, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0B,0x84,0x28,0xAE,0x40,0xDD,0x9E,0x44,0x04, +0x80,0x04,0xA6,0x02,0x92,0x03,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x06,0x84,0x28, +0xAE,0x40,0xDD,0x9E,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x10,0x96,0x06,0xC0,0x05, +0x44,0x04,0x80,0x0E,0x84,0x41,0xAE,0x80,0xB4,0x01,0x92,0x11,0x96,0x06,0xC0,0x05, +0x44,0x04,0x80,0x0E,0x84,0x22,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x12, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0E,0x84,0x44,0xAE,0x80,0xB4,0x01,0x92,0x13, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0E,0x84,0x28,0xAE,0x40,0x44,0x14,0x80,0x0C, +0xB4,0x01,0x92,0x14,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0E,0xFA,0x40,0xAE,0x80, +0xB4,0x01,0x92,0x15,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0E,0xFA,0x30,0xAE,0x40, +0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x16,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0E, +0x44,0x20,0x00,0x40,0xAE,0x80,0xB4,0x01,0x92,0x17,0x96,0x06,0xC0,0x06,0x44,0x04, +0x80,0x0E,0x44,0x1F,0xFF,0x80,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x18, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F,0x84,0x41,0xAE,0x80,0xB4,0x01,0x92,0x19, +0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F,0x84,0x22,0xAE,0x40,0x44,0x14,0x80,0x0C, +0xB4,0x01,0x92,0x1A,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F,0x84,0x44,0xAE,0x80, +0xB4,0x01,0x92,0x1B,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F,0x84,0x28,0xAE,0x40, +0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x1C,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F, +0xFA,0x40,0xAE,0x80,0xB4,0x01,0x92,0x1D,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0F, +0xFA,0x30,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x1E,0x96,0x06,0xC0,0x06, +0x44,0x04,0x80,0x0F,0x44,0x20,0x00,0x40,0xAE,0x80,0xB4,0x01,0x4E,0x04,0x00,0x07, +0x44,0x04,0x80,0x0F,0x44,0x1F,0xFF,0x80,0xAE,0x40,0xDD,0x9E,0x44,0x04,0x80,0x0C, +0xB4,0x20,0x96,0x46,0xC1,0x03,0x84,0x21,0xAE,0x40,0xB4,0x00,0x92,0x01,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x0C,0x84,0x22,0xAE,0x40,0x44,0x04,0x80,0x0C,0xB4,0x20, +0x92,0x22,0x96,0x46,0xC1,0x03,0x84,0x24,0xAE,0x40,0xB4,0x00,0x92,0x03,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x0C,0x84,0x28,0xAE,0x40,0x44,0x04,0x80,0x0C,0xB4,0x20, +0x92,0x24,0x96,0x46,0xC1,0x03,0xFA,0x20,0xAE,0x40,0xB4,0x00,0x92,0x05,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x0C,0xFA,0x30,0xAE,0x40,0x44,0x04,0x80,0x0C,0xB4,0x20, +0x92,0x26,0x96,0x46,0xC1,0x04,0x44,0x10,0x00,0x40,0xAE,0x40,0xB4,0x00,0x92,0x07, +0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0C,0x44,0x1F,0xFF,0x80,0xAE,0x40,0x44,0x14, +0x80,0x0C,0xB4,0x01,0x92,0x08,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0D,0x84,0x41, +0xAE,0x80,0xB4,0x01,0x92,0x09,0x96,0x06,0xC0,0x05,0x44,0x04,0x80,0x0D,0x84,0x22, +0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x0A,0x96,0x06,0xC0,0x05,0x44,0x04, +0x80,0x0D,0x84,0x44,0xAE,0x80,0xB4,0x01,0x92,0x0B,0x96,0x06,0xC0,0x05,0x44,0x04, +0x80,0x0F,0x84,0x28,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01,0x92,0x0C,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x0D,0xFA,0x40,0xAE,0x80,0xB4,0x01,0x92,0x0D,0x96,0x06, +0xC0,0x05,0x44,0x04,0x80,0x0D,0xFA,0x30,0xAE,0x40,0x44,0x14,0x80,0x0C,0xB4,0x01, +0x92,0x0E,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0D,0x44,0x20,0x00,0x40,0xAE,0x80, +0xB4,0x01,0x92,0x0F,0x96,0x06,0xC0,0x06,0x44,0x04,0x80,0x0D,0x44,0x1F,0xFF,0x80, +0xAE,0x40,0xDD,0x9E,0x44,0x04,0x80,0x00,0x44,0x14,0x80,0x80,0xA6,0x80,0xB4,0x21, +0x96,0x46,0xFE,0x56,0xC1,0x03,0x84,0x21,0xAE,0x40,0xA6,0x00,0x40,0x10,0x04,0x09, +0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x01,0x96,0x06,0xFE,0x0E,0xC0,0x05,0x44,0x04, +0x80,0x00,0x84,0x22,0xAE,0x40,0x44,0x14,0x80,0x00,0xA6,0x08,0x40,0x20,0x08,0x09, +0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x02,0x96,0x06,0xFE,0x16,0xC0,0x03,0x84,0x04, +0xAE,0x08,0xA6,0x08,0x40,0x10,0x0C,0x09,0x44,0x04,0x80,0x80,0xB4,0x00,0x92,0x03, +0x96,0x06,0xFE,0x0E,0xC0,0x05,0x44,0x04,0x80,0x00,0x84,0x28,0xAE,0x40,0xDD,0x9E, +0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E,0xDD,0x9E, +0xDD,0x9E,0xDD,0x9E,0xFC,0x00,0x44,0x07,0x10,0x18,0x84,0x20,0xAE,0x41,0x44,0x16, +0x20,0x04,0x46,0x00,0x10,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0x44,0x00,0x01,0x00, +0x84,0x20,0x49,0xFF,0xC4,0x25,0x44,0x00,0x01,0x00,0x84,0x20,0x49,0xFF,0xC4,0x2F, +0x44,0x00,0x01,0x00,0x84,0x21,0x49,0xFF,0xC4,0x39,0x49,0xFF,0xDC,0xDA,0x44,0x14, +0x30,0x34,0x46,0x00,0x04,0x00,0xB4,0x41,0xFE,0x17,0xB6,0x01,0x49,0xFF,0xD6,0x3B, +0x49,0xFF,0xD6,0x73,0x49,0xFF,0xCE,0x63,0x49,0xFF,0xD7,0x02,0x49,0xFF,0xCF,0x78, +0x84,0x00,0xFC,0x80,0x80,0x60,0x54,0xF1,0x00,0x03,0xE9,0x1B,0xE6,0x44,0xE9,0x19, +0x54,0x41,0x80,0x03,0x54,0x50,0x80,0x03,0xDC,0x14,0xC5,0x0A,0x52,0x52,0x80,0x04, +0x9A,0x95,0x99,0x69,0x08,0x40,0x80,0x01,0x18,0x41,0x80,0x01,0xD9,0xFC,0x40,0x51, +0x08,0x09,0xC5,0x07,0x95,0x6A,0x99,0x69,0x96,0x8F,0xA3,0x09,0xAB,0x19,0xD9,0xFE, +0xC2,0x07,0x99,0x4A,0x08,0x40,0x80,0x01,0x18,0x41,0x80,0x01,0xD9,0xFC,0xDD,0x9E, +0x80,0x60,0xE6,0x44,0xE9,0x1A,0x54,0x51,0x80,0x03,0xC5,0x08,0x52,0x52,0x80,0x04, +0x9A,0x95,0x99,0x6B,0x18,0x11,0x80,0x01,0xDB,0xFE,0x40,0x51,0x08,0x09,0x96,0x8F, +0xC5,0x0C,0x95,0x6A,0x99,0x5D,0x96,0x48,0x40,0x40,0xA0,0x08,0xFE,0x67,0x40,0x40, +0xC0,0x08,0xFE,0x67,0xAA,0x59,0xDB,0xFF,0x99,0x5A,0xD3,0x04,0x18,0x11,0x80,0x01, +0xD5,0xFD,0xDD,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x32,0x19,0x64,0x32,0x33,0x11,0x12,0x20,0xFF,0x07,0xFF,0x07,0x05,0x0A,0x0B,0x00, +0xAC,0x04,0x02,0x00,0xA4,0x04,0x02,0x00,0x98,0x04,0x02,0x00,0x8C,0x04,0x02,0x00, +0x7C,0x04,0x02,0x00,0x6C,0x04,0x02,0x00,0x58,0x04,0x02,0x00,0x44,0x04,0x02,0x00, +0x2C,0x04,0x02,0x00,0x14,0x04,0x02,0x00,0x0A,0x0B,0x0B,0x0B,0x0C,0x0C,0x0C,0x0C, +0x0C,0x0C,0x00,0x00,0x01,0x05,0x00,0x07,0x02,0x06,0x04,0x08,0x03,0x09,0x00,0x00, +0x01,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x00,0x00,0x01,0x03,0x04,0x05, +0x06,0x07,0x08,0x09,0x0A,0x0B,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08, +0x08,0x09,0x07,0x06,0x03,0x02,0x08,0x09,0x04,0x09,0x09,0x08,0x30,0x01,0x30,0x01, +0x30,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x62,0x01,0x50,0x01,0x44,0x01, +0x74,0x01,0x96,0x01,0x84,0x02,0xC4,0x02,0x5A,0x01,0x46,0x01,0xEE,0x01,0x30,0x01, +0x44,0x01,0x50,0x01,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x08,0x08,0x09,0x07,0x06, +0x03,0x02,0x08,0x09,0x04,0x09,0x09,0x08,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, +0x08,0x09,0x0A,0x0B,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00, +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x00,0x01,0x02,0x00,0x01,0x02,0x03, +0x04,0x05,0x06,0x07,0x08,0x02,0x01,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, +0x08,0x00,0x00,0x01,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x00,0x01,0x00, +0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00, +0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00, +0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00, +0x01,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x04,0x80,0x00,0x00,0x08,0x40,0x00,0x00, +0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x40,0x08,0x00,0x00,0x80,0x04,0x00,0x00, +0x00,0x03,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x52,0x02,0x00,0x00,0x52,0x02,0x00,0x00,0x92,0x02,0x00,0x00,0xD2,0x02,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00, +0x00,0x00,0x40,0x02,0x40,0x02,0x00,0x00,0xC0,0x00,0xC0,0x00,0x40,0x00,0x40,0x00, +0x00,0x09,0x09,0x00,0x03,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x04,0x04,0x04,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x00,0x01,0x02, +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x02,0x01,0x00,0x00,0x01,0x02,0x03, +0x04,0x00,0x01,0x02,0x03,0x04,0x00,0x00,0x07,0x80,0x03,0x00,0x38,0x70,0x00,0x00, +0xC0,0x0F,0x00,0x00,0x08,0x40,0x00,0x00,0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00, +0x40,0x08,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x80,0x03,0x00, +0x38,0x70,0x00,0x00,0xC0,0x0F,0x00,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x01,0x00, +0x04,0x80,0x00,0x00,0x08,0x40,0x00,0x00,0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00, +0x40,0x08,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x38,0x70,0x00,0x00, +0x38,0x70,0x00,0x00,0x38,0x70,0x00,0x00,0x07,0x80,0x03,0x00,0x38,0x70,0x00,0x00, +0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x03,0x03, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x03,0x03,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, +0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00, +0x02,0x00,0x01,0x00,0x04,0x80,0x00,0x00,0x08,0x40,0x00,0x00,0x10,0x20,0x00,0x00, +0x20,0x10,0x00,0x00,0x40,0x08,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x03,0x00,0x00, +0x07,0x80,0x03,0x00,0x38,0x70,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x01,0x02,0x03, +0x04,0x05,0x06,0x07,0x08,0x00,0x01,0x02,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, +0x08,0x00,0x01,0x02,0x0B,0x02,0x0B,0x0B,0x0B,0x02,0x00,0x00,0x0B,0x02,0x0B,0x0B, +0x0B,0x02,0x00,0x00,0x01,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x00,0x00, +0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x08,0x07,0x06,0x05, +0x04,0x03,0x02,0x01,0x00,0x00,0x01,0x02,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, +0x08,0x02,0x01,0x00,0x00,0x01,0x02,0x00,0x80,0x00,0x01,0x00,0x40,0x80,0x00,0x00, +0x20,0x40,0x00,0x00,0x10,0x20,0x00,0x00,0x08,0x10,0x00,0x00,0x04,0x08,0x00,0x00, +0x02,0x04,0x00,0x00,0x01,0x02,0x00,0x00,0x07,0x80,0x03,0x00,0x38,0x70,0x00,0x00, +0xC0,0x0F,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x00,0x01,0x02, +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x02,0x01,0x00,0x01,0x00,0x02,0x00, +0x02,0x00,0x01,0x00,0x04,0x80,0x00,0x00,0x08,0x40,0x00,0x00,0x10,0x20,0x00,0x00, +0x20,0x10,0x00,0x00,0x40,0x08,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0x03,0x00,0x00, +0x07,0x80,0x03,0x00,0x38,0x70,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00, +0xDC,0x00,0x0A,0x05,0xF3,0x01,0xA0,0x05,0x04,0x00,0x96,0x00,0x01,0x14,0x96,0x05, +0x04,0x64,0x00,0x00,0x2C,0x01,0x46,0x00,0x01,0x0A,0x08,0x00,0x27,0x00,0x27,0x00, +0xA9,0x02,0x79,0x05,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x01,0x00, +0x0A,0x0B,0x0B,0x0B,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00,0xAC,0x04,0x02,0x00, +0xA4,0x04,0x02,0x00,0x98,0x04,0x02,0x00,0x8C,0x04,0x02,0x00,0x7C,0x04,0x02,0x00, +0x6C,0x04,0x02,0x00,0x58,0x04,0x02,0x00,0x44,0x04,0x02,0x00,0x2C,0x04,0x02,0x00, +0x14,0x04,0x02,0x00,0x5D,0x00,0x44,0x00,0x5A,0x00,0x72,0x00,0x8A,0x00,0xA3,0x00, +0xBB,0x00,0xD0,0x00,0xE3,0x00,0xF2,0x00,0xFD,0x00,0x02,0x01,0x61,0x00,0x4D,0x00, +0x68,0x00,0x84,0x00,0xA2,0x00,0xBF,0x00,0xDA,0x00,0xF2,0x00,0x06,0x01,0x13,0x01, +0x1A,0x01,0x00,0x00,0x65,0x00,0x58,0x00,0x79,0x00,0x9D,0x00,0xC1,0x00,0xE3,0x00, +0x02,0x01,0x1C,0x01,0x2E,0x01,0x37,0x01,0x6A,0x00,0x67,0x00,0x91,0x00,0xBE,0x00, +0xEA,0x00,0x13,0x01,0x35,0x01,0x4E,0x01,0x5B,0x01,0x00,0x00,0x72,0x00,0x7C,0x00, +0xB2,0x00,0xEB,0x00,0x23,0x01,0x52,0x01,0x75,0x01,0x87,0x01,0x7C,0x00,0x99,0x00, +0xE2,0x00,0x2E,0x01,0x72,0x01,0xA5,0x01,0xC1,0x01,0x00,0x00,0x45,0x00,0x63,0x00, +0x96,0x00,0xC8,0x00,0xF0,0x00,0x07,0x01,0x51,0x00,0x88,0x00,0xD3,0x00,0x15,0x01, +0x3C,0x01,0x00,0x00,0x67,0x00,0xCC,0x00,0x40,0x01,0x8A,0x01,0x99,0x00,0x66,0x01, +0x38,0x70,0x00,0x00,0xFF,0x00,0xFF,0x00,0x03,0x00,0x00,0x00,0x52,0x01,0x00,0x00, +0x30,0x75,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x24,0x01,0x00,0x00,0x50,0x1D,0x00,0x00, +0x81,0x08,0x00,0x01,0x02,0x00,0x06,0x0C,0x02,0x00,0x06,0x0C,0x01,0x00,0x04,0x04, +0x01,0x00,0x03,0x06,0x01,0x00,0x06,0x00,0x05,0x04,0x00,0x00,0x62,0xA4,0xF7,0xD5, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFC,0x4B,0x80,0xC0,0x3C,0x00,0x05,0x9A,0xB0,0x51,0xF0,0x8B,0x3C,0x00,0x05,0x9B, +0x84,0xE0,0xF0,0x8D,0x3C,0x00,0x05,0x9C,0xF0,0x8C,0x3C,0x00,0x05,0x9D,0xF0,0x8E, +0x44,0x02,0x00,0x10,0x3A,0x20,0x14,0x04,0x3A,0x20,0x94,0x24,0xA4,0x00,0xAC,0x08, +0x49,0xFF,0xED,0x97,0x81,0x00,0x3C,0x7B,0xF7,0xD9,0x49,0xFF,0xA2,0x44,0x84,0x20, +0x44,0x02,0x30,0xC8,0x44,0x20,0x02,0x40,0x49,0xFF,0xFB,0xC6,0x44,0x00,0x7F,0xFF, +0x3C,0x17,0xF9,0xF5,0x3C,0x0B,0xF7,0x8E,0xFA,0x0E,0xFE,0x0C,0x44,0x10,0x4E,0x1F, +0xE0,0x20,0x3C,0x7B,0xF7,0x92,0xE8,0x06,0x44,0x10,0x00,0x64,0x40,0x00,0x04,0x16, +0xD5,0x03,0x44,0x00,0x00,0xC8,0x84,0x40,0x44,0x92,0x30,0xC8,0x95,0x51,0x88,0xA8, +0x84,0x20,0x40,0x71,0x24,0x00,0x3C,0x43,0xF7,0x92,0x38,0x32,0x85,0x11,0x40,0xF2, +0x00,0x11,0xE0,0x6F,0x40,0x41,0xBC,0x1A,0x3C,0x4B,0xF7,0x92,0x3C,0x43,0xF7,0x8E, +0x40,0xA2,0x00,0x11,0xE1,0x43,0x40,0x41,0xBC,0x1A,0xE0,0x03,0x3C,0x4B,0xF7,0x8E, +0xE8,0x07,0x38,0x33,0x84,0x00,0x58,0x31,0x80,0x40,0x38,0x33,0x84,0x08,0x8C,0x21, +0x5A,0x18,0x12,0xE3,0x8C,0x52,0x5A,0x2A,0x40,0xDB,0x85,0x20,0x44,0xA2,0x30,0xC8, +0xFA,0x02,0x42,0xA4,0x80,0x73,0x84,0xE0,0x38,0x05,0x1C,0x00,0x96,0x36,0xC0,0x3B, +0x84,0x08,0xF0,0x82,0x50,0x0F,0x80,0x42,0xF0,0x84,0x84,0x01,0xF0,0x85,0x44,0x02, +0x11,0x83,0x84,0x60,0xF0,0x86,0x44,0x02,0x11,0x82,0xF0,0x87,0x40,0x14,0x80,0x11, +0x44,0x20,0x00,0x40,0xB6,0x7F,0xF3,0x81,0xF3,0x83,0xF3,0x88,0xF3,0x89,0x96,0x3B, +0x44,0x42,0x30,0xC8,0x80,0xA8,0x49,0xFF,0xBC,0xA6,0x2E,0x27,0xEF,0x92,0x2E,0x07, +0xEF,0x93,0xFA,0x22,0x42,0x01,0x04,0x73,0x38,0xF4,0x01,0x11,0x5E,0xF7,0x81,0x2C, +0xE9,0x04,0xA6,0x30,0x8C,0x01,0xAE,0x30,0x02,0x0F,0x80,0x21,0xE6,0x1F,0xE9,0x0B, +0x84,0x01,0x3E,0x07,0xEF,0x9E,0x3C,0x03,0xF1,0xD9,0x96,0x36,0xC0,0x04,0x84,0x06, +0x3E,0x07,0xF6,0x3B,0x8C,0xE1,0x5A,0x78,0x12,0xC1,0x8D,0x21,0x5A,0x98,0x20,0xB8, +0x3C,0xF7,0xF7,0x92,0x5E,0xF7,0x80,0xC8,0xE8,0x04,0x84,0x00,0x3E,0x07,0xEF,0x9E, +0x2E,0x17,0xEF,0x9E,0xC9,0x04,0xA6,0x30,0xE6,0x02,0xE9,0x03,0x84,0x0A,0xD5,0x05, +0x2E,0x07,0xEF,0x9D,0xC0,0x04,0x8E,0x01,0x3E,0x07,0xEF,0x9D,0x84,0x00,0x3E,0x07, +0xEF,0xA8,0x2E,0x07,0xEF,0x9D,0xC0,0x07,0x84,0x01,0x3E,0x07,0xEF,0x9C,0x3E,0x07, +0xEF,0xA8,0xD5,0x03,0x3E,0x07,0xEF,0x9C,0x84,0x00,0x3E,0x07,0xEF,0xA9,0x2E,0x07, +0xEF,0x9C,0x5A,0x00,0x01,0x05,0xA6,0x30,0xE6,0x02,0xE9,0x1B,0x84,0x01,0x3E,0x07, +0xEF,0xA9,0x3C,0x03,0xF1,0xD9,0x96,0x26,0xC0,0x08,0xA6,0x30,0xE6,0x02,0xE9,0x05, +0xC9,0x04,0x84,0x04,0x3E,0x07,0xF6,0x3B,0x3C,0x03,0xF1,0xD8,0x96,0x16,0xC0,0x6B, +0xA6,0x30,0xE6,0x02,0xE9,0x68,0xC9,0x67,0x84,0x02,0x3E,0x07,0xF6,0x39,0xD5,0x63, +0xC0,0x63,0x2E,0x0F,0xEF,0x92,0x22,0x1F,0x80,0x16,0xF0,0x8F,0x22,0x0F,0x80,0x1A, +0x84,0x40,0x8A,0x01,0xF0,0x8D,0x22,0x1F,0x80,0x18,0x22,0x0F,0x80,0x1C,0x2F,0xEF, +0xEF,0x93,0x8A,0x01,0x80,0x82,0x80,0xA2,0xF2,0x8A,0xB1,0x91,0xF0,0x8E,0x38,0x11, +0x18,0x10,0x98,0x32,0x88,0x3E,0x97,0xC9,0xE6,0xF2,0x20,0x00,0x00,0x01,0xE8,0x31, +0xF3,0x0F,0x88,0x03,0x97,0xC1,0x5C,0xF3,0x80,0x20,0xE8,0x2B,0x80,0xE1,0xFA,0x62, +0x42,0x70,0x0C,0x73,0x38,0x94,0x1D,0x11,0x3C,0xA3,0xF7,0xD9,0x40,0x74,0x80,0x13, +0x89,0x47,0x3C,0xAB,0xF7,0xD9,0x4E,0x97,0x00,0x03,0x88,0x89,0x8E,0xE5,0x97,0xFB, +0x4E,0x77,0x00,0x18,0xF3,0x0D,0xFE,0x5C,0xFA,0x61,0x40,0x10,0x8C,0x36,0xF3,0x0B, +0x88,0x23,0x96,0x4B,0xF3,0x0A,0x42,0x33,0x84,0x73,0xF1,0x0E,0xF3,0x8A,0xFE,0x0C, +0xFA,0x2F,0x40,0x00,0x04,0x16,0xF1,0x0C,0x88,0x01,0x96,0x03,0x42,0x53,0x80,0x73, +0x8C,0x42,0x5A,0x28,0x12,0xC6,0xF3,0x0A,0x40,0x02,0x04,0x0A,0x88,0x60,0x88,0xA0, +0x40,0x31,0x90,0x76,0x40,0x42,0x90,0x96,0x3C,0x3F,0xFB,0xD7,0x3C,0x4F,0xFB,0xD8, +0x84,0x01,0xD5,0x02,0x84,0x02,0xFC,0xCB,0x84,0x00,0x3E,0x07,0xEF,0xAC,0xDD,0x9E, +0xFC,0x00,0x2E,0x07,0xEF,0xAC,0x2E,0x67,0xE1,0xFD,0xC0,0x04,0x5A,0x00,0x01,0x15, +0xD5,0x3F,0x3C,0x27,0xF1,0x13,0x3C,0x17,0xF1,0x12,0x88,0x22,0x90,0x21,0x3C,0x1F, +0xFB,0xE5,0x3C,0x27,0xF1,0x15,0x3C,0x17,0xF1,0x14,0x88,0x22,0x90,0x21,0x3C,0x1F, +0xFB,0xE6,0x84,0x21,0xD5,0x1D,0x3C,0x17,0xF1,0x12,0x3C,0x37,0xF1,0x13,0x3C,0x27, +0xF1,0x15,0x88,0x61,0x3C,0x17,0xF1,0x14,0x3C,0x5D,0xFB,0xE5,0x88,0x41,0x3C,0x1D, +0xFB,0xE6,0x90,0x41,0x90,0x61,0x8A,0x22,0x44,0x40,0x00,0x64,0x8A,0xA3,0xFF,0x34, +0xFE,0x4C,0x42,0x12,0x94,0x73,0xFF,0x24,0xE0,0x24,0xE8,0x05,0x84,0x20,0x3E,0x17, +0xEF,0xAC,0xD5,0x0F,0x3C,0x13,0xF1,0xD9,0x96,0x4E,0xC1,0x03,0x3E,0x07,0xF6,0x3B, +0x84,0x01,0x3C,0x3F,0xFB,0xE5,0x3C,0x2F,0xFB,0xE6,0x3E,0x07,0xEF,0xAC,0x84,0x00, +0xFC,0x80,0xFC,0x00,0x49,0xFF,0xEC,0x05,0x50,0x30,0x04,0x80,0x84,0x20,0x84,0x40, +0x38,0x40,0x09,0x11,0x8C,0x41,0x88,0x24,0x5A,0x28,0x12,0xFC,0x50,0x00,0x00,0x24, +0x4C,0x01,0xFF,0xF7,0x44,0xF0,0x02,0x40,0x40,0x10,0xBC,0x36,0x3C,0xF7,0xF7,0x92, +0x8A,0x2F,0x50,0xF0,0x80,0xC7,0x5C,0xF7,0x81,0x8F,0xE9,0x06,0x3C,0xF7,0xF7,0x8E, +0x5E,0xF7,0x80,0x97,0xE9,0x09,0x3C,0x0D,0xFB,0xD6,0x58,0x00,0x00,0x40,0x3C,0x0F, +0xFB,0xD6,0x84,0x01,0xFC,0x80,0x84,0x00,0xFC,0x80,0xFC,0x40,0x44,0x50,0x02,0xD0, +0x3C,0x73,0xEF,0x08,0x3C,0x93,0xF1,0x00,0x9A,0x38,0x42,0x40,0x14,0x24,0x40,0x42, +0x1C,0x96,0x97,0x21,0xE2,0x89,0x3C,0x63,0xEF,0x09,0xE9,0x29,0x3C,0x03,0xF1,0x02, +0xE2,0x04,0xE9,0x25,0x9A,0x71,0x44,0xA0,0x05,0xA0,0x42,0x10,0xA8,0x24,0x40,0x10, +0x98,0x36,0x3C,0x83,0xF1,0x01,0x96,0x49,0xE2,0x28,0xE9,0x19,0x3C,0x43,0xF1,0x03, +0xE2,0x81,0xE9,0x15,0x9A,0xBA,0xFF,0x54,0x40,0x72,0x9C,0xF6,0x97,0xF9,0xE2,0xE9, +0xE9,0x0E,0xE2,0x07,0xE9,0x0C,0x9A,0x33,0x42,0x00,0x28,0x24,0x40,0x00,0x18,0x16, +0x96,0x01,0xE2,0x08,0xE9,0x04,0x40,0x02,0x00,0x06,0xFC,0xC0,0x84,0x01,0xFC,0xC0, +0x44,0x30,0x00,0x64,0x3C,0x23,0xEF,0x09,0x9A,0x51,0x9A,0x10,0x2E,0x27,0xE1,0xF3, +0x96,0x4B,0x96,0x03,0x9A,0x08,0xFE,0xD4,0xE0,0x60,0x56,0x07,0x80,0x01,0xDD,0x9E, +0x9A,0x59,0xC1,0x0C,0x8A,0x40,0x44,0x40,0x00,0x64,0x42,0x31,0x10,0x24,0x40,0x11, +0x84,0x36,0x4E,0x14,0x00,0x03,0xFE,0x4A,0x96,0x48,0x2E,0x07,0xE1,0xF2,0xE2,0x01, +0x56,0x07,0x80,0x01,0xDD,0x9E,0x44,0x30,0x02,0xD0,0x3C,0x23,0xEF,0x08,0x9A,0x10, +0xFE,0x1C,0x40,0x20,0x08,0x56,0x3C,0x33,0xF0,0xF2,0x96,0x91,0xE2,0x43,0x3C,0x03, +0xEF,0x09,0xE9,0x15,0x3C,0x33,0xF0,0xF4,0xE2,0x62,0xE9,0x11,0x9A,0x41,0x44,0x20, +0x05,0xA0,0xFE,0x54,0x40,0x10,0x80,0x36,0x3C,0x03,0xF0,0xF3,0x96,0x49,0xE2,0x20, +0xE9,0x06,0x3C,0x03,0xF0,0xF5,0x40,0x00,0x04,0x06,0xDD,0x9E,0x84,0x01,0xDD,0x9E, +0xFC,0x43,0x80,0xE0,0x84,0x00,0x10,0x0F,0x80,0x17,0x3C,0x03,0xF0,0xFD,0x3C,0x83, +0xF0,0xFC,0xF0,0x82,0x3C,0x03,0xF0,0xF7,0x3C,0xA3,0xF0,0xF6,0xF0,0x83,0x2E,0x07, +0xE1,0xE0,0xC0,0x09,0x8E,0x01,0x3E,0x07,0xE1,0xE0,0x49,0xFF,0x9D,0xBB,0x85,0x20, +0x48,0x00,0x02,0x82,0x2E,0x67,0xEF,0xAD,0xCE,0x1D,0x84,0x04,0x49,0xFF,0xF3,0xD3, +0x81,0x20,0x5A,0x08,0x01,0x18,0x80,0x26,0x84,0x04,0x49,0xFF,0xF3,0xB1,0x3C,0x13, +0xF1,0xD9,0x3E,0x67,0xEF,0xAC,0x96,0x5E,0xC1,0x0D,0x84,0x03,0x3E,0x07,0xF6,0x3B, +0x3C,0x0D,0xFB,0xE8,0xC8,0x07,0x3C,0x1D,0xF8,0xED,0x96,0x46,0xC1,0x03,0x3C,0x9F, +0xFB,0xE8,0x50,0x0F,0x80,0x17,0x49,0xFF,0xFD,0x6D,0x3C,0x4D,0xFB,0xD6,0x80,0xC0, +0x54,0x42,0x10,0x00,0xC4,0x04,0x49,0xFF,0xA0,0x1A,0xD5,0xD2,0x2E,0x07,0xEF,0xAD, +0xE6,0x05,0x4E,0xF2,0x02,0x50,0x44,0xF0,0xE2,0x94,0x38,0x07,0x81,0x01,0x40,0xF0, +0x3C,0x00,0xDD,0x0F,0x0A,0x00,0xDA,0x00,0xDE,0x01,0x0A,0x01,0x86,0x01,0x84,0xE0, +0x49,0x00,0x03,0xA2,0x3C,0x7F,0xFB,0xE9,0x3E,0x77,0xF6,0x3B,0x3E,0x77,0xF6,0x3A, +0x3E,0x77,0xF6,0x39,0x3E,0x77,0xEF,0x9F,0x5A,0x68,0x01,0x4D,0x49,0x00,0x04,0x13, +0x44,0x30,0x07,0xFF,0x44,0x20,0x32,0x64,0x80,0x83,0x80,0xA6,0x44,0x02,0x03,0xF8, +0x44,0x10,0x19,0x32,0xB6,0xDF,0x49,0x00,0x04,0x0C,0x85,0x2A,0x84,0x09,0x44,0x10, +0x0B,0xB8,0x49,0xFF,0xF3,0x4F,0x42,0x15,0x24,0x24,0x96,0x49,0x84,0x0E,0x49,0xFF, +0xF3,0x49,0xF0,0x03,0x42,0x10,0x24,0x24,0x96,0x49,0x84,0x0F,0x49,0xFF,0xF3,0x42, +0x42,0x14,0x24,0x24,0x96,0x49,0x84,0x0A,0x49,0xFF,0xF3,0x3C,0x84,0x0B,0x44,0x10, +0x13,0x88,0x49,0xFF,0xF3,0x37,0x84,0x09,0x80,0x26,0x49,0xFF,0xF3,0x41,0x84,0x0E, +0x80,0x26,0x49,0xFF,0xF3,0x3D,0x84,0x0F,0x80,0x26,0x49,0xFF,0xF3,0x39,0x84,0x0A, +0x80,0x26,0x49,0xFF,0xF3,0x35,0x84,0x0B,0x80,0x26,0x49,0xFF,0xF3,0x31,0x3C,0x07, +0xF7,0xAE,0x3C,0x17,0xF7,0xB0,0x49,0x00,0x04,0x0B,0x3E,0x67,0xEF,0xAD,0x48,0xFF, +0xFF,0x68,0x5A,0x60,0x02,0x04,0x48,0xFF,0xFF,0x64,0x84,0x0B,0x44,0x10,0x13,0x88, +0x49,0xFF,0xF3,0x10,0x84,0x0B,0x84,0x21,0x49,0xFF,0xF3,0x1A,0xD5,0x0C,0x84,0x0B, +0x49,0xFF,0xF3,0x31,0x5A,0x08,0x01,0x04,0x84,0x04,0xD5,0x06,0x84,0x02,0xC6,0x04, +0x5A,0x68,0x02,0x07,0x84,0x03,0x3E,0x07,0xEF,0xAD,0x48,0xFF,0xFF,0x4A,0x3C,0x07, +0xF7,0xAE,0x3C,0x17,0xF7,0xB0,0x49,0x00,0x03,0xE3,0x48,0xFF,0xFF,0x42,0x84,0x0B, +0x49,0xFF,0xF3,0x19,0x5A,0x00,0x01,0xEA,0x4E,0x63,0xFF,0x3B,0x49,0x00,0x03,0xAD, +0xC0,0x03,0x84,0x01,0xD5,0x02,0x84,0x03,0x3E,0x07,0xEF,0x9F,0x2E,0x07,0xF6,0x3B, +0x5A,0x08,0x04,0x13,0x2E,0x07,0xF6,0x39,0x5A,0x08,0x02,0x0F,0x2E,0x07,0xEF,0x9F, +0x5A,0x08,0x03,0x06,0x84,0x00,0x3E,0x07,0xF6,0x3B,0xD5,0x06,0x5A,0x08,0x01,0x05, +0x84,0x00,0x3E,0x07,0xF6,0x39,0x3C,0x0D,0xF8,0xED,0x54,0x10,0x00,0x01,0xC9,0x03, +0x3E,0x17,0xF6,0x3B,0x96,0x0E,0xC8,0x03,0x3E,0x07,0xF6,0x39,0x2E,0x07,0xF6,0x3B, +0xC8,0x07,0x2E,0x07,0xF6,0x3A,0xC8,0x04,0x2E,0x07,0xF6,0x39,0xC0,0x05,0x85,0x21, +0x3C,0x9F,0xFB,0xE9,0xD5,0x27,0x81,0x20,0xD5,0x25,0x49,0xFF,0xFE,0x3C,0x81,0x20, +0x4E,0x03,0xFF,0x2B,0x3C,0x17,0xF7,0x8E,0x3C,0xF4,0x05,0xAF,0xE0,0x2F,0xE8,0x1E, +0x2E,0x07,0xEF,0x93,0x3E,0x07,0xEF,0xAF,0x2E,0x07,0xEF,0x92,0x3E,0x07,0xEF,0xAE, +0x3C,0x03,0xF7,0x92,0x3C,0x0B,0xF7,0xDA,0x3C,0x03,0xF7,0xD9,0x3C,0x0B,0xF7,0xD8, +0x84,0x01,0x3E,0x07,0xEF,0xB6,0x3C,0x0D,0xFB,0xD6,0x58,0x00,0x10,0x00,0x3C,0x0F, +0xFB,0xD6,0x49,0xFF,0x9F,0x24,0x48,0x00,0x01,0x5F,0x4E,0x63,0xFE,0xDA,0x48,0xFF, +0xFF,0x04,0x49,0x00,0x03,0x4A,0xC0,0x55,0x2E,0xF7,0xEF,0xA9,0xE9,0x52,0x84,0x01, +0x3E,0x07,0xEF,0x9F,0x84,0x0A,0x49,0xFF,0xF2,0xA6,0x80,0xC0,0x81,0x20,0xC8,0x41, +0x49,0xFF,0xFD,0xB8,0x5A,0x08,0x01,0x06,0xAF,0xB8,0x3E,0x67,0xF6,0x3B,0xD5,0x74, +0x2E,0x47,0xF6,0x3B,0x54,0x12,0x00,0xFD,0x5A,0x18,0x01,0x10,0x3C,0x0D,0xFB,0xE9, +0xC8,0x0C,0x3C,0x4D,0xF8,0xED,0x97,0x06,0xCC,0x04,0x3E,0x47,0xF6,0x3B,0xD5,0x72, +0x3C,0x1F,0xFB,0xE9,0x81,0x01,0xD5,0x75,0xF0,0x02,0x84,0x2A,0xFE,0x0C,0x96,0x41, +0x84,0x04,0x49,0xFF,0xF2,0x57,0x84,0x04,0x84,0x21,0x49,0xFF,0xF2,0x61,0x84,0x0A, +0x84,0x20,0x49,0xFF,0xF2,0x5D,0x84,0x09,0x84,0x20,0x49,0xFF,0xF2,0x59,0x84,0x0E, +0x84,0x20,0x49,0xFF,0xF2,0x55,0x84,0x0F,0x84,0x20,0x49,0xFF,0xF2,0x51,0x84,0x0B, +0x84,0x20,0x49,0xFF,0xF2,0x4D,0x84,0x00,0x3E,0x07,0xEF,0xAD,0x48,0x00,0x01,0x0C, +0x3C,0x13,0xF1,0xD9,0x96,0x6E,0xC1,0x46,0x84,0x05,0x3E,0x07,0xF6,0x3B,0xD5,0x42, +0x84,0x03,0x3E,0x07,0xEF,0x9F,0x84,0x09,0x49,0xFF,0xF2,0x55,0x80,0xC0,0xC8,0x3C, +0x80,0x07,0x49,0x00,0x04,0x23,0x8E,0x01,0x5C,0x80,0x00,0x01,0xA6,0x38,0x5A,0x08, +0x01,0x09,0x84,0x0F,0x3C,0x6B,0xF7,0x96,0x49,0xFF,0xF2,0x5F,0x3C,0x0B,0xF7,0x96, +0x84,0x0E,0x49,0xFF,0xF2,0x40,0xC8,0x04,0x5A,0x88,0x01,0x25,0xD5,0x07,0x84,0x0F, +0x49,0xFF,0xF2,0x39,0x5A,0x08,0x01,0x26,0xD5,0xF8,0xA6,0x38,0x5A,0x08,0x01,0x22, +0x3C,0x03,0xF1,0xD8,0x96,0x1E,0xC0,0x0A,0x84,0x0E,0x49,0xFF,0xF2,0x2C,0xC8,0x06, +0x84,0x23,0x3E,0x17,0xF6,0x39,0x81,0x00,0xD5,0x14,0x3C,0x03,0xF1,0xD8,0x96,0x26, +0xC0,0x09,0x84,0x0F,0x49,0xFF,0xF2,0x1F,0x5A,0x08,0x01,0x05,0x84,0x04,0x3E,0x07, +0xF6,0x39,0x85,0x00,0xD5,0x06,0x3C,0x03,0xF1,0xD8,0x96,0x26,0xC8,0xF8,0xD5,0xFA, +0x3C,0x07,0xF7,0x94,0x3C,0x97,0xF7,0x9F,0x3C,0x67,0xF7,0x99,0x3C,0xA7,0xF7,0xA5, +0xF0,0x82,0x80,0x26,0x80,0x09,0xF2,0x02,0x80,0x6A,0x49,0xFF,0xFD,0x90,0x5A,0x08, +0x01,0x13,0x5A,0x88,0x01,0x0E,0xA6,0x38,0xC8,0x0E,0x3C,0x43,0xF1,0xD9,0x97,0x3E, +0x97,0x21,0xC4,0x08,0x84,0x27,0x3E,0x17,0xF6,0x3B,0x81,0x00,0xD5,0x04,0x85,0x00, +0xD5,0x02,0x81,0x04,0x80,0x06,0x80,0x2A,0x49,0xFF,0xFD,0xB4,0xC8,0x0E,0xA6,0x78, +0xC1,0x0C,0x3C,0x43,0xF1,0xD8,0x97,0x2E,0x97,0x21,0xC4,0x06,0x84,0x25,0x3E,0x17, +0xF6,0x39,0x81,0x00,0xD5,0x02,0x81,0x04,0x80,0x09,0x80,0x26,0xF2,0x02,0x80,0x6A, +0x49,0xFF,0xFD,0xB0,0xC8,0x0E,0xA6,0x78,0xC1,0x0C,0x3C,0x43,0xF1,0xD8,0x97,0x36, +0x97,0x21,0xC4,0x06,0x84,0x26,0x3E,0x17,0xF6,0x39,0x81,0x00,0xD5,0x02,0x81,0x04, +0x80,0x09,0x80,0x26,0x49,0xFF,0xFD,0xB1,0x5A,0x08,0x01,0x12,0xA6,0x38,0x5A,0x08, +0x01,0x0F,0x5A,0x88,0x01,0x0A,0x3C,0x43,0xF1,0xD8,0x97,0x3E,0x97,0x21,0xC4,0x06, +0x84,0x07,0x3E,0x07,0xF6,0x39,0x85,0x00,0xD5,0x02,0x81,0x04,0x80,0x07,0x49,0x00, +0x04,0xDE,0x44,0x12,0x2D,0xAC,0xFA,0x58,0x44,0x02,0x2D,0x50,0x49,0x00,0x01,0xF5, +0x3E,0x07,0xEF,0x13,0x49,0x00,0x02,0x1E,0x3E,0x07,0xEF,0x11,0x3C,0x0D,0xF8,0xED, +0x54,0x10,0x00,0x03,0x5A,0x18,0x03,0x06,0xA6,0x78,0xE6,0x22,0xE8,0x0C,0xD5,0x0C, +0x5A,0x18,0x01,0x05,0xA6,0x78,0xC1,0x13,0xD5,0x11,0x5A,0x18,0x02,0x10,0xA6,0x78, +0x5A,0x10,0x01,0x03,0x85,0x00,0x2E,0x27,0xF6,0x3B,0x5A,0x28,0x02,0x09,0x5A,0x18, +0x01,0x07,0x84,0x20,0x3E,0x17,0xF6,0x3B,0xD5,0x02,0x85,0x00,0x2E,0x17,0xE1,0xFC, +0xC9,0x06,0xA6,0x78,0xC9,0x04,0x3E,0x17,0xF6,0x3B,0x81,0x01,0x2E,0x17,0xE1,0xF0, +0xC9,0x07,0xA6,0xB8,0x5A,0x28,0x01,0x05,0x3E,0x17,0xF6,0x39,0x81,0x01,0x54,0x10, +0x00,0x01,0xC9,0x03,0x3E,0x17,0xF6,0x3B,0x96,0x0E,0xC8,0x03,0x3E,0x07,0xF6,0x39, +0x2E,0x07,0xF6,0x3B,0xC8,0x07,0x2E,0x07,0xF6,0x3A,0xC8,0x04,0x2E,0x07,0xF6,0x39, +0xC0,0x05,0x84,0x81,0x3C,0x4F,0xFB,0xE9,0x81,0x04,0x49,0xFF,0x9D,0xC8,0x81,0x28, +0xD5,0x02,0x81,0x24,0x80,0x09,0xFC,0xC3,0xFC,0x00,0x84,0x40,0x44,0x52,0x11,0xA8, +0x44,0x40,0x00,0x40,0x2E,0x37,0xEF,0xD8,0xE2,0x43,0xE8,0x0D,0x38,0x32,0x88,0x00, +0x88,0x61,0x50,0x31,0x80,0x40,0x40,0x31,0x90,0xD6,0x38,0x60,0x08,0x08,0x8C,0x41, +0x96,0x90,0xD5,0xF1,0xFC,0x80,0x2E,0x17,0xEF,0xD8,0x44,0x22,0x11,0xA8,0x38,0x01, +0x04,0x08,0x9C,0x09,0x96,0x00,0x5C,0xF0,0x00,0x27,0x3E,0x07,0xEF,0xD8,0xE8,0x0E, +0x44,0x12,0x12,0xC8,0x3C,0x23,0xF7,0x97,0x38,0x20,0x81,0x09,0x44,0x12,0x12,0x78, +0x3C,0x23,0xF7,0xA4,0x38,0x20,0x81,0x09,0xDD,0x9E,0x44,0x00,0x7F,0xFF,0x3C,0x0B, +0xF8,0x93,0x3C,0x0B,0xF8,0x6B,0xDD,0x9E,0xFC,0x00,0x44,0x52,0x00,0x44,0x84,0x60, +0x96,0x98,0x0A,0x62,0x80,0x01,0x5A,0x20,0x10,0x07,0xE2,0x26,0xA5,0x28,0xE9,0x19, +0x81,0xE4,0xD5,0x04,0xE2,0x26,0xE9,0x1B,0x85,0xFF,0xE2,0x2F,0xE8,0x12,0x5A,0x08, +0x01,0x06,0x52,0x01,0x80,0x40,0x96,0x2F,0xFC,0x80,0x5A,0x08,0x02,0x05,0x50,0x01, +0x00,0x20,0xD5,0x05,0x5A,0x08,0x03,0x0A,0x52,0x01,0x00,0x20,0x96,0x00,0xFC,0x80, +0x8C,0x61,0x5A,0x38,0x11,0xDF,0xD5,0x03,0x80,0x02,0xFC,0x80,0x44,0x00,0x00,0xFF, +0xFC,0x80,0x94,0x4E,0x5C,0xF1,0x80,0x41,0x88,0x41,0x84,0x20,0xE8,0x0C,0xCB,0x04, +0x44,0x10,0x00,0x64,0xD5,0x08,0x8C,0x61,0x44,0x12,0x00,0x24,0x90,0x61,0x88,0x61, +0x00,0x11,0xFF,0xFF,0x38,0x10,0x09,0x09,0xDD,0x9E,0xFC,0x40,0xEE,0xB0,0xF1,0x83, +0x94,0x41,0xE0,0x22,0xF0,0x82,0xE9,0x07,0x40,0x10,0x88,0x36,0xC1,0x05,0x8C,0x21, +0x96,0x48,0xD5,0x02,0x84,0x21,0x42,0xF1,0x04,0x24,0x5E,0xF7,0x80,0x41,0xE9,0x03, +0x8E,0x21,0x96,0x48,0x42,0x00,0x88,0x24,0x96,0x00,0xF0,0x81,0xF0,0x02,0x52,0x90, +0x00,0x02,0xF0,0x01,0x88,0x09,0x54,0x90,0x00,0xFF,0x84,0x00,0x80,0xA0,0xD2,0x11, +0xB1,0x84,0x84,0x80,0x99,0xF0,0x97,0xA0,0xE2,0xC1,0xE8,0x07,0x38,0x61,0x94,0x00, +0x38,0x63,0x90,0x08,0x8C,0x81,0xD5,0xF8,0x8C,0xA1,0x97,0x68,0x88,0x01,0xD5,0xF0, +0x84,0xC0,0xF0,0x02,0x4C,0x60,0x00,0x79,0xB0,0x14,0x83,0x80,0x80,0xE0,0x85,0x00, +0x54,0xA4,0x00,0xFF,0xE3,0x49,0xE8,0x62,0xF0,0x03,0xCE,0x11,0xA6,0xC0,0xB0,0x04, +0x50,0x31,0x80,0x40,0x38,0x00,0x20,0x00,0x8A,0x60,0x44,0x00,0x00,0x40,0x40,0x01, +0x80,0x76,0x96,0xD8,0x5C,0xF1,0x80,0x21,0xE8,0x15,0xD5,0x18,0x38,0x30,0x18,0x00, +0xB0,0x44,0x40,0x04,0x18,0x00,0x88,0x01,0x50,0x31,0x80,0x40,0x00,0x00,0x7F,0xFF, +0x8A,0x60,0x44,0x00,0x00,0x40,0x40,0x01,0x80,0x76,0x96,0xD8,0x5C,0xF1,0x80,0x21, +0xE9,0x12,0x52,0x31,0x80,0x40,0x96,0xD8,0xCE,0x0E,0xB0,0x14,0x84,0x20,0x80,0x4A, +0x49,0xFF,0xFF,0x81,0x4E,0xA2,0x00,0x30,0xA4,0x78,0x02,0x03,0xFF,0xFF,0x88,0x01, +0xAC,0x38,0xD5,0x29,0xB0,0x14,0x5A,0x68,0x01,0x0D,0x80,0x26,0x80,0x4A,0x49,0xFF, +0xFF,0x72,0x4E,0xA2,0x00,0x21,0x02,0x03,0x80,0x3F,0x02,0x13,0xFF,0xFF,0xD5,0x12, +0x84,0x21,0x80,0x4A,0x49,0xFF,0xFF,0x67,0x4E,0xA3,0x00,0x0A,0x02,0x1F,0x80,0x68, +0x02,0x0F,0x80,0x28,0x88,0x01,0x12,0x0F,0x80,0x68,0xD5,0x0D,0x02,0x03,0x80,0x3F, +0xA4,0x78,0xE2,0x20,0x40,0x10,0x3C,0x1B,0x02,0x03,0x80,0x40,0x81,0xE1,0x88,0x0F, +0x12,0x03,0x80,0x40,0x8D,0x01,0x8C,0xE2,0xD5,0x9C,0x84,0xA0,0xC6,0x0A,0x4C,0x54, +0x80,0x09,0x02,0x0E,0x00,0x40,0x8C,0xA1,0x1A,0x0E,0x00,0x01,0x97,0x68,0xD5,0xF8, +0x8C,0xC1,0x97,0xB0,0xD5,0x87,0x5A,0x68,0x01,0x04,0x8F,0x21,0xD5,0x03,0x50,0x94, +0x80,0x3F,0xB0,0x14,0xF1,0x01,0x38,0x00,0x25,0x01,0x40,0x00,0x04,0x16,0x96,0x00, +0xED,0x50,0xFC,0xC0,0xFC,0x00,0x4E,0x17,0x00,0x0E,0x4E,0x05,0x00,0x07,0x44,0x20, +0x03,0xE8,0xFE,0x84,0x84,0x01,0xD5,0x0D,0x44,0x2F,0xFC,0x18,0xFE,0x84,0x84,0x04, +0xD5,0x08,0xC1,0x11,0x4E,0x05,0x00,0x0B,0x44,0x2F,0xFC,0x18,0xFE,0x84,0x84,0x02, +0x40,0x11,0x04,0x36,0x49,0xFF,0xFE,0xEA,0xFC,0x80,0x44,0x20,0x03,0xE8,0xFE,0x84, +0x84,0x03,0xD5,0xF7,0xC0,0x07,0x4E,0x06,0x00,0x04,0xFA,0x00,0xFC,0x80,0x44,0x00, +0x00,0x30,0xFC,0x80,0xFC,0x00,0x84,0x00,0x3E,0x07,0xEF,0x13,0x3E,0x07,0xEF,0x11, +0x84,0x00,0xFA,0xD8,0x3C,0x0B,0xF7,0x98,0x3C,0x0B,0xF7,0x9E,0x3C,0x0B,0xF7,0x9F, +0x3C,0x0B,0xF7,0x99,0x3C,0x0B,0xF7,0x94,0x3C,0x0B,0xF7,0xA5,0x3C,0x0B,0xF7,0x9B, +0x3C,0x0B,0xF7,0x9D,0x3C,0x0B,0xF7,0x9A,0x3C,0x0B,0xF7,0xA2,0x3C,0x0B,0xF7,0x9C, +0x3C,0x0B,0xF7,0xA3,0x3C,0x0B,0xF7,0xA0,0x3C,0x0B,0xF7,0x95,0x84,0x1F,0x80,0x46, +0x3E,0x07,0xEF,0x12,0x84,0x20,0x44,0x02,0x2D,0x50,0x49,0xFF,0xF5,0x6D,0x80,0x46, +0x84,0x20,0x84,0xC4,0x44,0x02,0x2D,0xAC,0x49,0xFF,0xF5,0x66,0x80,0x46,0x84,0x20, +0x44,0x02,0x11,0x54,0x49,0xFF,0xF5,0x60,0x84,0x20,0x80,0x46,0x44,0x02,0x11,0x5C, +0x49,0xFF,0xF5,0x5A,0xFC,0x80,0xFC,0x40,0x5C,0xF1,0x00,0x29,0xE8,0x03,0x80,0xA2, +0xD5,0x02,0xFA,0xB8,0x84,0x60,0x44,0x92,0x12,0x28,0x44,0xA2,0x11,0xD8,0x80,0xC3, +0xE0,0x65,0xE8,0x12,0x95,0x19,0x40,0x72,0x24,0x00,0x88,0x8A,0x22,0x83,0x80,0x00, +0x38,0x80,0x0D,0x09,0x22,0x82,0x00,0x00,0x38,0x80,0x8D,0x09,0x8C,0x61,0xAD,0xB8, +0xAD,0xA0,0x96,0xD8,0xD5,0xEE,0x2E,0x17,0xEF,0xDC,0x5C,0xF0,0x80,0x29,0x80,0x01, +0xE9,0x02,0xFA,0x18,0x96,0x40,0xE2,0x41,0x40,0x01,0x3C,0x1B,0x96,0x00,0xFC,0xC0, +0x84,0x20,0x2E,0x07,0xEF,0xDD,0x3E,0x17,0xEF,0xDD,0xDD,0x9E,0x44,0x22,0x04,0x14, +0xA4,0xD1,0xA5,0x10,0x8A,0x64,0xAC,0xC0,0xA4,0x13,0xA4,0x92,0x8A,0x02,0xAC,0x08, +0xDD,0x9E,0x84,0x00,0x3C,0x0B,0xF7,0xF3,0x3E,0x07,0xEF,0x10,0xDD,0x9E,0x3C,0x0F, +0xFB,0xDD,0x44,0x02,0x2D,0xA0,0xAC,0x40,0x84,0x21,0xAC,0x81,0xAC,0xC3,0xAD,0x04, +0xAF,0x44,0xAC,0x45,0xDD,0x9E,0x3C,0x17,0xF1,0x12,0x3C,0x07,0xF1,0x13,0x2E,0x27, +0xE1,0xFE,0x8A,0x01,0x44,0x10,0x00,0x64,0xFE,0x54,0xE0,0x01,0xE8,0x08,0x3C,0xF7, +0xF1,0x14,0x3C,0x27,0xF1,0x15,0x8A,0x4F,0xE0,0x41,0xE9,0x15,0x5E,0xF0,0x03,0xE8, +0xE8,0x14,0x3C,0xF7,0xF1,0x14,0x3C,0x07,0xF1,0x15,0x8A,0x0F,0x5E,0xF0,0x03,0xE8, +0xE8,0x0C,0x3C,0x03,0xF1,0xD9,0x96,0x16,0x96,0x01,0xC0,0x08,0x84,0x02,0x3E,0x07, +0xF6,0x3B,0xD5,0x03,0x84,0x01,0xDD,0x9E,0x84,0x00,0xDD,0x9E,0xFC,0x41,0x52,0x00, +0x19,0x32,0x96,0xC3,0x3C,0x03,0xF7,0xF3,0x52,0x10,0xB2,0x64,0x8C,0x01,0x84,0x81, +0x96,0x8B,0x96,0x01,0x3E,0x47,0xEF,0xDE,0x3C,0x3B,0xF7,0x97,0x3C,0x2B,0xF7,0xA4, +0x3C,0x0B,0xF7,0xF3,0x5A,0x08,0x01,0x46,0x84,0x00,0x3C,0x3B,0xF1,0x12,0x3C,0x3B, +0xF1,0x13,0x3C,0x2B,0xF1,0x14,0x3C,0x2B,0xF1,0x15,0x3C,0x3B,0xF1,0x16,0x3C,0x2B, +0xF1,0x17,0x3C,0x0F,0xF8,0x8D,0x3C,0x0F,0xF8,0x8E,0x3E,0x07,0xEF,0xD8,0x3E,0x07, +0xEF,0xDF,0x3E,0x07,0xEF,0x10,0x3C,0x3B,0xF7,0xA1,0x3C,0x2B,0xF7,0x93,0x3C,0x3B, +0xF7,0xF2,0x3C,0x2B,0xF7,0xF1,0x44,0x72,0x12,0x28,0x80,0x20,0x44,0x62,0x11,0xD8, +0x44,0x52,0x12,0xC8,0x44,0x42,0x12,0x78,0x38,0x13,0x81,0x09,0x38,0x13,0x01,0x09, +0x38,0x12,0x81,0x09,0x38,0x12,0x01,0x09,0x8C,0x01,0x5A,0x08,0x28,0xF7,0x84,0x01, +0x3C,0x3B,0xF8,0x1C,0x3C,0x2B,0xF7,0xF4,0x3C,0x3B,0xF7,0x9F,0x3C,0x2B,0xF7,0x99, +0x3C,0x3B,0xF8,0x6C,0x3C,0x2B,0xF8,0x44,0x3E,0x07,0xEF,0xDC,0x48,0x00,0x00,0xB5, +0x2E,0x77,0xEF,0xD8,0x3C,0x3B,0xF7,0x94,0xE6,0xFE,0x3C,0x2B,0xF7,0xA5,0x4E,0xF2, +0x00,0xA1,0x3C,0xA7,0xF7,0x93,0x3C,0x97,0xF7,0xA1,0x40,0x01,0x28,0x01,0x40,0x11, +0xA4,0x01,0x42,0xF0,0x00,0x24,0x42,0xF0,0x84,0x73,0x5E,0xF7,0x84,0xCA,0x4E,0xF3, +0x00,0x9C,0x2E,0x47,0xEF,0xDC,0x5C,0xF2,0x00,0x27,0xE8,0x0A,0x44,0x52,0x12,0x28, +0x38,0x32,0x91,0x09,0x44,0x52,0x11,0xD8,0x38,0x22,0x91,0x09,0xD5,0x07,0x44,0x50, +0x7F,0xFF,0x3C,0x5B,0xF8,0x43,0x3C,0x5B,0xF8,0x1B,0x3C,0xF7,0xF1,0x12,0x8C,0x81, +0x97,0xA0,0xE0,0x6F,0x3E,0x67,0xEF,0xDC,0xE8,0x03,0x3C,0x3B,0xF1,0x12,0x3C,0x47, +0xF1,0x13,0xE0,0x83,0xE8,0x03,0x3C,0x3B,0xF1,0x13,0x3C,0xF7,0xF1,0x14,0xE0,0x4F, +0xE8,0x03,0x3C,0x2B,0xF1,0x14,0x3C,0x37,0xF1,0x15,0xE0,0x62,0xE8,0x03,0x3C,0x2B, +0xF1,0x15,0x80,0x41,0x4E,0x14,0x00,0x03,0xFE,0x8A,0x3C,0x3D,0xF8,0x8D,0x88,0x43, +0x3C,0x2F,0xF8,0x8D,0x80,0x40,0x4E,0x04,0x00,0x03,0xFE,0x82,0x3C,0x3D,0xF8,0x8E, +0x88,0x43,0x3C,0x2F,0xF8,0x8E,0x49,0xFF,0xFE,0x67,0x81,0x00,0x3E,0x07,0xEF,0xE1, +0x5A,0x60,0x02,0x3D,0xE6,0xC3,0xE9,0x3C,0x2E,0x67,0xEF,0xE0,0x44,0xF0,0x00,0x40, +0x50,0x63,0x00,0x40,0x8A,0xC0,0x40,0xF3,0x3C,0xD6,0x96,0xF0,0xE6,0x64,0xE9,0x11, +0x96,0x30,0x5E,0xF0,0x00,0x3D,0xE8,0x0D,0x3C,0x27,0xF7,0xF1,0x3C,0x07,0xF7,0xF2, +0x8A,0x4A,0x8A,0x09,0xFE,0x94,0x42,0x20,0x00,0x73,0x5E,0xF1,0x04,0xCA,0xE8,0x02, +0xCF,0x1F,0x3C,0x07,0xF7,0xF1,0x3C,0x17,0xF7,0xF2,0x40,0x05,0x00,0x01,0x40,0x14, +0x84,0x01,0xF3,0x81,0x49,0xFF,0xFE,0x38,0x49,0xFF,0xFD,0x17,0xF3,0x01,0xE6,0x68, +0xE9,0x05,0x97,0xB0,0x5E,0xF3,0x00,0x39,0xE9,0x19,0x3C,0x03,0xF7,0xA1,0x3C,0x0B, +0xF7,0xF2,0x3C,0x03,0xF7,0x93,0x3C,0x0B,0xF7,0xF1,0x3E,0x87,0xEF,0xE0,0x3C,0x03, +0xF7,0x97,0x3C,0x0B,0xF7,0xA1,0x3C,0x03,0xF7,0xA4,0x3C,0x0B,0xF7,0x93,0xD5,0x0C, +0x5A,0x78,0x1E,0x0B,0x3E,0x47,0xEF,0x10,0xD5,0x07,0x2E,0x07,0xEF,0xDF,0x8C,0x01, +0x3E,0x07,0xEF,0xDF,0xD5,0xE3,0xFC,0xC1,0xFC,0x48,0x51,0xCF,0x80,0x60,0x2E,0x27, +0xEF,0xD8,0x14,0x0E,0x7F,0xE9,0x3C,0x17,0xF7,0xA1,0x3C,0x07,0xF7,0x93,0xE6,0x5F, +0x3C,0x1B,0xF1,0x18,0x3C,0x0B,0xF1,0x19,0xE8,0x0B,0x3C,0x37,0xF7,0xF1,0x3C,0x27, +0xF7,0xF2,0x8A,0x03,0x8A,0x22,0x49,0xFF,0xFD,0xF7,0x49,0xFF,0xFC,0xD6,0x3C,0x57, +0xF1,0x13,0x3C,0x17,0xF1,0x12,0x3C,0x0D,0xF8,0x8D,0x3C,0x3D,0xF8,0x8E,0x3C,0x0F, +0xF8,0x8F,0x3C,0x3F,0xF8,0x90,0x9A,0xA9,0xD1,0x07,0x44,0x10,0x07,0xD0,0xFE,0x44, +0x40,0x10,0x88,0x36,0xD5,0x02,0x84,0x20,0x3C,0x1F,0xF8,0x8D,0x3C,0x57,0xF1,0x15, +0x3C,0x17,0xF1,0x14,0x84,0x00,0xD1,0x07,0x44,0x00,0x07,0xD0,0xFE,0x1C,0x9A,0xE9, +0x40,0x00,0x0C,0x16,0x3C,0x0F,0xF8,0x8E,0x3C,0x04,0x05,0xDD,0xE0,0x40,0xE8,0x04, +0x8A,0xA1,0xE0,0xA0,0xE9,0x09,0x2E,0x07,0xEF,0x10,0x5A,0x00,0x01,0x06,0x2E,0x07, +0xEF,0xD8,0xE6,0x02,0xE8,0x09,0x84,0x00,0x84,0xE0,0x3E,0x07,0xEF,0x10,0x14,0x7E, +0x7F,0xEE,0x48,0x00,0x00,0xDA,0x3C,0x0D,0xFB,0xDD,0x15,0xFE,0x7F,0xEA,0x84,0xE0, +0xB4,0x00,0x14,0x7E,0x7F,0xEE,0x14,0x7E,0x7F,0xEC,0xA4,0x00,0x80,0xC7,0x8C,0x07, +0x92,0x03,0x94,0x03,0x41,0xFF,0x80,0x01,0x15,0xFE,0x7F,0xEB,0x41,0xFF,0x80,0x01, +0x15,0xFE,0x7F,0xED,0x3C,0x0D,0xFB,0xDD,0xB4,0x20,0xA4,0x48,0xE2,0xC1,0x4E,0xF2, +0x00,0xB8,0x84,0x2C,0xA0,0x01,0x42,0x93,0x04,0x24,0x88,0x09,0x00,0xA0,0x00,0x05, +0x5A,0xA8,0x01,0x4F,0x84,0x00,0x14,0x0E,0x7F,0xEF,0x85,0x00,0x44,0x4F,0xFF,0xC0, +0x80,0x24,0x50,0x0E,0x7F,0xC0,0x14,0x4E,0x7F,0xE8,0x49,0xFF,0xFC,0x4F,0x3C,0x1D, +0xFB,0xDD,0x2E,0x07,0xEF,0xD8,0x04,0x4E,0x7F,0xE8,0xA0,0x49,0x88,0x29,0xA6,0x8C, +0xB4,0x61,0xC2,0x0D,0x44,0x12,0x11,0xA8,0x49,0xFF,0xFC,0xB9,0xE3,0x00,0x04,0x4E, +0x7F,0xE8,0xE8,0x05,0x96,0x60,0x14,0x1E,0x7F,0xEF,0x81,0x00,0x8C,0x83,0x97,0x22, +0x5A,0x48,0x41,0xE0,0x04,0x0E,0x7F,0xEB,0x5C,0xF4,0x00,0x3D,0x38,0x80,0x18,0x08, +0xE9,0x1A,0x50,0x0E,0x7F,0xC0,0x20,0x1E,0x7F,0xBC,0x49,0xFF,0xFC,0x27,0x3C,0x0D, +0xFB,0xDD,0x2E,0x27,0xEF,0xD8,0xA0,0x41,0x88,0x29,0xA6,0x0C,0xB4,0x21,0xC2,0x06, +0x44,0x32,0x11,0xA8,0x49,0xFF,0xFC,0x93,0x80,0x40,0x04,0x0E,0x7F,0xED,0x38,0x20, +0x18,0x08,0xD5,0x06,0x04,0x1E,0x7F,0xED,0x84,0x00,0x38,0x00,0x98,0x08,0x04,0x0E, +0x7F,0xEB,0x38,0x80,0x18,0x00,0x5C,0xF4,0x00,0x3C,0xE9,0x56,0x04,0x0E,0x7F,0xED, +0x38,0x00,0x18,0x00,0x5C,0xF0,0x00,0x37,0xE9,0x4F,0x5A,0xA8,0x01,0x12,0x2E,0x27, +0xE1,0xF1,0x44,0x10,0x00,0x64,0xFE,0x54,0x3C,0x2D,0xF8,0x90,0xE0,0x41,0xE8,0x08, +0x3C,0x03,0xF1,0xD8,0x96,0x0E,0xC0,0x40,0x3E,0xA7,0xF6,0x39,0xD5,0x3D,0x3C,0x1D, +0xFB,0xDD,0xA0,0xC9,0x88,0x69,0xA6,0x5E,0x5A,0x18,0x01,0x29,0x3C,0x2D,0xF8,0x8D, +0xC2,0x25,0x3C,0x5D,0xF8,0x8E,0xC5,0x22,0x00,0x91,0x80,0x09,0x00,0xA1,0x80,0x08, +0x01,0xE1,0x80,0x0A,0xA6,0xDF,0x44,0x10,0x07,0xD0,0x44,0x43,0x34,0x50,0x42,0xF1, +0x04,0x24,0xFE,0xE4,0xE2,0x6F,0xE9,0x20,0xFA,0x64,0xFE,0x9C,0x42,0xF5,0x04,0x24, +0xE2,0x4F,0xE9,0x1A,0x42,0xF2,0x84,0x24,0x42,0x44,0x90,0x24,0xE2,0x8F,0xE9,0x14, +0xFE,0xEC,0x42,0x1F,0x04,0x24,0xE2,0x61,0xE9,0x0F,0x88,0x08,0x04,0x1E,0x7F,0xEC, +0x90,0x01,0xE0,0x20,0xE8,0x09,0x96,0x00,0x50,0x1E,0x7F,0xB0,0x14,0x0E,0x7F,0xEC, +0xB4,0xE1,0x14,0x6E,0x7F,0xEE,0x8C,0xC1,0x97,0xB0,0x48,0xFF,0xFF,0x45,0x3E,0x77, +0xEF,0xDD,0x05,0xFE,0x7F,0xEA,0x49,0xFF,0xFD,0x86,0xCF,0x03,0x84,0x02,0xD5,0x14, +0x3C,0x0D,0xFB,0xDD,0x81,0x1C,0xB2,0x4E,0x84,0x2C,0xA0,0x01,0x42,0x01,0x04,0x73, +0xB2,0x29,0xA6,0x05,0xE6,0x02,0xAE,0x08,0xE8,0xF2,0x5A,0x00,0x01,0x06,0x84,0x00, +0x3E,0x07,0xF6,0x39,0x84,0x01,0x51,0xFE,0x7F,0xE0,0xFC,0xC0,0x38,0x20,0x80,0x00, +0x88,0x01,0xA6,0x01,0x9A,0x10,0x4E,0x04,0x00,0x03,0xFE,0x02,0x96,0x00,0xDD,0x9E, +0xA6,0x80,0xA6,0xC8,0xAE,0xC0,0xAE,0x88,0xDD,0x9E,0xFC,0x40,0x3C,0x13,0xF1,0x12, +0x3C,0x03,0xF1,0x13,0x44,0x72,0x12,0x28,0x8A,0x01,0x3C,0x0B,0xF7,0x98,0x3C,0x13, +0xF1,0x14,0x3C,0x03,0xF1,0x15,0x44,0x62,0x11,0xD8,0x8A,0x01,0x3C,0x0B,0xF7,0x9E, +0x44,0x12,0x11,0x2C,0x44,0x02,0x11,0x20,0xFD,0x10,0x49,0xFF,0x99,0x4B,0x80,0x07, +0x80,0x26,0x44,0x22,0x11,0x2E,0x44,0x32,0x11,0x22,0x49,0xFF,0x99,0x43,0x2E,0x27, +0xEF,0xDC,0x44,0x32,0x11,0x3A,0x8E,0x41,0x94,0x51,0x98,0x39,0x44,0x22,0x11,0x18, +0x88,0x26,0x49,0xFF,0x99,0x37,0x84,0xC0,0x44,0x92,0x2D,0x50,0x44,0x72,0x2D,0xAC, +0x40,0x03,0x24,0x00,0x98,0x77,0xFD,0x10,0x8C,0xC2,0x49,0xFF,0x99,0x2B,0x5A,0x68, +0x50,0xF9,0xFC,0xC0,0xFC,0x21,0xFA,0x04,0x10,0x0F,0x80,0x07,0x50,0x0F,0x80,0x07, +0x49,0xFF,0xF8,0xA0,0x3C,0x1D,0xFB,0xE8,0x5A,0x00,0x01,0x05,0x5A,0x18,0x01,0x30, +0xD5,0x03,0x5A,0x18,0x01,0x08,0x84,0x03,0x3E,0x07,0xF6,0x3B,0x84,0x00,0x3C,0x0F, +0xFB,0xE8,0x84,0x00,0x49,0xFF,0xD6,0x77,0x00,0x0F,0x80,0x07,0x49,0xFF,0xB9,0x09, +0x84,0x03,0x44,0x10,0x01,0xF4,0x49,0xFF,0xEC,0x4D,0x84,0x03,0x84,0x21,0x49,0xFF, +0xEC,0x57,0x49,0xFF,0xD6,0x64,0x80,0xC0,0xC8,0x0E,0x84,0x03,0x49,0xFF,0xEC,0x6B, +0x80,0xE0,0x5A,0x08,0x01,0xF8,0x84,0x03,0x80,0x26,0x49,0xFF,0xEC,0x49,0x80,0x07, +0x49,0xFF,0xD6,0x59,0x84,0x03,0x84,0x20,0x49,0xFF,0xEC,0x42,0xFC,0xA1,0x46,0x08, +0x88,0x88,0x44,0x14,0x00,0x54,0x50,0x00,0x08,0x88,0xB6,0x01,0xDD,0x9E,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xAA,0x7A,0x3E,0x60, diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/firmware/ilitek_v3_fw.h b/drivers/input/touchscreen/ilitek_v3_mmi/firmware/ilitek_v3_fw.h new file mode 100644 index 000000000000..92f7729a6d2d --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/firmware/ilitek_v3_fw.h @@ -0,0 +1,91 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __ILITEK_V3_FW_H +#define __ILITEK_V3_FW_H + +/* define names and paths for the variety of tp modules */ +#define DEF_INI_NAME_PATH "/sdcard/mp.ini" +#define DEF_FW_FILP_PATH "/sdcard/ILITEK_FW" +#define DEF_INI_REQUEST_PATH "mp.ini" +#define DEF_FW_REQUEST_PATH "ILITEK_FW" +static unsigned char CTPM_FW_DEF[] = { + #include "FW_TDDI_TRUNK_FB.ili" +}; + +#define CSOT_INI_NAME_PATH "/sdcard/mp_csot.ini" +#define CSOT_FW_FILP_PATH "/sdcard/ILITEK_FW_CSOT" +#define CSOT_INI_REQUEST_PATH "mp_csot.ini" +#define CSOT_FW_REQUEST_PATH "ILITEK_FW_CSOT" +static unsigned char CTPM_FW_CSOT[] = { + 0xFF, +}; + +#define AUO_INI_NAME_PATH "/sdcard/mp_auo.ini" +#define AUO_FW_FILP_PATH "/sdcard/ILITEK_FW_AUO" +#define AUO_INI_REQUEST_PATH "mp_auo.ini" +#define AUO_FW_REQUEST_PATH "ILITEK_FW_AUO" +static unsigned char CTPM_FW_AUO[] = { + 0xFF, +}; + +#define BOE_INI_NAME_PATH "/sdcard/mp_boe.ini" +#define BOE_FW_FILP_PATH "/sdcard/ILITEK_FW_BOE" +#define BOE_INI_REQUEST_PATH "mp_boe.ini" +#define BOE_FW_REQUEST_PATH "ILITEK_FW_BOE" +static unsigned char CTPM_FW_BOE[] = { + 0xFF, +}; + +#define INX_INI_NAME_PATH "/sdcard/mp_inx.ini" +#define INX_FW_FILP_PATH "/sdcard/ILITEK_FW_INX" +#define INX_INI_REQUEST_PATH "mp_inx.ini" +#define INX_FW_REQUEST_PATH "ILITEK_FW_INX" +static unsigned char CTPM_FW_INX[] = { + 0xFF, +}; + +#define DJ_INI_NAME_PATH "/sdcard/mp_dj.ini" +#define DJ_FW_FILP_PATH "/sdcard/ILITEK_FW_DJ" +#define DJ_INI_REQUEST_PATH "mp_dj.ini" +#define DJ_FW_REQUEST_PATH "ILITEK_FW_DJ" +static unsigned char CTPM_FW_DJ[] = { + 0xFF, +}; + +#define TXD_INI_NAME_PATH "/sdcard/mp_txd.ini" +#define TXD_FW_FILP_PATH "/sdcard/ILITEK_FW_TXD" +#define TXD_INI_REQUEST_PATH "mp_txd.ini" +#define TXD_FW_REQUEST_PATH "ILITEK_FW_TXD" +static unsigned char CTPM_FW_TXD[] = { + 0xFF, +}; + +#define TM_INI_NAME_PATH "/sdcard/mp_tm.ini" +#define TM_FW_FILP_PATH "/sdcard/ILITEK_FW_TM" +#define TM_INI_REQUEST_PATH "mp_tm.ini" +#define TM_FW_REQUEST_PATH "ILITEK_FW_TM" +static unsigned char CTPM_FW_TM[] = { + 0xFF, +}; + +#endif \ No newline at end of file diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3.c new file mode 100644 index 000000000000..661e520a6ba4 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3.c @@ -0,0 +1,1713 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "firmware/ilitek_v3_fw.h" +#include "ilitek_v3.h" + +/* Debug level */ +bool debug_en = DEBUG_OUTPUT; +EXPORT_SYMBOL(debug_en); + +static struct workqueue_struct *esd_wq; +static struct workqueue_struct *bat_wq; +static struct delayed_work esd_work; +static struct delayed_work bat_work; + +#if CHARGER_NOTIFIER_CALLBACK +#if KERNEL_VERSION(4, 1, 0) <= LINUX_VERSION_CODE +/* add_for_charger_start */ +static int ilitek_charger_notifier_callback(struct notifier_block *nb, unsigned long val, void *v) +{ + int ret = 0; + struct power_supply *psy = NULL; + union power_supply_propval prop; + + if (ilits->psy_name) + psy = power_supply_get_by_name(ilits->psy_name); + else + psy= power_supply_get_by_name("usb"); + if (!psy) { + if (ilits->psy_name) + ILI_ERR("Couldn't get psy:%s\n", ilits->psy_name); + else + ILI_ERR("Couldn't get usbpsy\n"); + return -EINVAL; + } + + if (!strcmp(psy->desc->name, "battery") && (val == POWER_SUPPLY_PROP_STATUS)) { + ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &prop); + if (ret < 0) { + ILI_ERR("Couldn't get POWER_SUPPLY_PROP_STATUS rc=%d\n", ret); + ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_PRESENT,&prop); + if (ret < 0) { + ILI_ERR("Couldn't get POWER_SUPPLY_PROP_PRESENT rc=%d\n", ret); + return ret; + } + } + } + else if (!strcmp(psy->desc->name, "usb")) { + if (psy && val == POWER_SUPPLY_PROP_STATUS) { + ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_PRESENT, &prop); + if (ret < 0) { + ILI_ERR("Couldn't get POWER_SUPPLY_PROP_ONLINE rc=%d\n", ret); + return ret; + } + } + } + if (!ret) { + if((prop.intval == USB_DETECT_IN) || (prop.intval == USB_DETECT_OUT)) { + if(ilits->usb_plug_status != prop.intval) { + ILI_INFO("usb prop.intval =%d\n", prop.intval); + ilits->usb_plug_status = prop.intval; + if(!ilits->tp_suspend && (ilits->charger_notify_wq != NULL)) + queue_work(ilits->charger_notify_wq,&ilits->update_charger); + } + } + else + ILI_DBG("unsupport prop.intval =%d\n", prop.intval); + } + return 0; +} +static void ilitek_update_charger(struct work_struct *work) +{ + int ret = 0; + if (ilits->fw_update_stat != 100) + return; + mutex_lock(&ilits->touch_mutex); + if (USB_DETECT_IN == ilits->usb_plug_status) + ret = ili_ic_func_ctrl("plug", 0);// plug in + else + ret = ili_ic_func_ctrl("plug", 1);// plug out + if (ret < 0) { + ILI_ERR("Write plug in failed\n"); + } + mutex_unlock(&ilits->touch_mutex); +} +void ilitek_plat_charger_init(void) +{ + int ret = 0; + struct power_supply *psy = NULL; + union power_supply_propval prop; + + ilits->usb_plug_status = 2; + ilits->charger_notify_wq = create_singlethread_workqueue("ili_charger_wq"); + if (!ilits->charger_notify_wq) { + ILI_ERR("allocate ili_charger_notify_wq failed\n"); + return; + } + INIT_WORK(&ilits->update_charger, ilitek_update_charger); + ilits->notifier_charger.notifier_call = ilitek_charger_notifier_callback; + ret = power_supply_reg_notifier(&ilits->notifier_charger); + if (ret < 0) { + ILI_ERR("power_supply_reg_notifier failed\n"); + return; + } + + /* if power supply supplier registered brfore TP + * ps_notify_callback will not receive PSY_EVENT_PROP_ADDED + * event, and will cause miss to set TP into charger state. + * So check PS state in probe. + */ + if (ilits->psy_name) + psy = power_supply_get_by_name(ilits->psy_name); + else + psy = power_supply_get_by_name("usb"); + if (psy) { + ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &prop); + if (ret < 0) { + ILI_ERR("Couldn't get POWER_SUPPLY_PROP_STATUS rc=%d\n", ret); + ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_PRESENT, &prop); + if (ret < 0) { + ILI_ERR("Couldn't get POWER_SUPPLY_PROP_PRESENT rc=%d\n", ret); + } + } + if (!ret) { + ilits->usb_plug_status = prop.intval; + ILI_INFO("boot check usb_plug_status = %d\n", prop.intval); + } + } +} +/* add_for_charger_end */ +#endif +#endif + +#if RESUME_BY_DDI +static struct workqueue_struct *resume_by_ddi_wq; +static struct work_struct resume_by_ddi_work; + +static void ilitek_resume_by_ddi_work(struct work_struct *work) +{ + mutex_lock(&ilits->touch_mutex); + +#ifdef ILI_SENSOR_EN + if (ilits->wakeable) { + disable_irq_wake(ilits->irq_num); + ilits->gesture_enabled = false; + ilits->wakeable = false; + } +#else + if (ilits->gesture) + disable_irq_wake(ilits->irq_num); +#endif + + /* Set tp as demo mode and reload code if it's iram. */ + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + if (ilits->fw_upgrade_mode == UPGRADE_IRAM) { + ili_fw_upgrade_handler(NULL); + } else { + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) + ILI_ERR("TP Cascade Reset failed during ili_resume_by_ddi_work\n"); + } else { + ili_reset_ctrl(ilits->reset); + } + } + + ili_irq_enable(); + ILI_INFO("TP resume end by wq\n"); + ili_wq_ctrl(WQ_ESD, ENABLE); + ili_wq_ctrl(WQ_BAT, ENABLE); + mutex_unlock(&ilits->touch_mutex); +} + +void ili_resume_by_ddi(void) +{ + if (!resume_by_ddi_wq) { + ILI_INFO("resume_by_ddi_wq is null\n"); + return; + } + +// mutex_lock(&ilits->touch_mutex); + + ILI_INFO("TP resume start called by ddi\n"); + ilits->tp_suspend = false; + ilits->report = ENABLE; + /* + * To match the timing of sleep out, the first of mipi cmd must be sent within 10ms + * after TP reset. We then create a wq doing host download before resume. + */ + if (ilits->fw_upgrade_mode == UPGRADE_IRAM) { +#if (ENGINEER_FLOW) + if (!ilits->eng_flow) { + atomic_set(&ilits->fw_stat, ENABLE); + + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) + ILI_ERR("TP Cascade Reset failed during ili_resume_by_ddi\n"); + } else { + ili_reset_ctrl(ilits->reset); + } + + ili_ice_mode_ctrl(ENABLE, OFF); + ilits->ddi_rest_done = true; + mdelay(5); + } +#else + atomic_set(&ilits->fw_stat, ENABLE); + + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) + ILI_ERR("TP Cascade Reset failed during ili_resume_by_ddi\n"); + } else { + ili_reset_ctrl(ilits->reset); + } + + ili_ice_mode_ctrl(ENABLE, OFF); + ilits->ddi_rest_done = true; + mdelay(5); +#endif + queue_work(resume_by_ddi_wq, &(resume_by_ddi_work)); + } else { + if (ilits->gesture) + disable_irq_wake(ilits->irq_num); + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) + ILI_ERR("TP Cascade Reset failed during ili_resume_by_ddi\n"); + } else { + if (ili_reset_ctrl(ilits->reset) < 0) + ILI_ERR("TP Reset failed during resume by ddi\n"); + } + + ili_ic_func_ctrl_reset(); + ILI_INFO("TP resume end by ddi\n"); + } + +// mutex_unlock(&ilits->touch_mutex); +} +#endif + +#ifdef ROI +static int ili_get_knuckle_roi_switch(u8 *roi_switch) +{ + *roi_switch = ili_config_get_knuckle_roi_status(); + + ILI_INFO("get roi status = %d\n", *roi_switch); + + return 0; +} + +static int ili_set_knuckle_roi_switch(bool roi_enable) +{ + int ret = 0; + + ret = ili_config_knuckle_roi_ctrl(roi_enable ? CMD_ENABLE : CMD_DISABLE); + if (ret) { + ILI_ERR("roi control failed, enable = %d, ret = %d\n", roi_enable, ret); + return ret; + } + + ILI_INFO("set roi status = %d\n", roi_enable); + + return 0; +} + +static int ili_knuckle_roi_switch(struct ts_roi_info *info) +{ + int i = 0; + int ret = 0; + + if (IS_ERR_OR_NULL(info)) { + ILI_ERR("info invaild\n"); + return -EINVAL; + } + + switch (info->op_action) { + case TS_ACTION_READ: + ret = ili_get_knuckle_roi_switch(&info->roi_switch); + if (ret) { + ILI_ERR("get roi switch failed, ret = %d\n", ret); + return ret; + } + break; + + case TS_ACTION_WRITE: + ret = ili_set_knuckle_roi_switch(info->roi_switch); + if (ret) { + ILI_ERR("set roi switch failed, ret = %d\n", ret); + return ret; + } + + if (!info->roi_switch) { + for (i = 0; i < ROI_DATA_READ_LENGTH; i++) { + ilits->knuckle_roi_data[i] = 0; + } + } + break; + + default: + ILI_ERR("op action invalid : %d\n", info->op_action); + return -EINVAL; + } + + return 0; +} + +static unsigned char *ili_knuckle_roi_rawdata(void) +{ + ILI_DBG("return roi data\n"); + return ilits->knuckle_roi_data; +} +#endif + +int ili_mp_test_handler(char *apk, bool lcm_on) +{ + int ret = 0; + + if (atomic_read(&ilits->fw_stat)) { + ILI_ERR("fw upgrade processing, ignore\n"); + return -EMP_FW_PROC; + } + + atomic_set(&ilits->mp_stat, ENABLE); + + if (ilits->actual_tp_mode != P5_X_FW_TEST_MODE) { + ret = ili_switch_tp_mode(P5_X_FW_TEST_MODE); + if (ret < 0) { + ILI_ERR("Switch MP mode failed\n"); + ret = -EMP_MODE; + goto out; + } + } + + ret = ili_mp_test_main(apk, lcm_on); + +out: + /* + * If there's running mp test with lcm off, we suspose that + * users will soon call resume from suspend. TP mode will be changed + * from MP to AP mode until resume finished. + */ + if (!lcm_on) { + atomic_set(&ilits->mp_stat, DISABLE); + return ret; + } + + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + if (ilits->fw_upgrade_mode == UPGRADE_IRAM) { + if (ili_fw_upgrade_handler(NULL) < 0) + ILI_ERR("FW upgrade failed during mp test\n"); + } else { + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) + ILI_ERR("TP Cascade Reset failed during mp test\n"); + } else { + if (ili_reset_ctrl(ilits->reset) < 0) + ILI_ERR("TP Reset failed during mp test\n"); + } + } + + atomic_set(&ilits->mp_stat, DISABLE); + return ret; +} + +int ili_switch_tp_mode(u8 mode) +{ + int ret = 0; + bool ges_dbg = false; + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; + + atomic_set(&ilits->tp_sw_mode, START); + + ilits->actual_tp_mode = mode; + + /* able to see cdc data in gesture mode */ + if (ilits->tp_data_format == DATA_FORMAT_DEBUG && + ilits->actual_tp_mode == P5_X_FW_GESTURE_MODE) + ges_dbg = true; + + switch (ilits->actual_tp_mode) { + case P5_X_FW_AP_MODE: + ILI_INFO("Switch to AP mode\n"); + ilits->wait_int_timeout = AP_INT_TIMEOUT; + if (ilits->fw_upgrade_mode == UPGRADE_IRAM) { + if (ili_fw_upgrade_handler(NULL) < 0) + ILI_ERR("FW upgrade failed\n"); + } else { + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) + ILI_ERR("TP Cascade Reset failed during ili_switch_tp_mode\n"); + } else { + ret = ili_reset_ctrl(ilits->reset); + } + } + if (ret < 0) + ILI_ERR("TP Reset failed\n"); + + break; + case P5_X_FW_GESTURE_MODE: + ILI_INFO("Switch to Gesture mode\n"); + ilits->wait_int_timeout = AP_INT_TIMEOUT; + ret = ilits->gesture_move_code(ilits->gesture_mode); + if (ret < 0) + ILI_ERR("Move gesture code failed\n"); + if (ges_dbg) { + ILI_INFO("Enable gesture debug func\n"); + ili_set_tp_data_len(DATA_FORMAT_GESTURE_DEBUG, false, &data_type); + } + break; + case P5_X_FW_TEST_MODE: + ILI_INFO("Switch to Test mode\n"); + ilits->wait_int_timeout = MP_INT_TIMEOUT; + ret = ilits->mp_move_code(); + break; + default: + ILI_ERR("Unknown TP mode: %x\n", mode); + ret = -1; + break; + } + + if (ret < 0) + ILI_ERR("Switch TP mode (%d) failed \n", mode); + + ILI_DBG("Actual TP mode = %d\n", ilits->actual_tp_mode); + atomic_set(&ilits->tp_sw_mode, END); + return ret; +} + +int ili_gesture_recovery(void) +{ + int ret = 0; + + atomic_set(&ilits->esd_stat, START); + + ILI_INFO("Doing gesture recovery\n"); + ret = ilits->ges_recover(); + + atomic_set(&ilits->esd_stat, END); + return ret; +} + +void ili_spi_recovery(void) +{ + atomic_set(&ilits->esd_stat, START); + + ILI_INFO("Doing spi recovery\n"); + if (ili_fw_upgrade_handler(NULL) < 0) + ILI_ERR("FW upgrade failed\n"); + + atomic_set(&ilits->esd_stat, END); +} + +int ili_wq_esd_spi_check(void) +{ + int ret = 0; + u8 tx = SPI_WRITE, rx = 0; + + ret = ilits->spi_write_then_read(ilits->spi, &tx, 1, &rx, 1); + ILI_DBG("spi esd check = 0x%x\n", ret); + if (ret == DO_SPI_RECOVER) { + ILI_ERR("ret = 0x%x\n", ret); + return -1; + } + return 0; +} + +int ili_wq_esd_i2c_check(void) +{ + ILI_DBG(""); + return 0; +} + +static void ilitek_tddi_wq_esd_check(struct work_struct *work) +{ + if (mutex_is_locked(&ilits->touch_mutex)) { + ILI_INFO("touch is locked, ignore\n"); + return ; + } + mutex_lock(&ilits->touch_mutex); + if (ilits->esd_recover() < 0) { + ILI_ERR("SPI ACK failed, doing spi recovery\n"); + ili_spi_recovery(); + } + mutex_unlock(&ilits->touch_mutex); + complete_all(&ilits->esd_done); + ili_wq_ctrl(WQ_ESD, ENABLE); +} + +static int read_power_status(u8 *buf) +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + struct file *f = NULL; + mm_segment_t old_fs; + ssize_t byte = 0; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + + f = filp_open(POWER_STATUS_PATH, O_RDONLY, 0); + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open %s\n", POWER_STATUS_PATH); + return -1; + } + + f->f_op->llseek(f, 0, SEEK_SET); + byte = f->f_op->read(f, buf, 20, &f->f_pos); + + ILI_DBG("Read %d bytes\n", (int)byte); + + set_fs(old_fs); + filp_close(f, NULL); +#else + return -1; +#endif + return 0; +} + +static void ilitek_tddi_wq_bat_check(struct work_struct *work) +{ + u8 str[20] = {0}; + static int charge_mode; + + if (read_power_status(str) < 0) + ILI_ERR("Read power status failed\n"); + + ILI_DBG("Batter Status: %s\n", str); + + if (strstr(str, "Charging") != NULL || strstr(str, "Full") != NULL + || strstr(str, "Fully charged") != NULL) { + if (charge_mode != 1) { + ILI_DBG("Charging mode\n"); + if (ili_ic_func_ctrl("plug", DISABLE) < 0) /* plug in */ + ILI_ERR("Write plug in failed\n"); + charge_mode = 1; + } + } else { + if (charge_mode != 2) { + ILI_DBG("Not charging mode\n"); + if (ili_ic_func_ctrl("plug", ENABLE) < 0) /* plug out */ + ILI_ERR("Write plug out failed\n"); + charge_mode = 2; + } + } + ili_wq_ctrl(WQ_BAT, ENABLE); +} + +void ili_wq_ctrl(int type, int ctrl) +{ + switch (type) { + case WQ_ESD: + if (ilits->esd_func_ctrl || ilits->wq_ctrl) { + if (!esd_wq) { + ILI_ERR("wq esd is null\n"); + break; + } + ilits->wq_esd_ctrl = ctrl; + if (ctrl == ENABLE) { + ILI_DBG("execute esd check\n"); + if (!queue_delayed_work(esd_wq, &esd_work, msecs_to_jiffies(WQ_ESD_DELAY))) + ILI_DBG("esd check was already on queue\n"); + } else { + cancel_delayed_work_sync(&esd_work); + flush_workqueue(esd_wq); + ILI_DBG("cancel esd wq\n"); + } + } + break; + case WQ_BAT: + if (ENABLE_WQ_BAT || ilits->wq_ctrl) { + if (!bat_wq) { + ILI_ERR("WQ BAT is null\n"); + break; + } + ilits->wq_bat_ctrl = ctrl; + if (ctrl == ENABLE) { + ILI_DBG("execute bat check\n"); + if (!queue_delayed_work(bat_wq, &bat_work, msecs_to_jiffies(WQ_BAT_DELAY))) + ILI_DBG("bat check was already on queue\n"); + } else { + cancel_delayed_work_sync(&bat_work); + flush_workqueue(bat_wq); + ILI_DBG("cancel bat wq\n"); + } + } + break; + default: + ILI_ERR("Unknown WQ type, %d\n", type); + break; + } +} + +static void ilitek_tddi_wq_init(void) +{ + esd_wq = alloc_workqueue("esd_check", WQ_MEM_RECLAIM, 0); + bat_wq = alloc_workqueue("bat_check", WQ_MEM_RECLAIM, 0); + + WARN_ON(!esd_wq); + WARN_ON(!bat_wq); + + INIT_DELAYED_WORK(&esd_work, ilitek_tddi_wq_esd_check); + INIT_DELAYED_WORK(&bat_work, ilitek_tddi_wq_bat_check); + +#if RESUME_BY_DDI + resume_by_ddi_wq = create_singlethread_workqueue("resume_by_ddi_wq"); + WARN_ON(!resume_by_ddi_wq); + INIT_WORK(&resume_by_ddi_work, ilitek_resume_by_ddi_work); +#endif +} + +int ili_sleep_handler(int mode) +{ + int ret = 0; + bool sense_stop = true; + + mutex_lock(&ilits->touch_mutex); + atomic_set(&ilits->tp_sleep, START); + + if (atomic_read(&ilits->fw_stat) || + atomic_read(&ilits->mp_stat)) { + ILI_INFO("fw upgrade or mp still running, ignore sleep requst\n"); + atomic_set(&ilits->tp_sleep, END); + mutex_unlock(&ilits->touch_mutex); + return 0; + } + + ili_wq_ctrl(WQ_ESD, DISABLE); + ili_wq_ctrl(WQ_BAT, DISABLE); + ili_irq_disable(); + + ILI_INFO("Sleep Mode = %d\n", mode); + + if (ilits->ss_ctrl) + sense_stop = true; + else if ((ilits->chip->core_ver >= CORE_VER_1430)) + sense_stop = false; + else + sense_stop = true; + + switch (mode) { + case TP_SUSPEND: + ILI_INFO("TP suspend start\n"); + ilits->tp_suspend = true; + ilits->power_status = false; + if (sense_stop) { + if (ili_ic_func_ctrl("sense", DISABLE) < 0) + ILI_ERR("Write sense stop cmd failed\n"); + + if (ili_ic_check_busy(50, 20, ON) < 0) + ILI_ERR("Check busy timeout during suspend\n"); + } + +#ifdef ILI_SENSOR_EN + if (ilits->should_enable_gesture) { + ili_switch_tp_mode(P5_X_FW_GESTURE_MODE); + enable_irq_wake(ilits->irq_num); + ili_irq_enable(); + ilits->wakeable = true; + } else { + if (ili_ic_func_ctrl("sleep", DEEP_SLEEP_IN) < 0) + ILI_ERR("Write sleep in cmd failed\n"); + ilits->wakeable = false; + } +#else + if ((ilits->gesture) || (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME)) { + ili_switch_tp_mode(P5_X_FW_GESTURE_MODE); + enable_irq_wake(ilits->irq_num); + ili_irq_enable(); + } else { + if (ili_ic_func_ctrl("sleep", SLEEP_IN) < 0) + ILI_ERR("Write sleep in cmd failed\n"); + } +#endif + ILI_INFO("TP suspend end\n"); + break; + case TP_DEEP_SLEEP: + ILI_INFO("TP deep suspend start\n"); + ilits->tp_suspend = true; + ilits->power_status = false; + if (sense_stop) { + if (ili_ic_func_ctrl("sense", DISABLE) < 0) + ILI_ERR("Write sense stop cmd failed\n"); + + if (ili_ic_check_busy(50, 20, ON) < 0) + ILI_ERR("Check busy timeout during deep suspend\n"); + } +#ifndef ILI_SENSOR_EN + if ((ilits->gesture) || (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME)) { + ili_switch_tp_mode(P5_X_FW_GESTURE_MODE); + enable_irq_wake(ilits->irq_num); + ili_irq_enable(); + } else +#endif + { + if (ili_ic_func_ctrl("sleep", DEEP_SLEEP_IN) < 0) + ILI_ERR("Write deep sleep in cmd failed\n"); + } + ILI_INFO("TP deep suspend end\n"); + break; + case TP_RESUME: +#if !RESUME_BY_DDI + ILI_INFO("TP resume start\n"); + ilits->tp_suspend = false; + ilits->report = ENABLE; + + /* Set tp as demo mode and reload code if it's iram. */ + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + if (ilits->fw_upgrade_mode == UPGRADE_IRAM) { + if (ili_fw_upgrade_handler(NULL) < 0) + ILI_ERR("FW upgrade failed during resume\n"); + } else { + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) + ILI_ERR("TP Cascade Reset failed during resume\n"); + } else { + if (ili_reset_ctrl(ilits->reset) < 0) + ILI_ERR("TP Reset failed during resume\n"); + } + ili_ic_func_ctrl_reset(); + } + ilits->power_status = true; + + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME) { + ilits->proxmity_face = false; + + if (ilits->prox_face_gesture == true) { + ilits->prox_face_gesture = false; + if (ili_ic_func_ctrl("proximity", 0x01) < 0) { + ILI_ERR("Write proximity cmd failed\n"); + } + } + } + +#ifdef ILI_SENSOR_EN + if (ilits->wakeable) { + disable_irq_wake(ilits->irq_num); + ilits->gesture_enabled = false; + ilits->wakeable = false; + } +#else + if (ilits->gesture) + disable_irq_wake(ilits->irq_num); +#endif + + ILI_INFO("TP resume end\n"); +#else + ili_resume_by_ddi(); +#endif + ili_wq_ctrl(WQ_ESD, ENABLE); + ili_wq_ctrl(WQ_BAT, ENABLE); + ili_irq_enable(); + break; + default: + ILI_ERR("Unknown sleep mode, %d\n", mode); + ret = -EINVAL; + break; + } + + ili_pen_release(); + ili_touch_release_all_point(); + atomic_set(&ilits->tp_sleep, END); + mutex_unlock(&ilits->touch_mutex); + return ret; +} + +int ili_fw_upgrade_handler(void *data) +{ + int ret = 0; + + atomic_set(&ilits->fw_stat, START); + + ilits->fw_update_stat = FW_STAT_INIT; + ret = ili_fw_upgrade(ilits->fw_open); + if (ret != 0) { + ILI_INFO("FW upgrade fail\n"); + ilits->fw_update_stat = FW_UPDATE_FAIL; + } else { + ILI_INFO("FW upgrade pass\n"); +#if CHARGER_NOTIFIER_CALLBACK +#if KERNEL_VERSION(4, 1, 0) <= LINUX_VERSION_CODE + /* add_for_charger_start */ + if (ilits->actual_tp_mode != P5_X_FW_TEST_MODE) { + ILI_INFO("charge status is %d\n", ilits->usb_plug_status); + if (ilits->usb_plug_status == USB_DETECT_IN) { + ret = ili_ic_func_ctrl("plug", 0);/* plug in */ + } else if (ilits->usb_plug_status == USB_DETECT_OUT) { + ret = ili_ic_func_ctrl("plug", 1);/* plug out */ + } + if (ret < 0) { + ILI_ERR("Write plug in failed\n"); + } + } + /* add_for_charger_end */ +#endif +#endif + ilits->fw_update_stat = FW_UPDATE_PASS; + } + + if (!ilits->boot) { + ilits->boot = true; + ILI_INFO("Registre touch to input subsystem\n"); + ili_input_register(); + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ili_input_pen_register(); + } + ili_wq_ctrl(WQ_ESD, ENABLE); + ili_wq_ctrl(WQ_BAT, ENABLE); + } + + atomic_set(&ilits->fw_stat, END); + return ret; +} + +int ili_set_tp_data_len(int format, bool send, u8 *data) +{ + u8 cmd[12] = {0}, ctrl = 0, debug_ctrl = 0, data_type = 0; + u16 self_key = 2; + int ret = 0, tp_mode = ilits->actual_tp_mode, len = 0, geture_info_length = 0, demo_mode_packet_len = 0; + + if (data == NULL) { + data_type = P5_X_FW_SIGNAL_DATA_MODE; + ILI_INFO("Data Type is Null, Set Single data type\n"); + } else { + data_type = data[0]; + ILI_INFO("Set data type = 0x%X \n", data[0]); + } + + if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + geture_info_length = P5_X_GESTURE_INFO_LENGTH; + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + demo_mode_packet_len = P5_X_5B_LOW_RESOLUTION_LENGTH; + } else { + demo_mode_packet_len = P5_X_DEMO_MODE_PACKET_LEN; + } + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + geture_info_length = P5_X_GESTURE_INFO_LENGTH; + demo_mode_packet_len = P5_X_5B_LOW_RESOLUTION_LENGTH + P5_X_CUSTOMER_LENGTH; + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + geture_info_length = P5_X_GESTURE_INFO_LENGTH_HIGH_RESOLUTION; + demo_mode_packet_len = P5_X_DEMO_MODE_PACKET_LEN_HIGH_RESOLUTION + P5_X_CUSTOMER_LENGTH; + } else if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + geture_info_length = P5_X_GESTURE_INFO_LENGTH_HIGH_RESOLUTION; + demo_mode_packet_len = P5_X_DEMO_MODE_PACKET_LEN_HIGH_RESOLUTION; + } + + switch (format) { + case DATA_FORMAT_DEMO: + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ilits->touch_num = MAX_TOUCH_NUM + MAX_PEN_NUM; + ilits->pen_info.report_type = P5_X_HAND_PEN_TYPE; + ilits->pen_info.pen_data_mode = HAND_PEN_DEMO_MODE; + len = demo_mode_packet_len + P5_X_PEN_DATA_LEN; + } else { + len = demo_mode_packet_len; + } + ctrl = DATA_FORMAT_DEMO_CMD; + break; + case DATA_FORMAT_GESTURE_DEMO: + len = demo_mode_packet_len; + ctrl = DATA_FORMAT_DEMO_CMD; + break; + case DATA_FORMAT_DEBUG: + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + len = P5_X_DEBUG_LOW_RESOLUTION_FINGER_DATA_LENGTH; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + len = P5_X_DEBUG_HIGH_RESOLUTION_FINGER_DATA_LENGTH; + } + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ilits->touch_num = MAX_TOUCH_NUM + MAX_PEN_NUM; + ilits->pen_info.report_type = P5_X_HAND_PEN_TYPE; + + ilits->cdc_data_len = (ilits->xch_num * ilits->ych_num * 2) + ((ilits->stx + ilits->srx) * 2) + (2 * self_key); + + if (data_type == P5_X_FW_RAW_DATA_MODE) { + ilits->pen_info.pen_data_mode = HAND_PEN_RAW_DATA_MODE; + len += ilits->cdc_data_len + P5_X_PEN_DATA_LEN + (((ilits->pen_info_block.nPxRaw * ilits->xch_num * 2) + (ilits->pen_info_block.nPyRaw * ilits->ych_num * 2)) * 2 + 4) + P5_X_OTHER_DATA_LEN; + } else { + ilits->pen_info.pen_data_mode = HAND_PEN_SIGNAL_MODE; + len += ilits->cdc_data_len + P5_X_PEN_DATA_LEN + (((ilits->pen_info_block.nPxVa * ilits->xch_num * 2) + (ilits->pen_info_block.nPyVa * ilits->ych_num * 2)) * 2 + 4) + P5_X_OTHER_DATA_LEN; + } + } else { + len += (2 * ilits->xch_num * ilits->ych_num) + (ilits->stx * 2) + (ilits->srx * 2) + (2 * self_key) + 16; + } + + if (ilits->rib.nCustomerType != ilits->customertype_off) { + len += P5_X_CUSTOMER_LENGTH; + } + + len += P5_X_INFO_CHECKSUM_LENGTH; + if (!ilits->compress_disable) { + len = COMPRESS_PACKET_LEN; + } + ctrl = DATA_FORMAT_DEBUG_CMD; + break; + case DATA_FORMAT_GESTURE_DEBUG: + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + len = P5_X_DEBUG_LOW_RESOLUTION_FINGER_DATA_LENGTH; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + len = P5_X_DEBUG_HIGH_RESOLUTION_FINGER_DATA_LENGTH; + } + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ilits->touch_num = MAX_TOUCH_NUM + MAX_PEN_NUM; + ilits->pen_info.report_type = P5_X_HAND_PEN_TYPE; + + ilits->cdc_data_len = (ilits->xch_num * ilits->ych_num * 2) + ((ilits->stx + ilits->srx) * 2) + (2 * self_key); + + if (data_type == P5_X_FW_RAW_DATA_MODE) { + ilits->pen_info.pen_data_mode = HAND_PEN_RAW_DATA_MODE; + len += ilits->cdc_data_len + P5_X_PEN_DATA_LEN + (((ilits->pen_info_block.nPxRaw * ilits->xch_num * 2) + (ilits->pen_info_block.nPyRaw * ilits->ych_num * 2)) * 2 + 4) + P5_X_OTHER_DATA_LEN; + } else { + ilits->pen_info.pen_data_mode = HAND_PEN_SIGNAL_MODE; + len += ilits->cdc_data_len + P5_X_PEN_DATA_LEN + (((ilits->pen_info_block.nPxVa * ilits->xch_num * 2) + (ilits->pen_info_block.nPyVa * ilits->ych_num * 2)) * 2 + 4) + P5_X_OTHER_DATA_LEN; + } + } else { + len += (2 * ilits->xch_num * ilits->ych_num) + (ilits->stx * 2) + (ilits->srx * 2) + (2 * self_key) + 16; + } + + if (ilits->rib.nCustomerType != ilits->customertype_off) { + len += P5_X_CUSTOMER_LENGTH; + } + + len += P5_X_INFO_CHECKSUM_LENGTH; + + ctrl = DATA_FORMAT_DEBUG_CMD; + break; + case DATA_FORMAT_DEMO_DEBUG_INFO: + /*only suport SPI interface now, so defult use size 1024 buffer*/ + len = demo_mode_packet_len + + P5_X_DEMO_DEBUG_INFO_ID0_LENGTH + P5_X_INFO_HEADER_LENGTH; + ctrl = DATA_FORMAT_DEMO_DEBUG_INFO_CMD; + break; + case DATA_FORMAT_GESTURE_INFO: + len = geture_info_length; + ctrl = DATA_FORMAT_GESTURE_INFO_CMD; + break; + case DATA_FORMAT_GESTURE_NORMAL: + len = P5_X_GESTURE_NORMAL_LENGTH; + ctrl = DATA_FORMAT_GESTURE_NORMAL_CMD; + break; + case DATA_FORMAT_GESTURE_SPECIAL_DEMO: + if (ilits->gesture_demo_ctrl == ENABLE) { + if (ilits->gesture_mode == DATA_FORMAT_GESTURE_INFO) + len = geture_info_length + P5_X_INFO_HEADER_LENGTH + P5_X_INFO_CHECKSUM_LENGTH; + else + len = demo_mode_packet_len + P5_X_INFO_HEADER_LENGTH + P5_X_INFO_CHECKSUM_LENGTH; + } else { + if (ilits->gesture_mode == DATA_FORMAT_GESTURE_INFO) + len = geture_info_length; + else + len = P5_X_GESTURE_NORMAL_LENGTH; + } + ILI_INFO("Gesture demo mode control = %d\n", ilits->gesture_demo_ctrl); + ili_ic_func_ctrl("gesture_demo_en", ilits->gesture_demo_ctrl); + ILI_INFO("knock_en setting\n"); + ili_ic_func_ctrl("knock_en", 0x8); + break; + case DATA_FORMAT_DEBUG_LITE_ROI: + debug_ctrl = DATA_FORMAT_DEBUG_LITE_ROI_CMD; + ctrl = DATA_FORMAT_DEBUG_LITE_CMD; + break; + case DATA_FORMAT_DEBUG_LITE_WINDOW: + debug_ctrl = DATA_FORMAT_DEBUG_LITE_WINDOW_CMD; + ctrl = DATA_FORMAT_DEBUG_LITE_CMD; + break; + case DATA_FORMAT_DEBUG_LITE_AREA: + if (data == NULL) { + ILI_ERR("DATA_FORMAT_DEBUG_LITE_AREA error cmd\n"); + return -1; + } + debug_ctrl = DATA_FORMAT_DEBUG_LITE_AREA_CMD; + ctrl = DATA_FORMAT_DEBUG_LITE_CMD; + + if (ilits->chip->core_ver >= CORE_VER_1700) { + data_type = data[0]; + cmd[4] = data[1]; + cmd[5] = data[2]; + cmd[6] = data[3]; + cmd[7] = data[4]; + } else { + cmd[3] = data[0]; + cmd[4] = data[1]; + cmd[5] = data[2]; + cmd[6] = data[3]; + } + break; +#if (TDDI_INTERFACE == BUS_I2C) + case DATA_FORMAT_DEBUG_LITE_PEN: + debug_ctrl = DATA_FORMAT_DEBUG_LITE_PEN_CMD; + ctrl = DATA_FORMAT_DEBUG_LITE_CMD; + break; +#endif + default: + ILI_ERR("Unknow TP data format\n"); + return -1; + } + + if (ctrl == DATA_FORMAT_DEBUG_LITE_CMD) { + if (format == DATA_FORMAT_DEBUG_LITE_PEN) + len = P5_X_DEBUG_LITE_PEN_LENGTH; + else + len = P5_X_DEBUG_LITE_LENGTH; + + if (ilits->chip->core_ver >= CORE_VER_1700) { + cmd[0] = P5_X_NEW_CONTROL_FORMAT; + cmd[1] = ctrl; + cmd[2] = data_type; + cmd[3] = debug_ctrl; + ret = ilits->wrapper(cmd, 11, NULL, 0, ON, OFF); + } else { + cmd[0] = P5_X_MODE_CONTROL; + cmd[1] = ctrl; + cmd[2] = debug_ctrl; + ret = ilits->wrapper(cmd, 10, NULL, 0, ON, OFF); + } + + if ((ret < 0) && !(atomic_read(&ilits->fw_stat) || atomic_read(&ilits->tp_sw_mode))) { + ILI_ERR("switch to format %d failed\n", format); + ili_switch_tp_mode(P5_X_FW_AP_MODE); + } + + } else if ((atomic_read(&ilits->tp_reset) == END) && ( + tp_mode == P5_X_FW_AP_MODE || + format == DATA_FORMAT_GESTURE_DEMO || + format == DATA_FORMAT_GESTURE_DEBUG || + format == DATA_FORMAT_DEMO)) { + + if (ilits->chip->core_ver >= CORE_VER_1700) { + cmd[0] = P5_X_NEW_CONTROL_FORMAT; + cmd[1] = ctrl; + cmd[2] = data_type; + ret = ilits->wrapper(cmd, 3, NULL, 0, ON, OFF); + } else { + cmd[0] = P5_X_MODE_CONTROL; + cmd[1] = ctrl; + ret = ilits->wrapper(cmd, 2, NULL, 0, ON, OFF); + } + + if ((ret < 0) && !(atomic_read(&ilits->fw_stat) || atomic_read(&ilits->tp_sw_mode))) { + ILI_ERR("switch to format %d failed\n", format); + ili_switch_tp_mode(P5_X_FW_AP_MODE); + } + } else if (tp_mode == P5_X_FW_GESTURE_MODE) { + + /*set gesture symbol*/ + ili_set_gesture_symbol(); + + if (send) { + if (ilits->proxmity_face == true) { + ret = ili_ic_func_ctrl("lpwg", 0x20); + if (ilits->gesture_load_code == false) { + ret = ili_ic_func_ctrl("lpwg", 0x21); + } + } else { + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME) { + ilits->prox_face_gesture= true; + if (ili_ic_func_ctrl("proximity", 0x00) < 0) { + ILI_ERR("Write proximity cmd failed\n"); + } + } + ret = ili_ic_func_ctrl("lpwg", ctrl); + } + if (ret < 0) + ILI_ERR("write gesture mode failed\n"); + } + } + + ilits->tp_data_format = format; + ilits->tp_data_len = len; + ILI_INFO("TP mode = %d, format = %d, len = %d\n", + tp_mode, ilits->tp_data_format, ilits->tp_data_len); + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ILI_INFO("Pen Type = 0x%X, Max Touch Num = %d, Pen Data Mode = %d\n",ilits->pen_info.report_type, ilits->touch_num, ilits->pen_info.pen_data_mode); + } + return ret; +} + +int ili_set_pen_data_len(u8 header, u8 ctrl, u8 type) +{ + int len = 0; + u8 ret = 0, self_key = 2; + u8 cmd[3] = {0}; + + cmd[0] = header; + cmd[1] = ctrl; + cmd[2] = type; + ret = ilits->wrapper(cmd, 3, NULL, 0, ON, OFF); + ILI_INFO("write = 0x%X, 0x%X, 0x%X\n", cmd[0], cmd[1], cmd[2]); + + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + len = P5_X_DEBUG_LOW_RESOLUTION_FINGER_DATA_LENGTH; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + len = P5_X_DEBUG_HIGH_RESOLUTION_FINGER_DATA_LENGTH; + } + + switch(ilits->pen_info.report_type) { + case P5_X_ONLY_PEN_TYPE: + ilits->cdc_data_len = (ilits->stx + ilits->srx) * 2; + len += ilits->cdc_data_len + P5_X_PEN_DATA_LEN; + + if (ilits->rib.nCustomerType != ilits->customertype_off) { + len += P5_X_CUSTOMER_LENGTH; + } + + if (type == P5_X_FW_RAW_DATA_MODE ) { + len += ((ilits->pen_info_block.nPxRaw * ilits->xch_num * 2) + (ilits->pen_info_block.nPyRaw * ilits->ych_num * 2)) * 2 + 4; + ilits->pen_info.pen_data_mode = PEN_ONLY_RAW_DATA_MODE; + } else { + len += ((ilits->pen_info_block.nPxVa * ilits->xch_num * 2) + (ilits->pen_info_block.nPyVa * ilits->ych_num * 2)) * 2 + 4; + ilits->pen_info.pen_data_mode = PEN_ONLY_SIGNAL_MODE; + } + if (!ilits->compress_penonly_disable) { + len = COMPRESS_PACKET_LEN; + } + break; + case P5_X_ONLY_HAND_TYPE: + if (type == P5_X_FW_RAW_DATA_MODE) { + ilits->pen_info.pen_data_mode = HAND_ONLY_RAW_DATA_MODE; + } else { + ilits->pen_info.pen_data_mode = HAND_ONLY_SIGNAL_MODE; + } + + ilits->cdc_data_len = (ilits->xch_num * ilits->ych_num * 2) + ((ilits->stx + ilits->srx) * 2) + (2 * self_key); + len += ilits->cdc_data_len; + + if (ilits->rib.nCustomerType != ilits->customertype_off) { + len += P5_X_CUSTOMER_LENGTH; + } + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + len += P5_X_PEN_DATA_LEN; + } + + if (!ilits->compress_handonly_disable) { + len = COMPRESS_PACKET_LEN; + } + break; + + default: + ILI_ERR("PEN Type = 0x%X, CMD Error\n", ilits->pen_info.report_type); + break; + } + len += P5_X_OTHER_DATA_LEN + P5_X_INFO_CHECKSUM_LENGTH; /* 17 */ + ilits->tp_data_len = len; + ILI_INFO("Packet Length = %d, Pen Type = 0x%X, Pen Data Mode = %d\n", ilits->tp_data_len, ilits->pen_info.report_type, ilits->pen_info.pen_data_mode); + + return ret; +} + +int ili_report_handler(void) +{ + int ret = 0, pid = 0; + u8 checksum = 0, pack_checksum = 0; + u8 *trdata = NULL; + int rlen = 0; + int tmp = debug_en; + + /* Just in case these stats couldn't be blocked in top half context */ + if (!ilits->boot || !ilits->report || atomic_read(&ilits->tp_reset) || atomic_read(&ilits->ignore_report) || + atomic_read(&ilits->fw_stat) || atomic_read(&ilits->tp_sw_mode) || + atomic_read(&ilits->mp_stat) || atomic_read(&ilits->tp_sleep)) { + ILI_INFO("ignore report request\n"); + return -EINVAL; + } + + if (ilits->irq_after_recovery) { + ILI_INFO("ignore int triggered by recovery\n"); + return -EINVAL; + } + + ili_wq_ctrl(WQ_ESD, DISABLE); + ili_wq_ctrl(WQ_BAT, DISABLE); + + if (ilits->actual_tp_mode == P5_X_FW_GESTURE_MODE) { + PM_STAY_AWAKE(ilits->ws); + + if (ilits->pm_suspend) { + /* Waiting for pm resume completed */ + ret = wait_for_completion_timeout(&ilits->pm_completion, msecs_to_jiffies(700)); + if (!ret) { + ILI_ERR("system(spi) can't finished resuming procedure."); + } + } + } + + rlen = ilits->tp_data_len; + + ILI_DBG("Packget length = %d\n", rlen); + + if (!rlen || rlen > TR_BUF_SIZE) { + ILI_ERR("Length of packet is invaild\n"); + goto out; + } + + memset(ilits->tr_buf, 0x0, TR_BUF_SIZE); + + ret = ilits->wrapper(NULL, 0, ilits->tr_buf, rlen, OFF, OFF); + + if (ilits->tr_buf[0] == P5_X_DEMO_PROXIMITY_ID) { + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME) { + ili_report_proximity_mode(ilits->tr_buf, 1); + } else if (ilits->prox_face_mode == PROXIMITY_BACKLIGHT) { + if (ilits->tr_buf[1] == PROXIMITY_NEAR_STATE_1 || ilits->tr_buf[1] == PROXIMITY_NEAR_STATE_2 || ilits->tr_buf[1] == PROXIMITY_NEAR_STATE_3) { + ILI_DBG("proxmity face status : Near, cmd : %X\n", ilits->tr_buf[1]); + } else if(ilits->tr_buf[1] == PROXIMITY_FAR_STATE_5) { + ILI_DBG("proxmity face status : Far, cmd : %X\n", ilits->tr_buf[1]); + } else { + ILI_DBG("proxmity face status : Ignore, cmd : %X\n", ilits->tr_buf[1]); + } + } + goto out; + } + + if (ret < 0) { + ILI_ERR("Read report packet failed, ret = %d\n", ret); + if (ret == DO_SPI_RECOVER) { + ilits->irq_after_recovery = true; + ili_ic_get_pc_counter(DO_SPI_RECOVER); + + if (ilits->cascade_info_block.nNum != 0) { + ilits->slave_wr_ctrl = 1; + ili_ic_get_pc_counter(DO_SPI_RECOVER); + ilits->slave_wr_ctrl = 0; + } + + if (ilits->actual_tp_mode == P5_X_FW_GESTURE_MODE && ilits->gesture && !ilits->prox_near) { + ILI_ERR("Gesture failed, doing gesture recovery\n"); + if (ili_gesture_recovery() < 0) + ILI_ERR("Failed to recover gesture\n"); + } else { + ILI_ERR("SPI ACK failed, doing spi recovery\n"); + ili_spi_recovery(); + } + msleep(100); + ilits->irq_after_recovery = false; + } + goto out; + } + + ili_dump_data(ilits->tr_buf, 8, rlen, 0, "finger report"); + + if (ilits->tr_buf[0] == P5_X_GESTURE_PACKET_ID) { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + rlen = P5_X_GESTURE_INFO_LENGTH; + } else { + rlen = P5_X_GESTURE_INFO_LENGTH_HIGH_RESOLUTION; + } + } + checksum = ili_calc_packet_checksum(ilits->tr_buf, rlen - 1); + pack_checksum = ilits->tr_buf[rlen-1]; + trdata = ilits->tr_buf; + pid = trdata[0]; + ILI_DBG("Packet ID = %x\n", pid); + + if (checksum != pack_checksum && pid != P5_X_I2CUART_PACKET_ID) { + ILI_ERR("Checksum Error (0x%X)! Pack = 0x%X, len = %d\n", checksum, pack_checksum, rlen); + debug_en = DEBUG_ALL; + ili_dump_data(trdata, 8, rlen, 0, "finger report with wrong"); + debug_en = tmp; + ret = -EINVAL; + goto out; + } + + if (pid == P5_X_INFO_HEADER_PACKET_ID) { + trdata = ilits->tr_buf + P5_X_INFO_HEADER_LENGTH; + pid = trdata[0]; + } + + switch (pid) { + case P5_X_DEMO_PACKET_ID: + ili_report_ap_mode(trdata, rlen); + break; + case P5_X_DEBUG_PACKET_ID: + ili_report_debug_mode(trdata, rlen); + break; + case P5_X_DEMO_HIGH_RESOLUTION_PACKET_ID: + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ILI_DBG("Report Switch = 0x%X\n", trdata[rlen - 2]); + ili_report_pen_ap_mode(trdata, rlen); + } else { + ili_report_ap_mode(trdata, rlen); + } + break; + case P5_X_DEBUG_HIGH_RESOLUTION_PACKET_ID: + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ILI_DBG("Report Switch = 0x%X\n", trdata[rlen - 2]); + ili_report_pen_debug_mode(trdata, rlen); + } else { + ili_report_debug_mode(trdata, rlen); + } + break; + case P5_X_DEBUG_LITE_PACKET_ID: + ili_report_debug_lite_mode(trdata, rlen); + break; + case P5_X_I2CUART_PACKET_ID: + ili_report_i2cuart_mode(trdata, rlen); + break; + case P5_X_GESTURE_PACKET_ID: + ili_report_gesture_mode(trdata, rlen); + break; + case P5_X_GESTURE_FAIL_ID: + ILI_INFO("gesture fail reason code = 0x%02x", trdata[1]); + break; + case P5_X_DEMO_DEBUG_INFO_PACKET_ID: + ili_demo_debug_info_mode(trdata, rlen); + break; + default: + ILI_ERR("Unknown packet id, %x\n", pid); +#if (TDDI_INTERFACE == BUS_I2C) + msleep(50); + + if (ilits->cascade_info_block.nNum != 0) { + ilits->slave_wr_ctrl = 1; + ili_ic_get_pc_counter(DO_I2C_RECOVER); + ilits->slave_wr_ctrl = 0; + } + + ili_ic_get_pc_counter(DO_I2C_RECOVER); + + if ((ilits->actual_tp_mode == P5_X_FW_GESTURE_MODE) && ilits->fw_latch != 0) { + ILI_ERR("I2C esd_gesture\n"); + ili_touch_esd_gesture_flash(); + } + if (ilits->fw_latch != 0) { + msleep(50); + ili_ic_func_ctrl_reset(); + ILI_ERR("I2C func_ctrl_reset\n"); + } + if ((ilits->actual_tp_mode == P5_X_FW_GESTURE_MODE) && ilits->fw_latch != 0) { + msleep(50); + ili_set_gesture_symbol(); + ILI_ERR("I2C gesture_symbol\n"); + } +#endif + break; + } + +out: + if (ilits->actual_tp_mode != P5_X_FW_GESTURE_MODE) { + ili_wq_ctrl(WQ_ESD, ENABLE); + ili_wq_ctrl(WQ_BAT, ENABLE); + } + + if (ilits->actual_tp_mode == P5_X_FW_GESTURE_MODE) + PM_RELAX(ilits->ws); + return ret; +} + +int ili_cascade_reset_ctrl(int reset_mode, bool enter_ice) +{ + int ret = 0; + + if (ili_reset_ctrl(reset_mode) < 0) { + ILI_ERR("TP Reset failed during init\n"); + ret = -EFW_REST; + } + + if (reset_mode == TP_IC_CODE_RST) { + ili_ice_mode_ctrl_by_mode(DISABLE, OFF, BOTH); + } + +#if (TDDI_INTERFACE == BUS_SPI && ENABLE_CASCADE) + if (reset_mode != TP_IC_CODE_RST) { + atomic_set(&ilits->slave_ice_stat, DISABLE); + ILI_INFO("Set slave ice state atomic : %d\n", atomic_read(&ilits->slave_ice_stat)); + } +#endif + /* No need start sync cmd after reset. */ + atomic_set(&ilits->sync_stat, DISABLE); + ILI_DBG("Set atomic sync stat = %d\n", atomic_read(&ilits->sync_stat)); + + return ret; +} + +int ili_reset_ctrl(int mode) +{ + int ret = 0; + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; + + atomic_set(&ilits->tp_reset, START); + +#if MULTI_REPORT_RATE + if (mode == TP_IC_WHOLE_RST_WITH_FLASH || mode == TP_HW_RST_ONLY) { + if (ili_ic_report_rate_register_set() < 0) + ILI_ERR("write report rate password failed\n"); + } +#endif + + switch (mode) { + case TP_IC_CODE_RST: + ILI_INFO("TP IC Code RST \n"); + ret = ili_ic_code_reset(OFF); + ilits->pll_clk_wakeup = false; + if (ret < 0) + ILI_ERR("IC Code reset failed\n"); + break; + case TP_IC_WHOLE_RST_WITH_FLASH: + ILI_INFO("TP IC whole RST\n"); + ret = ili_ic_whole_reset(OFF, ON); + if (ret < 0) + ILI_ERR("IC whole reset failed\n"); + ilits->pll_clk_wakeup = true; + break; + case TP_IC_WHOLE_RST_WITHOUT_FLASH: + ILI_INFO("TP IC whole RST without flash\n"); + ret = ili_ic_whole_reset(OFF, OFF); + if (ret < 0) + ILI_ERR("IC whole reset without flash failed\n"); + ilits->pll_clk_wakeup = true; + break; + case TP_HW_RST_ONLY: + ILI_INFO("TP HW RST\n"); + ili_tp_reset(); + ilits->pll_clk_wakeup = true; + break; + default: + ILI_ERR("Unknown reset mode, %d\n", mode); + ret = -EINVAL; + break; + } + /* + * Since OTP must be folloing with reset, except for code rest, + * the stat of ice mode should be set as 0. + */ + if (mode != TP_IC_CODE_RST) + atomic_set(&ilits->ice_stat, DISABLE); + + if (ili_set_tp_data_len(DATA_FORMAT_DEMO, false, &data_type) < 0) + ILI_ERR("Failed to set tp data length\n"); + + atomic_set(&ilits->tp_reset, END); + return ret; +} + +#if 0 +static int ilitek_get_tp_module(void) +{ + ILI_DBG("return tp_module: %d", ilits->tp_module); + return ilits->tp_module; +} +#endif + +static void ili_update_tp_module_info(void) +{ + int module; + + module = ilits->tp_module; + + switch (module) { + case MODEL_CSOT: + ilits->md_name = "CSOT"; + ilits->md_fw_filp_path = CSOT_FW_FILP_PATH; + ilits->md_fw_rq_path = CSOT_FW_REQUEST_PATH; + ilits->md_ini_path = CSOT_INI_NAME_PATH; + ilits->md_ini_rq_path = CSOT_INI_REQUEST_PATH; + ilits->md_fw_ili = CTPM_FW_CSOT; + ilits->md_fw_ili_size = sizeof(CTPM_FW_CSOT); + break; + case MODEL_AUO: + ilits->md_name = "AUO"; + ilits->md_fw_filp_path = AUO_FW_FILP_PATH; + ilits->md_fw_rq_path = AUO_FW_REQUEST_PATH; + ilits->md_ini_path = AUO_INI_NAME_PATH; + ilits->md_ini_rq_path = AUO_INI_REQUEST_PATH; + ilits->md_fw_ili = CTPM_FW_AUO; + ilits->md_fw_ili_size = sizeof(CTPM_FW_AUO); + break; + case MODEL_BOE: + ilits->md_name = "BOE"; + ilits->md_fw_filp_path = BOE_FW_FILP_PATH; + ilits->md_fw_rq_path = BOE_FW_REQUEST_PATH; + ilits->md_ini_path = BOE_INI_NAME_PATH; + ilits->md_ini_rq_path = BOE_INI_REQUEST_PATH; + ilits->md_fw_ili = CTPM_FW_BOE; + ilits->md_fw_ili_size = sizeof(CTPM_FW_BOE); + break; + case MODEL_INX: + ilits->md_name = "INX"; + ilits->md_fw_filp_path = INX_FW_FILP_PATH; + ilits->md_fw_rq_path = INX_FW_REQUEST_PATH; + ilits->md_ini_path = INX_INI_NAME_PATH; + ilits->md_ini_rq_path = INX_INI_REQUEST_PATH; + ilits->md_fw_ili = CTPM_FW_INX; + ilits->md_fw_ili_size = sizeof(CTPM_FW_INX); + break; + case MODEL_DJ: + ilits->md_name = "DJ"; + ilits->md_fw_filp_path = DJ_FW_FILP_PATH; + ilits->md_fw_rq_path = DJ_FW_REQUEST_PATH; + ilits->md_ini_path = DJ_INI_NAME_PATH; + ilits->md_ini_rq_path = DJ_INI_REQUEST_PATH; + ilits->md_fw_ili = CTPM_FW_DJ; + ilits->md_fw_ili_size = sizeof(CTPM_FW_DJ); + break; + case MODEL_TXD: + ilits->md_name = "TXD"; + ilits->md_fw_filp_path = TXD_FW_FILP_PATH; + ilits->md_fw_rq_path = TXD_FW_REQUEST_PATH; + ilits->md_ini_path = TXD_INI_NAME_PATH; + ilits->md_ini_rq_path = TXD_INI_REQUEST_PATH; + ilits->md_fw_ili = CTPM_FW_TXD; + ilits->md_fw_ili_size = sizeof(CTPM_FW_TXD); + break; + case MODEL_TM: + ilits->md_name = "TM"; + ilits->md_fw_filp_path = TM_FW_FILP_PATH; + ilits->md_fw_rq_path = TM_FW_REQUEST_PATH; + ilits->md_ini_path = TM_INI_NAME_PATH; + ilits->md_ini_rq_path = TM_INI_REQUEST_PATH; + ilits->md_fw_ili = CTPM_FW_TM; + ilits->md_fw_ili_size = sizeof(CTPM_FW_TM); + break; + default: + if(module) { + ILI_INFO("No md info for module:%d, use default\n", module); + module = 0; + } + ILI_ERR("Couldn't find any tp modules, applying default settings\n"); + ilits->md_name = "DEF"; + ilits->md_fw_filp_path = DEF_FW_FILP_PATH; + ilits->md_fw_rq_path = DEF_FW_REQUEST_PATH; + ilits->md_ini_path = DEF_INI_NAME_PATH; + ilits->md_ini_rq_path = DEF_INI_REQUEST_PATH; + ilits->md_fw_ili = CTPM_FW_DEF; + ilits->md_fw_ili_size = sizeof(CTPM_FW_DEF); + break; + } + + ILI_INFO("Found %s module: ini path = %s, fw path = (%s, %s, %d)\n", + ilits->md_name, + ilits->md_ini_path, + ilits->md_fw_filp_path, + ilits->md_fw_rq_path, + ilits->md_fw_ili_size); + + ilits->tp_module = module; +} + +int ili_tddi_init(void) +{ +#if (BOOT_FW_UPDATE | HOST_DOWN_LOAD) + struct task_struct *fw_boot_th; +#else + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; +#endif + + ILI_INFO("driver version = %s\n", DRIVER_VERSION); + + mutex_init(&ilits->touch_mutex); + mutex_init(&ilits->debug_mutex); + mutex_init(&ilits->debug_read_mutex); + init_waitqueue_head(&(ilits->inq)); + spin_lock_init(&ilits->irq_spin); + init_completion(&ilits->esd_done); + + atomic_set(&ilits->ice_stat, DISABLE); + atomic_set(&ilits->tp_reset, END); + atomic_set(&ilits->fw_stat, END); + atomic_set(&ilits->mp_stat, DISABLE); + atomic_set(&ilits->tp_sleep, END); + atomic_set(&ilits->cmd_int_check, DISABLE); + atomic_set(&ilits->esd_stat, END); + atomic_set(&ilits->tp_sw_mode, END); + atomic_set(&ilits->ignore_report, END); + + ili_ic_init(); + ilitek_tddi_wq_init(); + + /* Must do hw reset once in first time for work normally if tp reset is avaliable */ +#if !TDDI_RST_BIND + if (ili_reset_ctrl(ilits->reset) < 0) + ILI_ERR("TP Reset failed during init\n"); +#endif + + ilits->demo_debug_info[0] = ili_demo_debug_info_id0; + ilits->tp_data_format = DATA_FORMAT_DEMO; + ilits->boot = false; + + /* + * This status of ice enable will be reset until process of fw upgrade runs. + * it might cause unknown problems if we disable ice mode without any + * codes inside touch ic. + */ +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + ili_ice_mode_ctrl_by_mode(ENABLE, OFF, BOTH); +#elif (TDDI_INTERFACE == BUS_SPI && ENABLE_CASCADE) + ili_set_bypass_mode(OFF); +#else + if (ili_ice_mode_ctrl(ENABLE, OFF) < 0) + ILI_ERR("Failed to enable ice mode during ili_tddi_init\n"); +#endif + + if (ili_ic_dummy_check() < 0) { + ILI_ERR("Not found ilitek chip\n"); + return -ENODEV; + } +#if ENABLE_CASCADE + if (ili_cascade_ic_get_info(false, false) < 0) + ILI_ERR("Slave Chip info is incorrect\n"); +#else + if (ili_ic_get_info() < 0) + ILI_ERR("Chip info is incorrect\n"); +#endif + + ili_update_tp_module_info(); + + ili_node_init(); + + ili_fw_read_flash_info(OFF); + +#if (BOOT_FW_UPDATE | HOST_DOWN_LOAD) + fw_boot_th = kthread_run(ili_fw_upgrade_handler, NULL, "ili_fw_boot"); + if (fw_boot_th == (struct task_struct *)ERR_PTR) { + fw_boot_th = NULL; + /*WARN_ON(!fw_boot_th);*/ + ILI_ERR("Failed to create fw upgrade thread\n"); + } +#else +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + ili_ice_mode_ctrl_by_mode(DISABLE, OFF, BOTH); +#else + if (ili_ice_mode_ctrl(DISABLE, OFF) < 0) + ILI_ERR("Failed to disable ice mode failed during init\n"); +#endif + +#if (TDDI_INTERFACE == BUS_I2C) + ilits->info_from_hex = DISABLE; +#endif + + ili_ic_get_all_info(); + + ili_set_tp_data_len(DATA_FORMAT_DEMO, false, &data_type); + +#if (TDDI_INTERFACE == BUS_I2C) + ilits->info_from_hex = ENABLE; +#endif + + ILI_INFO("Registre touch to input subsystem\n"); + ili_input_register(); + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ili_input_pen_register(); + } + ili_wq_ctrl(WQ_ESD, ENABLE); + ili_wq_ctrl(WQ_BAT, ENABLE); + ilits->boot = true; +#endif + + PM_WAKEUP_REGISTER(NULL, ilits->ws, "ili_wakelock"); + if (!ilits->ws) + ILI_ERR("wakeup source request failed\n"); + + ili_ic_edge_palm_para_init(); + + return 0; +} + +void ili_dev_remove(bool flag) +{ + ILI_INFO("remove ilitek dev\n"); + + if (!ilits) + return; + + gpio_free(ilits->tp_int); + gpio_free(ilits->tp_rst); + + if (esd_wq != NULL) { + cancel_delayed_work_sync(&esd_work); + flush_workqueue(esd_wq); + destroy_workqueue(esd_wq); + } + if (bat_wq != NULL) { + cancel_delayed_work_sync(&bat_work); + flush_workqueue(bat_wq); + destroy_workqueue(bat_wq); + } + + if (ilits->ws) + PM_WAKEUP_UNREGISTER(ilits->ws); + + kfree(ilits->tr_buf); + kfree(ilits->gcoord); + + ili_interface_dev_exit(ilits, flag); +} + +int ili_dev_init(struct ilitek_hwif_info *hwif) +{ + ILI_INFO("TP Interface: %s\n", (hwif->bus_type == BUS_I2C) ? "I2C" : "SPI"); + return ili_interface_dev_init(hwif); +} diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3.h b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3.h new file mode 100644 index 000000000000..a8c9da067909 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3.h @@ -0,0 +1,1674 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __ILITEK_V3_H +#define __ILITEK_V3_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_COMPAT +#include +#endif +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_OF +#include +#include +#include +#include +#include +#endif + +#ifdef CONFIG_FB +#include +#include +#endif + +#ifdef CONFIG_DRM +#include +#endif + +#if IS_ENABLED(CONFIG_DRM_MEDIATEK) +#include "mtk_panel_ext.h" +#include "mtk_disp_notify.h" +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#ifdef CONFIG_DRM_MSM +#include +#endif + +#ifdef ILI_SENSOR_EN +#include +#endif + +#ifdef CONFIG_MTK_SPI +#include "mt_spi.h" +#include "sync_write.h" +#endif +#include + +#define DRIVER_VERSION "3.0.9.0.230110" + +#define ENABLE 1 +#define DISABLE 0 +#define K (1024) +#define M (K * K) +#define START 1 +#define ON 1 +#define ILI_WRITE 1 +#define ILI_READ 0 +#define END 0 +#define OFF 0 +#define NONE -1 + +/* Options */ +#define TDDI_INTERFACE BUS_SPI /* BUS_I2C(0x18) or BUS_SPI(0x1C) */ +#define VDD_VOLTAGE 1800000 +#define VCC_VOLTAGE 1800000 +#define SPI_CLK 9 /* follow by clk list */ +#define SPI_RETRY 5 +#define IRQ_GPIO_NUM 66 +#define TR_BUF_SIZE (6*K) /* Buffer size of touch report */ +#define TR_BUF_LIST_SIZE (256) /* Buffer size of touch report for debug data */ +#define SPI_TX_BUF_SIZE (6*K) +#define SPI_RX_BUF_SIZE (6*K) +#define WQ_ESD_DELAY 4000 +#define WQ_BAT_DELAY 2000 +#define AP_INT_TIMEOUT 600 /*600ms*/ +#define MP_INT_TIMEOUT 5000 /*5s*/ +#define MT_B_TYPE ENABLE +#define TDDI_RST_BIND DISABLE +#define MT_PRESSURE DISABLE +#define ENABLE_WQ_ESD DISABLE +#define ENABLE_WQ_BAT DISABLE +#ifdef ILI_SENSOR_EN +#define ENABLE_GESTURE ENABLE +#else +#define ENABLE_GESTURE DISABLE +#endif +#define REGULATOR_POWER DISABLE +#define TP_SUSPEND_PRIO ENABLE +#define BOOT_FW_UPDATE ENABLE +#ifdef ILI_CONFIG_RESUME_BY_DDI +#define RESUME_BY_DDI ENABLE +#else +#define RESUME_BY_DDI DISABLE +#endif +#define MP_INT_LEVEL DISABLE +#define PLL_CLK_WAKEUP_TP_RESUME DISABLE +#ifdef ILI_CONFIG_MTK_CHARGER +#define CHARGER_NOTIFIER_CALLBACK ENABLE +#define USB_DETECT_IN 1 +#define USB_DETECT_OUT 2 +#else +#define CHARGER_NOTIFIER_CALLBACK DISABLE +#endif +#define ENABLE_EDGE_PALM_PARA DISABLE +#define MULTI_REPORT_RATE DISABLE +#define ENGINEER_FLOW ENABLE +#define DMESG_SEQ_FILE ENABLE +#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE +#define GENERIC_KERNEL_IMAGE ENABLE/*follow gki */ +#else +#define GENERIC_KERNEL_IMAGE DISABLE/*follow gki */ +#endif +#define SUSPEND_RESUME_SUPPORT ENABLE + +#define BOOT_FW_UPDATE_MODE BOOT_FW_VER_DIFF +#define BOOT_FW_VER_DIFF 0 +#define BOOT_FW_VER_UPGRADE 1 +#define BOOT_FW_VER_DOWNGRADE 2 + +/*Compress mode options*/ +#define ENABLE_COMPRESS_MODE DISABLE +#define COMPRESS_PACKET_LEN 4093 + +/*GET_ALL_INFO options*/ +#define ENABLE_GET_ALL_INFO DISABLE + +/*Pen mode options*/ +#define ENABLE_PEN_MODE DISABLE +#define ENABLE_CASCADE DISABLE + +#define PROXIMITY_RESET_CMD 0 +#define PROXIMITY_NO_RESET_CMD 1 + +#define PROXIMITY_IGNORE_STATE 0 +#define PROXIMITY_NEAR_STATE 1 +#define PROXIMITY_FAR_STATE 2 + +/*if current interface is spi, must to hostdownload */ +#if (TDDI_INTERFACE == BUS_SPI) +#define HOST_DOWN_LOAD ENABLE +#else +#define HOST_DOWN_LOAD DISABLE +#endif + +/* Plaform compatibility */ +#define CONFIG_PLAT_SPRD DISABLE +#define I2C_DMA_TRANSFER DISABLE +#if (ENABLE_CASCADE == ENABLE) +#define SPI_DMA_TRANSFER_SPLIT ENABLE +#else +#define SPI_DMA_TRANSFER_SPLIT DISABLE +#endif +#define SPI_DMA_TRANSFER_SPLIT_OLD DISABLE +#define SPRD_SYSFS_SUSPEND_RESUME DISABLE + +/* Path */ +#define DEBUG_DATA_FILE_SIZE (10*K) +#define DEBUG_DATA_FILE_PATH "/sdcard/ILITEK_log.csv" +#define CSV_LCM_ON_PATH "/sdcard/ilitek_mp_lcm_on_log" +#define CSV_LCM_OFF_PATH "/sdcard/ilitek_mp_lcm_off_log" +#define CSV_LCM_DEF_PATH "/data/local/tmp" +#define POWER_STATUS_PATH "/sys/class/power_supply/battery/status" +#define DUMP_FLASH_PATH "/sdcard/flash_dump" +#define DUMP_IRAM_PATH "/sdcard/iram_dump" + +/* Debug messages */ +#define DEBUG_NONE 0 +#define DEBUG_ALL 1 +#define DEBUG_OUTPUT DEBUG_NONE + +#define ILI_INFO(fmt, arg...) \ +({ \ + pr_info("ILITEK: (%s, %d): " fmt, __func__, __LINE__, ##arg); \ +}) \ + +#define ILI_ERR(fmt, arg...) \ +({ \ + pr_err("ILITEK: (%s, %d): " fmt, __func__, __LINE__, ##arg); \ +}) \ + +extern bool debug_en; +#define ILI_DBG(fmt, arg...) \ +do { \ + if (debug_en) \ + pr_info("ILITEK: (%s, %d): " fmt, __func__, __LINE__, ##arg); \ +} while (0) + +#define ERR_ALLOC_MEM(X) ((IS_ERR(X) || X == NULL) ? 1 : 0) +#define DO_SPI_RECOVER -2 +#define DO_I2C_RECOVER -3 + +#define PEN_INPUT_DEVICE "ILITEK_PEN" + +#define SINGLE_TOUCH 0 +#define MULTI_TOUCH 1 +#define SPI_CLK_CASCADE_TABLE_NUM 3 + +#define NEGITIVE_FLAG BIT(7) +#define TIPSWITCH_HOVER_BIT (BIT(0)|BIT(4)) +#define MAX_PRESSURE (BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6)|BIT(7)|BIT(8)|BIT(9)|BIT(10)|BIT(11)) + +/* Path */ +#define TXT_FILE_SIZE (1*K) +#define PEN_ID_NODE_TEST_PATH "/sdcard/Get_Wacom_PenID.txt" + +enum CASCADE_MODE { + MASTER = 0, + SLAVE, + BOTH, +}; + +enum PROXIMITY_MODE { + PROXIMITY_NULL = 0, + PROXIMITY_SUSPEND_RESUME, + PROXIMITY_BACKLIGHT +}; + +enum TP_SPI_CLK_LIST { + TP_SPI_CLK_1M = 1000000, + TP_SPI_CLK_2M = 2000000, + TP_SPI_CLK_3M = 3000000, + TP_SPI_CLK_4M = 4000000, + TP_SPI_CLK_5M = 5000000, + TP_SPI_CLK_6M = 6000000, + TP_SPI_CLK_7M = 7000000, + TP_SPI_CLK_8M = 8000000, + TP_SPI_CLK_9M = 9000000, + TP_SPI_CLK_10M = 10000000, + TP_SPI_CLK_11M = 11000000, + TP_SPI_CLK_12M = 12000000, + TP_SPI_CLK_13M = 13000000, + TP_SPI_CLK_14M = 14000000, + TP_SPI_CLK_15M = 15000000, +}; + +enum TP_PLAT_TYPE { + TP_PLAT_MTK = 0, + TP_PLAT_QCOM +}; + +enum TP_RST_METHOD { + TP_IC_WHOLE_RST_WITH_FLASH = 0, + TP_IC_WHOLE_RST_WITHOUT_FLASH, + TP_IC_CODE_RST, + TP_HW_RST_ONLY, +}; + +enum TP_FW_UPGRADE_TYPE { + UPGRADE_FLASH = 0, + UPGRADE_IRAM +}; + +enum TP_FW_UPGRADE_STATUS { + FW_STAT_INIT = 0, + FW_UPDATING = 90, + FW_UPDATE_PASS = 100, + FW_UPDATE_FAIL = -1 +}; + +enum TP_FW_OPEN_METHOD { + REQUEST_FIRMWARE = 0, + FILP_OPEN +}; + +enum TP_SLEEP_STATUS { + TP_SUSPEND = 0, + TP_DEEP_SLEEP = 1, + TP_RESUME = 2 +}; + +enum TP_PROXIMITY_STATUS { + DDI_POWER_OFF = 0, + DDI_POWER_ON = 1, + WAKE_UP_GESTURE_RECOVERY = 2, + WAKE_UP_SWITCH_GESTURE_MODE = 3 +}; + +enum TP_SLEEP_CTRL { + SLEEP_IN = 0x0, + SLEEP_OUT = 0x1, + DEEP_SLEEP_IN = 0x3 +}; + +enum TP_FW_BLOCK_NUM { + AP = 1, + DATA = 2, + TUNING = 3, + GESTURE = 4, + MP = 5, + DDI = 6, + TAG = 7, + PARA_BACKUP = 8, + RESERVE_BLOCK3 = 9, + PEN = 10, + RESERVE_BLOCK5 = 11, + RESERVE_BLOCK6 = 12, + RESERVE_BLOCK7 = 13, + RESERVE_BLOCK8 = 14, + RESERVE_BLOCK9 = 15, + RESERVE_BLOCK10 = 16, +}; + +enum TP_FW_BLOCK_TAG { + BLOCK_TAG_AF = 0xAF, + BLOCK_TAG_B0 = 0xB0 +}; + +enum TP_WQ_TYPE { + WQ_ESD = 0, + WQ_BAT, +}; + +enum TP_RECORD_DATA { + DISABLE_RECORD = 0, + ENABLE_RECORD, + DATA_RECORD +}; + +enum TP_DATA_FORMAT { + DATA_FORMAT_DEMO = 0, + DATA_FORMAT_DEBUG, + DATA_FORMAT_DEMO_DEBUG_INFO, + DATA_FORMAT_GESTURE_SPECIAL_DEMO, + DATA_FORMAT_GESTURE_INFO, + DATA_FORMAT_GESTURE_NORMAL, + DATA_FORMAT_GESTURE_DEMO, + DATA_FORMAT_GESTURE_DEBUG, + DATA_FORMAT_DEBUG_LITE_ROI, + DATA_FORMAT_DEBUG_LITE_WINDOW, + DATA_FORMAT_DEBUG_LITE_AREA, + DATA_FORMAT_DEBUG_LITE_PEN, +}; + +enum NODE_MODE_SWITCH { + AP_MODE = 0, + TEST_MODE, + DEBUG_MODE, + DEBUG_LITE_ROI, + DEBUG_LITE_WINDOW, + DEBUG_LITE_AREA, + DEBUG_PEN_ONLY_MODE, + DEBUG_HAND_ONLY_MODE, + DEBUG_LITE_PEN, +}; + +enum TP_MODEL { + MODEL_DEF = 0, + MODEL_CSOT, + MODEL_AUO, + MODEL_BOE, + MODEL_INX, + MODEL_DJ, + MODEL_TXD, + MODEL_TM +}; + +enum TP_ERR_CODE { + EMP_CMD = 100, + EMP_PROTOCOL, + EMP_FILE, + EMP_INI, + EMP_TIMING_INFO, + EMP_INVAL, + EMP_PARSE, + EMP_NOMEM, + EMP_GET_CDC, + EMP_INT, + EMP_CHECK_BUY, + EMP_MODE, + EMP_FW_PROC, + EMP_FORMUL_NULL, + EMP_PARA_NULL, + EFW_CONVERT_FILE, + EFW_ICE_MODE, + EFW_CRC, + EFW_REST, + EFW_ERASE, + EFW_PROGRAM, + EFW_INTERFACE, +}; + +enum TP_IC_TYPE { + ILI_A = 0x0A, + ILI_B, + ILI_C, + ILI_D, + ILI_E, + ILI_F, + ILI_G, + ILI_H, + ILI_I, + ILI_J, + ILI_K, + ILI_L, + ILI_M, + ILI_N, + ILI_O, + ILI_P, + ILI_Q, + ILI_R, + ILI_S, + ILI_T, + ILI_U, + ILI_V, + ILI_W, + ILI_X, + ILI_Y, + ILI_Z, +}; + +enum PROXIMITY_REPORT_STATE { + PROXIMITY_NONE_STATE_0 = 0, + PROXIMITY_NEAR_STATE_1 = 1, + PROXIMITY_NEAR_STATE_2 = 2, + PROXIMITY_NEAR_STATE_3 = 3, + PROXIMITY_NONE_STATE_4 = 4, + PROXIMITY_FAR_STATE_5 = 5, +}; + +#if MULTI_REPORT_RATE +enum MULTI_REPORT_RATE_TYPE { + DDI120_TP120 = 0, + DDI60_TP120 = 1, + DDI90_TP180 = 2, + DDI120_TP240 = 3, + DDI144_TP144 = 4, + DDI90_TP120 = 5, +}; +#endif + +typedef enum cmd_types{ + CMD_DISABLE = 0x00, + CMD_ENABLE = 0x01, + CMD_STATUS = 0x02, + CMD_ROI_DATA = 0x03, +} cmd_types; + +struct gesture_symbol { + u8 double_tap :1; + u8 alphabet_line_2_top :1; + u8 alphabet_line_2_bottom :1; + u8 alphabet_line_2_left :1; + u8 alphabet_line_2_right :1; + u8 alphabet_m :1; + u8 alphabet_w :1; + u8 alphabet_c :1; + u8 alphabet_E :1; + u8 alphabet_V :1; + u8 alphabet_O :1; + u8 alphabet_S :1; + u8 alphabet_Z :1; + u8 alphabet_V_down :1; + u8 alphabet_V_left :1; + u8 alphabet_V_right :1; + u8 alphabet_two_line_2_bottom :1; + u8 alphabet_F :1; + u8 alphabet_AT :1; + u8 single_tap :1; + u8 reserve0 :4; +}; + +struct report_info_block { + u8 nReportByPixel :1; + u8 nIsHostDownload :1; + u8 nIsSPIICE :1; + u8 nIsSPISLAVE :1; + u8 nIsI2C :1; + u8 nReserved00 :3; + u8 nReportResolutionMode:3; + u8 nCustomerType :5; + u8 nReserved02 :8; + u8 nReserved03 :8; +}; + +struct file_buffer { + char *ptr; + char fname[128]; + int32_t wlen; + int32_t flen; + int32_t max_size; +}; + +struct cascade_info_block { + u8 nDisable :1; + u8 nNum :3; + u8 nReserved00 :4; + u8 nReserved01 :8; + u8 nReserved02 :8; + u8 nReserved03 :8; +}; + +struct pen_info_block { + u8 nPxRaw :8; + u8 nPyRaw :8; + u8 nPxVa :8; + u8 nPyVa :8; + u8 nReserved00 :8; + u8 nReserved01 :8; + u8 nReserved02 :8; + u8 nReserved03 :8; +}; + +typedef enum pen_data_modes { + HAND_PEN_DEMO_MODE = 0, + HAND_PEN_SIGNAL_MODE, + HAND_PEN_RAW_DATA_MODE, + PEN_ONLY_SIGNAL_MODE, + PEN_ONLY_RAW_DATA_MODE, + HAND_ONLY_SIGNAL_MODE, + HAND_ONLY_RAW_DATA_MODE, +}pen_data_modes; + +typedef enum report_types { + P5_X_HAND_PEN_TYPE = 0, /* 0x39, FigType 0-2 bits, CustomType 3-5, PenType 6-7 */ + P5_X_ONLY_PEN_TYPE = 1, /* 0x3F */ + P5_X_ONLY_HAND_TYPE = 2, /* 0xF9 */ + +}report_types; + +struct ilitek_pen_info { + u16 x; + u16 y; + u16 pressure; + s32 tilt_x; + s32 tilt_y; + u8 pen_id[8]; + u8 distance_cnt; + bool TipSwitch; + bool BarelSwitch; + bool Eraser; + bool InRange; + bool active; + bool finger_touch; + report_types report_type; + pen_data_modes pen_data_mode; +}; + +#define TDDI_I2C_ADDR 0x41 +#define TDDI_I2C_SLAVE_ADDR 0x4f +#define TDDI_DEV_ID "ILITEK_TDDI" + + /* define the width and heigth of a screen. */ +#define TOUCH_SCREEN_X_MIN 0 +#define TOUCH_SCREEN_Y_MIN 0 +#define TOUCH_SCREEN_X_MAX 720 +#define TOUCH_SCREEN_Y_MAX 1440 +#define MAX_TOUCH_NUM 10 +#define MAX_PEN_NUM 1 +#define PEN_INDEX 10 +#define ILITEK_KNUCKLE_ROI_FINGERS 2 + +/* define the range on space, don't change */ +#define TPD_HEIGHT 2048 +#define TPD_WIDTH 2048 +#define TPD_HIGH_RESOLUTION_HEIGHT 8192 +#define TPD_HIGH_RESOLUTION_WIDTH 8192 + +/* Firmware upgrade */ +#define CORE_VER_1410 0x01040100 +#define CORE_VER_1420 0x01040200 +#define CORE_VER_1430 0x01040300 +#define CORE_VER_1460 0x01040600 +#define CORE_VER_1470 0x01040700 +#define CORE_VER_1600 0x01060000 +#define CORE_VER_1700 0x01070000 +#define MAX_HEX_FILE_SIZE (256*K) +#define ILI_FILE_HEADER 256 +#define DLM_START_ADDRESS 0x20610 +#define DLM_HEX_ADDRESS 0x10000 +#define MP_HEX_ADDRESS 0x13000 +#define DDI_RSV_BK_ST_ADDR 0x1E000 +#define DDI_RSV_BK_END_ADDR 0x1FFFF +#define DDI_RSV_BK_SIZE (1*K) +#define RSV_BK_ST_ADDR 0x1E000 +#define RSV_BK_END_ADDR 0x1E3FF +#define FW_VER_ADDR 0xFFE0 +#define FW_BLOCK_INFO_NUM 17 +#if SPI_DMA_TRANSFER_SPLIT +#define SPI_UPGRADE_LEN 2048 +#else +#define SPI_UPGRADE_LEN 0 +#endif +#define SPI_BUF_SIZE MAX_HEX_FILE_SIZE +#define INFO_HEX_ST_ADDR 0x4F +#define INFO_MP_HEX_ADDR 0x1F +#define INFO_PEN_ST_ADDR 0x67 +#define INFO_CASCADE_ST_ADDR 0x6B + + +/* DMA Control Registers */ +#define DMA_BASED_ADDR 0x72000 +#define DMA48_ADDR (DMA_BASED_ADDR + 0xC0) +#define DMA48_reg_dma_ch0_busy_flag DMA48_ADDR +#define DMA48_reserved_0 0xFFFE +#define DMA48_reg_dma_ch0_trigger_sel (BIT(16)|BIT(17)|BIT(18)|BIT(19)) +#define DMA48_reserved_1 (BIT(20)|BIT(21)|BIT(22)|BIT(23)) +#define DMA48_reg_dma_ch0_start_set BIT(24) +#define DMA48_reg_dma_ch0_start_clear BIT(25) +#define DMA48_reg_dma_ch0_trigger_src_mask BIT(26) +#define DMA48_reserved_2 BIT(27) + +#define DMA49_ADDR (DMA_BASED_ADDR + 0xC4) +#define DMA49_reg_dma_ch0_src1_addr DMA49_ADDR +#define DMA49_reserved_0 BIT(20) + +#define DMA50_ADDR (DMA_BASED_ADDR + 0xC8) +#define DMA50_reg_dma_ch0_src1_step_inc DMA50_ADDR +#define DMA50_reserved_0 (DMA50_ADDR + 0x01) +#define DMA50_reg_dma_ch0_src1_format (BIT(24)|BIT(25)) +#define DMA50_reserved_1 (BIT(26)|BIT(27)|BIT(28)|BIT(29)|BIT(30)) +#define DMA50_reg_dma_ch0_src1_en BIT(31) + +#define DMA52_ADDR (DMA_BASED_ADDR + 0xD0) +#define DMA52_reg_dma_ch0_src2_step_inc DMA52_ADDR +#define DMA52_reserved_0 (DMA52_ADDR + 0x01) +#define DMA52_reg_dma_ch0_src2_format (BIT(24)|BIT(25)) +#define DMA52_reserved_1 (BIT(26)|BIT(27)|BIT(28)|BIT(29)|BIT(30)) +#define DMA52_reg_dma_ch0_src2_en BIT(31) + +#define DMA53_ADDR (DMA_BASED_ADDR + 0xD4) +#define DMA53_reg_dma_ch0_dest_addr DMA53_ADDR +#define DMA53_reserved_0 BIT(20) + +#define DMA54_ADDR (DMA_BASED_ADDR + 0xD8) +#define DMA54_reg_dma_ch0_dest_step_inc DMA54_ADDR +#define DMA54_reserved_0 (DMA54_ADDR + 0x01) +#define DMA54_reg_dma_ch0_dest_format (BIT(24)|BIT(25)) +#define DMA54_reserved_1 (BIT(26)|BIT(27)|BIT(28)|BIT(29)|BIT(30)) +#define DMA54_reg_dma_ch0_dest_en BIT(31) + +#define DMA55_ADDR (DMA_BASED_ADDR + 0xDC) +#define DMA55_reg_dma_ch0_trafer_counts DMA55_ADDR +#define DMA55_reserved_0 (BIT(17)|BIT(18)|BIT(19)|BIT(20)|BIT(21)|BIT(22)|BIT(23)) +#define DMA55_reg_dma_ch0_trafer_mode (BIT(24)|BIT(25)|BIT(26)|BIT(27)) +#define DMA55_reserved_1 (BIT(28)|BIT(29)|BIT(30)|BIT(31)) + +/* INT Function Registers */ +#define INTR_BASED_ADDR 0x48000 +#define INTR1_ADDR (INTR_BASED_ADDR + 0x4) +#define INTR1_FLASH_INT_FLAG (INTR_BASED_ADDR + 0x7) +#define INTR1_reg_uart_tx_int_flag INTR1_ADDR +#define INTR1_reserved_0 (BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6)|BIT(7)) +#define INTR1_reg_wdt_alarm_int_flag BIT(8) +#define INTR1_reserved_1 (BIT(9)|BIT(10)|BIT(11)|BIT(12)|BIT(13)|BIT(14)|BIT(15)) +#define INTR1_reg_dma_ch1_int_flag BIT(16) +#define INTR1_reg_dma_ch0_int_flag BIT(17) +#define INTR1_reg_dma_frame_done_int_flag BIT(18) +#define INTR1_reg_dma_tdi_done_int_flag BIT(19) +#define INTR1_reserved_2 (BIT(20)|BIT(21)|BIT(22)|BIT(23)) +#define INTR1_reg_flash_error_flag BIT(24) +#define INTR1_reg_flash_int_flag BIT(25) +#define INTR1_reserved_3 BIT(26) + +#define INTR2_ADDR (INTR_BASED_ADDR + 0x8) +#define INTR2_td_int_flag_clear INTR2_ADDR +#define INTR2_td_timeout_int_flag_clear BIT(1) +#define INTR2_td_debug_frame_done_int_flag_clear BIT(2) +#define INTR2_td_frame_start_scan_int_flag_clear BIT(3) +#define INTR2_log_int_flag_clear BIT(4) +#define INTR2_d2t_crc_err_int_flag_clear BIT(8) +#define INTR2_d2t_flash_req_int_flag_clear BIT(9) +#define INTR2_d2t_ddi_int_flag_clear BIT(10) +#define INTR2_wr_done_int_flag_clear BIT(16) +#define INTR2_rd_done_int_flag_clear BIT(17) +#define INTR2_tdi_err_int_flag_clear BIT(18) +#define INTR2_d2t_slpout_rise_flag_clear BIT(24) +#define INTR2_d2t_slpout_fall_flag_clear BIT(25) +#define INTR2_d2t_dstby_flag_clear BIT(26) +#define INTR2_ddi_pwr_rdy_flag_clear BIT(27) + +#define INTR32_ADDR (INTR_BASED_ADDR + 0x80) +#define INTR32_reg_ice_sw_int_en INTR32_ADDR +#define INTR32_reg_ice_apb_conflict_int_en BIT(1) +#define INTR32_reg_ice_ilm_conflict_int_en BIT(2) +#define INTR32_reg_ice_dlm_conflict_int_en BIT(3) +#define INTR32_reserved_0 (BIT(4)|BIT(5)|BIT(6)|BIT(7)) +#define INTR32_reg_spi_sr_int_en BIT(8) +#define INTR32_reg_spi_sp_int_en BIT(9) +#define INTR32_reg_spi_trx_int_en BIT(10) +#define INTR32_reg_spi_cmd_int_en BIT(11) +#define INTR32_reg_spi_rw_int_en BIT(12) +#define INTR32_reserved_1 (BIT(13)|BIT(14)|BIT(15)) +#define INTR32_reg_i2c_start_int_en BIT(16) +#define INTR32_reg_i2c_addr_match_int_en BIT(17) +#define INTR32_reg_i2c_cmd_int_en BIT(18) +#define INTR32_reg_i2c_sr_int_en BIT(19) +#define INTR32_reg_i2c_trx_int_en BIT(20) +#define INTR32_reg_i2c_rx_stop_int_en BIT(21) +#define INTR32_reg_i2c_tx_stop_int_en BIT(22) +#define INTR32_reserved_2 BIT(23) +#define INTR32_reg_t0_int_en BIT(24) +#define INTR32_reg_t1_int_en BIT(25) +#define INTR32_reserved_3 (BIT(26)|BIT(27)|BIT(28)|BIT(29)|BIT(30)|BIT(31)) + +#define INTR33_ADDR (INTR_BASED_ADDR + 0x84) +#define INTR33_reg_uart_tx_int_en INTR33_ADDR +#define INTR33_reserved_0 (BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6)|BIT(7)) +#define INTR33_reg_wdt_alarm_int_en BIT(8) +#define INTR33_reserved_1 (BIT(9)|BIT(10)|BIT(11)|BIT(12)|BIT(13)|BIT(14)|BIT(15)) +#define INTR33_reg_dma_ch1_int_en BIT(16) +#define INTR33_reg_dma_ch0_int_en BIT(17) +#define INTR33_reg_dma_frame_done_int_en BIT(18) +#define INTR33_reg_dma_tdi_done_int_en BIT(19) +#define INTR33_reserved_2 (BIT(20)|BIT(21)|BIT(22)|BIT(23)) +#define INTR33_reg_flash_error_en BIT(24) +#define INTR33_reg_flash_int_en BIT(25) +#define INTR33_reserved_3 (BIT(26)|BIT(27)|BIT(28)|BIT(29)|BIT(30)|BIT(31)) + +/* Flash */ +#define FLASH_BASED_ADDR 0x41000 +#define FLASH0_ADDR (FLASH_BASED_ADDR + 0x0) +#define FLASH0_reg_flash_csb FLASH0_ADDR +#define FLASH0_reserved_0 (BIT(8)|BIT(9)|BIT(10)|BIT(11)|BIT(12)|BIT(13)|BIT(14)|BIT(15)) +#define FLASH0_reg_preclk_sel (BIT(16)|BIT(17)|BIT(18)|BIT(19)|BIT(20)|BIT(21)|BIT(22)|BIT(23)) +#define FLASH0_reg_rx_dual BIT(24) +#define FLASH0_reg_tx_dual BIT(25) +#define FLASH0_reserved_26 (BIT(26)|BIT(27)|BIT(28)|BIT(29)|BIT(30)|BIT(31)) +#define FLASH0_dual_mode (FLASH0_ADDR + 0x3) +#define FLASH1_ADDR (FLASH_BASED_ADDR + 0x4) +#define FLASH1_reg_flash_key1 FLASH1_ADDR +#define FLASH1_reg_flash_key2 (FLASH1_ADDR + 0x01) +#define FLASH1_reg_flash_key3 (FLASH1_ADDR + 0x02) +#define FLASH1_reserved_0 (FLASH1_ADDR + 0x03) +#define FLASH2_ADDR (FLASH_BASED_ADDR + 0x8) +#define FLASH2_reg_tx_data FLASH2_ADDR +#define FLASH3_ADDR (FLASH_BASED_ADDR + 0xC) +#define FLASH3_reg_rcv_cnt FLASH3_ADDR +#define FLASH4_ADDR (FLASH_BASED_ADDR + 0x10) +#define FLASH4_reg_rcv_data FLASH4_ADDR +#define FLASH4_reg_rcv_dly BIT(8) +#define FLASH4_reg_sutrg_en BIT(9) +#define FLASH4_reserved_1 (BIT(10)|BIT(11)|BIT(12)|BIT(13)|BIT(14)|BIT(15)) +#define FLASH4_reg_rcv_data_valid_state BIT(16) +#define FLASH4_reg_flash_rd_finish_state BIT(17) +#define FLASH4_reserved_2 (BIT(18)|BIT(19)|BIT(20)|BIT(21)|BIT(22)|BIT(23)) +#define FLASH4_reg_flash_dma_trigger_en (BIT(24)|BIT(25)|BIT(26)|BIT(27)|BIT(28)|BIT(29)|BIT(30)|BIT(31)) + +/* Dummy Registers */ +#define WDT_DUMMY_BASED_ADDR 0x5101C +#define WDT7_DUMMY0 WDT_DUMMY_BASED_ADDR +#define WDT8_DUMMY1 (WDT_DUMMY_BASED_ADDR + 0x04) +#define WDT9_DUMMY2 (WDT_DUMMY_BASED_ADDR + 0x08) + +/* Cascade Register */ +#define QUAL_MODE_REG 0x62020 +#define MS_MISO_SEL_REG 0x62021 +#define SINGLE_TO_QUAL_REG 0x6202C +#define READ_BACK_LOCK_REG 0x6202D +#define SLAVE_READ_BACK_WORD_REG 0x62030 +#define MSPI_REG 0x62084 +#define ENABLE_CASCADE_ADDR 0x71062 +#define MSPI_TRIG_BY_DMA_ADDR 0x62070 +#define MSPI_TRIGGER_ADDR 0x62085 +#define MSPI_CLOCK_ADDR 0x62086 +#define MSPI_CS_ADDR 0x62087 +#define MSPI_INIT_EN_ADDR 0x480C4 +#define DMA_ONE_GROUP_ADDR 0x72318 +#define DMA_ONE_CLEAR_ADDR 0x72103 +#define SRC_ONE_ADDR 0x72104 +#define SRC_ONE_SET_ADDR 0x72108 +#define SRC_TWO_EN_ADDR 0x72113 +#define DEST_ADDR 0x72114 +#define DEST_SET_ADDR 0x72118 +#define TRIG_SEL_MSPI_ADDR 0x72102 +#define TRANSFER_CNT_ADDR 0x7211C +#define WRITE_BUF_SIZE_ADDR 0x62080 +#define READ_BUF_SIZE_ADDR 0x62082 +#define WRITE_BUF_ADDR 0x6205C +#define MSPI_DONE_FLAG_ADDR 0x48028 +#define CONTROL_SLAVE_EXIT_ICE_ADDR 0x181062 +#define WDT_ADDR 0x4004D +#define DMA_CRC_ADDR 0x04101C + +/* The example for the gesture virtual keys */ +#define GESTURE_DOUBLECLICK 0x58 +#define GESTURE_SINGLECLICK 0x57 +#define GESTURE_UP 0x60 +#define GESTURE_DOWN 0x61 +#define GESTURE_LEFT 0x62 +#define GESTURE_RIGHT 0x63 +#define GESTURE_M 0x64 +#define GESTURE_W 0x65 +#define GESTURE_C 0x66 +#define GESTURE_E 0x67 +#define GESTURE_V 0x68 +#define GESTURE_O 0x69 +#define GESTURE_S 0x6A +#define GESTURE_Z 0x6B +#define KEY_GESTURE_POWER KEY_POWER +#define KEY_GESTURE_UP KEY_UP +#define KEY_GESTURE_DOWN KEY_DOWN +#define KEY_GESTURE_LEFT KEY_LEFT +#define KEY_GESTURE_RIGHT KEY_RIGHT +#define KEY_GESTURE_O KEY_O +#define KEY_GESTURE_E KEY_E +#define KEY_GESTURE_M KEY_M +#define KEY_GESTURE_W KEY_W +#define KEY_GESTURE_S KEY_S +#define KEY_GESTURE_V KEY_V +#define KEY_GESTURE_C KEY_C +#define KEY_GESTURE_Z KEY_Z +#define KEY_GESTURE_F KEY_F +#define GESTURE_V_DOWN 0x6C +#define GESTURE_V_LEFT 0x6D +#define GESTURE_V_RIGHT 0x6E +#define GESTURE_TWOLINE_DOWN 0x6F +#define GESTURE_F 0x70 +#define GESTURE_AT 0x71 +#define ESD_GESTURE_PWD 0xF38A94EF +#define SPI_ESD_GESTURE_RUN 0xA67C9DFE +#define I2C_ESD_GESTURE_RUN 0xA67C9DFE +#define SPI_ESD_GESTURE_PWD_ADDR 0x25FF8 +#define I2C_ESD_GESTURE_PWD_ADDR 0x40054 + +#define ESD_GESTURE_CORE146_PWD 0xF38A +#define SPI_ESD_GESTURE_CORE146_RUN 0x5B92 +#define I2C_ESD_GESTURE_CORE146_RUN 0xA67C +#define SPI_ESD_GESTURE_CORE146_PWD_ADDR 0x4005C +#define I2C_ESD_GESTURE_CORE146_PWD_ADDR 0x4005C + +#define DOUBLE_TAP (ON)/* BIT0 */ +#define ALPHABET_LINE_2_TOP (ON)/* BIT1 */ +#define ALPHABET_LINE_2_BOTTOM (ON)/* BIT2 */ +#define ALPHABET_LINE_2_LEFT (ON)/* BIT3 */ +#define ALPHABET_LINE_2_RIGHT (ON)/* BIT4 */ +#define ALPHABET_M (ON)/* BIT5 */ +#define ALPHABET_W (ON)/* BIT6 */ +#define ALPHABET_C (ON)/* BIT7 */ +#define ALPHABET_E (ON)/* BIT8 */ +#define ALPHABET_V (ON)/* BIT9 */ +#define ALPHABET_O (ON)/* BIT10 */ +#define ALPHABET_S (ON)/* BIT11 */ +#define ALPHABET_Z (ON)/* BIT12 */ +#define ALPHABET_V_DOWN (ON)/* BIT13 */ +#define ALPHABET_V_LEFT (ON)/* BIT14 */ +#define ALPHABET_V_RIGHT (ON)/* BIT15 */ +#define ALPHABET_TWO_LINE_2_BOTTOM (ON)/* BIT16 */ +#define ALPHABET_F (ON)/* BIT17 */ +#define ALPHABET_AT (ON)/* BIT18 */ +#define SINGLE_TAP (ON)/* BIT19 */ + +/* FW data format */ +#define DATA_FORMAT_DEMO_CMD 0x00 +#define DATA_FORMAT_DEBUG_CMD 0x02 +#define DATA_FORMAT_DEMO_DEBUG_INFO_CMD 0x04 +#define DATA_FORMAT_GESTURE_NORMAL_CMD 0x01 +#define DATA_FORMAT_GESTURE_INFO_CMD 0x02 +#define DATA_FORMAT_DEBUG_LITE_CMD 0x05 +#define DATA_FORMAT_DEBUG_LITE_ROI_CMD 0x01 +#define DATA_FORMAT_DEBUG_LITE_WINDOW_CMD 0x02 +#define DATA_FORMAT_DEBUG_LITE_AREA_CMD 0x03 +#define DATA_FORMAT_DEBUG_LITE_PEN_CMD 0x04 + +/* Pen data format */ +#define DATA_FORMAT_DEBUG_PEN_CMD 0x06 +#define DATA_FORMAT_DEBUG_HAND_CMD 0x07 + +#define P5_X_DEMO_MODE_PACKET_INFO_LEN 3 +#define P5_X_DEMO_MODE_PACKET_LEN 43 +#define P5_X_DEMO_MODE_PACKET_LEN_HIGH_RESOLUTION 72 +#define P5_X_DEMO_LOW_RESOLUTION_FINGER_DATA_LENGTH 44 +#define P5_X_DEMO_HIGH_RESOLUTION_FINGER_DATA_LENGTH 54 +#define P5_X_DEMO_MODE_AXIS_LEN 50 +#define P5_X_DEMO_MODE_STATE_INFO 16 +#define P5_X_INFO_HEADER_LENGTH 3 +#define P5_X_P_SENSOR_KEY_LENGTH 1 +#define P5_X_INFO_CHECKSUM_LENGTH 1 +#define P5_X_DEMO_DEBUG_INFO_ID0_LENGTH 14 +#define P5_X_DEBUG_MODE_PACKET_LENGTH 1280 +#define P5_X_TEST_MODE_PACKET_LENGTH 1180 +#define P5_X_GESTURE_NORMAL_LENGTH 8 +#define P5_X_GESTURE_INFO_LENGTH 170 +#define P5_X_GESTURE_INFO_LENGTH_HIGH_RESOLUTION 221 +#if (TDDI_INTERFACE == BUS_SPI) +#define P5_X_DEBUG_LITE_LENGTH 4093 +#else +#define P5_X_DEBUG_LITE_LENGTH 300 +#endif +#define P5_X_DEBUG_LITE_PEN_LENGTH 136 +#define P5_X_CORE_VER_THREE_LENGTH 5 +#define P5_X_CORE_VER_FOUR_LENGTH 6 +#define P5_X_EDGE_PALM_PARA_LENGTH 31 +#define P5_X_DEBUG_LOW_RESOLUTION_FINGER_DATA_LENGTH 35 +#define P5_X_DEBUG_HIGH_RESOLUTION_FINGER_DATA_LENGTH 45 +#define P5_X_5B_LOW_RESOLUTION_LENGTH 62 +#define P5_X_CUSTOMER_LENGTH 50 +#define P5_X_DEBUG_MODE_PACKET_INFO_LEN 4 + +/* Pen data info len */ +#define P5_X_ID_TYPE_LEN 5 +#define P5_X_PEN_INFO_X_DATA_LEN 6 +#define P5_X_PEN_INFO_Y_DATA_LEN 4 +#define P5_X_PEN_DATA_LEN 24 +#define P5_X_OTHER_DATA_LEN 16 +#define P5_X_PEN_ID_LEN 8 +#define P5_X_HAND_PEN_TYPE_PACKET_LEN 96 +#define P5_X_NEW_DEBUG_FORMAT_X_LEN 50 +#define P5_X_NEW_DEBUG_FORMAT_Y_LEN 50 +#define TOUCH_TILT_OFFSET 10 +#define TOUCH_PRESS_OFFSET 12 +#define PEN_ID_OFFSET 14 + +/* Pen Report mode */ +#define ONLY_REPORT_HAND 2 +#define ONLY_REPORT_PEN 1 +#define REPORT_HAND_PEN 0 +#define RELEASE_PEN 0 +#define PEN_CONTACT 1 + +/* Protocol */ +#define PROTOCOL_VER_500 0x050000 +#define PROTOCOL_VER_510 0x050100 +#define PROTOCOL_VER_520 0x050200 +#define PROTOCOL_VER_530 0x050300 +#define PROTOCOL_VER_540 0x050400 +#define PROTOCOL_VER_550 0x050500 +#define PROTOCOL_VER_560 0x050600 +#define PROTOCOL_VER_570 0x050700 +#define P5_X_READ_DATA_CTRL 0xF6 +#define P5_X_GET_TP_INFORMATION 0x20 +#define P5_X_GET_KEY_INFORMATION 0x27 +#define P5_X_GET_TOOL_VERSION 0x28 +#define P5_X_GET_PANEL_INFORMATION 0x29 +#define P5_X_GET_FW_VERSION 0x21 +#define P5_X_GET_PROTOCOL_VERSION 0x22 +#define P5_X_GET_CORE_VERSION 0x23 +#define P5_X_GET_CORE_VERSION_NEW 0x24 +#define P5_X_GET_COMPRESS_INFORMATION 0x2B +#define P5_X_GET_ALL_INFORMATION 0x2F +#define P5_X_GET_REPORT_FORMAT 0x37 +#define P5_X_MODE_CONTROL 0xF0 +#define P5_X_NEW_CONTROL_FORMAT 0xF2 +#define P5_X_SET_CDC_INIT 0xF1 +#define P5_X_GET_CDC_DATA 0xF2 +#define P5_X_CDC_BUSY_STATE 0xF3 +#define P5_X_MP_TEST_MODE_INFO 0xFE +#define P5_X_I2C_UART 0x40 +#define CMD_GET_FLASH_DATA 0x41 +#define CMD_CTRL_INT_ACTION 0x1B +#define P5_X_FW_UNKNOWN_MODE 0xFF +#define P5_X_FW_AP_MODE 0x00 +#define P5_X_FW_TEST_MODE 0x01 +#define P5_X_FW_GESTURE_MODE 0x0F +#define P5_X_FW_SIGNAL_DATA_MODE 0x03 +#define P5_X_FW_RAW_DATA_MODE 0x08 +#define P5_X_DEMO_PACKET_ID 0x5A +#define P5_X_DEMO_AXIS_PACKET_ID 0x5B +#define P5_X_DEBUG_PACKET_ID 0xA7 +#define P5_X_DEBUG_AXIS_PACKET_ID 0xA8 +#define P5_X_TEST_PACKET_ID 0xF2 +#define P5_X_GESTURE_PACKET_ID 0xAA +#define P5_X_GESTURE_FAIL_ID 0xAE +#define P5_X_I2CUART_PACKET_ID 0x7A +#define P5_X_DEBUG_LITE_PACKET_ID 0x9A +#define P5_X_SLAVE_MODE_CMD_ID 0x5F +#define P5_X_INFO_HEADER_PACKET_ID 0xB7 +#define P5_X_DEMO_DEBUG_INFO_PACKET_ID 0x5C +#define P5_X_EDGE_PLAM_CTRL_1 0x01 +#define P5_X_EDGE_PLAM_CTRL_2 0x12 +#define P5_X_EDGE_PALM_TUNING_PARA 0x1E +#define SPI_WRITE 0x82 +#define SPI_READ 0x83 +#define SPI_ACK 0xA3 +#define P5_X_DEMO_PROXIMITY_ID 0xBC +#define P5_X_DEMO_HIGH_RESOLUTION_PACKET_ID 0x5B +#define P5_X_DEBUG_HIGH_RESOLUTION_PACKET_ID 0xA8 + +/*Pen & Cascade info cmd*/ +#define P5_X_GET_PEN_INFO 0x27 +#define P5_X_GET_CASCADE_INFO 0x2A + +/* Pen Type */ +#define P5_X_HAND_PEN_TYPE 0 /* 0x39, FigType 0-2 bits, CustomType 3-5, PenType 6-7 */ +#define P5_X_ONLY_PEN_TYPE 1 /* 0x3F */ +#define P5_X_ONLY_HAND_TYPE 2 /* 0xF9 */ + +/* Chips */ +#define ILI2882_CHIP 0x2882 +#define ILI9881_CHIP 0x9881 +#define ILI7807_CHIP 0x7807 +#define ILI9881N_AA 0x98811700 +#define ILI9881O_AA 0x98811800 +#define ILI7807Q_AA 0x78071A00 +#define ILI9881N_AA 0x98811700 +#define ILI9882_CHIP 0x9882 +#define ILI9883_CHIP 0x9883 +#define TDDI_PID_ADDR 0x4009C +#define TDDI_OTP_ID_ADDR 0x400A0 +#define TDDI_ANA_ID_ADDR 0x400A4 +#define TDDI_PC_COUNTER_ADDR 0x44008 +#define TDDI_PC_LATCH_ADDR 0x51010 +#define TDDI_CHIP_RESET_ADDR 0x40050 +#define RAWDATA_NO_BK_SHIFT 8192 +#define TDDI_WHOLE_CHIP_RST_WITH_FLASH_KEY 0x00019878 +#define TDDI_WHOLE_CHIP_RST_WITHOUT_FLASH_KEY 0xA0019878 +#define TDDI_WHOLE_CHIP_RST_WITHOUT_FLASH_PRE_KEY 0xA0009878 + +/* Edge Palm */ +#define ZONE_A_W 6 +#define ZONE_B_W 32 +#define ZONE_A_ROTATION_W 6 +#define ZONE_B_ROTATION_W 32 +#define ZONE_C_WIDTH 80 +#define ZONE_C_HEIGHT 320 +#define ZONE_C_HEIGHT_LITTLE 100 + +/* DDI */ +#define PAGE00_CMD10_SLEEPIN 0x10 +#define PAGE00_CMD11_SLEEPOUT 0x11 +#define PAGE00_CMD28_DISPLAYOFF 0x28 +#define PAGE00_CMD29_DISPLAYON 0x29 + +/* Report Format Resolution */ +#define POSITION_LOW_RESOLUTION 0X00 +#define POSITION_HIGH_RESOLUTION 0x01 +#define POSITION_CUSTOMER_TYPE_ON 0x00 +#define POSITION_CUSTOMER_TYPE_OFF 0x1F +#define POSITION_PEN_TYPE_ON 0x00 +#define POSITION_PEN_TYPE_OFF 0x03 +#define POSITION_CUSTOMER_TYPE_OFF_3BITS 0x07 /*core ver 1700, CustomerType 3 bits*/ + +#define SRAM_TEST_GROUP_LEN 16 +#define SRAM_TEST_GROUP_STR_LEN 64 + +#ifdef ILI_SENSOR_EN +enum touch_panel_id { + TOUCH_PANEL_IDX_PRIMARY = 0, + TOUCH_PANEL_MAX_IDX, +}; + +enum touch_state { + TOUCH_DEEP_SLEEP_STATE = 0, + TOUCH_LOW_POWER_STATE, +}; +struct ili_sensor_platform_data { + struct input_dev *input_sensor_dev; + struct sensors_classdev ps_cdev; + int sensor_opened; + char sensor_data; /* 0 near, 1 far */ + struct ilitek_ts_data *data; +}; +#define REPORT_MAX_COUNT 10000 +#endif + +struct sram_test_para { + /* ini param */ + bool tpu_clock_en; + bool sram_group_en; + bool check_failbus; + u8 group_num; + u32 MaxAddr; + u32 MinAddr; + u32 write_addr; + u32 read_addr; + u32 SramPartialAreaTest_en[SRAM_TEST_GROUP_LEN]; + u32 SramResult[SRAM_TEST_GROUP_LEN]; + char strSramPartialArea[SRAM_TEST_GROUP_LEN][SRAM_TEST_GROUP_STR_LEN]; +}; + +struct ilitek_ts_data { + struct i2c_client *i2c; + struct spi_device *spi; + struct input_dev *input; + struct input_dev *input_pen; + struct device *dev; + struct wakeup_source *ws; + + struct ilitek_hwif_info *hwif; + struct ilitek_ic_info *chip; + struct ilitek_protocol_info *protocol; + struct gesture_coordinate *gcoord; + struct regulator *vdd; + struct regulator *vcc; + struct sram_test_para sram_para; + +#if IS_ENABLED(CONFIG_DRM_MEDIATEK) + struct notifier_block disp_notifier; +#endif +#if defined(CONFIG_FB) || defined(CONFIG_DRM) + struct notifier_block notifier_fb; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif +#if CHARGER_NOTIFIER_CALLBACK +#if KERNEL_VERSION(4, 1, 0) <= LINUX_VERSION_CODE +/* add_for_charger_start */ + struct notifier_block notifier_charger; + struct workqueue_struct *charger_notify_wq; + struct work_struct update_charger; + int usb_plug_status; +/* add_for_charger_end */ +#endif +#endif +#ifdef ROI + struct ts_kit_device_data *ts_dev_data; +#endif + struct mutex touch_mutex; + struct mutex debug_mutex; + struct mutex debug_read_mutex; + spinlock_t irq_spin; + + struct completion pm_completion; + bool pm_suspend; + + /* physical path to the input device in the system hierarchy */ + const char *phys; + + bool boot; + u32 fw_pc; + u32 fw_latch; + + u16 max_x; + u16 max_y; + u16 min_x; + u16 min_y; + u16 panel_wid; + u16 panel_hei; + u8 xch_num; + u8 ych_num; + u8 stx; + u8 srx; + u8 *update_buf; + u8 *tr_buf; + u8 *spi_tx; + u8 *spi_rx; +#ifdef ROI + u8 knuckle_roi_data[ROI_DATA_READ_LENGTH]; +#endif + struct firmware tp_fw; + + int actual_tp_mode; + int tp_data_mode; + int tp_data_format; + int tp_data_len; + + int irq_num; + int irq_gpio; + int irq_tirgger_type; + int tp_rst; + int tp_int; + int wait_int_timeout; + + int finger; + u8 customertype_off; + u32 cdc_data_len; + u8 gesture_data_type; + bool compress_disable; + bool compress_handonly_disable; + bool compress_penonly_disable; + + /* pen report */ + u8 PenType; + int pen; + struct pen_info_block pen_info_block; + struct ilitek_pen_info pen_info; + int curt_touch[MAX_TOUCH_NUM + MAX_PEN_NUM]; + int prev_touch[MAX_TOUCH_NUM + MAX_PEN_NUM]; + u8 touch_num; + + int last_touch; + int fw_retry; + int fw_update_stat; + int fw_open; + u8 fw_info[75]; + u8 fw_mp_ver[4]; + u8 edge_palm_para[P5_X_EDGE_PALM_PARA_LENGTH]; + bool wq_ctrl; + bool wq_esd_ctrl; + bool wq_bat_ctrl; + bool esd_func_ctrl; + + /* Cascade */ + struct cascade_info_block cascade_info_block; + bool mspi_en; + bool slave_wr_ctrl; + bool enable_cascade; + bool mspi_done; + bool i2c_addr_change; + int cascade_rst_edge_delay; + u8 cascade_ctrl_mode; + + u16 addr_value; + + bool report; + bool gesture; + bool mp_retry; + bool knuckle; + int gesture_mode; + int gesture_demo_ctrl; + struct gesture_symbol ges_sym; + struct report_info_block rib; + +#if CHARGER_NOTIFIER_CALLBACK + const char *psy_name; +#endif + + u16 flash_mid; + u16 flash_devid; + u8 current_report_rate_mode; + int program_page; + int flash_sector; + + /* Sending report data to users for the debug */ + bool dnp; /* debug node open */ + int dbf; /* debug data frame */ + int odi; /* out data index */ + bool all_frame_full; /* all debug data frame is full */ + wait_queue_head_t inq; + struct debug_buf_list *dbl; + int raw_count; + int delta_count; + int bg_count; + + /* ping pong buffer */ + bool dlnp; /* debug all node open */ + bool ppb; + struct debug_buf_list *dbf_a; + struct debug_buf_list *dbf_b; + struct debug_buf_list *dbf_out; + struct debug_buf_list *dbf_in; + int dbf_in_idx; + int dbf_out_idx; + + int reset; + int rst_edge_delay; + int fw_upgrade_mode; + int mp_ret_len; + bool wtd_ctrl; + bool force_fw_update; + bool irq_after_recovery; + bool ddi_rest_done; + bool resume_by_ddi; + bool tp_suspend; + bool info_from_hex; + bool prox_near; + bool gesture_load_code; + bool trans_xy; + bool ss_ctrl; + bool node_update; + bool int_pulse; + bool pll_clk_wakeup; + bool power_status; + bool proxmity_face; + bool eng_flow; + bool ice_flash_cs_ctrl; + bool prox_face_gesture; + u8 prox_face_mode; + /* module info */ + int tp_module; + int md_fw_ili_size; + char *md_name; + char *md_fw_filp_path; + char *md_fw_rq_path; + char *md_ini_path; + char *md_ini_rq_path; + char *outputStrArr; + u8 *md_fw_ili; + char *mp_result; + + atomic_t irq_stat; + atomic_t tp_reset; + atomic_t ice_stat; + atomic_t fw_stat; + atomic_t mp_stat; + atomic_t tp_sleep; + atomic_t tp_sw_mode; + atomic_t cmd_int_check; + atomic_t esd_stat; + +#ifdef ILI_SENSOR_EN + bool wakeable; + bool should_enable_gesture; + bool gesture_enabled; + uint32_t report_gesture_key; +#ifdef ILI_DOUBLE_TAP_CTRL + uint8_t supported_gesture_type; + uint8_t sys_gesture_type; +#endif + struct mutex state_mutex; + struct ili_sensor_platform_data *sensor_pdata; +#ifdef CONFIG_HAS_WAKELOCK + struct wake_lock gesture_wakelock; +#else + struct wakeup_source *gesture_wakelock; +#endif +#endif //ILI_SENSOR_EN + + atomic_t ignore_report; + atomic_t sync_stat; + atomic_t slave_ice_stat; + + /* Event for driver test */ + struct completion esd_done; + + int (*spi_write_then_read)(struct spi_device *spi, const void *txbuf, + unsigned n_tx, void *rxbuf, unsigned n_rx); + int (*wrapper)(u8 *wdata, u32 wlen, u8 *rdata, u32 rlen, bool spi_irq, bool i2c_irq); + int (*mp_move_code)(void); + int (*gesture_move_code)(int mode); + int (*esd_recover)(void); + int (*ges_recover)(void); + void (*demo_debug_info[5])(u8 *, size_t); + int (*detect_int_stat)(bool status); +#ifdef ILI_TOUCH_LAST_TIME + ktime_t last_event_time; +#endif +}; +extern struct ilitek_ts_data *ilits; + +struct debug_buf_list { + bool mark; + unsigned char *data; +}; + +struct ilitek_touch_info { + u16 id; + u16 x; + u16 y; + u16 pressure; +}; + +struct ilitek_axis_info { + s8 degree; + u16 width_major; + u16 width_minor; +}; + +struct ilitek_dma_config { + u32 src_addr; + u32 src_fmt; + u32 dest_addr; + u32 dest_fmt; + u32 block_size; +}; + +struct gesture_coordinate { + u16 code; + u8 clockwise; + int type; + struct ilitek_touch_info pos_start; + struct ilitek_touch_info pos_end; + struct ilitek_touch_info pos_1st; + struct ilitek_touch_info pos_2nd; + struct ilitek_touch_info pos_3rd; + struct ilitek_touch_info pos_4th; +}; + +struct ilitek_protocol_info { + u32 ver; + int fw_ver_len; + int pro_ver_len; + int tp_info_len; + int key_info_len; + int panel_info_len; + int core_ver_len; + int func_ctrl_len; + int window_len; + int cdc_len; + int mp_info_len; +}; + +#define FUNC_CTRL_NUM 17 +#define FUNC_CTRL_PROXIMITY_IDX 5 +struct ilitek_ic_func_ctrl { + const char *name; + u8 cmd[6]; + int len; + u8 def_cmd; + u8 rec_state; /* 0:disable, 1: enable, 2: ignore record */ + u8 rec_cmd; +}; +extern struct ilitek_ic_func_ctrl func_ctrl[FUNC_CTRL_NUM]; + +struct ilitek_ic_info { + u8 type; + u8 ver; + u16 id; + u8 slave_ver; + u16 slave_id; + u32 slave_pid; + u32 pid; + u32 pid_addr; + u32 product_id; + u32 pc_counter_addr; + u32 pc_latch_addr; + u32 reset_addr; + u32 otp_addr; + u32 ana_addr; + u32 otp_id; + u32 ana_id; + u32 fw_ver; + u32 core_ver; + u32 fw_mp_ver; + u32 max_count; + u32 reset_key; + u16 wtd_key; + int no_bk_shift; + bool dma_reset; + int (*dma_crc)(u32 start_addr, u32 block_size); +}; + +struct ilitek_hwif_info { + u8 bus_type; + u8 plat_type; + const char *name; + struct module *owner; + const struct of_device_id *of_match_table; + const struct dev_pm_ops *pm; + int (*plat_probe)(void); + int (*plat_remove)(void); + void *info; +}; + +/* Prototypes for tddi firmware/flash functions */ +extern void ili_flash_dma_write(u32 start, u32 end, u32 len); +extern void ili_flash_clear_dma(void); +extern void ili_fw_read_flash_info(bool mcu); +extern void ilitek_tddi_flash_protect(bool enable, bool mcu); +extern int ili_fw_read_hw_crc(u32 start, u32 end, u32 *flash_crc); +extern int ili_fw_read_flash(u32 start, u32 end, u8 *data, int len); +extern int ili_fw_dump_iram_data(u32 start, u32 end, bool save, bool mcu); +extern int ili_fw_dump_flash_data(u32 start, u32 end, bool user, bool mcu); +extern int ili_fw_upgrade(int op); + +/* Prototypes for tddi mp test */ +extern int ili_mp_test_main(char *apk, bool lcm_on); + +/* Prototypes for tddi core functions */ +extern int ili_touch_esd_gesture_flash(void); +extern int ili_touch_esd_gesture_iram(void); +extern void ili_set_gesture_symbol(void); +extern int ili_move_gesture_code_flash(int mode); +extern int ili_move_gesture_code_iram(int mode); +extern int ili_move_mp_code_flash(void); +extern int ili_move_mp_code_iram(void); +extern void ili_touch_press(u16 x, u16 y, u16 pressure, u16 id); +extern void ili_touch_release(u16 x, u16 y, u16 id); +extern void ili_touch_release_all_point(void); +extern void ili_report_ap_mode(u8 *buf, int len); +extern void ili_pen_release(void); +extern void ili_pen_demo_mode_report_point(u8 *buf, int len); +extern void ili_report_pen_ap_mode(u8 *buf, int len); +extern void ili_report_pen_debug_mode(u8 *buf, int len); +extern void ili_report_debug_mode(u8 *buf, int rlen); +extern void ili_pen_debug_mode_report_point(u8 *buf, int len, u8 offset); +extern void ili_report_debug_lite_mode(u8 *buf, int rlen); +extern void ili_report_gesture_mode(u8 *buf, int rlen); +extern void ili_report_proximity_mode(u8 *buf, int len); +extern void ili_report_i2cuart_mode(u8 *buf, int rlen); +extern void ili_ic_set_ddi_reg_onepage(u8 page, u8 reg, u8 data, bool mcu); +extern void ili_ic_get_ddi_reg_onepage(u8 page, u8 reg, u8 *data, bool mcu); +extern void ili_ic_set_cascade_ddi_reg_onepage(u8 page, u8 reg, u8 data, bool mcu); +extern void ili_ic_get_cascade_ddi_reg_onepage(u8 page, u8 reg, u8 *data, bool mcu); +extern int ili_ic_whole_reset(bool mcu, bool withflash); +extern int ili_ic_code_reset(bool mcu); +extern int ili_ic_func_ctrl(const char *name, int ctrl); +extern int ili_ic_func_ctrl_export(const char *name, int ctrl); +extern void ili_ic_func_ctrl_reset(void); +extern void ili_ic_edge_palm_para_init(void); +extern void ili_ic_send_edge_palm_para(void); +extern int ili_ic_int_trigger_ctrl(bool pulse); +extern void ili_ic_get_pc_counter(int stat); +extern int ili_ic_check_int_level(bool level); +extern int ili_ic_check_int_pulse(bool pulse); +extern int ili_ic_check_busy(int count, int delay, bool irq); +extern int ili_ic_get_project_id(u8 *pdata, int size); +extern int ili_ic_get_panel_info(void); +extern int ili_ic_get_tp_info(void); +extern int ili_ic_get_core_ver(void); +extern int ili_ic_get_protocl_ver(void); +extern int ili_ic_get_fw_ver(void); +extern int ili_ic_get_info(void); +extern int ili_ic_get_all_info(void); +extern void ili_ic_get_compress_info(void); +extern int ili_set_bypass_mode(bool mcu); +extern int ili_cascade_ic_get_info(bool enter_ice, bool exit_ice); +extern void ili_mspi_set_slave_to_qual_mode(void); +extern int ili_mspi_write_slave_register(u32 addr, u32 data, int len); +extern void ili_mspi_read_slave_register(u32 addr, u32 *data, int len); +extern void ili_wdt_reset_status( bool enter_ice, bool exit_ice); +extern int ili_cascade_reset_ctrl(int reset_mode, bool enter_ice); +extern int ili_cascade_rw_tp_reg(u32 mcu, u32 type, u32 addr, u32 wdata, u32 wlen, u32 *rdata); +extern int ili_ic_dummy_check(void); +extern int ili_ic_report_rate_set(u8 mode); +extern int ili_ic_report_rate_get(void); +extern int ili_ic_report_rate_register_set(void); +extern int ili_ice_mode_bit_mask_write(u32 addr, u32 mask, u32 value); +extern int ili_ice_mode_write(u32 addr, u32 data, int len); +extern void ili_cascade_sync_ctrl(bool mode); +extern int ili_ice_mode_ctrl_by_mode(bool enable, bool mcu, int mode); +extern int ili_ice_mode_write_by_mode(u32 addr, u32 data, int len, int mode); +extern int ili_ice_mode_read_by_mode(u32 addr, u32 *data, int len, int mode); +extern int ili_ice_mode_read(u32 addr, u32 *data, int len); +extern int ili_ice_mode_ctrl(bool enable, bool mcu); +extern void ili_ic_init(void); +extern void ili_fw_uart_ctrl(u8 ctrl); +extern int ilitek_tddi_mp_ini_parser(const char *path); +extern int ili_parsing_sram_param(void); +extern int ili_tddi_ic_sram_test(void); +#ifdef ROI +extern int ili_read_knuckle_roi_data(void); +extern int ili_config_get_knuckle_roi_status(void); +extern int ili_config_knuckle_roi_ctrl(cmd_types cmd); +#endif +/* Prototypes for tddi events */ +#if RESUME_BY_DDI +extern void ili_resume_by_ddi(void); +#endif +extern int ili_proximity_far(int mode); +extern int ili_proximity_near(int mode); +extern int ili_switch_tp_mode(u8 data); +extern int ili_set_tp_data_len(int format, bool send, u8 *data); +extern int ili_set_pen_data_len(u8 header, u8 ctrl, u8 type); +extern int ili_fw_upgrade_handler(void *data); +extern int ili_wq_esd_i2c_check(void); +extern int ili_wq_esd_spi_check(void); +extern int ili_gesture_recovery(void); +extern void ili_spi_recovery(void); +extern void ili_wq_ctrl(int type, int ctrl); +extern int ili_mp_test_handler(char *apk, bool lcm_on); +extern int ili_report_handler(void); +extern int ili_sleep_handler(int mode); +extern int ili_reset_ctrl(int mode); +extern int ili_tddi_init(void); +extern int ili_dev_init(struct ilitek_hwif_info *hwif); +extern void ili_dev_remove(bool flag); + +/* Prototypes for i2c/spi interface */ +extern int ili_core_spi_setup(int num); +extern int ili_interface_dev_init(struct ilitek_hwif_info *hwif); +extern void ili_interface_dev_exit(struct ilitek_ts_data *ts, bool flag); +extern int ili_spi_write_then_read_split(struct spi_device *spi, + const void *txbuf, unsigned n_tx, + void *rxbuf, unsigned n_rx); +extern int ili_spi_write_then_read_direct(struct spi_device *spi, + const void *txbuf, unsigned n_tx, + void *rxbuf, unsigned n_rx); + +/* Prototypes for platform level */ +extern void ili_plat_regulator_power_on(bool status); +extern void ili_input_register(void); +extern void ili_input_pen_register(void); +extern void ili_irq_disable(void); +extern void ili_irq_enable(void); +extern void ili_tp_reset(void); +extern void ili_irq_unregister(void); +extern int ili_irq_register(int type); +extern void ilitek_plat_charger_init(void); + +/* Prototypes for miscs */ +extern void ili_node_init(void); +extern void ili_dump_data(void *data, int type, int len, int row_len, const char *name); +extern u8 ili_calc_packet_checksum(u8 *packet, int len); +extern int ili_katoi(char *str); +extern int ili_str2hex(char *str); + +extern int ili_mp_read_write(u8 *wdata, u32 wlen, u8 *rdata, u32 rlen); +/* Prototypes for additional functionalities */ +extern void ili_gesture_fail_reason(bool enable); +extern int ili_get_tp_recore_ctrl(int data); +extern int ili_get_tp_recore_data(bool mcu); +extern void ili_demo_debug_info_mode(u8 *buf, size_t rlen); +extern void ili_demo_debug_info_id0(u8 *buf, size_t len); +extern void ili_get_dma1_config(struct ilitek_dma_config *dma); +extern void ili_set_dma1_config(struct ilitek_dma_config *dma); +extern int file_write(struct file_buffer *file, bool new_open); +extern int ili_ic_check_debug_lite_support(int format, bool send, u8 *data); + +#ifdef ILI_SET_TOUCH_STATE +extern int touch_set_state(int state, int panel_idx); +#endif + +#ifdef ILI_DOUBLE_TAP_CTRL +void ili_gesture_state_switch(void); +#endif + +static inline void ipio_kfree(void **mem) +{ + if (*mem != NULL) { + kfree(*mem); + *mem = NULL; + } +} + +static inline void ipio_vfree(void **mem) +{ + if (*mem != NULL) { + vfree(*mem); + *mem = NULL; + } +} + +static inline void *ipio_memcpy(void *dest, const void *src, int n, int dest_size) +{ + if (n > dest_size) + n = dest_size; + + return memcpy(dest, src, n); +} + +static inline int ipio_strcmp(const char *s1, const char *s2) +{ + return (strlen(s1) != strlen(s2)) ? -1 : strncmp(s1, s2, strlen(s1)); +} + +#endif /* __ILI9881X_H */ diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_flash.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_flash.c new file mode 100644 index 000000000000..c9ec5525271d --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_flash.c @@ -0,0 +1,1905 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" + +#define UPDATE_PASS 0 +#define UPDATE_FAIL -1 +#define TIMEOUT_SECTOR 500 +#define TIMEOUT_PAGE 3500 +#define TIMEOUT_PROGRAM 10 +#define TIMEOUT_PROTECT 100 + +static struct touch_fw_data { + u8 block_number; + u32 start_addr; + u32 end_addr; + u32 new_fw_cb; + u32 new_mp_fw_cb; + int delay_after_upgrade; + bool isCRC; + bool isboot; + bool is80k; + int hex_tag; +} tfd; + +static struct flash_block_info { + char *name; + u32 start; + u32 end; + u32 len; + u32 mem_start; + u32 fix_mem_start; + u8 mode; +} fbi[FW_BLOCK_INFO_NUM]; + +static u8 fw_flash_tmp[K + 7]; +static u8 *pfw; +static u8 *CTPM_FW; + +/*sync with tool*/ +struct ilitek_flash_info { + u8 rgisterNum; + u8 readOPCount; + u8 writeOPCount; + u8 protectAllOPCount; + u8 resetOPCount; + u32 flashUID; + u8 readOperator[30]; + u8 writeOperator[30]; + u8 protectAllOperator[30]; + u8 resetOperator[30]; +} flash_protect_list[] = { + [0] = {1,1,1,4,4,0x1C3812,{0x05,1},{0x01,1},{2,0x1,3,0x1,4,0x1,5,0x1},{2,0x0,3,0x0,4,0x0,5,0x0}}, + [1] = {3,2,1,5,6,0xC22810,{0x05,1,0x15,2},{0x01,3},{2,0x1,3,0x1,4,0x1,5,0x1,11,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,11,0x0}}, + [2] = {3,2,1,5,6,0xC22811,{0x05,1,0x15,2},{0x01,3},{2,0x1,3,0x1,4,0x1,5,0x1,11,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,11,0x0}}, + [3] = {3,2,1,5,6,0xC22812,{0x05,1,0x15,2},{0x01,3},{2,0x1,3,0x1,4,0x1,5,0x1,11,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,11,0x0}}, + [4] = {3,2,1,5,6,0xC22813,{0x05,1,0x15,2},{0x01,3},{2,0x1,3,0x1,4,0x1,5,0x1,11,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,11,0x0}}, + [5] = {1,1,1,2,3,0xC22531,{0x05,1},{0x01,1},{2,0x1,3,0x1},{2,0x0,3,0x0,6,0x0}}, + [6] = {2,2,1,5,6,0xC22310,{0x05,1,0x15,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,11,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,11,0x0}}, + [7] = {1,1,1,2,2,0xC22011,{0x05,1},{0x01,1},{2,0x1,3,0x1},{2,0x0,3,0x0}}, + [8] = {2,2,1,6,7,0x856013,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [9] = {2,2,1,6,7,0xC86013,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [10] = {2,2,2,6,7,0xEF6011,{0x05,1,0x35,1},{0x01,1,0x31,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [11] = {2,2,2,6,7,0xEF6012,{0x05,1,0x35,1},{0x01,1,0x31,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [12] = {1,1,1,4,5,0x9D1152,{0x05,1},{0x01,1},{2,0x0,3,0x0,4,0x0,5,0x01},{2,0x0,3,0x00,4,0x0,5,0x00,6,0x00}}, + [13] = {1,1,1,3,3,0xC86012,{0x05,1},{0x01,1},{2,0x1,3,0x01,4,0x1},{2,0x0,3,0x00,4,0x0}}, + [14] = {2,2,1,6,7,0xEF4012,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [15] = {2,2,2,6,9,0xA12813,{0x05,1,0x35,1},{0x01,1,0x31,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,14,0x0,9,0x0,11,0x0,12,0x0}}, + [16] = {2,2,2,6,7,0xEF6013,{0x05,1,0x35,1},{0x01,1,0x31,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [17] = {2,2,1,6,7,0xEB6012,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [18] = {3,3,3,6,7,0xC44012,{0x05,1,0x35,1,0x15,1},{0x01,1,0x31,1,0x11,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [19] = {2,2,1,6,7,0x856012,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [20] = {1,1,1,2,2,0x0B6012,{0x05,1},{0x01,1},{2,0x1,3,0x1},{2,0x0,3,0x0}}, + [21] = {2,2,1,6,7,0x854012,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [22] = {2,2,1,6,7,0x854011,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [23] = {1,1,1,3,3,0x5E1013,{0x05,1},{0x01,1},{2,0x1,3,0x1,4,0x1},{2,0x0,3,0x0,4,0x0}}, + [24] = {1,1,1,3,3,0x5E1012,{0x05,1},{0x01,1},{2,0x1,3,0x1,4,0x1},{2,0x0,3,0x0,4,0x0}}, + [25] = {3,3,3,6,7,0x681012,{0x05,1,0x35,1,0x15,1},{0x01,1,0x31,1,0x11,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [26] = {2,2,1,6,7,0x686013,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [27] = {1,1,1,3,3,0x5E1011,{0x05,1},{0x01,1},{2,0x1,3,0x1,4,0x1},{2,0x0,3,0x0,4,0x0}}, + [28] = {3,3,3,6,7,0xC44013,{0x05,1,0x35,1,0x15,1},{0x01,1,0x31,1,0x11,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [29] = {3,3,3,6,7,0xC44011,{0x05,1,0x35,1,0x15,1},{0x01,1,0x31,1,0x11,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [30] = {3,3,3,6,7,0xC44010,{0x05,1,0x35,1,0x15,1},{0x01,1,0x31,1,0x11,1},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + /* 3.3V flash */ + [31] = {1,1,1,2,2,0xEF3012,{0x05,1},{0x01,1},{2,0x1,3,0x1},{2,0x0,3,0x0}}, + [32] = {2,2,1,6,7,0xC84013,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,5,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,4,0x0,5,0x0,6,0x0,9,0x0,14,0x0}}, + [33] = {2,2,1,5,5,0x114012,{0x05,1,0x35,1},{0x01,2},{2,0x1,3,0x1,4,0x1,6,0x1,14,0x0},{2,0x0,3,0x0,6,0x0,9,0x0,14,0x0}}, +}; + +static u32 HexToDec(char *phex, s32 len) +{ + u32 ret = 0, temp = 0, i; + s32 shift = (len - 1) * 4; + + for (i = 0; i < len; shift -= 4, i++) { + if ((phex[i] >= '0') && (phex[i] <= '9')) + temp = phex[i] - '0'; + else if ((phex[i] >= 'a') && (phex[i] <= 'f')) + temp = (phex[i] - 'a') + 10; + else if ((phex[i] >= 'A') && (phex[i] <= 'F')) + temp = (phex[i] - 'A') + 10; + + ret |= (temp << shift); + } + return ret; +} + +static int CalculateCRC32(u32 start_addr, u32 len, u8 *pfw) +{ + int i = 0, j = 0; + int crc_poly = 0x04C11DB7; + int tmp_crc = 0xFFFFFFFF; + + for (i = start_addr; i < start_addr + len; i++) { + tmp_crc ^= (pfw[i] << 24); + + for (j = 0; j < 8; j++) { + if ((tmp_crc & 0x80000000) != 0) + tmp_crc = tmp_crc << 1 ^ crc_poly; + else + tmp_crc = tmp_crc << 1; + } + } + return tmp_crc; +} + +static int ilitek_tddi_fw_iram_read(u8 *buf, u32 start, int len) +{ + int limit = 4*K; + int addr = 0, loop = 0, tmp_len = len, cnt = 0; + u8 cmd[4] = {0}; + + if (!buf) { + ILI_ERR("buf is null\n"); + return -ENOMEM; + } + + if (len % limit) + loop = (len / limit) + 1; + else + loop = len / limit; + + for (cnt = 0, addr = start; cnt < loop; cnt++, addr += limit) { + tmp_len = len - cnt * limit; + ilits->fw_update_stat = ((len - tmp_len) * 100) / len; + ILI_DBG("Reading iram data .... %d%c", ilits->fw_update_stat, '%'); + + if (tmp_len > limit) + tmp_len = limit; + + cmd[0] = 0x25; + cmd[3] = (char)((addr & 0x00FF0000) >> 16); + cmd[2] = (char)((addr & 0x0000FF00) >> 8); + cmd[1] = (char)((addr & 0x000000FF)); + + if (ilits->wrapper(cmd, 4, NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Failed to write iram data\n"); + return -ENODEV; + } + + if (ilits->wrapper(NULL, 0, buf + cnt * limit, tmp_len, OFF, OFF) < 0) { + ILI_ERR("Failed to Read iram data\n"); + return -ENODEV; + } + + } + return 0; +} + +int ili_fw_dump_iram_data(u32 start, u32 end, bool save, bool mcu) +{ +#if GENERIC_KERNEL_IMAGE + int tmp = debug_en; +#else + struct file *f = NULL; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t old_fs; +#endif + loff_t pos = 0; +#endif + int i, ret, len; + u8 *fw_buf = NULL; + + if (ili_ice_mode_ctrl(ENABLE, mcu) < 0) { + ILI_ERR("Enable ice mode failed\n"); + ret = -1; + goto out; + } + + len = end - start + 1; + + if (len > MAX_HEX_FILE_SIZE) { + ILI_ERR("len is larger than buffer, abort\n"); + ret = -EINVAL; + goto out; + } + + fw_buf = kzalloc(MAX_HEX_FILE_SIZE, GFP_KERNEL); + if (ERR_ALLOC_MEM(fw_buf)) { + ILI_ERR("Failed to allocate update_buf\n"); + ret = -ENOMEM; + goto out; + } + + for (i = 0; i < MAX_HEX_FILE_SIZE; i++) + fw_buf[i] = 0xFF; + + ret = ilitek_tddi_fw_iram_read(fw_buf, start, len); + if (ret < 0) + goto out; + +#if GENERIC_KERNEL_IMAGE + ILI_ERR("GKI version not allow drivers to use filp_open\n"); + ret = -1; + debug_en = DEBUG_ALL; + ili_dump_data(fw_buf, 8, len, 0, "IRAM"); + debug_en = tmp; +#else + f = filp_open(DUMP_IRAM_PATH, O_WRONLY | O_CREAT | O_TRUNC, 644); + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open the file at %ld.\n", PTR_ERR(f)); + ret = -1; + goto out; + } + pos = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + old_fs = get_fs(); + set_fs(KERNEL_DS); + vfs_write(f, fw_buf, len, &pos); + set_fs(old_fs); +#else + kernel_write(f, fw_buf, len, &pos); +#endif + filp_close(f, NULL); + ILI_INFO("Save iram data to %s\n", DUMP_IRAM_PATH); +#endif +out: + ili_ice_mode_ctrl(DISABLE, mcu); + ILI_INFO("Dump IRAM %s\n", (ret < 0) ? "FAIL" : "SUCCESS"); + ipio_kfree((void **)&fw_buf); + return ret; +} + +static int ilitek_tddi_flash_poll_busy(int timer) +{ + int ret = UPDATE_PASS, retry = timer; + u8 cmd = 0x5; + u32 temp = 0; + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0) + ILI_ERR("Pull cs low failed\n"); + + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, cmd, 1) < 0) + ILI_ERR("Write 0x5 cmd failed\n"); + + do { + if (ili_ice_mode_write(FLASH2_ADDR, 0xFF, 1) < 0) + ILI_ERR("Write dummy failed\n"); + + mdelay(1); + + if (ili_ice_mode_read(FLASH4_ADDR, &temp, sizeof(u8)) < 0) + ILI_ERR("Read flash busy error\n"); + + if ((temp & 0x3) == 0) + break; + } while (--retry >= 0); + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Pull cs high failed\n"); + + if (retry <= 0) { + ILI_ERR("Flash polling busy timeout ! tmp = %x\n", temp); + ret = UPDATE_FAIL; + } + + return ret; +} + +void ili_flash_clear_dma(void) +{ + if (ili_ice_mode_bit_mask_write(FLASH0_ADDR, FLASH0_reg_preclk_sel, (2 << 16)) < 0) + ILI_ERR("Write %lu at %x failed\n", FLASH0_reg_preclk_sel, FLASH0_ADDR); + + if (ili_ice_mode_bit_mask_write(FLASH4_ADDR, FLASH4_reg_flash_dma_trigger_en, (0 << 24)) < 0) + ILI_ERR("Write %lu at %x failed\n", FLASH4_reg_flash_dma_trigger_en, FLASH4_ADDR); + + if (ili_ice_mode_bit_mask_write(FLASH0_ADDR, FLASH0_reg_rx_dual, (0 << 24)) < 0) + ILI_ERR("Write %lu at %x failed\n", FLASH0_reg_rx_dual, FLASH0_ADDR); + + if (ili_ice_mode_write(FLASH3_reg_rcv_cnt, 0x00, 1) < 0) + ILI_ERR("Write 0x0 at %x failed\n", FLASH3_reg_rcv_cnt); + + if (ili_ice_mode_write(FLASH4_reg_rcv_data, 0xFF, 1) < 0) + ILI_ERR("Write 0xFF at %x failed\n", FLASH4_reg_rcv_data); +} + +static int ilitek_tddi_flash_read_int_flag(void) +{ + int retry = 100; + u32 data = 0; + + do { + if (ili_ice_mode_read(INTR1_ADDR & BIT(25), &data, sizeof(u32)) < 0) + ILI_ERR("Read flash int flag error\n"); + + ILI_DBG("int flag = %x\n", data); + if (data) + break; + mdelay(2); + } while (--retry >= 0); + + if (retry <= 0) { + ILI_ERR("Read Flash INT flag timeout !, flag = 0x%x\n", data); + return -1; + } + return 0; +} + +void ili_flash_dma_write(u32 start, u32 end, u32 len) +{ + if (ili_ice_mode_bit_mask_write(FLASH0_ADDR, FLASH0_reg_preclk_sel, 1 << 16) < 0) + ILI_ERR("Write %lu at %x failed\n", FLASH0_reg_preclk_sel, FLASH0_ADDR); + + if (ili_ice_mode_write(FLASH0_reg_flash_csb, 0x00, 1) < 0) + ILI_ERR("Pull cs low failed\n"); + + if (ili_ice_mode_write(FLASH1_reg_flash_key1, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_reg_tx_data, 0x0b, 1) < 0) + ILI_ERR("Write 0x0b at %x failed\n", FLASH2_reg_tx_data); + + if (ilitek_tddi_flash_read_int_flag() < 0) { + ILI_ERR("Write 0xb timeout \n"); + return; + } + + if (ili_ice_mode_bit_mask_write(INTR1_ADDR, INTR1_reg_flash_int_flag, (1 << 25)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR1_reg_flash_int_flag, INTR1_ADDR); + + if (ili_ice_mode_write(FLASH2_reg_tx_data, (start & 0xFF0000) >> 16, 1) < 0) + ILI_ERR("Write %x at %x failed\n", (start & 0xFF0000), FLASH2_reg_tx_data); + + if (ilitek_tddi_flash_read_int_flag() < 0) { + ILI_ERR("Write addr1 timeout\n"); + return; + } + + if (ili_ice_mode_bit_mask_write(INTR1_ADDR, INTR1_reg_flash_int_flag, (1 << 25)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR1_reg_flash_int_flag, INTR1_ADDR); + + if (ili_ice_mode_write(FLASH2_reg_tx_data, (start & 0x00FF00) >> 8, 1) < 0) + ILI_ERR("Write %x at %x failed\n", (start & 0x00FF00) >> 8, FLASH2_reg_tx_data); + + if (ilitek_tddi_flash_read_int_flag() < 0) { + ILI_ERR("Write addr2 timeout\n"); + return; + } + + if (ili_ice_mode_bit_mask_write(INTR1_ADDR, INTR1_reg_flash_int_flag, (1 << 25)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR1_reg_flash_int_flag, INTR1_ADDR); + + if (ili_ice_mode_write(FLASH2_reg_tx_data, (start & 0x0000FF), 1) < 0) + ILI_ERR("Write %x at %x failed\n", (start & 0x0000FF), FLASH2_reg_tx_data); + + if (ilitek_tddi_flash_read_int_flag() < 0) { + ILI_ERR("Write addr3 timeout\n"); + return; + } + + if (ili_ice_mode_bit_mask_write(INTR1_ADDR, INTR1_reg_flash_int_flag, (1 << 25)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR1_reg_flash_int_flag, INTR1_ADDR); + + if (ili_ice_mode_bit_mask_write(FLASH0_ADDR, FLASH0_reg_rx_dual, 0 << 24) < 0) + ILI_ERR("Write %lu at %x failed\n", FLASH0_reg_rx_dual, FLASH0_ADDR); + + if (ili_ice_mode_write(FLASH2_reg_tx_data, 0x00, 1) < 0) + ILI_ERR("Write dummy failed\n"); + + if (ilitek_tddi_flash_read_int_flag() < 0) { + ILI_ERR("Write dummy timeout\n"); + return; + } + + if (ili_ice_mode_bit_mask_write(INTR1_ADDR, INTR1_reg_flash_int_flag, (1 << 25)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR1_reg_flash_int_flag, INTR1_ADDR); + + if (ili_ice_mode_write(FLASH3_reg_rcv_cnt, len, 4) < 0) + ILI_ERR("Write length failed\n"); +} + +static void ilitek_tddi_flash_write_enable(void) +{ + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0) + ILI_ERR("Pull CS low failed\n"); + + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, 0x6, 1) < 0) + ILI_ERR("Write Write_En failed\n"); + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Pull CS high failed\n"); +} + +int ili_fw_read_hw_crc(u32 start, u32 end, u32 *flash_crc) +{ + int retry = 100; + u32 busy = 0; + u32 write_len = end; + + if (write_len > ilits->chip->max_count) { + ILI_ERR("The length (%x) written into firmware is greater than max count (%x)\n", + write_len, ilits->chip->max_count); + return -1; + } + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0) + ILI_ERR("Pull CS low failed\n"); + + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, 0x3b, 1) < 0) + ILI_ERR("Write 0x3b failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, (start & 0xFF0000) >> 16, 1) < 0) + ILI_ERR("Write address failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, (start & 0x00FF00) >> 8, 1) < 0) + ILI_ERR("Write address failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, (start & 0x0000FF), 1) < 0) + ILI_ERR("Write address failed\n"); + + if (ili_ice_mode_write(0x041003, 0x01, 1) < 0) + ILI_ERR("Write enable Dio_Rx_dual failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, 0xFF, 1) < 0) + ILI_ERR("Write dummy failed\n"); + + if (ili_ice_mode_write(0x04100C, write_len, 3) < 0) + ILI_ERR("Write Set Receive count failed\n"); + + if (ili_ice_mode_write(0x048007, 0x02, 1) < 0) + ILI_ERR("Write clearing int flag failed\n"); + + if (ili_ice_mode_write(0x041016, 0x00, 1) < 0) + ILI_ERR("Write 0x0 at 0x041016 failed\n"); + + if (ili_ice_mode_write(0x041016, 0x01, 1) < 0) + ILI_ERR("Write Checksum_En failed\n"); + + if (ili_ice_mode_write(FLASH4_ADDR, 0xFF, 1) < 0) + ILI_ERR("Write start to receive failed\n"); + + do { + if (ili_ice_mode_read(0x048007, &busy, sizeof(u8)) < 0) + ILI_ERR("Read busy error\n"); + + ILI_DBG("busy = %x\n", busy); + if (((busy >> 1) & 0x01) == 0x01) + break; + mdelay(2); + } while (--retry >= 0); + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write CS high failed\n"); + + if (retry <= 0) { + ILI_ERR("Read HW CRC timeout !, busy = 0x%x\n", busy); + return -1; + } + + if (ili_ice_mode_write(0x041003, 0x0, 1) < 0) + ILI_ERR("Write disable dio_Rx_dual failed\n"); + + if (ili_ice_mode_read(0x04101C, flash_crc, sizeof(u32)) < 0) { + ILI_ERR("Read hw crc error\n"); + return -1; + } + + return 0; +} + +static int ilitek_tddi_fw_read_flash_data(u32 start, u32 end, u8 *data, int len) +{ + u32 i, j, index = 0; + u32 tmp; + + if (end - start > len) { + ILI_ERR("the length (%d) reading crc is over than len(%d)\n", end - start, len); + return -1; + } + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0) + ILI_ERR("Write cs low failed\n"); + + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, 0x03, 1) < 0) + ILI_ERR("Write 0x3 failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, (start & 0xFF0000) >> 16, 1) < 0) + ILI_ERR("Write address failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, (start & 0x00FF00) >> 8, 1) < 0) + ILI_ERR("Write address failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, (start & 0x0000FF), 1) < 0) + ILI_ERR("Write address failed\n"); + + for (i = start, j = 0; i <= end; i++, j++) { + if (ili_ice_mode_write(FLASH2_ADDR, 0xFF, 1) < 0) + ILI_ERR("Write dummy failed\n"); + + if (ili_ice_mode_read(FLASH4_ADDR, &tmp, sizeof(u8)) < 0) + ILI_ERR("Read flash data error!\n"); + + data[index] = tmp; + index++; + ilits->fw_update_stat = (j * 100) / len; + ILI_DBG("Reading flash data .... %d%c", ilits->fw_update_stat, '%'); + } + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); + + return 0; +} + +int ili_fw_dump_flash_data(u32 start, u32 end, bool user, bool mcu) +{ + u32 start_addr, end_addr; + int ret, length; + u8 *buf = NULL; +#if GENERIC_KERNEL_IMAGE + int tmp = debug_en; +#else + struct file *f = NULL; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t old_fs; +#endif + loff_t pos = 0; + f = filp_open(DUMP_FLASH_PATH, O_WRONLY | O_CREAT | O_TRUNC, 644); + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open the file at %ld.\n", PTR_ERR(f)); + ret = -1; + goto out; + } +#endif + ret = ili_ice_mode_ctrl(ENABLE, mcu); + if (ret < 0) + goto out; + + if (user) { + start_addr = 0x0; + end_addr = 0x1FFFF; + } else { + start_addr = start; + end_addr = end; + } + + length = end_addr - start_addr + 1; + ILI_INFO("len = %d\n", length); + + buf = vmalloc(length * sizeof(u8)); + if (ERR_ALLOC_MEM(buf)) { + ILI_ERR("Failed to allocate buf memory, %ld\n", PTR_ERR(buf)); + ret = -1; + goto out; + } + + ret = ilitek_tddi_fw_read_flash_data(start_addr, end_addr, buf, length); + if (ret < 0) + goto out; + +#if GENERIC_KERNEL_IMAGE + ILI_ERR("GKI version not allow drivers to use filp_open, dump flash data\n"); + debug_en = DEBUG_ALL; + ili_dump_data(buf, 8, length, 0, "flash"); + debug_en = tmp; +#else + pos = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + old_fs = get_fs(); + set_fs(KERNEL_DS); + vfs_write(f, buf, length, &pos); + set_fs(old_fs); +#else + kernel_write(f, buf, length, &pos); +#endif +#endif +out: +#if (!GENERIC_KERNEL_IMAGE) + filp_close(f, NULL); +#endif + ipio_vfree((void **)&buf); + ili_ice_mode_ctrl(DISABLE, mcu); + ILI_INFO("Dump flash %s\n", (ret < 0) ? "FAIL" : "SUCCESS"); + return ret; +} + +void ilitek_tddi_flash_read(u32 *data, u8 cmd, int len) +{ + u32 rxbuf[4] = {0}; + int i = 0; + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0)/* CS Low */ + ILI_ERR("Write cs low failed\n"); + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, cmd, 1) < 0) + ILI_ERR("Write read command failed\n"); + for (i = 0; i < len; i++) { + if (ili_ice_mode_write(FLASH2_ADDR, 0xFF, 1) < 0) + ILI_ERR("Write read command failed\n"); + ili_ice_mode_read(FLASH4_ADDR, data, 1); + rxbuf[i] = *data; + } + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); + + *data = 0; + if (len == 1) + *data = rxbuf[0]; + else if (len == 2) + *data = (rxbuf[0] | rxbuf[1] << 8); + else if (len == 3) + *data = (rxbuf[0] | rxbuf[1] << 8 | rxbuf[2] << 16); + else + *data = (rxbuf[0] | rxbuf[1] << 8 | rxbuf[2] << 16 | rxbuf[3] << 24); + ILI_DBG("flash read data = 0X%X\n", *data); +} + +void ilitek_tddi_flash_write(u8 cmd, u8 *sendbuf,int len) +{ + int i = 0; + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0)/* CS Low */ + ILI_ERR("Write cs low failed\n"); + + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, cmd, 1) < 0) + ILI_ERR("Write read command failed\n"); + + for (i = 0; i < len; i++) { + if (ili_ice_mode_write(FLASH2_ADDR, sendbuf[i], 1) < 0) + ILI_ERR("Write sendbuf failed\n"); + } + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) /* CS high */ + ILI_ERR("Write cs high failed\n"); +} + +void ilitek_tddi_flash_protect(bool enable, bool mcu) +{ + int ret = 0, i = 0, index = 0, w_count = 0; + u32 flash_uid = 0, data = 0, ckreaddata = 0; + u8 bitPosition = 0, setBitValue = 0; + u8 w_buf[4] = { 0 }; + bool isSupportFlash = false; + bool ice = atomic_read(&ilits->ice_stat); + + ILI_INFO("%s flash protection\n", enable ? "Enable" : "Disable"); + + if (!ice) { + if (ilits->cascade_info_block.nNum != 0) + ret = ili_ice_mode_ctrl_by_mode(ENABLE, OFF, BOTH); + else + ret = ili_ice_mode_ctrl(ENABLE, mcu); + + if (ret < 0) + ILI_ERR("Enable ice mode failed\n"); + } + + flash_uid = (ilits->flash_mid << 16) + ilits->flash_devid; + + if (flash_uid == 0x0) { + ILI_ERR("flash_uid error, get flash info again!\n"); + ili_fw_read_flash_info(OFF); + flash_uid = (ilits->flash_mid << 16) + ilits->flash_devid; + } + + for (i = 0; i < ARRAY_SIZE(flash_protect_list); i++) { + if (flash_uid == flash_protect_list[i].flashUID) { + isSupportFlash = true; + index = i; + break; + } + } + + ILI_INFO("flash(0x%X) is %s\n", flash_uid, isSupportFlash ? "supported" : "not supported"); + + if (isSupportFlash) { + + /* read flash data */ + for (i = 0; i < flash_protect_list[index].readOPCount; i++) { + u32 tmp = 0; + u8 cmd = flash_protect_list[index].readOperator[i * 2]; + int readlen = flash_protect_list[index].readOperator[(i * 2) + 1]; + ilitek_tddi_flash_read(&tmp, cmd, readlen); + data |= tmp << (i * 8); + } + + ILI_DBG("data = 0x%X\n", data); + if (enable) { + /* set flash all protect bit */ + for (i = 0; i < flash_protect_list[index].protectAllOPCount; i++) { + bitPosition = flash_protect_list[index].protectAllOperator[i * 2]; + setBitValue = flash_protect_list[index].protectAllOperator[(i * 2) + 1]; + + if (setBitValue == 1) + data |= (0x1 << bitPosition); + else + data &= ~(0x1 << bitPosition); + } + } else { + /* set flash non-protect bit */ + for (i = 0; i < flash_protect_list[index].resetOPCount; i++) { + bitPosition = flash_protect_list[index].resetOperator[i * 2]; + setBitValue = flash_protect_list[index].resetOperator[(i * 2) + 1]; + + if (setBitValue == 1) + data |= (0x1 << bitPosition); + else + data &= ~(0x1 << bitPosition); + } + } + + for (i = 0; i < 4; i++) + w_buf[i] = (data >> (8 * i)) & 0xFF; + + ILI_DBG("write data = 0x%X\n", data); + + for (i = 0; i < flash_protect_list[index].writeOPCount; i++) { + u8 cmd = flash_protect_list[index].writeOperator[i * 2]; + int writelen = flash_protect_list[index].writeOperator[(i * 2) + 1]; + + ilitek_tddi_flash_write_enable(); + + ilitek_tddi_flash_write(cmd, &w_buf[w_count], writelen); + + if (ilitek_tddi_flash_poll_busy(TIMEOUT_PROTECT) < 0) + ILI_ERR("pulling busy fail\n"); + w_count += writelen; + } + + if (enable) { + /* make sure the flash is protected */ + ckreaddata = 0; + + for (i = 0; i < flash_protect_list[index].readOPCount; i++) { + u32 tmp = 0; + u8 cmd = flash_protect_list[index].readOperator[i * 2]; + int readlen = flash_protect_list[index].readOperator[(i * 2) + 1]; + ilitek_tddi_flash_read(&tmp, cmd, readlen); + ckreaddata |= tmp << (i * 8); + } + + ILI_DBG("data = 0x%X, ckreaddata = 0x%X\n", data, ckreaddata); + + if (ckreaddata != data) + ILI_ERR("protect flash fail, data = 0x%X, ckreaddata = 0x%X\n", data, ckreaddata); + } + + } else { + /*It only tries to unprotect flash in the unsupported list.*/ + if (enable) { + ILI_ERR("no need to protect flash\n"); + goto out; + } + + ilitek_tddi_flash_write_enable(); + mdelay(30); + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0)/* CS Low */ + ILI_ERR("Write cs low failed\n"); + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + if (ili_ice_mode_write(FLASH2_ADDR, 0x01, 1) < 0) + ILI_ERR("Write Start_Write failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, 0x00, 1) < 0) + ILI_ERR("Write Un-Protect Low byte failed\n"); + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); + } +out: + if (!ice) { + if (ilits->cascade_info_block.nNum != 0) + ret = ili_ice_mode_ctrl_by_mode(DISABLE, OFF, BOTH); + else + ret = ili_ice_mode_ctrl(DISABLE, mcu); + + if (ret < 0) + ILI_ERR("Enable ice mode failed\n"); + } + +} + +static int ilitek_fw_check_ddi_chunk(u8 *pfw) +{ + int ret = 0; + u8 cmd[7] = {0x0}; + u32 start = 0x0, end = 0x0, len = 0x0; + bool hex_info = ilits->info_from_hex; + + if (!fbi[DDI].start || !fbi[DDI].end) + return UPDATE_PASS; + + /* To make sure if flash has data. */ + if (hex_info) + ilits->info_from_hex = DISABLE; + + if (ili_ic_get_fw_ver() < 0) { + ILI_INFO("Failed to get fw ver, reading flash by dma instead\n"); + goto dma; + } + + /* Command for getting ddi info from firmware. */ + cmd[0] = CMD_GET_FLASH_DATA; /* cmd */ + cmd[1] = DDI_RSV_BK_SIZE & 0xFF; /* len L byte */ + cmd[2] = (DDI_RSV_BK_SIZE >> 8) & 0xFF; /* len H byte */ + + /* Read customer reserved block */ + start = DDI_RSV_BK_ST_ADDR; + cmd[3] = (start & 0xFF); /* addr L byte */ + cmd[4] = (start >> 8) & 0xFF ; /* addr M byte */ + cmd[5] = (start >> 16) & 0xFF; /* addr H byte */ + cmd[6] = ili_calc_packet_checksum(cmd, sizeof(cmd) - 1); + ILI_INFO("Read customer reserved block: start addr = 0x%X, len = 0x%X ", start, DDI_RSV_BK_SIZE); + if (ilits->wrapper(cmd, sizeof(cmd), fw_flash_tmp, sizeof(fw_flash_tmp), OFF, ON) < 0) { + ILI_ERR("Failed to read customer reserved block data from fw\n"); + goto dma; + } + ipio_memcpy(&pfw[start], fw_flash_tmp + 6, DDI_RSV_BK_SIZE, MAX_HEX_FILE_SIZE - start); + + /* Read mp data block */ + start = DDI_RSV_BK_END_ADDR - DDI_RSV_BK_SIZE + 1; + cmd[3] = (start & 0xFF); /* addr L byte */ + cmd[4] = (start >> 8) & 0xFF ; /* addr M byte */ + cmd[5] = (start >> 16) & 0xFF; /* addr H byte */ + cmd[6] = ili_calc_packet_checksum(cmd, sizeof(cmd) - 1); + ILI_INFO("Read mp data block: start addr = 0x%X, len = 0x%X ", start, DDI_RSV_BK_SIZE); + if (ilits->wrapper(cmd, sizeof(cmd), fw_flash_tmp, sizeof(fw_flash_tmp), OFF, ON) < 0) { + ILI_ERR("Failed to read mp data block from fw\n"); + goto dma; + } + ipio_memcpy(&pfw[start], fw_flash_tmp + 6, DDI_RSV_BK_SIZE, MAX_HEX_FILE_SIZE - start); + + goto out; + +dma: + ILI_INFO("Obtain block data from dma\n"); + + ili_ice_mode_ctrl(ENABLE, OFF); + + /* Read customer reserved block */ + start = DDI_RSV_BK_ST_ADDR; + end = DDI_RSV_BK_ST_ADDR + DDI_RSV_BK_SIZE - 1; + len = DDI_RSV_BK_SIZE; + if (ilitek_tddi_fw_read_flash_data(start, end, fw_flash_tmp, len) < 0) { + ILI_ERR("Failed to read customer reserved block data from dma\\n"); + ret = UPDATE_FAIL; + goto out; + } + ipio_memcpy(&pfw[start], fw_flash_tmp + 6, DDI_RSV_BK_SIZE, MAX_HEX_FILE_SIZE - start); + + /* Read mp data block */ + start = DDI_RSV_BK_END_ADDR - DDI_RSV_BK_SIZE + 1; + end = DDI_RSV_BK_END_ADDR; + len = DDI_RSV_BK_SIZE; + if (ilitek_tddi_fw_read_flash_data(start, end, fw_flash_tmp, len) < 0) { + ILI_ERR("Failed to read mp data block from dma\n"); + ret = UPDATE_FAIL; + goto out; + } + ipio_memcpy(&pfw[start], fw_flash_tmp + 6, DDI_RSV_BK_SIZE, MAX_HEX_FILE_SIZE - start); + + ili_ice_mode_ctrl(DISABLE, OFF); +out: + /* + * Since there're two blocks combined with DDI chunk togeter, + * we need to extend the addresses where are going to upgrade. + */ + fbi[DDI].start = DDI_RSV_BK_ST_ADDR; + fbi[DDI].end = DDI_RSV_BK_END_ADDR; + tfd.end_addr = DDI_RSV_BK_END_ADDR; + + if (hex_info) + ilits->info_from_hex = ENABLE; + + atomic_set(&ilits->cmd_int_check, DISABLE); + return ret; +} + +static int ilitek_tddi_flash_fw_crc_check(u8 *pfw, bool check_fw_ver) +{ + int i, len = 0, crc_byte_len = 4; + u8 flash_crc[4] = {0}; + u32 start_addr = 0, end_addr = 0; + u32 hw_crc = 0; + u32 flash_crc_cb = 0, hex_crc = 0; + u8 check_hex_hw_crc = ENABLE; + + /* Check Flash and HW CRC */ + for (i = 0; i < FW_BLOCK_INFO_NUM; i++) { + start_addr = fbi[i].start; + end_addr = fbi[i].end; + + /* Invaild end address */ + if (end_addr == 0) + continue; + + if (ilitek_tddi_fw_read_flash_data(end_addr - crc_byte_len + 1, end_addr, + flash_crc, sizeof(flash_crc)) < 0) { + ILI_ERR("Read Flash failed\n"); + return UPDATE_FAIL; + } + + flash_crc_cb = flash_crc[0] << 24 | flash_crc[1] << 16 | flash_crc[2] << 8 | flash_crc[3]; + + if (ili_fw_read_hw_crc(start_addr, end_addr - start_addr - crc_byte_len + 1, &hw_crc) < 0) { + ILI_ERR("Read HW CRC failed\n"); + return UPDATE_FAIL; + } + + ILI_INFO("Block = %d, HW CRC = 0x%06x, Flash CRC = 0x%06x\n", i, hw_crc, flash_crc_cb); + + /* Compare Flash CRC with HW CRC */ + if (flash_crc_cb != hw_crc) { + ILI_INFO("HW and Flash CRC not matched\n"); + return UPDATE_FAIL; + } + memset(flash_crc, 0, sizeof(flash_crc)); + } + + if (check_fw_ver) { +#if BOOT_FW_UPDATE_MODE + if (ilits->force_fw_update) { + if (tfd.new_fw_cb != ilits->chip->fw_ver) { + ILI_INFO("FW version not matched\n"); + return UPDATE_FAIL; + } + } else { +#if (BOOT_FW_UPDATE_MODE == BOOT_FW_VER_UPGRADE) + if (tfd.new_fw_cb > ilits->chip->fw_ver || tfd.new_mp_fw_cb > ilits->chip->fw_mp_ver + || ilits->chip->fw_ver == 0x0 || ilits->chip->fw_mp_ver == 0x0) { +#elif (BOOT_FW_UPDATE_MODE == BOOT_FW_VER_DOWNGRADE) + if (tfd.new_fw_cb < ilits->chip->fw_ver || tfd.new_mp_fw_cb < ilits->chip->fw_mp_ver + || ilits->chip->fw_ver == 0x0 || ilits->chip->fw_mp_ver == 0x0) { +#endif + ILI_INFO("after check FW version, do FW Upgrade.\n"); + return UPDATE_FAIL; + } + check_hex_hw_crc = DISABLE; + } +#else + if (tfd.new_fw_cb != ilits->chip->fw_ver) { + ILI_INFO("FW version not matched\n"); + return UPDATE_FAIL; + } +#endif + } + + if (check_hex_hw_crc == ENABLE) { + /* Check Hex and HW CRC */ + for (i = 0; i < FW_BLOCK_INFO_NUM; i++) { + if (fbi[i].end == 0) + continue; + + start_addr = fbi[i].start; + end_addr = fbi[i].end; + + len = fbi[i].end - fbi[i].start + 1 - 4; + hex_crc = CalculateCRC32(fbi[i].start, len, pfw); + + if (ili_fw_read_hw_crc(start_addr, end_addr - start_addr - crc_byte_len + 1, &hw_crc) < 0) { + ILI_ERR("Read HW CRC failed\n"); + return UPDATE_FAIL; + } + + ILI_INFO("Block = %d, HW CRC = 0x%06x, Hex CRC = 0x%06x\n", i, hw_crc, hex_crc); + if (hex_crc != hw_crc) { + ILI_ERR("Hex and HW CRC not matched\n"); + return UPDATE_FAIL; + } + } + } + + ILI_INFO("Flash FW is the same as targe file FW\n"); + return UPDATE_PASS; +} + +static int ilitek_tddi_fw_flash_program(u8 *pfw) +{ + u8 *buf; + u32 i = 0, j = 0, addr = 0, k = 0, recv_addr = 0; + int page = ilits->program_page; + bool skip = true; + + buf = kmalloc(512 * sizeof(u8), GFP_DMA); + if (ERR_ALLOC_MEM(buf)) { + ILI_ERR("Failed to allocate buf memory, %ld\n", PTR_ERR(buf)); + ipio_kfree((void **)&buf); + return -ENOMEM; + } + + for (i = 0; i < FW_BLOCK_INFO_NUM; i++) { + if (fbi[i].end == 0) + continue; + + ILI_INFO("Block[%d]: Programing from (0x%x) to (0x%x), tfd.end_addr = 0x%x\n", + i, fbi[i].start, fbi[i].end, tfd.end_addr); + + for (addr = fbi[i].start; addr < fbi[i].end; addr += page) { + buf[0] = 0x25; + buf[3] = 0x04; + buf[2] = 0x10; + buf[1] = 0x08; + + for (k = 0; k < page; k++) { + if (addr + k <= tfd.end_addr) + buf[4 + k] = pfw[addr + k]; + else + buf[4 + k] = 0xFF; + + if (buf[4 + k] != 0xFF) + skip = false; + } + + if (skip) { + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); + ipio_kfree((void **)&buf); + return UPDATE_FAIL; + } + + ilitek_tddi_flash_write_enable(); + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0) + ILI_ERR("Write cs low failed\n"); + + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, 0x2, 1) < 0) + ILI_ERR("Write 0x2 failed\n"); + + recv_addr = ((addr & 0xFF0000) >> 16) | (addr & 0x00FF00) | ((addr & 0x0000FF) << 16); + if (ili_ice_mode_write(FLASH2_ADDR, recv_addr, 3) < 0) + ILI_ERR("Write address failed\n"); + + if (ilits->wrapper(buf, page + 4, NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Failed to program data at start_addr = 0x%X, k = 0x%X, addr = 0x%x\n", + addr, k, addr + k); + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); + ipio_kfree((void **)&buf); + return UPDATE_FAIL; + } + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); + + if (ilits->flash_mid == 0xEF) { + mdelay(1); + } else { + if (ilitek_tddi_flash_poll_busy(TIMEOUT_PROGRAM) < 0) { + ipio_kfree((void **)&buf); + return UPDATE_FAIL; + } + } + if (ilits->fw_update_stat != ((j * 100) / tfd.end_addr)) { + ilits->fw_update_stat = (j * 100) / tfd.end_addr; + ILI_DBG("Program flahse data .... %d%c", ilits->fw_update_stat, '%'); + } + } + } + ipio_kfree((void **)&buf); + return UPDATE_PASS; +} + +static int ilitek_tddi_fw_flash_erase(bool mcu) +{ + int ret = 0; + u32 i = 0, addr = 0, recv_addr = 0; + bool bk_erase = false; + bool ice = atomic_read(&ilits->ice_stat); + + if (!ice) { + if (ili_ice_mode_ctrl(ENABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed while erasing flash\n"); + } + + for (i = 0; i < FW_BLOCK_INFO_NUM; i++) { + if (fbi[i].end == 0) + continue; + + ILI_INFO("Block[%d]: Erasing from (0x%x) to (0x%x) \n", i, fbi[i].start, fbi[i].end); + + for (addr = fbi[i].start; addr <= fbi[i].end; addr += ilits->flash_sector) { + ilitek_tddi_flash_write_enable(); + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0) + ILI_ERR("Write cs low failed\n"); + + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (addr == fbi[AP].start) { + /* block erase with 64k bytes. */ + if (ili_ice_mode_write(FLASH2_ADDR, 0xD8, 1) < 0) + ILI_ERR("Write 0xB at %x failed\n", FLASH2_ADDR); + bk_erase = true; + } else { + /* sector erase with 4k bytes. */ + if (ili_ice_mode_write(FLASH2_ADDR, 0x20, 1) < 0) + ILI_ERR("Write 0x20 at %x failed\n", FLASH2_ADDR); + } + + recv_addr = ((addr & 0xFF0000) >> 16) | (addr & 0x00FF00) | ((addr & 0x0000FF) << 16); + if (ili_ice_mode_write(FLASH2_ADDR, recv_addr, 3) < 0) + ILI_ERR("Write address failed\n"); + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); + + /* Waitint for flash setting ready */ + mdelay(1); + + if (addr == fbi[AP].start) + ret = ilitek_tddi_flash_poll_busy(TIMEOUT_PAGE); + else + ret = ilitek_tddi_flash_poll_busy(TIMEOUT_SECTOR); + + if (ret < 0) + return UPDATE_FAIL; + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); + + if (i == AP && tfd.is80k && bk_erase) { + addr = 0x10000 - 0x1000; + bk_erase = false; + } + } + } + if (!ice) { + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) + ILI_ERR("Disable ice mode failed after erase flash\n"); + } + return UPDATE_PASS; +} + +static int ilitek_fw_flash_upgrade(u8 *pfw, bool mcu) +{ + int ret = UPDATE_PASS; + bool hex_info = ilits->info_from_hex; + + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) { + ILI_ERR("TP reset failed during flash progam\n"); + return -EFW_REST; + } + } else { + if (ili_reset_ctrl(ilits->reset) < 0) { + ILI_ERR("TP reset failed during flash progam\n"); + return -EFW_REST; + } + } + + ilitek_fw_check_ddi_chunk(pfw); + if (hex_info) + ilits->info_from_hex = DISABLE; + + if (ili_ic_get_fw_ver() < 0) { + ILI_INFO("Failed to get fw ver\n"); + } + + if (hex_info) + ilits->info_from_hex = ENABLE; + + /* Check FW version */ + ILI_INFO("New FW ver = 0x%x, Current FW ver = 0x%x, New MP FW ver = 0x%x, Current MP FW ver = 0x%x\n", + tfd.new_fw_cb, ilits->chip->fw_ver, tfd.new_mp_fw_cb, ilits->chip->fw_mp_ver); + if (ilits->cascade_info_block.nNum != 0) { + ret = ili_ice_mode_ctrl_by_mode(ENABLE, mcu, BOTH); + } else { + ret = ili_ice_mode_ctrl(ENABLE, mcu); + } + + if (ret < 0) + return -EFW_ICE_MODE; + + ret = ilitek_tddi_flash_fw_crc_check(pfw, true); + if (ret == UPDATE_PASS) { + if (ilits->cascade_info_block.nNum != 0) { + if (ili_ice_mode_ctrl_by_mode(DISABLE, OFF, BOTH) < 0) { + if (ili_cascade_reset_ctrl(ilits->reset, false) < 0) { + ILI_ERR("TP reset failed during flash progam\n"); + return -EFW_REST; + } + } + } else { + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) { + ILI_ERR("Disable ice mode failed, call reset instead\n"); + if (ili_reset_ctrl(ilits->reset) < 0) { + ILI_ERR("TP reset failed during flash progam\n"); + return -EFW_REST; + } + } + } + return UPDATE_PASS; + } else { + ILI_INFO("Flash FW and target file FW are different, do upgrade\n"); + } + + ilitek_tddi_flash_protect(DISABLE, OFF); + + ret = ilitek_tddi_fw_flash_erase(mcu); + if (ret == UPDATE_FAIL) + return -EFW_ERASE; + + ret = ilitek_tddi_fw_flash_program(pfw); + if (ret == UPDATE_FAIL) + return -EFW_PROGRAM; + + ilitek_tddi_flash_protect(ENABLE, OFF); + + ret = ilitek_tddi_flash_fw_crc_check(pfw, false); + if (ret == UPDATE_FAIL) + return -EFW_CRC; + + /* We do have to reset chip in order to move new code from flash to iram. */ + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, false) < 0) { + ILI_ERR("TP reset failed after flash progam\n"); + ret = -EFW_REST; + } + } else { + if (ili_reset_ctrl(ilits->reset) < 0) { + ILI_ERR("TP reset failed after flash progam\n"); + ret = -EFW_REST; + } + } + return ret; +} + +static int ilitek_fw_calc_file_crc(u8 *pfw) +{ + int i, block_num = 0; + u32 ex_addr, data_crc, file_crc; + + for (i = 0; i < FW_BLOCK_INFO_NUM; i++) { + if (fbi[i].len >= MAX_HEX_FILE_SIZE) { + ILI_ERR("Content of fw file is invalid. (fbi[%d].len=0x%x)\n", + i, fbi[i].len); + return -1; + } + + if (fbi[i].end <= 4) + continue; + block_num++; + ex_addr = fbi[i].end; + data_crc = CalculateCRC32(fbi[i].start, fbi[i].len - 4, pfw); + file_crc = pfw[ex_addr - 3] << 24 | pfw[ex_addr - 2] << 16 | pfw[ex_addr - 1] << 8 | pfw[ex_addr]; + ILI_DBG("data crc = %x, file crc = %x\n", data_crc, file_crc); + if (data_crc != file_crc) { + ILI_ERR("Content of fw file is broken. (%d, %x, %x)\n", + i, data_crc, file_crc); + return -1; + } + } + + if (fbi[MP].end <= 1 * K || fbi[AP].end <= 1 * K || (block_num == 0)) { + ILI_ERR("Content of fw file is broken. fbi[AP].end = 0x%x, fbi[MP].end = 0x%x, block_num = %d\n", + fbi[AP].end, fbi[MP].end, block_num); + return -1; + } + + ILI_INFO("Content of fw file is correct\n"); + return 0; +} + +static void ilitek_tddi_fw_update_block_info(u8 *pfw) +{ + u32 fw_info_addr = 0, fw_mp_ver_addr = 0; + + fbi[AP].name = "AP"; + fbi[DATA].name = "DATA"; + fbi[TUNING].name = "TUNING"; + fbi[MP].name = "MP"; + fbi[GESTURE].name = "GESTURE"; + fbi[PEN].name = "PEN"; + + /* upgrade mode define */ + fbi[DATA].mode = fbi[AP].mode = fbi[TUNING].mode = AP; + fbi[PEN].mode = AP; + fbi[MP].mode = MP; + fbi[GESTURE].mode = GESTURE; + + if (fbi[AP].end > (64*K)) + tfd.is80k = true; + + /* Copy fw info */ + fw_info_addr = fbi[AP].end - INFO_HEX_ST_ADDR; + ILI_INFO("Parsing hex info start addr = 0x%x\n", fw_info_addr); + ipio_memcpy(ilits->fw_info, (pfw + fw_info_addr), sizeof(ilits->fw_info), sizeof(ilits->fw_info)); + + /* copy fw mp ver */ + fw_mp_ver_addr = fbi[MP].end - INFO_MP_HEX_ADDR; + ILI_INFO("Parsing hex mp ver addr = 0x%x\n", fw_mp_ver_addr); + ipio_memcpy(ilits->fw_mp_ver, pfw + fw_mp_ver_addr, sizeof(ilits->fw_mp_ver), sizeof(ilits->fw_mp_ver)); + tfd.new_mp_fw_cb = (ilits->fw_mp_ver[0] << 24) | (ilits->fw_mp_ver[1]<< 16) | + (ilits->fw_mp_ver[2] << 8) | ilits->fw_mp_ver[3]; + + /* copy fw core ver */ + ilits->chip->core_ver = (ilits->fw_info[68] << 24) | (ilits->fw_info[69] << 16) | + (ilits->fw_info[70] << 8) | ilits->fw_info[71]; + ILI_INFO("New FW Core version = %x\n", ilits->chip->core_ver); + + /* Get hex fw vers */ + tfd.new_fw_cb = (ilits->fw_info[48] << 24) | (ilits->fw_info[49] << 16) | + (ilits->fw_info[50] << 8) | ilits->fw_info[51]; + + /* Get hex report info block*/ + ipio_memcpy(&ilits->rib, ilits->fw_info, sizeof(ilits->rib), sizeof(ilits->rib)); + /*1 byte, Resolution 0-2 bits, CustomType 3-5 bits, PenType 6-7 bits*/ + ilits->rib.nReportResolutionMode = (ilits->chip->core_ver >= CORE_VER_1470) ? (ilits->rib.nReportResolutionMode & 0x07) : POSITION_LOW_RESOLUTION; + ilits->PenType = (ilits->chip->core_ver >= CORE_VER_1700) ? (ilits->rib.nCustomerType >> 3) : POSITION_PEN_TYPE_OFF; + + if (ilits->chip->core_ver >= CORE_VER_1700) { + /*CustomerType 3 bits*/ + ilits->rib.nCustomerType = ilits->rib.nCustomerType & 0x07; + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF_3BITS; + } else { + /*CustomerType 5 bits*/ + ilits->rib.nCustomerType = (ilits->chip->core_ver >= CORE_VER_1470) ? ilits->rib.nCustomerType : POSITION_CUSTOMER_TYPE_OFF; + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF; + } + + ILI_INFO("report_info_block : nReportByPixel = %d, nIsHostDownload = %d, nIsSPIICE = %d, nIsSPISLAVE = %d, nIsI2C = %d\n", + ilits->rib.nReportByPixel, ilits->rib.nIsHostDownload, ilits->rib.nIsSPIICE, ilits->rib.nIsSPISLAVE, ilits->rib.nIsI2C); + + ILI_INFO("report_info_block : nReserved00 = %d, nReportResolutionMode = %d, nCustomerType = %d, nReserved02 = %x, nReserved03 = %x\n", + ilits->rib.nReserved00, ilits->rib.nReportResolutionMode, ilits->rib.nCustomerType, ilits->rib.nReserved02, ilits->rib.nReserved03); + + ILI_INFO("PenType = 0x%x, Customer Type OFF = 0x%x\n", ilits->PenType, ilits->customertype_off); + +#if ENABLE_PEN_MODE + /* Get hex Pen info block*/ + fw_info_addr = fbi[AP].end - INFO_PEN_ST_ADDR; + ILI_INFO("Parsing pen info block start addr = 0x%x\n", fw_info_addr); + ipio_memcpy(&ilits->pen_info_block, (pfw + fw_info_addr), sizeof(ilits->pen_info_block), sizeof(ilits->pen_info_block)); + + ILI_INFO("pen_info_block : nPxRaw = %d, nPyRaw = %d, nPxVa = %d,nPyVa = %d, nReserved0 = %d, nReserved01 = %d, nReserved2 = %d, nReserved03 = %d\n", + ilits->pen_info_block.nPxRaw, ilits->pen_info_block.nPyRaw, ilits->pen_info_block.nPxVa, ilits->pen_info_block.nPyVa, ilits->pen_info_block.nReserved00, ilits->pen_info_block.nReserved01, ilits->pen_info_block.nReserved02, ilits->pen_info_block.nReserved03); +#endif + +#if ENABLE_CASCADE + /* Get hex Cascade info block*/ + fw_info_addr = fbi[AP].end - INFO_CASCADE_ST_ADDR; + ILI_INFO("Parsing cascade info block start addr = 0x%x\n", fw_info_addr); + ipio_memcpy(&ilits->cascade_info_block, (pfw + fw_info_addr), sizeof(ilits->cascade_info_block), sizeof(ilits->cascade_info_block)); + + ILI_INFO("cascade_info_block : nDisable = %d, nNum = %d, nReserved0 = %d, nReserved1 = %d, nReserved2 = %d, nReserved03 = %d\n", + ilits->cascade_info_block.nDisable, ilits->cascade_info_block.nNum, ilits->cascade_info_block.nReserved00, ilits->cascade_info_block.nReserved01, ilits->cascade_info_block.nReserved02, ilits->cascade_info_block.nReserved03); +#else + ilits->cascade_info_block.nDisable = ENABLE; + ilits->cascade_info_block.nNum = 0; + ILI_INFO("cascade_info_block : nDisable = %d, nNum = %d\n", ilits->cascade_info_block.nDisable, ilits->cascade_info_block.nNum); +#endif + + /* Calculate update address */ + ILI_INFO("New FW ver = 0x%x, New MP FW version = 0x%x,\n", tfd.new_fw_cb, tfd.new_mp_fw_cb); + ILI_INFO("star_addr = 0x%06X, end_addr = 0x%06X, Block Num = %d\n", tfd.start_addr, tfd.end_addr, tfd.block_number); +} + +static int ilitek_tddi_fw_ili_convert(u8 *pfw) +{ + int i, size, blk_num = 0, blk_map = 0, num = 0; + int b0_addr = 0, b0_num = 0; + + if (ERR_ALLOC_MEM(ilits->md_fw_ili)) + return -ENOMEM; + + CTPM_FW = ilits->md_fw_ili; + size = ilits->md_fw_ili_size; + + if (size < ILI_FILE_HEADER || size > (MAX_HEX_FILE_SIZE + ILI_FILE_HEADER)) { + ILI_ERR("size of ILI file is invalid\n"); + return -EINVAL; + } + + /* Check if it's old version of ILI format. */ + if (CTPM_FW[22] == 0xFF && CTPM_FW[23] == 0xFF && + CTPM_FW[24] == 0xFF && CTPM_FW[25] == 0xFF) { + ILI_ERR("Invaild ILI format, abort!\n"); + return -EINVAL; + } + + blk_num = CTPM_FW[131]; + blk_map = (CTPM_FW[129] << 8) | CTPM_FW[130]; + ILI_INFO("Parsing ILI file, block num = %d, block mapping = %x\n", blk_num, blk_map); + + if (blk_num > (FW_BLOCK_INFO_NUM - 1) || !blk_num || !blk_map) { + ILI_ERR("Number of block or block mapping is invalid, abort!\n"); + return -EINVAL; + } + + memset(fbi, 0x0, sizeof(fbi)); + tfd.start_addr = 0; + tfd.end_addr = 0; + tfd.hex_tag = BLOCK_TAG_AF; + + /* Parsing block info */ + for (i = 0; i < FW_BLOCK_INFO_NUM; i++) { + /* B0 tag */ + b0_addr = (CTPM_FW[4 + i * 4] << 16) | (CTPM_FW[5 + i * 4] << 8) | (CTPM_FW[6 + i * 4]); + b0_num = CTPM_FW[7 + i * 4]; + if ((b0_num != 0) && (b0_addr != 0x000000)) + fbi[b0_num].fix_mem_start = b0_addr; + + /* AF tag */ + num = i + 1; + if (num >= FW_BLOCK_INFO_NUM) + break; + if (((blk_map >> i) & 0x01) == 0x01) { + fbi[num].start = (CTPM_FW[132 + i * 6] << 16) | (CTPM_FW[133 + i * 6] << 8) | CTPM_FW[134 + i * 6]; + fbi[num].end = (CTPM_FW[135 + i * 6] << 16) | (CTPM_FW[136 + i * 6] << 8) | CTPM_FW[137 + i * 6]; + + if (fbi[num].fix_mem_start == 0) + fbi[num].fix_mem_start = INT_MAX; + + fbi[num].len = fbi[num].end - fbi[num].start + 1; + ILI_INFO("Block[%d]: start_addr = %x, end = %x, fix_mem_start = 0x%x\n", num, fbi[num].start, + fbi[num].end, fbi[num].fix_mem_start); + } + } + + memcpy(pfw, CTPM_FW + ILI_FILE_HEADER, size - ILI_FILE_HEADER); + + if (ilitek_fw_calc_file_crc(pfw) < 0) + return -1; + + tfd.block_number = blk_num; + tfd.end_addr = size - ILI_FILE_HEADER; + return 0; +} + +static int ilitek_tddi_fw_hex_convert(u8 *phex, int size, u8 *pfw) +{ + int block = 0; + u32 i = 0, j = 0, k = 0, num = 0; + u32 len = 0, addr = 0, type = 0; + u32 start_addr = 0x0, end_addr = 0x0, ex_addr = 0; + u32 offset; + + memset(fbi, 0x0, sizeof(fbi)); + + /* Parsing HEX file */ + for (; i < size;) { + len = HexToDec(&phex[i + 1], 2); + addr = HexToDec(&phex[i + 3], 4); + type = HexToDec(&phex[i + 7], 2); + + if (type == 0x04) { + ex_addr = HexToDec(&phex[i + 9], 4); + } else if (type == 0x02) { + ex_addr = HexToDec(&phex[i + 9], 4); + ex_addr = ex_addr >> 12; + } else if (type == BLOCK_TAG_AF) { + /* insert block info extracted from hex */ + tfd.hex_tag = type; + if (tfd.hex_tag == BLOCK_TAG_AF) + num = HexToDec(&phex[i + 9 + 6 + 6], 2); + else + num = 0xFF; + + if (num > (FW_BLOCK_INFO_NUM - 1)) { + ILI_ERR("ERROR! block num is larger than its define (%d, %d)\n", + num, FW_BLOCK_INFO_NUM - 1); + return -EINVAL; + } + + fbi[num].start = HexToDec(&phex[i + 9], 6); + fbi[num].end = HexToDec(&phex[i + 9 + 6], 6); + fbi[num].fix_mem_start = INT_MAX; + fbi[num].len = fbi[num].end - fbi[num].start + 1; + ILI_INFO("Block[%d]: start_addr = %x, end = %x", num, fbi[num].start, fbi[num].end); + + block++; + } else if (type == BLOCK_TAG_B0 && tfd.hex_tag == BLOCK_TAG_AF) { + num = HexToDec(&phex[i + 9 + 6], 2); + + if (num > (FW_BLOCK_INFO_NUM - 1)) { + ILI_ERR("ERROR! block num is larger than its define (%d, %d)\n", + num, FW_BLOCK_INFO_NUM - 1); + return -EINVAL; + } + + fbi[num].fix_mem_start = HexToDec(&phex[i + 9], 6); + ILI_INFO("Tag 0xB0: change Block[%d] to addr = 0x%x\n", num, fbi[num].fix_mem_start); + } + + addr = addr + (ex_addr << 16); + + if (phex[i + 1 + 2 + 4 + 2 + (len * 2) + 2] == 0x0D) + offset = 2; + else + offset = 1; + + if (addr >= MAX_HEX_FILE_SIZE) { + ILI_ERR("Invalid hex format %d\n", addr); + return -1; + } + + if (type == 0x00) { + end_addr = addr + len; + if (addr < start_addr) + start_addr = addr; + /* fill data */ + for (j = 0, k = 0; j < (len * 2); j += 2, k++) + pfw[addr + k] = HexToDec(&phex[i + 9 + j], 2); + } + i += 1 + 2 + 4 + 2 + (len * 2) + 2 + offset; + } + + if (ilitek_fw_calc_file_crc(pfw) < 0) + return -1; + + tfd.start_addr = start_addr; + tfd.end_addr = end_addr; + tfd.block_number = block; + return 0; +} + +static int ilitek_tdd_fw_hex_open(u8 op, u8 *pfw) +{ + int ret = 0, fsize = 0; + const struct firmware *fw = NULL; +#if (!GENERIC_KERNEL_IMAGE) + struct file *f = NULL; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t old_fs; +#endif + loff_t pos = 0; +#endif + ILI_INFO("Open file method = %s, path = %s\n", + op ? "FILP_OPEN" : "REQUEST_FIRMWARE", + op ? ilits->md_fw_filp_path : ilits->md_fw_rq_path); + + switch (op) { + case REQUEST_FIRMWARE: + if (request_firmware(&fw, ilits->md_fw_rq_path, ilits->dev) < 0) { + ILI_ERR("Request firmware failed, try again\n"); + if (request_firmware(&fw, ilits->md_fw_rq_path, ilits->dev) < 0) { + ILI_ERR("Request firmware failed after retry\n"); + ret = -1; + goto out; + } + } + + fsize = fw->size; + ILI_INFO("fsize = %d\n", fsize); + if (fsize <= 0) { + ILI_ERR("The size of file is zero\n"); + release_firmware(fw); + ret = -1; + goto out; + } + + ilits->tp_fw.size = 0; + ilits->tp_fw.data = vmalloc(fsize); + if (ERR_ALLOC_MEM(ilits->tp_fw.data)) { + ILI_ERR("Failed to allocate tp_fw by vmalloc, try again\n"); + ilits->tp_fw.data = vmalloc(fsize); + if (ERR_ALLOC_MEM(ilits->tp_fw.data)) { + ILI_ERR("Failed to allocate tp_fw after retry\n"); + release_firmware(fw); + ret = -ENOMEM; + goto out; + } + } + + /* Copy fw data got from request_firmware to global */ + ipio_memcpy((u8 *)ilits->tp_fw.data, fw->data, fsize * sizeof(*fw->data), fsize); + ilits->tp_fw.size = fsize; + release_firmware(fw); + break; + case FILP_OPEN: +#if GENERIC_KERNEL_IMAGE + ILI_ERR("GKI version not allow drivers to use filp_open\n"); + return -1; +#else + f = filp_open(ilits->md_fw_filp_path, O_RDONLY, 0644); + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open the file at %ld\n", PTR_ERR(f)); + ret = -1; + goto out; + } + + fsize = f->f_inode->i_size; + ILI_INFO("fsize = %d\n", fsize); + if (fsize <= 0) { + ILI_ERR("The size of file is invaild\n"); + filp_close(f, NULL); + ret = -1; + goto out; + } + + ipio_vfree((void **)&(ilits->tp_fw.data)); + ilits->tp_fw.size = 0; + ilits->tp_fw.data = vmalloc(fsize); + if (ERR_ALLOC_MEM(ilits->tp_fw.data)) { + ILI_ERR("Failed to allocate tp_fw by vmalloc, try again\n"); + ilits->tp_fw.data = vmalloc(fsize); + if (ERR_ALLOC_MEM(ilits->tp_fw.data)) { + ILI_ERR("Failed to allocate tp_fw after retry\n"); + filp_close(f, NULL); + ret = -ENOMEM; + goto out; + } + } + + /* ready to map user's memory to obtain data by reading files */ + pos = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + old_fs = get_fs(); + set_fs(KERNEL_DS); + vfs_read(f, (u8 *)ilits->tp_fw.data, fsize, &pos); + set_fs(old_fs); +#else + kernel_read(f, (u8 *)ilits->tp_fw.data, fsize, &pos); +#endif + filp_close(f, NULL); + ilits->tp_fw.size = fsize; +#endif + break; + default: + ILI_ERR("Unknown open file method, %d\n", op); + break; + } + + if (ERR_ALLOC_MEM(ilits->tp_fw.data) || ilits->tp_fw.size <= 0) { + ILI_ERR("fw data/size is invaild\n"); + ret = -1; + goto out; + } + + /* Convert hex and copy data from tp_fw.data to pfw */ + if (ilitek_tddi_fw_hex_convert((u8 *)ilits->tp_fw.data, ilits->tp_fw.size, pfw) < 0) { + ILI_ERR("Convert hex file failed\n"); + ret = -1; + } + +out: + ipio_vfree((void **)&(ilits->tp_fw.data)); + return ret; +} + +int ili_fw_upgrade(int op) +{ + int i, ret = 0, retry = 3; + + if (!ilits->boot || ilits->force_fw_update || ERR_ALLOC_MEM(pfw)) { + if (ERR_ALLOC_MEM(pfw)) { + ipio_vfree((void **)&pfw); + pfw = vmalloc(MAX_HEX_FILE_SIZE * sizeof(u8)); + if (ERR_ALLOC_MEM(pfw)) { + ILI_ERR("Failed to allocate pfw memory, %ld\n", PTR_ERR(pfw)); + ipio_vfree((void **)&pfw); + ret = -ENOMEM; + goto out; + } + } + + for (i = 0; i < MAX_HEX_FILE_SIZE; i++) + pfw[i] = 0xFF; + + if (ilitek_tdd_fw_hex_open(op, pfw) < 0) { + ILI_ERR("Open hex file fail, try upgrade from ILI file\n"); + + /* + * Users might not be aware of a broken hex file when recovering + * fw from ILI file. We should force them to check + * hex files they attempt to update via device node. + */ + if (ilits->node_update) { + ILI_ERR("Ignore update from ILI file\n"); + ipio_vfree((void **)&pfw); + return -EFW_CONVERT_FILE; + } + + if (ilitek_tddi_fw_ili_convert(pfw) < 0) { + ILI_ERR("Convert ILI file error\n"); + ret = -EFW_CONVERT_FILE; + goto out; + } + } + ilitek_tddi_fw_update_block_info(pfw); + + if (ilits->chip->core_ver >= CORE_VER_1470 && ilits->rib.nIsHostDownload == 1) { + ILI_ERR("hex file interface no match error\n"); + ret = -EFW_INTERFACE; + goto out; + } + } + +#if (ENGINEER_FLOW) + if (!ilits->eng_flow) { + do { + ret = ilitek_fw_flash_upgrade(pfw, OFF); + if (ret == UPDATE_PASS) + break; + + ILI_ERR("Upgrade failed, do retry!\n"); + } while (--retry > 0); + + if (ret != UPDATE_PASS) { + ILI_ERR("Failed to upgrade fw %d times, erasing flash\n", retry); + if (ilitek_tddi_fw_flash_erase(OFF) < 0) + ILI_ERR("Failed to erase flash\n"); + + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, false) < 0) + ILI_ERR("TP reset failed after erase flash\n"); + } else { + if (ili_reset_ctrl(ilits->reset) < 0) + ILI_ERR("TP reset failed after erase flash\n"); + } + } + } else { + ILI_ERR("eng_flow do reset!\n"); + if (ilits->cascade_info_block.nNum != 0) { + ili_cascade_reset_ctrl(ilits->reset, true); + } else { + ili_reset_ctrl(ilits->reset); + } + } +#else + do { + ret = ilitek_fw_flash_upgrade(pfw, OFF); + if (ret == UPDATE_PASS) + break; + + ILI_ERR("Upgrade failed, do retry!\n"); + } while (--retry > 0); + + if (ret != UPDATE_PASS) { + ILI_ERR("Failed to upgrade fw %d times, erasing flash\n", retry); + if (ilitek_tddi_fw_flash_erase(OFF) < 0) + ILI_ERR("Failed to erase flash\n"); + + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, false) < 0) + ILI_ERR("TP reset failed after erase flash\n"); + } else { + if (ili_reset_ctrl(ilits->reset) < 0) + ILI_ERR("TP reset failed after erase flash\n"); + } + } +#endif + +out: + if (ret < 0) + ilits->info_from_hex = DISABLE; + + if (ilits->cascade_info_block.nNum != 0) { + if (atomic_read(&ilits->ice_stat)) { + ili_ice_mode_ctrl_by_mode(DISABLE, OFF, BOTH); + } + } else { + if (atomic_read(&ilits->ice_stat)) + ili_ice_mode_ctrl(DISABLE, OFF); + } + + ili_ic_get_all_info(); + ili_ic_func_ctrl_reset(); + + if (!ilits->info_from_hex) + ilits->info_from_hex = ENABLE; + + return ret; +} + +struct flash_table { + u16 mid; + u16 dev_id; + int mem_size; + int program_page; + int sector; +} flash_t[] = { + [0] = {0x00, 0x0000, (256 * K), 256, (4 * K)}, /* Default */ + [1] = {0xEF, 0x3010, (64 * K), 256, (4 * K)}, /* W25X05CL */ + [2] = {0xEF, 0x4012, (256 * K), 256, (4 * K)}, /* W25Q20CL */ + [3] = {0xEF, 0x6011, (128 * K), 256, (4 * K)}, /* W25Q10EW */ + [4] = {0xEF, 0x6012, (256 * K), 256, (4 * K)}, /* W25Q20EW */ + [5] = {0xC8, 0x6012, (256 * K), 256, (4 * K)}, /* GD25LQ20B */ + [6] = {0xC8, 0x6013, (512 * K), 256, (4 * K)}, /* GD25LQ40 */ + [7] = {0x85, 0x6012, (2 * M), 256, (4 * K)}, /* P25Q20L */ + [8] = {0x85, 0x6013, (4 * M), 256, (4 * K)}, /* P25Q40L */ + [9] = {0xC2, 0x2010, (128 * K), 256, (4 * K)},/* MX25L512 */ + [10] = {0xC2, 0x2530, (512 * K), 256, (4 * K)},/* MX25U5121E */ + [11] = {0xC2, 0x2531, (1 * M), 256, (4 * K)},/* MX25U1001E */ + [12] = {0xC2, 0x2812, (256 * K), 256, (4 * K)},/* MX25R2035F */ + [13] = {0xC2, 0x2813, (512 * K), 256, (4 * K)},/* MX25R4035F */ + [14] = {0x1C, 0x3812, (256 * K), 256, (4 * K)},/* EN25S20A */ +}; + +void ili_fw_read_flash_info(bool mcu) +{ + int i = 0; + u8 buf[3] = {0}; + u8 cmd = 0x9F; + u32 tmp = 0; + u16 flash_id = 0, flash_mid = 0; + bool ice = atomic_read(&ilits->ice_stat); + + if (!ice) { + if (ili_ice_mode_ctrl(ENABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed while reading flash info\n"); + } + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x0, 1) < 0) /* CS Low */ + ILI_ERR("Write cs low failed\n"); + + if (ili_ice_mode_write(FLASH1_ADDR, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(FLASH2_ADDR, cmd, 1) < 0) /* Read JEDEC ID */ + ILI_ERR("Write 0x9F failed\n"); + + for (i = 0; i < ARRAY_SIZE(buf); i++) { + if (ili_ice_mode_write(FLASH2_ADDR, 0xFF, 1) < 0) + ILI_ERR("Write dummy failed\n"); + + if (ili_ice_mode_read(FLASH4_ADDR, &tmp, sizeof(u8)) < 0) + ILI_ERR("Read flash info error\n"); + + buf[i] = tmp; + } + + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) /* CS High */ + ILI_ERR("Write cs high failed\n"); + + flash_mid = buf[0]; + flash_id = buf[1] << 8 | buf[2]; + + ilits->flash_mid = flash_mid; + ilits->flash_devid = flash_id; + + for (i = 0; i < ARRAY_SIZE(flash_t); i++) { + if (flash_mid == flash_t[i].mid && flash_id == flash_t[i].dev_id) { + ilits->program_page = flash_t[i].program_page; + ilits->flash_sector = flash_t[i].sector; + break; + } + } + + if (i >= ARRAY_SIZE(flash_t)) { + ILI_INFO("Not found flash id in tab, use default\n"); + ilits->program_page = flash_t[0].program_page; + ilits->flash_sector = flash_t[0].sector; + } + + ILI_INFO("Flash MID = %x, Flash DEV_ID = %x\n", ilits->flash_mid, ilits->flash_devid); + ILI_INFO("Flash program page = %d\n", ilits->program_page); + ILI_INFO("Flash sector = %d\n", ilits->flash_sector); + + if (!ice) { + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) + ILI_ERR("Disable ice mode failed while reading flash info\n"); + } +} \ No newline at end of file diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_hostdl.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_hostdl.c new file mode 100644 index 000000000000..17dbbc379fb4 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_hostdl.c @@ -0,0 +1,1105 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" + +#define UPDATE_PASS 0 +#define UPDATE_FAIL -1 +#define TIMEOUT_SECTOR 500 +#define TIMEOUT_PAGE 3500 +#define TIMEOUT_PROGRAM 10 + +static struct touch_fw_data { + u8 block_number; + u32 start_addr; + u32 end_addr; + u32 new_fw_cb; + int delay_after_upgrade; + bool isCRC; + bool isboot; + bool is80k; + int hex_tag; +} tfd; + +static struct flash_block_info { + char *name; + u32 start; + u32 end; + u32 len; + u32 mem_start; + u32 fix_mem_start; + u8 mode; +} fbi[FW_BLOCK_INFO_NUM]; + +static u8 *pfw; +static u8 *CTPM_FW; + +static u32 HexToDec(char *phex, s32 len) +{ + u32 ret = 0, temp = 0, i; + s32 shift = (len - 1) * 4; + + for (i = 0; i < len; shift -= 4, i++) { + if ((phex[i] >= '0') && (phex[i] <= '9')) + temp = phex[i] - '0'; + else if ((phex[i] >= 'a') && (phex[i] <= 'f')) + temp = (phex[i] - 'a') + 10; + else if ((phex[i] >= 'A') && (phex[i] <= 'F')) + temp = (phex[i] - 'A') + 10; + + ret |= (temp << shift); + } + return ret; +} + +static int CalculateCRC32(u32 start_addr, u32 len, u8 *pfw) +{ + int i = 0, j = 0; + int crc_poly = 0x04C11DB7; + int tmp_crc = 0xFFFFFFFF; + + for (i = start_addr; i < start_addr + len; i++) { + tmp_crc ^= (pfw[i] << 24); + + for (j = 0; j < 8; j++) { + if ((tmp_crc & 0x80000000) != 0) + tmp_crc = tmp_crc << 1 ^ crc_poly; + else + tmp_crc = tmp_crc << 1; + } + } + return tmp_crc; +} + +static int calc_hw_dma_crc(u32 start_addr, u32 block_size) +{ + int count = 50; + u32 busy = 0; + + if (ilits->chip->dma_reset) { + ILI_DBG("operate dma reset in reg after tp reset\n"); + if (ili_ice_mode_write(0x40040, 0x00800000, 4) < 0) + ILI_ERR("Failed to open DMA reset\n"); + if (ili_ice_mode_write(0x40040, 0x00000000, 4) < 0) + ILI_ERR("Failed to close DMA reset\n"); + } + /* dma1 src1 address */ + if (ili_ice_mode_write(0x072104, start_addr, 4) < 0) + ILI_ERR("Write dma1 src1 address failed\n"); + /* dma1 src1 format */ + if (ili_ice_mode_write(0x072108, 0x80000001, 4) < 0) + ILI_ERR("Write dma1 src1 format failed\n"); + /* dma1 dest address */ + if (ili_ice_mode_write(0x072114, 0x0002725C, 4) < 0) + ILI_ERR("Write dma1 src1 format failed\n"); + /* dma1 dest format */ + if (ili_ice_mode_write(0x072118, 0x80000000, 4) < 0) + ILI_ERR("Write dma1 dest format failed\n"); + /* Block size*/ + if (ili_ice_mode_write(0x07211C, block_size, 4) < 0) + ILI_ERR("Write block size (%d) failed\n", block_size); + /* crc off */ + if (ili_ice_mode_write(0x041016, 0x00, 1) < 0) + ILI_INFO("Write crc of failed\n"); + /* dma crc */ + if (ili_ice_mode_write(0x041017, 0x03, 1) < 0) + ILI_ERR("Write dma 1 crc failed\n"); + /* crc on */ + if (ili_ice_mode_write(0x041016, 0x01, 1) < 0) + ILI_ERR("Write crc on failed\n"); + /* Dma1 stop */ + if (ili_ice_mode_write(0x072100, 0x02000000, 4) < 0) + ILI_ERR("Write dma1 stop failed\n"); + /* clr int */ + if (ili_ice_mode_write(0x048006, 0x2, 1) < 0) + ILI_ERR("Write clr int failed\n"); + /* Dma1 start */ + if (ili_ice_mode_write(0x072100, 0x01000000, 4) < 0) + ILI_ERR("Write dma1 start failed\n"); + + /* Polling BIT0 */ + while (count > 0) { + mdelay(1); + if (ili_ice_mode_read(0x048006, &busy, sizeof(u8)) < 0) + ILI_ERR("Read busy error\n"); + ILI_DBG("busy = %x\n", busy); + if ((busy & 0x02) == 2) + break; + count--; + } + + if (count <= 0) { + ILI_ERR("BIT0 is busy\n"); + return -1; + } + + if (ili_ice_mode_read(0x04101C, &busy, sizeof(u32)) < 0) { + ILI_ERR("Read dma crc error\n"); + return -1; + } + return busy; +} + +static int ilitek_tddi_fw_iram_read(u8 *buf, u32 start, int len) +{ + int limit = 3 * K; /* SPI transfer data length must less than 4K */ + int addr = 0, loop = 0, tmp_len = len, cnt = 0; + u8 cmd[4] = {0}; + + if (!buf) { + ILI_ERR("buf is null\n"); + return -ENOMEM; + } + + if (len % limit) + loop = (len / limit) + 1; + else + loop = len / limit; + + for (cnt = 0, addr = start; cnt < loop; cnt++, addr += limit) { + tmp_len = len - cnt * limit; + ilits->fw_update_stat = ((len - tmp_len) * 100) / len; + ILI_INFO("Reading iram data .... %d%c", ilits->fw_update_stat, '%'); + + if (tmp_len > limit) + tmp_len = limit; + + cmd[0] = 0x25; + cmd[3] = (char)((addr & 0x00FF0000) >> 16); + cmd[2] = (char)((addr & 0x0000FF00) >> 8); + cmd[1] = (char)((addr & 0x000000FF)); + + if (ilits->wrapper(cmd, 4, NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Failed to write iram data\n"); + return -ENODEV; + } + + if (ilits->wrapper(NULL, 0, buf + cnt * limit, tmp_len, OFF, OFF) < 0) { + ILI_ERR("Failed to Read iram data\n"); + return -ENODEV; + } + + } + return 0; +} + +int ili_fw_dump_iram_data(u32 start, u32 end, bool save, bool mcu) +{ +#if (!GENERIC_KERNEL_IMAGE) + struct file *f = NULL; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t old_fs; +#endif + loff_t pos = 0; +#endif + int i, ret = 0; + int len, tmp = debug_en; + bool ice = atomic_read(&ilits->ice_stat); + + if (!ice) { + ret = ili_ice_mode_ctrl(ENABLE, mcu); + if (ret < 0) { + ILI_ERR("Enable ice mode failed\n"); + return ret; + } + } + + len = end - start + 1; + + if (len > MAX_HEX_FILE_SIZE) { + ILI_ERR("len is larger than buffer, abort\n"); + ret = -EINVAL; + goto out; + } + + for (i = 0; i < MAX_HEX_FILE_SIZE; i++) + ilits->update_buf[i] = 0xFF; + + ret = ilitek_tddi_fw_iram_read(ilits->update_buf, start, len); + if (ret < 0) { + ILI_ERR("Read IRAM data failed\n"); + goto out; + } + + if (save) { +#if GENERIC_KERNEL_IMAGE + ILI_ERR("GKI version not allow drivers to use filp_open, dump IRAM data\n"); + debug_en = DEBUG_ALL; + ili_dump_data(ilits->update_buf, 8, len, 0, "IRAM"); + debug_en = tmp; + ret = -ENOMEM; + goto out; +#else + f = filp_open(DUMP_IRAM_PATH, O_WRONLY | O_CREAT | O_TRUNC, 644); + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open the file at %ld.\n", PTR_ERR(f)); + ret = -ENOMEM; + goto out; + } + + pos = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + old_fs = get_fs(); + set_fs(KERNEL_DS); + vfs_write(f, ilits->update_buf, len, &pos); + set_fs(old_fs); +#else + kernel_write(f, ilits->update_buf, len, &pos); +#endif + filp_close(f, NULL); + ILI_INFO("Save iram data to %s\n", DUMP_IRAM_PATH); +#endif + } else { + debug_en = DEBUG_ALL; + ili_dump_data(ilits->update_buf, 8, len, 0, "IRAM"); + debug_en = tmp; + } + +out: + if (!ice) { + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed after code reset\n"); + } + + ILI_INFO("Dump IRAM %s\n", (ret < 0) ? "FAIL" : "SUCCESS"); + return ret; +} + +static int ilitek_tddi_fw_iram_program(u32 start, u8 *w_buf, u32 w_len, u32 split_len) +{ + int i = 0, j = 0, addr = 0; + u32 end = start + w_len; + bool fix_4_alignment = false; + + if (split_len % 4 > 0) + ILI_ERR("Since split_len must be four-aligned, it must be a multiple of four"); + + if (split_len != 0) { + for (addr = start, i = 0; addr < end; addr += split_len, i += split_len) { + if ((addr + split_len) > end) { + split_len = end - addr; + if (split_len % 4 != 0) + fix_4_alignment = true; + } + + ilits->update_buf[0] = SPI_WRITE; + ilits->update_buf[1] = 0x25; + ilits->update_buf[2] = (char)((addr & 0x000000FF)); + ilits->update_buf[3] = (char)((addr & 0x0000FF00) >> 8); + ilits->update_buf[4] = (char)((addr & 0x00FF0000) >> 16); + + for (j = 0; j < split_len; j++) + ilits->update_buf[5 + j] = w_buf[i + j]; + + if (fix_4_alignment) { + ILI_INFO("org split_len = 0x%X\n", split_len); + ILI_INFO("idev->update_buf[5 + 0x%X] = 0x%X\n", split_len - 4, ilits->update_buf[5 + split_len - 4]); + ILI_INFO("idev->update_buf[5 + 0x%X] = 0x%X\n", split_len - 3, ilits->update_buf[5 + split_len - 3]); + ILI_INFO("idev->update_buf[5 + 0x%X] = 0x%X\n", split_len - 2, ilits->update_buf[5 + split_len - 2]); + ILI_INFO("idev->update_buf[5 + 0x%X] = 0x%X\n", split_len - 1, ilits->update_buf[5 + split_len - 1]); + for (j = 0; j < (4 - (split_len % 4)); j++) { + ilits->update_buf[5 + j + split_len] = 0xFF; + ILI_INFO("idev->update_buf[5 + 0x%X] = 0x%X\n", j + split_len, ilits->update_buf[5 + j + split_len]); + } + + ILI_INFO("split_len %% 4 = %d\n", split_len % 4); + split_len = split_len + (4 - (split_len % 4)); + ILI_INFO("fix split_len = 0x%X\n", split_len); + } + if (ilits->spi_write_then_read(ilits->spi, ilits->update_buf, split_len + 5, NULL, 0)) { + ILI_ERR("Failed to write data via SPI in host download (%x)\n", split_len + 5); + return -EIO; + } + ilits->fw_update_stat = (i * 100) / w_len; + } + } else { + for (i = 0; i < MAX_HEX_FILE_SIZE; i++) + ilits->update_buf[i] = 0xFF; + + ilits->update_buf[0] = SPI_WRITE; + ilits->update_buf[1] = 0x25; + ilits->update_buf[2] = (char)((start & 0x000000FF)); + ilits->update_buf[3] = (char)((start & 0x0000FF00) >> 8); + ilits->update_buf[4] = (char)((start & 0x00FF0000) >> 16); + + memcpy(&ilits->update_buf[5], w_buf, w_len); + if (w_len % 4 != 0) { + ILI_INFO("org w_len = %d\n", w_len); + w_len = w_len + (4 - (w_len % 4)); + ILI_INFO("w_len = %d w_len %% 4 = %d\n", w_len, w_len % 4); + } + /* It must be supported by platforms that have the ability to transfer all data at once. */ + if (ilits->spi_write_then_read(ilits->spi, ilits->update_buf, w_len + 5, NULL, 0) < 0) { + ILI_ERR("Failed to write data via SPI in host download (%x)\n", w_len + 5); + return -EIO; + } + } + return 0; +} + +static int ilitek_tddi_fw_iram_upgrade(u8 *pfw, bool mcu) +{ + int i, ret = UPDATE_PASS; + u32 mode, crc, dma, iram_crc = 0, slave_crc; + u8 *fw_ptr = NULL, crc_temp[4], crc_len = 4; + bool iram_crc_err = false; + struct ilitek_dma_config dma1; + + if (!ilits->ddi_rest_done) { + if (ilits->actual_tp_mode != P5_X_FW_GESTURE_MODE) { + if (ilits->cascade_info_block.nNum != 0) { + ili_cascade_reset_ctrl(ilits->reset, true); + } else { + ili_reset_ctrl(ilits->reset); + } + } + + if (ilits->cascade_info_block.nNum != 0) { + ili_set_bypass_mode(mcu); + } else { + ret = ili_ice_mode_ctrl(ENABLE, mcu); + } + + if (ret < 0) + return -EFW_ICE_MODE; + } else { + /* Restore it if the wq of load_fw_ddi has been called. */ + ilits->ddi_rest_done = false; + } + + /* Point to pfw with different addresses for getting its block data. */ + fw_ptr = pfw; + if (ilits->actual_tp_mode == P5_X_FW_TEST_MODE) { + + mode = MP; + } else if (ilits->actual_tp_mode == P5_X_FW_GESTURE_MODE) { + mode = GESTURE; + crc_len = 0; + + if (ilits->cascade_info_block.nNum != 0) { + ili_set_bypass_mode(mcu); + } + } else { + mode = AP; + } + + /* backup dma1 parameter */ + ili_get_dma1_config(&dma1); + + /* Program data to iram acorrding to each block */ + for (i = 0; i < FW_BLOCK_INFO_NUM; i++) { + if (fbi[i].mode == mode && fbi[i].len != 0) { + ILI_DBG("Download %s code from hex 0x%x to IRAM 0x%x, len = 0x%x\n", + fbi[i].name, fbi[i].start, fbi[i].mem_start, fbi[i].len); + + if (ilitek_tddi_fw_iram_program(fbi[i].mem_start, (fw_ptr + fbi[i].start), fbi[i].len, SPI_UPGRADE_LEN) < 0) + ILI_ERR("IRAM program failed\n"); + + crc = CalculateCRC32(fbi[i].start, fbi[i].len - crc_len, fw_ptr); + dma = calc_hw_dma_crc(fbi[i].mem_start, fbi[i].len - crc_len); + + if (mode != GESTURE) { + ilitek_tddi_fw_iram_read(crc_temp, (fbi[i].mem_start + fbi[i].len - crc_len), sizeof(crc_temp)); + iram_crc = crc_temp[0] << 24 | crc_temp[1] << 16 | crc_temp[2] << 8 | crc_temp[3]; + if (iram_crc != dma) + iram_crc_err = true; + } + + ILI_INFO("%s CRC is %s hex(%x) : dma(%x) : iram(%x), calculation len is 0x%x\n", + fbi[i].name, ((crc != dma) || (iram_crc_err)) ? "Invalid !" : "Correct !", crc, dma, iram_crc, fbi[i].len - crc_len); + + if (ilits->cascade_info_block.nNum != 0) { + ili_mspi_read_slave_register(DMA_CRC_ADDR, &slave_crc, sizeof(u32)); + if (ili_ice_mode_write_by_mode(MSPI_REG, 0x00, 1, MASTER) < 0) + ILI_ERR("Failed to write MSPI_REG in ice mode\n"); + + ILI_INFO("Slave %s CRC is %s hex(%x) : dma(%x) : iram(%x)\n", + fbi[i].name, ((slave_crc != dma) || (iram_crc_err)) ? "Invalid !" : "Correct !", slave_crc, dma, iram_crc); + + if ((crc != dma) || (slave_crc != dma) || iram_crc_err) { + ILI_ERR("CRC Error! print iram data with first 16 bytes\n"); + ili_fw_dump_iram_data(0x0, 0xF, false, OFF); + return -EFW_CRC; + } + } else { + if ((crc != dma) || iram_crc_err) { + ILI_ERR("CRC Error! print iram data with first 16 bytes\n"); + ili_fw_dump_iram_data(0x0, 0xF, false, OFF); + return -EFW_CRC; + } + } + } + } + + /* recovery dma1 parameter */ + ILI_INFO("recovery DMA 1 parameters\n"); + ili_set_dma1_config(&dma1); + + if (ilits->actual_tp_mode != P5_X_FW_GESTURE_MODE) { + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(TP_IC_WHOLE_RST_WITHOUT_FLASH, false) < 0) { + ILI_ERR("TP cascade Whole reset without flash failed during iram programming\n"); + ret = -EFW_REST; + return ret; + } + } else { + if (ili_reset_ctrl(TP_IC_WHOLE_RST_WITHOUT_FLASH) < 0) { + ILI_ERR("TP Whole reset without flash failed during iram programming\n"); + ret = -EFW_REST; + return ret; + } + } + } + + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) { + ILI_ERR("Disable ice mode failed after code reset\n"); + ret = -EFW_ICE_MODE; + } + + mdelay(20); + + return ret; +} + +static int ilitek_fw_calc_file_crc(u8 *pfw) +{ + int i, block_num = 0; + u32 ex_addr, data_crc, file_crc; + + for (i = 0; i < ARRAY_SIZE(fbi); i++) { + if (fbi[i].len >= MAX_HEX_FILE_SIZE) { + ILI_ERR("Content of fw file is invalid. (fbi[%d].len=0x%x)\n", + i, fbi[i].len); + return -1; + } + + if (fbi[i].end <= 4) + continue; + block_num++; + ex_addr = fbi[i].end; + data_crc = CalculateCRC32(fbi[i].start, fbi[i].len - 4, pfw); + file_crc = pfw[ex_addr - 3] << 24 | pfw[ex_addr - 2] << 16 | pfw[ex_addr - 1] << 8 | pfw[ex_addr]; + ILI_DBG("data crc = %x, file crc = %x\n", data_crc, file_crc); + if (data_crc != file_crc) { + ILI_ERR("Content of fw file is broken. (%d, %x, %x)\n", + i, data_crc, file_crc); + return -1; + } + } + + if (fbi[MP].end <= 1 * K || fbi[AP].end <= 1 * K || (block_num == 0)) { + ILI_ERR("Content of fw file is broken. fbi[AP].end = 0x%x, fbi[MP].end = 0x%x, block_num = %d\n", + fbi[AP].end, fbi[MP].end, block_num); + return -1; + } + + ILI_INFO("Content of fw file is correct\n"); + return 0; +} + +static int ilitek_tddi_fw_update_block_info(u8 *pfw) +{ + u32 ges_area_section = 0, ges_info_addr = 0, ges_fw_start = 0, ges_fw_end = 0; + u32 ap_end = 0, ap_len = 0; + u32 fw_info_addr = 0, fw_mp_ver_addr = 0; + + if (tfd.hex_tag != BLOCK_TAG_AF) { + ILI_ERR("HEX TAG is invalid (0x%X)\n", tfd.hex_tag); + return -EINVAL; + } + + fbi[AP].mem_start = (fbi[AP].fix_mem_start != INT_MAX) ? fbi[AP].fix_mem_start : 0; + fbi[DATA].mem_start = (fbi[DATA].fix_mem_start != INT_MAX) ? fbi[DATA].fix_mem_start : DLM_START_ADDRESS; + fbi[TUNING].mem_start = (fbi[TUNING].fix_mem_start != INT_MAX) ? fbi[TUNING].fix_mem_start : fbi[DATA].mem_start + fbi[DATA].len; + fbi[MP].mem_start = (fbi[MP].fix_mem_start != INT_MAX) ? fbi[MP].fix_mem_start : 0; + fbi[GESTURE].mem_start = (fbi[GESTURE].fix_mem_start != INT_MAX) ? fbi[GESTURE].fix_mem_start : 0; + fbi[TAG].mem_start = (fbi[TAG].fix_mem_start != INT_MAX) ? fbi[TAG].fix_mem_start : 0; + fbi[PARA_BACKUP].mem_start = (fbi[PARA_BACKUP].fix_mem_start != INT_MAX) ? fbi[PARA_BACKUP].fix_mem_start : 0; + fbi[DDI].mem_start = (fbi[DDI].fix_mem_start != INT_MAX) ? fbi[DDI].fix_mem_start : 0; + fbi[PEN].mem_start = (fbi[PEN].fix_mem_start != INT_MAX) ? fbi[PEN].fix_mem_start : 0; + + /* Parsing gesture info form AP code */ + ges_info_addr = (fbi[AP].end + 1 - 60); + ges_area_section = (pfw[ges_info_addr + 3] << 24) + (pfw[ges_info_addr + 2] << 16) + (pfw[ges_info_addr + 1] << 8) + pfw[ges_info_addr]; + fbi[GESTURE].mem_start = (pfw[ges_info_addr + 7] << 24) + (pfw[ges_info_addr + 6] << 16) + (pfw[ges_info_addr + 5] << 8) + pfw[ges_info_addr + 4]; + ap_end = (pfw[ges_info_addr + 11] << 24) + (pfw[ges_info_addr + 10] << 16) + (pfw[ges_info_addr + 9] << 8) + pfw[ges_info_addr + 8]; + + if (ap_end != fbi[GESTURE].mem_start) + ap_len = ap_end - fbi[GESTURE].mem_start + 1; + + ges_fw_start = (pfw[ges_info_addr + 15] << 24) + (pfw[ges_info_addr + 14] << 16) + (pfw[ges_info_addr + 13] << 8) + pfw[ges_info_addr + 12]; + ges_fw_end = (pfw[ges_info_addr + 19] << 24) + (pfw[ges_info_addr + 18] << 16) + (pfw[ges_info_addr + 17] << 8) + pfw[ges_info_addr + 16]; + + if (ges_fw_end != ges_fw_start) + fbi[GESTURE].len = ges_fw_end - ges_fw_start; + + /* update gesture address */ + fbi[GESTURE].start = ges_fw_start; + + ILI_INFO("==== Gesture loader info ====\n"); + ILI_INFO("gesture move to ap addr => start = 0x%x, ap_end = 0x%x, ap_len = 0x%x\n", fbi[GESTURE].mem_start, ap_end, ap_len); + ILI_INFO("gesture hex addr => start = 0x%x, gesture_end = 0x%x, gesture_len = 0x%x\n", ges_fw_start, ges_fw_end, fbi[GESTURE].len); + ILI_INFO("=============================\n"); + + fbi[AP].name = "AP"; + fbi[DATA].name = "DATA"; + fbi[TUNING].name = "TUNING"; + fbi[MP].name = "MP"; + fbi[GESTURE].name = "GESTURE"; + fbi[TAG].name = "TAG"; + fbi[PARA_BACKUP].name = "PARA_BACKUP"; + fbi[DDI].name = "DDI"; + fbi[PEN].name = "PEN"; + + /* upgrade mode define */ + fbi[DATA].mode = fbi[AP].mode = fbi[TUNING].mode = AP; + fbi[PEN].mode = AP; + fbi[MP].mode = MP; + fbi[GESTURE].mode = GESTURE; + + if (fbi[AP].end > (64*K)) + tfd.is80k = true; + + /* Copy fw info */ + fw_info_addr = fbi[AP].end - INFO_HEX_ST_ADDR; + ILI_INFO("Parsing hex info start addr = 0x%x\n", fw_info_addr); + ipio_memcpy(ilits->fw_info, (pfw + fw_info_addr), sizeof(ilits->fw_info), sizeof(ilits->fw_info)); + + /* copy fw mp ver */ + fw_mp_ver_addr = fbi[MP].end - INFO_MP_HEX_ADDR; + ILI_INFO("Parsing hex mp ver addr = 0x%x\n", fw_mp_ver_addr); + ipio_memcpy(ilits->fw_mp_ver, pfw + fw_mp_ver_addr, sizeof(ilits->fw_mp_ver), sizeof(ilits->fw_mp_ver)); + + /* copy fw core ver */ + ilits->chip->core_ver = (ilits->fw_info[68] << 24) | (ilits->fw_info[69] << 16) | + (ilits->fw_info[70] << 8) | ilits->fw_info[71]; + ILI_INFO("New FW Core version = %x\n", ilits->chip->core_ver); + + /* Get hex fw vers */ + tfd.new_fw_cb = (ilits->fw_info[48] << 24) | (ilits->fw_info[49] << 16) | + (ilits->fw_info[50] << 8) | ilits->fw_info[51]; + + /* Get hex report info block*/ + ipio_memcpy(&ilits->rib, ilits->fw_info, sizeof(ilits->rib), sizeof(ilits->rib)); + /*1 byte, Resolution 0-2 bits, CustomType 3-5 bits, PenType 6-7 bits*/ + ilits->rib.nReportResolutionMode = (ilits->chip->core_ver >= CORE_VER_1470) ? (ilits->rib.nReportResolutionMode & 0x07) : POSITION_LOW_RESOLUTION; + ilits->PenType = (ilits->chip->core_ver >= CORE_VER_1700) ? (ilits->rib.nCustomerType >> 3) : POSITION_PEN_TYPE_OFF; + + if (ilits->chip->core_ver >= CORE_VER_1700) { + /*CustomerType 3 bits*/ + ilits->rib.nCustomerType = ilits->rib.nCustomerType & 0x07; + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF_3BITS; + } else { + /*CustomerType 5 bits*/ + ilits->rib.nCustomerType = (ilits->chip->core_ver >= CORE_VER_1470) ? ilits->rib.nCustomerType : POSITION_CUSTOMER_TYPE_OFF; + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF; + } + + ILI_INFO("report_info_block : nReportByPixel = %d, nIsHostDownload = %d, nIsSPIICE = %d, nIsSPISLAVE = %d, nIsI2C = %d\n", + ilits->rib.nReportByPixel, ilits->rib.nIsHostDownload, ilits->rib.nIsSPIICE, ilits->rib.nIsSPISLAVE, ilits->rib.nIsI2C); + + ILI_INFO("report_info_block : nReserved00 = %d, nReportResolutionMode = %d, nCustomerType = %d, nReserved02 = %x, nReserved03 = %x\n", + ilits->rib.nReserved00, ilits->rib.nReportResolutionMode, ilits->rib.nCustomerType, ilits->rib.nReserved02, ilits->rib.nReserved03); + + + ILI_INFO("PenType = 0x%x, Customer Type OFF = 0x%x\n", ilits->PenType, ilits->customertype_off); + +#if ENABLE_PEN_MODE + /* Get hex Pen info block*/ + fw_info_addr = fbi[AP].end - INFO_PEN_ST_ADDR; + ILI_INFO("Parsing pen info block start addr = 0x%x\n", fw_info_addr); + ipio_memcpy(&ilits->pen_info_block, (pfw + fw_info_addr), sizeof(ilits->pen_info_block), sizeof(ilits->pen_info_block)); + + ILI_INFO("pen_info_block : nPxRaw = %d, nPyRaw = %d, nPxVa = %d,nPyVa = %d, nReserved0 = %d, nReserved01 = %d, nReserved2 = %d, nReserved03 = %d\n", + ilits->pen_info_block.nPxRaw, ilits->pen_info_block.nPyRaw, ilits->pen_info_block.nPxVa, ilits->pen_info_block.nPyVa, ilits->pen_info_block.nReserved00, ilits->pen_info_block.nReserved01, ilits->pen_info_block.nReserved02, ilits->pen_info_block.nReserved03); +#endif + +#if ENABLE_CASCADE + /* Get hex Cascade info block*/ + fw_info_addr = fbi[AP].end - INFO_CASCADE_ST_ADDR; + ILI_INFO("Parsing cascade info block start addr = 0x%x\n", fw_info_addr); + ipio_memcpy(&ilits->cascade_info_block, (pfw + fw_info_addr), sizeof(ilits->cascade_info_block), sizeof(ilits->cascade_info_block)); + + ILI_INFO("cascade_info_block : nDisable = %d, nNum = %d, nReserved0 = %d, nReserved1 = %d, nReserved2 = %d, nReserved03 = %d\n", + ilits->cascade_info_block.nDisable, ilits->cascade_info_block.nNum, ilits->cascade_info_block.nReserved00, ilits->cascade_info_block.nReserved01, ilits->cascade_info_block.nReserved02, ilits->cascade_info_block.nReserved03); +#else + ilits->cascade_info_block.nDisable = ENABLE; + ilits->cascade_info_block.nNum = 0; + ILI_INFO("cascade_info_block : nDisable = %d, nNum = %d\n", ilits->cascade_info_block.nDisable, ilits->cascade_info_block.nNum); +#endif + + /* Calculate update address */ + ILI_INFO("New FW ver = 0x%x\n", tfd.new_fw_cb); + ILI_INFO("star_addr = 0x%06X, end_addr = 0x%06X, Block Num = %d\n", tfd.start_addr, tfd.end_addr, tfd.block_number); + + return 0; +} + +static int ilitek_tddi_fw_ili_convert(u8 *pfw) +{ + int i, size, blk_num = 0, blk_map = 0, num; + int b0_addr = 0, b0_num = 0; + + if (ERR_ALLOC_MEM(ilits->md_fw_ili)) + return -ENOMEM; + + CTPM_FW = ilits->md_fw_ili; + size = ilits->md_fw_ili_size; + + if (size < ILI_FILE_HEADER || size > (MAX_HEX_FILE_SIZE + ILI_FILE_HEADER)) { + ILI_ERR("size of ILI file is invalid\n"); + return -EINVAL; + } + + /* Check if it's old version of ILI format. */ + if (CTPM_FW[22] == 0xFF && CTPM_FW[23] == 0xFF && + CTPM_FW[24] == 0xFF && CTPM_FW[25] == 0xFF) { + ILI_ERR("Invaild ILI format, abort!\n"); + return -EINVAL; + } + + blk_num = CTPM_FW[131]; + blk_map = (CTPM_FW[129] << 8) | CTPM_FW[130]; + ILI_INFO("Parsing ILI file, block num = %d, block mapping = %x\n", blk_num, blk_map); + + if (blk_num > (FW_BLOCK_INFO_NUM - 1) || !blk_num || !blk_map) { + ILI_ERR("Number of block or block mapping is invalid, abort!\n"); + return -EINVAL; + } + + memset(fbi, 0x0, sizeof(fbi)); + + tfd.start_addr = 0; + tfd.end_addr = 0; + tfd.hex_tag = BLOCK_TAG_AF; + + /* Parsing block info */ + for (i = 0; i < FW_BLOCK_INFO_NUM; i++) { + /* B0 tag */ + b0_addr = (CTPM_FW[4 + i * 4] << 16) | (CTPM_FW[5 + i * 4] << 8) | (CTPM_FW[6 + i * 4]); + b0_num = CTPM_FW[7 + i * 4]; + if ((b0_num != 0) && (b0_addr != 0x000000)) + fbi[b0_num].fix_mem_start = b0_addr; + + /* AF tag */ + num = i + 1; + if (num >= FW_BLOCK_INFO_NUM) + break; + if (((blk_map >> i) & 0x01) == 0x01) { + fbi[num].start = (CTPM_FW[132 + i * 6] << 16) | (CTPM_FW[133 + i * 6] << 8) | CTPM_FW[134 + i * 6]; + fbi[num].end = (CTPM_FW[135 + i * 6] << 16) | (CTPM_FW[136 + i * 6] << 8) | CTPM_FW[137 + i * 6]; + + if (fbi[num].fix_mem_start == 0) + fbi[num].fix_mem_start = INT_MAX; + + fbi[num].len = fbi[num].end - fbi[num].start + 1; + ILI_DBG("Block[%d]: start_addr = %x, end = %x, fix_mem_start = 0x%x\n", num, fbi[num].start, + fbi[num].end, fbi[num].fix_mem_start); + if (num == GESTURE) + ilits->gesture_load_code = true; + } + } + + memcpy(pfw, CTPM_FW + ILI_FILE_HEADER, size - ILI_FILE_HEADER); + + if (ilitek_fw_calc_file_crc(pfw) < 0) + return -1; + + tfd.block_number = blk_num; + tfd.end_addr = size - ILI_FILE_HEADER; + return 0; +} + +static int ilitek_tddi_fw_hex_convert(u8 *phex, int size, u8 *pfw) +{ + int block = 0; + u32 i = 0, j = 0, k = 0, num = 0; + u32 len = 0, addr = 0, type = 0; + u32 start_addr = 0x0, end_addr = 0x0, ex_addr = 0; + u32 offset; + + memset(fbi, 0x0, sizeof(fbi)); + + /* Parsing HEX file */ + for (; i < size;) { + len = HexToDec(&phex[i + 1], 2); + addr = HexToDec(&phex[i + 3], 4); + type = HexToDec(&phex[i + 7], 2); + + if (type == 0x04) { + ex_addr = HexToDec(&phex[i + 9], 4); + } else if (type == 0x02) { + ex_addr = HexToDec(&phex[i + 9], 4); + ex_addr = ex_addr >> 12; + } else if (type == BLOCK_TAG_AF) { + /* insert block info extracted from hex */ + tfd.hex_tag = type; + if (tfd.hex_tag == BLOCK_TAG_AF) + num = HexToDec(&phex[i + 9 + 6 + 6], 2); + else + num = 0xFF; + + if (num > (FW_BLOCK_INFO_NUM - 1)) { + ILI_ERR("ERROR! block num is larger than its define (%d, %d)\n", + num, FW_BLOCK_INFO_NUM - 1); + return -EINVAL; + } + + fbi[num].start = HexToDec(&phex[i + 9], 6); + fbi[num].end = HexToDec(&phex[i + 9 + 6], 6); + fbi[num].fix_mem_start = INT_MAX; + fbi[num].len = fbi[num].end - fbi[num].start + 1; + ILI_DBG("Block[%d]: start_addr = %x, end = %x", num, fbi[num].start, fbi[num].end); + + if (num == GESTURE) + ilits->gesture_load_code = true; + + block++; + } else if (type == BLOCK_TAG_B0 && tfd.hex_tag == BLOCK_TAG_AF) { + num = HexToDec(&phex[i + 9 + 6], 2); + + if (num > (FW_BLOCK_INFO_NUM - 1)) { + ILI_ERR("ERROR! block num is larger than its define (%d, %d)\n", + num, FW_BLOCK_INFO_NUM - 1); + return -EINVAL; + } + + fbi[num].fix_mem_start = HexToDec(&phex[i + 9], 6); + ILI_DBG("Tag 0xB0: change Block[%d] to addr = 0x%x\n", num, fbi[num].fix_mem_start); + } + + addr = addr + (ex_addr << 16); + + if (phex[i + 1 + 2 + 4 + 2 + (len * 2) + 2] == 0x0D) + offset = 2; + else + offset = 1; + + if (addr >= MAX_HEX_FILE_SIZE) { + ILI_ERR("Invalid hex format %d\n", addr); + return -1; + } + + if (type == 0x00) { + end_addr = addr + len; + if (addr < start_addr) + start_addr = addr; + /* fill data */ + for (j = 0, k = 0; j < (len * 2); j += 2, k++) + pfw[addr + k] = HexToDec(&phex[i + 9 + j], 2); + } + i += 1 + 2 + 4 + 2 + (len * 2) + 2 + offset; + } + + if (ilitek_fw_calc_file_crc(pfw) < 0) + return -1; + + tfd.start_addr = start_addr; + tfd.end_addr = end_addr; + tfd.block_number = block; + return 0; +} + +static int ilitek_tdd_fw_hex_open(u8 op, u8 *pfw) +{ + int ret = 0, fsize = 0; + const struct firmware *fw = NULL; +#if (!GENERIC_KERNEL_IMAGE) +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t old_fs; +#endif + struct file *f = NULL; + loff_t pos = 0; +#endif + + ILI_INFO("Open file method = %s, path = %s\n", + op ? "FILP_OPEN" : "REQUEST_FIRMWARE", + op ? ilits->md_fw_filp_path : ilits->md_fw_rq_path); + + switch (op) { + case REQUEST_FIRMWARE: + if (request_firmware(&fw, ilits->md_fw_rq_path, ilits->dev) < 0) { + ILI_ERR("Request firmware failed, try again\n"); + if (request_firmware(&fw, ilits->md_fw_rq_path, ilits->dev) < 0) { + ILI_ERR("Request firmware failed after retry\n"); + ret = -1; + goto out; + } + } + + fsize = fw->size; + ILI_INFO("fsize = %d\n", fsize); + if (fsize <= 0) { + ILI_ERR("The size of file is invaild\n"); + release_firmware(fw); + ret = -1; + goto out; + } + + ilits->tp_fw.size = 0; + ilits->tp_fw.data = vmalloc(fsize); + if (ERR_ALLOC_MEM(ilits->tp_fw.data)) { + ILI_ERR("Failed to allocate tp_fw by vmalloc, try again\n"); + ilits->tp_fw.data = vmalloc(fsize); + if (ERR_ALLOC_MEM(ilits->tp_fw.data)) { + ILI_ERR("Failed to allocate tp_fw after retry\n"); + release_firmware(fw); + ret = -ENOMEM; + goto out; + } + } + + /* Copy fw data got from request_firmware to global */ + ipio_memcpy((u8 *)ilits->tp_fw.data, fw->data, fsize * sizeof(*fw->data), fsize); + ilits->tp_fw.size = fsize; + release_firmware(fw); + break; + case FILP_OPEN: +#if GENERIC_KERNEL_IMAGE + ILI_ERR("GKI version not allow drivers to use filp_open\n"); + return -1; +#if 0 + ilits->tp_fw.data = NULL; + ret = kernel_read_file_from_path(ilits->md_fw_filp_path, 0, (void **)&ilits->tp_fw.data, INT_MAX, &ilits->tp_fw.size, + READING_POLICY); + if (ret < 0 || (ilits->tp_fw.data == NULL)) { + ILI_ERR("Unable to open file: %s (%d)", ilits->md_fw_filp_path, ret); + goto out; + } + + ILI_INFO("fsize = %d\n", (int)ilits->tp_fw.size); +#endif +#else + f = filp_open(ilits->md_fw_filp_path, O_RDONLY, 0644); + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open the file, %ld\n", PTR_ERR(f)); + ret = -1; + goto out; + } + + fsize = f->f_inode->i_size; + ILI_INFO("fsize = %d\n", fsize); + if (fsize <= 0) { + ILI_ERR("The size of file is invaild\n"); + filp_close(f, NULL); + ret = -1; + goto out; + } + + ipio_vfree((void **)&(ilits->tp_fw.data)); + ilits->tp_fw.size = 0; + ilits->tp_fw.data = vmalloc(fsize); + if (ERR_ALLOC_MEM(ilits->tp_fw.data)) { + ILI_ERR("Failed to allocate tp_fw by vmalloc, try again\n"); + ilits->tp_fw.data = vmalloc(fsize); + if (ERR_ALLOC_MEM(ilits->tp_fw.data)) { + ILI_ERR("Failed to allocate tp_fw after retry\n"); + filp_close(f, NULL); + ret = -ENOMEM; + goto out; + } + } + + /* ready to map user's memory to obtain data by reading files */ + pos = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + old_fs = get_fs(); + set_fs(KERNEL_DS); + vfs_read(f, (u8 *)ilits->tp_fw.data, fsize, &pos); + set_fs(old_fs); +#else + kernel_read(f, (u8 *)ilits->tp_fw.data, fsize, &pos); +#endif + filp_close(f, NULL); + ilits->tp_fw.size = fsize; +#endif + break; + default: + ILI_ERR("Unknown open file method, %d\n", op); + break; + } + + if (ERR_ALLOC_MEM(ilits->tp_fw.data) || ilits->tp_fw.size <= 0) { + ILI_ERR("fw data/size is invaild\n"); + ret = -1; + goto out; + } + + /* Convert hex and copy data from tp_fw.data to pfw */ + if (ilitek_tddi_fw_hex_convert((u8 *)ilits->tp_fw.data, ilits->tp_fw.size, pfw) < 0) { + ILI_ERR("Convert hex file failed\n"); + ret = -1; + } + +out: + ipio_vfree((void **)&(ilits->tp_fw.data)); + return ret; +} + +int ili_fw_upgrade(int op) +{ + int i, ret = 0, retry = 3; + static bool get_firmware; + + if (!ilits->boot || ilits->force_fw_update || ERR_ALLOC_MEM(pfw)) { + ilits->gesture_load_code = false; + get_firmware = false; + + if (ERR_ALLOC_MEM(pfw)) { + ipio_vfree((void **)&pfw); + pfw = vmalloc(MAX_HEX_FILE_SIZE * sizeof(u8)); + if (ERR_ALLOC_MEM(pfw)) { + ILI_ERR("Failed to allocate pfw memory, %ld\n", PTR_ERR(pfw)); + ipio_vfree((void **)&pfw); + ret = -ENOMEM; + goto out; + } + } + + for (i = 0; i < MAX_HEX_FILE_SIZE; i++) + pfw[i] = 0xFF; + + if (ilitek_tdd_fw_hex_open(op, pfw) < 0) { + ILI_ERR("Open hex file fail, try upgrade from ILI file\n"); + + /* + * Users might not be aware of a broken hex file when recovering + * fw from ILI file. We should force them to check + * hex files if they attempt to update via device node. + */ + if (ilits->node_update) { + ILI_ERR("Ignore update from ILI file\n"); + ipio_vfree((void **)&pfw); + return -EFW_CONVERT_FILE; + } + + if (ilitek_tddi_fw_ili_convert(pfw) < 0) { + ILI_ERR("Convert ILI file error\n"); + ret = -EFW_CONVERT_FILE; + goto out; + } + } + + if (ilitek_tddi_fw_update_block_info(pfw) < 0) { + ret = -EFW_CONVERT_FILE; + goto out; + } + + if (ilits->chip->core_ver >= CORE_VER_1470 && ilits->rib.nIsHostDownload == 0) { + ILI_ERR("hex file interface no match error\n"); + return -EFW_INTERFACE; + } + get_firmware = true; + } + + if (!get_firmware) { + ILI_ERR("Convert ILI file error\n"); + return -EFW_CONVERT_FILE; + } + +#if (ENGINEER_FLOW) + if (!ilits->eng_flow) { + do { + ret = ilitek_tddi_fw_iram_upgrade(pfw, OFF); + if (ret == UPDATE_PASS) + break; + + ILI_ERR("Upgrade failed, do retry!\n"); + } while (--retry > 0); + + if (ret != UPDATE_PASS) { + ILI_ERR("Failed to upgrade fw %d times, erasing iram\n", retry); + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, false) < 0) + ILI_ERR("TP cascade reset failed while erasing data\n"); + } else { + ili_reset_ctrl(ilits->reset); + } + ilits->xch_num = 0; + ilits->ych_num = 0; + return ret; + } + } else { + ILI_ERR("eng_flow do reset!\n"); + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, true) < 0) + ILI_ERR("TP cascade reset failed while erasing data\n"); + } else { + ili_reset_ctrl(ilits->reset); + } + mdelay(50); + } +#else + do { + ret = ilitek_tddi_fw_iram_upgrade(pfw, OFF); + if (ret == UPDATE_PASS) + break; + + ILI_ERR("Upgrade failed, do retry!\n"); + } while (--retry > 0); + + if (ret != UPDATE_PASS) { + ILI_ERR("Failed to upgrade fw %d times, erasing iram\n", retry); + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(ilits->reset, false) < 0) + ILI_ERR("TP cascade reset failed while erasing data\n"); + } else { + ili_reset_ctrl(ilits->reset); + } + + ilits->xch_num = 0; + ilits->ych_num = 0; + return ret; + } +#endif +out: + if (!ilits->info_from_hex) + ili_irq_enable(); + ili_ic_get_all_info(); + ili_ic_func_ctrl_reset(); + + return ret; +} + +void ili_fw_read_flash_info(bool mcu) +{ + return; +} +void ilitek_tddi_flash_protect(bool enable, bool mcu) +{ + return; +} + +void ili_flash_clear_dma(void) +{ + return; +} + +void ili_flash_dma_write(u32 start, u32 end, u32 len) +{ + return; +} + +int ili_fw_dump_flash_data(u32 start, u32 end, bool user, bool mcu) +{ + return 0; +} diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_i2c.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_i2c.c new file mode 100644 index 000000000000..f348a2f356e0 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_i2c.c @@ -0,0 +1,504 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" + +struct touch_bus_info { + struct i2c_driver bus_driver; + struct ilitek_hwif_info *hwif; +}; + +struct ilitek_ts_data *ilits; + +#define RW_SYNC 0 +#define R_ONLY 1 +#define W_ONLY 2 + +#if I2C_DMA_TRANSFER +static unsigned char *ilitek_dma_va; +static dma_addr_t ilitek_dma_pa; + +#define DMA_VA_BUFFER 4096 + +static int dma_i2c_alloc(struct i2c_client *client) +{ + if (client != NULL) { + client->dev.coherent_dma_mask = DMA_BIT_MASK(32); + ilitek_dma_va = (u8 *)dmam_alloc_coherent(client->dev, DMA_VA_BUFFER, &ilitek_dma_pa, GFP_KERNEL); + if (ERR_ALLOC_MEM(ilitek_dma_va)) { + ILI_ERR("Allocate DMA I2C Buffer failed\n"); + return -ENOMEM; + } + + memset(ilitek_dma_va, 0, DMA_VA_BUFFER); + client->ext_flag |= I2C_DMA_FLAG; + return 0; + } + + ILI_ERR("client is NULL, allocated dma i2c failed\n"); + return -ENODEV; +} +#endif + +static int core_i2c_write(void *buf, int len) +{ + int ret = 0; + u8 *txbuf = (u8 *)buf; + u8 check_sum = 0; + u8 *mpbuf = NULL; + + struct i2c_msg msgs[] = { + { + .addr = ilits->i2c->addr, + .flags = 0, /* write flag. */ + .len = len, + .buf = txbuf, + }, + }; + +#if I2C_DMA_TRANSFER + if (len > 8) { + msgs[0].addr = (ilits->i2c->addr & I2C_MASK_FLAG); + msgs[0].ext_flag = (ilits->i2c->ext_flag | I2C_ENEXT_FLAG | I2C_DMA_FLAG); + memcpy(ilitek_dma_va, txbuf, len); + msgs[0].buf = (u8 *)ilitek_dma_pa; + } +#endif + + + /* + * NOTE: If TP driver is doing MP test and commanding 0xF1 to FW, we add a checksum + * to the last index and plus 1 with size. + */ + if (atomic_read(&ilits->mp_stat) && txbuf[0] == P5_X_SET_CDC_INIT) { + check_sum = ili_calc_packet_checksum(txbuf, len); + mpbuf = kcalloc(len + 1, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(mpbuf)) { + ILI_ERR("Failed to allocate mpbuf mem\n"); + return -ENOMEM; + } + ipio_memcpy(mpbuf, txbuf, len, msgs[0].len); + mpbuf[len] = check_sum; + msgs[0].buf = mpbuf; + ili_dump_data(mpbuf, 8, len+1, 0, "mp cdc cmd"); + msgs[0].len = len + 1; + } + + if (i2c_transfer(ilits->i2c->adapter, msgs, 1) != 1) + ret = -1; + + if (!atomic_read(&ilits->ice_stat)) + mdelay(1); + + ipio_kfree((void **)&mpbuf); + return ret; +} + +static int core_i2c_read(void *buf, int len) +{ + int ret; + u8 *rxbuf = (u8 *)buf; + + struct i2c_msg msgs[] = { + { + .addr = ilits->i2c->addr, + .flags = I2C_M_RD, /* read flag. */ + .len = len, + .buf = rxbuf, + }, + }; + + +#if I2C_DMA_TRANSFER + if (len > 8) { + msgs[0].addr = (ilits->i2c->addr & I2C_MASK_FLAG); + msgs[0].ext_flag = (ilits->i2c->ext_flag | I2C_ENEXT_FLAG | I2C_DMA_FLAG); + msgs[0].buf = (u8 *)ilitek_dma_pa; + } else { + msgs[0].buf = rxbuf; + } +#endif + + + ret = i2c_transfer(ilits->i2c->adapter, msgs, 1); + +#if I2C_DMA_TRANSFER + if (len > 8) + memcpy(rxbuf, ilitek_dma_va, len); +#endif + + /* + * If i2c_transfer is ok (must return 1 because only sends one msg), + * return #bytes transferred, else error code. + */ + return (ret == 1) ? len : ret; +} + +static int ilitek_i2c_write(void *buf, int len) +{ + int ret = 0; + + if (len == 0) { + ILI_ERR("i2c write len is invalid\n"); + return -EINVAL; + } + + ret = core_i2c_write(buf, len); + if (ret < 0) { + if (atomic_read(&ilits->tp_reset) == START) { + ret = 0; + goto out; + } + ILI_ERR("i2c write error, ret = %d\n", ret); + } + +out: + return ret; +} + +static int ilitek_i2c_read(void *buf, int len) +{ + int ret = 0; + + if (len == 0) { + ILI_ERR("i2c read len is invalid\n"); + return -EINVAL; + } + + ret = core_i2c_read(buf, len); + if (ret < 0) { + if (atomic_read(&ilits->tp_reset) == START) { + ret = 0; + goto out; + } + ILI_ERR("i2c read error, ret = %d\n", ret); + } + +out: + return ret; +} + +static int ili_i2c_pll_clk_wakeup(void) +{ + int ret = 0; + u8 wakeup = 0xA3; +#if (PLL_CLK_WAKEUP_TP_RESUME == ENABLE) + if (ilits->pll_clk_wakeup == true) { +#else + if ((ilits->pll_clk_wakeup == true) && (ilits->tp_suspend == true)) { +#endif + ret = ilitek_i2c_write(&wakeup, sizeof(wakeup)); + if (ret < 0) + ILI_ERR("i2c write dummy cmd error\n"); + } + return ret; +} + +static int ili_i2c_wrapper(u8 *txbuf, u32 wlen, u8 *rxbuf, u32 rlen, bool spi_irq, bool i2c_irq) +{ + int ret = 0, operate = -1; + + if (wlen > 0) { + if (ERR_ALLOC_MEM(txbuf)) { + ILI_ERR("txbuf is null\n"); + return -ENOMEM; + } + } + + if (rlen > 0) { + if (ERR_ALLOC_MEM(rxbuf)) { + ILI_ERR("rxbuf is null\n"); + return -ENOMEM; + } + } + +#if ENABLE_CASCADE + if (ilits->i2c_addr_change == SLAVE) { + ilits->i2c->addr = TDDI_I2C_SLAVE_ADDR; + } else { + ilits->i2c->addr = TDDI_I2C_ADDR; + } +#endif + + if (wlen > 0 && rlen > 0) + operate = RW_SYNC; + else if (wlen > 0 && !rlen) + operate = W_ONLY; + else + operate = R_ONLY; + + if (ilits->int_pulse) + ilits->detect_int_stat = ili_ic_check_int_pulse; + else + ilits->detect_int_stat = ili_ic_check_int_level; + + if (i2c_irq) + atomic_set(&ilits->cmd_int_check, ENABLE); + + switch (operate) { + case RW_SYNC: + ret = ili_i2c_pll_clk_wakeup(); + if (ret < 0) { + ILI_ERR("i2c-wrapper dummy cmd write error\n"); + } + ret = ilitek_i2c_write(txbuf, wlen); + if (ret < 0) { + ILI_ERR("i2c-wrapper write error\n"); + break; + } + + if (i2c_irq) { + if (ilits->detect_int_stat(false) < 0) { + ILI_ERR("ERROR! Check INT timeout\n"); + ret = -ETIME; + break; + } + } else { + msleep(1); + } + + ret = ilitek_i2c_read(rxbuf, rlen); + if (ret < 0) { + ILI_ERR("i2c-wrapper read error\n"); + break; + } + break; + case W_ONLY: + ret = ili_i2c_pll_clk_wakeup(); + if (ret < 0) { + ILI_ERR("i2c-wrapper dummy cmd write error\n"); + } + ret = ilitek_i2c_write(txbuf, wlen); + if (ret < 0) { + ILI_ERR("i2c-wrapper write error\n"); + break; + } + break; + case R_ONLY: + if (i2c_irq) { + if (ilits->detect_int_stat(false) < 0) { + ILI_ERR("ERROR! Check INT timeout\n"); + ret = -ETIME; + break; + } + } + + ret = ilitek_i2c_read(rxbuf, rlen); + if (ret < 0) { + ILI_ERR("i2c-wrapper read error\n"); + break; + } + break; + default: + ILI_ERR("Unknown ts-i2c operation\n"); + ret = -EINVAL; + break; + } + + if (i2c_irq) + atomic_set(&ilits->cmd_int_check, DISABLE); + + return ret; +} + +int ili_core_spi_setup(int num) +{ + ILI_ERR("Not support this interface\n"); + return 0; +} + +static int ilitek_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) +{ + struct touch_bus_info *info = + container_of(to_i2c_driver(i2c->dev.driver), + struct touch_bus_info, bus_driver); + + ILI_INFO("ilitek i2c probe\n"); + + if (!i2c) { + ILI_ERR("i2c client is NULL\n"); + return -ENODEV; + } + + if (i2c->addr != TDDI_I2C_ADDR) { + i2c->addr = TDDI_I2C_ADDR; + ILI_INFO("i2c addr doesn't be set up, use default : 0x%x\n", i2c->addr); + } + + if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C)) { + ILI_ERR("i2c functions are not supported!\n"); + return -ENODEV; + } + + ilits = devm_kzalloc(&i2c->dev, sizeof(struct ilitek_ts_data), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits)) { + ILI_ERR("Failed to allocate ts memory, %ld\n", PTR_ERR(ilits)); + return -ENOMEM; + } + + /* Used for receiving touch data only, do not mix up with others. */ + ilits->tr_buf = kzalloc(TR_BUF_SIZE, GFP_ATOMIC); + if (ERR_ALLOC_MEM(ilits->tr_buf)) { + ILI_ERR("failed to allocate touch report buffer\n"); + return -ENOMEM; + } + + ilits->gcoord = kzalloc(sizeof(struct gesture_coordinate), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits->gcoord)) { + ILI_ERR("Failed to allocate gresture coordinate buffer\n"); + return -ENOMEM; + } + + ilits->i2c = i2c; + ilits->spi = NULL; + ilits->dev = &i2c->dev; + ilits->hwif = info->hwif; + ilits->phys = "I2C"; + ilits->wrapper = ili_i2c_wrapper; + ilits->detect_int_stat = ili_ic_check_int_pulse; + ilits->int_pulse = true; + ilits->mp_retry = false; + +#if I2C_DMA_TRANSFER + if (dma_i2c_alloc(ilits->i2c) < 0) + ILI_ERR("Failed to alllocate DMA mem %ld\n", PTR_ERR(ilits->i2c)); +#endif + + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + ilits->tp_data_mode = AP_MODE; + + if (TDDI_RST_BIND) + ilits->reset = TP_IC_WHOLE_RST_WITH_FLASH; + else + ilits->reset = TP_HW_RST_ONLY; + +#if ENABLE_CASCADE + ilits->rst_edge_delay = 60; +#else + ilits->rst_edge_delay = 40; +#endif +#if GENERIC_KERNEL_IMAGE + ilits->fw_open = REQUEST_FIRMWARE; +#else + ilits->fw_open = FILP_OPEN; +#endif + ilits->fw_upgrade_mode = UPGRADE_FLASH; + ilits->mp_move_code = ili_move_mp_code_flash; + ilits->gesture_move_code = ili_move_gesture_code_flash; + ilits->esd_recover = ili_wq_esd_i2c_check; + ilits->esd_func_ctrl = ENABLE_WQ_ESD; + ilits->ges_recover = ili_touch_esd_gesture_flash; + ilits->gesture_mode = DATA_FORMAT_GESTURE_INFO; + ilits->gesture_demo_ctrl = DISABLE; + ilits->wtd_ctrl = OFF; + ilits->report = ENABLE; + ilits->dnp = DISABLE; + ilits->dlnp = DISABLE; + ilits->irq_tirgger_type = IRQF_TRIGGER_RISING; + ilits->info_from_hex = DISABLE; + ilits->wait_int_timeout = AP_INT_TIMEOUT; + ilits->ice_flash_cs_ctrl = ENABLE; + ilits->compress_disable = ENABLE; + ilits->compress_handonly_disable = ENABLE; + ilits->compress_penonly_disable = ENABLE; +#if MULTI_REPORT_RATE + ilits->current_report_rate_mode = DDI60_TP120; /*Default report mode*/ +#endif + +#if ENABLE_GESTURE + ilits->gesture = DISABLE; + ilits->ges_sym.double_tap = DOUBLE_TAP; + ilits->ges_sym.alphabet_line_2_top = ALPHABET_LINE_2_TOP; + ilits->ges_sym.alphabet_line_2_bottom = ALPHABET_LINE_2_BOTTOM; + ilits->ges_sym.alphabet_line_2_left = ALPHABET_LINE_2_LEFT; + ilits->ges_sym.alphabet_line_2_right = ALPHABET_LINE_2_RIGHT; + ilits->ges_sym.alphabet_m = ALPHABET_M; + ilits->ges_sym.alphabet_w = ALPHABET_W; + ilits->ges_sym.alphabet_c = ALPHABET_C; + ilits->ges_sym.alphabet_E = ALPHABET_E; + ilits->ges_sym.alphabet_V = ALPHABET_V; + ilits->ges_sym.alphabet_O = ALPHABET_O; + ilits->ges_sym.alphabet_S = ALPHABET_S; + ilits->ges_sym.alphabet_Z = ALPHABET_Z; + ilits->ges_sym.alphabet_V_down = ALPHABET_V_DOWN; + ilits->ges_sym.alphabet_V_left = ALPHABET_V_LEFT; + ilits->ges_sym.alphabet_V_right = ALPHABET_V_RIGHT; + ilits->ges_sym.alphabet_two_line_2_bottom = ALPHABET_TWO_LINE_2_BOTTOM; + ilits->ges_sym.alphabet_F = ALPHABET_F; + ilits->ges_sym.alphabet_AT = ALPHABET_AT; +#endif + + return info->hwif->plat_probe(); +} + +static int ilitek_i2c_remove(struct i2c_client *i2c) +{ + ILI_INFO(); + return 0; +} + +static const struct i2c_device_id tp_i2c_id[] = { + {TDDI_DEV_ID, 0}, + {}, +}; + +int ili_interface_dev_init(struct ilitek_hwif_info *hwif) +{ + struct touch_bus_info *info; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) { + ILI_ERR("faied to allocate i2c_driver\n"); + return -ENOMEM; + } + + if (hwif->bus_type != BUS_I2C) { + ILI_ERR("Not I2C dev\n"); + ipio_kfree((void **)&info); + return -EINVAL; + } + + hwif->info = info; + + info->bus_driver.driver.name = hwif->name; + info->bus_driver.driver.owner = hwif->owner; + info->bus_driver.driver.of_match_table = hwif->of_match_table; + info->bus_driver.driver.pm = hwif->pm; + + info->bus_driver.probe = ilitek_i2c_probe; + info->bus_driver.remove = ilitek_i2c_remove; + info->bus_driver.id_table = tp_i2c_id; + + info->hwif = hwif; + return i2c_add_driver(&info->bus_driver); +} + +void ili_interface_dev_exit(struct ilitek_ts_data *ts, bool flag) +{ + struct touch_bus_info *info = (struct touch_bus_info *)ilits->hwif->info; + + ILI_INFO("remove i2c dev\n"); + if (flag == ENABLE) { + i2c_del_driver(&info->bus_driver); + ipio_kfree((void **)&info); + } +} diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_ic.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_ic.c new file mode 100644 index 000000000000..2d46d81832c6 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_ic.c @@ -0,0 +1,3021 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" + +#define PROTOCL_VER_NUM 8 +static struct ilitek_protocol_info protocol_info[PROTOCL_VER_NUM] = { + /* length -> fw, protocol, tp, key, panel, core, func, window, cdc, mp_info */ + [0] = {PROTOCOL_VER_500, 4, 4, 14, 30, 5, 5, 2, 8, 3, 8}, + [1] = {PROTOCOL_VER_510, 4, 3, 14, 30, 5, 5, 3, 8, 3, 8}, + [2] = {PROTOCOL_VER_520, 4, 4, 14, 30, 5, 5, 3, 8, 3, 8}, + [3] = {PROTOCOL_VER_530, 9, 4, 14, 30, 5, 5, 3, 8, 3, 8}, + [4] = {PROTOCOL_VER_540, 9, 4, 14, 30, 5, 5, 3, 8, 15, 8}, + [5] = {PROTOCOL_VER_550, 9, 4, 14, 30, 5, 5, 3, 8, 15, 14}, + [6] = {PROTOCOL_VER_560, 9, 4, 14, 30, 5, 5, 3, 8, 15, 14}, + [7] = {PROTOCOL_VER_570, 9, 4, 14, 30, 5, 5, 3, 8, 15, 14}, +}; + +struct ilitek_ic_func_ctrl func_ctrl[FUNC_CTRL_NUM] = { + /* cmd[3] = cmd, func, ctrl */ + /* rec_state 0:disable, 1: enable, 2: ignore record */ + [0] = {"sense", {0x1, 0x1, 0x0}, 3, 0x0, 2, 0xFF}, + [1] = {"sleep", {0x1, 0x2, 0x0}, 3, 0x0, 2, 0xFF}, + [2] = {"glove", {0x1, 0x6, 0x0}, 3, 0x0, 0, 0xFF}, + [3] = {"stylus", {0x1, 0x7, 0x0}, 3, 0x0, 0, 0xFF}, + [4] = {"lpwg", {0x1, 0xA, 0x0}, 3, 0x0, 2, 0xFF}, + [5] = {"proximity", {0x1, 0x10, 0x0}, 3, 0x0, 0, 0xFF}, + [6] = {"plug", {0x1, 0x11, 0x0}, 3, 0x1, 0, 0xFF}, + [7] = {"edge_palm", {0x1, 0x12, 0x0}, 3, 0x1, 0, 0xFF}, + [8] = {"lock_point", {0x1, 0x13, 0x0}, 3, 0x0, 0, 0xFF}, + [9] = {"active", {0x1, 0x14, 0x0}, 3, 0x0, 2, 0xFF}, + [10] = {"idle", {0x1, 0x19, 0x0}, 3, 0x1, 0, 0xFF}, + [11] = {"gesture_demo_en", {0x1, 0x16, 0x0}, 3, 0x0, 0, 0xFF}, + [12] = {"tp_recore", {0x1, 0x18, 0x0}, 3, 0x0, 2, 0xFF}, + [13] = {"knock_en", {0x1, 0xA, 0x8, 0x03, 0x0, 0x0}, 6, 0xFF, 0, 0xFF}, + [14] = {"int_trigger", {0x1, 0x1B, 0x0}, 3, 0x0, 2, 0xFF}, + [15] = {"ear_phone", {0x1, 0x17, 0x0}, 3, 0x0, 0, 0xFF}, + [16] = {"knuckle", {0x1, 0xF, 0x0}, 3, 0x0, 0, 0xFF}, +}; + +static int ili_check_polling_bist(u8 GroupNumIdx, u32 SramRsultStatus) +{ + u32 Bist_Sram_Fail = 0xFFFFFFFF; + int CheckCount = 10, ret = 0; + u32 bist_done = 0, bist_fail = 0, bist_fail_bus = 0; + + ili_ice_mode_write(0x46000, 0, 4); + + ili_ice_mode_read(0x04600C, &bist_done, 1); + ili_ice_mode_read(0x04600D, &bist_fail, 1); + + /* Check Clear MBist Status */ + if (ilits->sram_para.check_failbus == ENABLE) { + ili_ice_mode_read(0x046010, &bist_fail_bus, sizeof(bist_fail_bus)); + + if (((bist_done & BIT(0)) != 0x00) || ((bist_fail & BIT(0)) != 0x01) || (bist_fail_bus != 0xFFFFFFFF)) { + ILI_ERR("Clear MBist Fail\n"); + ILI_ERR("bist_done = 0x%X, bist_fail = 0x%X, bist_fail_bus = 0x%X\n", bist_done, bist_fail, bist_fail_bus); + ret = -1; + goto out; + } + } else { + if (((bist_done & BIT(0)) != 0x00) || ((bist_fail & BIT(0)) != 0x01)) { + ILI_ERR("Clear MBist Fail\n"); + ILI_ERR("bist_done = 0x%X, bist_fail = 0x%X\n", bist_done, bist_fail); + ret = -1; + goto out; + } + } + + ili_ice_mode_write(0x046000, 0x00000001, 4); + ili_ice_mode_write(0x046000, 0x00000101, 4); + + while (CheckCount > 0) { + mdelay(2); + ili_ice_mode_read(0x04600C, &bist_done, 1); + + if ((bist_done & BIT(0)) == 0x01) { + break; + } + CheckCount--; + } + + if (CheckCount <= 0) { + ILI_ERR("Check Bist_Done TimeOut! bist_done = 0x%X\n", bist_done); + ret = -1; + goto out; + } + + ili_ice_mode_read(0x04600D, &bist_fail, 1); + + if(ilits->sram_para.sram_group_en == ENABLE) { + ili_ice_mode_read(ilits->sram_para.read_addr, &Bist_Sram_Fail, 4); + + if ((Bist_Sram_Fail & SramRsultStatus) > 0) { + ILI_ERR("Check Bist Fail Flag Fail!\n"); + ILI_ERR("Bist Sram Fail Status = 0x%X, Sram Rsult Status = 0x%X\n", Bist_Sram_Fail, SramRsultStatus); + ret = -1; + goto out; + } + } else { + if (ilits->sram_para.check_failbus == ENABLE) { + ili_ice_mode_read(0x046010, &bist_fail_bus, sizeof(bist_fail_bus)); + + if (((bist_fail & BIT(0)) != 0x00) || (bist_fail_bus != 0x00000000)) { + ILI_ERR("Check Bist Fail Flag Fail\n"); + ILI_DBG("bist_fail = %d, bist_fail_bus = %d\n", bist_fail, bist_fail_bus); + ret = -1; + goto out; + } + } else { + if ((bist_fail & BIT(0)) != 0x00) { + ILI_ERR("Check Bist Fail Flag Fail\n"); + ILI_DBG("bist_fail = %d\n", bist_fail); + ret = -1; + goto out; + } + } + } + +out: + return ret; +} + +static void ili_sram_test(u32 MaxAddr, u32 MinAddr) +{ + u32 SetValue; + + /* Strat Sram Test */ + ili_ice_mode_write_by_mode(0x40004, 0x00000001, 4, BOTH); + ili_ice_mode_write_by_mode(0x40010, 0x00009878, 4, BOTH); + ili_ice_mode_write_by_mode(0x40088, 0x00006B8A, 4, BOTH); + + /* Set MinAddr */ + ili_ice_mode_write_by_mode(0x46038, MinAddr, 2, BOTH); + + /* March_LR */ + SetValue = ((MaxAddr << 16) & 0xFFFF0000) | 0xFF00; + + ili_ice_mode_write_by_mode(0x46000, 0x00010000, 4, BOTH); + ili_ice_mode_write_by_mode(0x46004, SetValue, 4, BOTH); + ili_ice_mode_write_by_mode(0x46014, 0xA4409800, 4, BOTH); + ili_ice_mode_write_by_mode(0x46018, 0xB480F590, 4, BOTH); + ili_ice_mode_write_by_mode(0x4601C, 0x9000F560, 4, BOTH); + ili_ice_mode_write_by_mode(0x46020, 0x9280C460, 4, BOTH); + ili_ice_mode_write_by_mode(0x46024, 0x0000, 2, BOTH); +} + +static int ili_sram_by_partial_area_test(void) +{ + int ret = 0; + u8 nSramNumIdx; + + for(nSramNumIdx = 0; nSramNumIdx < ilits->sram_para.group_num; nSramNumIdx++) { + ILI_DBG("Sram Partial Area : %s\n", ilits->sram_para.strSramPartialArea[nSramNumIdx]); + + ili_ice_mode_write_by_mode(ilits->sram_para.write_addr, ilits->sram_para.SramPartialAreaTest_en[nSramNumIdx], 4, BOTH); + ILI_DBG("Write Sram Partial Area En : 0x%X\n", ilits->sram_para.SramPartialAreaTest_en[nSramNumIdx]); + + ili_sram_test(ilits->sram_para.MaxAddr, ilits->sram_para.MinAddr); + + if (ili_check_polling_bist(nSramNumIdx, ilits->sram_para.SramResult[nSramNumIdx]) < 0) { + ILI_ERR("Check March_LR Bist Fail during partial area test\n"); + ret = -1; + } + } + + return ret; +} + +static int ili_ic_cascade_polling_bist(void) +{ + int retry = 10, ret = 0; + u32 bist_done = 0, bist_fail = 0, bist_fail_bus = 0; + u32 bist_slave_done = 0, bist_slave_fail = 0, bist_slave_fail_bus = 0; + u32 pen_bist_fail_bus = 0, pen_bist_slave_fail_bus = 0; + + ili_ice_mode_write_by_mode(0x046000, 0x000000, 4, BOTH); + +#if (TDDI_INTERFACE == BUS_I2C) + ilits->i2c_addr_change = SLAVE; + ili_ice_mode_read(0x04600C, &bist_slave_done, sizeof(bist_slave_done)); + ili_ice_mode_read(0x04600D, &bist_slave_fail, sizeof(bist_slave_fail)); + + + ilits->i2c_addr_change = MASTER; + ili_ice_mode_read(0x04600C, &bist_done, sizeof(bist_done)); + ili_ice_mode_read(0x04600D, &bist_fail, sizeof(bist_fail)); + + if (ilits->sram_para.check_failbus == ENABLE) { + ilits->i2c_addr_change = SLAVE; + ili_ice_mode_read(0x046010, &bist_slave_fail_bus, sizeof(bist_slave_fail_bus)); + ili_ice_mode_read(0x046048, &pen_bist_slave_fail_bus, sizeof(pen_bist_slave_fail_bus)); + + ilits->i2c_addr_change = MASTER; + ili_ice_mode_read(0x046010, &bist_fail_bus, sizeof(bist_fail_bus)); + ili_ice_mode_read(0x046048, &pen_bist_fail_bus, sizeof(pen_bist_fail_bus)); + + if (((bist_done & BIT(0)) != 0x00) || ((bist_fail & BIT(0)) != 0x01) || (bist_fail_bus != 0xFFFFFFFF) + || ((bist_slave_done & BIT(0)) != 0x00) || ((bist_slave_fail & BIT(0)) != 0x01) + || (bist_slave_fail_bus != 0xFFFFFFFF)) { + + ILI_ERR("SRAM TEST FAIL\n"); + ILI_ERR("bist_done = 0x%X, bist_fail = 0x%X, bist_fail_bus = 0x%X\n", bist_done, bist_fail, bist_fail_bus); + ILI_ERR("bist_slave_done = 0x%X, bist_slave_fail = 0x%X, bist_slave_fail_bus = 0x%X\n", bist_slave_done, bist_slave_fail, bist_slave_fail_bus); + ILI_ERR("pen_bist_fail_bus = 0x%X, pen_bist_slave_fail_bus = 0x%X\n", pen_bist_fail_bus, pen_bist_slave_fail_bus); + ret = -1; + goto out; + } + } else { + if (((bist_done & BIT(0)) != 0x00) || ((bist_fail & BIT(0)) != 0x01) || ((bist_slave_done & BIT(0)) != 0x00) + || ((bist_slave_fail & BIT(0)) != 0x01)) { + + ILI_ERR("SRAM TEST FAIL\n"); + ILI_ERR("bist_done = 0x%X, bist_fail = 0x%X\n", bist_done, bist_fail); + ILI_ERR("bist_slave_done = 0x%X, bist_slave_fail = 0x%X\n", bist_slave_done, bist_slave_fail); + ret = -1; + goto out; + } + } + + ili_ice_mode_write_by_mode(0x046000, 0x00000001, 4, BOTH); + ili_ice_mode_write_by_mode(0x046000, 0x00000101, 4, BOTH); + + while (retry > 0) { + mdelay(10); + ilits->i2c_addr_change = SLAVE; + ili_ice_mode_read(0x04600C, &bist_slave_done, sizeof(bist_slave_done)); + + ilits->i2c_addr_change = MASTER; + ili_ice_mode_read(0x04600C, &bist_done, sizeof(bist_done)); + ILI_ERR("bist_done = 0x%X, bist_slave_done = 0x%X\n", bist_done, bist_slave_done); + + + if (((bist_done & BIT(0)) == 0x01) && ((bist_slave_done & BIT(0)) == 0x01)) { + break; + } + retry--; + } + + if (retry <= 0) { + ILI_DBG("SRAM TEST FAIL\n"); + ret = -1; + goto out; + } + + ilits->i2c_addr_change = SLAVE; + ili_ice_mode_read(0x04600D, &bist_slave_fail, sizeof(bist_slave_fail)); + + ilits->i2c_addr_change = MASTER; + ili_ice_mode_read(0x04600D, &bist_fail, sizeof(bist_fail)); + + if (ilits->sram_para.check_failbus == ENABLE) { + ilits->i2c_addr_change = SLAVE; + ili_ice_mode_read(0x046010, &bist_slave_fail_bus, sizeof(bist_slave_fail_bus)); + ili_ice_mode_read(0x046048, &pen_bist_slave_fail_bus, sizeof(pen_bist_slave_fail_bus)); + + ilits->i2c_addr_change = MASTER; + ili_ice_mode_read(0x046010, &bist_fail_bus, sizeof(bist_fail_bus)); + ili_ice_mode_read(0x046048, &pen_bist_fail_bus, sizeof(pen_bist_fail_bus)); + + if (((bist_fail & BIT(0)) != 0x00) || (bist_fail_bus != 0x00000000) || (((bist_slave_fail & BIT(24)) >> 24) != 0x00) + || (bist_slave_fail_bus != 0x00000000)) { + + ILI_ERR("SRAM TEST FAIL\n"); + ILI_ERR("bist_fail = 0x%X, bist_fail_bus = 0x%X\n", bist_fail, bist_fail_bus); + ILI_ERR("bist_slave_fail = 0x%X, bist_slave_fail_bus = 0x%X\n", bist_slave_fail, bist_slave_fail_bus); + ILI_ERR("pen_bist_fail_bus = 0x%X, pen_bist_slave_fail_bus = 0x%X\n", pen_bist_fail_bus, pen_bist_slave_fail_bus); + ret = -1; + goto out; + } + } else { + if (((bist_fail & BIT(0)) != 0x00) || (((bist_slave_fail & BIT(24)) >> 24) != 0x00)) { + ILI_ERR("SRAM TEST FAIL\n"); + ILI_ERR("bist_fail = 0x%X, bist_slave_fail = 0x%X\n", bist_fail, bist_slave_fail); + ret = -1; + goto out; + } + } + + +#elif (TDDI_INTERFACE == BUS_SPI) + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x04600C, &bist_done, sizeof(bist_done)); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, &bist_slave_done, sizeof(bist_slave_done)); + + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x04600D, &bist_fail, sizeof(bist_fail)); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, &bist_slave_fail, sizeof(bist_slave_fail)); + + if (ilits->sram_para.check_failbus == ENABLE) { + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x046010, &bist_fail_bus, sizeof(bist_fail_bus)); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, &bist_slave_fail_bus, sizeof(bist_slave_fail_bus)); + + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x046048, &pen_bist_fail_bus, sizeof(pen_bist_fail_bus)); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, &pen_bist_slave_fail_bus, sizeof(pen_bist_slave_fail_bus)); + + if (((bist_done & BIT(0)) != 0x00) || ((bist_fail & BIT(0)) != 0x01) || (bist_fail_bus != 0xFFFFFFFF) + || (((bist_slave_done & BIT(24)) >> 24) != 0x00) || (((bist_slave_fail & BIT(24)) >> 24) != 0x01) + || (bist_slave_fail_bus != 0xFFFFFFFF)) { + + ILI_ERR("SRAM TEST FAIL\n"); + ILI_ERR("bist_done = 0x%X, bist_fail = 0x%X, bist_fail_bus = 0x%X\n", bist_done, bist_fail, bist_fail_bus); + ILI_ERR("bist_slave_done = 0x%X, bist_slave_fail = 0x%X, bist_slave_fail_bus = 0x%X\n", bist_slave_done, bist_slave_fail, bist_slave_fail_bus); + ILI_ERR("pen_bist_fail_bus = 0x%X, pen_bist_slave_fail_bus = 0x%X\n", pen_bist_fail_bus, pen_bist_slave_fail_bus); + ret = -1; + goto out; + } + } else { + if (((bist_done & BIT(0)) != 0x00) || ((bist_fail & BIT(0)) != 0x01) || (((bist_slave_done & BIT(24) >> 24)) != 0x00) + || (((bist_slave_fail & BIT(24)) >> 24) != 0x01)) { + + ILI_ERR("SRAM TEST FAIL\n"); + ILI_ERR("bist_done = 0x%X, bist_fail = 0x%X\n", bist_done, bist_fail); + ILI_ERR("bist_slave_done = 0x%X, bist_slave_fail = 0x%X\n", bist_slave_done, bist_slave_fail); + ret = -1; + goto out; + } + } + + ili_ice_mode_write(0x046000, 0x00000001, 4); + ili_ice_mode_write(0x046000, 0x00000101, 4); + + while (retry > 0) { + mdelay(10); + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x04600C, &bist_done, sizeof(bist_done)); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, &bist_slave_done, sizeof(bist_slave_done)); + ILI_DBG("bist_done = 0x%X, bist_slave_done = 0x%X\n", bist_done, bist_slave_done); + + if (((bist_done & BIT(0)) == 0x01) && (((bist_slave_done & BIT(24)) >> 24) == 0x01)) { + break; + } + retry--; + } + + if (retry <= 0) { + ILI_DBG("SRAM TEST FAIL\n"); + ret = -1; + goto out; + } + + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x04600D, &bist_fail, sizeof(bist_fail)); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, &bist_slave_fail, sizeof(bist_slave_fail)); + + if (ilits->sram_para.check_failbus == ENABLE) { + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x046010, &bist_fail_bus, sizeof(bist_fail_bus)); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, &bist_slave_fail_bus, sizeof(bist_slave_fail_bus)); + + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x046048, &pen_bist_fail_bus, sizeof(pen_bist_fail_bus)); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, &pen_bist_slave_fail_bus, sizeof(pen_bist_slave_fail_bus)); + + if (((bist_fail & BIT(0)) != 0x00) || (bist_fail_bus != 0x00000000) || (((bist_slave_fail & BIT(24)) >> 24) != 0x00) + || (bist_slave_fail_bus != 0x00000000)) { + + ILI_ERR("SRAM TEST FAIL\n"); + ILI_ERR("bist_fail = 0x%X, bist_fail_bus = 0x%X\n", bist_fail, bist_fail_bus); + ILI_ERR("bist_slave_fail = 0x%X, bist_slave_fail_bus = 0x%X\n", bist_slave_fail, bist_slave_fail_bus); + ILI_ERR("pen_bist_fail_bus = 0x%X, pen_bist_slave_fail_bus = 0x%X\n", pen_bist_fail_bus, pen_bist_slave_fail_bus); + + ret = -1; + goto out; + } + } else { + if (((bist_fail & BIT(0)) != 0x00) || (((bist_slave_fail & BIT(24)) >> 24) != 0x00)) { + ILI_ERR("SRAM TEST FAIL\n"); + ILI_ERR("bist_fail = 0x%X, bist_slave_fail = 0x%X\n", bist_fail, bist_slave_fail); + + ret = -1; + goto out; + } + } + +#endif +out: + return ret; +} + +int ili_tddi_ic_sram_test() +{ + int ret = 0; + + ili_ice_mode_write_by_mode(0x047003, 0x00, 1, BOTH); + ili_ice_mode_write_by_mode(0x04001C, 0x01, 1, BOTH); + ili_ice_mode_write_by_mode(0x071001, 0x02, 1, BOTH); + ili_ice_mode_write_by_mode(0x071005, 0x3C, 1, BOTH); + ili_ice_mode_write_by_mode(0x046003, 0x00, 1, BOTH); + ili_ice_mode_write_by_mode(0x046000, 0x010001, 3, BOTH); + ili_ice_mode_write_by_mode(0x046002, 0x00, 1, BOTH); + + if (ilits->sram_para.sram_group_en == ENABLE) { + ret = ili_sram_by_partial_area_test(); + goto out; + } + + ili_sram_test(ilits->sram_para.MaxAddr, ilits->sram_para.MinAddr); + + if (ilits->cascade_info_block.nNum != 0) { + ret = ili_ic_cascade_polling_bist(); + } else { + ret = ili_check_polling_bist(false, false); + } +out: +#if (TDDI_INTERFACE == BUS_SPI) + if (ilits->cascade_info_block.nNum != 0) { + ili_core_spi_setup(SPI_CLK); + } +#endif + return ret; +} + +#ifdef ROI +int ili_config_knuckle_roi_ctrl(cmd_types cmd) +{ + int ret = 0; + switch (cmd) { + case CMD_DISABLE: + ILI_DBG("knuckle roi disbale\n"); + ret = ili_ic_func_ctrl("knuckle", cmd); + break; + case CMD_ENABLE: + ILI_DBG("knuckle roi enable\n"); + ret = ili_ic_func_ctrl("knuckle", cmd); + break; + case CMD_STATUS: + ILI_DBG("knuckle roi read status\n"); + ret = ili_ic_func_ctrl("knuckle", cmd); + break; + case CMD_ROI_DATA: + ILI_DBG("knuckle roi read data\n"); + ret = ili_ic_func_ctrl("knuckle", cmd); + break; + default: + ILI_ERR("knuckle roi unknown cmd: %d\n", cmd); + return -EINVAL; + } + return ret; +} + +int ili_config_get_knuckle_roi_status(void) +{ + int ret = 0; + u8 roi_status = 0; + + ret = ili_config_knuckle_roi_ctrl(CMD_STATUS); + if (ret) { + ILI_ERR("config to read roi status failed\n"); + return ret; + } + + msleep(1); + ret = ilits->wrapper(NULL, 0, &roi_status, sizeof(roi_status), OFF, OFF); + if (ret) { + ILI_ERR("read data failed\n"); + return ret; + } + + ILI_INFO("roi %s\n", roi_status ? "enable" : "disable"); + + return roi_status; +} +#endif + +static int ilitek_tddi_ic_check_info(u32 pid, u16 id) +{ + ILI_INFO("ILITEK CHIP found.\n"); + + ilits->chip->pid = pid; + + ilits->chip->reset_key = TDDI_WHOLE_CHIP_RST_WITH_FLASH_KEY; + ilits->chip->wtd_key = 0x9881; + + if (((pid & 0xFFFFFF00) == ILI9881N_AA) || ((pid & 0xFFFFFF00) == ILI9881O_AA)) { + ilits->chip->dma_reset = ENABLE; + } else { + ilits->chip->dma_reset = DISABLE; + } + + ilits->chip->no_bk_shift = RAWDATA_NO_BK_SHIFT; + ilits->chip->max_count = 0x1FFFF; + return 0; +} + +int ili_ice_mode_bit_mask_write(u32 addr, u32 mask, u32 value) +{ + int ret = 0; + u32 data = 0; + + if (ili_ice_mode_read(addr, &data, sizeof(u32)) < 0) { + ILI_ERR("Read data error\n"); + return -1; + } + + data &= (~mask); + data |= (value & mask); + + ILI_DBG("mask value data = %x\n", data); + + ret = ili_ice_mode_write(addr, data, sizeof(u32)); + if (ret < 0) + ILI_ERR("Failed to re-write data in ICE mode, ret = %d\n", ret); + + return ret; +} + +int ili_ice_mode_write(u32 addr, u32 data, int len) +{ + int ret = 0, i; + u8 txbuf[64] = {0}; + + if (!atomic_read(&ilits->ice_stat)) { + ILI_ERR("ice mode not enabled\n"); + return -1; + } + + txbuf[0] = 0x25; + txbuf[1] = (char)((addr & 0x000000FF) >> 0); + txbuf[2] = (char)((addr & 0x0000FF00) >> 8); + txbuf[3] = (char)((addr & 0x00FF0000) >> 16); + + for (i = 0; i < len; i++) + txbuf[i + 4] = (char)(data >> (8 * i)); + + ret = ilits->wrapper(txbuf, len + 4, NULL, 0, OFF, OFF); + if (ret < 0) + ILI_ERR("Failed to write data in ice mode, ret = %d\n", ret); + + return ret; +} + +int ili_ice_mode_read(u32 addr, u32 *data, int len) +{ + int ret = 0; + u8 rxbuf[4] = {0}; + u8 txbuf[4] = {0}; + + if (len > sizeof(u32)) { + ILI_ERR("ice mode read lenght = %d, must less than or equal to 4 bytes\n", len); + len = 4; + } + + if (!atomic_read(&ilits->ice_stat)) { + ILI_ERR("ice mode not enabled\n"); + return -1; + } + + txbuf[0] = 0x25; + txbuf[1] = (char)((addr & 0x000000FF) >> 0); + txbuf[2] = (char)((addr & 0x0000FF00) >> 8); + txbuf[3] = (char)((addr & 0x00FF0000) >> 16); + + ret = ilits->wrapper(txbuf, sizeof(txbuf), NULL, 0, OFF, OFF); + if (ret < 0) + goto out; + + ret = ilits->wrapper(NULL, 0, rxbuf, len, OFF, OFF); + if (ret < 0) + goto out; + + *data = 0; + if (len == 1) + *data = rxbuf[0]; + else if (len == 2) + *data = (rxbuf[0] | rxbuf[1] << 8); + else if (len == 3) + *data = (rxbuf[0] | rxbuf[1] << 8 | rxbuf[2] << 16); + else + *data = (rxbuf[0] | rxbuf[1] << 8 | rxbuf[2] << 16 | rxbuf[3] << 24); + +out: + if (ret < 0) + ILI_ERR("Failed to read data in ice mode, ret = %d\n", ret); + + return ret; +} + +void ili_cascade_sync_ctrl(bool mode) +{ + bool stop = false, backup_addr = MASTER; + u8 cmd[2] = {0}; + + + backup_addr = ilits->i2c_addr_change; + ilits->i2c_addr_change = MASTER; + + if (mode == stop) { + cmd[0] = 0x10; + cmd[1] = 0x10; + if (ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Failed to stop Sync Cascade\n"); + } else { + atomic_set(&ilits->sync_stat, ENABLE); + ILI_DBG("Stop Sync Cascade, Set atomic sync stat = %d\n", atomic_read(&ilits->sync_stat)); + } + + mdelay(1); + } else { + cmd[0] = 0x10; + cmd[1] = 0x11; + if (ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Failed to start Sync Cascade\n"); + } else { + atomic_set(&ilits->sync_stat, DISABLE); + ILI_DBG("Start Sync Cascade, Set atomic sync stat = %d\n", atomic_read(&ilits->sync_stat)); + } + } + ilits->i2c_addr_change = backup_addr; +} + +int ili_ice_mode_ctrl(bool enable, bool mcu) +{ + int ret = 0; + u8 cmd_open[4] = {0x25, 0x62, 0x10, 0x18}; + u8 cmd_close[4] = {0x1B, 0x62, 0x10, 0x18}; + + if (enable) { + if (atomic_read(&ilits->ice_stat)) { + ILI_INFO("ice mode already enabled\n"); + return 0; + } + + /* Cascade Stop Sync */ +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + if (ilits->cascade_ctrl_mode == BOTH) { + if (ilits->i2c_addr_change == SLAVE && atomic_read(&ilits->sync_stat) == DISABLE) { + ili_cascade_sync_ctrl(false); + } + } else { + if (atomic_read(&ilits->sync_stat) == DISABLE) { + ili_cascade_sync_ctrl(false); + } + } +#elif (TDDI_INTERFACE == BUS_SPI && ENABLE_CASCADE) + if (atomic_read(&ilits->sync_stat) == DISABLE) { + ili_cascade_sync_ctrl(false); + } +#endif + + if (mcu) + cmd_open[0] = 0x1F; + + atomic_set(&ilits->ice_stat, ENABLE); + + if (ilits->wrapper(cmd_open, sizeof(cmd_open), NULL, 0, OFF, OFF) < 0) { + ILI_ERR("write ice mode cmd error\n"); + atomic_set(&ilits->ice_stat, DISABLE); + } + ilits->pll_clk_wakeup = false; + +#if (TDDI_INTERFACE == BUS_I2C) + if (ilits->ice_flash_cs_ctrl && !mcu) { + if (ili_ice_mode_write(FLASH_BASED_ADDR, 0x1, 1) < 0) + ILI_ERR("Write cs high failed\n"); /* CS high */ + if (ili_ice_mode_write(FLASH0_dual_mode, 0x0, 1) < 0) + ILI_ERR("Write daul mode close failed\n"); /* daul mode close */ + } else { + ILI_INFO("ignore ice mode flash cs control\n"); + } +#endif + } else { + if (!atomic_read(&ilits->ice_stat)) { + ILI_INFO("ice mode already disabled\n"); + return 0; + } +#if (TDDI_INTERFACE == BUS_SPI && ENABLE_CASCADE) + /* Slave exit ice mode */ + if (atomic_read(&ilits->slave_ice_stat)) { + if (ili_mspi_write_slave_register(CONTROL_SLAVE_EXIT_ICE_ADDR, 0, 0) < 0) { + ILI_ERR("Disable Slave ICE mode Fail\n"); + } else { + atomic_set(&ilits->slave_ice_stat, DISABLE); + ILI_INFO("Set slave ice state atomic : %d, Disable Slave ICE mode\n", atomic_read(&ilits->slave_ice_stat)); + } + } +#endif + ret = ilits->wrapper(cmd_close, sizeof(cmd_close), NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Exit to ICE Mode failed !!\n"); + atomic_set(&ilits->ice_stat, ENABLE); + } else { + atomic_set(&ilits->ice_stat, DISABLE); +#if (!ENABLE_CASCADE) + ilits->pll_clk_wakeup = true; +#endif + atomic_set(&ilits->ignore_report, END); + } + + /* Cascade Start Sync */ +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + if (ilits->cascade_ctrl_mode == BOTH) { + if (ilits->i2c_addr_change == MASTER && atomic_read(&ilits->sync_stat) == ENABLE) { + ilits->pll_clk_wakeup = true; + ili_cascade_sync_ctrl(true); + } + } else { + if (atomic_read(&ilits->sync_stat) == ENABLE) { + ilits->pll_clk_wakeup = true; + ili_cascade_sync_ctrl(true); + } + } +#elif (TDDI_INTERFACE == BUS_SPI && ENABLE_CASCADE) + if (atomic_read(&ilits->sync_stat) == ENABLE) { + ilits->pll_clk_wakeup = true; + ili_cascade_sync_ctrl(true); + } +#endif + } + ILI_INFO("%s ICE mode, mcu on = %d\n", (enable ? "Enable" : "Disable"), mcu); + + return ret; +} + +int ili_ice_mode_ctrl_by_mode(bool enable, bool mcu, int mode) +{ + int ret = 0; +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + ilits->cascade_ctrl_mode = mode; + switch (mode) { + case SLAVE: + case BOTH: + ilits->i2c_addr_change = SLAVE; + if (ili_ice_mode_ctrl(enable, mcu) < 0) { + ILI_ERR("Failed to write Slave ice mode\n"); + ret = -1; + } else { + ILI_DBG("Slave %s ice mode\n", enable ? "Enable" : "Disable"); + } + if (mode == SLAVE) { + ilits->i2c_addr_change = MASTER; + break; + } else { + if (enable == ENABLE) + atomic_set(&ilits->ice_stat, DISABLE); + else + atomic_set(&ilits->ice_stat, ENABLE); + } + case MASTER: + ilits->i2c_addr_change = MASTER; + if (ili_ice_mode_ctrl(enable, mcu) < 0) { + ILI_ERR("Failed to write Master ice mode\n"); + ret = -1; + } else { + ILI_DBG("Master %s ice mode\n", enable ? "Enable" : "Disable"); + } + break; + default: + break; + } + ilits->cascade_ctrl_mode = MASTER; +#else + if (ili_ice_mode_ctrl(enable, mcu) < 0) { + ILI_ERR("Failed to write ice mode\n"); + } +#endif + return ret; +} + +int ili_ice_mode_write_by_mode(u32 addr, u32 data, int len, int mode) +{ + int ret = 1; +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + switch (mode) { + case SLAVE: + case BOTH: + ilits->i2c_addr_change = SLAVE; + if (ili_ice_mode_write(addr, data, len) < 0) { + ILI_ERR("Failed to write Slave, addr: 0x%X\n", addr); + ret = -1; + } + if (mode == SLAVE) { + ilits->i2c_addr_change = MASTER; + break; + } + case MASTER: + ilits->i2c_addr_change = MASTER; + if (ili_ice_mode_write(addr, data, len) < 0) { + ILI_ERR("Failed to write Master, addr: 0x%X\n", addr); + ret = -1; + } + break; + default: + break; + } +#else + if (ili_ice_mode_write(addr, data, len) < 0) { + ILI_ERR("Failed to write addr: 0x%X\n", addr); + ret = -1; + } +#endif + return ret; +} + +int ili_ice_mode_read_by_mode(u32 addr, u32 *data, int len, int mode) +{ + int ret = 1; +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + switch (mode) { + case SLAVE: + case BOTH: + ilits->i2c_addr_change = SLAVE; + if (ili_ice_mode_read(addr, data, len) < 0) { + ILI_ERR("Failed to read Slave, addr: 0x%x\n", addr); + ret = -1; + } else { + ILI_DBG("Slave [READ]:addr = 0x%06x, read = 0x%08x\n", addr, *data); + } + if (mode == SLAVE) { + ilits->i2c_addr_change = MASTER; + break; + } + case MASTER: + ilits->i2c_addr_change = MASTER; + if (ili_ice_mode_read(addr, data, len) < 0) { + ILI_ERR("Failed to read Master, addr: 0x%x\n", addr); + ret = -1; + } else { + ILI_DBG("Master [READ]:addr = 0x%06x, read = 0x%08x\n", addr, *data); + } + break; + default: + break; + } +#else + if (ili_ice_mode_read(addr, data, len) < 0) { + ILI_ERR("Failed to write addr: 0x%x\n", addr); + ret = -1; + } else { + ILI_DBG("[READ]:addr = 0x%06x, read = 0x%08x\n", addr, *data); + } +#endif + return ret; +} + +static void ili_mspi_init(void) +{ + if (ili_ice_mode_write(MSPI_REG, 0x01, 1) < 0) + ILI_ERR("Write MSPI_REG failed\n"); + + if (ili_ice_mode_write(MSPI_TRIG_BY_DMA_ADDR, 0x101, 2) < 0) + ILI_ERR("Write MSPI_TRIG_BY_DMA_ADDR failed\n"); + + if (ili_ice_mode_write(MSPI_CLOCK_ADDR, 0x02, 1) < 0) + ILI_ERR("Write MSPI_CLOCK_ADDR failed\n"); + + if (ili_ice_mode_write(MSPI_CS_ADDR, 0x01, 1) < 0) + ILI_ERR("Write MSPI_CS_ADDR failed\n"); +} + +static void ili_dma_write_setting(void) +{ + if (ili_ice_mode_write(DMA_ONE_CLEAR_ADDR, 0x02, 1) < 0) + ILI_ERR("Write DMA_ONE_CLEAR_ADDR failed\n"); + + if (ili_ice_mode_write(SRC_ONE_ADDR, 0x308D0, 3) < 0) + ILI_ERR("Write SRC_ONE_ADDR failed\n"); + + if (ili_ice_mode_write(SRC_ONE_SET_ADDR, 0x82000004, sizeof(u32)) < 0) + ILI_ERR("Write SRC_ONE_SET_ADDR failed\n"); + + if (ili_ice_mode_write(SRC_TWO_EN_ADDR, 0x00, 1) < 0) + ILI_ERR("Write SRC_TWO_EN_ADDR failed\n"); + + if (ili_ice_mode_write(DEST_ADDR, 0x6205C, 3) < 0) + ILI_ERR("Write DEST_ADDR failed\n"); + + if (ili_ice_mode_write(DEST_SET_ADDR, 0x82000000, sizeof(u32)) < 0) + ILI_ERR("Write DEST_SET_ADDR failed\n"); + + if (ili_ice_mode_write(TRIG_SEL_MSPI_ADDR, 0x0D, 1) < 0) + ILI_ERR("Write TRIG_SEL_MSPI_ADDR failed\n"); + + if (ili_ice_mode_write(DMA_ONE_GROUP_ADDR, 0x00, 1) < 0) + ILI_ERR("Write DMA_ONE_GROUP_ADDR failed\n"); +} + +static void ili_dma_read_setting(void) +{ + if (ili_ice_mode_write(DMA_ONE_CLEAR_ADDR, 0x02, 1) < 0) + ILI_ERR("Write DMA_ONE_CLEAR_ADDR failed\n"); + + if (ili_ice_mode_write(SRC_ONE_ADDR, 0x62060, 3) < 0) + ILI_ERR("Write SRC_ONE_ADDR failed\n"); + + if (ili_ice_mode_write(SRC_ONE_SET_ADDR, 0x80000000, sizeof(u32)) < 0) + ILI_ERR("Write SRC_ONE_SET_ADDR failed\n"); + + if (ili_ice_mode_write(SRC_TWO_EN_ADDR, 0x00, 1) < 0) + ILI_ERR("Write SRC_TWO_EN_ADDR failed\n"); + + if (ili_ice_mode_write(DEST_ADDR, 0x308D0, 3) < 0) + ILI_ERR("Write DEST_ADDR failed\n"); + + if (ili_ice_mode_write(DEST_SET_ADDR, 0x80000001, sizeof(u32)) < 0) + ILI_ERR("Write DEST_SET_ADDR failed\n"); + + if (ili_ice_mode_write(TRIG_SEL_MSPI_ADDR, 0x0E, 1) < 0) + ILI_ERR("Write DEST_SET_ADDR failed\n"); + + if (ili_ice_mode_write(DMA_ONE_GROUP_ADDR, 0x00, 1) < 0) + ILI_ERR("Write DMA_ONE_GROUP_ADDR failed\n"); +} + +static void ili_trigger_mspi(void) +{ + u8 BusyCnt = 50; + u32 BusyData; + + if (ili_ice_mode_write(MSPI_CS_ADDR, 0x00, 1) < 0) + ILI_ERR("Write MSPI_CS_ADDR failed\n"); + + if (ili_ice_mode_write(MSPI_REG, 0x0F, 1) < 0) + ILI_ERR("Write MSPI_REG failed\n"); + + if (ili_ice_mode_write(MSPI_TRIGGER_ADDR, 0x01, 1) < 0) + ILI_ERR("Write WRITE_BUF_ADDR failed\n"); + + /* Polling Done Flag */ + while (BusyCnt > 0) { + if (ili_ice_mode_read(MSPI_DONE_FLAG_ADDR, &BusyData, 1) < 0) + ILI_ERR("Read MSPI_DONE_FLAG_ADDR failed\n"); + + if ( (BusyData & BIT(0)) == 0x01) { + break; + } else { + ILI_ERR("MSPI Busy : 0x%X\n", BusyData); + } + + mdelay(1); + BusyCnt--; + } + + if (ili_ice_mode_write(MSPI_DONE_FLAG_ADDR, 0x01, 1) < 0) + ILI_ERR("Read MSPI_DONE_FLAG_ADDR failed\n"); + + if (ili_ice_mode_write(MSPI_CS_ADDR, 0x01, 1) < 0) + ILI_ERR("Write MSPI_CS_ADDR failed\n"); +} + +void ili_mspi_set_slave_to_qual_mode(void) +{ + u32 read_data, backup_mspi_init_en; + + ili_mspi_init(); + + if (ili_ice_mode_read(MSPI_INIT_EN_ADDR, &backup_mspi_init_en, 1) < 0) + ILI_ERR("Read MSPI_INIT_EN_ADDR failed\n"); + + if (ili_ice_mode_write(MSPI_INIT_EN_ADDR, backup_mspi_init_en & 0xFE, 1) < 0) + ILI_ERR("Write MSPI_INIT_EN_ADDR failed\n"); + + ili_dma_write_setting(); + + /* Set Slave to Qual Mode */ + if (ili_ice_mode_read(TRANSFER_CNT_ADDR, &read_data, sizeof(u32)) < 0) + ILI_ERR("Read TRANSFER_CNT_ADDR failed\n"); + + read_data = (read_data & 0xFFFC0000) + 0x18; + + if (ili_ice_mode_write(TRANSFER_CNT_ADDR, read_data, sizeof(u32)) < 0) + ILI_ERR("Write TRANSFER_CNT_ADDR failed\n"); + + if (ili_ice_mode_read(WRITE_BUF_SIZE_ADDR, &read_data, 2) < 0) + ILI_ERR("Read WRITE_BUF_SIZE_ADDR failed\n"); + + read_data = (read_data & 0xF800) + 0x18; + + if (ili_ice_mode_write(WRITE_BUF_SIZE_ADDR, read_data, 2) < 0) + ILI_ERR("Write WRITE_BUF_SIZE_ADDR failed\n"); + + if (ili_ice_mode_read(READ_BUF_SIZE_ADDR, &read_data, 2) < 0) + ILI_ERR("Read READ_BUF_SIZE_ADDR failed\n"); + + read_data = (read_data & 0xF800) + 0x00; + + if (ili_ice_mode_write(READ_BUF_SIZE_ADDR, read_data, 2) < 0) + ILI_ERR("Write READ_BUF_SIZE_ADDR failed\n"); + + if (ili_ice_mode_write(WRITE_BUF_ADDR, 0x40000040, sizeof(u32)) < 0) + ILI_ERR("Write WRITE_BUF_ADDR failed\n"); + + if (ili_ice_mode_write(0x308D0, 0x4044000, sizeof(u32)) < 0) + ILI_ERR("Write failed\n"); + + if (ili_ice_mode_write(0x308D4, 0x4000, sizeof(u32)) < 0) + ILI_ERR("Write failed\n"); + + if (ili_ice_mode_write(0x308D8, 0x4000, sizeof(u32)) < 0) + ILI_ERR("Write failed\n"); + + if (ili_ice_mode_write(0x308DC, 0x40040000, sizeof(u32)) < 0) + ILI_ERR("Write failed\n"); + + if (ili_ice_mode_write(0x308E0, 0x40000000, sizeof(u32)) < 0) + ILI_ERR("Write failed\n"); + + ili_trigger_mspi(); + + /* Recovery Mspi int en */ + if (ili_ice_mode_write(MSPI_INIT_EN_ADDR, backup_mspi_init_en, 1) < 0) + ILI_ERR("Write MSPI_INIT_EN_ADDR failed\n"); + + ILI_INFO("Backup MSPI Init EN : 0x%X\n", backup_mspi_init_en); +} + +int ili_mspi_write_slave_register(u32 addr, u32 data, int len) +{ + int ret = 0; + u32 backup_mspi_init_en, write_data; + + ili_mspi_init(); + + if (ili_ice_mode_read(MSPI_INIT_EN_ADDR, &backup_mspi_init_en, 1) < 0) + ILI_ERR("Read MSPI_INIT_EN_ADDR failed\n"); + + if (ili_ice_mode_write(MSPI_INIT_EN_ADDR, backup_mspi_init_en & 0xFE, 1) < 0) + ILI_ERR("Write MSPI_INIT_EN_ADDR failed\n"); + + ili_dma_write_setting(); + + if (ili_ice_mode_read(TRANSFER_CNT_ADDR, &write_data, sizeof(u32)) < 0) + ILI_ERR("Read TRANSFER_CNT_ADDR failed\n"); + + write_data = (write_data & 0xFFFC0000) + 5 + len; + + if (ili_ice_mode_write(TRANSFER_CNT_ADDR, write_data, sizeof(u32)) < 0) + ILI_ERR("Write TRANSFER_CNT_ADDR failed\n"); + + if (ili_ice_mode_read(WRITE_BUF_SIZE_ADDR, &write_data, 2) < 0) + ILI_ERR("Read WRITE_BUF_SIZE_ADDR failed\n"); + + write_data = (write_data & 0xF800) + 5 + len; + + if (ili_ice_mode_write(WRITE_BUF_SIZE_ADDR, write_data, 2) < 0) + ILI_ERR("Write WRITE_BUF_SIZE_ADDR failed\n"); + + if (ili_ice_mode_read(READ_BUF_SIZE_ADDR, &write_data, 2) < 0) + ILI_ERR("Read READ_BUF_SIZE_ADDR failed\n"); + + write_data = write_data & 0xF800; + + if (ili_ice_mode_write(READ_BUF_SIZE_ADDR, write_data, 2) < 0) + ILI_ERR("Write READ_BUF_SIZE_ADDR failed\n"); + + if (addr == CONTROL_SLAVE_EXIT_ICE_ADDR) { + write_data = ((addr & 0xFF00) << 16) + ((addr & 0xFF) << 16) + (0x1B << 8) + 0x82; + } else { + write_data = ((addr & 0xFF00) << 16) + ((addr & 0xFF) << 16) + (0x25 << 8) + 0x82; + } + + if (ili_ice_mode_write(WRITE_BUF_ADDR, write_data, sizeof(u32)) < 0) + ILI_ERR("Write WRITE_BUF_ADDR failed\n"); + + write_data = ((data & 0xFF0000) << 8) + ((data & 0xFF00) << 8) + ((data & 0xFF) << 8) + ((addr & 0xFF0000) >> 16); + + if (ili_ice_mode_write(0x308D0, write_data, sizeof(u32)) < 0) { + ILI_ERR("Write failed\n"); + ret = -1; + } + + write_data = (data & 0xFF000000) >> 24; + + if (ili_ice_mode_write(0x308D4, write_data, sizeof(u32)) < 0) { + ILI_ERR("Write failed\n"); + ret = -1; + } + + ili_trigger_mspi(); + + /* Recovery Mspi int en */ + if (ili_ice_mode_write(MSPI_INIT_EN_ADDR, backup_mspi_init_en, 1) < 0) + ILI_ERR("Write MSPI_INIT_EN_ADDR failed\n"); + + return ret; +} + +void ili_mspi_read_slave_register(u32 addr, u32 *data, int len) +{ + u32 read_data, backup_mspi_init_en; + + ili_mspi_write_slave_register(addr, 0, 0); + + if (ili_ice_mode_read(MSPI_INIT_EN_ADDR, &backup_mspi_init_en, 1) < 0) + ILI_ERR("Read MSPI_INIT_EN_ADDR failed\n"); + + + if (ili_ice_mode_write(MSPI_INIT_EN_ADDR, backup_mspi_init_en & 0xFE, 1) < 0) + ILI_ERR("Write MSPI_INIT_EN_ADDR failed\n"); + + ili_dma_read_setting(); + + if (ili_ice_mode_write(WRITE_BUF_ADDR, 0x83, 1) < 0) + ILI_ERR("Write WRITE_BUF_ADDR failed\n"); + + if (ili_ice_mode_read(TRANSFER_CNT_ADDR, &read_data, sizeof(u32)) < 0) + ILI_ERR("Read TRANSFER_CNT_ADDR failed\n"); + + read_data = (read_data & 0xFFFC0000) + len; + + if (ili_ice_mode_write(TRANSFER_CNT_ADDR, read_data, sizeof(u32)) < 0) + ILI_ERR("Write TRANSFER_CNT_ADDR failed\n"); + + if (ili_ice_mode_read(WRITE_BUF_SIZE_ADDR, &read_data, 2) < 0) + ILI_ERR("Read WRITE_BUF_SIZE_ADDR failed\n"); + + read_data = (read_data & 0xF800) + 0x01; + + if (ili_ice_mode_write(WRITE_BUF_SIZE_ADDR, read_data, 2) < 0) + ILI_ERR("Write WRITE_BUF_SIZE_ADDR failed\n"); + + if (ili_ice_mode_read(READ_BUF_SIZE_ADDR, &read_data, 2) < 0) + ILI_ERR("Read READ_BUF_SIZE_ADDR failed\n"); + + read_data = (read_data & 0xF800) + len; + + if (ili_ice_mode_write(READ_BUF_SIZE_ADDR, read_data, 2) < 0) + ILI_ERR("Write READ_BUF_SIZE_ADDR failed\n"); + + ili_trigger_mspi(); + + /* Recovery Mspi int en */ + if (ili_ice_mode_write(MSPI_INIT_EN_ADDR, backup_mspi_init_en, 1) < 0) + ILI_ERR("Write MSPI_INIT_EN_ADDR failed\n"); + + if (ili_ice_mode_read(0x308D0, data, len) < 0) + ILI_ERR("Read 0x308D0 failed\n"); +} + +int ili_set_bypass_mode(bool mcu) +{ +#if (TDDI_INTERFACE == BUS_SPI) + if (atomic_read(&ilits->ice_stat)) { + ILI_INFO("ice mode already enabled\n"); + return 0; + } + + ili_ice_mode_ctrl_by_mode(ENABLE, mcu, MASTER); + + /* set mspi 0 */ + if (ili_ice_mode_write_by_mode(MSPI_REG, 0x00, 1, MASTER) < 0) { + ILI_ERR("Failed to write MSPI_REG in ice mode\n"); + } + + /* set s_to_q bit[1] = 1 */ + ili_ice_mode_write(SINGLE_TO_QUAL_REG, 0x02, 1); + + /* set slave ic to ice mode */ + atomic_set(&ilits->ice_stat, DISABLE); + + atomic_set(&ilits->slave_ice_stat, ENABLE); + ILI_INFO("Set slave ice state atomic : %d\n", atomic_read(&ilits->slave_ice_stat)); + + ili_ice_mode_ctrl_by_mode(ENABLE, mcu, SLAVE); + + ILI_INFO("Set ByPass Mode\n"); +#endif + return 0; +} + +void ili_wdt_reset_status( bool enter_ice, bool exit_ice) +{ +#if (TDDI_INTERFACE == BUS_I2C) + if (enter_ice) { + if (atomic_read(&ilits->ice_stat)) { + ILI_INFO("ice mode already enabled\n"); + } else { + ili_ice_mode_ctrl_by_mode(ENABLE, OFF, BOTH); + } + } +#else + if (enter_ice) { + if (atomic_read(&ilits->ice_stat)) { + ILI_INFO("ice mode already enabled\n"); + } else { + ili_set_bypass_mode(OFF); + } + } +#endif + if (ili_ice_mode_write_by_mode(WDT_ADDR, 0x01, 1, BOTH) > 0) { + ILI_INFO("Clear Master & Slave WDT Status\n"); + } + + if (exit_ice) { + if (!atomic_read(&ilits->ice_stat)) { + ILI_INFO("ice mode already disabled\n"); + } else { + ili_ice_mode_ctrl_by_mode(DISABLE, OFF, BOTH); + } + } +} + +void ili_ic_edge_palm_para_init(void) +{ +#if ENABLE_EDGE_PALM_PARA + int i; + + ilits->edge_palm_para[0] = P5_X_EDGE_PLAM_CTRL_1; + ilits->edge_palm_para[1] = P5_X_EDGE_PALM_TUNING_PARA; + ilits->edge_palm_para[2] = (ZONE_A_W & 0xFF00) >> 8; + ilits->edge_palm_para[3] = ZONE_A_W & 0xFF; + ilits->edge_palm_para[4] = (ZONE_B_W & 0xFF00) >> 8; + ilits->edge_palm_para[5] = ZONE_B_W & 0xFF; + ilits->edge_palm_para[6] = (ZONE_A_ROTATION_W & 0xFF00) >> 8; + ilits->edge_palm_para[7] = ZONE_A_ROTATION_W & 0xFF; + ilits->edge_palm_para[8] = (ZONE_B_ROTATION_W & 0xFF00) >> 8; + ilits->edge_palm_para[9] = ZONE_B_ROTATION_W & 0xFF; + ilits->edge_palm_para[10] = (ZONE_C_WIDTH & 0xFF00) >> 8; + ilits->edge_palm_para[11] = ZONE_C_WIDTH & 0xFF; + ilits->edge_palm_para[12] = (ZONE_C_HEIGHT & 0xFF00) >> 8; + ilits->edge_palm_para[13] = ZONE_C_HEIGHT & 0xFF; + ilits->edge_palm_para[14] = (ZONE_C_HEIGHT_LITTLE & 0xFF00) >> 8; + ilits->edge_palm_para[15] = ZONE_C_HEIGHT_LITTLE & 0xFF; + ilits->edge_palm_para[16] = (ZONE_A_W & 0xFF00) >> 8; + ilits->edge_palm_para[17] = ZONE_A_W & 0xFF; + ilits->edge_palm_para[18] = (ZONE_B_W & 0xFF00) >> 8; + ilits->edge_palm_para[19] = ZONE_B_W & 0xFF; + ilits->edge_palm_para[20] = (ZONE_A_ROTATION_W & 0xFF00) >> 8; + ilits->edge_palm_para[21] = ZONE_A_ROTATION_W & 0xFF; + ilits->edge_palm_para[22] = (ZONE_B_ROTATION_W & 0xFF00) >> 8; + ilits->edge_palm_para[23] = ZONE_B_ROTATION_W & 0xFF; + ilits->edge_palm_para[24] = (ZONE_C_WIDTH & 0xFF00) >> 8; + ilits->edge_palm_para[25] = ZONE_C_WIDTH & 0xFF; + ilits->edge_palm_para[26] = (ZONE_C_HEIGHT & 0xFF00) >> 8; + ilits->edge_palm_para[27] = ZONE_C_HEIGHT & 0xFF; + ilits->edge_palm_para[28] = (ZONE_C_HEIGHT_LITTLE & 0xFF00) >> 8; + ilits->edge_palm_para[29] = ZONE_C_HEIGHT_LITTLE & 0xFF; + ilits->edge_palm_para[30] = ili_calc_packet_checksum(ilits->edge_palm_para, P5_X_EDGE_PALM_PARA_LENGTH - 1); + + for (i = 0; i < P5_X_EDGE_PALM_PARA_LENGTH; i++) { + ILI_DBG("edge_palm_para[%d] = 0x%2x\n", i, ilits->edge_palm_para[i]); + } +#endif +} +void ili_ic_send_edge_palm_para(void) +{ +#if ENABLE_EDGE_PALM_PARA + int ret = 0; + + ILI_INFO("send edge palm para\n"); + + ret = ilits->wrapper(ilits->edge_palm_para, P5_X_EDGE_PALM_PARA_LENGTH, NULL, 0, OFF, OFF); + if (ret < 0) + ILI_ERR("Write edge palm para function failed\n"); +#endif +} + +int ili_ic_func_ctrl_export(const char *name, int ctrl) +{ + int i = 0, ret; + if (ERR_ALLOC_MEM(ilits)) { + ILI_ERR("Failed to allocate ts memory, ilits is NULL.\n"); + return -ENOMEM; + } + + mutex_lock(&ilits->touch_mutex); + for (i = 0; i < FUNC_CTRL_NUM; i++) { + if (ipio_strcmp(name, func_ctrl[i].name) == 0) { + if (strlen(name) != strlen(func_ctrl[i].name)) + continue; + break; + } + } + + if (i >= FUNC_CTRL_NUM) { + ILI_ERR("Not found function ctrl, %s\n", name); + ret = -1; + goto out; + } + + if (ilits->protocol->ver == PROTOCOL_VER_500) { + ILI_ERR("Non support function ctrl with protocol v5.0\n"); + ret = -1; + goto out; + } + + if (ilits->protocol->ver >= PROTOCOL_VER_560) { + if (ipio_strcmp(func_ctrl[i].name, "gesture") == 0 || + ipio_strcmp(func_ctrl[i].name, "phone_cover_window") == 0) { + ILI_INFO("Non support %s function ctrl\n", func_ctrl[i].name); + ret = -1; + goto out; + } + } + + func_ctrl[i].cmd[2] = ctrl; + + ILI_INFO("func = %s, len = %d, cmd = 0x%x, 0%x, 0x%x\n", func_ctrl[i].name, func_ctrl[i].len, + func_ctrl[i].cmd[0], func_ctrl[i].cmd[1], func_ctrl[i].cmd[2]); + + ret = ilits->wrapper(func_ctrl[i].cmd, func_ctrl[i].len, NULL, 0, OFF, OFF); + if (ret < 0) + ILI_ERR("Write TP function failed\n"); + + if (func_ctrl[i].rec_state < 2) { + if (ctrl == func_ctrl[i].def_cmd) + func_ctrl[i].rec_state = DISABLE; + else + func_ctrl[i].rec_state = ENABLE; + + func_ctrl[i].rec_cmd = ctrl; + } + + ILI_DBG("record %s func cmd %d, rec_state %d\n", func_ctrl[i].name, func_ctrl[i].rec_cmd, func_ctrl[i].rec_state); +out: + mutex_unlock(&ilits->touch_mutex); + return ret; +} +EXPORT_SYMBOL(ili_ic_func_ctrl_export); + + +int ili_ic_func_ctrl(const char *name, int ctrl) +{ + int i = 0, ret; + + for (i = 0; i < FUNC_CTRL_NUM; i++) { + if (ipio_strcmp(name, func_ctrl[i].name) == 0) { + if (strlen(name) != strlen(func_ctrl[i].name)) + continue; + break; + } + } + + if (i >= FUNC_CTRL_NUM) { + ILI_ERR("Not found function ctrl, %s\n", name); + ret = -1; + goto out; + } + + if (ilits->protocol->ver == PROTOCOL_VER_500) { + ILI_ERR("Non support function ctrl with protocol v5.0\n"); + ret = -1; + goto out; + } + + if (ilits->protocol->ver >= PROTOCOL_VER_560) { + if (ipio_strcmp(func_ctrl[i].name, "gesture") == 0 || + ipio_strcmp(func_ctrl[i].name, "phone_cover_window") == 0) { + ILI_INFO("Non support %s function ctrl\n", func_ctrl[i].name); + ret = -1; + goto out; + } + } + + if (ilits->chip->core_ver >= CORE_VER_1700) { + if (ipio_strcmp(func_ctrl[i].name, "sense") == 0) { + ILI_INFO("Non support %s function ctrl after core ver %x\n", func_ctrl[i].name, ilits->chip->core_ver); + ret = -1; + goto out; + } + } + + func_ctrl[i].cmd[2] = ctrl; + + ILI_INFO("func = %s, len = %d, cmd = 0x%x, 0x%x, 0x%x\n", func_ctrl[i].name, func_ctrl[i].len, + func_ctrl[i].cmd[0], func_ctrl[i].cmd[1], func_ctrl[i].cmd[2]); + + ret = ilits->wrapper(func_ctrl[i].cmd, func_ctrl[i].len, NULL, 0, OFF, OFF); + if (ret < 0) + ILI_ERR("Write TP function failed\n"); + + if (func_ctrl[i].rec_state < 2) { + if (ctrl == func_ctrl[i].def_cmd) + func_ctrl[i].rec_state = DISABLE; + else + func_ctrl[i].rec_state = ENABLE; + + func_ctrl[i].rec_cmd = ctrl; + } + + ILI_DBG("record %s func cmd %d, rec_state %d\n", func_ctrl[i].name, func_ctrl[i].rec_cmd, func_ctrl[i].rec_state); +out: + return ret; +} + +void ili_ic_func_ctrl_reset(void) +{ + int i = 0; + + ili_ic_send_edge_palm_para(); + + for (i = 0; i < FUNC_CTRL_NUM; i++) { + if (func_ctrl[i].rec_state == ENABLE) { + ILI_DBG("reset func ctrl %s, record status = %d, cmd = %d\n", func_ctrl[i].name, + func_ctrl[i].rec_state, func_ctrl[i].rec_cmd); + if (ili_ic_func_ctrl(func_ctrl[i].name, func_ctrl[i].rec_cmd) < 0) + ILI_ERR("reset ic func ctrl %s failed\n", func_ctrl[i].name); + } + } +} + +int ili_ic_code_reset(bool mcu) +{ + int ret; + bool ice = atomic_read(&ilits->ice_stat); + + if (!ice) { + if (ilits->cascade_info_block.nNum != 0) { +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(ENABLE, mcu, BOTH); +#else + ili_set_bypass_mode(mcu); +#endif + } else { + if (ili_ice_mode_ctrl(ENABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed before code reset\n"); + } + } + + ret = ili_ice_mode_write_by_mode(0x40040, 0xAE, 1, BOTH); + if (ret < 0) + ILI_ERR("ic code reset failed\n"); + + if (!ice) { + if (ilits->cascade_info_block.nNum != 0) { +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, BOTH); +#else + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, BOTH); +#endif + } else { + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed after code reset\n"); + } + } + return ret; +} + +void ili_get_dma1_config(struct ilitek_dma_config *dma) +{ + /* dma1 src1 address */ + if (ili_ice_mode_read(0x072104, &dma->src_addr, 4) < 0) + ILI_ERR("read dma1 src1 address failed\n"); + /* dma1 src1 format */ + if (ili_ice_mode_read(0x072108, &dma->src_fmt, 4) < 0) + ILI_ERR("read dma1 src1 format failed\n"); + /* dma1 dest address */ + if (ili_ice_mode_read(0x072114, &dma->dest_addr, 4) < 0) + ILI_ERR("read dma1 src1 format failed\n"); + /* dma1 dest format */ + if (ili_ice_mode_read(0x072118, &dma->dest_fmt, 4) < 0) + ILI_ERR("read dma1 dest format failed\n"); + /* Block size */ + if (ili_ice_mode_read(0x07211C, &dma->block_size, 4) < 0) + ILI_ERR("read block size (%d) failed\n", dma->block_size); + ILI_DBG("dma.src_addr=0x%x, dma.src_fmt=0x%x, dma.dest_addr=0x%x, dma.dest_fmt=0x%x, dma.block_size=0x%x\n" + , dma->src_addr, dma->src_fmt, dma->dest_addr, dma->dest_fmt, dma->block_size); +} + +void ili_set_dma1_config(struct ilitek_dma_config *dma) +{ + ILI_DBG("dma.src_addr=0x%x, dma.src_fmt=0x%x, dma.dest_addr=0x%x, dma.dest_fmt=0x%x, dma.block_size=0x%x\n" + , dma->src_addr, dma->src_fmt, dma->dest_addr, dma->dest_fmt, dma->block_size); + /* dma1 src1 address */ + if (ili_ice_mode_write(0x072104, dma->src_addr, 4) < 0) + ILI_ERR("Write dma1 src1 address failed\n"); + /* dma1 src1 format */ + if (ili_ice_mode_write(0x072108, dma->src_fmt, 4) < 0) + ILI_ERR("Write dma1 src1 format failed\n"); + /* dma1 dest address */ + if (ili_ice_mode_write(0x072114, dma->dest_addr, 4) < 0) + ILI_ERR("Write dma1 src1 format failed\n"); + /* dma1 dest format */ + if (ili_ice_mode_write(0x072118, dma->dest_fmt, 4) < 0) + ILI_ERR("Write dma1 dest format failed\n"); + /* Block size*/ + if (ili_ice_mode_write(0x07211C, dma->block_size, 4) < 0) + ILI_ERR("Write block size (%d) failed\n", dma->block_size); + /* Disable CRC calc settings */ + if (ili_ice_mode_write(0x041014, 0x0, 4) < 0) + ILI_ERR("Write dma CRC calc settings failed\n"); + /* Dma1 stop */ + if (ili_ice_mode_write(0x072100, 0x02040000, 4) < 0) + ILI_ERR("Write dma1 stop failed\n"); + /* clr int */ + if (ili_ice_mode_write(0x048006, 0x2, 1) < 0) + ILI_ERR("Write clr int failed\n"); + /* Dma1 start */ + if (ili_ice_mode_write(0x072100, 0x01040000, 4) < 0) + ILI_ERR("Write dma1 start failed\n"); +} + +int ili_ic_whole_reset(bool mcu, bool withflash) +{ + int ret = 0; + bool ice = atomic_read(&ilits->ice_stat); + + if (withflash) + ilits->chip->reset_key = TDDI_WHOLE_CHIP_RST_WITH_FLASH_KEY; + else + ilits->chip->reset_key = TDDI_WHOLE_CHIP_RST_WITHOUT_FLASH_KEY; + + if (!ice) { +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + ili_ice_mode_ctrl_by_mode(ENABLE, mcu, BOTH); +#elif (TDDI_INTERFACE == BUS_SPI && ENABLE_CASCADE) + ili_set_bypass_mode(mcu); +#else + if (ili_ice_mode_ctrl(ENABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed before chip reset\n"); +#endif + } + + if (!withflash) + ili_ice_mode_write_by_mode(ilits->chip->reset_addr, TDDI_WHOLE_CHIP_RST_WITHOUT_FLASH_PRE_KEY, sizeof(u32), BOTH); + + ILI_INFO("ic whole reset key = 0x%x, edge_delay = %d, withflash = %d\n", + ilits->chip->reset_key, ilits->rst_edge_delay, withflash); + + ret = ili_ice_mode_write_by_mode(ilits->chip->reset_addr, ilits->chip->reset_key, sizeof(u32), BOTH); + if (ret < 0) { + ILI_ERR("ic whole reset failed\n"); + goto out; + } + + /* Need accurate power sequence, do not change it to msleep */ + mdelay(ilits->rst_edge_delay); + +out: + if (!ice) { +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, BOTH); +#elif (TDDI_INTERFACE == BUS_SPI && ENABLE_CASCADE) + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, BOTH); +#else + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed after chip reset\n"); +#endif + } + + return ret; +} + +static void ilitek_tddi_ic_cascade_wr_pack(int packet) +{ + int ret = 0, retry = 100; + u32 reg_data = 0; + + while (retry--) { +#if (TDDI_INTERFACE == BUS_I2C) + if (ili_ice_mode_read_by_mode(0x73010, ®_data, sizeof(u8), ilits->slave_wr_ctrl) < 0) + ILI_ERR("Read 0x73010 error\n"); +#else + if (ilits->slave_wr_ctrl) { + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x73010, ®_data, sizeof(reg_data)); + ILI_DBG("check ok 0x73010 read Master 0x%X\n", reg_data); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, ®_data, sizeof(reg_data)); + ILI_DBG("check ok 0x62030 read Slave 0x%X\n", reg_data); + reg_data = (reg_data >> 24) & 0xFF; + } else { + if (ili_ice_mode_read(0x73010, ®_data, sizeof(u8)) < 0) + ILI_ERR("Read 0x73010 error\n"); + } +#endif + if ((reg_data & 0x02) == 0) { + ILI_INFO("check ok 0x73010 read 0x%X retry = %d\n", reg_data, retry); + break; + } + + mdelay(10); + } + + if (retry <= 0) + ILI_INFO("check 0x73010 error read 0x%X\n", reg_data); + +#if (TDDI_INTERFACE == BUS_I2C) + ret = ili_ice_mode_write_by_mode(0x73000, packet, 4, ilits->slave_wr_ctrl); +#else + if (ilits->slave_wr_ctrl) { + ret = ili_mspi_write_slave_register(0x73000, packet, 4); + + /* set mspi 0 */ + if (ili_ice_mode_write_by_mode(MSPI_REG, 0x00, 1, MASTER) < 0) + ILI_ERR("Failed to write MSPI_REG in ice mode\n"); + } else { + ret = ili_ice_mode_write(0x73000, packet, 4); + } +#endif + if (ret < 0) { + ILI_ERR("Write %x at 0x73000 Fail\n", packet); + } +} + +static u32 ilitek_tddi_ic_cascade_rd_pack(int packet) +{ + int ret = 0, retry = 100; + u32 reg_data = 0; + + ilitek_tddi_ic_cascade_wr_pack(packet); + + while (retry--) { +#if (TDDI_INTERFACE == BUS_I2C) + if (ili_ice_mode_read_by_mode(0x4800A, ®_data, sizeof(u8), ilits->slave_wr_ctrl) < 0) + ILI_ERR("Read 0x4800A error\n"); +#else + if (ilits->slave_wr_ctrl) { + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x4800A, ®_data, sizeof(reg_data)); + ILI_DBG("check ok 0x4800A read Master 0x%X\n", reg_data); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, ®_data, sizeof(reg_data)); + ILI_DBG("check ok 0x4800A read Slave 0x%X\n", reg_data); + reg_data = (reg_data >> 24) & 0xFF; + } else { + if (ili_ice_mode_read(0x4800A, ®_data, sizeof(u8)) < 0) + ILI_ERR("Read 0x4800A error\n"); + } +#endif + + if ((reg_data & 0x02) == 0x02) { + ILI_INFO("check ok 0x4800A read 0x%X retry = %d\n", reg_data, retry); + break; + } + mdelay(10); + } + + if (retry <= 0) + ILI_INFO("check 0x4800A error read 0x%X\n", reg_data); + +#if (TDDI_INTERFACE == BUS_I2C) + ret = ili_ice_mode_write_by_mode(0x4800A, 0x02, 1, ilits->slave_wr_ctrl); +#else + if (ilits->slave_wr_ctrl) { + ret = ili_mspi_write_slave_register(0x4800A, 0x02, 1); + + /* set mspi 0 */ + if (ili_ice_mode_write_by_mode(MSPI_REG, 0x00, 1, MASTER) < 0) + ILI_ERR("Failed to write MSPI_REG in ice mode\n"); + } else { + ret = ili_ice_mode_write(0x4800A, 0x02, 1); + } +#endif + if (ret < 0) { + ILI_ERR("Write 0x2 at 0x4800A Fail\n"); + } + +#if (TDDI_INTERFACE == BUS_I2C) + if (ili_ice_mode_read_by_mode(0x73016, ®_data, sizeof(u8), ilits->slave_wr_ctrl) < 0) + ILI_ERR("Read 0x73016 error\n"); +#else + if (ilits->slave_wr_ctrl) { + ili_ice_mode_write(READ_BACK_LOCK_REG, 0x01, 1); + ili_ice_mode_read(0x73016, ®_data, sizeof(reg_data)); + ILI_DBG("check ok 0x73016 read Master 0x%X\n", reg_data); + ili_ice_mode_read(SLAVE_READ_BACK_WORD_REG, ®_data, sizeof(reg_data)); + ILI_DBG("check ok 0x73016 read Slave 0x%X\n", reg_data); + reg_data = (reg_data >> 24) & 0xFF; + } else { + if (ili_ice_mode_read(0x73016, ®_data, sizeof(u8)) < 0) + ILI_ERR("Read 0x73016 error\n"); + } +#endif + + return reg_data; +} + +void ili_ic_set_cascade_ddi_reg_onepage(u8 page, u8 reg, u8 data, bool mcu) +{ + + u32 setpage = 0x1FFFFF00 | page; + u32 setreg = 0x1F000100 | (reg << 16) | data; + bool ice = atomic_read(&ilits->ice_stat); + u8 spiclk_num = 3; + + ILI_INFO("setpage = 0x%X setreg = 0x%X\n", setpage, setreg); + + if (ilits->slave_wr_ctrl) { + ili_core_spi_setup(spiclk_num); + } + + if (!ice) { +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(ENABLE, mcu, ilits->slave_wr_ctrl); +#else + if (ilits->slave_wr_ctrl) { + ili_set_bypass_mode(mcu); + } else { + ili_ice_mode_ctrl(ENABLE, mcu); + } +#endif + } + + /*TDI_WR_KEY*/ + ilitek_tddi_ic_cascade_wr_pack(0x1FFF9527); + /*Switch to Page*/ + ilitek_tddi_ic_cascade_wr_pack(setpage); + /* Page*/ + ilitek_tddi_ic_cascade_wr_pack(setreg); + /*TDI_WR_KEY OFF*/ + ilitek_tddi_ic_cascade_wr_pack(0x1FFF9500); + + if (!ice) { +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, ilits->slave_wr_ctrl); +#else + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, ilits->slave_wr_ctrl); +#endif + } + + if (ilits->slave_wr_ctrl) { + ili_core_spi_setup(SPI_CLK); + } +} + +void ili_ic_get_cascade_ddi_reg_onepage(u8 page, u8 reg, u8 *data, bool mcu) +{ + int ret = 0; + u32 setpage = 0x1FFFFF00 | page; + u32 setreg = 0x2F000100 | (reg << 16); + bool ice = atomic_read(&ilits->ice_stat); + u8 spiclk_num = 3; + + ILI_INFO("setpage = 0x%X setreg = 0x%X\n", setpage, setreg); + + if (ilits->slave_wr_ctrl) { + ili_core_spi_setup(spiclk_num); + } + + if (!ice) { +#if (TDDI_INTERFACE == BUS_I2C) + if (ili_ice_mode_ctrl_by_mode(ENABLE, mcu, ilits->slave_wr_ctrl) < 0) + ILI_ERR("Enable ice mode failed before reading ddi reg\n"); +#else + if (ilits->slave_wr_ctrl) { + ili_set_bypass_mode(mcu); + } else { + if (ili_ice_mode_ctrl(ENABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed before reading ddi reg\n"); + } +#endif + } + + /*TDI_WR_KEY*/ + ilitek_tddi_ic_cascade_wr_pack(0x1FFF9527); + /*Set Read Page reg*/ + ilitek_tddi_ic_cascade_wr_pack(setpage); + + /*TDI_RD_KEY*/ + ilitek_tddi_ic_cascade_wr_pack(0x1FFF9487); + + /*( *( __IO uint8 *) (0x4800A) ) =0x2*/ +#if (TDDI_INTERFACE == BUS_I2C) + ret = ili_ice_mode_write_by_mode(0x4800A, 0x02, 1, ilits->slave_wr_ctrl); +#else + if (ilits->slave_wr_ctrl) { + ret = ili_mspi_write_slave_register(0x4800A, 0x02, 1); + + /* set mspi 0 */ + if (ili_ice_mode_write_by_mode(MSPI_REG, 0x00, 1, MASTER) < 0) + ILI_ERR("Failed to write MSPI_REG in ice mode\n"); + } else { + ret = ili_ice_mode_write(0x4800A, 0x02, 1); + } +#endif + if (ret < 0) { + ILI_ERR("Write 0x2 at 0x4800A Fail\n"); + } + + *data = ilitek_tddi_ic_cascade_rd_pack(setreg); + ILI_INFO("check page = 0x%X, reg = 0x%X, read 0x%X\n", page, reg, *data); + + /*TDI_RD_KEY OFF*/ + ilitek_tddi_ic_cascade_wr_pack(0x1FFF9400); + /*TDI_WR_KEY OFF*/ + ilitek_tddi_ic_cascade_wr_pack(0x1FFF9500); + + if (!ice) { +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, ilits->slave_wr_ctrl); +#else + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, ilits->slave_wr_ctrl); +#endif + } + + if (ilits->slave_wr_ctrl) { + ili_core_spi_setup(SPI_CLK); + } +} + +static void ilitek_tddi_ic_wr_pack(int packet) +{ + int retry = 100; + u32 reg_data = 0; + + while (retry--) { + if (ili_ice_mode_read(0x73010, ®_data, sizeof(u8)) < 0) + ILI_ERR("Read 0x73010 error\n"); + + if ((reg_data & 0x02) == 0) { + ILI_INFO("check ok 0x73010 read 0x%X retry = %d\n", reg_data, retry); + break; + } + mdelay(10); + } + + if (retry <= 0) + ILI_INFO("check 0x73010 error read 0x%X\n", reg_data); + + if (ili_ice_mode_write(0x73000, packet, 4) < 0) + ILI_ERR("Write %x at 0x73000\n", packet); +} + +static u32 ilitek_tddi_ic_rd_pack(int packet) +{ + int retry = 100; + u32 reg_data = 0; + + ilitek_tddi_ic_wr_pack(packet); + + while (retry--) { + if (ili_ice_mode_read(0x4800A, ®_data, sizeof(u8)) < 0) + ILI_ERR("Read 0x4800A error\n"); + + if ((reg_data & 0x02) == 0x02) { + ILI_INFO("check ok 0x4800A read 0x%X retry = %d\n", reg_data, retry); + break; + } + mdelay(10); + } + if (retry <= 0) + ILI_INFO("check 0x4800A error read 0x%X\n", reg_data); + + if (ili_ice_mode_write(0x4800A, 0x02, 1) < 0) + ILI_ERR("Write 0x2 at 0x4800A\n"); + + if (ili_ice_mode_read(0x73016, ®_data, sizeof(u8)) < 0) + ILI_ERR("Read 0x73016 error\n"); + + return reg_data; +} + +void ili_ic_set_ddi_reg_onepage(u8 page, u8 reg, u8 data, bool mcu) +{ + u32 setpage = 0x1FFFFF00 | page; + u32 setreg = 0x1F000100 | (reg << 16) | data; + bool ice = atomic_read(&ilits->ice_stat); + + ILI_INFO("setpage = 0x%X setreg = 0x%X\n", setpage, setreg); + + if (!ice) + if (ili_ice_mode_ctrl(ENABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed before writing ddi reg\n"); + + /*TDI_WR_KEY*/ + ilitek_tddi_ic_wr_pack(0x1FFF9527); + /*Switch to Page*/ + ilitek_tddi_ic_wr_pack(setpage); + /* Page*/ + ilitek_tddi_ic_wr_pack(setreg); + /*TDI_WR_KEY OFF*/ + ilitek_tddi_ic_wr_pack(0x1FFF9500); + + if (!ice) + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) + ILI_ERR("Disable ice mode failed after writing ddi reg\n"); +} + +void ili_ic_get_ddi_reg_onepage(u8 page, u8 reg, u8 *data, bool mcu) +{ + u32 setpage = 0x1FFFFF00 | page; + u32 setreg = 0x2F000100 | (reg << 16); + bool ice = atomic_read(&ilits->ice_stat); + + ILI_INFO("setpage = 0x%X setreg = 0x%X\n", setpage, setreg); + + if (!ice) + if (ili_ice_mode_ctrl(ENABLE, mcu) < 0) + ILI_ERR("Enable ice mode failed before reading ddi reg\n"); + + /*TDI_WR_KEY*/ + ilitek_tddi_ic_wr_pack(0x1FFF9527); + /*Set Read Page reg*/ + ilitek_tddi_ic_wr_pack(setpage); + + /*TDI_RD_KEY*/ + ilitek_tddi_ic_wr_pack(0x1FFF9487); + /*( *( __IO uint8 *) (0x4800A) ) =0x2*/ + if (ili_ice_mode_write(0x4800A, 0x02, 1) < 0) + ILI_ERR("Write 0x2 at 0x4800A\n"); + + *data = ilitek_tddi_ic_rd_pack(setreg); + ILI_INFO("check page = 0x%X, reg = 0x%X, read 0x%X\n", page, reg, *data); + + /*TDI_RD_KEY OFF*/ + ilitek_tddi_ic_wr_pack(0x1FFF9400); + /*TDI_WR_KEY OFF*/ + ilitek_tddi_ic_wr_pack(0x1FFF9500); + + if (!ice) + if (ili_ice_mode_ctrl(DISABLE, mcu) < 0) + ILI_ERR("Disable ice mode failed after reading ddi reg\n"); +} + +void ili_ic_get_pc_counter(int stat) +{ + bool ice = atomic_read(&ilits->ice_stat); + u32 pc = 0, pc_addr = ilits->chip->pc_counter_addr; + u32 latch = 0, latch_addr = ilits->chip->pc_latch_addr; + int ret = 0; +#if (TDDI_INTERFACE == BUS_SPI) + u32 mcu_state = 0; + bool read = 0; +#endif + + ILI_DBG("stat = %d\n", stat); + + if (ilits->cascade_info_block.nNum != 0) { +#if (TDDI_INTERFACE == BUS_SPI) + if (stat == DO_SPI_RECOVER) + mcu_state = OFF; + else + mcu_state = ON; + + ili_cascade_rw_tp_reg(mcu_state, read, pc_addr, 0, 0, &pc); + ili_cascade_rw_tp_reg(mcu_state, read, latch_addr, 0, 0, &latch); + + ilits->fw_pc = pc; + ilits->fw_latch = latch; + + if (ilits->slave_wr_ctrl) { + ILI_ERR("Read Slave counter (addr: 0x%x) = 0x%x, latch (addr: 0x%x) = 0x%x\n", + pc_addr, ilits->fw_pc, latch_addr, ilits->fw_latch); + } else { + ILI_ERR("Read Master counter (addr: 0x%x) = 0x%x, latch (addr: 0x%x) = 0x%x\n", + pc_addr, ilits->fw_pc, latch_addr, ilits->fw_latch); + } + + /* Avoid screen abnormal. */ + if (stat == DO_SPI_RECOVER) { + atomic_set(&ilits->ice_stat, DISABLE); + return; + } + +#elif (TDDI_INTERFACE == BUS_I2C) + if (ilits->slave_wr_ctrl) { + ilits->i2c_addr_change = SLAVE; + ILI_DBG("Change to Slave Address\n"); + } else { + ilits->i2c_addr_change = MASTER; + ILI_DBG("Change to Master Address\n"); + } + + if (!ice) { + if (stat == DO_I2C_RECOVER) + ret = ili_ice_mode_ctrl_by_mode(ENABLE, OFF, ilits->slave_wr_ctrl); + else + ret = ili_ice_mode_ctrl_by_mode(ENABLE, ON, ilits->slave_wr_ctrl); + + if (ret < 0) + ILI_ERR("Enable ice mode failed while reading pc counter\n"); + } + + ili_ice_mode_read_by_mode(pc_addr, &pc, sizeof(u32), ilits->slave_wr_ctrl); + ili_ice_mode_read_by_mode(latch_addr, &latch, sizeof(u32), ilits->slave_wr_ctrl); + + ilits->fw_pc = pc; + ilits->fw_latch = latch; + + if (ilits->slave_wr_ctrl) { + ILI_ERR("Read Slave counter (addr: 0x%x) = 0x%x, latch (addr: 0x%x) = 0x%x\n", + pc_addr, ilits->fw_pc, latch_addr, ilits->fw_latch); + } else { + ILI_ERR("Read Master counter (addr: 0x%x) = 0x%x, latch (addr: 0x%x) = 0x%x\n", + pc_addr, ilits->fw_pc, latch_addr, ilits->fw_latch); + } + + if (!ice) { + if (ili_ice_mode_ctrl_by_mode(DISABLE, ON, ilits->slave_wr_ctrl) < 0) + ILI_ERR("Disable ice mode failed while reading pc counter\n"); + } +#endif + } else { + if (!ice) { + if (stat == DO_SPI_RECOVER || stat == DO_I2C_RECOVER) + ret = ili_ice_mode_ctrl(ENABLE, OFF); + else + ret = ili_ice_mode_ctrl(ENABLE, ON); + + if (ret < 0) + ILI_ERR("Enable ice mode failed while reading pc counter\n"); + } + + if (ili_ice_mode_read(pc_addr, &pc, sizeof(u32)) < 0) + ILI_ERR("Read pc conter error\n"); + + if (ili_ice_mode_read(latch_addr, &latch, sizeof(u32)) < 0) + ILI_ERR("Read pc latch error\n"); + + ilits->fw_pc = pc; + ilits->fw_latch = latch; + ILI_ERR("Read counter (addr: 0x%x) = 0x%x, latch (addr: 0x%x) = 0x%x\n", + pc_addr, ilits->fw_pc, latch_addr, ilits->fw_latch); + + /* Avoid screen abnormal. */ + if (stat == DO_SPI_RECOVER) { + atomic_set(&ilits->ice_stat, DISABLE); + return; + } + + if (!ice) { + if (ili_ice_mode_ctrl(DISABLE, ON) < 0) + ILI_ERR("Disable ice mode failed while reading pc counter\n"); + } + } +} + +int ili_ic_int_trigger_ctrl(bool pulse) +{ + /* It's supported by fw, and the level will be kept at high until data was already prepared. */ + if (ili_ic_func_ctrl("int_trigger", pulse) < 0) { + ILI_ERR("Write CMD error, set back to <%s> trigger\n", ilits->int_pulse ? "Level" : "Pulse"); + return -1; + } + + ilits->int_pulse = pulse; + ILI_INFO("INT Trigger = %s\n", ilits->int_pulse ? "Level" : "Pulse"); + return 0; +} + +int ili_ic_check_int_level(bool level) +{ + int timer = 3000; + int gpio = IRQ_GPIO_NUM; /* ilits->tp_int */ + + /* + * If callers have a trouble to use the gpio that is passed by vendors, + * please utlises a physical gpio number instead or call a help from them. + */ + + while (--timer > 0) { + if (level) { + if (gpio_get_value(gpio)) { + ILI_DBG("INT high detected.\n"); + return 0; + } + } else { + if (!gpio_get_value(gpio)) { + ILI_DBG("INT low detected.\n");; + return 0; + } + } + mdelay(1); + } + ILI_ERR("Error! INT level no detected.\n"); + return -1; +} + +int ili_ic_check_int_pulse(bool pulse) +{ + if (!wait_event_interruptible_timeout(ilits->inq, !atomic_read(&ilits->cmd_int_check), msecs_to_jiffies(ilits->wait_int_timeout))) { + ILI_ERR("Error! INT pulse no detected. Timeout = %d ms\n", ilits->wait_int_timeout); + atomic_set(&ilits->cmd_int_check, DISABLE); + return -1; + } + ILI_DBG("INT pulse detected.\n"); + return 0; +} + +int ili_ic_check_busy(int count, int delay, bool irq) +{ + u8 cmd[2] = {0}; + u8 busy = 0, rby = 0; + + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = P5_X_CDC_BUSY_STATE; + + if (ilits->actual_tp_mode == P5_X_FW_AP_MODE) + rby = 0x41; + else if (ilits->actual_tp_mode == P5_X_FW_TEST_MODE) + rby = 0x51; + else { + ILI_ERR("Unknown TP mode (0x%x)\n", ilits->actual_tp_mode); + return -EINVAL; + } + + ILI_INFO("read byte = %x, delay = %d\n", rby, delay); + + do { + if (ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF) < 0) + ILI_ERR("Write check busy cmd failed\n"); + + if (ilits->wrapper(&cmd[1], sizeof(u8), &busy, sizeof(u8), irq, OFF) < 0) + ILI_ERR("Read check busy failed\n"); + + ILI_DBG("busy = 0x%x\n", busy); + + if (busy == rby) { + ILI_INFO("Check busy free\n"); + return 0; + } + + mdelay(delay); + } while (--count > 0); + + ILI_ERR("Check busy (0x%x) timeout !\n", busy); + ili_ic_get_pc_counter(0); + + if (ilits->cascade_info_block.nNum != 0) { + ilits->slave_wr_ctrl = 1; + ili_ic_get_pc_counter(0); + ilits->slave_wr_ctrl = 0; + } + return -1; +} + +int ili_ic_get_project_id(u8 *pdata, int size) +{ + int i; + u32 tmp; + bool ice = atomic_read(&ilits->ice_stat); + + if (!pdata) { + ILI_ERR("pdata is null\n"); + return -ENOMEM; + } + + ILI_INFO("Read size = %d\n", size); + + if (!ice) + if (ili_ice_mode_ctrl(ENABLE, OFF) < 0) + ILI_ERR("Enable ice mode failed while reading project id\n"); + + if (ili_ice_mode_write(0x041000, 0x0, 1) < 0) + ILI_ERR("Pull cs low failed\n"); + if (ili_ice_mode_write(0x041004, 0x66aa55, 3) < 0) + ILI_ERR("Write key failed\n"); + + if (ili_ice_mode_write(0x041008, 0x03, 1) < 0) + ILI_ERR("Write 0x03 at 0x041008\n"); + + if (ili_ice_mode_write(0x041008, (RSV_BK_ST_ADDR & 0xFF0000) >> 16, 1) < 0) + ILI_ERR("Write address failed\n"); + if (ili_ice_mode_write(0x041008, (RSV_BK_ST_ADDR & 0x00FF00) >> 8, 1) < 0) + ILI_ERR("Write address failed\n"); + if (ili_ice_mode_write(0x041008, (RSV_BK_ST_ADDR & 0x0000FF), 1) < 0) + ILI_ERR("Write address failed\n"); + + for (i = 0; i < size; i++) { + if (ili_ice_mode_write(0x041008, 0xFF, 1) < 0) + ILI_ERR("Write dummy failed\n"); + if (ili_ice_mode_read(0x41010, &tmp, sizeof(u8)) < 0) + ILI_ERR("Read project id error\n"); + pdata[i] = tmp; + ILI_INFO("project_id[%d] = 0x%x\n", i, pdata[i]); + } + + ili_flash_clear_dma(); + + if (ili_ice_mode_write(0x041000, 0x1, 1) < 0) + ILI_ERR("Pull cs high\n"); + + if (!ice) + if (ili_ice_mode_ctrl(DISABLE, OFF) < 0) + ILI_ERR("Disable ice mode failed while reading project id\n"); + + return 0; +} + +int ili_ic_get_core_ver(void) +{ + int i = 0, ret = 0; + u8 cmd[2] = {0}, buf[10] = {0}; + + ilits->protocol->core_ver_len = P5_X_CORE_VER_FOUR_LENGTH; + + if (ilits->info_from_hex) { + buf[1] = ilits->fw_info[68]; + buf[2] = ilits->fw_info[69]; + buf[3] = ilits->fw_info[70]; + buf[4] = ilits->fw_info[71]; + goto out; + } + + do { + if (i == 0) { + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = P5_X_GET_CORE_VERSION_NEW; + } else { + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = P5_X_GET_CORE_VERSION; + ilits->protocol->core_ver_len = P5_X_CORE_VER_THREE_LENGTH; + } + + if (ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF) < 0) + ILI_ERR("Write core ver cmd failed\n"); + + if (ilits->wrapper(&cmd[1], sizeof(u8), buf, ilits->protocol->core_ver_len, ON, OFF) < 0) + ILI_ERR("Write core ver (0x%x) failed\n", cmd[1]); + + ILI_DBG("header = 0x%x\n", buf[0]); + + if (buf[0] == P5_X_GET_CORE_VERSION || + buf[0] == P5_X_GET_CORE_VERSION_NEW) + break; + + } while (++i < 2); + + if (buf[0] == P5_X_GET_CORE_VERSION) + buf[4] = 0; + + if (i >= 2) { + ILI_ERR("Invalid header (0x%x)\n", buf[0]); + ret = -EINVAL; + } + +out: + ILI_INFO("Core version = %d.%d.%d.%d\n", buf[1], buf[2], buf[3], buf[4]); + ilits->chip->core_ver = buf[1] << 24 | buf[2] << 16 | buf[3] << 8 | buf[4]; + return ret; +} + +void ili_fw_uart_ctrl(u8 ctrl) +{ + u8 cmd[4] = {0}; + + if (ctrl > 1) { + ILI_INFO("Unknown cmd, ignore\n"); + return; + } + + ILI_INFO("%s UART mode\n", ctrl ? "Enable" : "Disable"); + + cmd[0] = P5_X_I2C_UART; + cmd[1] = 0x3; + cmd[2] = 0; + cmd[3] = ctrl; + + if (ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF) < 0) { + ILI_INFO("Write fw uart cmd failed\n"); + return; + } +} + +int ili_ic_get_fw_ver(void) +{ + int ret = 0; + u8 cmd[2] = {0}; + u8 buf[10] = {0}; + + if (ilits->info_from_hex) { + buf[1] = ilits->fw_info[48]; + buf[2] = ilits->fw_info[49]; + buf[3] = ilits->fw_info[50]; + buf[4] = ilits->fw_info[51]; + buf[5] = ilits->fw_mp_ver[0]; + buf[6] = ilits->fw_mp_ver[1]; + buf[7] = ilits->fw_mp_ver[2]; + buf[8] = ilits->fw_mp_ver[3]; + goto out; + } + + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = P5_X_GET_FW_VERSION; + + if (ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Write pre cmd failed\n"); + ret = -EINVAL; + goto out; + + } + + if (ilits->wrapper(&cmd[1], sizeof(u8), buf, ilits->protocol->fw_ver_len, ON, OFF) < 0) { + ILI_ERR("Write fw version cmd failed\n"); + ret = -EINVAL; + goto out; + } + + if (buf[0] != P5_X_GET_FW_VERSION) { + ILI_ERR("Invalid firmware ver\n"); + ret = -1; + } + +out: + ILI_INFO("Firmware version = %d.%d.%d.%d\n", buf[1], buf[2], buf[3], buf[4]); + ILI_INFO("Firmware MP version = %d.%d.%d.%d\n", buf[5], buf[6], buf[7], buf[8]); + ilits->chip->fw_ver = buf[1] << 24 | buf[2] << 16 | buf[3] << 8 | buf[4]; + ilits->chip->fw_mp_ver = buf[5] << 24 | buf[6] << 16 | buf[7] << 8 | buf[8]; + return ret; +} + +int ili_ic_get_panel_info(void) +{ + int ret = 0; + u8 cmd = P5_X_GET_PANEL_INFORMATION; + u8 buf[10] = {0}; + u8 len = ilits->protocol->panel_info_len; + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; + + if (ilits->info_from_hex && (ilits->chip->core_ver >= CORE_VER_1410)) { + buf[1] = ilits->fw_info[16]; + buf[2] = ilits->fw_info[17]; + buf[3] = ilits->fw_info[18]; + buf[4] = ilits->fw_info[19]; + ilits->panel_wid = buf[2] << 8 | buf[1]; + ilits->panel_hei = buf[4] << 8 | buf[3]; + ilits->trans_xy = (ilits->chip->core_ver >= CORE_VER_1430 + && (ilits->rib.nReportByPixel > 0)) ? ON : OFF; + goto out; + } + + len = (ilits->chip->core_ver >= CORE_VER_1430) ? 6 : len; + + ret = ilits->wrapper(&cmd, sizeof(cmd), buf, len, ON, OFF); + if (ret < 0) + ILI_ERR("Read panel info error\n"); + + if (buf[0] != cmd) { + ILI_INFO("Invalid panel info, use default resolution\n"); + ilits->panel_wid = TOUCH_SCREEN_X_MAX; + ilits->panel_hei = TOUCH_SCREEN_Y_MAX; + ilits->trans_xy = OFF; + } else { + ilits->panel_wid = buf[1] << 8 | buf[2]; + ilits->panel_hei = buf[3] << 8 | buf[4]; + ilits->trans_xy = (ilits->chip->core_ver >= CORE_VER_1430) ? buf[5] : OFF; + } + + if (ilits->chip->core_ver >= CORE_VER_1470) { + cmd = P5_X_GET_REPORT_FORMAT; + ret = ilits->wrapper(&cmd, sizeof(cmd), buf, 2, ON, OFF); + if (ret < 0) + ILI_ERR("Read report format info error\n"); + + if (buf[0] != cmd) { + ILI_INFO("Invalid report format info, use default report format resolution\n"); + ilits->rib.nReportResolutionMode = POSITION_LOW_RESOLUTION; + ilits->rib.nCustomerType = POSITION_CUSTOMER_TYPE_OFF; + ilits->PenType = POSITION_PEN_TYPE_OFF; + if (ilits->chip->core_ver >= CORE_VER_1700) { + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF_3BITS; + } else { + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF; + } + } else { + ilits->rib.nReportResolutionMode = buf[1] & 0x07; + + if (ilits->chip->core_ver >= CORE_VER_1700) { + ilits->rib.nCustomerType = (buf[1] >> 3) & 0x07; + ilits->PenType = buf[1] >> 6; + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF_3BITS; + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ilits->touch_num = MAX_TOUCH_NUM + MAX_PEN_NUM; + ili_set_tp_data_len(DATA_FORMAT_DEMO, false, &data_type); + ILI_INFO("Panel support Pen Mode, Packet Len = %d, Touch Number = %d\n", ilits->tp_data_len, ilits->touch_num); + } + } else { + ilits->PenType = POSITION_PEN_TYPE_OFF; + ilits->rib.nCustomerType = buf[1] >> 3; + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF; + } + } + } else { + ilits->PenType = POSITION_PEN_TYPE_OFF; + ilits->rib.nReportResolutionMode = POSITION_LOW_RESOLUTION; + ilits->rib.nCustomerType = POSITION_CUSTOMER_TYPE_OFF; + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF; + } + ILI_INFO("PenType = 0x%x, Customer Type OFF = 0x%x\n", ilits->PenType, ilits->customertype_off); + +#if ENABLE_PEN_MODE + cmd = P5_X_GET_PEN_INFO; + ret = ilits->wrapper(&cmd, sizeof(cmd), buf, 9, ON, OFF); + ILI_INFO("cmd = 0x%X, buf[0] = 0x%X, buf[1] = 0x%X, buf[2] = 0x%X, buf[3] = 0x%X, buf[4] = 0x%X\n", cmd, buf[0], buf[1], buf[2], buf[3], buf[4]); + if (ret < 0) + ILI_ERR("Read report format info error\n"); + + if (buf[0] != cmd) { + ILI_INFO("Invalid Pen info, use default report format resolution\n"); + ilits->pen_info_block.nPxRaw = P5_X_PEN_INFO_X_DATA_LEN; + ilits->pen_info_block.nPyRaw = P5_X_PEN_INFO_Y_DATA_LEN; + ilits->pen_info_block.nPxVa = 1; + ilits->pen_info_block.nPyVa = 1; + } else { + ilits->pen_info_block.nPxRaw = buf[1]; + ilits->pen_info_block.nPyRaw = buf[2]; + ilits->pen_info_block.nPxVa = buf[3]; + ilits->pen_info_block.nPyVa = buf[4]; + } +#endif +#if ENABLE_CASCADE + cmd = P5_X_GET_CASCADE_INFO; + ret = ilits->wrapper(&cmd, sizeof(cmd), buf, 5, ON, OFF); + ILI_INFO("cmd = 0x%X, buf[0] = 0x%X, buf[1] = 0x%X, buf[2] = 0x%X, buf[3] = 0x%X\n", cmd, buf[0], buf[1], buf[2], buf[3]); + if (ret < 0) + ILI_ERR("Read report format info error\n"); + + if (buf[0] != cmd) { + ilits->cascade_info_block.nDisable = ENABLE; + ilits->cascade_info_block.nNum = 2; + } else { + ilits->cascade_info_block.nDisable = buf[1] & BIT(0); + ilits->cascade_info_block.nNum = (buf[1] >> 1) & 0x07; + } +#else + ilits->cascade_info_block.nDisable = ENABLE; + ilits->cascade_info_block.nNum = 0; +#endif +out: + ILI_INFO("Panel info: width = %d, height = %d\n", ilits->panel_wid, ilits->panel_hei); + ILI_INFO("Transfer touch coordinate = %s\n", ilits->trans_xy ? "ON" : "OFF"); + ILI_INFO("Customer Type = %X\n", ilits->rib.nCustomerType); + ILI_INFO("Report Resolution Format Mode = %X\n", ilits->rib.nReportResolutionMode); + + if (ilits->chip->core_ver >= CORE_VER_1700) { + ILI_INFO("Pen Type = %X\n", ilits->PenType); + ILI_INFO("Pen Info Data, nPxRaw = %d, nPyRaw = %d, nPxVa = %d, nPyVa = %d\n", ilits->pen_info_block.nPxRaw, ilits->pen_info_block.nPyRaw, ilits->pen_info_block.nPxVa, ilits->pen_info_block.nPyVa); + ILI_INFO("Cascade Info Data, nDisable = %d, nNum = %d\n", ilits->cascade_info_block.nDisable, ilits->cascade_info_block.nNum); + } + + return ret; +} + +int ili_ic_get_tp_info(void) +{ + int ret = 0; + u8 cmd[2] = {0}; + u8 buf[20] = {0}; + + if (ilits->info_from_hex && (ilits->chip->core_ver >= CORE_VER_1410)) { + buf[1] = ilits->fw_info[5]; + buf[2] = ilits->fw_info[7]; + buf[3] = ilits->fw_info[8]; + buf[4] = ilits->fw_info[9]; + buf[5] = ilits->fw_info[10]; + buf[6] = ilits->fw_info[11]; + buf[7] = ilits->fw_info[12]; + buf[8] = ilits->fw_info[14]; + if (ilits->chip->core_ver >= CORE_VER_1700) { + buf[11] = ilits->fw_info[13]; + buf[12] = ilits->fw_info[15]; + } else { + buf[11] = buf[7]; + buf[12] = buf[8]; + } + goto out; + } + + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = P5_X_GET_TP_INFORMATION; + + if (ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Write tp info pre cmd failed\n"); + ret = -EINVAL; + goto out; + + } + + ret = ilits->wrapper(&cmd[1], sizeof(u8), buf, ilits->protocol->tp_info_len, ON, OFF); + if (ret < 0) { + ILI_ERR("Read tp info error\n"); + goto out; + } + + if (buf[0] != P5_X_GET_TP_INFORMATION) { + ILI_ERR("Invalid tp info\n"); + ret = -1; + goto out; + } + +out: + ilits->min_x = buf[1]; + ilits->min_y = buf[2]; + ilits->max_x = buf[4] << 8 | buf[3]; + ilits->max_y = buf[6] << 8 | buf[5]; + ilits->xch_num = buf[7]; + ilits->ych_num = buf[8]; + ilits->stx = buf[11]; + ilits->srx = buf[12]; + + ILI_INFO("TP Info: min_x = %d, min_y = %d, max_x = %d, max_y = %d\n", ilits->min_x, ilits->min_y, ilits->max_x, ilits->max_y); + ILI_INFO("TP Info: xch = %d, ych = %d, stx = %d, srx = %d\n", ilits->xch_num, ilits->ych_num, ilits->stx, ilits->srx); + return ret; +} + +void ili_ic_get_compress_info(void) +{ +#if ENABLE_COMPRESS_MODE + int ret = 0; + u8 cmd = P5_X_GET_COMPRESS_INFORMATION; + u8 buf[10] = {0}; + + if (ilits->info_from_hex && (ilits->chip->core_ver >= CORE_VER_1700)) { + buf[1] = ilits->fw_info[0]; + goto out; + } + + ret = ilits->wrapper(&cmd, sizeof(cmd), buf, 5, ON, OFF); + if (ret < 0) + ILI_ERR("Read compress info error\n"); + + if (buf[0] != cmd) { + ILI_INFO("Invalid compress info, use default value\n"); + ilits->compress_disable = true; + ilits->compress_handonly_disable = true; + ilits->compress_penonly_disable = true; + } else { + ilits->compress_disable = (buf[1] & 0x20) >> 5; + ilits->compress_handonly_disable = (buf[1] & 0x40) >> 6; + ilits->compress_penonly_disable = (buf[1] & 0x80) >> 7; + } + +out: + ilits->compress_disable = (buf[1] & 0x20) >> 5; + ilits->compress_handonly_disable = (buf[1] & 0x40) >> 6; + ilits->compress_penonly_disable = (buf[1] & 0x80) >> 7; + ILI_INFO("compress_disable = %d, compress_handonly_disable = %d, compress_penonly_disable = %d\n", ilits->compress_disable, ilits->compress_handonly_disable, ilits->compress_penonly_disable); +#endif +} + + + +int ili_ic_get_all_info(void) +{ + int ret = 0; +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_GET_ALL_INFO) + u8 cmd = P5_X_GET_ALL_INFORMATION; + u8 buf[100] = {0}; + bool get_all_info; + + if (ilits->wrapper(&cmd, sizeof(cmd), buf, 96, ON, OFF) < 0) { + ILI_ERR("Write ALL info cmd failed\n"); + get_all_info = false; + ret = -EINVAL; + } + + if (buf[0] == P5_X_GET_ALL_INFORMATION) { + get_all_info = true; + + /* CORE_VERSION */ + ilits->chip->core_ver = buf[25] << 24 | buf[26] << 16 | buf[27] << 8 | buf[28]; + + /*GET_TP_INFORMATION*/ + ilits->min_x = buf[2]; + ilits->min_y = buf[3]; + ilits->max_x = buf[5] << 8 | buf[4]; + ilits->max_y = buf[7] << 8 | buf[6]; + ilits->xch_num = buf[8]; + ilits->ych_num = buf[9]; + ilits->stx = buf[12]; + ilits->srx = buf[13]; + + /* GET_FW_VERSION */ + ilits->chip->fw_ver = buf[16] << 24 | buf[17] << 16 | buf[18] << 8 | buf[19]; + ilits->chip->fw_mp_ver = buf[20] << 24 | buf[21] << 16 | buf[22] << 8 | buf[23]; + + /* GET_PANEL_INFORMATION */ + cmd = P5_X_GET_PANEL_INFORMATION; + if (buf[46] != cmd) { + ILI_INFO("Invalid panel info, use default resolution\n"); + ilits->panel_wid = TOUCH_SCREEN_X_MAX; + ilits->panel_hei = TOUCH_SCREEN_Y_MAX; + ilits->trans_xy = OFF; + } else { + ilits->panel_wid = buf[47] << 8 | buf[48]; + ilits->panel_hei = buf[49] << 8 | buf[50]; + ilits->trans_xy = (ilits->chip->core_ver >= CORE_VER_1430) ? buf[51] : OFF; + } + + /* GET_COMPRESS_INFORMATION */ + cmd = P5_X_GET_COMPRESS_INFORMATION; + if (buf[52] != cmd) { + ILI_INFO("Invalid compress & report format info, use default report format resolution\n"); + ilits->compress_disable = true; + ilits->compress_handonly_disable = true; + ilits->compress_penonly_disable = true; + ilits->rib.nReportResolutionMode = POSITION_LOW_RESOLUTION; + ilits->rib.nCustomerType = POSITION_CUSTOMER_TYPE_OFF; + ilits->PenType = POSITION_PEN_TYPE_OFF; + if (ilits->chip->core_ver >= CORE_VER_1700) { + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF_3BITS; + } else { + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF; + } + } else { + /* GET_COMPRESS_INFORMATION(0x2B) */ + ilits->compress_disable = (buf[53] & 0x20) >> 5; + ilits->compress_handonly_disable = (buf[53] & 0x40) >> 6; + ilits->compress_penonly_disable = (buf[53] & 0x80) >> 7; + /* GET_REPORT_FORMAT(0x37) */ + ilits->rib.nReportResolutionMode = buf[54] & 0x07; + + /* note : After core ver 1.7.0.0 support 0x2F cmd, so ignore before case */ + ilits->rib.nCustomerType = (buf[54] >> 3) & 0x07; + ilits->PenType = buf[54] >> 6; + ilits->customertype_off = POSITION_CUSTOMER_TYPE_OFF_3BITS; + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ilits->touch_num = MAX_TOUCH_NUM + MAX_PEN_NUM; + ili_set_tp_data_len(DATA_FORMAT_DEMO, false, NULL); + ILI_INFO("Panel support Pen Mode, Packet Len = %d, Touch Number = %d\n", ilits->tp_data_len, ilits->touch_num); + } + + /* reserved : buf[55] ~ buf[56] = 0xFF */ + } + +#if ENABLE_PEN_MODE + /* GET_PEN_INFO */ + cmd = P5_X_GET_PEN_INFO; + if (buf[57] != cmd) { + ILI_INFO("Invalid Pen info, use default report format resolution\n"); + ilits->pen_info_block.nPxRaw = P5_X_PEN_INFO_X_DATA_LEN; + ilits->pen_info_block.nPyRaw = P5_X_PEN_INFO_Y_DATA_LEN; + ilits->pen_info_block.nPxVa = 1; + ilits->pen_info_block.nPyVa = 1; + } else { + ilits->pen_info_block.nPxRaw = buf[58]; + ilits->pen_info_block.nPyRaw = buf[59]; + ilits->pen_info_block.nPxVa = buf[60]; + ilits->pen_info_block.nPyVa = buf[61]; + } + /* reserved : buf[62] ~ buf[65] = 0xFF */ +#endif + +#if ENABLE_CASCADE + /* GET_CASCADE_INFO */ + cmd = P5_X_GET_CASCADE_INFO; + if (buf[66] != cmd) { + ilits->cascade_info_block.nDisable = ENABLE; + ilits->cascade_info_block.nNum = 2; + } else { + ilits->cascade_info_block.nDisable = buf[67] & BIT(0); + ilits->cascade_info_block.nNum = (buf[67] >> 1) & 0x07; + } +#else + ilits->cascade_info_block.nDisable = ENABLE; + ilits->cascade_info_block.nNum = 0; +#endif + } else { + ILI_ERR("Read 0x2F error, buf[0] = 0x%X\n", buf[0]); + get_all_info = false; + } + + if (get_all_info == true) { + ILI_INFO("Firmware version(0x%8X) = %d.%d.%d.%d\n",ilits->chip->fw_ver , buf[16], buf[17], buf[18], buf[19]); + ILI_INFO("Firmware MP version(0x%8X) = %d.%d.%d.%d\n",ilits->chip->fw_mp_ver , buf[20], buf[21], buf[22], buf[23]); + ILI_INFO("Core version = %d.%d.%d.%d\n", buf[25], buf[26], buf[27], buf[28]); + ILI_INFO("TP Info: min_x = %d, min_y = %d, max_x = %d, max_y = %d\n", ilits->min_x, ilits->min_y, ilits->max_x, ilits->max_y); + ILI_INFO("TP Info: xch = %d, ych = %d, stx = %d, srx = %d\n", ilits->xch_num, ilits->ych_num, ilits->stx, ilits->srx); + ILI_INFO("Compress Info : compress_disable = %d, compress_handonly_disable = %d, compress_penonly_disable = %d\n",ilits->compress_disable, ilits->compress_handonly_disable, ilits->compress_penonly_disable); + ILI_INFO("Pen Len Info : PxRaw = %d, PyRaw = %d, PxVa = %d, PyVa = %d\n", ilits->pen_info_block.nPxRaw, ilits->pen_info_block.nPyRaw, ilits->pen_info_block.nPxVa, ilits->pen_info_block.nPyVa); + ILI_INFO("CASCADE Info : cascade_info_block.nDisable = %d, cascade_info_block.nNum = %d\n", ilits->cascade_info_block.nDisable, ilits->cascade_info_block.nNum); + ILI_INFO("Panel info: width = %d, height = %d\n", ilits->panel_wid, ilits->panel_hei); + ILI_INFO("Transfer touch coordinate = %s, Customer Type = %X, Report Resolution Format Mode = %X\n", ilits->trans_xy ? "ON" : "OFF", ilits->rib.nCustomerType, ilits->rib.nReportResolutionMode); + } else { + ili_ic_get_core_ver(); + ili_ic_get_protocl_ver(); + ili_ic_get_fw_ver(); + ili_ic_get_tp_info(); + ili_ic_get_panel_info(); + ili_ic_get_compress_info(); + } +#else + ili_ic_get_core_ver(); + ili_ic_get_protocl_ver(); + ili_ic_get_fw_ver(); + ili_ic_get_tp_info(); + ili_ic_get_panel_info(); + ili_ic_get_compress_info(); +#endif + + return ret; +} + +static void ilitek_tddi_ic_check_protocol_ver(u32 pver) +{ + int i = 0; + + if (ilits->protocol->ver == pver) { + ILI_DBG("same procotol version, do nothing\n"); + return; + } + + for (i = 0; i < PROTOCL_VER_NUM - 1; i++) { + if (protocol_info[i].ver == pver) { + ilits->protocol = &protocol_info[i]; + ILI_INFO("update protocol version = %x\n", ilits->protocol->ver); + return; + } + } + + ILI_ERR("Not found a correct protocol version in list, use newest version\n"); + ilits->protocol = &protocol_info[PROTOCL_VER_NUM - 1]; +} + +int ili_ic_get_protocl_ver(void) +{ + int ret = 0; + u8 cmd[2] = {0}; + u8 buf[10] = {0}; + u32 ver; + + if (ilits->info_from_hex) { + buf[1] = ilits->fw_info[72]; + buf[2] = ilits->fw_info[73]; + buf[3] = ilits->fw_info[74]; + goto out; + } + + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = P5_X_GET_PROTOCOL_VERSION; + + if (ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Write protocol ver pre cmd failed\n"); + ret = -EINVAL; + goto out; + + } + + if (ilits->wrapper(&cmd[1], sizeof(u8), buf, ilits->protocol->pro_ver_len, ON, OFF) < 0) { + ILI_ERR("Read protocol version error\n"); + ret = -EINVAL; + goto out; + } + + if (buf[0] != P5_X_GET_PROTOCOL_VERSION) { + ILI_ERR("Invalid protocol ver\n"); + ret = -1; + goto out; + } + +out: + ver = buf[1] << 16 | buf[2] << 8 | buf[3]; + + ilitek_tddi_ic_check_protocol_ver(ver); + + ILI_INFO("Protocol version = %d.%d.%d\n", ilits->protocol->ver >> 16, + (ilits->protocol->ver >> 8) & 0xFF, ilits->protocol->ver & 0xFF); + return ret; +} + +int ili_ic_get_info(void) +{ + int ret = 0; + u8 ddi_data = 0; + + if (!atomic_read(&ilits->ice_stat)) { + ILI_ERR("ice mode doesn't enable\n"); + return -1; + } + + + if (ili_ice_mode_read(ilits->chip->pid_addr, &ilits->chip->pid, sizeof(u32)) < 0) + ILI_ERR("Read chip pid error\n"); + + if (ili_ice_mode_read(ilits->chip->otp_addr, &ilits->chip->otp_id, sizeof(u32)) < 0) + ILI_ERR("Read otp id error\n"); + if (ili_ice_mode_read(ilits->chip->ana_addr, &ilits->chip->ana_id, sizeof(u32)) < 0) + ILI_ERR("Read ana id error\n"); + + ilits->chip->id = ilits->chip->pid >> 16; + ilits->chip->type = (ilits->chip->pid & 0x0000FF00) >> 8; + ilits->chip->ver = ilits->chip->pid & 0xFF; + ilits->chip->otp_id &= 0xFF; + ilits->chip->ana_id &= 0xFF; + + ilits->chip->product_id = ilits->chip->id; + if (ilits->chip->id == ILI9882_CHIP) { + ili_ic_get_ddi_reg_onepage(0x6, 0xF3, &ddi_data, OFF); + if (ddi_data == 0x30) + ilits->chip->product_id = ILI2882_CHIP; + } + + ILI_INFO("CHIP ID = %x\n", ilits->chip->product_id); + + ret = ilitek_tddi_ic_check_info(ilits->chip->pid, ilits->chip->id); + return ret; +} + +int ili_cascade_ic_get_info(bool enter_ice, bool exit_ice) +{ + int ret = 0; + +#if (TDDI_INTERFACE == BUS_I2C) + if (enter_ice) { + ili_ice_mode_ctrl_by_mode(ENABLE, OFF, BOTH); + } + + if (ili_ice_mode_read_by_mode(ilits->chip->pid_addr, &ilits->chip->slave_pid, sizeof(u32), SLAVE) < 0) + ILI_ERR("Read Slave chip pid error\n"); + + + ili_ic_get_info(); + +#else + if (enter_ice) { + ili_set_bypass_mode(OFF); + } + + ili_ic_get_info(); + + ili_mspi_read_slave_register(TDDI_PID_ADDR, &ilits->chip->slave_pid, sizeof(u32)); + + /* set mspi 0 */ + if (ili_ice_mode_write_by_mode(MSPI_REG, 0x00, 1, MASTER) < 0) { + ILI_ERR("Failed to write MSPI_REG in ice mode\n"); + } + +#endif + + if (exit_ice) { + ili_ice_mode_ctrl_by_mode(DISABLE, OFF, BOTH); + } + + ilits->chip->slave_id = ilits->chip->slave_pid >> 16; + + if (ilits->chip->pid != ilits->chip->slave_pid) { + ILI_ERR("Slave chip pid different from Master\n"); + ret = -1; + } + + ILI_INFO("Read Slave CHIP PID = 0x%X, CHIP ID = 0x%X\n", ilits->chip->slave_pid, ilits->chip->slave_id); + return ret; +} + +int ili_ic_dummy_check(void) +{ + int ret = 0; + u32 wdata = 0xA55A5AA5; + u32 rdata = 0; +#if (ENGINEER_FLOW) + int i = 0; + if (!atomic_read(&ilits->ice_stat)) { + ILI_ERR("ice mode doesn't enable\n"); + return -1; + } + + for (i = 0; i < 3; i++) { + if (ili_ice_mode_write(WDT9_DUMMY2, wdata, sizeof(u32)) < 0) + ILI_ERR("Write dummy error\n"); + + if (ili_ice_mode_read(WDT9_DUMMY2, &rdata, sizeof(u32)) < 0) + ILI_ERR("Read dummy error\n"); + + if (rdata == wdata || rdata == (u32)-wdata) { + if (rdata == -wdata) { + ilits->eng_flow = true; + } else { + ilits->eng_flow = false; + } + break; + } + mdelay(30); + } + if (i >= 3) { + ILI_ERR("Dummy check incorrect, rdata = %x wdata = %x \n", rdata, wdata); + return -1; + } + ILI_INFO("Ilitek IC check successe ilits->eng_flow = %d\n", ilits->eng_flow); +#else + if (!atomic_read(&ilits->ice_stat)) { + ILI_ERR("ice mode doesn't enable\n"); + return -1; + } + + if (ili_ice_mode_write(WDT9_DUMMY2, wdata, sizeof(u32)) < 0) + ILI_ERR("Write dummy error\n"); + + + if (ili_ice_mode_read(WDT9_DUMMY2, &rdata, sizeof(u32)) < 0) + ILI_ERR("Read dummy error\n"); + + if (rdata != wdata) { + ILI_ERR("Dummy check incorrect, rdata = %x wdata = %x \n", rdata, wdata); + return -1; + } + ILI_INFO("Ilitek IC check successe\n"); +#endif + return ret; +} + +int ili_ic_report_rate_set(u8 mode) +{ + int ret = 0; + u8 cmd[4] = {0}; + ILI_INFO("current report rate mode = %x\n", ilits->current_report_rate_mode); + + if (mode == ilits->current_report_rate_mode) { + ILI_INFO("set mode = %x, same as current mode = %x\n", mode, ilits->current_report_rate_mode); + return ret; + } + + cmd[0] = 0x01; + cmd[1] = 0x1F; + cmd[2] = 0x00; + cmd[3] = mode; + + ret = ilits->wrapper(cmd, 4, NULL, 0, OFF, OFF); + + if (ret < 0) + ILI_ERR("Write TP function failed\n"); + + ilits->current_report_rate_mode = mode; + return ret; +} + +int ili_ic_check_debug_lite_support(int format, bool send, u8 *data) +{ + u8 cmd[12] = {0}, buf[4] = {0}, ctrl = 0, debug_ctrl = 0, data_type = 0; + int ret; + if (ilits->chip->core_ver < CORE_VER_1700) { + ILI_INFO("no support check debug lite\n"); + return -1; + } + + if (data == NULL) { + data_type = P5_X_FW_SIGNAL_DATA_MODE; + ILI_INFO("Data Type is Null, Set Single data type\n"); + } else { + data_type = data[0]; + ILI_INFO("Set data type = 0x%X \n", data[0]); + } + + switch (format) { + case DATA_FORMAT_DEBUG_LITE_ROI: + debug_ctrl = DATA_FORMAT_DEBUG_LITE_ROI_CMD; + ctrl = DATA_FORMAT_DEBUG_LITE_CMD; + break; + case DATA_FORMAT_DEBUG_LITE_WINDOW: + debug_ctrl = DATA_FORMAT_DEBUG_LITE_WINDOW_CMD; + ctrl = DATA_FORMAT_DEBUG_LITE_CMD; + break; + case DATA_FORMAT_DEBUG_LITE_AREA: + if (data == NULL) { + ILI_ERR("DATA_FORMAT_DEBUG_LITE_AREA error cmd\n"); + return -1; + } + debug_ctrl = DATA_FORMAT_DEBUG_LITE_AREA_CMD; + ctrl = DATA_FORMAT_DEBUG_LITE_CMD; + data_type = data[0]; + cmd[4] = data[1]; + cmd[5] = data[2]; + cmd[6] = data[3]; + cmd[7] = data[4]; + break; + } + cmd[0] = P5_X_NEW_CONTROL_FORMAT; + cmd[1] = ctrl; + cmd[2] = data_type; + cmd[3] = debug_ctrl; + cmd[9] = 0x0A; /* pre command */ + + ret = ilits->wrapper(cmd, 10, buf, 2, ON, OFF); + if (ret < 0) { + ILI_ERR("check debug lite function failed\n"); + return ret; + } + + ILI_DBG("check ,0x%X\n", buf[0]); + return buf[0]; +} + +int ili_ic_report_rate_get(void) +{ + int ret = 0; + u8 cmd[3] = {0}, rxbuf[4] = {0}; + + cmd[0] = 0x01; + cmd[1] = 0x1F; + cmd[2] = 0x01; + + ret = ilits->wrapper(cmd, 3, rxbuf, 4, OFF, OFF); + if (ret < 0) { + ILI_ERR("Write TP function failed\n"); + return ret; + } + ILI_INFO("get report rate mode = %x, rxbuf = %x %x %x %x \n", rxbuf[3], rxbuf[0], rxbuf[1], rxbuf[2], rxbuf[3]); + ret = rxbuf[3]; + return ret; +} + +int ili_ic_report_rate_register_set(void) +{ + int ret = 0; + + if (ili_ice_mode_ctrl(ENABLE, OFF) < 0) + ILI_ERR("Enable ice mode failed\n"); + ILI_INFO("current_report_rate_mode: %X when reset\n", ilits->current_report_rate_mode); + ret = ili_ice_mode_write(0x4005E, (0x5A00 | (ilits->current_report_rate_mode & 0xFF)), 2); + if (ret < 0) + ILI_ERR("write report rate password failed\n"); + + return ret; +} + +static struct ilitek_ic_info chip; + +void ili_ic_init(void) +{ + chip.pid_addr = TDDI_PID_ADDR; + chip.pc_counter_addr = TDDI_PC_COUNTER_ADDR; + chip.pc_latch_addr = TDDI_PC_LATCH_ADDR; + chip.otp_addr = TDDI_OTP_ID_ADDR; + chip.ana_addr = TDDI_ANA_ID_ADDR; + chip.reset_addr = TDDI_CHIP_RESET_ADDR; + + ilits->protocol = &protocol_info[PROTOCL_VER_NUM - 1]; + ilits->chip = &chip; +} diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_mp.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_mp.c new file mode 100644 index 000000000000..4880d4148b38 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_mp.c @@ -0,0 +1,4641 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" + +#define VALUE 0 +#define RETRY_COUNT 3 +#define INT_CHECK 0 +#define POLL_CHECK 1 + +#define BENCHMARK 1 +#define NODETYPE 1 + +#define TYPE_BENCHMARK 0 +#define TYPE_NO_JUGE 1 +#define TYPE_JUGE 2 + +#define NORMAL_CSV_PASS_NAME "mp_pass" +#define NORMAL_CSV_FAIL_NAME "mp_fail" +#define NORMAL_CSV_WARNING_NAME "mp_warning" + +#define CSV_FILE_SIZE (1 * M) + +#define PARSER_MAX_CFG_BUF (512 * 3) +#define PARSER_MAX_KEY_NUM (600 * 3) +#define PARSER_MAX_KEY_NAME_LEN 100 +#define PARSER_MAX_KEY_VALUE_LEN 2000 +#define MAX_SECTION_NUM 100 +#define BENCHMARK_KEY_NAME "benchmark_data" +#define NODE_TYPE_KEY_NAME "node type" +#define PRECOMMAND_KEY_NAME "_precommand" +#define INI_ERR_OUT_OF_LINE -1 + +#define CMD_MUTUAL_DAC 0x1 +#define CMD_MUTUAL_BG 0x2 +#define CMD_MUTUAL_SIGNAL 0x3 +#define CMD_MUTUAL_NO_BK 0x5 +#define CMD_MUTUAL_HAVE_BK 0x8 +#define CMD_MUTUAL_BK_DAC 0x10 +#define CMD_SELF_DAC 0xC +#define CMD_SELF_BG 0xF +#define CMD_SELF_SIGNAL 0xD +#define CMD_SELF_NO_BK 0xE +#define CMD_SELF_HAVE_BK 0xB +#define CMD_SELF_BK_DAC 0x11 +#define CMD_KEY_DAC 0x14 +#define CMD_KEY_BG 0x16 +#define CMD_KEY_NO_BK 0x7 +#define CMD_KEY_HAVE_BK 0x15 +#define CMD_KEY_OPEN 0x12 +#define CMD_KEY_SHORT 0x13 +#define CMD_ST_DAC 0x1A +#define CMD_ST_BG 0x1C +#define CMD_ST_NO_BK 0x17 +#define CMD_ST_HAVE_BK 0x1B +#define CMD_ST_OPEN 0x18 +#define CMD_TX_SHORT 0x19 +#define CMD_RX_SHORT 0x4 +#define CMD_RX_OPEN 0x6 +#define CMD_TX_RX_DELTA 0x1E +#define CMD_CM_DATA 0x9 +#define CMD_CS_DATA 0xA +#define CMD_TRCRQ_PIN 0x20 +#define CMD_RESX2_PIN 0x21 +#define CMD_MUTUAL_INTEGRA_TIME 0x22 +#define CMD_SELF_INTEGRA_TIME 0x23 +#define CMD_KEY_INTERGRA_TIME 0x24 +#define CMD_ST_INTERGRA_TIME 0x25 +#define CMD_PEAK_TO_PEAK 0x1D +#define CMD_GET_TIMING_INFO 0x30 +#define CMD_DOZE_P2P 0x32 +#define CMD_DOZE_RAW 0x33 +#define CMD_PIN_TEST 0x61 +#define CMD_FW_MP_PRE_CMD 0xF7 +#define CMD_FW_MP_PRE_SET_CMD 0xF8 + + +#define MP_DATA_PASS 0 +#define MP_DATA_FAIL -1 + +#define Mathabs(x) ({ \ + long ret; \ + if (sizeof(x) == sizeof(long)) { \ + long __x = (x); \ + ret = (__x < 0) ? -__x : __x; \ + } else { \ + int __x = (x); \ + ret = (__x < 0) ? -__x : __x; \ + } \ + ret; \ + }) + +#define DUMP(fmt, arg...) \ + do { \ + if (debug_en) \ + pr_cont(fmt, ##arg); \ + } while (0) + +static struct ini_file_data { + char section_name[PARSER_MAX_KEY_NAME_LEN]; + char key_name[PARSER_MAX_KEY_NAME_LEN]; + char key_value[PARSER_MAX_KEY_VALUE_LEN]; + int section_len; + int key_name_len; + int key_val_len; +} *ini_info; + +enum open_test_node_type { + NO_COMPARE = 0x00, /* Not A Area, No Compare */ + AA_Area = 0x01, /* AA Area, Compare using Charge_AA */ + Border_Area = 0x02, /* Border Area, Compare using Charge_Border */ + Notch = 0x04, /* Notch Area, Compare using Charge_Notch */ + Round_Corner = 0x08, /* Round Corner, No Compare */ + Skip_Micro = 0x10 /* Skip_Micro, No Compare */ +}; + +enum mp_test_catalog { + MUTUAL_TEST = 0, + SELF_TEST = 1, + KEY_TEST = 2, + ST_TEST = 3, + TX_RX_DELTA = 4, + UNTOUCH_P2P = 5, + PIXEL = 6, + OPEN_TEST = 7, + PEAK_TO_PEAK_TEST = 8, + SHORT_TEST = 9, + PIN_TEST = 10, + TIPRING_RAW = 11, + TIPRING_P2P = 12, +}; + +enum mp_tipring_type { + TIPRING_XY = 0, + TIPRING_X, + TIPRING_Y +}; + +struct mp_test_P540_open { + s32 *tdf_700; + s32 *tdf_250; + s32 *tdf_200; + s32 *cbk_700; + s32 *cbk_250; + s32 *cbk_200; + s32 *charg_rate; + s32 *full_Open; + s32 *dac; +}; + +struct mp_test_open_c { + s32 *cap_dac; + s32 *cap_raw; + s32 *dcl_cap; +}; + +static struct open_test_para { + int tvch; + int tvcl; + int gain; + int cbk_step; + int cint; + int invbk; + int vadc_range; +} open_para; + +static struct shor_test_para { + int tvch; + int tvcl; + int variation; + int rinternal; + int cint; +} short_para; + +static struct core_mp_test_data { + u32 chip_pid; + u16 chip_id; + u8 chip_type; + u8 chip_ver; + u32 fw_ver; + u32 protocol_ver; + u32 core_ver; + char ini_date[128]; + char ini_ver[64]; + int no_bk_shift; + bool retry; + bool m_signal; + bool m_dac; + bool s_signal; + bool s_dac; + bool key_dac; + bool st_dac; + bool p_no_bk; + bool p_has_bk; + bool open_integ; + bool open_cap; + bool isLongV; + bool td_retry; + bool pre_cmd_sp; + + int cdc_len; + int xch_len; + int ych_len; + int nPxRaw; + int nPyRaw; + int stx_len; + int srx_len; + int key_len; + int st_len; + int frame_len; + int mp_items; + int final_result; + int short_varia; + int nPxRaw_tipring_len; + int nPyRaw_tipring_len; + int tipring_len; + u32 overlay_start_addr; + u32 overlay_end_addr; + u32 mp_flash_addr; + u32 mp_size; + u8 dma_trigger_enable; + + /* Tx/Rx threshold & buffer */ + int TxDeltaMax; + int TxDeltaMin; + int RxDeltaMax; + int RxDeltaMin; + s32 *tx_delta_buf; + s32 *rx_delta_buf; + s32 *tx_max_buf; + s32 *tx_min_buf; + s32 *rx_max_buf; + s32 *rx_min_buf; + + int tdf; + int busy_cdc; + bool ctrl_lcm; + bool lost_benchmark; + bool lost_parameter; +} core_mp = {0}; + +struct mp_test_items { + /* The description must be the same as ini's section name */ + char *desp; + char *result; + int catalog; + u8 cmd; + u8 spec_option; + u8 type_option; + bool run; + bool lcm; + int bch_mrk_multi; + int max; + int max_res; + int item_result; + int min; + int min_res; + int max1; + int max2; + int min1; + int min2; + int frame_count; + int trimmed_mean; + int lowest_percentage; + int highest_percentage; + int v_tdf_1; + int v_tdf_2; + int h_tdf_1; + int h_tdf_2; + int goldenmode; + int max_min_mode; + int bch_mrk_frm_num; + int retry_cnt; + int pre_cmd_en; + u8 delay_time; + u8 test_int_pin; + u8 int_pulse_test; + s32 *result_buf; + s32 *buf; + s32 *max_buf; + s32 *min_buf; + s32 *bench_mark_max; + s32 *bench_mark_min; + s32 **bch_mrk_max; + s32 **bch_mrk_min; + s32 *node_type; + int (*do_test)(int index); +}; + +#define MP_TEST_ITEM 55 +static struct mp_test_items tItems[MP_TEST_ITEM] = { + {.desp = "baseline data(bg)", .catalog = MUTUAL_TEST, .cmd = CMD_MUTUAL_BG, .lcm = ON}, + {.desp = "untouch signal data(bg-raw-4096) - mutual", .catalog = MUTUAL_TEST, .cmd = CMD_MUTUAL_SIGNAL, .lcm = ON}, + {.desp = "manual bk data(mutual)", .catalog = MUTUAL_TEST, .cmd = CMD_MUTUAL_BK_DAC, .lcm = ON}, + {.desp = "calibration data(dac) - self", .catalog = SELF_TEST, .cmd = CMD_SELF_DAC, .lcm = ON}, + {.desp = "baselin data(bg,self_tx,self_r)", .catalog = SELF_TEST, .cmd = CMD_SELF_BG, .lcm = ON}, + {.desp = "untouch signal data(bg-raw-4096) - self", .catalog = SELF_TEST, .cmd = CMD_SELF_SIGNAL, .lcm = ON}, + {.desp = "raw data(no bk) - self", .catalog = SELF_TEST, .cmd = CMD_SELF_NO_BK, .lcm = ON}, + {.desp = "raw data(have bk) - self", .catalog = SELF_TEST, .cmd = CMD_SELF_HAVE_BK, .lcm = ON}, + {.desp = "manual bk dac data(self_tx,self_rx)", .catalog = SELF_TEST, .cmd = CMD_SELF_BK_DAC, .lcm = ON}, + {.desp = "calibration data(dac/icon)", .catalog = KEY_TEST, .cmd = CMD_KEY_DAC, .lcm = ON}, + {.desp = "key baseline data", .catalog = KEY_TEST, .cmd = CMD_KEY_BG, .lcm = ON}, + {.desp = "key raw data", .catalog = KEY_TEST, .cmd = CMD_KEY_NO_BK, .lcm = ON}, + {.desp = "key raw bk dac", .catalog = KEY_TEST, .cmd = CMD_KEY_HAVE_BK, .lcm = ON}, + {.desp = "key raw open test", .catalog = KEY_TEST, .cmd = CMD_KEY_OPEN, .lcm = ON}, + {.desp = "key raw short test", .catalog = KEY_TEST, .cmd = CMD_KEY_SHORT, .lcm = ON}, + {.desp = "st calibration data(dac)", .catalog = ST_TEST, .cmd = CMD_ST_DAC, .lcm = ON}, + {.desp = "st baseline data(bg)", .catalog = ST_TEST, .cmd = CMD_ST_BG, .lcm = ON}, + {.desp = "st raw data(no bk)", .catalog = ST_TEST, .cmd = CMD_ST_NO_BK, .lcm = ON}, + {.desp = "st raw(have bk)", .catalog = ST_TEST, .cmd = CMD_ST_HAVE_BK, .lcm = ON}, + {.desp = "st open data", .catalog = ST_TEST, .cmd = CMD_ST_OPEN, .lcm = ON}, + {.desp = "tx short test", .catalog = MUTUAL_TEST, .cmd = CMD_TX_SHORT, .lcm = ON}, + {.desp = "rx open", .catalog = MUTUAL_TEST, .cmd = CMD_RX_OPEN, .lcm = ON}, + {.desp = "untouch cm data", .catalog = MUTUAL_TEST, .cmd = CMD_CM_DATA, .lcm = ON}, + {.desp = "untouch cs data", .catalog = MUTUAL_TEST, .cmd = CMD_CS_DATA, .lcm = ON}, + {.desp = "tx/rx delta", .catalog = TX_RX_DELTA, .cmd = CMD_TX_RX_DELTA, .lcm = ON}, + {.desp = "untouch peak to peak", .catalog = UNTOUCH_P2P, .cmd = CMD_MUTUAL_SIGNAL, .lcm = ON}, + {.desp = "pixel raw (no bk)", .catalog = PIXEL, .cmd = CMD_MUTUAL_NO_BK, .lcm = ON}, + {.desp = "pixel raw (have bk)", .catalog = PIXEL, .cmd = CMD_MUTUAL_HAVE_BK, .lcm = ON}, + {.desp = "noise peak to peak(cut panel)", .catalog = PEAK_TO_PEAK_TEST, .lcm = ON}, + {.desp = "open test(integration)", .catalog = OPEN_TEST, .cmd = CMD_RX_SHORT, .lcm = ON}, + {.desp = "open test(cap)", .catalog = OPEN_TEST, .cmd = CMD_RX_SHORT, .lcm = ON}, + /* Following is the new test items for protocol 5.4.0 above */ + {.desp = "pin test ( int and rst )", .catalog = PIN_TEST, .cmd = CMD_PIN_TEST, .lcm = ON}, + {.desp = "noise peak to peak(with panel)", .catalog = PEAK_TO_PEAK_TEST, .lcm = ON}, + {.desp = "noise peak to peak(ic only)", .catalog = PEAK_TO_PEAK_TEST, .cmd = CMD_PEAK_TO_PEAK, .lcm = ON}, + {.desp = "open test(integration)_sp", .catalog = OPEN_TEST, .lcm = ON}, + {.desp = "raw data(no bk)", .catalog = MUTUAL_TEST, .cmd = CMD_MUTUAL_NO_BK, .lcm = ON}, + {.desp = "raw data(have bk)", .catalog = MUTUAL_TEST, .cmd = CMD_MUTUAL_HAVE_BK, .lcm = ON}, + {.desp = "calibration data(dac)", .catalog = MUTUAL_TEST, .cmd = CMD_MUTUAL_DAC, .lcm = ON}, + {.desp = "short test -ili9881", .catalog = SHORT_TEST, .cmd = CMD_RX_SHORT, .lcm = ON}, + {.desp = "short test", .catalog = SHORT_TEST, .lcm = ON}, + {.desp = "doze raw data", .catalog = MUTUAL_TEST, .lcm = ON}, + {.desp = "doze peak to peak", .catalog = PEAK_TO_PEAK_TEST, .lcm = ON}, + {.desp = "open test_c", .catalog = OPEN_TEST, .lcm = ON}, + {.desp = "touch deltac", .catalog = MUTUAL_TEST, .lcm = ON}, + {.desp = "pen tipring raw test", .catalog = TIPRING_RAW, .lcm = ON}, + {.desp = "pen tipring p2p test", .catalog = TIPRING_P2P, .lcm = ON}, + {.desp = "open test_c (openx enable)", .catalog = OPEN_TEST, .lcm = ON}, + /* LCM OFF TEST */ + {.desp = "raw data(have bk) (lcm off)", .catalog = MUTUAL_TEST, .lcm = OFF}, + {.desp = "raw data(no bk) (lcm off)", .catalog = MUTUAL_TEST, .lcm = OFF}, + {.desp = "noise peak to peak(with panel) (lcm off)", .catalog = PEAK_TO_PEAK_TEST, .lcm = OFF}, + {.desp = "noise peak to peak(ic only) (lcm off)", .catalog = PEAK_TO_PEAK_TEST, .lcm = OFF}, + {.desp = "raw data_td (lcm off)", .catalog = MUTUAL_TEST, .lcm = OFF}, + {.desp = "peak to peak_td (lcm off)", .catalog = PEAK_TO_PEAK_TEST, .lcm = OFF}, + {.desp = "pen tipring raw test (lcm off)", .catalog = TIPRING_RAW, .lcm = OFF}, + {.desp = "pen tipring p2p test (lcm off)", .catalog = TIPRING_P2P, .lcm = OFF}, +}; + +static struct run_index { + int count; + int index[MP_TEST_ITEM]; +} ri; + +static s32 *frame_buf; +static s32 **frm_buf; +static s32 *key_buf; +static s32 *frame1_cbk700, *frame1_cbk250, *frame1_cbk200; +static s32 *cap_dac, *cap_raw; +static s32 *openx_cap_dac, *openx_cap_raw; +static int g_ini_items; +static char csv_name[128] = {0}; +static char seq_item[MAX_SECTION_NUM][PARSER_MAX_KEY_NAME_LEN] = {{0}}; + +static int isspace_t(int x) +{ + if (x == ' ' || x == '\t' || x == '\n' || + x == '\f' || x == '\b' || x == '\r') + return 1; + else + return 0; +} + +static void dump_benchmark_data(s32 *max_ptr, s32 *min_ptr) +{ + ili_dump_data(max_ptr, 32, core_mp.frame_len, 0, "Dump Benchmark Max : "); + ili_dump_data(min_ptr, 32, core_mp.frame_len, 0, "Dump Benchmark Min : "); +} + +static void dump_node_type_buffer(s32 *node_ptr, u8 *name) +{ + ili_dump_data(node_ptr, 32, core_mp.frame_len, 0, "Dump NodeType : "); +} + +static int parser_get_ini_key_value(char *section, char *key, char *value) +{ + int i = 0; + int ret = -2; + + for (i = 0; i < g_ini_items; i++) { + if (ipio_strcmp(section, ini_info[i].section_name) != 0) + continue; + + if (ipio_strcmp(key, ini_info[i].key_name) == 0) { + ipio_memcpy(value, ini_info[i].key_value, ini_info[i].key_val_len, PARSER_MAX_KEY_VALUE_LEN); + ILI_DBG("(key: %s, value:%s) => (ini key: %s, val: %s)\n", + key, + value, + ini_info[i].key_name, + ini_info[i].key_value); + ret = 0; + break; + } + } + return ret; +} + +static void parser_ini_nodetype(s32 *type_ptr, char *desp, int frame_len) +{ + int i = 0, j = 0, index1 = 0, temp, count = 0; + char str[512] = {0}, record = ','; + + for (i = 0; i < g_ini_items; i++) { + if (!strstr(ini_info[i].section_name, desp) || + ipio_strcmp(ini_info[i].key_name, NODE_TYPE_KEY_NAME) != 0) { + continue; + } + + record = ','; + for (j = 0, index1 = 0; j <= ini_info[i].key_val_len; j++) { + if (ini_info[i].key_value[j] == ';' || j == ini_info[i].key_val_len) { + if (record != '.') { + memset(str, 0, sizeof(str)); + ipio_memcpy(str, &ini_info[i].key_value[index1], (j - index1), sizeof(str)); + temp = ili_katoi(str); + + /* Over boundary, end to calculate. */ + if (count >= frame_len) { + ILI_ERR("count(%d) is larger than frame length, break\n", count); + break; + } + type_ptr[count] = temp; + count++; + } + record = ini_info[i].key_value[j]; + index1 = j + 1; + } + } + } +} + +static int parser_sramtest_group(char *str, char (*strSramPartialArea)[SRAM_TEST_GROUP_STR_LEN]) +{ + const char *delim = ";"; + char *temp = NULL; + char *pstrtemp = str; + u8 group_num = 0; + + ILI_INFO("Parsing Sram group\n"); + + temp = strsep(&pstrtemp, delim); + strcpy(strSramPartialArea[group_num], temp); + + while(temp != NULL) { + ILI_DBG("temp = %s, Sram Partial Area[%d] = %s\n", temp, group_num, strSramPartialArea[group_num]); + group_num++; + temp = strsep(&pstrtemp, delim); + if (temp == NULL) { + ILI_INFO("Parsing Sram group Done\n"); + break; + } + strcpy(strSramPartialArea[group_num], temp); + } + + return group_num; +} + +static void parser_ini_benchmark(s32 *max_ptr, s32 *min_ptr, int8_t type, char *desp, int frame_len, char *bchmrk_name) +{ + int i = 0, j = 0, index1 = 0, temp, count = 0; + char str[512] = {0}, record = ','; + s32 data[4]; + char benchmark_str[256] = {0}; + + /* format complete string from the name of section "_Benchmark_Data". */ + snprintf(benchmark_str, sizeof(benchmark_str), "%s%s%s", desp, "_", bchmrk_name); + ILI_DBG("benchmark_str = %s\n", benchmark_str); + + for (i = 0; i < g_ini_items; i++) { + if ((ipio_strcmp(ini_info[i].section_name, benchmark_str) != 0)) + continue; + record = ','; + for (j = 0, index1 = 0; j <= ini_info[i].key_val_len; j++) { + if (ini_info[i].key_value[j] == ',' || ini_info[i].key_value[j] == ';' || + ini_info[i].key_value[j] == '.' || j == ini_info[i].key_val_len) { + + if (record != '.') { + memset(str, 0, sizeof(str)); + ipio_memcpy(str, &ini_info[i].key_value[index1], (j - index1), sizeof(str)); + temp = ili_katoi(str); + data[(count % 4)] = temp; + + /* Over boundary, end to calculate. */ + if ((count / 4) >= frame_len) { + ILI_ERR("count (%d) is larger than frame length, break\n", (count / 4)); + break; + } + + if ((count % 4) == 3) { + if (data[0] == 1) { + if (type == VALUE) { + max_ptr[count/4] = data[1] + data[2]; + min_ptr[count/4] = data[1] - data[3]; + } else { + max_ptr[count/4] = data[1] + (data[1] * data[2]) / 100; + min_ptr[count/4] = data[1] - (data[1] * data[3]) / 100; + } + } else { + max_ptr[count/4] = INT_MAX; + min_ptr[count/4] = INT_MIN; + } + } + count++; + } + record = ini_info[i].key_value[j]; + index1 = j + 1; + } + } + } +} + +static char *get_csv_frame_name(char *name, int num) +{ + static char frame_name[128] = { 0 }; + memset(frame_name, 0, sizeof(frame_name)); + sprintf(frame_name, "%s%d", name, num); + + return frame_name; +} + + +static void parser_tip_ring_ini_benchmark(s32 *max_ptr, s32 *min_ptr, int8_t type, char *desp, int frame_len) { + char benchmark_str[128] = {0}; + + snprintf(benchmark_str, sizeof(benchmark_str), "%s%d", BENCHMARK_KEY_NAME, 1); + parser_ini_benchmark(max_ptr, min_ptr, type, desp, core_mp.nPxRaw_tipring_len, benchmark_str); + + memset(benchmark_str, 0x0, sizeof(benchmark_str)); + snprintf(benchmark_str, sizeof(benchmark_str), "%s%d", BENCHMARK_KEY_NAME, 2); + + parser_ini_benchmark(max_ptr + core_mp.nPxRaw_tipring_len, min_ptr + core_mp.nPxRaw_tipring_len, + type, desp, core_mp.nPyRaw_tipring_len, benchmark_str); + + ili_dump_data(max_ptr, 32, core_mp.tipring_len, 0, "Dump Tip Ring Benchmark Max"); + ili_dump_data(min_ptr, 32, core_mp.tipring_len, 0, "Dump Tip Ring Benchmark Min"); +} + +static int parser_get_tdf_value(char *str, int catalog) +{ + u32 i, ans, index = 0, flag = 0, count = 0, size = 0; + char s[10] = {0}; + + if (!str) { + ILI_ERR("String is null\n"); + return -1; + } + + size = strlen(str); + for (i = 0, count = 0; i < size; i++) { + if (str[i] == '.') { + flag = 1; + continue; + } + s[index++] = str[i]; + if (flag) + count++; + } + ans = ili_katoi(s); + + /* Multiply by 100 to shift out of decimal point */ + if (catalog == SHORT_TEST) { + if (count == 0) + ans = ans * 100; + else if (count == 1) + ans = ans * 10; + } + + return ans; +} + +static int parser_get_u8_array(char *key, u8 *buf, u16 base, int len) +{ + char *s = key; + char *pToken; + int ret, conut = 0; + long s_to_long = 0; + + if (strlen(s) == 0 || len <= 0) { + ILI_ERR("Can't find any characters inside buffer\n"); + return -1; + } + + /* + * @base: The number base to use. The maximum supported base is 16. If base is + * given as 0, then the base of the string is automatically detected with the + * conventional semantics - If it begins with 0x the number will be parsed as a + * hexadecimal (case insensitive), if it otherwise begins with 0, it will be + * parsed as an octal number. Otherwise it will be parsed as a decimal. + */ + if (isspace_t((int)(unsigned char)*s) == 0) { + while ((pToken = strsep(&s, ",")) != NULL) { + ret = kstrtol(pToken, base, &s_to_long); + if (ret == 0) + buf[conut] = s_to_long; + else + ILI_INFO("convert string too long, ret = %d\n", ret); + conut++; + + if (conut >= len) + break; + } + } + + return conut; +} + +static int parser_get_u32_array(char *key, u32 *buf, u16 base, int len) +{ + char *s = key; + char *pToken; + int ret, conut = 0; + long s_to_long = 0; + + if (strlen(s) == 0 || len <= 0) { + ILI_ERR("Can't find any characters inside buffer\n"); + return -1; + } + + /* + * @base: The number base to use. The maximum supported base is 16. If base is + * given as 0, then the base of the string is automatically detected with the + * conventional semantics - If it begins with 0x the number will be parsed as a + * hexadecimal (case insensitive), if it otherwise begins with 0, it will be + * parsed as an octal number. Otherwise it will be parsed as a decimal. + */ + if (isspace_t((int)(unsigned char)*s) == 0) { + while ((pToken = strsep(&s, ";")) != NULL) { + ret = kstrtol(pToken, base, &s_to_long); + if (ret == 0) + buf[conut] = s_to_long; + else + ILI_INFO("convert string too long, ret = %d\n", ret); + conut++; + + if (conut >= len) + break; + } + } + + return conut; +} + +static int parser_get_int_data(char *section, char *keyname, char *rv, int rv_len) +{ + int len = 0; + char value[512] = { 0 }; + + if (rv == NULL || section == NULL || keyname == NULL) { + ILI_ERR("Parameters are invalid\n"); + return -EINVAL; + } + + /* return a white-space string if get nothing */ + if (parser_get_ini_key_value(section, keyname, value) < 0) { + snprintf(rv, rv_len, "%s", value); + return 0; + } + + len = snprintf(rv, rv_len, "%s", value); + return len; +} + +/* Count the number of each line and assign the content to tmp buffer */ +static int parser_get_ini_phy_line(char *data, char *buffer, int maxlen) +{ + int i = 0; + int j = 0; + int iRetNum = -1; + char ch1 = '\0'; + + for (i = 0, j = 0; i < maxlen; j++) { + ch1 = data[j]; + iRetNum = j + 1; + if (ch1 == '\n' || ch1 == '\r') { /* line end */ + ch1 = data[j + 1]; + if (ch1 == '\n' || ch1 == '\r') + iRetNum++; + break; + } else if (ch1 == 0x00) { + break; /* file end */ + } + + buffer[i++] = ch1; + } + + buffer[i] = '\0'; + return iRetNum; +} + +static char *parser_ini_str_trim_r(char *buf) +{ + int len, i; + char *tmp = NULL; + char x[512] = {0}; + char *y = NULL; + char *empty = ""; + + len = strlen(buf); + + if (len < sizeof(x)) { + tmp = x; + goto copy; + } + + y = kzalloc(len, GFP_KERNEL); + if (ERR_ALLOC_MEM(y)) { + ILI_ERR("Failed to allocate tmp buf\n"); + return empty; + } + tmp = y; + +copy: + for (i = 0; i < len; i++) { + if (buf[i] != ' ') + break; + } + + if (i < len) + strncpy(tmp, (buf + i), (len - i)); + + strncpy(buf, tmp, len); + ipio_kfree((void **)&y); + return buf; +} + +static int parser_get_ini_phy_data(char *data, int fsize) +{ + int i, n = 0, ret = 0, empty_section; + int offset = 0, isEqualSign = 0, scount = 0; + char *ini_buf = NULL, *tmpSectionName = NULL; + char M_CFG_SSL = '['; + char M_CFG_SSR = ']'; +/* char M_CFG_NIS = ':'; */ + char M_CFG_NTS = '#'; + char M_CFG_EQS = '='; + + if (data == NULL) { + ILI_ERR("INI data is NULL\n"); + ret = -EINVAL; + goto out; + } + + ini_buf = kzalloc((PARSER_MAX_CFG_BUF + 1) * sizeof(char), GFP_KERNEL); + if (ERR_ALLOC_MEM(ini_buf)) { + ILI_ERR("Failed to allocate ini_buf memory, %ld\n", PTR_ERR(ini_buf)); + ret = -ENOMEM; + goto out; + } + + tmpSectionName = kzalloc((PARSER_MAX_CFG_BUF + 1) * sizeof(char), GFP_KERNEL); + if (ERR_ALLOC_MEM(tmpSectionName)) { + ILI_ERR("Failed to allocate tmpSectionName memory, %ld\n", PTR_ERR(tmpSectionName)); + ret = -ENOMEM; + goto out; + } + + memset(seq_item, 0, MP_TEST_ITEM * PARSER_MAX_KEY_NAME_LEN * sizeof(char)); + + while (true) { + empty_section = 0; + if (g_ini_items > PARSER_MAX_KEY_NUM) { + ILI_ERR("MAX_KEY_NUM: Out of length\n"); + goto out; + } + + if (offset >= fsize) + goto out;/*over size*/ + + n = parser_get_ini_phy_line(data + offset, ini_buf, PARSER_MAX_CFG_BUF); + if (n < 0) { + ILI_ERR("End of Line\n"); + goto out; + } + + offset += n; + + n = strlen(parser_ini_str_trim_r(ini_buf)); + + if (n == 0 || ini_buf[0] == M_CFG_NTS) + continue; + + /* Get section names */ + if (n > 2 && ((ini_buf[0] == M_CFG_SSL && ini_buf[n - 1] != M_CFG_SSR))) { + ILI_ERR("Bad Section: %s\n", ini_buf); + ret = -EINVAL; + goto out; + } else { + if (ini_buf[0] == M_CFG_SSL) { + ini_info[g_ini_items].section_len = n - 2; + if (ini_info[g_ini_items].section_len > PARSER_MAX_KEY_NAME_LEN) { + ILI_ERR("MAX_KEY_NAME_LEN: Out Of Length\n"); + ret = INI_ERR_OUT_OF_LINE; + goto out; + } + + if (scount > MAX_SECTION_NUM) { + ILI_ERR("seq_item is over than its define (%d), abort\n", scount); + ret = INI_ERR_OUT_OF_LINE; + goto out; + } + + ini_buf[n - 1] = 0x00; + strncpy((char *)tmpSectionName, ini_buf + 1, (PARSER_MAX_CFG_BUF + 1) * sizeof(char)); + strncpy(seq_item[scount], tmpSectionName, PARSER_MAX_KEY_NAME_LEN); + scount++; + ILI_DBG("Section Name: %s, Len: %d, offset = %d\n", seq_item[scount], n - 2, offset); + continue; + } + } + + /* copy section's name without square brackets to its real buffer */ + strncpy(ini_info[g_ini_items].section_name, tmpSectionName, (PARSER_MAX_KEY_NAME_LEN * sizeof(char))); + ini_info[g_ini_items].section_len = strlen(tmpSectionName); + + isEqualSign = 0; + for (i = 0; i < n; i++) { + if (ini_buf[i] == M_CFG_EQS) { + isEqualSign = i; + break; + } + if (ini_buf[i] == M_CFG_SSL || ini_buf[i] == M_CFG_SSR) { + empty_section = 1; + break; + } + } + + if (isEqualSign == 0) { + if (empty_section) + continue; + + if (strstr(ini_info[g_ini_items].section_name, BENCHMARK_KEY_NAME) != NULL) { + isEqualSign = -1; + ini_info[g_ini_items].key_name_len = strlen(ini_info[g_ini_items].section_name); + strncpy(ini_info[g_ini_items].key_name, ini_info[g_ini_items].section_name, (PARSER_MAX_KEY_NAME_LEN * sizeof(char))); + ini_info[g_ini_items].key_val_len = n; + } else if (strstr(ini_info[g_ini_items].section_name, NODE_TYPE_KEY_NAME) != NULL) { + isEqualSign = -1; + ini_info[g_ini_items].key_name_len = strlen(NODE_TYPE_KEY_NAME); + strncpy(ini_info[g_ini_items].key_name, NODE_TYPE_KEY_NAME, (PARSER_MAX_KEY_NAME_LEN * sizeof(char))); + ini_info[g_ini_items].key_val_len = n; + } else if (strstr(ini_info[g_ini_items].section_name, PRECOMMAND_KEY_NAME) != NULL) { + isEqualSign = -1; + ini_info[g_ini_items].key_name_len = strlen(ini_info[g_ini_items].section_name); + strncpy(ini_info[g_ini_items].key_name, ini_info[g_ini_items].section_name, (PARSER_MAX_KEY_NAME_LEN * sizeof(char))); + ini_info[g_ini_items].key_val_len = n; + } else { + continue; + } + } else { + ini_info[g_ini_items].key_name_len = isEqualSign; + if (ini_info[g_ini_items].key_name_len > PARSER_MAX_KEY_NAME_LEN) { + /* ret = CFG_ERR_OUT_OF_LEN; */ + ILI_ERR("MAX_KEY_NAME_LEN: Out Of Length\n"); + ret = INI_ERR_OUT_OF_LINE; + goto out; + } + + ipio_memcpy(ini_info[g_ini_items].key_name, ini_buf, + ini_info[g_ini_items].key_name_len, PARSER_MAX_KEY_NAME_LEN); + ini_info[g_ini_items].key_val_len = n - isEqualSign - 1; + } + + if (ini_info[g_ini_items].key_val_len > PARSER_MAX_KEY_VALUE_LEN) { + ILI_ERR("MAX_KEY_VALUE_LEN: Out Of Length\n"); + ret = INI_ERR_OUT_OF_LINE; + goto out; + } + + ipio_memcpy(ini_info[g_ini_items].key_value, + ini_buf + isEqualSign + 1, ini_info[g_ini_items].key_val_len, PARSER_MAX_KEY_VALUE_LEN); + + ILI_DBG("%s = %s\n", ini_info[g_ini_items].key_name, + ini_info[g_ini_items].key_value); + + g_ini_items++; + } +out: + ipio_kfree((void **)&ini_buf); + ipio_kfree((void **)&tmpSectionName); + return ret; +} + +int ilitek_tddi_mp_ini_parser(const char *path) +{ + int i, ret = 0, fsize = 0; + char *tmp = NULL; + const struct firmware *ini = NULL; +#if GENERIC_KERNEL_IMAGE + ILI_ERR("GKI version not allow drivers to use filp_open\n"); + path = ilits->md_ini_rq_path; + ILI_INFO("request path = %s\n", path); + if (request_firmware(&ini, path, ilits->dev) < 0) { + ILI_ERR("Request ini file failed\n"); + return -EINVAL; + } + + fsize = ini->size; +#else + struct file *f = NULL; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t old_fs; +#endif + loff_t pos = 0; + + ILI_INFO("ini file path = %s\n", path); + + f = filp_open(path, O_RDONLY, 644); + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open ini file at %ld, try to request_firmware\n", PTR_ERR(f)); + f = NULL; + path = ilits->md_ini_rq_path; + ILI_INFO("request path = %s\n", path); + if (request_firmware(&ini, path, ilits->dev) < 0) { + ILI_ERR("Request ini file failed\n"); + return -EINVAL; + } + } + + if (f != NULL) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) + fsize = f->f_inode->i_size; +#else + struct inode *inode; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)) + inode = f->f_dentry->d_inode; +#else + inode = f->f_path.dentry->d_inode; +#endif + fsize = inode->i_size; +#endif + } else { + fsize = ini->size; + } +#endif + + ILI_INFO("ini file size = %d\n", fsize); + if (fsize <= 0) { + ILI_ERR("The size of file is invaild\n"); + ret = -EINVAL; + goto out; + } + + tmp = vmalloc(fsize+1); + if (ERR_ALLOC_MEM(tmp)) { + ILI_ERR("Failed to allocate tmp memory, %ld\n", PTR_ERR(tmp)); + ret = -ENOMEM; + goto out; + } +#if GENERIC_KERNEL_IMAGE + memcpy(tmp, ini->data, fsize); +#else + if (f != NULL) { + pos = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + old_fs = get_fs(); + set_fs(KERNEL_DS); + vfs_read(f, tmp, fsize, &pos); + set_fs(old_fs); +#else + kernel_read(f, tmp, fsize, &pos); +#endif + tmp[fsize] = 0x0; + } else { + memcpy(tmp, ini->data, fsize); + } +#endif + g_ini_items = 0; + + /* Initialise ini strcture */ + for (i = 0; i < PARSER_MAX_KEY_NUM; i++) { + memset(ini_info[i].section_name, 0, PARSER_MAX_KEY_NAME_LEN); + memset(ini_info[i].key_name, 0, PARSER_MAX_KEY_NAME_LEN); + memset(ini_info[i].key_value, 0, PARSER_MAX_KEY_VALUE_LEN); + ini_info[i].section_len = 0; + ini_info[i].key_name_len = 0; + ini_info[i].key_val_len = 0; + } + + /* change all characters to lower case */ + for (i = 0; i < fsize; i++) + tmp[i] = tolower(tmp[i]); + + ret = parser_get_ini_phy_data(tmp, fsize); + if (ret < 0) { + ILI_ERR("Failed to get physical ini data, ret = %d\n", ret); + goto out; + } + + ILI_INFO("Parsed ini file done\n"); +out: + ipio_vfree((void **)&tmp); +#if GENERIC_KERNEL_IMAGE + release_firmware(ini); +#else + if (f != NULL) + filp_close(f, NULL); + else + release_firmware(ini); +#endif + return ret; +} + +static int parser_ini_precmd(char *desp, u8 *buf) +{ + + int i = 0, cmdlen = 0; + u8 cmdnum = 0; + u8 cmd[16] = {0}; + char precmd_str[128] = {0}; + + /* format complete string from the name of section "_Benchmark_Data". */ + snprintf(precmd_str, sizeof(precmd_str), "%s_precommand", desp); + ILI_INFO("precmd = %s\n", precmd_str); + + for (i = 0; i < g_ini_items; i++) { + if ((ipio_strcmp(ini_info[i].section_name, precmd_str) != 0)) + continue; + + if (parser_get_u8_array(ini_info[i].key_value, cmd, 16, 11) < 0) + return -1; + cmdnum++; + + buf[0] = CMD_FW_MP_PRE_SET_CMD; + buf[1] = cmdnum; + strncpy(buf + 2 + ((cmdnum - 1) * 11), cmd, 11); + + } + cmdlen = 2 + cmdnum * 11; + + return cmdlen; +} + +static int precommd(u8 *cmd, int cmdlen, u8 *precmd, int precmdlen, u8 *rdata, u32 rlen, bool spi_irq, bool i2c_irq) +{ + u8 buf[2] = {0}; + + buf[0] = CMD_FW_MP_PRE_CMD; + buf[1] = 0x1; + + if (ilits->wrapper(buf, 2, NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Failed precommand cmd\n"); + return -EMP_CMD; + } + + mdelay(1); + + if (ilits->wrapper(cmd, cmdlen, NULL, 0, OFF, OFF) < 0) { + ILI_ERR("Failed to get cdc data\n"); + return -EMP_GET_CDC; + } + + mdelay(1); + + if (ilits->wrapper(precmd, precmdlen, rdata, rlen, spi_irq, i2c_irq) < 0) { + ILI_ERR("Failed to get cdc data\n"); + return -EMP_GET_CDC; + } + + return 0; + +} + +static void run_pixel_test(int index) +{ + int i, x, y; + s32 *p_comb = frame_buf; + + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + int tmp[4] = { 0 }, max = 0; + int shift = y * core_mp.xch_len; + int centre = p_comb[shift + x]; + + /* + * if its position is in corner, the number of point + * we have to minus is around 2 to 3. + */ + if (y == 0 && x == 0) { + tmp[0] = Mathabs(centre - p_comb[(shift + 1) + x]); /* down */ + tmp[1] = Mathabs(centre - p_comb[shift + (x + 1)]); /* right */ + } else if (y == (core_mp.ych_len - 1) && x == 0) { + tmp[0] = Mathabs(centre - p_comb[(shift - 1) + x]); /* up */ + tmp[1] = Mathabs(centre - p_comb[shift + (x + 1)]); /* right */ + } else if (y == 0 && x == (core_mp.xch_len - 1)) { + tmp[0] = Mathabs(centre - p_comb[(shift + 1) + x]); /* down */ + tmp[1] = Mathabs(centre - p_comb[shift + (x - 1)]); /* left */ + } else if (y == (core_mp.ych_len - 1) && x == (core_mp.xch_len - 1)) { + tmp[0] = Mathabs(centre - p_comb[(shift - 1) + x]); /* up */ + tmp[1] = Mathabs(centre - p_comb[shift + (x - 1)]); /* left */ + } else if (y == 0 && x != 0) { + tmp[0] = Mathabs(centre - p_comb[(shift + 1) + x]); /* down */ + tmp[1] = Mathabs(centre - p_comb[shift + (x - 1)]); /* left */ + tmp[2] = Mathabs(centre - p_comb[shift + (x + 1)]); /* right */ + } else if (y != 0 && x == 0) { + tmp[0] = Mathabs(centre - p_comb[(shift - 1) + x]); /* up */ + tmp[1] = Mathabs(centre - p_comb[shift + (x + 1)]); /* right */ + tmp[2] = Mathabs(centre - p_comb[(shift + 1) + x]); /* down */ + + } else if (y == (core_mp.ych_len - 1) && x != 0) { + tmp[0] = Mathabs(centre - p_comb[(shift - 1) + x]); /* up */ + tmp[1] = Mathabs(centre - p_comb[shift + (x - 1)]); /* left */ + tmp[2] = Mathabs(centre - p_comb[shift + (x + 1)]); /* right */ + } else if (y != 0 && x == (core_mp.xch_len - 1)) { + tmp[0] = Mathabs(centre - p_comb[(shift - 1) + x]); /* up */ + tmp[1] = Mathabs(centre - p_comb[shift + (x - 1)]); /* left */ + tmp[2] = Mathabs(centre - p_comb[(shift + 1) + x]); /* down */ + } else { + /* middle minus four directions */ + tmp[0] = Mathabs(centre - p_comb[(shift - 1) + x]); /* up */ + tmp[1] = Mathabs(centre - p_comb[(shift + 1) + x]); /* down */ + tmp[2] = Mathabs(centre - p_comb[shift + (x - 1)]); /* left */ + tmp[3] = Mathabs(centre - p_comb[shift + (x + 1)]); /* right */ + } + + max = tmp[0]; + + for (i = 0; i < 4; i++) { + if (tmp[i] > max) + max = tmp[i]; + } + + tItems[index].buf[shift + x] = max; + } + } +} + +static void run_untouch_p2p_test(int index) +{ + int x, y; + s32 *p_comb = frame_buf; + + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + int shift = y * core_mp.xch_len; + + if (p_comb[shift + x] > tItems[index].max_buf[shift + x]) + tItems[index].max_buf[shift + x] = p_comb[shift + x]; + + if (p_comb[shift + x] < tItems[index].min_buf[shift + x]) + tItems[index].min_buf[shift + x] = p_comb[shift + x]; + + tItems[index].buf[shift + x] = + tItems[index].max_buf[shift + x] - tItems[index].min_buf[shift + x]; + } + } +} + +static int run_open_test(int index) +{ + int i, x, y, k, ret = 0; + int border_x[] = {-1, 0, 1, 1, 1, 0, -1, -1}; + int border_y[] = {-1, -1, -1, 0, 1, 1, 1, 0}; + s32 *p_comb = frame_buf; + + if (ipio_strcmp(tItems[index].desp, "open test(integration)") == 0) { + for (i = 0; i < core_mp.frame_len; i++) + tItems[index].buf[i] = p_comb[i]; + } else if (ipio_strcmp(tItems[index].desp, "open test(cap)") == 0) { + /* + * Each result is getting from a 3 by 3 grid depending on where the centre location is. + * So if the centre is at corner, the number of node grabbed from a grid will be different. + */ + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + int sum = 0, avg = 0, count = 0; + int shift = y * core_mp.xch_len; + int centre = p_comb[shift + x]; + + for (k = 0; k < 8; k++) { + if (((y + border_y[k] >= 0) && (y + border_y[k] < core_mp.ych_len)) && + ((x + border_x[k] >= 0) && (x + border_x[k] < core_mp.xch_len))) { + count++; + sum += p_comb[(y + border_y[k]) * core_mp.xch_len + (x + border_x[k])]; + } + } + + avg = (sum + centre) / (count + 1); /* plus 1 because of centre */ + tItems[index].buf[shift + x] = (centre * 100) / avg; + } + } + } + return ret; +} + +static void run_tx_rx_delta_test(int index) +{ + int x, y; + s32 *p_comb = frame_buf; + + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + int shift = y * core_mp.xch_len; + + /* Tx Delta */ + if (y != (core_mp.ych_len - 1)) + core_mp.tx_delta_buf[shift + x] = Mathabs(p_comb[shift + x] - p_comb[(shift + 1) + x]); + + /* Rx Delta */ + if (x != (core_mp.xch_len - 1)) + core_mp.rx_delta_buf[shift + x] = Mathabs(p_comb[shift + x] - p_comb[shift + (x + 1)]); + } + } +} + +static char *get_date_time_str(void) +{ + static char time_data_buf[128] = { 0 }; + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + struct timespec now_time; + struct rtc_time rtc_now_time; + + getnstimeofday(&now_time); + rtc_time_to_tm(now_time.tv_sec, &rtc_now_time); + snprintf(time_data_buf, sizeof(time_data_buf), "%04d%02d%02d-%02d%02d%02d", + (rtc_now_time.tm_year + 1900), rtc_now_time.tm_mon + 1, + rtc_now_time.tm_mday, rtc_now_time.tm_hour, rtc_now_time.tm_min, + rtc_now_time.tm_sec); +#else + struct tm tm; + time64_to_tm(ktime_get_real_seconds(), 0, &tm); + + snprintf(time_data_buf, sizeof(time_data_buf), "%04d%02d%02d-%02d%02d%02d", + (int)(tm.tm_year + 1900), tm.tm_mon + 1, + tm.tm_mday, tm.tm_hour, tm.tm_min, + tm.tm_sec); +#endif + + return time_data_buf; +} + +static void mp_print_csv_header(char *csv, int *csv_len, int *csv_line, int file_size) +{ + int i, seq, tmp_len = *csv_len, tmp_line = *csv_line; + + /* header must has 19 line*/ + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "==============================================================================\n"); + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "ILITek C-TP Utility V%s %x : Driver Sensor Test\n", DRIVER_VERSION, core_mp.chip_pid); + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "Confidentiality Notice:\n"); + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "Any information of this tool is confidential and privileged.\n"); + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "@ ILI TECHNOLOGY CORP. All Rights Reserved.\n"); + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "==============================================================================\n"); + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "Firmware Version ,0x%x\n", core_mp.fw_ver); + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "Panel information ,XCH=%d, YCH=%d\n", core_mp.xch_len, core_mp.ych_len); + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "INI Release Version ,%s\n", core_mp.ini_ver); + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "INI Release Date ,%s\n", core_mp.ini_date); + tmp_line++; + tmp_line++; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "Test Item:\n"); + tmp_line++; + + for (seq = 0; seq < ri.count; seq++) { + i = ri.index[seq]; + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), " ---%s\n", tItems[i].desp); + tmp_line++; + } + + while (tmp_line < 19) { + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "\n"); + tmp_line++; + } + + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "==============================================================================\n"); + + *csv_len = tmp_len; + *csv_line = tmp_line; +} + +static void mp_print_csv_tail(char *csv, int *csv_len, int file_size) +{ + int i, seq, tmp_len = *csv_len; + + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "==============================================================================\n"); + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "Result_Summary \n"); + + for (seq = 0; seq < ri.count; seq++) { + i = ri.index[seq]; + if (tItems[i].item_result == MP_DATA_PASS) { + if (tItems[i].goldenmode && (tItems[i].spec_option != tItems[i].goldenmode)) { + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), " {%s} ,OK, Warning, No Golden\n", tItems[i].desp); + } else { + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), " {%s} ,OK\n", tItems[i].desp); + } + } else { + if (tItems[i].goldenmode && (tItems[i].spec_option != tItems[i].goldenmode)) { + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), " {%s} ,NG, Warning, No Golden\n", tItems[i].desp); + } else { + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), " {%s} ,NG\n", tItems[i].desp); + } + } + } + + *csv_len = tmp_len; +} + +static void mp_print_csv_cdc_cmd(char *csv, int *csv_len, int index, int file_size) +{ + int i, slen = 0, tmp_len = *csv_len, size; + char str[128] = {0}; + char *open_sp_cmd[] = {"open dac", "open raw1", "open raw2", "open raw3"}; + char *open_c_cmd[] = {"open cap1 dac", "open cap1 raw"}; + char *open_x_cmd[] = {"open_x cap1 dac", "open_x cap1 raw"}; + char *name = tItems[index].desp; + + if (ipio_strcmp(name, "open test(integration)_sp") == 0) { + size = ARRAY_SIZE(open_sp_cmd); + for (i = 0; i < size; i++) { + slen = parser_get_int_data("pv5_4 command", open_sp_cmd[i], str, sizeof(str)); + if (slen < 0) + ILI_ERR("Failed to get CDC command %s from ini\n", open_sp_cmd[i]); + else + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "%s = ,%s\n", open_sp_cmd[i], str); + } + } else if (ipio_strcmp(name, "open test_c") == 0) { + size = ARRAY_SIZE(open_c_cmd); + for (i = 0; i < size; i++) { + slen = parser_get_int_data("pv5_4 command", open_c_cmd[i], str, sizeof(str)); + if (slen < 0) + ILI_ERR("Failed to get CDC command %s from ini\n", open_sp_cmd[i]); + else + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "%s = ,%s\n", open_c_cmd[i], str); + } + } else if (ipio_strcmp(name, "open test_c (openx enable)") == 0) { + size = ARRAY_SIZE(open_x_cmd); + for (i = 0; i < size; i++) { + slen = parser_get_int_data("pv5_4 command", open_x_cmd[i], str, sizeof(str)); + if (slen < 0) + ILI_ERR("Failed to get CDC command %s from ini\n", open_x_cmd[i]); + else + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "%s = ,%s\n", open_x_cmd[i], str); + } + } else { + slen = parser_get_int_data("pv5_4 command", name, str, sizeof(str)); + if (slen < 0) + ILI_ERR("Failed to get CDC command %s from ini\n", name); + else + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "CDC command = ,%s\n", str); + + /* Print short parameters */ + if (ipio_strcmp(name, "short test") == 0) + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "Variation = ,%d\n", short_para.variation); + + /* Print td second command */ + if (core_mp.td_retry && (ipio_strcmp(name, "peak to peak_td (lcm off)") == 0)) { + name = "peak to peak_td (lcm off)_2"; + parser_get_int_data("pv5_4 command", name, str, sizeof(str)); + tmp_len += snprintf(csv + tmp_len, (file_size - tmp_len), "CDC command 2 = ,%s\n", str); + } + } + *csv_len = tmp_len; +} + +static void mp_compare_cdc_show_result(int index, s32 *tmp, char *csv, + int *csv_len, int type, s32 *max_ts, + s32 *min_ts, const char *desp, int file_zise) +{ + int x, y, tmp_len = *csv_len; + int mp_result = MP_DATA_PASS; + + if (ERR_ALLOC_MEM(tmp)) { + ILI_ERR("The data of test item is null (%p)\n", tmp); + mp_result = -EMP_INVAL; + goto out; + } + + /* print X raw only */ + for (x = 0; x < core_mp.xch_len; x++) { + if (x == 0) { + DUMP("\n %s ", desp); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "\n %s ,", desp); + } + DUMP(" X_%d ,", (x+1)); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), " X_%d ,", (x+1)); + } + + DUMP("\n"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "\n"); + + for (y = 0; y < core_mp.ych_len; y++) { + DUMP(" Y_%d ,", (y+1)); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), " Y_%d ,", (y+1)); + + for (x = 0; x < core_mp.xch_len; x++) { + int shift = y * core_mp.xch_len + x; + + /* In Short teset, we only identify if its value is low than min threshold. */ + if (tItems[index].catalog == SHORT_TEST) { + if (tmp[shift] < min_ts[shift]) { + DUMP(" #%7d ", tmp[shift]); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "#%7d,", tmp[shift]); + mp_result = MP_DATA_FAIL; + } else { + DUMP(" %7d ", tmp[shift]); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), " %7d, ", tmp[shift]); + } + continue; + } + + if ((tmp[shift] <= max_ts[shift] && tmp[shift] >= min_ts[shift]) || (type != TYPE_JUGE)) { + if ((tmp[shift] == INT_MAX || tmp[shift] == INT_MIN) && (type == TYPE_BENCHMARK)) { + DUMP("%s", "BYPASS,"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "BYPASS,"); + } else { + DUMP(" %7d ", tmp[shift]); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), " %7d, ", tmp[shift]); + } + } else { + if (tmp[shift] > max_ts[shift]) { + DUMP(" *%7d ", tmp[shift]); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "*%7d,", tmp[shift]); + } else { + DUMP(" #%7d ", tmp[shift]); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "#%7d,", tmp[shift]); + } + mp_result = MP_DATA_FAIL; + } + } + DUMP("\n"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "\n"); + } + +out: + if (type == TYPE_JUGE) { + if (mp_result == MP_DATA_PASS) { + pr_info("\n Result : PASS\n"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "Result : PASS\n"); + } else { + pr_info("\n Result : FAIL\n"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "Result : FAIL\n"); + } + } + *csv_len = tmp_len; +} + +static void mp_compare_tip_ring_cdc_show_result(int index, s32 *tmp, char *csv, + int *csv_len, int type, s32 *max_ts, s32 *min_ts, const char *desp, + int file_zise, int trtype) +{ + int x, y, tmp_len = *csv_len; + int row, col, typeshift; + int mp_result = MP_DATA_PASS; + + if (ERR_ALLOC_MEM(tmp)) { + ILI_ERR("The data of test item is null (%p)\n", tmp); + mp_result = -EMP_INVAL; + goto out; + } + if (trtype == TIPRING_X) { + row = core_mp.xch_len; + col = core_mp.nPxRaw * 2; + typeshift = 0; + } else { + row = core_mp.nPyRaw * 2; + col = core_mp.ych_len; + typeshift = core_mp.nPxRaw_tipring_len; + } + + /* print X row only */ + for (x = 0; x < row; x++) { + if (x == 0) { + DUMP("\n %s ", desp); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "\n %s ,", desp); + } + DUMP(" X_%d ,", (x+1)); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), " X_%d ,", (x+1)); + } + + DUMP("\n"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "\n"); + for (y = 0; y < col; y++) { + DUMP(" Y_%d ,", (y+1)); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), " Y_%d ,", (y+1)); + + for (x = 0; x < row; x++) { + int shift = typeshift + y * row + x; + if ((tmp[shift] <= max_ts[shift] && tmp[shift] >= min_ts[shift]) || (type != TYPE_JUGE)) { + if ((tmp[shift] == INT_MAX || tmp[shift] == INT_MIN) && (type == TYPE_BENCHMARK)) { + DUMP("%s", "BYPASS,"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "BYPASS,"); + } else { + DUMP(" %7d ", tmp[shift]); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), " %7d, ", tmp[shift]); + } + } else { + if (tmp[shift] > max_ts[shift]) { + DUMP(" *%7d ", tmp[shift]); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "*%7d,", tmp[shift]); + } else { + DUMP(" #%7d ", tmp[shift]); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "#%7d,", tmp[shift]); + } + mp_result = MP_DATA_FAIL; + } + } + DUMP("\n"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "\n"); + } + +out: + if (type == TYPE_JUGE) { + if (mp_result == MP_DATA_PASS) { + pr_info("\n Result : PASS\n"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "Result : PASS\n"); + } else { + pr_info("\n Result : FAIL\n"); + tmp_len += snprintf(csv + tmp_len, (file_zise - tmp_len), "Result : FAIL\n"); + } + } + *csv_len = tmp_len; +} + +#define ABS(a, b) ((a > b) ? (a - b) : (b - a)) +#define ADDR(x, y) ((y * core_mp.xch_len) + (x)) + +static int compare_charge(s32 *charge_rate, int x, int y, s32 *inNodeType, + int Charge_AA, int Charge_Border, int Charge_Notch) +{ + int OpenThreadhold, tempY, tempX, ret, k; + int sx[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; + int sy[8] = {-1, -1, -1, 0, 0, 1, 1, 1}; + + ret = charge_rate[ADDR(x, y)]; + + /*Setting Threadhold from node type */ + if (charge_rate[ADDR(x, y)] == 0) + return ret; + else if ((inNodeType[ADDR(x, y)] & AA_Area) == AA_Area) + OpenThreadhold = Charge_AA; + else if ((inNodeType[ADDR(x, y)] & Border_Area) == Border_Area) + OpenThreadhold = Charge_Border; + else if ((inNodeType[ADDR(x, y)] & Notch) == Notch) + OpenThreadhold = Charge_Notch; + else + return ret; + + /* compare carge rate with 3*3 node */ + /* by pass => 1.no compare 2.corner 3.Skip_Micro 4.full open fail node */ + for (k = 0; k < 8; k++) { + tempX = x + sx[k]; + tempY = y + sy[k]; + + /*out of range */ + if ((tempX < 0) || (tempX >= core_mp.xch_len) || (tempY < 0) || (tempY >= core_mp.ych_len)) + continue; + + if ((inNodeType[ADDR(tempX, tempY)] == NO_COMPARE) || ((inNodeType[ADDR(tempX, tempY)] & Round_Corner) == Round_Corner) || + ((inNodeType[ADDR(tempX, tempY)] & Skip_Micro) == Skip_Micro) || charge_rate[ADDR(tempX, tempY)] == 0) + continue; + + if ((charge_rate[ADDR(tempX, tempY)] - charge_rate[ADDR(x, y)]) > OpenThreadhold) + return OpenThreadhold; + } + return ret; +} + +static int full_open_rate_compare(s32 *full_open, s32 *cbk, int x, int y, s32 inNodeType, int full_open_rate) +{ + int ret = true; + + if ((inNodeType == NO_COMPARE) || ((inNodeType & Round_Corner) == Round_Corner)) + return true; + + if (full_open[ADDR(x, y)] < (cbk[ADDR(x, y)] * full_open_rate / 100)) + ret = false; + + return ret; +} + +static s32 open_sp_formula(int dac, int raw, int tvch, int tvcl) +{ + s32 ret = 0; + u16 id = core_mp.chip_id; + + if (id == ILI9881_CHIP) { + ret = ((dac * 10000 * 161 / 100) - (16384 / 2 - raw) * 20000 * 7 / 16384 * 36 / 10) / (tvch - tvcl) / 2; + } else { + ret = ((dac * 10000 * 131 / 100) - (16384 / 2 - raw) * 20000 * 7 / 16384 * 36 / 10) / (tvch - tvcl) / 2; + } + return ret; +} + +static s32 open_c_formula(int inCap1DAC, int inCap1Raw, int accuracy) +{ + s32 inCap1Value = 0; + + u16 id = core_mp.chip_id; + u8 type = core_mp.chip_type; + + int inFoutRange = 16384; + int inFoutRange_half = 8192; + int inVadc_range = open_para.vadc_range; + int inVbk = open_para.invbk;/* from mp.ini */ + int inCbk_step = open_para.cbk_step;/* from mp.ini */ + int inCint = open_para.cint;/* from mp.ini */ + int inVdrv = open_para.tvch - open_para.tvcl;/* from mp.ini */ + int inGain = open_para.gain;/* from mp.ini */ + int inMagnification = 10; + int inPartDac = 0; + int inPartRaw = 0; + + if (inVbk == 0) { + if ((id == ILI7807_CHIP && ((type == ILI_S) || (type == ILI_V))) + || (id == ILI9882_CHIP && type == ILI_T)) + inVbk = 42; + else + inVbk = 39; + } + + if (inVadc_range == 0) + inVadc_range = 36; + + if ((inCbk_step == 0) || (inCint == 0)) { + if (id == ILI9881_CHIP) { + if ((type == ILI_N) || (type == ILI_O)) { + inCbk_step = 32; + inCint = 70; + } + } else if (id == ILI9882_CHIP) { + if (type == ILI_N) { + inCbk_step = 42; + inCint = 70; + } else if (type == ILI_H) { + inCbk_step = 42; + inCint = 69; + } + } else if (id == ILI7807_CHIP) { + if (type == ILI_Q) { + inCbk_step = 28; + inCint = 70; + } else if (type == ILI_S) { + inCbk_step = 38; + inCint = 66; + inVdrv = inVdrv / 10; + inGain = inGain / 10; + } else if (type == ILI_V) { + inCbk_step = 42; + inCint = 69; + } + } else if (id == ILI9883_CHIP) { + if (type == ILI_A) { + inCbk_step = 42; + inCint = 70; + } + } + } + + inPartDac = (inCap1DAC * inCbk_step * inVbk / 2); + inPartRaw = ((inCap1Raw - inFoutRange_half) * inVadc_range * inCint * 10 / inFoutRange); + + if (accuracy) { + inCap1Value = ((inPartDac + inPartRaw) * 10) / inVdrv / inMagnification / inGain; + } else { + inCap1Value = (inPartDac + inPartRaw) / inVdrv / inMagnification / inGain; + } + + return inCap1Value; +} + +static void allnode_open_cdc_result(int index, int *buf, int *dac, int *raw) +{ + int i; + char *desp = tItems[index].desp; + char str[32] = {0}; + int accuracy = 0; + + if (ipio_strcmp(desp, "open test(integration)_sp") == 0) { + for (i = 0; i < core_mp.frame_len; i++) + buf[i] = open_sp_formula(dac[i], raw[i], open_para.tvch, open_para.tvcl); + } else if (ipio_strcmp(desp, "open test_c") == 0 || ipio_strcmp(desp, "open test_c (openx enable)") == 0) { + + if (parser_get_int_data(desp, "accuracy", str, sizeof(str)) > 0) + accuracy = ili_katoi(str); + + for (i = 0; i < core_mp.frame_len; i++) + buf[i] = open_c_formula(dac[i], raw[i], accuracy); + } +} + +static int codeToOhm(s32 *ohm, s32 *Code, u16 *v_tdf, u16 *h_tdf) +{ + u16 id = core_mp.chip_id; + u8 type = core_mp.chip_type; + + int inTVCH = short_para.tvch; + int inTVCL = short_para.tvcl; + int inVariation = short_para.variation; + int inTDF1 = 0; + int inTDF2 = 0; + int inCint = short_para.cint; + int inRinternal = short_para.rinternal; + s32 temp = 0; + int j = 0; + + if (core_mp.isLongV) { + inTDF1 = *v_tdf; + inTDF2 = *(v_tdf + 1); + } else { + inTDF1 = *h_tdf; + inTDF2 = *(h_tdf + 1); + } + + if (inVariation == 0) { + inVariation = 100; + } + + if ((inCint == 0) || (inRinternal == 0)) { + if (id == ILI9881_CHIP) { + if ((type == ILI_N) || (type == ILI_O)) { + inRinternal = 1915; + inCint = 70; + } + } else if (id == ILI9882_CHIP) { + if (type == ILI_N) { + inRinternal = 2000; + inCint = 70; + } else if (type == ILI_H) { + inRinternal = 2000; + inCint = 69; + } + } else if (id == ILI7807_CHIP) { + if (type == ILI_Q) { + inRinternal = 1500; + inCint = 70; + } else if (type == ILI_S) { + inRinternal = 1500; + inCint = 66; + inTVCH = inTVCH/10; + inTVCL = inTVCL/10; + } else if (type == ILI_V) { + inRinternal = 2000; + inCint = 69; + } + } else if (id == ILI9883_CHIP) { + if (type == ILI_A) { + inRinternal = 2000; + inCint = 70; + } + } + } + for (j = 0; j < core_mp.frame_len; j++) { + if (Code[j] == 0) { + ILI_ERR("code is invalid\n"); + } else { + temp = ((inTVCH - inTVCL) * inVariation * (inTDF1 - inTDF2) * (1 << 12) / (9 * Code[j] * inCint)) * 1000; + temp = (temp - inRinternal) / 1000; + } + ohm[j] = temp; + } + + /* Unit = M Ohm */ + return temp; + +} + +static int short_test(int index, int frame_index) +{ + u32 pid = core_mp.chip_pid >> 8; + int j = 0, ret = 0; + u16 v_tdf[2] = {0}; + u16 h_tdf[2] = {0}; + char str[32] = {0}; + + v_tdf[0] = tItems[index].v_tdf_1; + v_tdf[1] = tItems[index].v_tdf_2; + h_tdf[0] = tItems[index].h_tdf_1; + h_tdf[1] = tItems[index].h_tdf_2; + + parser_get_int_data("short test", "tvch", str, sizeof(str)); + short_para.tvch = ili_katoi(str); + + parser_get_int_data("short test", "tvcl", str, sizeof(str)); + short_para.tvcl = ili_katoi(str); + + parser_get_int_data("short test", "variation", str, sizeof(str)); + short_para.variation = ili_katoi(str); + + parser_get_int_data("short test", "cint", str, sizeof(str)); + short_para.cint = ili_katoi(str); + + parser_get_int_data("short test", "rinternal", str, sizeof(str)); + short_para.rinternal = ili_katoi(str); + + /* 9881N, 9881O, 7807Q, 7807S not support cbk_step and cint read from mp.ini */ + if ((pid != 0x988117) && (pid != 0x988118) && (pid != 0x78071A) && (pid != 0x78071C)) { + if ((short_para.cint == 0) || (short_para.rinternal == 0)) { + ILI_ERR("Failed to get short parameter"); + core_mp.lost_parameter = true; + return -1; + } + } + + ILI_INFO("TVCH = %d, TVCL = %d, Variation = %d, V_TDF1 = %d, V_TDF2 = %d, H_TDF1 = %d, H_TDF2 = %d, Cint = %d, Rinternal = %d\n" + , short_para.tvch, short_para.tvcl, short_para.variation, tItems[index].v_tdf_1, tItems[index].v_tdf_2, tItems[index].h_tdf_1, tItems[index].h_tdf_2, short_para.cint, short_para.rinternal); + + if (core_mp.protocol_ver >= PROTOCOL_VER_540) { + /* Calculate code to ohm and save to tItems[index].buf */ + ili_dump_data(frame_buf, 10, core_mp.frame_len, core_mp.xch_len, "Short Raw 1"); + codeToOhm(&tItems[index].buf[frame_index * core_mp.frame_len], frame_buf, v_tdf, h_tdf); + ili_dump_data(&tItems[index].buf[frame_index * core_mp.frame_len], 10, core_mp.frame_len, core_mp.xch_len, "Short Ohm 1"); + } else { + for (j = 0; j < core_mp.frame_len; j++) + tItems[index].buf[frame_index * core_mp.frame_len + j] = frame_buf[j]; + } + + return ret; +} + +static int allnode_key_cdc_data(int index) +{ + int i, ret = 0, len = 0; + int inDACp = 0, inDACn = 0; + u8 cmd[3] = {0}; + u8 *ori = NULL; + + len = core_mp.key_len * 2; + + ILI_DBG("Read key's length = %d\n", len); + ILI_DBG("core_mp.key_len = %d\n", core_mp.key_len); + + if (len <= 0) { + ILI_ERR("Length is invalid\n"); + ret = -1; + goto out; + } + + /* CDC init */ + cmd[0] = P5_X_SET_CDC_INIT; + cmd[1] = tItems[index].cmd; + cmd[2] = 0; + + /* Allocate a buffer for the original */ + ori = kcalloc(len, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(ori)) { + ILI_ERR("Failed to allocate ori mem (%ld)\n", PTR_ERR(ori)); + ret = -1; + goto out; + } + ret = ilits->wrapper(cmd, sizeof(cmd), ori, len, ON, ON); + if (ret < 0) { + ILI_ERR(" fail to get cdc data\n"); + goto out; + } + ili_dump_data(ori, 8, len, 0, "Key CDC original"); + + if (key_buf == NULL) { + key_buf = kcalloc(core_mp.key_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(key_buf)) { + ILI_ERR("Failed to allocate FrameBuffer mem (%ld)\n", PTR_ERR(key_buf)); + goto out; + } + } else { + memset(key_buf, 0x0, core_mp.key_len); + } + + /* Convert original data to the physical one in each node */ + for (i = 0; i < core_mp.frame_len; i++) { + if (tItems[index].cmd == CMD_KEY_DAC) { + /* DAC - P */ + if (((ori[(2 * i) + 1] & 0x80) >> 7) == 1) { + /* Negative */ + inDACp = 0 - (int)(ori[(2 * i) + 1] & 0x7F); + } else { + inDACp = ori[(2 * i) + 1] & 0x7F; + } + + /* DAC - N */ + if (((ori[(1 + (2 * i)) + 1] & 0x80) >> 7) == 1) { + /* Negative */ + inDACn = 0 - (int)(ori[(1 + (2 * i)) + 1] & 0x7F); + } else { + inDACn = ori[(1 + (2 * i)) + 1] & 0x7F; + } + + key_buf[i] = (inDACp + inDACn) / 2; + } + } + ili_dump_data(key_buf, 32, core_mp.frame_len, core_mp.xch_len, "Key CDC combined data"); + +out: + ipio_kfree((void **)&ori); + return ret; +} + +static int mp_cdc_get_pv5_4_command(u8 *cmd, int len, int index) +{ + int slen = 0; + char str[128] = {0}; + char *key = tItems[index].desp; + + if (core_mp.td_retry && (ipio_strcmp(key, "peak to peak_td (lcm off)") == 0)) + key = "peak to peak_td (lcm off)_2"; + + slen = parser_get_int_data("pv5_4 command", key, str, sizeof(str)); + if (slen < 0) + return -1; + + if (parser_get_u8_array(str, cmd, 16, len) < 0) + return -1; + + return 0; +} + +static int mp_cdc_init_cmd_common(u8 *cmd, int len, int index) +{ + int ret = 0; + + if (core_mp.protocol_ver >= PROTOCOL_VER_540) { + core_mp.cdc_len = 15; + return mp_cdc_get_pv5_4_command(cmd, len, index); + } + + cmd[0] = P5_X_SET_CDC_INIT; + cmd[1] = tItems[index].cmd; + cmd[2] = 0; + + core_mp.cdc_len = 3; + + if (ipio_strcmp(tItems[index].desp, "open test(integration)") == 0) + cmd[2] = 0x2; + if (ipio_strcmp(tItems[index].desp, "open test(cap)") == 0) + cmd[2] = 0x3; + + if (tItems[index].catalog == PEAK_TO_PEAK_TEST) { + cmd[2] = ((tItems[index].frame_count & 0xff00) >> 8); + cmd[3] = tItems[index].frame_count & 0xff; + cmd[4] = 0; + + core_mp.cdc_len = 5; + + if (ipio_strcmp(tItems[index].desp, "noise peak to peak(cut panel)") == 0) + cmd[4] = 0x1; + + ILI_DBG("P2P CMD: %d,%d,%d,%d,%d\n", + cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); + } + + return ret; +} + +static int allnode_open_cdc_data(int mode, int *buf, int index) +{ + int i = 0, ret = 0, len = 0, precmd_len = 0; + int inDACp = 0, inDACn = 0; + u8 cmd[15] = {0}; + u8 precmd[256] = {0}; + u8 *ori = NULL; + char str[128] = {0}; + char *key[] = {"open dac", "open raw1", "open raw2", "open raw3", + "open cap1 dac", "open cap1 raw", "open_x cap1 dac", "open_x cap1 raw"}; + + /* Multipling by 2 is due to the 16 bit in each node */ + len = (core_mp.xch_len * core_mp.ych_len * 2) + 2; + + ILI_DBG("Read X/Y Channel length = %d, mode = %d\n", len, mode); + + if (len <= 2) { + ILI_ERR("Length is invalid\n"); + ret = -EMP_INVAL; + goto out; + } + + /*Pre-Command Init*/ + if (tItems[index].pre_cmd_en) { + memset(precmd, 0xFF, sizeof(precmd)); + precmd_len = parser_ini_precmd(tItems[index].desp, precmd); + + ili_dump_data(precmd, 16, precmd_len, 0, "PreCommand"); + + /*ini file no pre-command, disable precommand*/ + if (precmd_len < 13) + tItems[index].pre_cmd_en = DISABLE; + } + + /* CDC init. Read command from ini file */ + if (parser_get_int_data("pv5_4 command", key[mode], str, sizeof(str)) < 0) { + ILI_ERR("Failed to parse PV54 command, ret = %d\n", ret); + ret = -EMP_PARSE; + goto out; + } + + parser_get_u8_array(str, cmd, 16, sizeof(cmd)); + + ili_dump_data(cmd, 8, sizeof(cmd), 0, "Open SP command"); + + /* Allocate a buffer for the original */ + ori = kcalloc(len, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(ori)) { + ILI_ERR("Failed to allocate ori, (%ld)\n", PTR_ERR(ori)); + ret = -EMP_NOMEM; + goto out; + } + + /* Get original frame(cdc) data */ +#if (ENGINEER_FLOW) + if (!ilits->eng_flow) { + if (tItems[index].pre_cmd_en) { + if (precommd(cmd, core_mp.cdc_len, precmd, precmd_len, ori, len, ON, ON) < 0) + goto out; + } else { + if (ilits->wrapper(cmd, core_mp.cdc_len, ori, len, ON, ON) < 0) { + ILI_ERR("Failed to get cdc data\n"); + ret = -EMP_GET_CDC; + goto out; + } + } + } else { + msleep(200); + if (ilits->wrapper(cmd, core_mp.cdc_len, ori, len, OFF, OFF) < 0) { + ILI_ERR("Failed to get cdc data\n"); + } + } +#else + if (tItems[index].pre_cmd_en) { + if (precommd(cmd, core_mp.cdc_len, precmd, precmd_len, ori, len, ON, ON) < 0) + goto out; + } else { + if (ilits->wrapper(cmd, core_mp.cdc_len, ori, len, ON, ON) < 0) { + ILI_ERR("Failed to get cdc data\n"); + ret = -EMP_GET_CDC; + goto out; + } + } +#endif + + ili_dump_data(ori, 8, len, 0, "Open SP CDC original"); + + /* Convert original data to the physical one in each node */ + for (i = 0; i < core_mp.frame_len; i++) { + if ((mode == 0) || (mode == 4) || (mode == 6)) { + /* DAC - P */ + if (((ori[(2 * i) + 1] & 0x80) >> 7) == 1) { + /* Negative */ + inDACp = 0 - (int)(ori[(2 * i) + 1] & 0x7F); + } else { + inDACp = ori[(2 * i) + 1] & 0x7F; + } + + /* DAC - N */ + if (((ori[(1 + (2 * i)) + 1] & 0x80) >> 7) == 1) { + /* Negative */ + inDACn = 0 - (int)(ori[(1 + (2 * i)) + 1] & 0x7F); + } else { + inDACn = ori[(1 + (2 * i)) + 1] & 0x7F; + } + + buf[i] = inDACp + inDACn; + } else { + /* H byte + L byte */ + s32 tmp = (ori[(2 * i) + 1] << 8) + ori[(1 + (2 * i)) + 1]; + if ((tmp & 0x8000) == 0x8000) + buf[i] = tmp - 65536; + else + buf[i] = tmp; + + } + } + ili_dump_data(buf, 10, core_mp.frame_len, core_mp.xch_len, "Open SP CDC combined"); +out: + + ipio_kfree((void **)&ori); + return ret; +} + +static int allnode_peak_to_peak_cdc_data(int index) +{ + int i, k, ret = 0, len = 0, rd_frame_num = 1, cmd_len = 0, precmd_len = 0; + u8 cmd[15] = {0}; + u8 precmd[256] = {0}; + u8 *ori = NULL; + + /* Multipling by 2 is due to the 16 bit in each node */ + if (tItems[index].catalog == TIPRING_P2P) + len = (core_mp.tipring_len * 2) + 2; + else + len = (core_mp.frame_len * 2) + 2; + + ILI_DBG("Read X/Y Channel length = %d\n", len); + + if (len <= 2) { + ILI_ERR("Length is invalid\n"); + ret = -EMP_INVAL; + goto out; + } + + memset(cmd, 0xFF, sizeof(cmd)); + + /* Allocate a buffer for the original */ + ori = kcalloc(len, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(ori)) { + ILI_ERR("Failed to allocate ori, (%ld)\n", PTR_ERR(ori)); + ret = -EMP_NOMEM; + goto out; + } + + if (tItems[index].bch_mrk_multi) { + rd_frame_num = tItems[index].bch_mrk_frm_num - 1; + } + + if (frm_buf == NULL) { + frm_buf = (s32 **)kzalloc(tItems[index].bch_mrk_frm_num * sizeof(s32 *), GFP_KERNEL); + if (ERR_ALLOC_MEM(frm_buf)) { + ILI_ERR("Failed to allocate frm_buf mem (%ld)\n", PTR_ERR(frm_buf)); + ret = -EMP_NOMEM; + goto out; + } + for (i = 0; i < tItems[index].bch_mrk_frm_num; i++) { + frm_buf[i] = (s32 *)kzalloc(core_mp.frame_len * sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(frm_buf)) { + ILI_ERR("Failed to allocate frm_buf[%d] mem (%ld)\n", i, PTR_ERR(frm_buf)); + ret = -EMP_NOMEM; + goto out; + } + } + } + + /*Pre-Command Init*/ + if (tItems[index].pre_cmd_en) { + memset(precmd, 0xFF, sizeof(precmd)); + precmd_len = parser_ini_precmd(tItems[index].desp, precmd); + + ili_dump_data(precmd, 16, precmd_len, 0, "PreCommand"); + + /*ini file no pre-command, disable precommand*/ + if (precmd_len < 13) + tItems[index].pre_cmd_en = DISABLE; + } + + /* CDC init */ + if (mp_cdc_init_cmd_common(cmd, sizeof(cmd), index) < 0) { + ILI_ERR("Failed to get cdc command\n"); + ret = -EMP_CMD; + goto out; + } + + ili_dump_data(cmd, 8, core_mp.cdc_len, 0, "Mutual CDC command"); + + for (k = 0; k < rd_frame_num; k++) { + if (k == 0) + cmd_len = core_mp.cdc_len; + else + cmd_len = 0; + memset(ori, 0, len); + /* Get original frame(cdc) data */ +#if (ENGINEER_FLOW) + if (!ilits->eng_flow) { + if (tItems[index].pre_cmd_en) { + if (precommd(cmd, cmd_len, precmd, precmd_len, ori, len, ON, ON) < 0) { + goto out; + } + } else { + if (ilits->wrapper(cmd, cmd_len, ori, len, ON, ON) < 0) { + ILI_ERR("Failed to get cdc data\n"); + ret = -EMP_GET_CDC; + goto out; + } + } + } else { + msleep(200); + if (ilits->wrapper(cmd, cmd_len, ori, len, OFF, OFF) < 0) { + ILI_ERR("Failed to get cdc data\n"); + } + } +#else + if (tItems[index].pre_cmd_en) { + if (precommd(cmd, cmd_len, precmd, precmd_len, ori, len, ON, ON) < 0) { + goto out; + } + } else { + if (ilits->wrapper(cmd, cmd_len, ori, len, ON, ON) < 0) { + ILI_ERR("Failed to get cdc data\n"); + ret = -EMP_GET_CDC; + goto out; + } + } +#endif + + ili_dump_data(ori, 8, len, 0, "Mutual CDC original"); + + /* Convert original data to the physical one in each node */ + for (i = 0; i < (len / 2 - 1); i++) { + /* H byte + L byte */ + s32 tmp = (ori[(2 * i) + 1] << 8) + ori[(1 + (2 * i)) + 1]; + + if ((tmp & 0x8000) == 0x8000) + frm_buf[k][i] = tmp - 65536; + else + frm_buf[k][i] = tmp; + + /* multiple case frame3 = frame1 - frame2 */ + if (tItems[index].bch_mrk_multi && rd_frame_num == k + 1) + frm_buf[k+1][i] = frm_buf[k-1][i] - frm_buf[k][i]; + } + } + + if (tItems[index].bch_mrk_multi) { + ili_dump_data(frm_buf[0], 32, (len / 2 - 1), core_mp.xch_len, "Mutual CDC combined[0]/frame1"); + ili_dump_data(frm_buf[1], 32, (len / 2 - 1), core_mp.xch_len, "Mutual CDC combined[1]/frame2"); + ili_dump_data(frm_buf[2], 32, (len / 2 - 1), core_mp.xch_len, "Mutual CDC combined[2]/frame3"); + } else { + ili_dump_data(frm_buf[0], 32, (len / 2 - 1), core_mp.xch_len, "Mutual CDC combined[0]/frame1"); + } + +out: + ipio_kfree((void **)&ori); + return ret; +} + +static int allnode_mutual_cdc_data(int index) +{ + int i, ret = 0, len = 0, precmd_len = 0, cdc_len = 0; + int inDACp = 0, inDACn = 0; + u8 cmd[15] = {0}; + u8 precmd[256] = {0}; + u8 *ori = NULL; + + if (tItems[index].catalog == TIPRING_RAW) { + cdc_len = core_mp.tipring_len; + } else { + cdc_len = core_mp.frame_len; + } + + /* Multipling by 2 is due to the 16 bit in each node */ + len = (cdc_len * 2) + 2; + + ILI_DBG("Read X/Y Channel length = %d\n", len); + + if (len <= 2) { + ILI_ERR("Length is invalid\n"); + ret = -EMP_INVAL; + goto out; + } + + /*Pre-Command Init*/ + if (tItems[index].pre_cmd_en) { + memset(precmd, 0xFF, sizeof(precmd)); + precmd_len = parser_ini_precmd(tItems[index].desp, precmd); + + ili_dump_data(precmd, 16, precmd_len, 0, "PreCommand"); + + /*ini file no pre-command, disable precommand*/ + if (precmd_len < 13) + tItems[index].pre_cmd_en = DISABLE; + } + + memset(cmd, 0xFF, sizeof(cmd)); + + /* CDC init */ + if (mp_cdc_init_cmd_common(cmd, sizeof(cmd), index) < 0) { + ILI_ERR("Failed to get cdc command\n"); + ret = -EMP_CMD; + goto out; + } + + ili_dump_data(cmd, 8, core_mp.cdc_len, 0, "Mutual CDC command"); + + /* Allocate a buffer for the original */ + ori = kcalloc(len, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(ori)) { + ILI_ERR("Failed to allocate ori, (%ld)\n", PTR_ERR(ori)); + ret = -EMP_NOMEM; + goto out; + } + + /* Get original frame(cdc) data */ +#if (ENGINEER_FLOW) + if (!ilits->eng_flow) { + if (tItems[index].pre_cmd_en) { + if (precommd(cmd, core_mp.cdc_len, precmd, precmd_len, ori, len, ON, ON) < 0) + goto out; + } else { + if (ilits->wrapper(cmd, core_mp.cdc_len, ori, len, ON, ON) < 0) { + ILI_ERR("Failed to get cdc data\n"); + ret = -EMP_GET_CDC; + goto out; + } + } + } else { + msleep(200); + if (ilits->wrapper(cmd, core_mp.cdc_len, ori, len, OFF, OFF) < 0) { + ILI_ERR("Failed to get cdc data\n"); + } + } +#else + if (tItems[index].pre_cmd_en) { + if (precommd(cmd, core_mp.cdc_len, precmd, precmd_len, ori, len, ON, ON) < 0) + goto out; + } else { + if (ilits->wrapper(cmd, core_mp.cdc_len, ori, len, ON, ON) < 0) { + ILI_ERR("Failed to get cdc data\n"); + ret = -EMP_GET_CDC; + goto out; + } + } +#endif + + ili_dump_data(ori, 8, len, 0, "Mutual CDC original"); + + if (frame_buf == NULL) { + frame_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(frame_buf)) { + ILI_ERR("Failed to allocate FrameBuffer mem (%ld)\n", PTR_ERR(frame_buf)); + ret = -EMP_NOMEM; + goto out; + } + } else { + memset(frame_buf, 0x0, core_mp.frame_len); + } + + /* Convert original data to the physical one in each node */ + for (i = 0; i < cdc_len; i++) { + if (ipio_strcmp(tItems[index].desp, "calibration data(dac)") == 0) { + /* DAC - P */ + if (((ori[(2 * i) + 1] & 0x80) >> 7) == 1) { + /* Negative */ + inDACp = 0 - (int)(ori[(2 * i) + 1] & 0x7F); + } else { + inDACp = ori[(2 * i) + 1] & 0x7F; + } + + /* DAC - N */ + if (((ori[(1 + (2 * i)) + 1] & 0x80) >> 7) == 1) { + /* Negative */ + inDACn = 0 - (int)(ori[(1 + (2 * i)) + 1] & 0x7F); + } else { + inDACn = ori[(1 + (2 * i)) + 1] & 0x7F; + } + + frame_buf[i] = (inDACp + inDACn) / 2; + } else { + /* H byte + L byte */ + s32 tmp = (ori[(2 * i) + 1] << 8) + ori[(1 + (2 * i)) + 1]; + + if ((tmp & 0x8000) == 0x8000) + frame_buf[i] = tmp - 65536; + else + frame_buf[i] = tmp; + + if (ipio_strcmp(tItems[index].desp, "raw data(no bk)") == 0 || + ipio_strcmp(tItems[index].desp, "raw data(no bk) (lcm off)") == 0) { + frame_buf[i] -= core_mp.no_bk_shift; + } + } + } + + ili_dump_data(frame_buf, 32, cdc_len, core_mp.xch_len, "Mutual CDC combined"); + +out: + ipio_kfree((void **)&ori); + return ret; +} + +static void compare_MaxMin_result(int index, s32 *data) +{ + int x, y; + if (tItems[index].catalog == TIPRING_RAW || tItems[index].catalog == TIPRING_P2P) { + for (x = 0; x < core_mp.tipring_len; x++) { + if (tItems[index].max_buf[x] < data[x]) + tItems[index].max_buf[x] = data[x]; + + if (tItems[index].min_buf[x] > data[x]) + tItems[index].min_buf[x] = data[x]; + } + } else { + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + int shift = y * core_mp.xch_len; + + if (tItems[index].catalog == UNTOUCH_P2P) + return; + else if (tItems[index].catalog == TX_RX_DELTA) { + /* Tx max/min comparison */ + if (core_mp.tx_delta_buf[shift + x] < data[shift + x]) + core_mp.tx_max_buf[shift + x] = data[shift + x]; + + if (core_mp.tx_delta_buf[shift + x] > data[shift + x]) + core_mp.tx_min_buf[shift + x] = data[shift + x]; + + /* Rx max/min comparison */ + if (core_mp.rx_delta_buf[shift + x] < data[shift + x]) + core_mp.rx_max_buf[shift + x] = data[shift + x]; + + if (core_mp.rx_delta_buf[shift + x] > data[shift + x]) + core_mp.rx_min_buf[shift + x] = data[shift + x]; + } else { + if (tItems[index].max_buf[shift + x] < data[shift + x]) + tItems[index].max_buf[shift + x] = data[shift + x]; + + if (tItems[index].min_buf[shift + x] > data[shift + x]) + tItems[index].min_buf[shift + x] = data[shift + x]; + } + } + } + } + +} + +static int create_mp_test_frame_buffer(int index, int frame_count) +{ + int i; + + ILI_DBG("Create MP frame buffers (index = %d), count = %d\n", + index, frame_count); + + if (tItems[index].catalog == TX_RX_DELTA) { + if (core_mp.tx_delta_buf == NULL) { + core_mp.tx_delta_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(core_mp.tx_delta_buf)) { + ILI_ERR("Failed to allocate tx_delta_buf mem\n"); + ipio_kfree((void **)&core_mp.tx_delta_buf); + return -ENOMEM; + } + } + + if (core_mp.rx_delta_buf == NULL) { + core_mp.rx_delta_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(core_mp.rx_delta_buf)) { + ILI_ERR("Failed to allocate rx_delta_buf mem\n"); + ipio_kfree((void **)&core_mp.rx_delta_buf); + return -ENOMEM; + } + } + + if (core_mp.tx_max_buf == NULL) { + core_mp.tx_max_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(core_mp.tx_max_buf)) { + ILI_ERR("Failed to allocate tx_max_buf mem\n"); + ipio_kfree((void **)&core_mp.tx_max_buf); + return -ENOMEM; + } + } + + if (core_mp.tx_min_buf == NULL) { + core_mp.tx_min_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(core_mp.tx_min_buf)) { + ILI_ERR("Failed to allocate tx_min_buf mem\n"); + ipio_kfree((void **)&core_mp.tx_min_buf); + return -ENOMEM; + } + } + + if (core_mp.rx_max_buf == NULL) { + core_mp.rx_max_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(core_mp.rx_max_buf)) { + ILI_ERR("Failed to allocate rx_max_buf mem\n"); + ipio_kfree((void **)&core_mp.rx_max_buf); + return -ENOMEM; + } + } + + if (core_mp.rx_min_buf == NULL) { + core_mp.rx_min_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(core_mp.rx_min_buf)) { + ILI_ERR("Failed to allocate rx_min_buf mem\n"); + ipio_kfree((void **)&core_mp.rx_min_buf); + return -ENOMEM; + } + } + } else { + if (tItems[index].buf == NULL) { + tItems[index].buf = vmalloc(frame_count * core_mp.frame_len * sizeof(s32)); + if (ERR_ALLOC_MEM(tItems[index].buf)) { + ILI_ERR("Failed to allocate buf mem\n"); + ipio_kfree((void **)&tItems[index].buf); + return -ENOMEM; + } + } + + if (tItems[index].result_buf == NULL) { + tItems[index].result_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].result_buf)) { + ILI_ERR("Failed to allocate result_buf mem\n"); + ipio_kfree((void **)&tItems[index].result_buf); + return -ENOMEM; + } + } + + if (tItems[index].max_buf == NULL) { + tItems[index].max_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].max_buf)) { + ILI_ERR("Failed to allocate max_buf mem\n"); + ipio_kfree((void **)&tItems[index].max_buf); + return -ENOMEM; + } + } + + if (tItems[index].min_buf == NULL) { + tItems[index].min_buf = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].min_buf)) { + ILI_ERR("Failed to allocate min_buf mem\n"); + ipio_kfree((void **)&tItems[index].min_buf); + return -ENOMEM; + } + } + + if (tItems[index].spec_option == BENCHMARK) { + if (tItems[index].bch_mrk_max == NULL) { + tItems[index].bch_mrk_max = (s32 **)kzalloc(tItems[index].bch_mrk_frm_num * sizeof(s32 *), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].bch_mrk_max)) { + ILI_ERR("Failed to allocate bch_mrk_max mem\n"); + ipio_kfree((void **)&tItems[index].bch_mrk_max); + return -ENOMEM; + } + + for (i = 0; i < tItems[index].bch_mrk_frm_num; i++) { + tItems[index].bch_mrk_max[i] = (s32 *)kzalloc(core_mp.frame_len * sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].bch_mrk_max[i])) { + ILI_ERR("Failed to allocate bch_mrk_max[%d] mem\n", i); + ipio_kfree((void **)&tItems[index].bch_mrk_max[i]); + return -ENOMEM; + } + } + } + + if (tItems[index].bch_mrk_min == NULL) { + tItems[index].bch_mrk_min = (s32 **)kzalloc(tItems[index].bch_mrk_frm_num * sizeof(s32 *), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].bch_mrk_min)) { + ILI_ERR("Failed to allocate bch_mrk_min mem\n"); + ipio_kfree((void **)&tItems[index].bch_mrk_min); + return -ENOMEM; + } + for (i = 0; i < tItems[index].bch_mrk_frm_num; i++) { + tItems[index].bch_mrk_min[i] = (s32 *)kzalloc(core_mp.frame_len * sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].bch_mrk_min[i])) { + ILI_ERR("Failed to allocate bch_mrk_min[%d] mem\n", i); + ipio_kfree((void **)&tItems[index].bch_mrk_min[i]); + return -ENOMEM; + } + } + } + + if (tItems[index].bench_mark_max == NULL) { + tItems[index].bench_mark_max = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].bench_mark_max)) { + ILI_ERR("Failed to allocate bench_mark_max mem\n"); + ipio_kfree((void **)&tItems[index].bench_mark_max); + return -ENOMEM; + } + } + if (tItems[index].bench_mark_min == NULL) { + tItems[index].bench_mark_min = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].bench_mark_min)) { + ILI_ERR("Failed to allocate bench_mark_min mem\n"); + ipio_kfree((void **)&tItems[index].bench_mark_min); + return -ENOMEM; + } + } + } + } + return 0; +} + +static int pin_test(int index) +{ + int ret = 0; + u8 cmd[5] = {0}; + + ILI_INFO("PIN test start"); + ILI_INFO("test_int_pin = 0x%x\n", tItems[index].test_int_pin); + ILI_INFO("int_pulse_test = 0x%x\n", tItems[index].int_pulse_test); + ILI_INFO("delay_time = 0x%x\n", tItems[index].delay_time); + + if (tItems[index].test_int_pin == ENABLE) { + /* test HIGH level*/ + cmd[0] = tItems[index].cmd; + cmd[1] = 0x1; + ret = ilits->wrapper(cmd, 2, NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Write command failed\n"); + ret = -EMP_CMD; + goto out; + } + + ret = ilits->detect_int_stat(false); + if (ret < 0) { + ret = -EMP_INT; + goto out; + } + + /* test LOW level*/ + cmd[1] = 0x0; + ret = ilits->wrapper(cmd, 2, NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Write command failed\n"); + ret = -EMP_CMD; + goto out; + } + + ret = ilits->detect_int_stat(false); + if (ret < 0) { + ret = -EMP_INT; + goto out; + } + } + + if (tItems[index].int_pulse_test == ENABLE) { + + ILI_INFO("MP IRQ Rising Trigger Test\n"); + cmd[1] = 0x2; + cmd[2] = tItems[index].delay_time; + + ili_irq_unregister(); + ret = ili_irq_register(IRQF_TRIGGER_RISING); + if (ret < 0) { + ret = -EMP_INT; + goto out; + } + + atomic_set(&ilits->cmd_int_check, ENABLE); + ret = ilits->wrapper(cmd, 3, NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Write command failed\n"); + ret = -EMP_CMD; + goto out; + } + + ret = ilits->detect_int_stat(false); + if (ret < 0) { + ret = -EMP_INT; + goto out; + } + + ILI_INFO("MP IRQ Falling Trigger Test\n"); + ili_irq_unregister(); + ret = ili_irq_register(IRQF_TRIGGER_FALLING); + if (ret < 0) { + ret = -EMP_INT; + goto out; + } + + atomic_set(&ilits->cmd_int_check, ENABLE); + + ret = ilits->wrapper(cmd, 3, NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Write command failed\n"); + ret = -EMP_CMD; + goto out; + } + + ret = ilits->detect_int_stat(false); + if (ret < 0) { + ret = -EMP_INT; + goto out; + } + } + + tItems[index].item_result = MP_DATA_PASS; + +out: + if (ret < 0) + tItems[index].item_result = MP_DATA_FAIL; + + ILI_INFO("Change to defualt IRQ trigger type\n"); + ili_irq_unregister(); + ili_irq_register(ilits->irq_tirgger_type); + atomic_set(&ilits->cmd_int_check, DISABLE); + + return ret; +} + +static int mutual_test(int index) +{ + int i = 0, j = 0, x = 0, y = 0, ret = 0, get_frame_cont = 1; + + ILI_DBG("index = %d, desp = %s, Frame Count = %d\n", + index, tItems[index].desp, tItems[index].frame_count); + + /* + * We assume that users who are calling the test forget to config frame count + * as 1, so we just help them to set it up. + */ + if (tItems[index].frame_count <= 0) { + ILI_ERR("Frame count is zero, which is at least set as 1\n"); + tItems[index].frame_count = 1; + } + + ret = create_mp_test_frame_buffer(index, tItems[index].frame_count); + if (ret < 0) { + ret = -EMP_NOMEM; + goto out; + } + + if (tItems[index].catalog == TIPRING_RAW) { + /* Init Max/Min buffer */ + for (x = 0; x < core_mp.tipring_len; x++) { + tItems[index].max_buf[x] = INT_MIN; + tItems[index].min_buf[x] = INT_MAX; + } + + get_frame_cont = tItems[index].frame_count; + + if (tItems[index].spec_option == BENCHMARK) { + parser_tip_ring_ini_benchmark(tItems[index].bench_mark_max, tItems[index].bench_mark_min, + tItems[index].type_option, tItems[index].desp, core_mp.tipring_len); + } + } else { + /* Init Max/Min buffer */ + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + if (tItems[i].catalog == TX_RX_DELTA) { + core_mp.tx_max_buf[y * core_mp.xch_len + x] = INT_MIN; + core_mp.rx_max_buf[y * core_mp.xch_len + x] = INT_MIN; + core_mp.tx_min_buf[y * core_mp.xch_len + x] = INT_MAX; + core_mp.rx_min_buf[y * core_mp.xch_len + x] = INT_MAX; + } else { + tItems[index].max_buf[y * core_mp.xch_len + x] = INT_MIN; + tItems[index].min_buf[y * core_mp.xch_len + x] = INT_MAX; + } + } + } + + if (tItems[index].spec_option == BENCHMARK) { + parser_ini_benchmark(tItems[index].bench_mark_max, tItems[index].bench_mark_min, + tItems[index].type_option, tItems[index].desp, core_mp.frame_len, BENCHMARK_KEY_NAME); + dump_benchmark_data(tItems[index].bench_mark_max, tItems[index].bench_mark_min); + } + } + + if (tItems[index].catalog != PEAK_TO_PEAK_TEST) + get_frame_cont = tItems[index].frame_count; + + + for (i = 0; i < get_frame_cont; i++) { + ret = allnode_mutual_cdc_data(index); + if (ret < 0) { + ILI_ERR("Failed to initialise CDC data, %d\n", ret); + goto out; + } + switch (tItems[index].catalog) { + case PIXEL: + run_pixel_test(index); + break; + case UNTOUCH_P2P: + run_untouch_p2p_test(index); + break; + case OPEN_TEST: + run_open_test(index); + break; + case TX_RX_DELTA: + run_tx_rx_delta_test(index); + break; + case SHORT_TEST: + ret = short_test(index, i); + if (ret < 0) { + ret = -EMP_PARA_NULL; + goto out; + } + break; + case TIPRING_RAW: + for (j = 0; j < core_mp.tipring_len; j++) + tItems[index].buf[i * core_mp.tipring_len + j] = frame_buf[j]; + break; + default: + for (j = 0; j < core_mp.frame_len; j++) + tItems[index].buf[i * core_mp.frame_len + j] = frame_buf[j]; + break; + } + if (tItems[index].catalog == TIPRING_RAW) + compare_MaxMin_result(index, &tItems[index].buf[i * core_mp.tipring_len]); + else + compare_MaxMin_result(index, &tItems[index].buf[i * core_mp.frame_len]); + + } + +out: + return ret; +} + +static int peak_to_peak_test(int index) +{ + int i = 0, j = 0, x = 0, y = 0, ret = 0, cdc_len = 0; + char benchmark_str[128] = {0}; + + if (tItems[index].catalog == TIPRING_P2P) + cdc_len = core_mp.tipring_len; + else + cdc_len = core_mp.frame_len; + + ILI_DBG("index = %d, desp = %s bch_mrk_frm_num = %d, cdc len = %d\n" + , index, tItems[index].desp, tItems[index].bch_mrk_frm_num, cdc_len); + + ret = create_mp_test_frame_buffer(index, tItems[index].bch_mrk_frm_num); + if (ret < 0) { + ret = -EMP_NOMEM; + goto out; + } + + if (tItems[index].spec_option == BENCHMARK) { + if (tItems[index].catalog == TIPRING_P2P) { + for (i = 0; i < tItems[index].bch_mrk_frm_num; i++) { + if (tItems[index].bch_mrk_multi){ + parser_ini_benchmark(tItems[index].bch_mrk_max[i], tItems[index].bch_mrk_min[i], tItems[index].type_option, + tItems[index].desp, core_mp.nPxRaw_tipring_len, get_csv_frame_name(BENCHMARK_KEY_NAME, i + 1)); + + parser_ini_benchmark(tItems[index].bch_mrk_max[i] + core_mp.nPxRaw_tipring_len, + tItems[index].bch_mrk_min[i] + core_mp.nPxRaw_tipring_len, tItems[index].type_option, tItems[index].desp, + core_mp.nPyRaw_tipring_len, get_csv_frame_name(BENCHMARK_KEY_NAME, i + 4)); + } else { + parser_ini_benchmark(tItems[index].bch_mrk_max[i], tItems[index].bch_mrk_min[i], tItems[index].type_option, + tItems[index].desp, core_mp.nPxRaw_tipring_len, get_csv_frame_name(BENCHMARK_KEY_NAME, 1)); + + parser_ini_benchmark(tItems[index].bch_mrk_max[i] + core_mp.nPxRaw_tipring_len, + tItems[index].bch_mrk_min[i] + core_mp.nPxRaw_tipring_len, tItems[index].type_option, + tItems[index].desp, core_mp.nPyRaw_tipring_len, get_csv_frame_name(BENCHMARK_KEY_NAME, 2)); + } + + if (debug_en) { + ili_dump_data(tItems[index].bch_mrk_max[i], 32, core_mp.tipring_len, 0, get_csv_frame_name("Dump Tip Ring Benchmark Max ", i + 1)); + ili_dump_data(tItems[index].bch_mrk_min[i], 32, core_mp.tipring_len, 0, get_csv_frame_name("Dump Tip Ring Benchmark Min ", i + 1)); + } + } + } else { + for (i = 0; i < tItems[index].bch_mrk_frm_num; i++) { + if (tItems[index].bch_mrk_multi) + snprintf(benchmark_str, sizeof(benchmark_str), "%s%d", BENCHMARK_KEY_NAME, i+1); + else + snprintf(benchmark_str, sizeof(benchmark_str), "%s", BENCHMARK_KEY_NAME); + + parser_ini_benchmark(tItems[index].bch_mrk_max[i], tItems[index].bch_mrk_min[i], + tItems[index].type_option, tItems[index].desp, core_mp.frame_len, benchmark_str); + + dump_benchmark_data(tItems[index].bch_mrk_max[i], tItems[index].bch_mrk_min[i]); + } + } + } + + /* Init Max/Min buffer */ + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + tItems[index].max_buf[y * core_mp.xch_len + x] = INT_MIN; + tItems[index].min_buf[y * core_mp.xch_len + x] = INT_MAX; + } + } + + ret = allnode_peak_to_peak_cdc_data(index); + if (ret < 0) { + ILI_ERR("Failed to initialise CDC data, %d\n", ret); + goto out; + } + for (i = 0; i < tItems[index].bch_mrk_frm_num; i++) { + for (j = 0; j < cdc_len; j++) + tItems[index].buf[i * cdc_len + j] = frm_buf[i][j]; + + compare_MaxMin_result(index, &tItems[index].buf[i * cdc_len]); + } + +out: + return ret; +} + + +static int open_test_sp(int index) +{ + struct mp_test_P540_open *open; + int i = 0, x = 0, y = 0, ret = 0, addr = 0; + int Charge_AA = 0, Charge_Border = 0, Charge_Notch = 0, full_open_rate = 0; + char str[512] = {0}; + + ILI_DBG("index = %d, desp = %s, Frame Count = %d\n", + index, tItems[index].desp, tItems[index].frame_count); + + /* + * We assume that users who are calling the test forget to config frame count + * as 1, so we just help them to set it up. + */ + if (tItems[index].frame_count <= 0) { + ILI_ERR("Frame count is zero, which is at least set as 1\n"); + tItems[index].frame_count = 1; + } + + open = kzalloc(tItems[index].frame_count * sizeof(struct mp_test_P540_open), GFP_KERNEL); + if (ERR_ALLOC_MEM(open)) { + ILI_ERR("Failed to allocate open mem (%ld)\n", PTR_ERR(open)); + ret = -EMP_NOMEM; + goto out; + } + + ret = create_mp_test_frame_buffer(index, tItems[index].frame_count); + if (ret < 0) { + ret = -EMP_NOMEM; + goto out; + } + + if (frame1_cbk700 == NULL) { + frame1_cbk700 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(frame1_cbk700)) { + ILI_ERR("Failed to allocate frame1_cbk700 buffer\n"); + return -EMP_NOMEM; + } + } else { + memset(frame1_cbk700, 0x0, core_mp.frame_len); + } + + if (frame1_cbk250 == NULL) { + frame1_cbk250 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(frame1_cbk250)) { + ILI_ERR("Failed to allocate frame1_cbk250 buffer\n"); + ipio_kfree((void **)&frame1_cbk700); + return -EMP_NOMEM; + } + } else { + memset(frame1_cbk250, 0x0, core_mp.frame_len); + } + + if (frame1_cbk200 == NULL) { + frame1_cbk200 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(frame1_cbk200)) { + ILI_ERR("Failed to allocate cbk buffer\n"); + ipio_kfree((void **)&frame1_cbk700); + ipio_kfree((void **)&frame1_cbk250); + return -EMP_NOMEM; + } + } else { + memset(frame1_cbk200, 0x0, core_mp.frame_len); + } + + tItems[index].node_type = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(tItems[index].node_type)) { + ILI_ERR("Failed to allocate node_type FRAME buffer\n"); + return -EMP_NOMEM; + } + + /* Init Max/Min buffer */ + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + tItems[index].max_buf[y * core_mp.xch_len + x] = INT_MIN; + tItems[index].min_buf[y * core_mp.xch_len + x] = INT_MAX; + } + } + + if (tItems[index].spec_option == BENCHMARK) { + parser_ini_benchmark(tItems[index].bench_mark_max, tItems[index].bench_mark_min, + tItems[index].type_option, tItems[index].desp, core_mp.frame_len, BENCHMARK_KEY_NAME); + dump_benchmark_data(tItems[index].bench_mark_max, tItems[index].bench_mark_min); + } + + parser_ini_nodetype(tItems[index].node_type, NODE_TYPE_KEY_NAME, core_mp.frame_len); + dump_node_type_buffer(tItems[index].node_type, "node type"); + + parser_get_int_data(tItems[index].desp, "charge_aa", str, sizeof(str)); + Charge_AA = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "charge_border", str, sizeof(str)); + Charge_Border = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "charge_notch", str, sizeof(str)); + Charge_Notch = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "full open", str, sizeof(str)); + full_open_rate = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "tvch", str, sizeof(str)); + open_para.tvch = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "tvcl", str, sizeof(str)); + open_para.tvcl = ili_katoi(str); + + ILI_DBG("AA = %d, Border = %d, Notch = %d, full_open_rate = %d, tvch = %d, tvcl = %d\n", + Charge_AA, Charge_Border, Charge_Notch, + full_open_rate, open_para.tvch, open_para.tvcl); + + for (i = 0; i < tItems[index].frame_count; i++) { + open[i].tdf_700 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].tdf_250 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].tdf_200 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].cbk_700 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].cbk_250 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].cbk_200 = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].charg_rate = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].full_Open = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].dac = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + } + + for (i = 0; i < tItems[index].frame_count; i++) { + ret = allnode_open_cdc_data(0, open[i].dac, index); + if (ret < 0) { + ILI_ERR("Failed to get Open SP DAC data, %d\n", ret); + goto out; + } + ret = allnode_open_cdc_data(1, open[i].tdf_700, index); + if (ret < 0) { + ILI_ERR("Failed to get Open SP Raw1 data, %d\n", ret); + goto out; + } + ret = allnode_open_cdc_data(2, open[i].tdf_250, index); + if (ret < 0) { + ILI_ERR("Failed to get Open SP Raw2 data, %d\n", ret); + goto out; + } + ret = allnode_open_cdc_data(3, open[i].tdf_200, index); + if (ret < 0) { + ILI_ERR("Failed to get Open SP Raw3 data, %d\n", ret); + goto out; + } + allnode_open_cdc_result(index, open[i].cbk_700, open[i].dac, open[i].tdf_700); + allnode_open_cdc_result(index, open[i].cbk_250, open[i].dac, open[i].tdf_250); + allnode_open_cdc_result(index, open[i].cbk_200, open[i].dac, open[i].tdf_200); + + addr = 0; + + /* record fist frame for debug */ + if (i == 0) { + ipio_memcpy(frame1_cbk700, open[i].cbk_700, core_mp.frame_len * sizeof(s32), core_mp.frame_len * sizeof(s32)); + ipio_memcpy(frame1_cbk250, open[i].cbk_250, core_mp.frame_len * sizeof(s32), core_mp.frame_len * sizeof(s32)); + ipio_memcpy(frame1_cbk200, open[i].cbk_200, core_mp.frame_len * sizeof(s32), core_mp.frame_len * sizeof(s32)); + } + + ili_dump_data(open[i].cbk_700, 10, core_mp.frame_len, core_mp.xch_len, "cbk 700"); + ili_dump_data(open[i].cbk_250, 10, core_mp.frame_len, core_mp.xch_len, "cbk 250"); + ili_dump_data(open[i].cbk_200, 10, core_mp.frame_len, core_mp.xch_len, "cbk 200"); + + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + open[i].charg_rate[addr] = open[i].cbk_250[addr] * 100 / open[i].cbk_700[addr]; + open[i].full_Open[addr] = open[i].cbk_700[addr] - open[i].cbk_200[addr]; + addr++; + } + } + + ili_dump_data(open[i].charg_rate, 10, core_mp.frame_len, core_mp.xch_len, "origin charge rate"); + ili_dump_data(open[i].full_Open, 10, core_mp.frame_len, core_mp.xch_len, "origin full open"); + + addr = 0; + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + if (full_open_rate_compare(open[i].full_Open, open[i].cbk_700, x, y, tItems[index].node_type[addr], full_open_rate) == false) { + tItems[index].buf[(i * core_mp.frame_len) + addr] = 0; + open[i].charg_rate[addr] = 0; + } + addr++; + } + } + + ili_dump_data(&tItems[index].buf[(i * core_mp.frame_len)], 10, core_mp.frame_len, core_mp.xch_len, "after full_open_rate_compare"); + + addr = 0; + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + tItems[index].buf[(i * core_mp.frame_len) + addr] = compare_charge(open[i].charg_rate, x, y, tItems[index].node_type, Charge_AA, Charge_Border, Charge_Notch); + addr++; + } + } + + ili_dump_data(&tItems[index].buf[(i * core_mp.frame_len)], 10, core_mp.frame_len, core_mp.xch_len, "after compare charge rate"); + + compare_MaxMin_result(index, &tItems[index].buf[(i * core_mp.frame_len)]); + } + +out: + ipio_kfree((void **)&tItems[index].node_type); + + if (open != NULL) { + for (i = 0; i < tItems[index].frame_count; i++) { + ipio_kfree((void **)&open[i].tdf_700); + ipio_kfree((void **)&open[i].tdf_250); + ipio_kfree((void **)&open[i].tdf_200); + ipio_kfree((void **)&open[i].cbk_700); + ipio_kfree((void **)&open[i].cbk_250); + ipio_kfree((void **)&open[i].cbk_200); + ipio_kfree((void **)&open[i].charg_rate); + ipio_kfree((void **)&open[i].full_Open); + ipio_kfree((void **)&open[i].dac); + } + kfree(open); + open = NULL; + } + + return ret; +} + +static int open_test_cap(int index) +{ + u32 pid = core_mp.chip_pid >> 8; + struct mp_test_open_c *open; + int i = 0, x = 0, y = 0, ret = 0, addr = 0; + bool isOpenX = DISABLE; + char str[512] = {0}; + + isOpenX = (ipio_strcmp(tItems[index].desp, "open test_c (openx enable)") == 0) ? ENABLE : DISABLE; + + ILI_DBG("index = %d, desp = %s, Frame Count = %d, isOpenX = %d\n", + index, tItems[index].desp, tItems[index].frame_count, isOpenX); + + if (tItems[index].frame_count <= 0) { + ILI_ERR("Frame count is zero, which is at least set as 1\n"); + tItems[index].frame_count = 1; + } + + open = kzalloc(tItems[index].frame_count * sizeof(struct mp_test_open_c), GFP_KERNEL); + if (ERR_ALLOC_MEM(open)) { + ILI_ERR("Failed to allocate open mem (%ld)\n", PTR_ERR(open)); + ret = -EMP_NOMEM; + goto out; + } + + if (create_mp_test_frame_buffer(index, tItems[index].frame_count) < 0) { + ret = -EMP_NOMEM; + goto out; + } + + if (isOpenX) { + if (openx_cap_dac == NULL) { + openx_cap_dac = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(openx_cap_dac)) { + ILI_ERR("Failed to allocate cap_dac buffer\n"); + return -EMP_NOMEM; + } + } else { + memset(openx_cap_dac, 0x0, core_mp.frame_len); + } + + if (openx_cap_raw == NULL) { + openx_cap_raw = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(openx_cap_raw)) { + ILI_ERR("Failed to allocate cap_raw buffer\n"); + ipio_kfree((void **)&openx_cap_dac); + return -EMP_NOMEM; + } + } else { + memset(openx_cap_raw, 0x0, core_mp.frame_len); + } + } else { + if (cap_dac == NULL) { + cap_dac = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(cap_dac)) { + ILI_ERR("Failed to allocate cap_dac buffer\n"); + return -EMP_NOMEM; + } + } else { + memset(cap_dac, 0x0, core_mp.frame_len); + } + + if (cap_raw == NULL) { + cap_raw = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(cap_raw)) { + ILI_ERR("Failed to allocate cap_raw buffer\n"); + ipio_kfree((void **)&cap_dac); + return -EMP_NOMEM; + } + } else { + memset(cap_raw, 0x0, core_mp.frame_len); + } + } + + /* Init Max/Min buffer */ + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + tItems[index].max_buf[y * core_mp.xch_len + x] = INT_MIN; + tItems[index].min_buf[y * core_mp.xch_len + x] = INT_MAX; + } + } + + if (tItems[index].spec_option == BENCHMARK) { + parser_ini_benchmark(tItems[index].bench_mark_max, tItems[index].bench_mark_min, + tItems[index].type_option, tItems[index].desp, core_mp.frame_len, BENCHMARK_KEY_NAME); + dump_benchmark_data(tItems[index].bench_mark_max, tItems[index].bench_mark_min); + } + + parser_get_int_data(tItems[index].desp, "gain", str, sizeof(str)); + open_para.gain = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "tvch", str, sizeof(str)); + open_para.tvch = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "tvcl", str, sizeof(str)); + open_para.tvcl = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "cbk_step", str, sizeof(str)); + open_para.cbk_step = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "cint", str, sizeof(str)); + open_para.cint = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "vbk", str, sizeof(str)); + open_para.invbk = ili_katoi(str); + + parser_get_int_data(tItems[index].desp, "vadc_range", str, sizeof(str)); + open_para.vadc_range = ili_katoi(str); + + /* 9881N, 9881O, 7807Q, 7807S not support cbk_step and cint read from mp.ini */ + if ((pid != 0x988117) && (pid != 0x988118) && (pid != 0x78071A) && (pid != 0x78071C)) { + if ((open_para.cbk_step == 0) || (open_para.cint == 0)) { + ILI_ERR("Failed to get open parameter"); + ret = -EMP_PARA_NULL; + core_mp.lost_parameter = true; + goto out; + } + } + + ILI_INFO("gain = %d, tvch = %d, tvcl = %d, cbk_step = %d, cint = %d\n", open_para.gain, open_para.tvch, open_para.tvcl, open_para.cbk_step, open_para.cint); + for (i = 0; i < tItems[index].frame_count; i++) { + open[i].cap_dac = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].cap_raw = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + open[i].dcl_cap = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + } + + for (i = 0; i < tItems[index].frame_count; i++) { + if (isOpenX) { + ret = allnode_open_cdc_data(6, open[i].cap_dac, index); + if (ret < 0) { + ILI_ERR("Failed to get Open_X CAP DAC data, %d\n", ret); + goto out; + } + ret = allnode_open_cdc_data(7, open[i].cap_raw, index); + if (ret < 0) { + ILI_ERR("Failed to get Open_X CAP RAW data, %d\n", ret); + goto out; + } + } else { + ret = allnode_open_cdc_data(4, open[i].cap_dac, index); + if (ret < 0) { + ILI_ERR("Failed to get Open CAP DAC data, %d\n", ret); + goto out; + } + ret = allnode_open_cdc_data(5, open[i].cap_raw, index); + if (ret < 0) { + ILI_ERR("Failed to get Open CAP RAW data, %d\n", ret); + goto out; + } + } + + allnode_open_cdc_result(index, open[i].dcl_cap, open[i].cap_dac, open[i].cap_raw); + + /* record fist frame for debug */ + if (i == 0) { + if (isOpenX) { + ipio_memcpy(openx_cap_dac, open[i].cap_dac, core_mp.frame_len * sizeof(s32), core_mp.frame_len * sizeof(s32)); + ipio_memcpy(openx_cap_raw, open[i].cap_raw, core_mp.frame_len * sizeof(s32), core_mp.frame_len * sizeof(s32)); + } else { + ipio_memcpy(cap_dac, open[i].cap_dac, core_mp.frame_len * sizeof(s32), core_mp.frame_len * sizeof(s32)); + ipio_memcpy(cap_raw, open[i].cap_raw, core_mp.frame_len * sizeof(s32), core_mp.frame_len * sizeof(s32)); + } + } + + ili_dump_data(open[i].dcl_cap, 10, core_mp.frame_len, core_mp.xch_len, "DCL_Cap"); + + addr = 0; + for (y = 0; y < core_mp.ych_len; y++) { + for (x = 0; x < core_mp.xch_len; x++) { + tItems[index].buf[(i * core_mp.frame_len) + addr] = open[i].dcl_cap[addr]; + addr++; + } + } + compare_MaxMin_result(index, &tItems[index].buf[i * core_mp.frame_len]); + } + +out: + if (open != NULL) { + for (i = 0; i < tItems[index].frame_count; i++) { + ipio_kfree((void **)&open[i].cap_dac); + ipio_kfree((void **)&open[i].cap_raw); + ipio_kfree((void **)&open[i].dcl_cap); + } + kfree(open); + open = NULL; + } + + return ret; +} + +static int key_test(int index) +{ + int i, j = 0, ret = 0; + + ILI_DBG("Item = %s, Frame Count = %d\n", + tItems[index].desp, tItems[index].frame_count); + + if (tItems[index].frame_count == 0) { + ILI_ERR("Frame count is zero, which at least sets as 1\n"); + ret = -EINVAL; + goto out; + } + + ret = create_mp_test_frame_buffer(index, tItems[index].frame_count); + if (ret < 0) + goto out; + + for (i = 0; i < tItems[index].frame_count; i++) { + ret = allnode_key_cdc_data(index); + if (ret < 0) { + ILI_ERR("Failed to initialise CDC data, %d\n", ret); + goto out; + } + + for (j = 0; j < core_mp.key_len; j++) + tItems[index].buf[j] = key_buf[j]; + } + + compare_MaxMin_result(index, tItems[index].buf); + +out: + return ret; +} + +static int self_test(int index) +{ + ILI_ERR("TDDI has no self to be tested currently\n"); + return -1; +} + +static int st_test(int index) +{ + ILI_ERR("ST Test is not supported by the driver\n"); + return -1; +} + +int ili_parsing_sram_param(void) +{ + char str[100] = {0}; + int i, ret = 0; + + memset(&ilits->sram_para, 0x0, sizeof(ilits->sram_para)); + + if (ini_info == NULL) { + ini_info = (struct ini_file_data *)vmalloc(sizeof(struct ini_file_data) * PARSER_MAX_KEY_NUM); + if (ERR_ALLOC_MEM(ini_info)) { + ILI_ERR("Failed to malloc ini_info\n"); + ret = -EMP_NOMEM; + goto out; + } + } + + ret = ilitek_tddi_mp_ini_parser(ilits->md_ini_path); + if (ret < 0) { + ILI_ERR("Failed to parsing INI file\n"); + ret = -EMP_INI; + goto out; + } + + parser_get_int_data("sram test", "free run tpu clock enable", str, sizeof(str)); + ilits->sram_para.tpu_clock_en = ili_katoi(str); + + ret = parser_get_int_data("sram test", "sram group enable", str, sizeof(str)); + ilits->sram_para.sram_group_en = ili_katoi(str); + + if (ret <= 0) { + ILI_ERR("Mp ini not support sram test, Please update tool version.\n"); + goto out; + } + + parser_get_int_data("sram test", "check fail bus enable", str, sizeof(str)); + ilits->sram_para.check_failbus = ili_katoi(str); + + parser_get_int_data("sram test", "max addr", str, sizeof(str)); + parser_get_u32_array(str, &ilits->sram_para.MaxAddr, 16, sizeof(ilits->sram_para.MaxAddr)); + + parser_get_int_data("sram test", "min addr", str, sizeof(str)); + parser_get_u32_array(str, &ilits->sram_para.MinAddr, 16, sizeof(ilits->sram_para.MinAddr)); + + ILI_INFO("Free Run TPU Clock EN : %s, Sram Group EN : %s, Check Fail Bus EN : %s\n", ilits->sram_para.tpu_clock_en ? "ENABLE" : "DISABLE", ilits->sram_para.sram_group_en ? "ENABLE" : "DISABLE", ilits->sram_para.check_failbus ? "ENABLE" : "DISABLE"); + ILI_INFO("MaxAddr = 0x%X, MinAddr = 0x%X\n", ilits->sram_para.MaxAddr, ilits->sram_para.MinAddr); + + if (ilits->sram_para.sram_group_en == ENABLE) { + parser_get_int_data("sram test", "sram group", str, sizeof(str)); + ilits->sram_para.group_num = parser_sramtest_group(str, ilits->sram_para.strSramPartialArea); + + parser_get_int_data("sram test", "group write addr", str, sizeof(str)); + parser_get_u32_array(str, &ilits->sram_para.write_addr, 16, sizeof(ilits->sram_para.write_addr)); + + parser_get_int_data("sram test", "group write", str, sizeof(str)); + parser_get_u32_array(str, ilits->sram_para.SramPartialAreaTest_en, 16, sizeof(ilits->sram_para.SramPartialAreaTest_en)); + + parser_get_int_data("sram test", "group read addr", str, sizeof(str)); + parser_get_u32_array(str, &ilits->sram_para.read_addr, 16, sizeof(ilits->sram_para.read_addr)); + + parser_get_int_data("sram test", "group result", str, sizeof(str)); + parser_get_u32_array(str, ilits->sram_para.SramResult, 16, sizeof(ilits->sram_para.SramResult)); + + ILI_INFO("Group Number : %d, Write Addr = 0x%X, Read Addr = 0x%X\n", ilits->sram_para.group_num, ilits->sram_para.write_addr, ilits->sram_para.read_addr); + + for( i = 0; i < ilits->sram_para.group_num; i++) { + ILI_INFO("Sram Partial Area : %s, Sram Partial Area Test en = 0x%X, Sram Result = 0x%X\n", ilits->sram_para.strSramPartialArea[i], ilits->sram_para.SramPartialAreaTest_en[i], ilits->sram_para.SramResult[i]); + } + } + +out: + ipio_vfree((void **)&ini_info); + return ret; +} + +static int mp_get_timing_info(void) +{ + int slen = 0; + char str[256] = {0}; + u8 info[64] = {0}; + char *key = "timing_info_raw"; + + core_mp.isLongV = 0; + + slen = parser_get_int_data("pv5_4 command", key, str, sizeof(str)); + if (slen < 0) + return -1; + + if (parser_get_u8_array(str, info, 16, slen) < 0) + return -1; + + core_mp.isLongV = info[6]; + + ILI_INFO("DDI Mode = %s\n", (core_mp.isLongV ? "Long V" : "Long H")); + + return 0; +} + +static int mp_test_data_sort_average(s32 *oringin_data, int index, s32 *avg_result) +{ + int i, j, k, x, y, len = 5, size; + s32 u32temp; + int u32up_frame, u32down_frame; + s32 *u32sum_raw_data = NULL; + s32 *u32data_buff = NULL; + int ret = 0; + + if (tItems[index].frame_count <= 1) { + ret = 0; + goto out; + } + + if (ERR_ALLOC_MEM(oringin_data)) { + ILI_ERR("Input wrong address\n"); + ret = -ENOMEM; + goto out; + } + + u32data_buff = kcalloc(core_mp.frame_len * tItems[index].frame_count, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(u32data_buff)) { + ILI_ERR("Failed to allocate u32data_buff FRAME buffer\n"); + ret = -ENOMEM; + goto out; + } + + u32sum_raw_data = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(u32data_buff)) { + ILI_ERR("Failed to allocate u32sum_raw_data FRAME buffer\n"); + ret = -ENOMEM; + goto out; + } + + size = core_mp.frame_len * tItems[index].frame_count; + for (i = 0; i < size; i++) { + u32data_buff[i] = oringin_data[i]; + } + + u32up_frame = tItems[index].frame_count * tItems[index].highest_percentage / 100; + u32down_frame = tItems[index].frame_count * tItems[index].lowest_percentage / 100; + ILI_DBG("Up=%d, Down=%d -%s\n", u32up_frame, u32down_frame, tItems[index].desp); + + if (debug_en) { + pr_cont("\n[Show Original frist%d and last%d node data]\n", len, len); + for (i = 0; i < core_mp.frame_len; i++) { + for (j = 0 ; j < tItems[index].frame_count ; j++) { + if ((i < len) || (i >= (core_mp.frame_len-len))) + pr_cont("%d,", u32data_buff[j * core_mp.frame_len + i]); + } + if ((i < len) || (i >= (core_mp.frame_len-len))) + pr_cont("\n"); + } + } + + for (i = 0; i < core_mp.frame_len; i++) { + for (j = 0; j < tItems[index].frame_count-1; j++) { + for (k = 0; k < (tItems[index].frame_count-1-j); k++) { + x = i+k*core_mp.frame_len; + y = i+(k+1)*core_mp.frame_len; + if (*(u32data_buff+x) > *(u32data_buff+y)) { + u32temp = *(u32data_buff+x); + *(u32data_buff+x) = *(u32data_buff+y); + *(u32data_buff+y) = u32temp; + } + } + } + } + + if (debug_en) { + pr_cont("\n[After sorting frist%d and last%d node data]\n", len, len); + for (i = 0; i < core_mp.frame_len; i++) { + for (j = u32down_frame; j < tItems[index].frame_count - u32up_frame; j++) { + if ((i < len) || (i >= (core_mp.frame_len - len))) + pr_cont("%d,", u32data_buff[i + j * core_mp.frame_len]); + } + if ((i < len) || (i >= (core_mp.frame_len-len))) + pr_cont("\n"); + } + } + + for (i = 0 ; i < core_mp.frame_len ; i++) { + u32sum_raw_data[i] = 0; + for (j = u32down_frame; j < tItems[index].frame_count - u32up_frame; j++) + u32sum_raw_data[i] += u32data_buff[i + j * core_mp.frame_len]; + + avg_result[i] = u32sum_raw_data[i] / (tItems[index].frame_count - u32down_frame - u32up_frame); + } + + if (debug_en) { + pr_cont("\n[Average result frist%d and last%d node data]\n", len, len); + for (i = 0; i < core_mp.frame_len; i++) { + if ((i < len) || (i >= (core_mp.frame_len-len))) + pr_cont("%d,", avg_result[i]); + } + if ((i < len) || (i >= (core_mp.frame_len-len))) + pr_cont("\n"); + } + +out: + ipio_kfree((void **)&u32data_buff); + ipio_kfree((void **)&u32sum_raw_data); + return ret; +} + +static void mp_compare_cdc_result(int index, s32 *tmp, s32 *max_ts, s32 *min_ts, int *result) +{ + int i, cdclen; + + if (tItems[index].catalog == TIPRING_RAW || tItems[index].catalog == TIPRING_P2P) + cdclen = core_mp.tipring_len; + else + cdclen = core_mp.frame_len; + + if (ERR_ALLOC_MEM(tmp)) { + ILI_ERR("The data of test item is null (%p)\n", tmp); + *result = MP_DATA_FAIL; + return; + } + + if (tItems[index].catalog == SHORT_TEST) { + for (i = 0; i < core_mp.frame_len; i++) { + if (tmp[i] < min_ts[i]) { + *result = MP_DATA_FAIL; + return; + } + } + } else { + for (i = 0; i < cdclen; i++) { + if (tmp[i] > max_ts[i] || tmp[i] < min_ts[i]) { + ILI_DBG("Fail No.%d: max=%d, val=%d, min=%d\n", i, max_ts[i], tmp[i], min_ts[i]); + *result = MP_DATA_FAIL; + return; + } + } + } +} + +static int mp_compare_test_result(int index) +{ + int i, test_result = MP_DATA_PASS, cdclen; + s32 *max_threshold = NULL, *min_threshold = NULL; + + if (tItems[index].catalog == PIN_TEST) + return tItems[index].item_result; + + max_threshold = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(max_threshold)) { + ILI_ERR("Failed to allocate threshold FRAME buffer\n"); + test_result = MP_DATA_FAIL; + goto out; + } + + min_threshold = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(min_threshold)) { + ILI_ERR("Failed to allocate threshold FRAME buffer\n"); + test_result = MP_DATA_FAIL; + goto out; + } + + if (tItems[index].catalog == TIPRING_RAW) + cdclen = core_mp.tipring_len; + else + cdclen = core_mp.frame_len; + + /* Show test result as below */ + if (tItems[index].catalog == TX_RX_DELTA) { + if (ERR_ALLOC_MEM(core_mp.rx_delta_buf) || ERR_ALLOC_MEM(core_mp.tx_delta_buf)) { + ILI_ERR("This test item (%s) has no data inside its buffer\n", tItems[index].desp); + test_result = MP_DATA_FAIL; + goto out; + } + + for (i = 0; i < core_mp.frame_len; i++) { + max_threshold[i] = core_mp.TxDeltaMax; + min_threshold[i] = core_mp.TxDeltaMin; + } + mp_compare_cdc_result(index, core_mp.tx_max_buf, max_threshold, min_threshold, &test_result); + mp_compare_cdc_result(index, core_mp.tx_min_buf, max_threshold, min_threshold, &test_result); + + for (i = 0; i < core_mp.frame_len; i++) { + max_threshold[i] = core_mp.RxDeltaMax; + min_threshold[i] = core_mp.RxDeltaMin; + } + + mp_compare_cdc_result(index, core_mp.rx_max_buf, max_threshold, min_threshold, &test_result); + mp_compare_cdc_result(index, core_mp.rx_min_buf, max_threshold, min_threshold, &test_result); + } else { + if (ERR_ALLOC_MEM(tItems[index].buf) || ERR_ALLOC_MEM(tItems[index].max_buf) || + ERR_ALLOC_MEM(tItems[index].min_buf) || ERR_ALLOC_MEM(tItems[index].result_buf)) { + ILI_ERR("This test item (%s) has no data inside its buffer\n", tItems[index].desp); + test_result = MP_DATA_FAIL; + goto out; + } + + if (tItems[index].spec_option == BENCHMARK) { + if (tItems[index].catalog == PEAK_TO_PEAK_TEST || tItems[index].catalog == TIPRING_P2P) { + for (i = 0; i < cdclen; i++) { + max_threshold[i] = tItems[index].bch_mrk_max[0][i]; + min_threshold[i] = tItems[index].bch_mrk_min[0][i]; + } + } else { + for (i = 0; i < cdclen; i++) { + max_threshold[i] = tItems[index].bench_mark_max[i]; + min_threshold[i] = tItems[index].bench_mark_min[i]; + } + } + } else { + if (tItems[index].catalog == TIPRING_RAW || tItems[index].catalog == TIPRING_P2P) { + for (i = 0; i < core_mp.nPxRaw_tipring_len; i++) { + max_threshold[i] = tItems[index].max1; + min_threshold[i] = tItems[index].min1; + } + for (i = core_mp.nPxRaw_tipring_len; i < core_mp.tipring_len; i++) { + max_threshold[i] = tItems[index].max2; + min_threshold[i] = tItems[index].min2; + } + } else { + for (i = 0; i < cdclen; i++) { + max_threshold[i] = tItems[index].max; + min_threshold[i] = tItems[index].min; + } + } + } + + /* general result */ + if (tItems[index].trimmed_mean && tItems[index].catalog != PEAK_TO_PEAK_TEST) { + mp_test_data_sort_average(tItems[index].buf, index, tItems[index].result_buf); + mp_compare_cdc_result(index, tItems[index].result_buf, max_threshold, min_threshold, &test_result); + } else { + if (tItems[index].bch_mrk_multi) { + for (i = 0; i < tItems[index].bch_mrk_frm_num; i++) { + mp_compare_cdc_result(index, frm_buf[i], tItems[index].bch_mrk_max[i], tItems[index].bch_mrk_min[i], &test_result); + } + } else { + mp_compare_cdc_result(index, tItems[index].max_buf, max_threshold, min_threshold, &test_result); + mp_compare_cdc_result(index, tItems[index].min_buf, max_threshold, min_threshold, &test_result); + } + } + } + +out: + ipio_kfree((void **)&max_threshold); + ipio_kfree((void **)&min_threshold); + if (frm_buf != NULL) { + for (i = 0; i < tItems[index].bch_mrk_frm_num; i++) + if (frm_buf[i] != NULL) { + kfree(frm_buf[i]); + frm_buf[i] = NULL; + } + kfree(frm_buf); + frm_buf = NULL; + } + if (ilits->eng_flow == true) { + test_result = MP_DATA_PASS; + } + tItems[index].item_result = test_result; + return test_result; +} + +static void mp_do_retry(int index, int count) +{ + if (count == 0) { + ILI_INFO("Finish retry action\n"); + return; + } + + ILI_INFO("retry = %d, item = %s\n", count, tItems[index].desp); + + tItems[index].do_test(index); + + if (mp_compare_test_result(index) < 0) + return mp_do_retry(index, count - 1); +} + +static int mp_show_result(bool lcm_on) +{ + int ret = MP_DATA_PASS, seq; + int i, x, y, j, csv_len = 0, pass_item_count = 0, line_count = 0, get_frame_cont = 1; + s32 *max_threshold = NULL, *min_threshold = NULL; + char *csv = NULL; + char *ret_pass_name = NULL, *ret_fail_name = NULL; +#if (!GENERIC_KERNEL_IMAGE) + struct file *f = NULL; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t fs; +#endif + loff_t pos; +#endif + csv = vmalloc(CSV_FILE_SIZE); + if (ERR_ALLOC_MEM(csv)) { + ILI_ERR("Failed to allocate CSV mem\n"); + ret = -EMP_NOMEM; + goto fail_open; + } + + max_threshold = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + min_threshold = kcalloc(core_mp.frame_len, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(max_threshold) || ERR_ALLOC_MEM(min_threshold)) { + ILI_ERR("Failed to allocate threshold FRAME buffer\n"); + ret = -EMP_NOMEM; + goto fail_open; + } + + if (parser_get_ini_key_value("pv5_4 command", "date", core_mp.ini_date) < 0) + ipio_memcpy(core_mp.ini_date, "Unknown", strlen("Unknown"), strlen("Unknown")); + if (parser_get_ini_key_value("pv5_4 command", "version", core_mp.ini_ver) < 0) + ipio_memcpy(core_mp.ini_ver, "Unknown", strlen("Unknown"), strlen("Unknown")); + + mp_print_csv_header(csv, &csv_len, &line_count, CSV_FILE_SIZE); + + for (seq = 0; seq < ri.count; seq++) { + i = ri.index[seq]; + get_frame_cont = 1; + + if (tItems[i].item_result == MP_DATA_PASS) { + pr_info("\n[%s],OK \n\n", tItems[i].desp); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "\n[%s],OK\n\n", tItems[i].desp); + } else { + pr_info("\n[%s],NG \n\n", tItems[i].desp); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "\n[%s],NG\n\n", tItems[i].desp); + } + + if (tItems[i].catalog == PIN_TEST) { + pr_info("Test INT Pin = %d\n", tItems[i].test_int_pin); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Test INT Pin = %d\n", tItems[i].test_int_pin); + pr_info("Pulse Test = %d\n", tItems[i].int_pulse_test); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Pulse Test = %d\n", tItems[i].int_pulse_test); + pr_info("Delay Time = %d\n", tItems[i].delay_time); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Delay Time = %d\n", tItems[i].delay_time); + continue; + } + + mp_print_csv_cdc_cmd(csv, &csv_len, i, CSV_FILE_SIZE); + + pr_info("Frame count = %d\n", tItems[i].frame_count); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Frame count = %d\n", tItems[i].frame_count); + + if (tItems[i].trimmed_mean && tItems[i].catalog != PEAK_TO_PEAK_TEST) { + pr_info("lowest percentage = %d\n", tItems[i].lowest_percentage); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "lowest percentage = %d\n", tItems[i].lowest_percentage); + + pr_info("highest percentage = %d\n", tItems[i].highest_percentage); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "highest percentage = %d\n", tItems[i].highest_percentage); + } + + /* Show result of benchmark max and min */ + if (tItems[i].spec_option == BENCHMARK) { + if (tItems[i].catalog == PEAK_TO_PEAK_TEST) { + for (j = 0; j < core_mp.frame_len; j++) { + max_threshold[j] = tItems[i].bch_mrk_max[0][j]; + min_threshold[j] = tItems[i].bch_mrk_min[0][j]; + } + + for (j = 0; j < tItems[i].bch_mrk_frm_num; j++) { + char bench_name[128] = {0}; + snprintf(bench_name, (CSV_FILE_SIZE - csv_len), "Max_Bench%d", (j+1)); + mp_compare_cdc_show_result(i, tItems[i].bch_mrk_max[j], csv, &csv_len, TYPE_BENCHMARK, max_threshold, min_threshold, bench_name, CSV_FILE_SIZE); + snprintf(bench_name, (CSV_FILE_SIZE - csv_len), "Min_Bench%d", (j+1)); + mp_compare_cdc_show_result(i, tItems[i].bch_mrk_min[j], csv, &csv_len, TYPE_BENCHMARK, max_threshold, min_threshold, bench_name, CSV_FILE_SIZE); + } + } else if (tItems[i].catalog == TIPRING_RAW) { + for (j = 0; j < core_mp.tipring_len; j++) { + max_threshold[j] = tItems[i].bench_mark_max[j]; + min_threshold[j] = tItems[i].bench_mark_min[j]; + } + mp_compare_tip_ring_cdc_show_result(i, tItems[i].bench_mark_max, csv, &csv_len, TYPE_BENCHMARK, max_threshold, min_threshold, "Max_Bench1", CSV_FILE_SIZE, TIPRING_X); + mp_compare_tip_ring_cdc_show_result(i, tItems[i].bench_mark_min, csv, &csv_len, TYPE_BENCHMARK, max_threshold, min_threshold, "Min_Bench1", CSV_FILE_SIZE, TIPRING_X); + mp_compare_tip_ring_cdc_show_result(i, tItems[i].bench_mark_max, csv, &csv_len, TYPE_BENCHMARK, max_threshold, min_threshold, "Max_Bench2", CSV_FILE_SIZE, TIPRING_Y); + mp_compare_tip_ring_cdc_show_result(i, tItems[i].bench_mark_min, csv, &csv_len, TYPE_BENCHMARK, max_threshold, min_threshold, "Min_Bench2", CSV_FILE_SIZE, TIPRING_Y); + } else if (tItems[i].catalog == TIPRING_P2P) { + for (j = 0; j < core_mp.frame_len; j++) { + max_threshold[j] = tItems[i].bch_mrk_max[0][j]; + min_threshold[j] = tItems[i].bch_mrk_min[0][j]; + } + + for (j = 0; j < tItems[i].bch_mrk_frm_num; j++) { + mp_compare_tip_ring_cdc_show_result(i, tItems[i].bch_mrk_max[j], csv, &csv_len, TYPE_BENCHMARK, + max_threshold, min_threshold, get_csv_frame_name("Max_Bench", j + 1), CSV_FILE_SIZE, TIPRING_X); + mp_compare_tip_ring_cdc_show_result(i, tItems[i].bch_mrk_min[j], csv, &csv_len, TYPE_BENCHMARK, + max_threshold, min_threshold, get_csv_frame_name("Min_Bench", j + 1), CSV_FILE_SIZE, TIPRING_X); + } + + for (j = 0; j < tItems[i].bch_mrk_frm_num; j++) { + mp_compare_tip_ring_cdc_show_result(i, tItems[i].bch_mrk_max[j], csv, &csv_len, TYPE_BENCHMARK, + max_threshold, min_threshold, get_csv_frame_name("Max_Bench", tItems[i].bch_mrk_frm_num + j + 1), CSV_FILE_SIZE, TIPRING_Y); + mp_compare_tip_ring_cdc_show_result(i, tItems[i].bch_mrk_min[j], csv, &csv_len, TYPE_BENCHMARK, + max_threshold, min_threshold, get_csv_frame_name("Min_Bench", tItems[i].bch_mrk_frm_num + j + 1), CSV_FILE_SIZE, TIPRING_Y); + } + } else { + for (j = 0; j < core_mp.frame_len; j++) { + max_threshold[j] = tItems[i].bench_mark_max[j]; + min_threshold[j] = tItems[i].bench_mark_min[j]; + } + mp_compare_cdc_show_result(i, tItems[i].bench_mark_max, csv, &csv_len, TYPE_BENCHMARK, max_threshold, min_threshold, "Max_Bench", CSV_FILE_SIZE); + mp_compare_cdc_show_result(i, tItems[i].bench_mark_min, csv, &csv_len, TYPE_BENCHMARK, max_threshold, min_threshold, "Min_Bench", CSV_FILE_SIZE); + } + } else { + if (tItems[i].catalog == TIPRING_RAW || tItems[i].catalog == TIPRING_P2P) { + for (j = 0; j < core_mp.nPxRaw_tipring_len; j++) { + max_threshold[j] = tItems[i].max1; + min_threshold[j] = tItems[i].min1; + } + for (j = core_mp.nPxRaw_tipring_len; j < core_mp.tipring_len; j++) { + max_threshold[j] = tItems[i].max2; + min_threshold[j] = tItems[i].min2; + } + + pr_info("Max1 = %d\n", tItems[i].max1); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Max1 = %d\n", tItems[i].max1); + + pr_info("Max2 = %d\n", tItems[i].max2); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Max2 = %d\n", tItems[i].max2); + + pr_info("Min1 = %d\n", tItems[i].min1); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Min1 = %d\n", tItems[i].min1); + + pr_info("Min2 = %d\n", tItems[i].min2); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Min2 = %d\n", tItems[i].min2); + } else { + for (j = 0; j < core_mp.frame_len; j++) { + max_threshold[j] = tItems[i].max; + min_threshold[j] = tItems[i].min; + } + + pr_info("Max = %d\n", tItems[i].max); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Max = %d\n", tItems[i].max); + + pr_info("Min = %d\n", tItems[i].min); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "Min = %d\n", tItems[i].min); + } + } + + if (ipio_strcmp(tItems[i].desp, "open test(integration)_sp") == 0) { + mp_compare_cdc_show_result(i, frame1_cbk700, csv, &csv_len, TYPE_NO_JUGE, max_threshold, min_threshold, "frame1 cbk700", CSV_FILE_SIZE); + mp_compare_cdc_show_result(i, frame1_cbk250, csv, &csv_len, TYPE_NO_JUGE, max_threshold, min_threshold, "frame1 cbk250", CSV_FILE_SIZE); + mp_compare_cdc_show_result(i, frame1_cbk200, csv, &csv_len, TYPE_NO_JUGE, max_threshold, min_threshold, "frame1 cbk200", CSV_FILE_SIZE); + } + + if (ipio_strcmp(tItems[i].desp, "open test_c") == 0) { + mp_compare_cdc_show_result(i, cap_dac, csv, &csv_len, TYPE_NO_JUGE, max_threshold, min_threshold, "CAP_DAC", CSV_FILE_SIZE); + mp_compare_cdc_show_result(i, cap_raw, csv, &csv_len, TYPE_NO_JUGE, max_threshold, min_threshold, "CAP_RAW", CSV_FILE_SIZE); + } + + if (ipio_strcmp(tItems[i].desp, "open test_c (openx enable)") == 0) { + mp_compare_cdc_show_result(i, openx_cap_dac, csv, &csv_len, TYPE_NO_JUGE, max_threshold, min_threshold, "CAP_DAC", CSV_FILE_SIZE); + mp_compare_cdc_show_result(i, openx_cap_raw, csv, &csv_len, TYPE_NO_JUGE, max_threshold, min_threshold, "CAP_RAW", CSV_FILE_SIZE); + } + + if (tItems[i].catalog == TX_RX_DELTA) { + if (ERR_ALLOC_MEM(core_mp.rx_delta_buf) || ERR_ALLOC_MEM(core_mp.tx_delta_buf)) { + ILI_ERR("This test item (%s) has no data inside its buffer\n", tItems[i].desp); + continue; + } + } else { + if (ERR_ALLOC_MEM(tItems[i].buf) || ERR_ALLOC_MEM(tItems[i].max_buf) || + ERR_ALLOC_MEM(tItems[i].min_buf)) { + ILI_ERR("This test item (%s) has no data inside its buffer\n", tItems[i].desp); + continue; + } + } + + /* Show test result as below */ + if (tItems[i].catalog == KEY_TEST) { + for (x = 0; x < core_mp.key_len; x++) { + DUMP("KEY_%02d ", x); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "KEY_%02d,", x); + } + + DUMP("\n"); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "\n"); + + for (y = 0; y < core_mp.key_len; y++) { + DUMP(" %3d ", tItems[i].buf[y]); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), " %3d, ", tItems[i].buf[y]); + } + + DUMP("\n"); + csv_len += snprintf(csv + csv_len, (CSV_FILE_SIZE - csv_len), "\n"); + } else if (tItems[i].catalog == TX_RX_DELTA) { + for (j = 0; j < core_mp.frame_len; j++) { + max_threshold[j] = core_mp.TxDeltaMax; + min_threshold[j] = core_mp.TxDeltaMin; + } + mp_compare_cdc_show_result(i, core_mp.tx_max_buf, csv, &csv_len, TYPE_JUGE, max_threshold, min_threshold, "TX Max Hold", CSV_FILE_SIZE); + mp_compare_cdc_show_result(i, core_mp.tx_min_buf, csv, &csv_len, TYPE_JUGE, max_threshold, min_threshold, "TX Min Hold", CSV_FILE_SIZE); + + for (j = 0; j < core_mp.frame_len; j++) { + max_threshold[j] = core_mp.RxDeltaMax; + min_threshold[j] = core_mp.RxDeltaMin; + } + mp_compare_cdc_show_result(i, core_mp.rx_max_buf, csv, &csv_len, TYPE_JUGE, max_threshold, min_threshold, "RX Max Hold", CSV_FILE_SIZE); + mp_compare_cdc_show_result(i, core_mp.rx_min_buf, csv, &csv_len, TYPE_JUGE, max_threshold, min_threshold, "RX Min Hold", CSV_FILE_SIZE); + } else if (tItems[i].catalog == TIPRING_RAW || tItems[i].catalog == TIPRING_P2P) { + if (tItems[i].catalog == TIPRING_RAW) + get_frame_cont = tItems[i].frame_count; + + if (tItems[i].catalog == TIPRING_P2P) + get_frame_cont = tItems[i].bch_mrk_frm_num; + + for (j = 0; j < get_frame_cont; j++) { + mp_compare_tip_ring_cdc_show_result(i,&tItems[i].buf[(j * core_mp.tipring_len)], csv, &csv_len, TYPE_NO_JUGE, + max_threshold, min_threshold, get_csv_frame_name("Frame ", j + 1), CSV_FILE_SIZE, TIPRING_X); + } + for (j = 0; j < get_frame_cont; j++) { + mp_compare_tip_ring_cdc_show_result(i,&tItems[i].buf[(j * core_mp.tipring_len)], csv, &csv_len, TYPE_NO_JUGE, + max_threshold, min_threshold, get_csv_frame_name("Frame ", get_frame_cont + j + 1), CSV_FILE_SIZE, TIPRING_Y); + } + } else { + /* general result */ + if (tItems[i].trimmed_mean && tItems[i].catalog != PEAK_TO_PEAK_TEST) { + mp_compare_cdc_show_result(i, tItems[i].result_buf, csv, &csv_len, TYPE_JUGE, max_threshold, min_threshold, "Mean result", CSV_FILE_SIZE); + } else { + if (!tItems[i].bch_mrk_multi) { + mp_compare_cdc_show_result(i, tItems[i].max_buf, csv, &csv_len, TYPE_JUGE, max_threshold, min_threshold, "Max Hold", CSV_FILE_SIZE); + mp_compare_cdc_show_result(i, tItems[i].min_buf, csv, &csv_len, TYPE_JUGE, max_threshold, min_threshold, "Min Hold", CSV_FILE_SIZE); + } + + } + if (tItems[i].catalog != PEAK_TO_PEAK_TEST) + get_frame_cont = tItems[i].frame_count; + + if (tItems[i].bch_mrk_multi) + get_frame_cont = tItems[i].bch_mrk_frm_num; + + /* result of each frame */ + for (j = 0; j < get_frame_cont; j++) { + mp_compare_cdc_show_result(i, &tItems[i].buf[(j*core_mp.frame_len)], csv, &csv_len, TYPE_NO_JUGE, max_threshold, min_threshold, get_csv_frame_name("Frame ", j + 1), CSV_FILE_SIZE); + } + } + } + + memset(csv_name, 0, 128 * sizeof(char)); + + mp_print_csv_tail(csv, &csv_len, CSV_FILE_SIZE); + + for (i = 0; i < MP_TEST_ITEM; i++) { + if (tItems[i].run) { + if (tItems[i].item_result < 0) { + pass_item_count = 0; + break; + } + pass_item_count++; + } + } + + /* define csv file name */ + ret_pass_name = NORMAL_CSV_PASS_NAME; + ret_fail_name = NORMAL_CSV_FAIL_NAME; + + if (pass_item_count == 0) { + core_mp.final_result = MP_DATA_FAIL; + ret = MP_DATA_FAIL; + + if (core_mp.lost_parameter) { + ret_fail_name = NULL; + ret_fail_name = NORMAL_CSV_WARNING_NAME; + ILI_ERR("WARNING! OPEN or SHORT parameter not found in ini file!!\n"); + } + + if (lcm_on) { +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + snprintf(csv_name, (CSV_FILE_SIZE - csv_len), "%s/%s_%s.csv", CSV_LCM_ON_PATH, get_date_time_str(), ret_fail_name); +#else + snprintf(csv_name, (CSV_FILE_SIZE - csv_len), "%s/lcm_on_%s_%s.csv", CSV_LCM_DEF_PATH, get_date_time_str(), ret_fail_name); +#endif + } else { +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + snprintf(csv_name, (CSV_FILE_SIZE - csv_len), "%s/%s_%s.csv", CSV_LCM_OFF_PATH, get_date_time_str(), ret_fail_name); +#else + snprintf(csv_name, (CSV_FILE_SIZE - csv_len), "%s/lcm_off_%s_%s.csv", CSV_LCM_DEF_PATH, get_date_time_str(), ret_fail_name); +#endif + } + } else { + core_mp.final_result = MP_DATA_PASS; + ret = MP_DATA_PASS; + + if (core_mp.lost_benchmark) { + ret_pass_name = NULL; + ret_pass_name = NORMAL_CSV_WARNING_NAME; + ILI_ERR("WARNING! Golden and SPEC in ini file aren't matched!!\n"); + } + + if (lcm_on) { +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + snprintf(csv_name, (CSV_FILE_SIZE - csv_len), "%s/%s_%s.csv", CSV_LCM_ON_PATH, get_date_time_str(), ret_pass_name); +#else + snprintf(csv_name, (CSV_FILE_SIZE - csv_len), "%s/lcm_on_%s_%s.csv", CSV_LCM_DEF_PATH, get_date_time_str(), ret_pass_name); +#endif + } else { +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + snprintf(csv_name, (CSV_FILE_SIZE - csv_len), "%s/%s_%s.csv", CSV_LCM_OFF_PATH, get_date_time_str(), ret_pass_name); +#else + snprintf(csv_name, (CSV_FILE_SIZE - csv_len), "%s/lcm_off_%s_%s.csv", CSV_LCM_DEF_PATH, get_date_time_str(), ret_pass_name); +#endif + } + } + +#if GENERIC_KERNEL_IMAGE + ILI_ERR("GKI version not allow drivers to use filp_open\n"); + if (ilits->mp_result == NULL) { + ilits->mp_result = vmalloc(CSV_FILE_SIZE); + if (ERR_ALLOC_MEM(ilits->mp_result)) { + ILI_ERR("Failed to allocate ilits->mp_result mem\n"); + ret = -EMP_NOMEM; + goto fail_open; + } + } + + memset(ilits->mp_result, 0, CSV_FILE_SIZE); + ipio_memcpy(ilits->mp_result, csv, csv_len, strlen(csv)); +#else + ILI_INFO("Open CSV : %s\n", csv_name); + if (f == NULL) + f = filp_open(csv_name, O_WRONLY | O_CREAT | O_TRUNC, 644); + + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open CSV file"); + ret = -EMP_NOMEM; + goto fail_open; + } + + ILI_INFO("Open CSV succeed, its length = %d\n ", csv_len); + + if (csv_len >= CSV_FILE_SIZE) { + ILI_ERR("The length saved to CSV is too long !\n"); + ret = -EMP_INVAL; + goto fail_open; + } + + pos = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + fs = get_fs(); + set_fs(KERNEL_DS); + vfs_write(f, csv, csv_len, &pos); + set_fs(fs); +#else + kernel_write(f, csv, csv_len, &pos); +#endif + filp_close(f, NULL); + + ILI_INFO("Writing Data into CSV succeed\n"); +#endif + +fail_open: + ipio_vfree((void **)&csv); + ipio_kfree((void **)&max_threshold); + ipio_kfree((void **)&min_threshold); + return ret; +} + +static void ilitek_tddi_mp_init_item(void) +{ + int i = 0; + + memset(&core_mp, 0, sizeof(core_mp)); + memset(&open_para, 0, sizeof(open_para)); + memset(&short_para, 0, sizeof(short_para)); + + core_mp.chip_pid = ilits->chip->pid; + core_mp.chip_id = ilits->chip->id; + core_mp.chip_type = ilits->chip->type; + core_mp.chip_ver = ilits->chip->ver; + core_mp.fw_ver = ilits->chip->fw_ver; + core_mp.protocol_ver = ilits->protocol->ver; + core_mp.core_ver = ilits->chip->core_ver; + core_mp.cdc_len = ilits->protocol->cdc_len; + core_mp.no_bk_shift = ilits->chip->no_bk_shift; + core_mp.xch_len = ilits->xch_num; + core_mp.ych_len = ilits->ych_num; + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + core_mp.nPxRaw = ilits->pen_info_block.nPxRaw; + core_mp.nPyRaw = ilits->pen_info_block.nPyRaw; + core_mp.nPxRaw_tipring_len = 2 * core_mp.nPxRaw * core_mp.xch_len; + core_mp.nPyRaw_tipring_len = 2 * core_mp.nPyRaw * core_mp.ych_len; + core_mp.tipring_len = core_mp.nPxRaw_tipring_len + core_mp.nPyRaw_tipring_len; + } + + core_mp.frame_len = core_mp.xch_len * core_mp.ych_len; + core_mp.stx_len = 0; + core_mp.srx_len = 0; + core_mp.key_len = 0; + core_mp.st_len = 0; + core_mp.tdf = 240; + core_mp.busy_cdc = INT_CHECK; + core_mp.retry = ilits->mp_retry; + core_mp.td_retry = false; + core_mp.final_result = MP_DATA_FAIL; + core_mp.lost_benchmark = false; + core_mp.lost_parameter = false; + core_mp.pre_cmd_sp = false; + + ILI_INFO("============== TP & Panel info ================\n"); + ILI_INFO("Driver version = %s\n", DRIVER_VERSION); + ILI_INFO("TP Module = %s\n", ilits->md_name); + ILI_INFO("CHIP = 0x%x\n", core_mp.chip_pid); + ILI_INFO("Firmware version = %x\n", core_mp.fw_ver); + ILI_INFO("Protocol version = %x\n", core_mp.protocol_ver); + ILI_INFO("Core version = %x\n", core_mp.core_ver); + ILI_INFO("Read CDC Length = %d\n", core_mp.cdc_len); + ILI_INFO("X length = %d, Y length = %d\n", core_mp.xch_len, core_mp.ych_len); + ILI_INFO("Frame length = %d\n", core_mp.frame_len); + + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ILI_INFO("nPxRaw = %d,nPyRaw = %d\n", core_mp.nPxRaw, core_mp.nPyRaw); + ILI_INFO("Tip Ring length = %d, nPxRaw buffer length = %d, nPyRaw buffer length = %d\n" + , core_mp.tipring_len, core_mp.nPxRaw_tipring_len, core_mp.nPyRaw_tipring_len); + } + + ILI_INFO("Check busy method = %s\n", (core_mp.busy_cdc ? "Polling" : "Interrupt")); + ILI_INFO("===============================================\n"); + + for (i = 0; i < MP_TEST_ITEM; i++) { + tItems[i].spec_option = 0; + tItems[i].type_option = 0; + tItems[i].run = false; + tItems[i].max = 0; + tItems[i].max1 = 0; + tItems[i].max2 = 0; + tItems[i].max_res = MP_DATA_FAIL; + tItems[i].item_result = MP_DATA_PASS; + tItems[i].min = 0; + tItems[i].min1 = 0; + tItems[i].min2 = 0; + tItems[i].min_res = MP_DATA_FAIL; + tItems[i].frame_count = 0; + tItems[i].trimmed_mean = 0; + tItems[i].lowest_percentage = 0; + tItems[i].highest_percentage = 0; + tItems[i].v_tdf_1 = 0; + tItems[i].v_tdf_2 = 0; + tItems[i].h_tdf_1 = 0; + tItems[i].h_tdf_2 = 0; + tItems[i].max_min_mode = 0; + tItems[i].bch_mrk_multi = false; + tItems[i].bch_mrk_frm_num = 1; + tItems[i].goldenmode = 0; + tItems[i].retry_cnt = RETRY_COUNT; + tItems[i].result_buf = NULL; + tItems[i].buf = NULL; + tItems[i].max_buf = NULL; + tItems[i].min_buf = NULL; + tItems[i].bench_mark_max = NULL; + tItems[i].bench_mark_min = NULL; + tItems[i].bch_mrk_max = NULL; + tItems[i].bch_mrk_min = NULL; + tItems[i].node_type = NULL; + tItems[i].delay_time = 0; + tItems[i].test_int_pin = 0; + tItems[i].int_pulse_test = 0; + tItems[i].pre_cmd_en = DISABLE; + + if (tItems[i].catalog == MUTUAL_TEST) { + tItems[i].do_test = mutual_test; + } else if (tItems[i].catalog == TX_RX_DELTA) { + tItems[i].do_test = mutual_test; + } else if (tItems[i].catalog == UNTOUCH_P2P) { + tItems[i].do_test = mutual_test; + } else if (tItems[i].catalog == PIXEL) { + tItems[i].do_test = mutual_test; + } else if (tItems[i].catalog == OPEN_TEST) { + if (ipio_strcmp(tItems[i].desp, "open test(integration)_sp") == 0) + tItems[i].do_test = open_test_sp; + else if (ipio_strcmp(tItems[i].desp, "open test_c") == 0) + tItems[i].do_test = open_test_cap; + else if (ipio_strcmp(tItems[i].desp, "open test_c (openx enable)") == 0) + tItems[i].do_test = open_test_cap; + else + tItems[i].do_test = mutual_test; + } else if (tItems[i].catalog == KEY_TEST) { + tItems[i].do_test = key_test; + } else if (tItems[i].catalog == SELF_TEST) { + tItems[i].do_test = self_test; + } else if (tItems[i].catalog == ST_TEST) { + tItems[i].do_test = st_test; + } else if (tItems[i].catalog == PEAK_TO_PEAK_TEST) { + tItems[i].do_test = peak_to_peak_test; + } else if (tItems[i].catalog == SHORT_TEST) { + tItems[i].do_test = mutual_test; + } else if (tItems[i].catalog == PIN_TEST) { + tItems[i].do_test = pin_test; + } else if (tItems[i].catalog == TIPRING_RAW) { + tItems[i].do_test = mutual_test; + } else if (tItems[i].catalog == TIPRING_P2P) { + tItems[i].do_test = peak_to_peak_test; + } + + tItems[i].result = kmalloc(16, GFP_KERNEL); + snprintf(tItems[i].result, 16, "%s", "FAIL"); + } +} + +static void ilitek_tddi_fw_mp_precmd_support(void) +{ + int ret = 0; + u8 cmd[2] = {0}; + u8 buftmp[3] = {0}; + + core_mp.pre_cmd_sp = false; + + if (core_mp.core_ver < CORE_VER_1600) { + ILI_INFO("FW no support MP pre command\n"); + core_mp.pre_cmd_sp = false; + return; + } + + cmd[0] = CMD_FW_MP_PRE_CMD; + cmd[1] = 0x02; + + ret = ilits->wrapper(cmd, 2, buftmp, 3, ON, OFF); + if (ret < 0) + ILI_ERR("check FW pre command failed\n"); + + if (buftmp[2] == 0xAA) + core_mp.pre_cmd_sp = true; + + ILI_INFO("FW support MP Pre-Command : %s\n", core_mp.pre_cmd_sp ? "ENABLE" : "DISABLE"); + +} + +static void mp_p2p_td_retry_after_ra_fail(int p2p_td) +{ + int i; + + for (i = 0; i < MP_TEST_ITEM; i++) { + if (ipio_strcmp(tItems[i].desp, "noise peak to peak(with panel) (lcm off)") == 0) + break; + } + + if (i >= MP_TEST_ITEM) + return; + + ILI_DBG("i = %d, p2p_noise_ret = %d, p2p_noise_run = %d\n", + i, tItems[i].item_result, tItems[i].run); + + if (tItems[i].item_result == MP_DATA_PASS && tItems[i].run == 1) + tItems[p2p_td].do_test(p2p_td); +} + +static void mp_test_run(int index) +{ + int i = index, j; + char str[512] = {0}; + + + /* Get parameters from ini */ + parser_get_int_data(tItems[i].desp, "spec option", str, sizeof(str)); + tItems[i].spec_option = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "type option", str, sizeof(str)); + tItems[i].type_option = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "frame count", str, sizeof(str)); + tItems[i].frame_count = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "trimmed mean", str, sizeof(str)); + tItems[i].trimmed_mean = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "lowest percentage", str, sizeof(str)); + tItems[i].lowest_percentage = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "highest percentage", str, sizeof(str)); + tItems[i].highest_percentage = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "goldenmode", str, sizeof(str)); + tItems[i].goldenmode = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "max min mode", str, sizeof(str)); + tItems[i].max_min_mode = ili_katoi(str); + + parser_get_int_data(tItems[i].desp, "retry count", str, sizeof(str)); + tItems[i].retry_cnt = ili_katoi(str); + + if (tItems[i].goldenmode && (tItems[i].spec_option != tItems[i].goldenmode)) + core_mp.lost_benchmark = true; + + if (core_mp.pre_cmd_sp) { + parser_get_int_data(tItems[i].desp, "precommand", str, sizeof(str)); + tItems[i].pre_cmd_en = ili_katoi(str); + } + + /* Get pin test delay time */ + if (tItems[i].catalog == PIN_TEST) { + parser_get_int_data(tItems[i].desp, "test int pin", str, sizeof(str)); + tItems[i].test_int_pin = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "int pulse test", str, sizeof(str)); + tItems[i].int_pulse_test = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "delay time", str, sizeof(str)); + tItems[i].delay_time = ili_katoi(str); + } + + /* Get TDF value from ini */ + if (tItems[i].catalog == SHORT_TEST) { + parser_get_int_data(tItems[i].desp, "v_tdf_1", str, sizeof(str)); + tItems[i].v_tdf_1 = parser_get_tdf_value(str, tItems[i].catalog); + parser_get_int_data(tItems[i].desp, "v_tdf_2", str, sizeof(str)); + tItems[i].v_tdf_2 = parser_get_tdf_value(str, tItems[i].catalog); + parser_get_int_data(tItems[i].desp, "h_tdf_1", str, sizeof(str)); + tItems[i].h_tdf_1 = parser_get_tdf_value(str, tItems[i].catalog); + parser_get_int_data(tItems[i].desp, "h_tdf_2", str, sizeof(str)); + tItems[i].h_tdf_2 = parser_get_tdf_value(str, tItems[i].catalog); + } else { + parser_get_int_data(tItems[i].desp, "v_tdf", str, sizeof(str)); + tItems[i].v_tdf_1 = parser_get_tdf_value(str, tItems[i].catalog); + parser_get_int_data(tItems[i].desp, "h_tdf", str, sizeof(str)); + tItems[i].h_tdf_1 = parser_get_tdf_value(str, tItems[i].catalog); + } + + /* Get threshold from ini structure in parser */ + if (ipio_strcmp(tItems[i].desp, "tx/rx delta") == 0) { + parser_get_int_data(tItems[i].desp, "tx max", str, sizeof(str)); + core_mp.TxDeltaMax = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "tx min", str, sizeof(str)); + core_mp.TxDeltaMin = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "rx max", str, sizeof(str)); + core_mp.RxDeltaMax = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "rx min", str, sizeof(str)); + core_mp.RxDeltaMin = ili_katoi(str); + ILI_DBG("%s: Tx Max = %d, Tx Min = %d, Rx Max = %d, Rx Min = %d\n", + tItems[i].desp, core_mp.TxDeltaMax, core_mp.TxDeltaMin, + core_mp.RxDeltaMax, core_mp.RxDeltaMin); + } else { + parser_get_int_data(tItems[i].desp, "max", str, sizeof(str)); + tItems[i].max = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "min", str, sizeof(str)); + tItems[i].min = ili_katoi(str); + } + + if (tItems[i].catalog == TIPRING_RAW || tItems[i].catalog == TIPRING_P2P) { + parser_get_int_data(tItems[i].desp, "max1", str, sizeof(str)); + tItems[i].max1 = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "max2", str, sizeof(str)); + tItems[i].max2 = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "min1", str, sizeof(str)); + tItems[i].min1 = ili_katoi(str); + parser_get_int_data(tItems[i].desp, "min2", str, sizeof(str)); + tItems[i].min2 = ili_katoi(str); + } + + /* Get pin test delay time */ + if (tItems[i].catalog == PEAK_TO_PEAK_TEST) { + if (tItems[i].max_min_mode == 1 && tItems[i].spec_option == 1) { + tItems[i].bch_mrk_multi = true; + for (j = 1; j < 11; j++) { + char tmp[8] = {0}; + /* format complete string from the name of section "_Benchmark_Data". */ + snprintf(str, sizeof(str), "%s%s%s%d", tItems[index].desp, "_", BENCHMARK_KEY_NAME, j); + if (parser_get_int_data(str, str, tmp, sizeof(tmp)) <= 0) + break; + + tItems[i].bch_mrk_frm_num = j; + } + ILI_DBG("set bch_mrk_frm_num = %d\n", tItems[i].bch_mrk_frm_num); + } + } + + if (tItems[i].catalog == TIPRING_P2P && tItems[i].max_min_mode == 1) { + tItems[i].bch_mrk_frm_num = 3; + tItems[i].bch_mrk_multi = true; + ILI_DBG("set bch_mrk_frm_num = %d\n", tItems[i].bch_mrk_frm_num); + } + + ILI_DBG("%s: run = %d, max = %d, min = %d, frame_count = %d\n", tItems[i].desp, + tItems[i].run, tItems[i].max, tItems[i].min, tItems[i].frame_count); + + ILI_DBG("v_tdf_1 = %d, v_tdf_2 = %d, h_tdf_1 = %d, h_tdf_2 = %d", tItems[i].v_tdf_1, + tItems[i].v_tdf_2, tItems[i].h_tdf_1, tItems[i].h_tdf_2); + + if (tItems[i].catalog == TIPRING_RAW || tItems[i].catalog == TIPRING_P2P) + ILI_DBG("max1 = %d, max2 = %d, min1 = %d, min2 = %d\n", tItems[i].max1, tItems[i].max2, tItems[i].min1, tItems[i].min2); + + ILI_INFO("Run MP Test Item : %s\n", tItems[i].desp); + tItems[i].do_test(i); + + mp_compare_test_result(i); + + /* P2P TD retry after RA sample failed. */ + if (ipio_strcmp(tItems[i].desp, "peak to peak_td (lcm off)") == 0 && + tItems[i].item_result == MP_DATA_FAIL) { + parser_get_int_data(tItems[i].desp, "recheck ptop lcm off", str, sizeof(str)); + ILI_INFO("Peak to Peak TD retry = %d\n", ili_katoi(str)); + core_mp.td_retry = ili_katoi(str); + if (core_mp.td_retry) + mp_p2p_td_retry_after_ra_fail(i); + } + + if (core_mp.retry && tItems[i].item_result == MP_DATA_FAIL) { + ILI_INFO("MP failed, doing retry %d times\n", tItems[i].retry_cnt); + mp_do_retry(i, tItems[i].retry_cnt); + } + +} + +static void mp_test_free(void) +{ + int i, j; + + ILI_INFO("Free all allocated mem for MP\n"); + + core_mp.final_result = MP_DATA_FAIL; + core_mp.td_retry = false; + + for (i = 0; i < MP_TEST_ITEM; i++) { + tItems[i].run = false; + tItems[i].max_res = MP_DATA_FAIL; + tItems[i].min_res = MP_DATA_FAIL; + tItems[i].item_result = MP_DATA_PASS; + + if (tItems[i].catalog == TX_RX_DELTA) { + ipio_kfree((void **)&core_mp.rx_delta_buf); + ipio_kfree((void **)&core_mp.tx_delta_buf); + ipio_kfree((void **)&core_mp.tx_max_buf); + ipio_kfree((void **)&core_mp.tx_min_buf); + ipio_kfree((void **)&core_mp.rx_max_buf); + ipio_kfree((void **)&core_mp.rx_min_buf); + } else { + if (tItems[i].spec_option == BENCHMARK) { + ipio_kfree((void **)&tItems[i].bench_mark_max); + ipio_kfree((void **)&tItems[i].bench_mark_min); + if (tItems[i].bch_mrk_max != NULL) { + for (j = 0; j < tItems[i].bch_mrk_frm_num; j++) + if (tItems[i].bch_mrk_max[j] != NULL) { + kfree(tItems[i].bch_mrk_max[j]); + tItems[i].bch_mrk_max[j] = NULL; + } + kfree(tItems[i].bch_mrk_max); + tItems[i].bch_mrk_max = NULL; + } + if (tItems[i].bch_mrk_min != NULL) { + for (j = 0; j < tItems[i].bch_mrk_frm_num; j++) + if (tItems[i].bch_mrk_min[j] != NULL) { + kfree(tItems[i].bch_mrk_min[j]); + tItems[i].bch_mrk_min[j] = NULL; + } + kfree(tItems[i].bch_mrk_min); + tItems[i].bch_mrk_min = NULL; + } + } + ipio_kfree((void **)&tItems[i].node_type); + ipio_kfree((void **)&tItems[i].result); + ipio_kfree((void **)&tItems[i].result_buf); + ipio_kfree((void **)&tItems[i].max_buf); + ipio_kfree((void **)&tItems[i].min_buf); + ipio_vfree((void **)&tItems[i].buf); + } + } + + ipio_kfree((void **)&frame1_cbk700); + ipio_kfree((void **)&frame1_cbk250); + ipio_kfree((void **)&frame1_cbk200); + ipio_kfree((void **)&frame_buf); + ipio_kfree((void **)&key_buf); + ipio_kfree((void **)&cap_dac); + ipio_kfree((void **)&cap_raw); + ipio_kfree((void **)&openx_cap_dac); + ipio_kfree((void **)&openx_cap_raw); + if (frm_buf != NULL) { + for (j = 0; j < 3; j++) + if (frm_buf[j] != NULL) { + kfree(frm_buf[j]); + frm_buf[j] = NULL; + } + kfree(frm_buf); + frm_buf = NULL; + } +} + +/* The method to copy results to user depends on what APK needs */ +static void mp_copy_ret_to_apk(char *buf) +{ + int i, seq, len = 2; + + if (!buf) { + ILI_ERR("apk buffer is null\n"); + return; + } +#if !GENERIC_KERNEL_IMAGE + len += snprintf(buf + len, PAGE_SIZE - len, "CSV path: %s\n\n", csv_name); +#endif + for (seq = 0; seq < ri.count; seq++) { + i = ri.index[seq]; + if (tItems[i].item_result == MP_DATA_FAIL) { + ILI_ERR("[%s] = FAIL\n", tItems[i].desp); + len += snprintf(buf + len, PAGE_SIZE - len, "[%s] = FAIL\n", tItems[i].desp); + } else { + ILI_INFO("[%s] = PASS\n", tItems[i].desp); + len += snprintf(buf + len, PAGE_SIZE - len, "[%s] = PASS\n", tItems[i].desp); + } + } + ilits->mp_ret_len = len; +} + +static int mp_sort_item(bool lcm_on) +{ + int i, j; + char str[128] = {0}; + + ri.count = 0; + memset(ri.index, 0x0, sizeof(ri.index)); + + for (i = 0; i < MAX_SECTION_NUM; i++) { + for (j = 0; j < MP_TEST_ITEM; j++) { + if (ipio_strcmp(seq_item[i], tItems[j].desp) != 0) + continue; + + parser_get_int_data(tItems[j].desp, "enable", str, sizeof(str)); + tItems[j].run = ili_katoi(str); + if (tItems[j].run != 1 || tItems[j].lcm != lcm_on) + continue; + + if (ri.count > MP_TEST_ITEM) { + ILI_ERR("Test item(%d) is invaild, abort\n", ri.count); + return -EINVAL; + } + + ri.index[ri.count] = j; + ri.count++; + } + } + return 0; +} + +int ili_mp_test_main(char *apk, bool lcm_on) +{ + int i, ret = 0; + char str[8] = {0}, ver[8] = {0}; + + if (ilits->xch_num <= 0 || ilits->ych_num <= 0) { + ILI_ERR("Invalid frame length (%d, %d)\n", ilits->xch_num, ilits->ych_num); + ret = -EMP_INVAL; + goto out; + } + + if (ini_info == NULL) { + ini_info = (struct ini_file_data *)vmalloc(sizeof(struct ini_file_data) * PARSER_MAX_KEY_NUM); + if (ERR_ALLOC_MEM(ini_info)) { + ILI_ERR("Failed to malloc ini_info\n"); + ret = -EMP_NOMEM; + goto out; + } + } + + ilitek_tddi_mp_init_item(); + + ilitek_tddi_fw_mp_precmd_support(); + + ret = ilitek_tddi_mp_ini_parser(ilits->md_ini_path); + if (ret < 0) { + ILI_ERR("Failed to parsing INI file\n"); + ret = -EMP_INI; + goto out; + } + + /* Compare both protocol version of ini and firmware */ + parser_get_ini_key_value("pv5_4 command", "protocol", str); + snprintf(ver, sizeof(ver), "0x%s", str); + ILI_INFO("str = 0x%s, ver = %s\n", str, ver); + if ((ili_str2hex(ver)) != (core_mp.protocol_ver >> 8)) { + ILI_ERR("ERROR! MP Protocol version is invaild, 0x%x\n", ili_str2hex(ver)); + ret = -EMP_PROTOCOL; + goto out; + } + + /* Read timing info from ini file */ + if (mp_get_timing_info() < 0) { + ILI_ERR("Failed to get timing info from ini\n"); + ret = -EMP_TIMING_INFO; + goto out; + } + +#if MP_INT_LEVEL + if (ili_ic_int_trigger_ctrl(true) < 0) { + ILI_ERR("Failed to set INT as Level trigger"); + ret = -EMP_CMD; + goto out; + } +#endif + + /* Sort test item by ini file */ + if (mp_sort_item(lcm_on) < 0) { + ILI_ERR("Failed to sort test item\n"); + ret = -EMP_INI; + goto out; + } + + for (i = 0; i < ri.count; i++) + mp_test_run(ri.index[i]); + + ILI_INFO("Test item end\n"); + + ret = mp_show_result(lcm_on); + + mp_copy_ret_to_apk(apk); + +out: + mp_test_free(); + +#if MP_INT_LEVEL + if (ili_ic_int_trigger_ctrl(false) < 0) { + ILI_ERR("Failed to set INT back to pluse trigger"); + ret = -EMP_CMD; + } +#endif + + ipio_vfree((void **)&ini_info); + return ret; +}; diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_mtk.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_mtk.c new file mode 100644 index 000000000000..cd7e83b91985 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_mtk.c @@ -0,0 +1,518 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" +#include "tpd.h" + +#define DTS_INT_GPIO "touch,irq-gpio" +#define DTS_RESET_GPIO "touch,reset-gpio" +#define DTS_OF_NAME "mediatek,cap_touch" +#define MTK_RST_GPIO GTP_RST_PORT +#define MTK_INT_GPIO GTP_INT_PORT + +extern struct tpd_device *tpd; + +void ili_tp_reset(void) +{ + ILI_INFO("edge delay = %d\n", ilits->rst_edge_delay); + + /* Need accurate power sequence, do not change it to msleep */ + tpd_gpio_output(ilits->tp_rst, 1); + mdelay(1); + tpd_gpio_output(ilits->tp_rst, 0); + mdelay(5); + tpd_gpio_output(ilits->tp_rst, 1); + mdelay(ilits->rst_edge_delay); +} + +void ili_input_register(void) +{ + int i; + + ilits->input = tpd->dev; + + if (tpd_dts_data.use_tpd_button) { + for (i = 0; i < tpd_dts_data.tpd_key_num; i++) + input_set_capability(ilits->input, EV_KEY, tpd_dts_data.tpd_key_local[i]); + } + + /* set the supported event type for input device */ + set_bit(EV_ABS, ilits->input->evbit); + set_bit(EV_SYN, ilits->input->evbit); + set_bit(EV_KEY, ilits->input->evbit); + set_bit(BTN_TOUCH, ilits->input->keybit); + set_bit(BTN_TOOL_FINGER, ilits->input->keybit); + set_bit(INPUT_PROP_DIRECT, ilits->input->propbit); + + if (MT_PRESSURE) + input_set_abs_params(ilits->input, ABS_MT_PRESSURE, 0, MAX_PRESSURE, 0, 0); + + if (MT_B_TYPE) { +#if KERNEL_VERSION(3, 7, 0) <= LINUX_VERSION_CODE + input_mt_init_slots(ilits->input, MAX_TOUCH_NUM, INPUT_MT_DIRECT); +#else + input_mt_init_slots(ilits->input, MAX_TOUCH_NUM); +#endif /* LINUX_VERSION_CODE */ + } else { + input_set_abs_params(ilits->input, ABS_MT_TRACKING_ID, 0, MAX_TOUCH_NUM, 0, 0); + } + + input_set_abs_params(ilits->input, ABS_MT_POSITION_X, TOUCH_SCREEN_X_MIN, ilits->panel_wid - 1, 0, 0); + input_set_abs_params(ilits->input, ABS_MT_POSITION_Y, TOUCH_SCREEN_Y_MIN, ilits->panel_hei - 1, 0, 0); + + /* Gesture keys register */ + input_set_capability(ilits->input, EV_KEY, KEY_POWER); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_UP); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_DOWN); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_LEFT); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_RIGHT); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_O); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_E); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_M); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_W); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_S); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_V); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_Z); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_C); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_F); + + __set_bit(KEY_GESTURE_POWER, ilits->input->keybit); + __set_bit(KEY_GESTURE_UP, ilits->input->keybit); + __set_bit(KEY_GESTURE_DOWN, ilits->input->keybit); + __set_bit(KEY_GESTURE_LEFT, ilits->input->keybit); + __set_bit(KEY_GESTURE_RIGHT, ilits->input->keybit); + __set_bit(KEY_GESTURE_O, ilits->input->keybit); + __set_bit(KEY_GESTURE_E, ilits->input->keybit); + __set_bit(KEY_GESTURE_M, ilits->input->keybit); + __set_bit(KEY_GESTURE_W, ilits->input->keybit); + __set_bit(KEY_GESTURE_S, ilits->input->keybit); + __set_bit(KEY_GESTURE_V, ilits->input->keybit); + __set_bit(KEY_GESTURE_Z, ilits->input->keybit); + __set_bit(KEY_GESTURE_C, ilits->input->keybit); + __set_bit(KEY_GESTURE_F, ilits->input->keybit); +} + +void ili_input_pen_register(void) +{ + ilits->input_pen = input_allocate_device(); + if (ERR_ALLOC_MEM(ilits->input_pen)) { + ILI_ERR("Failed to allocate touch input device\n"); + input_free_device(ilits->input_pen); + return; + } + + ilits->input_pen->name = PEN_INPUT_DEVICE; + ilits->input_pen->phys = ilits->phys; + ilits->input_pen->dev.parent = ilits->dev; + ilits->input_pen->id.bustype = ilits->hwif->bus_type; + + /* set the supported event type for input device */ + set_bit(EV_ABS, ilits->input_pen->evbit); + set_bit(EV_SYN, ilits->input_pen->evbit); + set_bit(EV_KEY, ilits->input_pen->evbit); + set_bit(BTN_TOUCH, ilits->input_pen->keybit); + set_bit(BTN_TOOL_PEN, ilits->input_pen->keybit); + set_bit(BTN_STYLUS, ilits->input_pen->keybit); + set_bit(BTN_STYLUS2, ilits->input_pen->keybit); + set_bit(INPUT_PROP_DIRECT, ilits->input_pen->propbit); + + input_set_abs_params(ilits->input_pen, ABS_X, 0, ilits->panel_wid, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_Y, 0, ilits->panel_hei, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_PRESSURE, 0, MAX_PRESSURE, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_TILT_X, -60, 60, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_TILT_Y, -60, 60, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_DISTANCE, 0, 1, 0, 0); + + /* register the input device to input sub-system */ + if (input_register_device(ilits->input_pen) < 0) { + ILI_ERR("Failed to register touch input device\n"); + input_unregister_device(ilits->input_pen); + input_free_device(ilits->input_pen); + } + ILI_INFO("Input Pen device for Single Touch\n"); +} + +#if REGULATOR_POWER +void ili_plat_regulator_power_on(bool status) +{ + ILI_INFO("%s\n", status ? "POWER ON" : "POWER OFF"); + + if (status) { + if (ilits->vdd) { + if (regulator_enable(ilits->vdd) < 0) + ILI_ERR("regulator_enable VDD fail\n"); + } + if (ilits->vcc) { + if (regulator_enable(ilits->vcc) < 0) + ILI_ERR("regulator_enable VCC fail\n"); + } + } else { + if (ilits->vdd) { + if (regulator_disable(ilits->vdd) < 0) + ILI_ERR("regulator_enable VDD fail\n"); + } + if (ilits->vcc) { + if (regulator_disable(ilits->vcc) < 0) + ILI_ERR("regulator_enable VCC fail\n"); + } + } + atomic_set(&ilits->ice_stat, DISABLE); + mdelay(5); +} + +static void ilitek_plat_regulator_power_init(void) +{ + const char *vdd_name = "vdd"; + const char *vcc_name = "vcc"; + + ilits->vdd = regulator_get(tpd->tpd_dev, vdd_name); + if (ERR_ALLOC_MEM(ilits->vdd)) { + ILI_ERR("regulator_get VDD fail\n"); + ilits->vdd = NULL; + } + + tpd->reg = ilits->vdd; + + if (regulator_set_voltage(ilits->vdd, VDD_VOLTAGE, VDD_VOLTAGE) < 0) + ILI_ERR("Failed to set VDD %d\n", VDD_VOLTAGE); + + ilits->vcc = regulator_get(ilits->dev, vcc_name); + if (ERR_ALLOC_MEM(ilits->vcc)) { + ILI_ERR("regulator_get VCC fail.\n"); + ilits->vcc = NULL; + } + if (regulator_set_voltage(ilits->vcc, VCC_VOLTAGE, VCC_VOLTAGE) < 0) + ILI_ERR("Failed to set VCC %d\n", VCC_VOLTAGE); + + ili_plat_regulator_power_on(true); +} +#endif + +static int ilitek_plat_gpio_register(void) +{ + int ret = 0; + + ilits->tp_int = MTK_INT_GPIO; + ilits->tp_rst = MTK_RST_GPIO; + + ILI_INFO("TP INT: %d\n", ilits->tp_int); + ILI_INFO("TP RESET: %d\n", ilits->tp_rst); + + if (!gpio_is_valid(ilits->tp_int)) { + ILI_ERR("Invalid INT gpio: %d\n", ilits->tp_int); + return -EBADR; + } + + if (!gpio_is_valid(ilits->tp_rst)) { + ILI_ERR("Invalid RESET gpio: %d\n", ilits->tp_rst); + return -EBADR; + } + + gpio_direction_input(ilits->tp_int); + return ret; +} + +void ili_irq_disable(void) +{ + unsigned long flag; + + spin_lock_irqsave(&ilits->irq_spin, flag); + + if (atomic_read(&ilits->irq_stat) == DISABLE) + goto out; + + if (!ilits->irq_num) { + ILI_ERR("gpio_to_irq (%d) is incorrect\n", ilits->irq_num); + goto out; + } + + disable_irq_nosync(ilits->irq_num); + atomic_set(&ilits->irq_stat, DISABLE); + ILI_DBG("Disable irq success\n"); + +out: + spin_unlock_irqrestore(&ilits->irq_spin, flag); +} + +void ili_irq_enable(void) +{ + unsigned long flag; + + spin_lock_irqsave(&ilits->irq_spin, flag); + + if (atomic_read(&ilits->irq_stat) == ENABLE) + goto out; + + if (!ilits->irq_num) { + ILI_ERR("gpio_to_irq (%d) is incorrect\n", ilits->irq_num); + goto out; + } + + enable_irq(ilits->irq_num); + atomic_set(&ilits->irq_stat, ENABLE); + ILI_DBG("Enable irq success\n"); + +out: + spin_unlock_irqrestore(&ilits->irq_spin, flag); +} + +static irqreturn_t ilitek_plat_isr_top_half(int irq, void *dev_id) +{ + if (irq != ilits->irq_num) { + ILI_ERR("Incorrect irq number (%d)\n", irq); + return IRQ_NONE; + } + + if (atomic_read(&ilits->cmd_int_check) == ENABLE) { + atomic_set(&ilits->cmd_int_check, DISABLE); + ILI_DBG("CMD INT detected, ignore\n"); + wake_up(&(ilits->inq)); + return IRQ_HANDLED; + } + + if (ilits->prox_near) { + ILI_INFO("Proximity event, ignore interrupt!\n"); + return IRQ_HANDLED; + } + + ILI_DBG("report: %d, rst: %d, fw: %d, switch: %d, mp: %d, sleep: %d, esd: %d, igr:%d\n", + ilits->report, + atomic_read(&ilits->tp_reset), + atomic_read(&ilits->fw_stat), + atomic_read(&ilits->tp_sw_mode), + atomic_read(&ilits->mp_stat), + atomic_read(&ilits->tp_sleep), + atomic_read(&ilits->esd_stat), + atomic_read(&ilits->ignore_report)); + + if (!ilits->report || atomic_read(&ilits->tp_reset) || atomic_read(&ilits->ignore_report) || + atomic_read(&ilits->fw_stat) || atomic_read(&ilits->tp_sw_mode) || + atomic_read(&ilits->mp_stat) || atomic_read(&ilits->tp_sleep) || + atomic_read(&ilits->esd_stat)) { + ILI_DBG("ignore interrupt !\n"); + return IRQ_HANDLED; + } + + return IRQ_WAKE_THREAD; +} + +static irqreturn_t ilitek_plat_isr_bottom_half(int irq, void *dev_id) +{ + if (mutex_is_locked(&ilits->touch_mutex)) { + ILI_DBG("touch is locked, ignore\n"); + return IRQ_HANDLED; + } + mutex_lock(&ilits->touch_mutex); + ili_report_handler(); + mutex_unlock(&ilits->touch_mutex); + return IRQ_HANDLED; +} + +void ili_irq_unregister(void) +{ + devm_free_irq(ilits->dev, ilits->irq_num, NULL); +} + +int ili_irq_register(int type) +{ + int ret = 0; + static bool get_irq_pin; + struct device_node *node; + + atomic_set(&ilits->irq_stat, DISABLE); + + if (get_irq_pin == false) { + node = of_find_matching_node(NULL, touch_of_match); + if (node) + ilits->irq_num = irq_of_parse_and_map(node, 0); + + ILI_INFO("ilits->irq_num = %d\n", ilits->irq_num); + get_irq_pin = true; + } + + ret = devm_request_threaded_irq(ilits->dev, ilits->irq_num, + ilitek_plat_isr_top_half, + ilitek_plat_isr_bottom_half, + type | IRQF_ONESHOT, "ilitek", NULL); + + if (type == IRQF_TRIGGER_FALLING) + ILI_INFO("IRQ TYPE = IRQF_TRIGGER_FALLING\n"); + if (type == IRQF_TRIGGER_RISING) + ILI_INFO("IRQ TYPE = IRQF_TRIGGER_RISING\n"); + + if (ret != 0) + ILI_ERR("Failed to register irq handler, irq = %d, ret = %d\n", ilits->irq_num, ret); + + atomic_set(&ilits->irq_stat, ENABLE); + + return ret; +} + +static void tpd_resume(struct device *h) +{ + if (ili_sleep_handler(TP_RESUME) < 0) + ILI_ERR("TP resume failed\n"); +} + +static void tpd_suspend(struct device *h) +{ + if (ili_sleep_handler(TP_DEEP_SLEEP) < 0) + ILI_ERR("TP suspend failed\n"); +} + +static int ilitek_tp_pm_suspend(struct device *dev) +{ + ILI_INFO("CALL BACK TP PM SUSPEND"); + ilits->pm_suspend = true; + reinit_completion(&ilits->pm_completion); + return 0; +} + +static int ilitek_tp_pm_resume(struct device *dev) +{ + ILI_INFO("CALL BACK TP PM RESUME"); + ilits->pm_suspend = false; + complete(&ilits->pm_completion); + return 0; +} + +static int ilitek_plat_probe(void) +{ + ILI_INFO("platform probe\n"); + +#if REGULATOR_POWER + ilitek_plat_regulator_power_init(); +#endif + + if (ilitek_plat_gpio_register() < 0) + ILI_ERR("Register gpio failed\n"); + + ili_irq_register(ilits->irq_tirgger_type); + + if (ili_tddi_init() < 0) { + ILI_ERR("ILITEK Driver probe failed\n"); + ili_irq_unregister(); + ili_dev_remove(DISABLE); + return -ENODEV; + } + tpd_load_status = 1; + ilits->pm_suspend = false; + init_completion(&ilits->pm_completion); + +#if CHARGER_NOTIFIER_CALLBACK +#if KERNEL_VERSION(4, 1, 0) <= LINUX_VERSION_CODE + /* add_for_charger_start */ + ilitek_plat_charger_init(); + /* add_for_charger_end */ +#endif +#endif + ILI_INFO("ILITEK Driver loaded successfully!#"); + return 0; +} + +static int ilitek_plat_remove(void) +{ + ILI_INFO("remove plat dev\n"); + ili_dev_remove(ENABLE); + return 0; +} + +static const struct dev_pm_ops tp_pm_ops = { + .suspend = ilitek_tp_pm_suspend, + .resume = ilitek_tp_pm_resume, +}; + +static const struct of_device_id tp_match_table[] = { + {.compatible = DTS_OF_NAME}, + {}, +}; + +#ifdef ROI +struct ts_device_ops ilitek_ops = { + .chip_roi_rawdata = ili_knuckle_roi_rawdata, + .chip_roi_switch = ili_knuckle_roi_switch, +}; +#endif + +static struct ilitek_hwif_info hwif = { + .bus_type = TDDI_INTERFACE, + .plat_type = TP_PLAT_MTK, + .owner = THIS_MODULE, + .name = TDDI_DEV_ID, + .of_match_table = of_match_ptr(tp_match_table), + .plat_probe = ilitek_plat_probe, + .plat_remove = ilitek_plat_remove, + .pm = &tp_pm_ops, +}; + +static int tpd_local_init(void) +{ + ILI_INFO("TPD init device driver\n"); + + if (ili_dev_init(&hwif) < 0) { + ILI_ERR("Failed to register i2c/spi bus driver\n"); + return -ENODEV; + } + if (tpd_load_status == 0) { + ILI_ERR("Add error touch panel driver\n"); + return -1; + } + if (tpd_dts_data.use_tpd_button) { + tpd_button_setting(tpd_dts_data.tpd_key_num, tpd_dts_data.tpd_key_local, + tpd_dts_data.tpd_key_dim_local); + } + tpd_type_cap = 1; + return 0; +} + +static struct tpd_driver_t tpd_device_driver = { + .tpd_device_name = TDDI_DEV_ID, + .tpd_local_init = tpd_local_init, + .suspend = tpd_suspend, + .resume = tpd_resume, +}; + +static int __init ilitek_plat_dev_init(void) +{ + int ret = 0; + + ILI_INFO("ILITEK TP driver init for MTK\n"); + tpd_get_dts_info(); + ret = tpd_driver_add(&tpd_device_driver); + if (ret < 0) { + ILI_ERR("ILITEK add TP driver failed\n"); + tpd_driver_remove(&tpd_device_driver); + return -ENODEV; + } + return 0; +} + +static void __exit ilitek_plat_dev_exit(void) +{ + ILI_INFO("ilitek driver has been removed\n"); + tpd_driver_remove(&tpd_device_driver); +} + +module_init(ilitek_plat_dev_init); +module_exit(ilitek_plat_dev_exit); +MODULE_AUTHOR("ILITEK"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_node.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_node.c new file mode 100644 index 000000000000..b636b626215b --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_node.c @@ -0,0 +1,4207 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" + +#if ENABLE_PEN_MODE +#define USER_STR_BUFF (PAGE_SIZE * 2) +#define IOCTL_I2C_BUFF (PAGE_SIZE * 2) +#else +#define USER_STR_BUFF PAGE_SIZE +#define IOCTL_I2C_BUFF PAGE_SIZE +#endif +#define ILITEK_IOCTL_MAGIC 100 +#define ILITEK_IOCTL_MAXNR 38 + +#define ILITEK_IOCTL_I2C_WRITE_DATA _IOWR(ILITEK_IOCTL_MAGIC, 0, u8*) +#define ILITEK_IOCTL_I2C_SET_WRITE_LENGTH _IOWR(ILITEK_IOCTL_MAGIC, 1, int) +#define ILITEK_IOCTL_I2C_READ_DATA _IOWR(ILITEK_IOCTL_MAGIC, 2, u8*) +#define ILITEK_IOCTL_I2C_SET_READ_LENGTH _IOWR(ILITEK_IOCTL_MAGIC, 3, int) + +#define ILITEK_IOCTL_TP_HW_RESET _IOWR(ILITEK_IOCTL_MAGIC, 4, int) +#define ILITEK_IOCTL_TP_POWER_SWITCH _IOWR(ILITEK_IOCTL_MAGIC, 5, int) +#define ILITEK_IOCTL_TP_REPORT_SWITCH _IOWR(ILITEK_IOCTL_MAGIC, 6, int) +#define ILITEK_IOCTL_TP_IRQ_SWITCH _IOWR(ILITEK_IOCTL_MAGIC, 7, int) + +#define ILITEK_IOCTL_TP_DEBUG_LEVEL _IOWR(ILITEK_IOCTL_MAGIC, 8, int) +#define ILITEK_IOCTL_TP_FUNC_MODE _IOWR(ILITEK_IOCTL_MAGIC, 9, int) + +#define ILITEK_IOCTL_TP_FW_VER _IOWR(ILITEK_IOCTL_MAGIC, 10, u8*) +#define ILITEK_IOCTL_TP_PL_VER _IOWR(ILITEK_IOCTL_MAGIC, 11, u8*) +#define ILITEK_IOCTL_TP_CORE_VER _IOWR(ILITEK_IOCTL_MAGIC, 12, u8*) +#define ILITEK_IOCTL_TP_DRV_VER _IOWR(ILITEK_IOCTL_MAGIC, 13, u8*) +#define ILITEK_IOCTL_TP_CHIP_ID _IOWR(ILITEK_IOCTL_MAGIC, 14, u32*) + +#define ILITEK_IOCTL_TP_MODE_CTRL _IOWR(ILITEK_IOCTL_MAGIC, 17, u8*) +#define ILITEK_IOCTL_TP_MODE_STATUS _IOWR(ILITEK_IOCTL_MAGIC, 18, int*) +#define ILITEK_IOCTL_ICE_MODE_SWITCH _IOWR(ILITEK_IOCTL_MAGIC, 19, int) + +#define ILITEK_IOCTL_TP_INTERFACE_TYPE _IOWR(ILITEK_IOCTL_MAGIC, 20, u8*) +#define ILITEK_IOCTL_TP_DUMP_FLASH _IOWR(ILITEK_IOCTL_MAGIC, 21, int) +#define ILITEK_IOCTL_TP_FW_UART_CTRL _IOWR(ILITEK_IOCTL_MAGIC, 22, u8*) +#define ILITEK_IOCTL_TP_PANEL_INFO _IOWR(ILITEK_IOCTL_MAGIC, 23, u32*) +#define ILITEK_IOCTL_TP_INFO _IOWR(ILITEK_IOCTL_MAGIC, 24, u32*) +#define ILITEK_IOCTL_WRAPPER_RW _IOWR(ILITEK_IOCTL_MAGIC, 25, u8*) +#define ILITEK_IOCTL_DDI_WRITE _IOWR(ILITEK_IOCTL_MAGIC, 26, u8*) +#define ILITEK_IOCTL_DDI_READ _IOWR(ILITEK_IOCTL_MAGIC, 27, u8*) +#define ILITEK_IOCTL_REPORT_RATE_SET _IOWR(ILITEK_IOCTL_MAGIC, 28, u8*) +#define ILITEK_IOCTL_REPORT_RATE_GET _IOWR(ILITEK_IOCTL_MAGIC, 29, u8*) +#define ILITEK_IOCTL_MP_LCM_OFF_ENV _IOWR(ILITEK_IOCTL_MAGIC, 30, u8*) +#define ILITEK_IOCTL_RELEASE_TOUCH _IOWR(ILITEK_IOCTL_MAGIC, 31, u8*) +#define ILITEK_IOCTL_LCM_STATUS _IOWR(ILITEK_IOCTL_MAGIC, 32, u8*) +#define ILITEK_IOCTL_SLAVE_CTRL _IOWR(ILITEK_IOCTL_MAGIC, 33, u8*) +#define ILITEK_IOCTL_CASCADE_REG_RW _IOWR(ILITEK_IOCTL_MAGIC, 34, u8*) +#define ILITEK_IOCTL_INTERFACE_GET _IOWR(ILITEK_IOCTL_MAGIC, 35, uint8_t *) +#define ILITEK_IOCTL_ICE_MODE_FLAG_SET _IOWR(ILITEK_IOCTL_MAGIC, 36, uint8_t *) +#define ILITEK_IOCTL_RELEASE_PEN _IOWR(ILITEK_IOCTL_MAGIC, 37, uint8_t *) + +#ifdef CONFIG_COMPAT +#define ILITEK_COMPAT_IOCTL_I2C_WRITE_DATA _IOWR(ILITEK_IOCTL_MAGIC, 0, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_I2C_SET_WRITE_LENGTH _IOWR(ILITEK_IOCTL_MAGIC, 1, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_I2C_READ_DATA _IOWR(ILITEK_IOCTL_MAGIC, 2, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_I2C_SET_READ_LENGTH _IOWR(ILITEK_IOCTL_MAGIC, 3, compat_uptr_t) + +#define ILITEK_COMPAT_IOCTL_TP_HW_RESET _IOWR(ILITEK_IOCTL_MAGIC, 4, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_POWER_SWITCH _IOWR(ILITEK_IOCTL_MAGIC, 5, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_REPORT_SWITCH _IOWR(ILITEK_IOCTL_MAGIC, 6, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_IRQ_SWITCH _IOWR(ILITEK_IOCTL_MAGIC, 7, compat_uptr_t) + +#define ILITEK_COMPAT_IOCTL_TP_DEBUG_LEVEL _IOWR(ILITEK_IOCTL_MAGIC, 8, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_FUNC_MODE _IOWR(ILITEK_IOCTL_MAGIC, 9, compat_uptr_t) + +#define ILITEK_COMPAT_IOCTL_TP_FW_VER _IOWR(ILITEK_IOCTL_MAGIC, 10, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_PL_VER _IOWR(ILITEK_IOCTL_MAGIC, 11, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_CORE_VER _IOWR(ILITEK_IOCTL_MAGIC, 12, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_DRV_VER _IOWR(ILITEK_IOCTL_MAGIC, 13, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_CHIP_ID _IOWR(ILITEK_IOCTL_MAGIC, 14, compat_uptr_t) + +#define ILITEK_COMPAT_IOCTL_TP_MODE_CTRL _IOWR(ILITEK_IOCTL_MAGIC, 17, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_MODE_STATUS _IOWR(ILITEK_IOCTL_MAGIC, 18, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_ICE_MODE_SWITCH _IOWR(ILITEK_IOCTL_MAGIC, 19, compat_uptr_t) + +#define ILITEK_COMPAT_IOCTL_TP_INTERFACE_TYPE _IOWR(ILITEK_IOCTL_MAGIC, 20, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_DUMP_FLASH _IOWR(ILITEK_IOCTL_MAGIC, 21, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_FW_UART_CTRL _IOWR(ILITEK_IOCTL_MAGIC, 22, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_PANEL_INFO _IOWR(ILITEK_IOCTL_MAGIC, 23, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_TP_INFO _IOWR(ILITEK_IOCTL_MAGIC, 24, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_WRAPPER_RW _IOWR(ILITEK_IOCTL_MAGIC, 25, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_DDI_WRITE _IOWR(ILITEK_IOCTL_MAGIC, 26, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_DDI_READ _IOWR(ILITEK_IOCTL_MAGIC, 27, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_REPORT_RATE_SET _IOWR(ILITEK_IOCTL_MAGIC, 28, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_REPORT_RATE_GET _IOWR(ILITEK_IOCTL_MAGIC, 29, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_MP_LCM_OFF_ENV _IOWR(ILITEK_IOCTL_MAGIC, 30, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_RELEASE_TOUCH _IOWR(ILITEK_IOCTL_MAGIC, 31, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_LCM_STATUS _IOWR(ILITEK_IOCTL_MAGIC, 32, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_SLAVE_CTRL _IOWR(ILITEK_IOCTL_MAGIC, 33, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_CASCADE_REG_RW _IOWR(ILITEK_IOCTL_MAGIC, 34, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_INTERFACE_GET _IOWR(ILITEK_IOCTL_MAGIC, 35, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_ICE_MODE_FLAG_SET _IOWR(ILITEK_IOCTL_MAGIC, 36, compat_uptr_t) +#define ILITEK_COMPAT_IOCTL_RELEASE_PEN _IOWR(ILITEK_IOCTL_MAGIC, 37, compat_uptr_t) +#endif + +struct record_state { + u8 touch_palm_state_e : 2; + u8 app_an_statu_e : 3; + u8 app_sys_check_bg_abnormal : 1; + u8 g_b_wrong_bg : 1; +}; + +static unsigned char g_user_buf[USER_STR_BUFF] = {0}; +#define ILI_SPI_NAME "ilitek" +#define ILI_SPI_NAME_PRIMARY "primary" + +static struct class *touchscreen_class; +static struct device *touchscreen_class_dev; + +int ili_str2hex(char *str) +{ + int strlen, result, intermed, intermedtop; + char *s = str; + + while (*s != 0x0) { + s++; + } + + strlen = (int)(s - str); + s = str; + if (*s != 0x30) { + return -1; + } + + s++; + + if (*s != 0x78 && *s != 0x58) { + return -1; + } + s++; + + strlen = strlen - 3; + result = 0; + while (*s != 0x0) { + intermed = *s & 0x0f; + intermedtop = *s & 0xf0; + if (intermedtop == 0x60 || intermedtop == 0x40) { + intermed += 0x09; + } + intermed = intermed << (strlen << 2); + result = result | intermed; + strlen -= 1; + s++; + } + return result; +} + +int ili_katoi(char *str) +{ + int result = 0; + unsigned int digit; + int sign; + + if (*str == '-') { + sign = 1; + str += 1; + } else { + sign = 0; + if (*str == '+') { + str += 1; + } + } + + for (;; str += 1) { + digit = *str - '0'; + if (digit > 9) + break; + result = (10 * result) + digit; + } + + if (sign) { + return -result; + } + return result; +} + +int file_write(struct file_buffer *file, bool new_open) +{ +#if GENERIC_KERNEL_IMAGE + ILI_ERR("GKI version not allow drivers to use filp_open\n"); + return -1; +#else + struct file *f = NULL; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t fs; +#endif + loff_t pos; + + if (file->ptr == NULL) { + ILI_ERR("str is invaild\n"); + return -1; + } + + if (strlen(file->fname) == 0) { + ILI_ERR("file name is invaild\n"); + return -1; + } + + if (file->flen >= file->max_size) { + ILI_ERR("The length saved to file is too long !\n"); + return -1; + } + + if (new_open) + f = filp_open(file->fname, O_WRONLY | O_CREAT | O_TRUNC, 644); + else + f = filp_open(file->fname, O_WRONLY | O_CREAT | O_APPEND, 644); + + if (ERR_ALLOC_MEM(f)) { + ILI_ERR("Failed to open %s file\n", file->fname); + return -1; + } + + pos = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + fs = get_fs(); + set_fs(KERNEL_DS); + vfs_write(f, file->ptr, file->wlen, &pos); + set_fs(fs); +#else + kernel_write(f, file->ptr, file->wlen, &pos); +#endif + filp_close(f, NULL); + return 0; +#endif +} + +static int ilitek_debug_node_buff_control(bool open) +{ + int i, ret; + + ilits->dnp = open; + + ILI_INFO("Debug buf ctrl = %s\n", ilits->dnp ? "Enabled" : "Disabled"); + + if (open) { + ilits->dlnp = DISABLE; + ilits->dbf = 0; + ilits->odi = 0; + if (!ERR_ALLOC_MEM(ilits->dbl)) { + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbl[i].mark = false; + ipio_kfree((void **)&ilits->dbl[i].data); + } + ipio_kfree((void **)&ilits->dbl); + } + + ilits->dbl = kzalloc(TR_BUF_LIST_SIZE * sizeof(*ilits->dbl), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits->dbl)) { + ILI_ERR("Failed to allocate ilits->dbl mem, %ld\n", PTR_ERR(ilits->dbl)); + ret = -ENOMEM; + goto out; + } + + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbl[i].mark = false; + ilits->dbl[i].data = kzalloc(TR_BUF_SIZE * sizeof(unsigned char), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits->dbl[i].data)) { + ILI_ERR("Failed to allocate dbl[%d] mem, %ld\n", i, PTR_ERR(ilits->dbl[i].data)); + ret = -ENOMEM; + goto out; + } + } + ilits->outputStrArr = vmalloc(TR_BUF_SIZE * 2); + return 0; + } +out: + ilits->dnp = DISABLE; + if (!ERR_ALLOC_MEM(ilits->dbl)) { + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbl[i].mark = false; + ipio_kfree((void **)&ilits->dbl[i].data); + } + } + ipio_kfree((void **)&ilits->dbl); + ipio_vfree((void **)&ilits->outputStrArr); + return ret; +} + +static int ilitek_debug_all_node_buff_control(bool open) +{ + int i, ret; + + ilits->dlnp = open; + + ILI_INFO("Debug all buf ctrl = %s\n", ilits->dlnp ? "Enabled" : "Disabled"); + + if (open) { + ilits->dnp = DISABLE; + ilits->dbf = 0; + ilits->odi = 0; + /* ping pong buffer*/ + /* debug buffer A*/ + if (!ERR_ALLOC_MEM(ilits->dbf_a)) { + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbf_a[i].mark = false; + ipio_kfree((void **)&ilits->dbf_a[i].data); + } + ipio_kfree((void **)&ilits->dbf_a); + } + + ilits->dbf_a = kzalloc(TR_BUF_LIST_SIZE * sizeof(*ilits->dbf_a), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits->dbf_a)) { + ILI_ERR("Failed to allocate ilits->dbf_a mem, %ld\n", PTR_ERR(ilits->dbf_a)); + ret = -ENOMEM; + goto out; + } + + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbf_a[i].mark = false; + ilits->dbf_a[i].data = kzalloc(TR_BUF_SIZE * sizeof(unsigned char), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits->dbf_a[i].data)) { + ILI_ERR("Failed to allocate dbl_a[%d] mem, %ld\n", i, PTR_ERR(ilits->dbf_a[i].data)); + ret = -ENOMEM; + goto out; + } + } + + /* debug buffer B */ + if (!ERR_ALLOC_MEM(ilits->dbf_b)) { + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbf_b[i].mark = false; + ipio_kfree((void **)&ilits->dbf_b[i].data); + } + ipio_kfree((void **)&ilits->dbf_b); + } + + ilits->dbf_b = kzalloc(TR_BUF_LIST_SIZE * sizeof(*ilits->dbf_b), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits->dbf_b)) { + ILI_ERR("Failed to allocate ilits->dbf_b mem, %ld\n", PTR_ERR(ilits->dbf_b)); + ret = -ENOMEM; + goto out; + } + + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbf_b[i].mark = false; + ilits->dbf_b[i].data = kzalloc(TR_BUF_SIZE * sizeof(unsigned char), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits->dbf_b[i].data)) { + ILI_ERR("Failed to allocate dbl_b[%d] mem, %ld\n", i, PTR_ERR(ilits->dbf_b[i].data)); + ret = -ENOMEM; + goto out; + } + } + + ilits->dbf_in = ilits->dbf_a; + ilits->dbf_out = ilits->dbf_b; + ilits->dbf_in_idx = 0; + ilits->dbf_out_idx = 0; + ilits->ppb = ON; + + return 0; + } + +out: + ilits->dlnp = DISABLE; + /* free ping pong buffer */ + if (!ERR_ALLOC_MEM(ilits->dbf_a)) { + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbf_a[i].mark = false; + ipio_kfree((void **)&ilits->dbf_a[i].data); + } + } + ipio_kfree((void **)&ilits->dbf_a); + + if (!ERR_ALLOC_MEM(ilits->dbf_b)) { + for (i = 0; i < TR_BUF_LIST_SIZE; i++) { + ilits->dbf_b[i].mark = false; + ipio_kfree((void **)&ilits->dbf_b[i].data); + } + } + ipio_kfree((void **)&ilits->dbf_b); + + return ret; +} + +static int debug_mode_get_data(struct file_buffer *file, u8 type, u32 frame_count) +{ + int ret = 0, cdc_starIdx = 0; + u8 cmd[2] = { 0 }, row, col; + s16 temp; + unsigned char *ptr; + int j; + u16 write_index = 0; + + ilitek_debug_node_buff_control(DISABLE); + + ilits->dbf = 0; + row = ilits->ych_num; + col = ilits->xch_num; + mutex_lock(&ilits->touch_mutex); + + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + cdc_starIdx = P5_X_DEBUG_LOW_RESOLUTION_FINGER_DATA_LENGTH; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + cdc_starIdx = P5_X_DEBUG_HIGH_RESOLUTION_FINGER_DATA_LENGTH; + } + + if (ilits->chip->core_ver < CORE_VER_1700) { + cmd[0] = 0xFA; + cmd[1] = type; + ret = ilits->wrapper(cmd, 2, NULL, 0, ON, OFF); + } + + if (ilitek_debug_node_buff_control(ENABLE) < 0) { + ILI_ERR("Failed to allocate debug buf\n"); + ret = -ENOMEM; + goto out; + } + + mutex_unlock(&ilits->touch_mutex); + + if (ret < 0) { + ILI_ERR("Write 0xFA,0x%x failed\n", type); + goto out; + } + + while (write_index < frame_count) { + file->wlen = 0; + ILI_INFO("frame = %d,index = %d,count = %d\n", write_index, ilits->odi, ilits->dbf); + if (!wait_event_interruptible_timeout(ilits->inq, ilits->dbl[ilits->odi].mark, msecs_to_jiffies(3000))) { + ILI_ERR("debug mode get data timeout!\n"); + goto out; + } + + mutex_lock(&ilits->touch_mutex); + + memset(file->ptr, 0, file->max_size); + file->wlen += snprintf(file->ptr + file->wlen, (file->max_size - file->wlen), "\n\nFrame%d,", write_index); + for (j = 0; j < col; j++) + file->wlen += snprintf(file->ptr + file->wlen, (file->max_size - file->wlen), "[X%d] ,", j); + ptr = &ilits->dbl[ilits->odi].data[cdc_starIdx]; + for (j = 0; j < row * col; j++, ptr += 2) { + temp = (*ptr << 8) + *(ptr + 1); + if (j % col == 0) + file->wlen += snprintf(file->ptr + file->wlen, (file->max_size - file->wlen), "\n[Y%d] ,", (j / col)); + file->wlen += snprintf(file->ptr + file->wlen, (file->max_size - file->wlen), "%d, ", temp); + } + file->wlen += snprintf(file->ptr + file->wlen, (file->max_size - file->wlen), "\n[X] ,"); + for (j = 0; j < row + col; j++, ptr += 2) { + temp = (*ptr << 8) + *(ptr + 1); + if (j == col) + file->wlen += snprintf(file->ptr + file->wlen, (file->max_size - file->wlen), "\n[Y] ,"); + file->wlen += snprintf(file->ptr + file->wlen, (file->max_size - file->wlen), "%d, ", temp); + } + file_write(file, false); + write_index++; + + mutex_unlock(&ilits->touch_mutex); + + ilits->dbl[ilits->odi].mark = false; + ilits->odi = ((ilits->odi + 1) % TR_BUF_LIST_SIZE); + } +out: + ilitek_debug_node_buff_control(DISABLE); + return ret; +} + +static int dev_mkdir(char *name, umode_t mode) +{ + int err = 0; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0) + mm_segment_t fs; + + ILI_INFO("mkdir: %s\n", name); + fs = get_fs(); + set_fs(KERNEL_DS); +#ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER + err = ksys_mkdir(name, mode); +#else + err = sys_mkdir(name, mode); +#endif + set_fs(fs); +#else + err = -1; +#endif + return err; +} + +static ssize_t ilitek_proc_get_delta_data_read(struct file *pFile, char __user *buf, size_t size, loff_t *pos) +{ + s16 *delta = NULL; + int row = 0, col = 0, index = 0; + int ret, i, x, y; + int read_length = 0, len = 0; + u8 cmd[2] = {0}; + u8 *data = NULL; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + ili_wq_ctrl(WQ_ESD, DISABLE); + ili_wq_ctrl(WQ_BAT, DISABLE); + mutex_lock(&ilits->touch_mutex); + + row = ilits->ych_num; + col = ilits->xch_num; + read_length = 4 + 2 * row * col + 1 ; + + ILI_INFO("read length = %d\n", read_length); + + data = kcalloc(read_length + 1, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(data)) { + ILI_ERR("Failed to allocate data mem\n"); + goto out; + } + + delta = kcalloc(P5_X_DEBUG_MODE_PACKET_LENGTH, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(delta)) { + ILI_ERR("Failed to allocate delta mem\n"); + goto out; + } + + cmd[0] = 0xB7; + cmd[1] = 0x1; /* get delta */ + ret = ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Failed to write 0xB7,0x1 command, %d\n", ret); + goto out; + } + + msleep(120); + + /* read debug packet header */ + ret = ilits->wrapper(NULL, 0, data, read_length, OFF, OFF); + if (ret < 0) { + ILI_ERR("Read debug packet header failed, %d\n", ret); + goto out; + } + + cmd[1] = 0x03; /* switch to normal mode */ + ret = ilits->wrapper(cmd, sizeof(cmd), NULL, 0, ON, OFF); + if (ret < 0) { + ILI_ERR("Failed to write 0xB7,0x3 command, %d\n", ret); + goto out; + } + + for (i = 4, index = 0; i < row * col * 2 + 4; i += 2, index++) + delta[index] = (data[i] << 8) + data[i + 1]; + + len = snprintf(g_user_buf, PAGE_SIZE - len, "======== Deltadata ========\n"); + ILI_INFO("======== Deltadata ========\n"); + + len += snprintf(g_user_buf + len, PAGE_SIZE - len, + "Header 0x%x ,Type %d, Length %d\n", data[0], data[1], (data[2] << 8) | data[3]); + ILI_INFO("Header 0x%x ,Type %d, Length %d\n", data[0], data[1], (data[2] << 8) | data[3]); + + /* print delta data */ + for (y = 0; y < row; y++) { + len += snprintf(g_user_buf + len, PAGE_SIZE - len, "[%2d] ", (y+1)); + ILI_INFO("[%2d] ", (y+1)); + + for (x = 0; x < col; x++) { + int shift = y * col + x; + len += snprintf(g_user_buf + len, PAGE_SIZE - len, "%5d", delta[shift]); + printk(KERN_CONT "%5d", delta[shift]); + } + len += snprintf(g_user_buf + len, PAGE_SIZE - len, "\n"); + printk(KERN_CONT "\n"); + } + + if (copy_to_user(buf, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + *pos += len; + +out: + mutex_unlock(&ilits->touch_mutex); + ili_wq_ctrl(WQ_ESD, ENABLE); + ili_wq_ctrl(WQ_BAT, ENABLE); + ipio_kfree((void **)&data); + ipio_kfree((void **)&delta); + return len; +} + +static ssize_t ilitek_proc_fw_get_raw_data_read(struct file *pFile, char __user *buf, size_t size, loff_t *pos) +{ + s16 *rawdata = NULL; + int row = 0, col = 0, index = 0; + int ret, i, x, y; + int read_length = 0, len = 0; + u8 cmd[2] = {0}; + u8 *data = NULL; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + ili_wq_ctrl(WQ_ESD, DISABLE); + ili_wq_ctrl(WQ_BAT, DISABLE); + mutex_lock(&ilits->touch_mutex); + + row = ilits->ych_num; + col = ilits->xch_num; + read_length = 4 + 2 * row * col + 1 ; + + ILI_INFO("read length = %d\n", read_length); + + data = kcalloc(read_length + 1, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(data)) { + ILI_ERR("Failed to allocate data mem\n"); + goto out; + } + + rawdata = kcalloc(P5_X_DEBUG_MODE_PACKET_LENGTH, sizeof(s32), GFP_KERNEL); + if (ERR_ALLOC_MEM(rawdata)) { + ILI_ERR("Failed to allocate rawdata mem\n"); + goto out; + } + + cmd[0] = 0xB7; + cmd[1] = 0x2; /* get rawdata */ + ret = ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Failed to write 0xB7,0x2 command, %d\n", ret); + goto out; + } + + msleep(120); + + /* read debug packet header */ + ret = ilits->wrapper(NULL, 0, data, read_length, OFF, OFF); + if (ret < 0) { + ILI_ERR("Read debug packet header failed, %d\n", ret); + goto out; + } + + cmd[1] = 0x03; /* switch to normal mode */ + ret = ilits->wrapper(cmd, sizeof(cmd), NULL, 0, ON, OFF); + if (ret < 0) { + ILI_ERR("Failed to write 0xB7,0x3 command, %d\n", ret); + goto out; + } + + for (i = 4, index = 0; i < row * col * 2 + 4; i += 2, index++) + rawdata[index] = (data[i] << 8) + data[i + 1]; + + len = snprintf(g_user_buf, PAGE_SIZE, "======== RawData ========\n"); + ILI_INFO("======== RawData ========\n"); + + len += snprintf(g_user_buf + len, PAGE_SIZE - len, + "Header 0x%x ,Type %d, Length %d\n", data[0], data[1], (data[2] << 8) | data[3]); + ILI_INFO("Header 0x%x ,Type %d, Length %d\n", data[0], data[1], (data[2] << 8) | data[3]); + + /* print raw data */ + for (y = 0; y < row; y++) { + len += snprintf(g_user_buf + len, PAGE_SIZE - len, "[%2d] ", (y+1)); + ILI_INFO("[%2d] ", (y+1)); + + for (x = 0; x < col; x++) { + int shift = y * col + x; + len += snprintf(g_user_buf + len, PAGE_SIZE - len, "%5d", rawdata[shift]); + printk(KERN_CONT "%5d", rawdata[shift]); + } + len += snprintf(g_user_buf + len, PAGE_SIZE - len, "\n"); + printk(KERN_CONT "\n"); + } + + if (copy_to_user(buf, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + *pos += len; + +out: + mutex_unlock(&ilits->touch_mutex); + ili_wq_ctrl(WQ_ESD, ENABLE); + ili_wq_ctrl(WQ_BAT, ENABLE); + ipio_kfree((void **)&data); + ipio_kfree((void **)&rawdata); + return len; +} + +static ssize_t ilitek_proc_fw_pc_counter_read(struct file *pFile, char __user *buf, size_t size, loff_t *pos) +{ + int len = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + ili_ic_get_pc_counter(0); + len = snprintf(g_user_buf, PAGE_SIZE, "pc = 0x%x, latch = 0x%x\n", ilits->fw_pc, ilits->fw_latch); + + if (copy_to_user(buf, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + *pos += len; + return len; +} + +int ili_cascade_rw_tp_reg(u32 mcu, u32 type, u32 addr, u32 wdata, u32 wlen, u32 *rdata) +{ + int len = 0; +#if (TDDI_INTERFACE == BUS_SPI) + int ret = 0; + bool mcu_on = ON, read = 0; + u32 read_data; + + if (ilits->slave_wr_ctrl == SLAVE) { + ili_set_bypass_mode(mcu); + } else { + if (mcu == mcu_on) + ret = ili_ice_mode_ctrl_by_mode(ENABLE, ON, MASTER); + else + ret = ili_ice_mode_ctrl_by_mode(ENABLE, OFF, MASTER); + + if (ret < 0) { + ILI_ERR("Failed to enter ICE mode, ret = %d\n", ret); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to enter ICE mode"); + } + } + + if (type == read) { + if (ilits->slave_wr_ctrl == SLAVE) { + ili_mspi_read_slave_register(addr, &read_data, sizeof(u32)); + } else { + if (ili_ice_mode_read_by_mode(addr, &read_data, sizeof(u32), MASTER) < 0) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Read data error"); + } + } + + *rdata = read_data; + + ILI_INFO("[READ]:addr = 0x%06x, read = 0x%08x\n", addr, read_data); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "READ:addr = 0x%06x, read = 0x%08x\n", addr, read_data); + } else { + if (ilits->slave_wr_ctrl == SLAVE) { + ili_mspi_write_slave_register(addr, wdata, wlen); + } else { + if (ili_ice_mode_write_by_mode(addr, wdata, wlen, MASTER) < 0) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Write data error"); + } + } + + ILI_INFO("[WRITE]:addr = 0x%06x, write = 0x%08x, len = %d byte\n", addr, wdata, wlen); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "WRITE:addr = 0x%06x, write = 0x%08x, len =%d byte\n", addr, wdata, wlen); + } + + if (mcu == mcu_on) + ret = ili_ice_mode_ctrl(DISABLE, ON); + else + ret = ili_ice_mode_ctrl(DISABLE, OFF); + + if (ret < 0) { + ILI_ERR("Failed to disable ICE mode, ret = %d\n", ret); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to disable ICE mode"); + } +#endif + return len; +} + +static u32 rw_reg[5] = {0}; +static ssize_t ilitek_proc_rw_tp_reg_read(struct file *pFile, char __user *buf, size_t size, loff_t *pos) +{ + int ret = 0, len = 0; + bool mcu_on = 0, read = 0; + u32 type, addr, read_data, write_data, write_len, stop_mcu; + bool esd_en = ilits->wq_esd_ctrl, bat_en = ilits->wq_bat_ctrl; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + stop_mcu = rw_reg[0]; + type = rw_reg[1]; + addr = rw_reg[2]; + write_data = rw_reg[3]; + write_len = rw_reg[4]; + + ILI_INFO("stop_mcu = %d\n", rw_reg[0]); + + if (esd_en) + ili_wq_ctrl(WQ_ESD, DISABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, DISABLE); + + mutex_lock(&ilits->touch_mutex); + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + if (ilits->cascade_info_block.nNum != 0) { +#if (TDDI_INTERFACE == BUS_SPI) + len = ili_cascade_rw_tp_reg(stop_mcu, type, addr, write_data, write_len, &read_data); + +#elif (TDDI_INTERFACE == BUS_I2C) + if (stop_mcu == mcu_on) + ret = ili_ice_mode_ctrl_by_mode(ENABLE, ON, ilits->slave_wr_ctrl); + else + ret = ili_ice_mode_ctrl_by_mode(ENABLE, OFF, ilits->slave_wr_ctrl); + + if (ret < 0) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to enter ICE mode"); + } + + if (type == read) { + if (ili_ice_mode_read_by_mode(addr, &read_data, sizeof(u32), ilits->slave_wr_ctrl) < 0) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Read data error"); + } + + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "READ:addr = 0x%06x, read = 0x%08x\n", addr, read_data); + } else { + if (ili_ice_mode_write_by_mode(addr, write_data, write_len, ilits->slave_wr_ctrl) < 0) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Write data error"); + } + + ILI_INFO("[WRITE]:addr = 0x%06x, write = 0x%08x, len = %d byte\n", addr, write_data, write_len); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "WRITE:addr = 0x%06x, write = 0x%08x, len =%d byte\n", addr, write_data, write_len); + } + + if (stop_mcu == mcu_on) + ret = ili_ice_mode_ctrl_by_mode(DISABLE, ON, ilits->slave_wr_ctrl); + else + ret = ili_ice_mode_ctrl_by_mode(DISABLE, OFF, ilits->slave_wr_ctrl); + + if (ret < 0) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to disable ICE mode"); + } +#endif + } else { + if (stop_mcu == mcu_on) + ret = ili_ice_mode_ctrl(ENABLE, ON); + else + ret = ili_ice_mode_ctrl(ENABLE, OFF); + + if (ret < 0) { + ILI_ERR("Failed to enter ICE mode, ret = %d\n", ret); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to enter ICE mode"); + } + + if (type == read) { + if (ili_ice_mode_read(addr, &read_data, sizeof(u32)) < 0) { + ILI_ERR("Read data error\n"); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Read data error"); + } + + ILI_INFO("[READ]:addr = 0x%06x, read = 0x%08x\n", addr, read_data); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "READ:addr = 0x%06x, read = 0x%08x\n", addr, read_data); + } else { + if (ili_ice_mode_write(addr, write_data, write_len) < 0) { + ILI_ERR("Write data error\n"); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Write data error"); + } + + ILI_INFO("[WRITE]:addr = 0x%06x, write = 0x%08x, len = %d byte\n", addr, write_data, write_len); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "WRITE:addr = 0x%06x, write = 0x%08x, len =%d byte\n", addr, write_data, write_len); + } + + if (stop_mcu == mcu_on) + ret = ili_ice_mode_ctrl(DISABLE, ON); + else + ret = ili_ice_mode_ctrl(DISABLE, OFF); + + if (ret < 0) { + ILI_ERR("Failed to disable ICE mode, ret = %d\n", ret); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to disable ICE mode"); + } + } + + if (copy_to_user((char *)buf, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + if (esd_en) + ili_wq_ctrl(WQ_ESD, ENABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, ENABLE); + + *pos += len; + mutex_unlock(&ilits->touch_mutex); + return len; +} + +static ssize_t ilitek_proc_rw_tp_reg_write(struct file *filp, const char *buff, size_t size, loff_t *pos) +{ + char *token = NULL, *cur = NULL; + char cmd[256] = { 0 }; + u32 count = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if ((size - 1) > sizeof(cmd)) { + ILI_ERR("ERROR! input length is larger than local buffer\n"); + return -1; + } + + mutex_lock(&ilits->touch_mutex); + + if (buff != NULL) { + if (copy_from_user(cmd, buff, size - 1)) { + ILI_INFO("Failed to copy data from user space\n"); + size = -1; + goto out; + } + } + token = cur = cmd; + while ((token = strsep(&cur, ",")) != NULL) { + if (count >= (sizeof(rw_reg) / sizeof(u32))) { + ILI_ERR("command length is larger than function need\n"); + break; + } + rw_reg[count] = ili_str2hex(token); + ILI_INFO("rw_reg[%d] = 0x%x\n", count, rw_reg[count]); + count++; + } + +out: + mutex_unlock(&ilits->touch_mutex); + return size; +} + +static u8 fw_cmd_buff[256] = { 0 }; +static ssize_t ilitek_proc_fw_cmd_read(struct file *pFile, char __user *buf, size_t size, loff_t *pos) +{ + int len = 0, i = 0; + u8 *wrap_rbuf = NULL; + u16 wrap_wlen = 0, wrap_rlen = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + mutex_lock(&ilits->touch_mutex); + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + wrap_rlen = (fw_cmd_buff[0] << 8) | fw_cmd_buff[1]; + wrap_wlen = (fw_cmd_buff[2] << 8) | fw_cmd_buff[3]; + + ILI_INFO("fw_cmd read wrap_wlen = %d, wrap_rlen = %d\n", wrap_wlen, wrap_rlen); + + if (wrap_wlen > IOCTL_I2C_BUFF || wrap_rlen > IOCTL_I2C_BUFF) { + ILI_ERR("ERROR! R/W len is largn than ioctl buf\n"); + return -ENOTTY; + } + + if (wrap_rlen > 0) { + wrap_rbuf = kcalloc(IOCTL_I2C_BUFF, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(wrap_rbuf)) { + ILI_ERR("Failed to allocate mem\n"); + return -ENOMEM; + } + } + + if (atomic_read(&ilits->ice_stat)) { + ilits->wrapper(fw_cmd_buff + 4, wrap_wlen, wrap_rbuf, wrap_rlen, OFF, OFF); + } else { + if (ilits->actual_tp_mode == P5_X_FW_TEST_MODE) { + ilits->wrapper(fw_cmd_buff + 4, wrap_wlen, wrap_rbuf, wrap_rlen, ON, ON); + } else { + ilits->wrapper(fw_cmd_buff + 4, wrap_wlen, wrap_rbuf, wrap_rlen, ON, OFF); + } + } + + ili_dump_data(fw_cmd_buff + 4, 8, wrap_wlen, 16, "write fw data:"); + + if (wrap_rlen > 0) { + ili_dump_data(wrap_rbuf, 8, wrap_rlen, 16, "read fw data:"); + for (i = 0; i < wrap_rlen; i++) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%02X", wrap_rbuf[i]); + } + } else { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "Ack"); + } + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "\n"); + + if (copy_to_user((char *)buf, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + *pos += len; + mutex_unlock(&ilits->touch_mutex); + return len; +} + +static ssize_t ilitek_proc_fw_cmd_write(struct file *filp, const char *buff, size_t size, loff_t *pos) +{ + char *token = NULL, *cur = NULL; + char cmd[256] = { 0 }; + u32 count = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if ((size - 1) > sizeof(cmd)) { + ILI_ERR("ERROR! input length is larger than local buffer\n"); + return -1; + } + + mutex_lock(&ilits->touch_mutex); + + if (buff != NULL) { + if (copy_from_user(cmd, buff, size - 1)) { + ILI_INFO("Failed to copy data from user space\n"); + size = -1; + goto out; + } + } + token = cur = cmd; + while ((token = strsep(&cur, ",")) != NULL) { + if (count >= sizeof(fw_cmd_buff)) { + ILI_ERR("command length is larger than function need\n"); + break; + } + fw_cmd_buff[count] = ili_str2hex(token); + ILI_INFO("fw_cmd write buff[%d] = 0x%x\n", count, fw_cmd_buff[count]); + count++; + } + +out: + mutex_unlock(&ilits->touch_mutex); + return size; +} + +static ssize_t ilitek_proc_debug_switch_read(struct file *pFile, char __user *buff, size_t size, loff_t *pos) +{ + bool open; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + mutex_lock(&ilits->debug_read_mutex); + mutex_lock(&ilits->debug_mutex); + + open = !ilits->dnp; + ilits->all_frame_full = false; + + ilitek_debug_node_buff_control(open); + + size = snprintf(g_user_buf, USER_STR_BUFF * sizeof(unsigned char), "dnp : %s\n", ilits->dnp ? "Enabled" : "Disabled"); + *pos = size; + + if (copy_to_user(buff, g_user_buf, size)) + ILI_ERR("Failed to copy data to user space\n"); + + mutex_unlock(&ilits->debug_mutex); + mutex_unlock(&ilits->debug_read_mutex); + return size; +} + +static ssize_t ilitek_proc_debug_all_switch_read(struct file *pFile, char __user *buff, size_t size, loff_t *pos) +{ + bool open; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + mutex_lock(&ilits->debug_read_mutex); + mutex_lock(&ilits->debug_mutex); + + open = !ilits->dlnp; + + ilitek_debug_all_node_buff_control(open); + + size = snprintf(g_user_buf, USER_STR_BUFF * sizeof(unsigned char), "dlnp : %s\n", ilits->dlnp ? "Enabled" : "Disabled"); + *pos = size; + + if (copy_to_user(buff, g_user_buf, size)) + ILI_ERR("Failed to copy data to user space\n"); + + mutex_unlock(&ilits->debug_mutex); + mutex_unlock(&ilits->debug_read_mutex); + return size; +} + +static void ilitek_switch_debug_message_ping_pong_buff(void) +{ + bool flag; + int temp; + ILI_DBG("switch debug_message buff\n"); + mutex_lock(&ilits->debug_mutex); + + flag = !ilits->ppb; + + ILI_DBG("Before dbf_in_idx=%d, dbf_out_idx=%d\n", ilits->dbf_in_idx, ilits->dbf_out_idx); + if (flag) { + ILI_INFO("debug_message buff, input set a, output set b\n"); + ilits->dbf_in = ilits->dbf_a; + ilits->dbf_out = ilits->dbf_b; + } else { + ILI_INFO("debug_message buff, input set b, output set a\n"); + ilits->dbf_in = ilits->dbf_b; + ilits->dbf_out = ilits->dbf_a; + } + temp = ilits->dbf_in_idx; + ilits->dbf_in_idx = ilits->dbf_out_idx; + ilits->dbf_out_idx = temp; + + ilits->ppb = flag; + + ILI_DBG("dbf_in_idx=%d, dbf_out_idx=%d, ilits->ppb=%d\n", ilits->dbf_in_idx, ilits->dbf_out_idx, ilits->ppb); + + mutex_unlock(&ilits->debug_mutex); +} + +static int ilitek_proc_debug_all_message_show(struct seq_file *m, void *v) +{ + int i = 0, count = 0; + int data_count = 0; + int one_data_bytes = 0; + int need_read_data_len = 0; + int type = 0; + + if (!ilits->dlnp) { + ILI_ERR("Debug flag isn't enabled (%d)\n", ilits->dlnp); + seq_printf(m, "Debug flag isn't enabled (%d)\n", ilits->dlnp); + return -EAGAIN; + } + ilitek_switch_debug_message_ping_pong_buff(); + + count = 0; + do { + if (ilits->dbf_out[count].mark) { + if (ilits->dbf_out[count].data[0] == P5_X_DEMO_PACKET_ID) { + need_read_data_len = P5_X_DEMO_MODE_PACKET_LEN; + } else if (ilits->dbf_out[count].data[0] == P5_X_I2CUART_PACKET_ID) { + type = ilits->dbf_out[count].data[3] & 0x0F; + + data_count = ilits->dbf_out[count].data[1] * ilits->dbf_out[count].data[2]; + + if (type == 0 || type == 1 || type == 6) { + one_data_bytes = 1; + } else if (type == 2 || type == 3) { + one_data_bytes = 2; + } else if (type == 4 || type == 5) { + one_data_bytes = 4; + } + need_read_data_len = data_count * one_data_bytes + 1 + 5; + } else if (ilits->dbf_out[count].data[0] == P5_X_DEBUG_PACKET_ID /* A7 */ + || ilits->dbf_out[count].data[0] == P5_X_DEBUG_HIGH_RESOLUTION_PACKET_ID /* A8 */ + || ilits->dbf_out[count].data[0] == P5_X_DEMO_HIGH_RESOLUTION_PACKET_ID /* 5B */ + || ilits->dbf_out[count].data[0] == P5_X_DEBUG_LITE_PACKET_ID) { /* 9A */ + need_read_data_len = (int) ((ilits->dbf_out[count].data[1] << 8) + ilits->dbf_out[count].data[2]) & 0xFFFF; + } + if (ilits->pen_info.pen_data_mode == PEN_ONLY_SIGNAL_MODE + || ilits->pen_info.pen_data_mode == PEN_ONLY_RAW_DATA_MODE) { + seq_printf(m, ":0x80,"); + } else if (ilits->pen_info.pen_data_mode == HAND_ONLY_SIGNAL_MODE + || ilits->pen_info.pen_data_mode == HAND_ONLY_RAW_DATA_MODE) { + seq_printf(m, ":0x81,"); + } else if (ilits->tp_data_format == DATA_FORMAT_DEMO) { + seq_printf(m, ":0x10,"); + } else if(ilits->tp_data_format == DATA_FORMAT_DEBUG) { + seq_printf(m, ":0x45,"); + } + + for (i = 0; i < need_read_data_len; i++) { + seq_printf(m, "%02X", ilits->dbf_out[count].data[i]); + } + seq_printf(m, ":\n"); + ilits->dbf_out[count].mark = false; + } + count++; + + } while (count < ilits->dbf_out_idx); + + ILI_DBG("total send %d frame\n", ilits->dbf_out_idx); + + ilits->dbf_out_idx = 0; + return 0; +} + +#if DMESG_SEQ_FILE +static int ilitek_proc_debug_message_show(struct seq_file *m, void *v) +{ + int i = 0; + int data_count = 0; + int one_data_bytes = 0; + int need_read_data_len = 0; + int type = 0; + + /* '0' ~ 'F' mapping table */ + char charmapping[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }; + + if (!ilits->dnp) { + ILI_ERR("Debug flag isn't enabled (%d)\n", ilits->dnp); + seq_printf(m, "Debug flag isn't enabled (%d)\n", ilits->dnp); + return -EAGAIN; + } + + if (ilits->odi == ilits->dbf && ilits->all_frame_full == false) { + /* ILI_DBG("WARNING ! there's no cdc data.\n"); */ + return -EAGAIN; + } + + mutex_lock(&ilits->debug_read_mutex); + ILI_DBG("f_count= %d, index = %d, mark = %d\n", ilits->dbf, ilits->odi, ilits->dbl[ilits->odi].mark); + if (!wait_event_interruptible_timeout(ilits->inq, ilits->dbl[ilits->odi].mark, msecs_to_jiffies(ilits->wait_int_timeout))) { + ILI_ERR("WARNING ! there's no data received.\n"); + mutex_unlock(&ilits->debug_read_mutex); + return -EAGAIN; + } + mutex_lock(&ilits->debug_mutex); + + ILI_DBG("dbl mark = %d, data[0] = 0x%X, data[1] = 0x%X, data[2] = 0x%X \n", ilits->dbl[ilits->odi].mark, ilits->dbl[ilits->odi].data[0], ilits->dbl[ilits->odi].data[1], ilits->dbl[ilits->odi].data[2]); + + if (ilits->dbl[ilits->odi].mark) { + if (ilits->dbl[ilits->odi].data[0] == P5_X_DEMO_PACKET_ID) { + need_read_data_len = P5_X_DEMO_MODE_PACKET_LEN; + } else if (ilits->dbl[ilits->odi].data[0] == P5_X_I2CUART_PACKET_ID) { + type = ilits->dbl[ilits->odi].data[3] & 0x0F; + + data_count = ilits->dbl[ilits->odi].data[1] * ilits->dbl[ilits->odi].data[2]; + + if (type == 0 || type == 1 || type == 6) { + one_data_bytes = 1; + } else if (type == 2 || type == 3) { + one_data_bytes = 2; + } else if (type == 4 || type == 5) { + one_data_bytes = 4; + } + need_read_data_len = data_count * one_data_bytes + 1 + 5; + } else if (ilits->dbl[ilits->odi].data[0] == P5_X_DEBUG_PACKET_ID /* A7 */ + || ilits->dbl[ilits->odi].data[0] == P5_X_DEBUG_HIGH_RESOLUTION_PACKET_ID /* A8 */ + || ilits->dbl[ilits->odi].data[0] == P5_X_DEMO_HIGH_RESOLUTION_PACKET_ID /* 5B */ + || ilits->dbl[ilits->odi].data[0] == P5_X_DEBUG_LITE_PACKET_ID) { /* 9A */ + need_read_data_len = (int) ((ilits->dbl[ilits->odi].data[1] << 8) + ilits->dbl[ilits->odi].data[2]) & 0xFFFF; + } + + ILI_DBG("Need Read data len = %d\n", need_read_data_len); + + if (ilits->outputStrArr == NULL || ERR_ALLOC_MEM(ilits->outputStrArr)) { + ILI_ERR("ilits->outputStrArr memory error.\n"); + ilits->outputStrArr = vmalloc(TR_BUF_SIZE * 2); + } + memset(ilits->outputStrArr, 0, need_read_data_len * 2 + 4); + for (i = 0; i < need_read_data_len * 2; i+=2) { + ilits->outputStrArr[i] = charmapping[(ilits->dbl[ilits->odi].data[i >> 1]) >> 4]; + ilits->outputStrArr[i+1] = charmapping[(ilits->dbl[ilits->odi].data[i >> 1]) & 0x0F]; + } + seq_printf(m, "%s", ilits->outputStrArr); + seq_printf(m, "\n\n"); + ilits->all_frame_full = false; + ilits->dbl[ilits->odi].mark = false; + ilits->odi = ((ilits->odi + 1) % TR_BUF_LIST_SIZE); + } + + mutex_unlock(&ilits->debug_mutex); + mutex_unlock(&ilits->debug_read_mutex); + return 0; +} +#else +static ssize_t ilitek_proc_debug_message_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + unsigned long p = *pos; + int i = 0; + int send_data_len = 0; + int ret = 0; + int data_count = 0; + int one_data_bytes = 0; + int need_read_data_len = 0; + int type = 0; + unsigned char *tmpbuf = NULL; + unsigned char tmpbufback[128] = {0}; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (!ilits->dnp) { + ILI_ERR("Debug flag isn't enabled (%d)\n", ilits->dnp); + return -EAGAIN; + } + + if (ilits->odi == ilits->dbf && ilits->all_frame_full == false) { + /* ILI_DBG("WARNING ! there's no cdc data.\n"); */ + *pos = send_data_len; + return send_data_len; + } + + mutex_lock(&ilits->debug_read_mutex); + ILI_DBG("f_count= %d, index = %d, mark = %d\n", ilits->dbf, ilits->odi, ilits->dbl[ilits->odi].mark); + if (!wait_event_interruptible_timeout(ilits->inq, ilits->dbl[ilits->odi].mark, msecs_to_jiffies(ilits->wait_int_timeout))) { + ILI_ERR("WARNING ! there's no data received.\n"); + mutex_unlock(&ilits->debug_read_mutex); + *pos = send_data_len; + return send_data_len; + } + mutex_lock(&ilits->debug_mutex); + + tmpbuf = vmalloc(4096); /* buf size if even */ + if (ERR_ALLOC_MEM(tmpbuf)) { + ILI_ERR("buffer vmalloc error\n"); + send_data_len += snprintf(tmpbufback + send_data_len, sizeof(tmpbufback), "buffer vmalloc error\n"); + ret = copy_to_user(buff, tmpbufback, send_data_len); /*ilits->dbl[0] */ + goto out; + } + + if (ilits->dbl[ilits->odi].mark) { + if (ilits->dbl[ilits->odi].data[0] == P5_X_DEMO_PACKET_ID) { + need_read_data_len = 43; + } else if (ilits->dbl[ilits->odi].data[0] == P5_X_DEMO_HIGH_RESOLUTION_PACKET_ID) { + need_read_data_len = P5_X_DEMO_MODE_PACKET_LEN_HIGH_RESOLUTION; + if (ilits->rib.nCustomerType != ilits->customertype_off) { + need_read_data_len += P5_X_CUSTOMER_LENGTH; + } + } else if (ilits->dbl[ilits->odi].data[0] == P5_X_I2CUART_PACKET_ID) { + type = ilits->dbl[ilits->odi].data[3] & 0x0F; + + data_count = ilits->dbl[ilits->odi].data[1] * ilits->dbl[ilits->odi].data[2]; + + if (type == 0 || type == 1 || type == 6) { + one_data_bytes = 1; + } else if (type == 2 || type == 3) { + one_data_bytes = 2; + } else if (type == 4 || type == 5) { + one_data_bytes = 4; + } + need_read_data_len = data_count * one_data_bytes + 1 + 5; + } else if (ilits->dbl[ilits->odi].data[0] == P5_X_DEBUG_PACKET_ID || ilits->dbl[ilits->odi].data[0] == P5_X_DEBUG_LITE_PACKET_ID) { + send_data_len = 0; /* ilits->dbl[0][1] - 2; */ + need_read_data_len = TR_BUF_SIZE - 8; + } else if (ilits->dbl[ilits->odi].data[0] == P5_X_I2CUART_PACKET_ID) { + need_read_data_len = P5_X_DEMO_MODE_PACKET_LEN+P5_X_DEMO_MODE_AXIS_LEN+P5_X_DEMO_MODE_STATE_INFO; + } else if (ilits->dbl[ilits->odi].data[0] == P5_X_DEBUG_HIGH_RESOLUTION_PACKET_ID) { + send_data_len = 0; /* ilits->dbl[0][1] - 2; */ + need_read_data_len = TR_BUF_SIZE - 8; + } + + for (i = 0; i < need_read_data_len; i++) { + send_data_len += snprintf(tmpbuf + send_data_len, sizeof(tmpbufback), "%02X", ilits->dbl[ilits->odi].data[i]); + if (send_data_len >= 4096) { + ILI_ERR("send_data_len = %d set 4096 i = %d\n", send_data_len, i); + send_data_len = 4096; + break; + } + } + + send_data_len += snprintf(tmpbuf + send_data_len, sizeof(tmpbufback), "\n\n"); + + if (p == 5 || size == 4096 || size == 2048) { + ilits->all_frame_full = false; + ilits->dbl[ilits->odi].mark = false; + ilits->odi = ((ilits->odi + 1) % TR_BUF_LIST_SIZE); + } + } + + /* Preparing to send debug data to user */ + if (size == 4096) + ret = copy_to_user(buff, tmpbuf, send_data_len); + else + ret = copy_to_user(buff, tmpbuf + p, send_data_len - p); + + /* ILI_ERR("send_data_len = %d\n", send_data_len); */ + if (send_data_len <= 0 || send_data_len > 4096) { + ILI_ERR("send_data_len = %d set 4096\n", send_data_len); + send_data_len = 4096; + } + + if (ret) { + ILI_ERR("copy_to_user err\n"); + ret = -EFAULT; + } else { + *pos += send_data_len; + ret = send_data_len; + ILI_DBG("Read %d bytes(s) from %ld\n", send_data_len, p); + } + +out: + mutex_unlock(&ilits->debug_mutex); + mutex_unlock(&ilits->debug_read_mutex); + ipio_vfree((void **)&tmpbuf); + return send_data_len; +} +#endif + +static ssize_t ilitek_proc_get_debug_mode_data_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + int ret; + struct file_buffer csv; + u8 data_type = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + /* initialize file */ + memset(csv.fname, 0, sizeof(csv.fname)); + snprintf(csv.fname, sizeof(csv.fname), "%s", DEBUG_DATA_FILE_PATH); + csv.flen = 0; + csv.wlen = 0; + csv.max_size = DEBUG_DATA_FILE_SIZE; + + csv.ptr = vmalloc(csv.max_size); + if (ERR_ALLOC_MEM(csv.ptr)) { + ILI_ERR("Failed to allocate CSV mem\n"); + goto out; + } + + /* save data to csv */ + ILI_INFO("Get Raw data %d frame\n", ilits->raw_count); + ILI_INFO("Get Delta data %d frame\n", ilits->delta_count); + csv.wlen += snprintf(csv.ptr + csv.wlen, (csv.max_size - csv.wlen), "Get Raw data %d frame\n", ilits->raw_count); + csv.wlen += snprintf(csv.ptr + csv.wlen, (csv.max_size - csv.wlen), "Get Delta data %d frame\n", ilits->delta_count); + + file_write(&csv, true); + + data_type = P5_X_FW_RAW_DATA_MODE; + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG, false, &data_type) < 0) { + ILI_ERR("Failed to set tp data length\n"); + goto out; + } + + /* get raw data */ + csv.wlen = 0; + memset(csv.ptr, 0, csv.max_size); + csv.wlen += snprintf(csv.ptr + csv.wlen, (csv.max_size - csv.wlen), "\n\n=======Raw data======="); + file_write(&csv, false); + + ret = debug_mode_get_data(&csv, P5_X_FW_RAW_DATA_MODE, ilits->raw_count); + if (ret < 0) + goto out; + + /* get delta data */ + csv.wlen = 0; + memset(csv.ptr, 0, csv.max_size); + csv.wlen += snprintf(csv.ptr + csv.wlen, (csv.max_size - csv.wlen), "\n\n=======Delta data======="); + file_write(&csv, false); + + data_type = P5_X_FW_SIGNAL_DATA_MODE; + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG, false, &data_type) < 0) { + ILI_ERR("Failed to set tp data length\n"); + goto out; + } + + ret = debug_mode_get_data(&csv, P5_X_FW_SIGNAL_DATA_MODE, ilits->delta_count); + if (ret < 0) + goto out; + + /* change to demo mode */ + data_type = P5_X_FW_SIGNAL_DATA_MODE; + if (ili_set_tp_data_len(DATA_FORMAT_DEMO, false, &data_type) < 0) + ILI_ERR("Failed to set tp data length\n"); + +out: + ipio_vfree((void **)&csv.ptr); + return 0; +} + +static ssize_t ilitek_proc_get_debug_mode_data_write(struct file *filp, const char *buff, size_t size, loff_t *pos) +{ + char *token = NULL, *cur = NULL; + char cmd[256] = {0}; + u8 temp[256] = {0}, count = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if ((size - 1) > sizeof(cmd)) { + ILI_ERR("ERROR! input length is larger than local buffer\n"); + return -1; + } + + if (buff != NULL) { + if (copy_from_user(cmd, buff, size - 1)) { + ILI_INFO("Failed to copy data from user space\n"); + return -1; + } + } + + ILI_INFO("size = %d, cmd = %s\n", (int)size, cmd); + token = cur = cmd; + while ((token = strsep(&cur, ",")) != NULL) { + temp[count] = ili_str2hex(token); + ILI_INFO("temp[%d] = %d\n", count, temp[count]); + count++; + } + + ilits->raw_count = ((temp[0] << 8) | temp[1]); + ilits->delta_count = ((temp[2] << 8) | temp[3]); + ilits->bg_count = ((temp[4] << 8) | temp[5]); + + ILI_INFO("Raw_count = %d, Delta_count = %d, BG_count = %d\n", ilits->raw_count, ilits->delta_count, ilits->bg_count); + return size; +} + +#if GENERIC_KERNEL_IMAGE +static int ilitek_proc_mp_result_show(struct seq_file *m, void *v) +{ + if (ilits->mp_result== NULL) { + ILI_INFO("mp result is NULL\n"); + seq_printf(m, "mp result is NULL\n"); + return 0; + } + + if (m->size < strlen(ilits->mp_result)) { + ILI_INFO("size = %d, mp_result = %d\n Unable to print all data\n", + (int) m->size, (int) strlen(ilits->mp_result)); + } + + seq_printf(m, "%s", ilits->mp_result); + return 0; +} +#endif + +static ssize_t ilitek_node_mp_lcm_on_test_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + int ret = 0, len = 2; + bool esd_en = ilits->wq_esd_ctrl, bat_en = ilits->wq_bat_ctrl; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + ILI_INFO("Run MP test with LCM on\n"); + + mutex_lock(&ilits->touch_mutex); + + /* Create the directory for mp_test result */ + if ((dev_mkdir(CSV_LCM_ON_PATH, S_IRUGO | S_IWUSR)) != 0) + ILI_ERR("Failed to create directory for mp_test\n"); + + if (esd_en) + ili_wq_ctrl(WQ_ESD, DISABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, DISABLE); + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + ilits->mp_ret_len = 0; + + ret = ili_mp_test_handler(g_user_buf, ON); + ILI_INFO("MP TEST %s, Error code = %d\n", (ret < 0) ? "FAIL" : "PASS", ret); + + g_user_buf[0] = 3; + g_user_buf[1] = (ret < 0) ? -ret : ret; + len += ilits->mp_ret_len; + + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "MP TEST %s\n", (ret < 0) ? "FAIL" : "PASS"); + if (g_user_buf[1] == EMP_MODE) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to switch MP mode, abort!"); + } else if (g_user_buf[1] == EMP_FW_PROC) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "FW still upgrading, abort!"); + } else if (g_user_buf[1] == EMP_FORMUL_NULL) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "MP formula is null, abort!"); + } else if (g_user_buf[1] == EMP_INI) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Not found ini file, abort!"); + } else if (g_user_buf[1] == EMP_NOMEM) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to allocated memory, abort!"); + } else if (g_user_buf[1] == EMP_PROTOCOL) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Protocol version isn't matched, abort!"); + } else if (g_user_buf[1] == EMP_TIMING_INFO) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to get timing info, abort!"); + } else if (g_user_buf[1] == EMP_PARA_NULL) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to get mp parameter, abort!"); + } + + if (copy_to_user((char *)buff, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + if (esd_en) + ili_wq_ctrl(WQ_ESD, ENABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, ENABLE); + + *pos += len; + mutex_unlock(&ilits->touch_mutex); + return len; +} + +static ssize_t ilitek_node_mp_lcm_off_test_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + int ret = 0, len = 2; + bool esd_en = ilits->wq_esd_ctrl, bat_en = ilits->wq_bat_ctrl; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + ILI_INFO("Run MP test with LCM off\n"); + + mutex_lock(&ilits->touch_mutex); + + /* Create the directory for mp_test result */ + if ((dev_mkdir(CSV_LCM_OFF_PATH, S_IRUGO | S_IWUSR)) != 0) + ILI_ERR("Failed to create directory for mp_test\n"); + + if (esd_en) + ili_wq_ctrl(WQ_ESD, DISABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, DISABLE); + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + ilits->mp_ret_len = 0; + + ret = ili_mp_test_handler(g_user_buf, OFF); + ILI_INFO("MP TEST %s, Error code = %d\n", (ret < 0) ? "FAIL" : "PASS", ret); + + g_user_buf[0] = 3; + g_user_buf[1] = (ret < 0) ? -ret : ret; + len += ilits->mp_ret_len; + + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "MP TEST %s\n", (ret < 0) ? "FAIL" : "PASS"); + if (g_user_buf[1] == EMP_MODE) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to switch MP mode, abort!"); + } else if (g_user_buf[1] == EMP_FW_PROC) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "FW still upgrading, abort!"); + } else if (g_user_buf[1] == EMP_FORMUL_NULL) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "MP formula is null, abort!"); + } else if (g_user_buf[1] == EMP_INI) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Not found ini file, abort!"); + } else if (g_user_buf[1] == EMP_NOMEM) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to allocated memory, abort!"); + } else if (g_user_buf[1] == EMP_PROTOCOL) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Protocol version isn't matched, abort!"); + } else if (g_user_buf[1] == EMP_TIMING_INFO) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to get timing info, abort!"); + } else if (g_user_buf[1] == EMP_PARA_NULL) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to get mp parameter, abort!"); + } + + if (copy_to_user((char *)buff, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + if (esd_en) + ili_wq_ctrl(WQ_ESD, ENABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, ENABLE); + + *pos += len; + mutex_unlock(&ilits->touch_mutex); + return len; +} + +static ssize_t ilitek_node_ver_info_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + u32 len = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + mutex_lock(&ilits->touch_mutex); + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "CHIP ID = %x\n", ilits->chip->product_id); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "FW version = %d.%d.%d.%d\n", + ilits->chip->fw_ver >> 24, (ilits->chip->fw_ver >> 16) & 0xFF, + (ilits->chip->fw_ver >> 8) & 0xFF, ilits->chip->fw_ver & 0xFF); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "FW MP version = %d.%d.%d.%d\n", + ilits->chip->fw_mp_ver >> 24, (ilits->chip->fw_mp_ver >> 16) & 0xFF, + (ilits->chip->fw_mp_ver >> 8) & 0xFF, ilits->chip->fw_mp_ver & 0xFF); + + if (ilits->protocol->core_ver_len == P5_X_CORE_VER_THREE_LENGTH) + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "Core version = %d.%d.%d\n", + (ilits->chip->core_ver >> 24) & 0xFF, (ilits->chip->core_ver >> 16) & 0xFF, + (ilits->chip->core_ver >> 8) & 0xFF); + else + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "Core version = %d.%d.%d.%d\n", + (ilits->chip->core_ver >> 24) & 0xFF, (ilits->chip->core_ver >> 16) & 0xFF, + (ilits->chip->core_ver >> 8) & 0xFF, ilits->chip->core_ver & 0xFF); + + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "Protocol version = %d.%d.%d\n", + ilits->protocol->ver >> 16, (ilits->protocol->ver >> 8) & 0xFF, + ilits->protocol->ver & 0xFF); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "Driver version = %s\n", DRIVER_VERSION); + + if (copy_to_user((char *)buff, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + *pos += len; + mutex_unlock(&ilits->touch_mutex); + return len; +} + +static ssize_t ilitek_node_change_list_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + u32 len = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + mutex_lock(&ilits->touch_mutex); + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "============= Change list ==============\n"); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "[Drive version] = %s\n", DRIVER_VERSION); + /* len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "[Patch] 202001-0001\n"); */ + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "========================================\n"); + + if (copy_to_user((char *)buff, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + *pos += len; + mutex_unlock(&ilits->touch_mutex); + return len; +} + +static ssize_t ilitek_proc_fw_process_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + u32 len = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + len = snprintf(g_user_buf, USER_STR_BUFF * sizeof(unsigned char), "%02d\n", ilits->fw_update_stat); + + ILI_INFO("update status = %d\n", ilits->fw_update_stat); + + if (copy_to_user((char *)buff, &ilits->fw_update_stat, len)) + ILI_ERR("Failed to copy data to user space\n"); + + *pos = len; + return len; +} + +static ssize_t ilitek_node_fw_upgrade_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + int ret = 0, len = 0; + bool esd_en = ilits->wq_esd_ctrl, bat_en = ilits->wq_bat_ctrl; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + ILI_INFO("Prepar to upgarde firmware\n"); + + mutex_lock(&ilits->touch_mutex); + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + if (esd_en) + ili_wq_ctrl(WQ_ESD, DISABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, DISABLE); + + ilits->force_fw_update = ENABLE; + ilits->node_update = true; + + ret = ili_fw_upgrade_handler(NULL); + + ilits->node_update = false; + ilits->force_fw_update = DISABLE; + + ret = (ret < 0) ? -ret : ret; + + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%3d ", (ret == 0) ? 1 : ret); + + if (ret == 0) + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Upgrade firmware = PASS"); + else + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Upgrade firmware = FAIL"); + + /* Reason for fail */ + if (ret == EFW_CONVERT_FILE) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to convert hex/ili file, abort!"); + } else if (ret == ENOMEM) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to allocate memory, abort!"); + } else if (ret == EFW_ICE_MODE) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to operate ice mode, abort!"); + } else if (ret == EFW_CRC) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "CRC not matched, abort!"); + } else if (ret == EFW_REST) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to do reset, abort!"); + } else if (ret == EFW_ERASE) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to erase flash, abort!"); + } else if (ret == EFW_PROGRAM) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to program flash, abort!"); + } else if (ret == EFW_INTERFACE) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to hex file interface no match, abort!"); + } + + if (copy_to_user((u32 *) buff, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + if (esd_en) + ili_wq_ctrl(WQ_ESD, ENABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, ENABLE); + + *pos += len; + mutex_unlock(&ilits->touch_mutex); + return len; +} + +static ssize_t ilitek_proc_debug_level_read(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + debug_en = !debug_en; + + ILI_INFO(" %s debug level = %x\n", debug_en ? "Enable" : "Disable", debug_en); + + size = snprintf(g_user_buf, USER_STR_BUFF * sizeof(unsigned char), "debug level : %s\n", debug_en ? "Enable" : "Disable"); + + *pos += size; + + if (copy_to_user((u32 *) buff, g_user_buf, size)) + ILI_ERR("Failed to copy data to user space\n"); + + return size; +} + +static ssize_t ilitek_proc_sram_test_info(struct file *filp, char __user *buff, size_t size, loff_t *pos) +{ + int len = 0, ret = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (*pos != 0) + return 0; + + memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); + + if (ilits->cascade_info_block.nNum != 0) { + ret = ili_cascade_reset_ctrl(TP_IC_WHOLE_RST_WITH_FLASH, true); + } else { + ret = ili_reset_ctrl(TP_IC_WHOLE_RST_WITH_FLASH); + } + + if (ret < 0) { + ILI_ERR("TP_IC_WHOLE_RST_WITH_FLASH Failed, ret = %d\n", ret); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "TP_IC_WHOLE_RST_WITH_FLASH Failed"); + } + + mdelay(30); + + ili_parsing_sram_param(); + + if (ilits->cascade_info_block.nNum != 0) { +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(ENABLE, OFF, BOTH); +#else + ili_core_spi_setup(SPI_CLK_CASCADE_TABLE_NUM); + ili_set_bypass_mode(OFF); +#endif + } else { + ret = ili_ice_mode_ctrl(ENABLE, OFF); + } + + if (ret < 0) { + ILI_ERR("Failed to disable ICE mode, ret = %d\n", ret); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "Failed to disable ICE mode"); + } + + /* close FW SRAM power saving */ + /* 7807Q 9881N don't have to close it */ + if (ilits->sram_para.tpu_clock_en == ENABLE) { + ILI_INFO("close FW SRAM power saving\n"); + ili_ice_mode_write_by_mode(0x8003F, 0x8A, 1, BOTH); + ili_ice_mode_write_by_mode(0x8003C, 0x00, 1, BOTH); + } + + ret = ili_tddi_ic_sram_test(); + if (ret < 0) { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "SRAM TEST Failed"); + } else { + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "SRAM TEST Pass"); + } + + if (ilits->cascade_info_block.nNum != 0) { + ret = ili_cascade_reset_ctrl(TP_IC_WHOLE_RST_WITH_FLASH, false); +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(ENABLE, OFF, BOTH); +#else + ili_set_bypass_mode(OFF); +#endif + } else { + ret = ili_reset_ctrl(TP_IC_WHOLE_RST_WITH_FLASH); + } + + if (ret < 0) { + ILI_ERR("TP_IC_WHOLE_RST_WITH_FLASH Failed, ret = %d\n", ret); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "TP_IC_WHOLE_RST_WITH_FLASH Failed"); + } + + mdelay(50); + + ret = ili_fw_upgrade_handler(NULL); + if (ret < 0) { + ILI_ERR("fw upgrade Failed, ret = %d\n", ret); + len += snprintf(g_user_buf + len, USER_STR_BUFF - len, "%s\n", "fw upgrade Failed"); + } + + if (copy_to_user((char *)buff, g_user_buf, len)) + ILI_ERR("Failed to copy data to user space\n"); + + *pos += len; + return len; +} + +int ili_get_tp_recore_ctrl(int data) +{ + int ret = 0; + + switch ((int)data) { + + case ENABLE_RECORD: + ILI_INFO("recore enable"); + ret = ili_ic_func_ctrl("tp_recore", 1); + mdelay(200); + break; + case DATA_RECORD: + mdelay(50); + ILI_INFO("Get data"); + ret = ili_ic_func_ctrl("tp_recore", 2); + if (ret < 0) { + ILI_ERR("cmd fail\n"); + goto out; + } + + ret = ili_get_tp_recore_data(ON); + if (ret < 0) + ILI_ERR("get data fail\n"); + + ILI_INFO("recore reset"); + ret = ili_ic_func_ctrl("tp_recore", 3); + if (ret < 0) { + ILI_ERR("cmd fail\n"); + goto out; + } + break; + case DISABLE_RECORD: + ILI_INFO("recore disable"); + ret = ili_ic_func_ctrl("tp_recore", 0); + break; + + } +out: + return ret; + +} + +int ili_get_tp_recore_data(bool mcu) +{ + u8 buf[8] = {0}, record_case = 0; + s8 index; + u16 *raw = NULL, *raw_ptr = NULL, frame_len = 0; + u32 base_addr = 0x20000, addr, len, i, fcnt; + struct record_state record_stat; + bool ice = atomic_read(&ilits->ice_stat); + + if (ilits->wrapper(NULL, 0, buf, sizeof(buf), OFF, OFF) < 0) { + ILI_ERR("Get info fail\n"); + return -1; + } + + addr = ((buf[0] << 8) | buf[1]) + base_addr; + len = ((buf[2] << 8) | buf[3]); + index = buf[4]; + fcnt = buf[5]; + record_case = buf[6]; + ipio_memcpy(&record_stat, &buf[7], 1, 1); + ILI_INFO("addr = 0x%x, len = %d, lndex = 0x%x, fram num = %d, record_case = 0x%x\n", + addr, len, index, fcnt, record_case); + ili_dump_data(buf, 8, sizeof(buf), 0, "all record bytes"); + + raw = kcalloc(len, sizeof(u8), GFP_ATOMIC); + if (ERR_ALLOC_MEM(raw)) { + ILI_ERR("Failed to allocate packet memory, %ld\n", PTR_ERR(raw)); + return -1; + } + + if (!ice) + ili_ice_mode_ctrl(ENABLE, ON); + + buf[0] = 0x25; + buf[3] = (char)((addr & 0x00FF0000) >> 16); + buf[2] = (char)((addr & 0x0000FF00) >> 8); + buf[1] = (char)((addr & 0x000000FF)); + + if (ilits->wrapper(buf, 4, NULL, 0, ON, OFF)) { + ILI_ERR("Failed to write iram data\n"); + return -ENODEV; + } + + if (ilits->wrapper(NULL, 0, (u8 *)raw, len, ON, OFF)) { + ILI_ERR("Failed to Read iram data\n"); + return -ENODEV; + } + + frame_len = (len / (fcnt * 2)); + for (i = 0; i < fcnt; i++) { + raw_ptr = raw + (index * frame_len); + + ili_dump_data(raw_ptr, 16, frame_len, ilits->xch_num, "recore_data"); + index--; + if (index < 0) + index = fcnt - 1; + } + + if (!ice) + ili_ice_mode_ctrl(DISABLE, ON); + + if (record_case == 2) { + ILI_INFO("tp_palm_stat = %d\n", record_stat.touch_palm_state_e); + ILI_INFO("app_an_stat = %d\n", record_stat.app_an_statu_e); + ILI_INFO("app_check_abnor = %d\n", record_stat.app_sys_check_bg_abnormal); + ILI_INFO("wrong_bg = %d\n", record_stat.g_b_wrong_bg); + } + + ipio_kfree((void **)&raw); + + return 0; +} + +void ili_gesture_fail_reason(bool enable) +{ + + u8 cmd[24] = {0}; + + /* set symbol */ + if (ili_ic_func_ctrl("knock_en", 0x8) < 0) + ILI_ERR("set symbol failed"); + + /* enable gesture fail reason */ + cmd[0] = 0x01; + cmd[1] = 0x0A; + cmd[2] = 0x10; + if (enable) + cmd[3] = 0x01; + else + cmd[3] = 0x00; + cmd[4] = 0xFF; + cmd[5] = 0xFF; + if ((ilits->wrapper(cmd, 6, NULL, 0, ON, OFF)) < 0) + ILI_ERR("enable gesture fail reason failed"); + + /* set gesture parameters */ + cmd[0] = 0x01; + cmd[1] = 0x0A; + cmd[2] = 0x12; + cmd[3] = 0x01; + memset(cmd + 4, 0xFF, 20); + if ((ilits->wrapper(cmd, 24, NULL, 0, ON, OFF)) < 0) + ILI_ERR("set gesture parameters failed"); + + /* get gesture parameters */ + cmd[0] = 0x01; + cmd[1] = 0x0A; + cmd[2] = 0x11; + cmd[3] = 0x01; + if ((ilits->wrapper(cmd, 4, NULL, 0, ON, OFF)) < 0) + ILI_ERR("get gesture parameters failed"); + +} + +int ili_tp_data_mode_ctrl(u8 *cmd) +{ + int ret = 0; +#if (TDDI_INTERFACE == BUS_SPI) + int check_debugLite = -1; +#endif + switch (cmd[0]) { + case AP_MODE: + if (ilits->tp_suspend) { + if (ili_set_tp_data_len(DATA_FORMAT_GESTURE_DEMO, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set demo len from gesture mode\n"); + ret = -ENOTTY; + } + } else { + if (ilits->actual_tp_mode == P5_X_FW_TEST_MODE) { + if (ili_switch_tp_mode(P5_X_FW_AP_MODE) < 0) { + ILI_ERR("Failed to switch demo mode\n"); + ret = -ENOTTY; + } + } else { + if (ili_set_tp_data_len(DATA_FORMAT_DEMO, false, &cmd[1]) < 0) { + ILI_ERR("Failed to switch demo mode\n"); + ret = -ENOTTY; + } + } + } + break; + case TEST_MODE: + if (ili_switch_tp_mode(P5_X_FW_TEST_MODE) < 0) { + ILI_ERR("Failed to switch test mode\n"); + ret = -ENOTTY; + } + break; + case DEBUG_MODE: + if (!ilits->tp_suspend && (ilits->actual_tp_mode != P5_X_FW_AP_MODE)) { + if (ili_switch_tp_mode(P5_X_FW_AP_MODE) < 0) { + ILI_ERR("Failed to switch Debug mode\n"); + ret = -ENOTTY; + break; + } + } + if (ilits->tp_suspend) { + if (ili_set_tp_data_len(DATA_FORMAT_GESTURE_DEBUG, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug len from gesture mode\n"); + ret = -ENOTTY; + } + } else { + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug len\n"); + ret = -ENOTTY; + } + } + break; +#if (TDDI_INTERFACE == BUS_I2C) + case DEBUG_LITE_ROI: + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG_LITE_ROI, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug lite roi\n"); + ret = -ENOTTY; + } + break; + case DEBUG_LITE_WINDOW: + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG_LITE_WINDOW, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug lite window\n"); + ret = -ENOTTY; + } + break; + case DEBUG_LITE_AREA: + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG_LITE_AREA, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug lite area\n"); + ret = -ENOTTY; + } + break; + case DEBUG_LITE_PEN: + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG_LITE_PEN, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug lite pen\n"); + ret = -ENOTTY; + } + } + break; +#else + case DEBUG_LITE_ROI: + check_debugLite = ili_ic_check_debug_lite_support(DATA_FORMAT_DEBUG_LITE_ROI, false, &cmd[1]); + if ( check_debugLite == ENABLE) { + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG_LITE_ROI, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug lite roi\n"); + ret = -ENOTTY; + } + } else if (check_debugLite == DISABLE){ + ILI_INFO("no support DEBUG LITE ROI mode, set to debug mode\n"); + cmd[0] = DEBUG_MODE; + ili_tp_data_mode_ctrl(cmd); + } else { + ILI_ERR("change DEBUG LITE ROI fail\n"); + } + + break; + case DEBUG_LITE_WINDOW: + check_debugLite = ili_ic_check_debug_lite_support(DATA_FORMAT_DEBUG_LITE_WINDOW, false, &cmd[1]); + if ( check_debugLite == ENABLE) { + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG_LITE_WINDOW, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug lite window\n"); + ret = -ENOTTY; + } + } else if (check_debugLite == DISABLE){ + ILI_INFO("no support DEBUG LITE WINDOW mode, set to debug mode\n"); + cmd[0] = DEBUG_MODE; + ili_tp_data_mode_ctrl(cmd); + } else { + ILI_ERR("change DEBUG LITE WINDOW fail\n"); + } + break; + case DEBUG_LITE_AREA: + check_debugLite = ili_ic_check_debug_lite_support(DATA_FORMAT_DEBUG_LITE_AREA, false, &cmd[1]); + if ( check_debugLite == ENABLE) { + if (ili_set_tp_data_len(DATA_FORMAT_DEBUG_LITE_AREA, false, &cmd[1]) < 0) { + ILI_ERR("Failed to set debug lite area\n"); + ret = -ENOTTY; + } + } else if (check_debugLite == DISABLE){ + ILI_INFO("no support DEBUG LITE AREA mode, set to debug mode\n"); + cmd[0] = DEBUG_MODE; + ili_tp_data_mode_ctrl(cmd); + } else { + ILI_ERR("change DEBUG LITE AREA fail\n"); + } + break; + case DEBUG_LITE_PEN: + ILI_INFO("SPI no support debug lite pen\n"); + break; +#endif + case DEBUG_PEN_ONLY_MODE: + if (ilits->PenType == POSITION_PEN_TYPE_ON) { + ilits->pen_info.report_type = P5_X_ONLY_PEN_TYPE; + if (ili_set_pen_data_len(P5_X_NEW_CONTROL_FORMAT, DATA_FORMAT_DEBUG_PEN_CMD, cmd[1]) < 0) { + ILI_ERR("Failed to set debug pen, Data Type : 0x%X\n", cmd[1]); + ret = -ENOTTY; + } + } else { + ILI_INFO("no support debug pen only\n"); + } + break; + case DEBUG_HAND_ONLY_MODE: + ilits->pen_info.report_type = P5_X_ONLY_HAND_TYPE; + if (ili_set_pen_data_len(P5_X_NEW_CONTROL_FORMAT, DATA_FORMAT_DEBUG_HAND_CMD, cmd[1]) < 0) { + ILI_ERR("Failed to set debug hand data\n"); + ret = -ENOTTY; + } + break; + default: + ILI_ERR("Unknown TP mode ctrl\n"); + ret = -ENOTTY; + break; + } + ilits->tp_data_mode = cmd[0]; + + return ret; +} + +int ili_mp_lcm_off_env_ctrl(u8 lcm_on) +{ + int ret = 0; + ILI_INFO("set mp lcm off env to %d\n", lcm_on); + if (lcm_on == ENABLE) { + if (ENABLE_WQ_ESD) + ilits->esd_func_ctrl = ENABLE; + + /* enable esd recovery */ + ili_wq_ctrl(WQ_ESD, ENABLE); + } else { + /* disable esd recovery */ + ili_wq_ctrl(WQ_ESD, DISABLE); + + if (ENABLE_WQ_ESD) + ilits->esd_func_ctrl = DISABLE; + + /* enable gesture */ + ilits->gesture = ENABLE; + } + return ret; + +} + +static ssize_t ilitek_node_ioctl_write(struct file *filp, const char *buff, size_t size, loff_t *pos) +{ + int i, ret = 0, count = 0; + char cmd[512] = {0}; + char *token = NULL, *cur = NULL; + u8 temp[256] = {0}; + u32 *data = NULL; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if ((size - 1) > sizeof(cmd)) { + ILI_ERR("ERROR! input length is larger than local buffer\n"); + return -1; + } + + mutex_lock(&ilits->touch_mutex); + + if (buff != NULL) { + if (copy_from_user(cmd, buff, size - 1)) { + ILI_INFO("Failed to copy data from user space\n"); + return -1; + } + } + + ILI_INFO("size = %d, cmd = %s\n", (int)size, cmd); + + token = cur = cmd; + + data = kcalloc(512, sizeof(u32), GFP_KERNEL); + if (ERR_ALLOC_MEM(data)) { + ILI_ERR("Failed to allocate data mem\n"); + size = -1; + goto out; + } + + while ((token = strsep(&cur, ",")) != NULL) { + data[count] = ili_str2hex(token); + ILI_INFO("data[%d] = %x\n", count, data[count]); + count++; + } + + ILI_INFO("cmd = %s\n", cmd); + + if (strncmp(cmd, "hwreset", strlen(cmd)) == 0) { + if (ilits->cascade_info_block.nNum != 0) { + ili_cascade_reset_ctrl(TP_HW_RST_ONLY, true); + } else { + ili_reset_ctrl(TP_HW_RST_ONLY); + } + } else if (strcmp(cmd, "rawdatarecore") == 0) { + if (data[1] == ENABLE_RECORD) + ili_get_tp_recore_ctrl(ENABLE_RECORD); + else if (data[1] == DATA_RECORD) + ili_get_tp_recore_ctrl(DATA_RECORD); + else if (data[1] == DISABLE_RECORD) + ili_get_tp_recore_ctrl(DISABLE_RECORD); + } else if (strcmp(cmd, "switchdemodebuginfomode") == 0) { + u8 data_type; + data_type = data[1] & 0xFF; + ili_set_tp_data_len(DATA_FORMAT_DEMO_DEBUG_INFO, false, &data_type); + } else if (strcmp(cmd, "gesturedemoen") == 0) { + u8 data_type; + data_type = data[2] & 0xFF; + if (data[1] == DISABLE) + ilits->gesture_demo_ctrl = DISABLE; + else + ilits->gesture_demo_ctrl = ENABLE; + ili_set_tp_data_len(DATA_FORMAT_GESTURE_DEMO, false, &data_type); + } else if (strcmp(cmd, "gesturefailrsn") == 0) { + if (data[1] == DISABLE) + ili_gesture_fail_reason(DISABLE); + else + ili_gesture_fail_reason(ENABLE); + ILI_INFO("%s gesture fail reason\n", data[1] ? "ENABLE" : "DISABLE"); + } else if (strncmp(cmd, "icwholereset", strlen(cmd)) == 0) { + if (ilits->cascade_info_block.nNum != 0) { + ili_cascade_reset_ctrl(TP_IC_WHOLE_RST_WITH_FLASH, true); + } else { + ili_ice_mode_ctrl(ENABLE, OFF); + ili_reset_ctrl(TP_IC_WHOLE_RST_WITH_FLASH); + } + } else if (strncmp(cmd, "icwholeresetwithoutflash", strlen(cmd)) == 0) { + if (ilits->cascade_info_block.nNum != 0) { + ili_cascade_reset_ctrl(TP_IC_WHOLE_RST_WITHOUT_FLASH, true); + } else { + ili_ice_mode_ctrl(ENABLE, OFF); + ili_reset_ctrl(TP_IC_WHOLE_RST_WITHOUT_FLASH); + } + } else if (strncmp(cmd, "iccodereset", strlen(cmd)) == 0) { + if (ilits->cascade_info_block.nNum != 0) { + ili_cascade_reset_ctrl(TP_IC_CODE_RST, true); + } else { + ili_ice_mode_ctrl(ENABLE, OFF); + ili_reset_ctrl(TP_IC_CODE_RST); + ili_ice_mode_ctrl(DISABLE, OFF); + } + } else if (strncmp(cmd, "enableirq", strlen(cmd)) == 0) { + ILI_INFO("Enable IRQ\n"); + ili_irq_enable(); + } else if (strncmp(cmd, "disableirq", strlen(cmd)) == 0) { + ILI_INFO("Disable IRQ\n"); + ili_irq_disable(); + } else if (strncmp(cmd, "infofromhex", strlen(cmd)) == 0) { + ilits->info_from_hex = data[1]; + ILI_INFO("info from hex = %d\n", data[1]); + } else if (strncmp(cmd, "getinfo", strlen(cmd)) == 0) { +#if (TDDI_INTERFACE == BUS_I2C) + ilits->info_from_hex = DISABLE; +#endif + + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_ic_get_info(true, true) < 0) + ILI_ERR("Slave Chip info is incorrect\n"); + } else { + ili_ice_mode_ctrl(ENABLE, OFF); + ili_ic_get_info(); + ili_ice_mode_ctrl(DISABLE, OFF); + } + + ili_ic_get_all_info(); + ILI_INFO("Driver version = %s\n", DRIVER_VERSION); + ILI_INFO("TP module = %s\n", ilits->md_name); +#if (TDDI_INTERFACE == BUS_I2C) + ilits->info_from_hex = ENABLE; +#endif + } else if (strncmp(cmd, "enableicemode", strlen(cmd)) == 0) { + bool mcu; + u8 mode; + mcu = data[1] & BIT(0); + mode = data[2] & 0x0F; + + if (ilits->cascade_info_block.nNum != 0) { +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(ENABLE, mcu, mode); +#else + if (mode == MASTER) { + ili_ice_mode_ctrl(ENABLE, mcu); + } else { + ili_set_bypass_mode(mcu); + } +#endif + } else { + ili_ice_mode_ctrl(ENABLE, mcu); + } + } else if (strncmp(cmd, "wqctrl", strlen(cmd)) == 0) { + ilits->wq_ctrl = !ilits->wq_ctrl; + ILI_INFO("wq_ctrl flag= %d\n", ilits->wq_ctrl); + } else if (strcmp(cmd, "spiwrslavereg") == 0 || strcmp(cmd, "slavectrl") == 0) { + ilits->slave_wr_ctrl = (data[1] == ENABLE) ? SLAVE: MASTER; + ILI_INFO(" %s slave write read ctrl = %x\n", ilits->slave_wr_ctrl ? "Enable" : "Disable", ilits->slave_wr_ctrl); + } + else if (strncmp(cmd, "file_write", strlen(cmd)) == 0) { + /*For Wacom Test Pen ID*/ + struct file_buffer csv; + + memset(csv.fname, 0, sizeof(csv.fname)); + snprintf(csv.fname, sizeof(csv.fname), "%s", PEN_ID_NODE_TEST_PATH); + csv.wlen = 0; + csv.max_size = TXT_FILE_SIZE; + + csv.ptr = vmalloc(csv.max_size); + if (ERR_ALLOC_MEM(csv.ptr)) { + ILI_ERR("Failed to allocate CSV mem\n"); + ipio_vfree((void **)&csv.ptr); + } + + memset(csv.ptr, 0, csv.max_size); + csv.wlen += snprintf(csv.ptr + csv.wlen, (csv.max_size - csv.wlen), "PEN_ID = 0x"); + for(i = 0; i < P5_X_PEN_ID_LEN; i++) { + ILI_INFO("Pen ID[%d] = 0x%02X", i, ilits->pen_info.pen_id[P5_X_PEN_ID_LEN - 1 - i]); + csv.wlen += snprintf(csv.ptr + csv.wlen, (csv.max_size - csv.wlen), "%02X", ilits->pen_info.pen_id[P5_X_PEN_ID_LEN - 1 - i]); + } + ILI_INFO("\n"); + csv.wlen += snprintf(csv.ptr + csv.wlen, (csv.max_size - csv.wlen), "\n"); + file_write(&csv, true); + + }else if (strncmp(cmd, "disableicemode", strlen(cmd)) == 0) { + bool mcu; + u8 mode; + mcu = data[1] & BIT(0); + mode = data[2] & 0x0F; + + if (ilits->cascade_info_block.nNum != 0) { +#if (TDDI_INTERFACE == BUS_I2C) + ili_ice_mode_ctrl_by_mode(DISABLE, mcu, mode); +#else + ili_ice_mode_ctrl(DISABLE, mcu); +#endif + } else { + ili_ice_mode_ctrl(DISABLE, mcu); + } + } else if (strncmp(cmd, "enablewqesd", strlen(cmd)) == 0) { + ili_wq_ctrl(WQ_ESD, ENABLE); + } else if (strncmp(cmd, "enablewqbat", strlen(cmd)) == 0) { + ili_wq_ctrl(WQ_BAT, ENABLE); + } else if (strncmp(cmd, "disablewqesd", strlen(cmd)) == 0) { + ili_wq_ctrl(WQ_ESD, DISABLE); + } else if (strncmp(cmd, "disablewqbat", strlen(cmd)) == 0) { + ili_wq_ctrl(WQ_BAT, DISABLE); + } else if (strncmp(cmd, "gesture", strlen(cmd)) == 0) { + ilits->gesture = !ilits->gesture; + ILI_INFO("gesture = %d\n", ilits->gesture); + } else if (strncmp(cmd, "gestureon", strlen(cmd)) == 0) { + ilits->gesture = ENABLE; + ILI_INFO("gestureon = %d\n", ilits->gesture); + } else if (strncmp(cmd, "gestureoff", strlen(cmd)) == 0) { + ilits->gesture = DISABLE; + ILI_INFO("gestureoff = %d\n", ilits->gesture); + } else if (strncmp(cmd, "esdgesture", strlen(cmd)) == 0) { + ilits->pll_clk_wakeup = true; + if (ili_gesture_recovery() < 0) { + ILI_ERR("Gesture recovery failed\n"); + size = -1; + } + } else if (strncmp(cmd, "esdspi", strlen(cmd)) == 0) { + ili_spi_recovery(); + } else if (strncmp(cmd, "sleepin", strlen(cmd)) == 0) { + ili_ic_func_ctrl("sleep", SLEEP_IN); + } else if (strncmp(cmd, "deepsleepin", strlen(cmd)) == 0) { + ili_ic_func_ctrl("sleep", DEEP_SLEEP_IN); + } else if (strncmp(cmd, "iceflag", strlen(cmd)) == 0) { + if (data[1] == ENABLE) + atomic_set(&ilits->ice_stat, ENABLE); + else + atomic_set(&ilits->ice_stat, DISABLE); + ILI_INFO("ice mode flag = %d\n", atomic_read(&ilits->ice_stat)); + } else if (strncmp(cmd, "gesturenormal", strlen(cmd)) == 0) { + ilits->gesture_mode = DATA_FORMAT_GESTURE_NORMAL; + ILI_INFO("gesture mode = %d\n", ilits->gesture_mode); + } else if (strncmp(cmd, "gestureinfo", strlen(cmd)) == 0) { + ilits->gesture_mode = DATA_FORMAT_GESTURE_INFO; + ILI_INFO("gesture mode = %d\n", ilits->gesture_mode); + } else if (strncmp(cmd, "switchtestmode", strlen(cmd)) == 0) { + ili_switch_tp_mode(P5_X_FW_TEST_MODE); + } else if (strncmp(cmd, "switchdebugmode", strlen(cmd)) == 0) { + u8 data_type; + data_type = data[1] & 0xFF; + ili_set_tp_data_len(DATA_FORMAT_DEBUG, false, &data_type); + } else if (strncmp(cmd, "switchdemomode", strlen(cmd)) == 0) { + u8 data_type; + data_type = data[1] & 0xFF; + ili_set_tp_data_len(DATA_FORMAT_DEMO, false, &data_type); + } else if (strncmp(cmd, "switchgesturedebugmode", strlen(cmd)) == 0) { + u8 data_type; + data_type = data[1] & 0xFF; + ili_set_tp_data_len(DATA_FORMAT_GESTURE_DEBUG, false, &data_type); + } else if (strncmp(cmd, "dbgflag", strlen(cmd)) == 0) { + ilits->dnp = !ilits->dnp; + ILI_INFO("debug flag message = %d\n", ilits->dnp); + } else if (strncmp(cmd, "spiclk", strlen(cmd)) == 0) { + ILI_INFO("spi clk num = %d\n", data[1]); + ili_core_spi_setup(data[1]); + } else if (strncmp(cmd, "ss", strlen(cmd)) == 0) { + ILI_INFO("sense_stop = %d\n", data[1]); + ilits->ss_ctrl = data[1]; + } else if (strncmp(cmd, "iow", strlen(cmd)) == 0) { + int w_len = 0; + w_len = data[1]; + ILI_INFO("w_len = %d\n", w_len); + for (i = 0; i < w_len; i++) { + temp[i] = data[2 + i]; + ILI_INFO("write[%d] = %x\n", i, temp[i]); + } + + ilits->wrapper(temp, w_len, NULL, 0, ON, OFF); + } else if (strncmp(cmd, "ior", strlen(cmd)) == 0) { + int r_len = 0; + r_len = data[1]; + ILI_INFO("r_len = %d\n", r_len); + ilits->wrapper(NULL, 0, temp, r_len, ON, OFF); + for (i = 0; i < r_len; i++) + ILI_INFO("read[%d] = %x\n", i, temp[i]); + } else if (strncmp(cmd, "iowr", strlen(cmd)) == 0) { + int delay = 0; + int w_len = 0, r_len = 0; + w_len = data[1]; + r_len = data[2]; + delay = data[3]; + ILI_INFO("w_len = %d, r_len = %d, delay = %d\n", w_len, r_len, delay); + + for (i = 0; i < w_len; i++) { + temp[i] = data[4 + i]; + ILI_INFO("write[%d] = %x\n", i, temp[i]); + } + ret = ilits->wrapper(temp, w_len, NULL, 0, OFF, OFF); + memset(temp, 0, sizeof(temp)); + mdelay(delay); + ilits->wrapper(NULL, 0, temp, r_len, OFF, OFF); + for (i = 0; i < r_len; i++) + ILI_INFO("read[%d] = %x\n", i, temp[i]); + } else if (strcmp(cmd, "iowrint") == 0) { + int delay = 0; + int w_len = 0, r_len = 0; + w_len = data[1]; + r_len = data[2]; + delay = data[3]; + ILI_INFO("w_len = %d, r_len = %d, delay = %d\n", w_len, r_len, delay); + for (i = 0; i < w_len; i++) { + temp[i] = data[4 + i]; + ILI_INFO("write[%d] = %x\n", i, temp[i]); + } + ret = ilits->wrapper(temp, w_len, temp, r_len, ON, ON); + for (i = 0; i < r_len; i++) + ILI_INFO("read[%d] = %x\n", i, temp[i]); + } else if (strncmp(cmd, "getddiregdata", strlen(cmd)) == 0) { + u8 ddi_data = 0; + ILI_INFO("Get ddi reg one page: page = %x, reg = %x\n", data[1], data[2]); + if (ilits->cascade_info_block.nNum != 0) { + ili_ic_get_cascade_ddi_reg_onepage(data[1], data[2], &ddi_data, OFF); + } else { + ili_ic_get_ddi_reg_onepage(data[1], data[2], &ddi_data, OFF); + } + ILI_INFO("ddi_data = %x\n", ddi_data); + } else if (strncmp(cmd, "setddiregdata", strlen(cmd)) == 0) { + ILI_INFO("Set ddi reg one page: page = %x, reg = %x, data = %x\n", data[1], data[2], data[3]); + if (ilits->cascade_info_block.nNum != 0) { + ili_ic_set_cascade_ddi_reg_onepage(data[1], data[2], data[3], OFF); + } else { + ili_ic_set_ddi_reg_onepage(data[1], data[2], data[3], OFF); + } + } else if (strncmp(cmd, "dumpflashdata", strlen(cmd)) == 0) { + ilits->fw_update_stat = FW_STAT_INIT; + ILI_INFO("Start = 0x%x, End = 0x%x, Dump Hex path = %s\n", data[1], data[2], DUMP_FLASH_PATH); + ret = ili_fw_dump_flash_data(data[1], data[2], false, OFF); + ilits->fw_update_stat = (ret < 0) ? FW_UPDATE_FAIL : FW_UPDATE_PASS; + ILI_INFO("ilits->fw_update_stat = %d\n", ilits->fw_update_stat); + } else if (strncmp(cmd, "dumpiramdata", strlen(cmd)) == 0) { + ILI_INFO("Start = 0x%x, End = 0x%x, Dump IRAM path = %s\n", data[1], data[2], DUMP_IRAM_PATH); + ilits->fw_update_stat = FW_STAT_INIT; + ret = ili_fw_dump_iram_data(data[1], data[2], true, OFF); + ilits->fw_update_stat = (ret < 0) ? FW_UPDATE_FAIL : FW_UPDATE_PASS; + ILI_INFO("ilits->fw_update_stat = %d\n", ilits->fw_update_stat); + } else if (strncmp(cmd, "edge_palm_ctrl", strlen(cmd)) == 0) { + ili_ic_func_ctrl("edge_palm", data[1]); + } else if (strncmp(cmd, "uart_mode_ctrl", strlen(cmd)) == 0) { + ili_fw_uart_ctrl(data[1]); + } else if (strncmp(cmd, "flashesdgesture", strlen(cmd)) == 0) { + ili_touch_esd_gesture_flash(); + } else if (strncmp(cmd, "intact", strlen(cmd)) == 0) { + ILI_INFO("Set INT trigger = %x\n", data[1]); + ili_ic_int_trigger_ctrl(data[1]); + } else if (strncmp(cmd, "spiw", strlen(cmd)) == 0) { + int wlen; + wlen = data[1]; + temp[0] = 0x82; + for (i = 0; i < wlen; i++) { + temp[i] = data[2 + i]; + ILI_INFO("write[%d] = %x\n", i, temp[i]); + } + ilits->spi_write_then_read(ilits->spi, temp, wlen, NULL, 0); + } else if (strncmp(cmd, "spir", strlen(cmd)) == 0) { + int rlen; + u8 *rbuf = NULL; + rlen = data[1]; + rbuf = kzalloc(rlen, GFP_KERNEL | GFP_DMA); + if (ERR_ALLOC_MEM(rbuf)) { + ILI_ERR("Failed to allocate dma_rxbuf, %ld\n", PTR_ERR(rbuf)); + kfree(rbuf); + goto out; + } + temp[0] = 0x83; + ilits->spi_write_then_read(ilits->spi, temp, 1, rbuf, rlen); + for (i = 0; i < rlen; i++) + ILI_INFO("read[%d] = %x\n", i, rbuf[i]); + kfree(rbuf); + } else if (strncmp(cmd, "spirw", strlen(cmd)) == 0) { + int wlen, rlen; + u8 *rbuf = NULL; + wlen = data[1]; + rlen = data[2]; + for (i = 0; i < wlen; i++) { + temp[i] = data[3 + i]; + ILI_INFO("write[%d] = %x\n", i, temp[i]); + } + if (rlen != 0) { + rbuf = kzalloc(rlen, GFP_KERNEL | GFP_DMA); + if (ERR_ALLOC_MEM(rbuf)) { + ILI_ERR("Failed to allocate dma_rxbuf, %ld\n", PTR_ERR(rbuf)); + kfree(rbuf); + goto out; + } + } + ilits->spi_write_then_read(ilits->spi, temp, wlen, rbuf, rlen); + if (rlen != 0) { + for (i = 0; i < rlen; i++) + ILI_INFO("read[%d] = %x\n", i, rbuf[i]); + } + kfree(rbuf); + } else if (strncmp(cmd, "ges_sym", strlen(cmd)) == 0) { + struct gesture_symbol *ptr_sym = &ilits->ges_sym; + u8 *ptr; + ptr = (u8 *) ptr_sym; + ptr[0] = data[1]; + ptr[1] = data[2]; + ptr[2] = data[3]; + ili_dump_data(ptr, 8, 3, 0, "Gesture symbol"); + } else if (strncmp(cmd, "mode", strlen(cmd)) == 0) { + temp[0] = data[1]; + temp[1] = data[2]; + temp[2] = data[3]; + temp[3] = data[4]; + temp[4] = data[5]; + temp[5] = data[6]; + ret = ili_tp_data_mode_ctrl(temp); + } else if (strncmp(cmd, "switchmpretry", strlen(cmd)) == 0) { + ilits->mp_retry = !ilits->mp_retry; + ILI_INFO("switchmpretry = %d\n", ilits->mp_retry); + } else if (strncmp(cmd, "edgepalmpara", strlen(cmd)) == 0) { + ilits->edge_palm_para[0] = P5_X_EDGE_PLAM_CTRL_1; + ilits->edge_palm_para[1] = P5_X_EDGE_PALM_TUNING_PARA; + for (i = 0; i < 14; i++) { + ilits->edge_palm_para[i * 2 + 2] = (data[i + 1] & 0xFF00) >> 8; + ilits->edge_palm_para[i * 2 + 3] = data[i + 1] & 0xFF; + } + ilits->edge_palm_para[30] = ili_calc_packet_checksum(ilits->edge_palm_para + , P5_X_EDGE_PALM_PARA_LENGTH - 1); + + for (i = 0; i < P5_X_EDGE_PALM_PARA_LENGTH; i++) { + ILI_INFO("edge_palm_para[%d] = 0x%2x\n", i, ilits->edge_palm_para[i]); + } + + ili_ic_send_edge_palm_para(); +#ifdef ROI + } else if (strncmp(cmd, "knuckle", strlen(cmd)) == 0) { + ilits->knuckle = !ilits->knuckle; + if (ilits->knuckle == true) { + ili_config_knuckle_roi_ctrl(CMD_ENABLE); + } else { + ili_config_knuckle_roi_ctrl(CMD_DISABLE); + } + ILI_INFO("knuckle = %s\n", ilits->knuckle ? "ENABLE" : "DISABLE"); +#endif + } else if (strncmp(cmd, "proxfacemode", strlen(cmd)) == 0) { + ilits->proxmity_face = false; + ilits->prox_face_mode = data[1] & 0xFF; + if (data[1] != 0x00) { + if (ilits->prox_face_mode == PROXIMITY_BACKLIGHT) { + data[1] = 0x01; + } + if (ili_ic_func_ctrl("proximity", data[1]) < 0) { + ILI_ERR("Write proximity cmd failed\n"); + } + } else { + if (ili_ic_func_ctrl("proximity", 0x00) < 0) { + ILI_ERR("Write proximity cmd failed\n"); + } + } + ilits->power_status = true; + ILI_INFO("switch proximity face mode = %d, level = %d\n", ilits->prox_face_mode, data[1]); + } else if (strncmp(cmd, "mp_lcm_off_env", strlen(cmd)) == 0) { + ili_mp_lcm_off_env_ctrl(data[1]); + } else if (strncmp(cmd, "releasetouch", strlen(cmd)) == 0) { + ILI_INFO("ioctl: release all touch\n"); + ili_touch_release_all_point(); + } else if (strncmp(cmd, "releasepen", strlen(cmd)) == 0) { + ILI_INFO("ioctl: release pen\n"); + ili_pen_release(); + } else { + ILI_ERR("Unknown command\n"); + size = -1; + } +out: + ipio_kfree((void **)&data); + mutex_unlock(&ilits->touch_mutex); + return size; +} + +#ifdef CONFIG_COMPAT +static long ilitek_node_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + long ret = 0; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (!filp->f_op || !filp->f_op->unlocked_ioctl) { + ILI_ERR("There's no unlocked_ioctl defined in file\n"); + return -ENOTTY; + } + + ILI_DBG("cmd = %d\n", _IOC_NR(cmd)); + + switch (cmd) { + case ILITEK_COMPAT_IOCTL_I2C_WRITE_DATA: + ILI_DBG("compat_ioctl: convert i2c/spi write\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_I2C_WRITE_DATA, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_I2C_READ_DATA: + ILI_DBG("compat_ioctl: convert i2c/spi read\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_I2C_READ_DATA, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_I2C_SET_WRITE_LENGTH: + ILI_DBG("compat_ioctl: convert set write length\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_I2C_SET_WRITE_LENGTH, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_I2C_SET_READ_LENGTH: + ILI_DBG("compat_ioctl: convert set read length\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_I2C_SET_READ_LENGTH, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_HW_RESET: + ILI_DBG("compat_ioctl: convert hw reset\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_HW_RESET, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_POWER_SWITCH: + ILI_DBG("compat_ioctl: convert power switch\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_POWER_SWITCH, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_REPORT_SWITCH: + ILI_DBG("compat_ioctl: convert report switch\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_REPORT_SWITCH, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_IRQ_SWITCH: + ILI_DBG("compat_ioctl: convert irq switch\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_IRQ_SWITCH, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_DEBUG_LEVEL: + ILI_DBG("compat_ioctl: convert debug level\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_DEBUG_LEVEL, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_FUNC_MODE: + ILI_DBG("compat_ioctl: convert format mode\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_FUNC_MODE, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_FW_VER: + ILI_DBG("compat_ioctl: convert set read length\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_FW_VER, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_PL_VER: + ILI_DBG("compat_ioctl: convert fw version\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_PL_VER, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_CORE_VER: + ILI_DBG("compat_ioctl: convert core version\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_CORE_VER, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_DRV_VER: + ILI_DBG("compat_ioctl: convert driver version\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_DRV_VER, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_CHIP_ID: + ILI_DBG("compat_ioctl: convert chip id\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_CHIP_ID, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_MODE_CTRL: + ILI_DBG("compat_ioctl: convert tp mode ctrl\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_MODE_CTRL, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_MODE_STATUS: + ILI_DBG("compat_ioctl: convert tp mode status\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_MODE_STATUS, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_ICE_MODE_SWITCH: + ILI_DBG("compat_ioctl: convert tp mode switch\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_ICE_MODE_SWITCH, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_INTERFACE_TYPE: + ILI_DBG("compat_ioctl: convert interface type\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_INTERFACE_TYPE, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_DUMP_FLASH: + ILI_DBG("compat_ioctl: convert dump flash\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_DUMP_FLASH, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_FW_UART_CTRL: + ILI_DBG("compat_ioctl: convert fw uart\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_FW_UART_CTRL, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_PANEL_INFO: + ILI_DBG("compat_ioctl: convert resolution\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_PANEL_INFO, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_TP_INFO: + ILI_DBG("compat_ioctl: convert tp info\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_TP_INFO, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_WRAPPER_RW: + ILI_DBG("compat_ioctl: convert wrapper\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_WRAPPER_RW, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_DDI_WRITE: + ILI_DBG("compat_ioctl: convert ddi write\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_DDI_WRITE, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_DDI_READ: + ILI_DBG("compat_ioctl: convert ddi read\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_DDI_READ, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_REPORT_RATE_SET: + ILI_DBG("compat_ioctl: convert report rate set\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_REPORT_RATE_SET, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_MP_LCM_OFF_ENV: + ILI_DBG("compat_ioctl: mp lcm env\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_MP_LCM_OFF_ENV, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_RELEASE_TOUCH: + ILI_DBG("compat_ioctl: release touch\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_RELEASE_TOUCH, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_LCM_STATUS: + ILI_DBG("compat_ioctl: lcm status\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_LCM_STATUS, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_SLAVE_CTRL: + ILI_DBG("compat_ioctl: lcm status\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_SLAVE_CTRL, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_CASCADE_REG_RW: + ILI_DBG("compat_ioctl: lcm status\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_CASCADE_REG_RW, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_INTERFACE_GET: + ILI_DBG("compat_ioctl: get interface\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_INTERFACE_GET, (unsigned long)compat_ptr(arg)); + return ret; + case ILITEK_COMPAT_IOCTL_ICE_MODE_FLAG_SET: + ILI_DBG("compat_ioctl: ice mode flag set\n"); + ret = filp->f_op->unlocked_ioctl(filp, ILITEK_IOCTL_ICE_MODE_FLAG_SET, (unsigned long)compat_ptr(arg)); + return ret; + default: + ILI_ERR("no ioctl cmd, return ilitek_node_ioctl\n"); + return -ENOIOCTLCMD; + } +} +#endif + +static long ilitek_node_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + int ret = 0, length = 0; + u8 *szBuf = NULL, if_to_user = 0; + static u16 i2c_rw_length; + u32 id_to_user[64] = {0}; + bool esd_en = ilits->wq_esd_ctrl, bat_en = ilits->wq_bat_ctrl; + u8 *wrap_rbuf = NULL, wrap_int = 0; + u16 wrap_wlen = 0, wrap_rlen = 0; + bool spi_irq, i2c_irq; + bool read = 0; + u32 type, addr, read_data, write_data, write_len; + + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + if (_IOC_TYPE(cmd) != ILITEK_IOCTL_MAGIC) { + ILI_ERR("The Magic number doesn't match\n"); + return -ENOTTY; + } + + if (_IOC_NR(cmd) > ILITEK_IOCTL_MAXNR) { + ILI_ERR("The number of ioctl doesn't match\n"); + return -ENOTTY; + } + + ILI_DBG("cmd = %d\n", _IOC_NR(cmd)); + + mutex_lock(&ilits->touch_mutex); + + szBuf = kcalloc(IOCTL_I2C_BUFF, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(szBuf)) { + ILI_ERR("Failed to allocate mem\n"); + ret = -ENOMEM; + goto out; + } + + if (esd_en) + ili_wq_ctrl(WQ_ESD, DISABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, DISABLE); + + switch (cmd) { + case ILITEK_IOCTL_I2C_WRITE_DATA: + ILI_DBG("ioctl: write len = %d\n", i2c_rw_length); + + if (i2c_rw_length > IOCTL_I2C_BUFF) { + ILI_ERR("ERROR! write len is largn than ioctl buf (%d, %ld)\n", + i2c_rw_length, IOCTL_I2C_BUFF); + ret = -ENOTTY; + break; + } + + if (copy_from_user(szBuf, (u8 *) arg, i2c_rw_length)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + ret = ilits->wrapper(szBuf, i2c_rw_length, NULL, 0, OFF, OFF); + if (ret < 0) + ILI_ERR("Failed to write data\n"); + break; + case ILITEK_IOCTL_I2C_READ_DATA: + ILI_DBG("ioctl: read len = %d\n", i2c_rw_length); + + if (i2c_rw_length > IOCTL_I2C_BUFF) { + ILI_ERR("ERROR! read len is largn than ioctl buf (%d, %ld)\n", + i2c_rw_length, IOCTL_I2C_BUFF); + ret = -ENOTTY; + break; + } + + ret = ilits->wrapper(NULL, 0, szBuf, i2c_rw_length, OFF, OFF); + if (ret < 0) { + ILI_ERR("Failed to read data\n"); + break; + } + + if (copy_to_user((u8 *) arg, szBuf, i2c_rw_length)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_I2C_SET_WRITE_LENGTH: + case ILITEK_IOCTL_I2C_SET_READ_LENGTH: + i2c_rw_length = arg; + break; + case ILITEK_IOCTL_TP_HW_RESET: + ILI_DBG("ioctl: hw reset\n"); + if (ilits->cascade_info_block.nNum != 0) { + ili_wdt_reset_status(true, false); + } + ili_reset_ctrl(ilits->reset); + break; + case ILITEK_IOCTL_TP_POWER_SWITCH: + ILI_INFO("Not implemented yet\n"); + break; + case ILITEK_IOCTL_TP_REPORT_SWITCH: + if (copy_from_user(szBuf, (u8 *) arg, 1)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + ILI_DBG("ioctl: report switch = %d\n", szBuf[0]); + if (szBuf[0]) { + ilits->report = ENABLE; + ILI_DBG("report is enabled\n"); + } else { + ilits->report = DISABLE; + ILI_DBG("report is disabled\n"); + } + break; + case ILITEK_IOCTL_TP_IRQ_SWITCH: + if (copy_from_user(szBuf, (u8 *) arg, 1)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + ILI_DBG("ioctl: irq switch = %d\n", szBuf[0]); + if (szBuf[0]) + ili_irq_enable(); + else + ili_irq_disable(); + break; + case ILITEK_IOCTL_TP_DEBUG_LEVEL: + if (copy_from_user(szBuf, (u8 *) arg, sizeof(u32))) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + debug_en = !debug_en; + ILI_DBG("debug_en = %d", debug_en); + break; + case ILITEK_IOCTL_TP_FUNC_MODE: + if (copy_from_user(szBuf, (u8 *) arg, 3)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + ILI_DBG("ioctl: set func mode = %x,%x,%x\n", szBuf[0], szBuf[1], szBuf[2]); + ret = ilits->wrapper(szBuf, 3, NULL, 0, ON, OFF); + break; + case ILITEK_IOCTL_TP_FW_VER: + ILI_DBG("ioctl: get fw and mp version\n"); + szBuf[7] = ilits->chip->fw_mp_ver & 0xFF; + szBuf[6] = (ilits->chip->fw_mp_ver >> 8) & 0xFF; + szBuf[5] = (ilits->chip->fw_mp_ver >> 16) & 0xFF; + szBuf[4] = ilits->chip->fw_mp_ver >> 24; + szBuf[3] = ilits->chip->fw_ver & 0xFF; + szBuf[2] = (ilits->chip->fw_ver >> 8) & 0xFF; + szBuf[1] = (ilits->chip->fw_ver >> 16) & 0xFF; + szBuf[0] = ilits->chip->fw_ver >> 24; + ILI_DBG("Firmware version = %d.%d.%d.%d\n", szBuf[0], szBuf[1], szBuf[2], szBuf[3]); + ILI_DBG("Firmware MP version = %d.%d.%d.%d\n", szBuf[4], szBuf[5], szBuf[6], szBuf[7]); + + if (copy_to_user((u8 *) arg, szBuf, 8)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_TP_PL_VER: + ILI_DBG("ioctl: get protocl version\n"); + szBuf[2] = ilits->protocol->ver & 0xFF; + szBuf[1] = (ilits->protocol->ver >> 8) & 0xFF; + szBuf[0] = ilits->protocol->ver >> 16; + ILI_DBG("Protocol version = %d.%d.%d\n", szBuf[0], szBuf[1], szBuf[2]); + + if (copy_to_user((u8 *) arg, szBuf, 3)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_TP_CORE_VER: + ILI_DBG("ioctl: get core version\n"); + if (ilits->protocol->core_ver_len == P5_X_CORE_VER_THREE_LENGTH) + szBuf[3] = 0xFF; + else + szBuf[3] = ilits->chip->core_ver & 0xFF; + szBuf[2] = (ilits->chip->core_ver >> 8) & 0xFF; + szBuf[1] = (ilits->chip->core_ver >> 16) & 0xFF; + szBuf[0] = ilits->chip->core_ver >> 24; + ILI_DBG("Core version = %d.%d.%d.%d, length = %d\n", + szBuf[0], szBuf[1], szBuf[2], szBuf[3], ilits->protocol->core_ver_len); + + if (copy_to_user((u8 *) arg, szBuf, 4)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_TP_DRV_VER: + ILI_DBG("ioctl: get driver version\n"); + length = snprintf(szBuf, USER_STR_BUFF * sizeof(unsigned char), "%s", DRIVER_VERSION); + + if (copy_to_user((u8 *) arg, szBuf, length)) { + ILI_ERR("Failed to copy driver ver to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_TP_CHIP_ID: + ILI_DBG("ioctl: get chip id\n"); + id_to_user[0] = (ilits->chip->product_id << 16) | (ilits->chip->pid & 0x0000FFFF); + id_to_user[1] = ilits->chip->otp_id; + id_to_user[2] = ilits->chip->ana_id; + + if (copy_to_user((u32 *) arg, id_to_user, sizeof(u32) * 3)) { + ILI_ERR("Failed to copy driver ver to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_TP_MODE_CTRL: + if (copy_from_user(szBuf, (u8 *) arg, 10)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + ILI_DBG("ioctl: switch fw format = %d\n", szBuf[0]); + ret = ili_tp_data_mode_ctrl(szBuf); + + break; + case ILITEK_IOCTL_TP_MODE_STATUS: + ILI_DBG("ioctl: current firmware mode = %d", ilits->tp_data_mode); + if (copy_to_user((int *)arg, &ilits->tp_data_mode, sizeof(int))) { + ILI_ERR("Failed to copy driver ver to user space\n"); + ret = -ENOTTY; + } + break; + /* It works for host downloado only */ + case ILITEK_IOCTL_ICE_MODE_SWITCH: + if (copy_from_user(szBuf, (u8 *) arg, 3)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + ILI_DBG("ioctl: switch ice mode = %d, mcu on = %d\n", szBuf[0], szBuf[1]); + + if (ilits->cascade_info_block.nNum != 0) { +#if (TDDI_INTERFACE == BUS_I2C) + if (szBuf[2] == 0) { + /* for wifi daemon flow */ + atomic_set(&ilits->ice_stat, (szBuf[0] == ENABLE) ? DISABLE : ENABLE); + + ili_ice_mode_ctrl_by_mode(szBuf[0] ? ENABLE : DISABLE, + szBuf[1] ? ENABLE : DISABLE, ilits->slave_wr_ctrl); + } else { + ILI_DBG("ioctl: mode = %d\n", szBuf[2]); + + ili_ice_mode_ctrl_by_mode(szBuf[0] ? ENABLE : DISABLE, + szBuf[1] ? ENABLE : DISABLE, szBuf[2]); + } +#elif (TDDI_INTERFACE == BUS_SPI) + if (ilits->slave_wr_ctrl == ENABLE && szBuf[0] == ENABLE) { + ili_set_bypass_mode(szBuf[1]); + } + + /* for wifi daemon flow */ + if (szBuf[0] == ENABLE) + atomic_set(&ilits->ice_stat, DISABLE); + + if (ili_ice_mode_ctrl(szBuf[0] ? ENABLE : DISABLE, + szBuf[1] ? ENABLE : DISABLE) < 0) + ILI_ERR("ioctl: set ice mode failed\n"); +#endif + } else { + if (ili_ice_mode_ctrl(szBuf[0] ? ENABLE : DISABLE, + szBuf[1] ? ENABLE : DISABLE) < 0) + ILI_ERR("ioctl: set ice mode failed\n"); + } + break; + case ILITEK_IOCTL_TP_INTERFACE_TYPE: + if_to_user = ilits->hwif->bus_type; + if (copy_to_user((u8 *) arg, &if_to_user, sizeof(if_to_user))) { + ILI_ERR("Failed to copy driver ver to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_TP_DUMP_FLASH: + ILI_DBG("ioctl: dump flash data\n"); + ret = ili_fw_dump_flash_data(0, 0, true, OFF); + if (ret < 0) { + ILI_ERR("ioctl: Failed to dump flash data\n"); + } + break; + case ILITEK_IOCTL_TP_FW_UART_CTRL: + if (copy_from_user(szBuf, (u8 *) arg, 1)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + ILI_DBG("ioctl: fw UART = %d\n", szBuf[0]); + + ili_fw_uart_ctrl(szBuf[0]); + + if_to_user = szBuf[0]; + + if (copy_to_user((u8 *) arg, &if_to_user, sizeof(if_to_user))) { + ILI_ERR("Failed to copy driver ver to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_TP_PANEL_INFO: + ILI_DBG("ioctl: get panel resolution\n"); + id_to_user[0] = ilits->panel_wid; + id_to_user[1] = ilits->panel_hei; + id_to_user[2] = (ilits->trans_xy) ? 0x1 : 0x0; + + if (copy_to_user((u32 *) arg, id_to_user, sizeof(u32) * 3)) { + ILI_ERR("Failed to copy driver ver to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_TP_INFO: + ILI_DBG("ioctl: get tp info\n"); + id_to_user[0] = ilits->min_x; + id_to_user[1] = ilits->min_y; + id_to_user[2] = ilits->max_x; + id_to_user[3] = ilits->max_y; + id_to_user[4] = ilits->xch_num; + id_to_user[5] = ilits->ych_num; + id_to_user[6] = ilits->stx; + id_to_user[7] = ilits->srx; + + if (copy_to_user((u32 *) arg, id_to_user, sizeof(u32) * 8)) { + ILI_ERR("Failed to copy driver ver to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_WRAPPER_RW: + ILI_DBG("ioctl: wrapper rw\n"); + + if (i2c_rw_length > IOCTL_I2C_BUFF || i2c_rw_length == 0) { + ILI_ERR("ERROR! i2c_rw_length is is invalid\n"); + ret = -ENOTTY; + break; + } + + if (copy_from_user(szBuf, (u8 *) arg, i2c_rw_length)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + wrap_int = szBuf[0]; + wrap_rlen = (szBuf[1] << 8) | szBuf[2]; + wrap_wlen = (szBuf[3] << 8) | szBuf[4]; + + ILI_DBG("wrap_int = %d\n", wrap_int); + ILI_DBG("wrap_rlen = %d\n", wrap_rlen); + ILI_DBG("wrap_wlen = %d\n", wrap_wlen); + + if (wrap_wlen > IOCTL_I2C_BUFF || wrap_rlen > IOCTL_I2C_BUFF) { + ILI_ERR("ERROR! R/W len is largn than ioctl buf\n"); + ret = -ENOTTY; + break; + } + + if (wrap_rlen > 0) { + wrap_rbuf = kcalloc(IOCTL_I2C_BUFF, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(wrap_rbuf)) { + ILI_ERR("Failed to allocate mem\n"); + ret = -ENOMEM; + break; + } + } + + if (wrap_int == 1) { + i2c_irq = ON; + spi_irq = ON; + } else if (wrap_int == 2) { + i2c_irq = OFF; + spi_irq = OFF; + } else { + i2c_irq = OFF; + spi_irq = (wrap_rlen > 0 ? ON : OFF); + } + + ILI_DBG("i2c_irq = %d, spi_irq = %d\n", i2c_irq, spi_irq); + + ilits->wrapper(szBuf + 5, wrap_wlen, wrap_rbuf, wrap_rlen, spi_irq, i2c_irq); + + ili_dump_data(szBuf + 5, 8, wrap_wlen, 16, "wrap_wbuf:"); + ili_dump_data(wrap_rbuf, 8, wrap_rlen, 16, "wrap_rbuf:"); + if (copy_to_user((u8 *) arg, wrap_rbuf, wrap_rlen)) { + ILI_ERR("Failed to copy driver ver to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_DDI_WRITE: + if (copy_from_user(szBuf, (u8 *) arg, 3)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + ILI_DBG("ioctl: page = %x, reg = %x, data = %x\n", szBuf[0], szBuf[1], szBuf[2]); + ili_ic_set_ddi_reg_onepage(szBuf[0], szBuf[1], szBuf[2], OFF); + break; + case ILITEK_IOCTL_DDI_READ: + if (copy_from_user(szBuf, (u8 *) arg, 2)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + ILI_DBG("ioctl: page = %x, reg = %x\n", szBuf[0], szBuf[1]); + ili_ic_get_ddi_reg_onepage(szBuf[0], szBuf[1], &szBuf[2], OFF); + ILI_DBG("ioctl: data = %x\n", szBuf[2]); + if (copy_to_user((u8 *) arg, szBuf + 2, 1)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_REPORT_RATE_SET: + if (copy_from_user(szBuf, (u8 *) arg, 2)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + ILI_INFO("ioctl: set report rate mode = %x\n", szBuf[0]); + if (ili_ic_report_rate_set(szBuf[0]) < 0) { + ILI_ERR("Failed to set report rate\n"); + ret = -ENOTTY; + } + + break; + case ILITEK_IOCTL_REPORT_RATE_GET: + + szBuf[0] = ili_ic_report_rate_get(); + if (copy_to_user((u8 *) arg, szBuf, 1)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_MP_LCM_OFF_ENV: + if (copy_from_user(szBuf, (u8 *) arg, 1)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + ili_mp_lcm_off_env_ctrl(szBuf[0]); + break; + case ILITEK_IOCTL_RELEASE_TOUCH: + ILI_INFO("ioctl: release all touch\n"); + ili_touch_release_all_point(); + break; + case ILITEK_IOCTL_RELEASE_PEN: + ILI_INFO("ioctl: release pen\n"); + ili_pen_release(); + break; + case ILITEK_IOCTL_LCM_STATUS: + ILI_INFO("ioctl: lcm status is %d\n", ilits->power_status); + szBuf[0] = ilits->power_status; + if (copy_to_user((u8 *) arg, szBuf, 1)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_SLAVE_CTRL: + if (copy_from_user(szBuf, (u8 *) arg, 1)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + ilits->slave_wr_ctrl = (szBuf[0] == ENABLE) ? ENABLE : DISABLE; + ILI_DBG(" %s slave write read ctrl = %x\n", ilits->slave_wr_ctrl ? "Enable" : "Disable", ilits->slave_wr_ctrl); +#if (TDDI_INTERFACE == BUS_I2C && ENABLE_CASCADE) + ilits->i2c_addr_change = (ilits->slave_wr_ctrl == SLAVE) ? SLAVE : MASTER; +#endif + break; + case ILITEK_IOCTL_CASCADE_REG_RW: + ILI_DBG("ioctl: cascade register rw\n"); + + if (copy_from_user(szBuf, (u8 *) arg, i2c_rw_length)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + type = szBuf[0]; + addr = (szBuf[1] << 24) + (szBuf[2] << 16) + (szBuf[3] << 8) + (szBuf[4]); + write_data = (szBuf[5] << 24) + (szBuf[6] << 16) + (szBuf[7] << 8) + (szBuf[8]); + write_len = szBuf[9]; + + ILI_DBG("type = %d\n", type); + ILI_DBG("addr = 0x%X\n", addr); + ILI_DBG("write_data = %X\n", write_data); + ILI_DBG("write_len = %d\n", write_len); + +#if (TDDI_INTERFACE == BUS_I2C) + if (type == read) { + ili_ice_mode_read_by_mode(addr, &read_data, sizeof(u32), ilits->slave_wr_ctrl); + + szBuf[0] = (read_data >> 24) & 0xFF; + szBuf[1] = (read_data >> 16) & 0xFF; + szBuf[2] = (read_data >> 8) & 0xFF; + szBuf[3] = read_data & 0xFF; + if (copy_to_user((u8 *) arg, szBuf, 4)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + } else { + ili_ice_mode_write_by_mode(addr, write_data, write_len, ilits->slave_wr_ctrl); + } +#else + if (type == read) { + if (ilits->slave_wr_ctrl == SLAVE) { + ili_mspi_read_slave_register(addr, &read_data, sizeof(u32)); + ili_ice_mode_write_by_mode(MSPI_REG, 0x00, 1, BOTH); + } else { + if (ili_ice_mode_read_by_mode(addr, &read_data, sizeof(u32), MASTER) < 0) { + ILI_ERR("Read data error\n"); + } + } + ILI_INFO("[READ]:addr = 0x%06x, read = 0x%08x\n", addr, read_data); + szBuf[0] = (read_data >> 24) & 0xFF; + szBuf[1] = (read_data >> 16) & 0xFF; + szBuf[2] = (read_data >> 8) & 0xFF; + szBuf[3] = read_data & 0xFF; + if (copy_to_user((u8 *) arg, szBuf, 4)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + } else { + if (ilits->slave_wr_ctrl == SLAVE) { + ili_mspi_write_slave_register(addr, write_data, write_len); + ili_ice_mode_write_by_mode(MSPI_REG, 0x00, 1, BOTH); + } else { + if (ili_ice_mode_write_by_mode(addr, write_data, write_len, MASTER) < 0) { + ILI_ERR("Write data error\n"); + } + } + ILI_INFO("[WRITE]:addr = 0x%06x, write = 0x%08x, len = %d byte\n", addr, write_data, write_len); + } + + break; +#endif + case ILITEK_IOCTL_INTERFACE_GET: +#if (TDDI_INTERFACE == BUS_I2C) + szBuf[0] = 0x0; +#else + szBuf[0] = 0x1; +#endif + ILI_INFO("ioctl: get interface is %d\n", szBuf[0]); + if (copy_to_user((u8 *) arg, szBuf, 1)) { + ILI_ERR("Failed to copy data to user space\n"); + ret = -ENOTTY; + } + break; + case ILITEK_IOCTL_ICE_MODE_FLAG_SET: + if (copy_from_user(szBuf, (u8 *) arg, 1)) { + ILI_ERR("Failed to copy data from user space\n"); + ret = -ENOTTY; + break; + } + + ILI_DBG("ioctl: set ice mode flag = %d\n", szBuf[0]); + + if (szBuf[0] ? ENABLE : DISABLE) { + atomic_set(&ilits->ice_stat, ENABLE); + ilits->pll_clk_wakeup = false; + } else { + atomic_set(&ilits->ice_stat, DISABLE); + ilits->pll_clk_wakeup = true; + } + default: + ret = -ENOTTY; + break; + } + + ipio_kfree((void **)&szBuf); + ipio_kfree((void **)&wrap_rbuf); + +out: + if (esd_en) + ili_wq_ctrl(WQ_ESD, ENABLE); + if (bat_en) + ili_wq_ctrl(WQ_BAT, ENABLE); + + mutex_unlock(&ilits->touch_mutex); + return ret; +} + +static struct proc_dir_entry *proc_dir_ilitek; + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +typedef struct { + char *name; + struct proc_dir_entry *node; + struct proc_ops *fops; + bool isCreated; +} proc_node; +#else +typedef struct { + char *name; + struct proc_dir_entry *node; + struct file_operations *fops; + bool isCreated; +} proc_node; +#endif + +#if GENERIC_KERNEL_IMAGE +static int proc_show_mp_test_result_read(struct inode *inode, struct file *file) +{ + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + return single_open_size(file, ilitek_proc_mp_result_show, NULL, 512 * K); +} + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_show_mp_test_result_fops = { + .proc_open = proc_show_mp_test_result_read, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static struct file_operations proc_show_mp_test_result_fops = { + .open = proc_show_mp_test_result_read, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_mp_lcm_on_test_fops = { + .proc_read = ilitek_node_mp_lcm_on_test_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_mp_lcm_on_test_fops = { + .read = ilitek_node_mp_lcm_on_test_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_mp_lcm_off_test_fops = { + .proc_read = ilitek_node_mp_lcm_off_test_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_mp_lcm_off_test_fops = { + .read = ilitek_node_mp_lcm_off_test_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_ver_info_fops = { + .proc_read = ilitek_node_ver_info_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_ver_info_fops = { + .read = ilitek_node_ver_info_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_change_list_fops = { + .proc_read = ilitek_node_change_list_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_change_list_fops = { + .read = ilitek_node_change_list_read, + .llseek = default_llseek, +}; +#endif + +#if DMESG_SEQ_FILE +static int ilitek_proc_seq_debug_message_read(struct inode *inode, struct file *file) +{ + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + return single_open_size(file, ilitek_proc_debug_message_show, NULL, 16 * K); +} + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_debug_message_fops = { + .proc_open = ilitek_proc_seq_debug_message_read, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static struct file_operations proc_debug_message_fops = { + .open = ilitek_proc_seq_debug_message_read, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +#else +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_debug_message_fops = { + .proc_read = ilitek_proc_debug_message_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_debug_message_fops = { + .read = ilitek_proc_debug_message_read, + .llseek = default_llseek, +}; +#endif +#endif + +static int ilitek_proc_seq_debug_all_message_read(struct inode *inode, struct file *file) +{ + if (atomic_read(&ilits->tp_reset) == START) { + ILI_ERR("ignore request! tp reset atomic is START.\n"); + return -EINVAL; + } + + return single_open_size(file, ilitek_proc_debug_all_message_show, NULL, 500 * K); +} + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_debug_all_message_fops = { + .proc_open = ilitek_proc_seq_debug_all_message_read, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static struct file_operations proc_debug_all_message_fops = { + .open = ilitek_proc_seq_debug_all_message_read, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_debug_all_message_switch_fops = { + .proc_read = ilitek_proc_debug_all_switch_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_debug_all_message_switch_fops = { + .read = ilitek_proc_debug_all_switch_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_debug_message_switch_fops = { + .proc_read = ilitek_proc_debug_switch_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_debug_message_switch_fops = { + .read = ilitek_proc_debug_switch_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_ioctl_fops = { + .proc_ioctl = ilitek_node_ioctl, +#ifdef CONFIG_COMPAT + .proc_compat_ioctl = ilitek_node_compat_ioctl, +#endif + .proc_write = ilitek_node_ioctl_write, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_ioctl_fops = { + .unlocked_ioctl = ilitek_node_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = ilitek_node_compat_ioctl, +#endif + .write = ilitek_node_ioctl_write, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_fw_upgrade_fops = { + .proc_read = ilitek_node_fw_upgrade_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_fw_upgrade_fops = { + .read = ilitek_node_fw_upgrade_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_fw_process_fops = { + .proc_read = ilitek_proc_fw_process_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_fw_process_fops = { + .read = ilitek_proc_fw_process_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_get_delta_data_fops = { + .proc_read = ilitek_proc_get_delta_data_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_get_delta_data_fops = { + .read = ilitek_proc_get_delta_data_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_get_raw_data_fops = { + .proc_read = ilitek_proc_fw_get_raw_data_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_get_raw_data_fops = { + .read = ilitek_proc_fw_get_raw_data_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_rw_tp_reg_fops = { + .proc_read = ilitek_proc_rw_tp_reg_read, + .proc_write = ilitek_proc_rw_tp_reg_write, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_rw_tp_reg_fops = { + .read = ilitek_proc_rw_tp_reg_read, + .write = ilitek_proc_rw_tp_reg_write, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_fw_pc_counter_fops = { + .proc_read = ilitek_proc_fw_pc_counter_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_fw_pc_counter_fops = { + .read = ilitek_proc_fw_pc_counter_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_get_debug_mode_data_fops = { + .proc_read = ilitek_proc_get_debug_mode_data_read, + .proc_write = ilitek_proc_get_debug_mode_data_write, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_get_debug_mode_data_fops = { + .read = ilitek_proc_get_debug_mode_data_read, + .write = ilitek_proc_get_debug_mode_data_write, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_debug_level_fops = { + .proc_read = ilitek_proc_debug_level_read, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_debug_level_fops = { + .read = ilitek_proc_debug_level_read, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_sram_test_fops = { + .proc_read = ilitek_proc_sram_test_info, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_sram_test_fops = { + .read = ilitek_proc_sram_test_info, + .llseek = default_llseek, +}; +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 6, 0) +static struct proc_ops proc_fw_cmd_fops = { + .proc_read = ilitek_proc_fw_cmd_read, + .proc_write = ilitek_proc_fw_cmd_write, + .proc_lseek = default_llseek, +}; +#else +static struct file_operations proc_fw_cmd_fops = { + .read = ilitek_proc_fw_cmd_read, + .write = ilitek_proc_fw_cmd_write, + .llseek = default_llseek, +}; +#endif + +proc_node iliproc[] = { + {"ioctl", NULL, &proc_ioctl_fops, false}, + {"fw_process", NULL, &proc_fw_process_fops, false}, + {"fw_upgrade", NULL, &proc_fw_upgrade_fops, false}, + {"debug_level", NULL, &proc_debug_level_fops, false}, + {"mp_lcm_on_test", NULL, &proc_mp_lcm_on_test_fops, false}, + {"mp_lcm_off_test", NULL, &proc_mp_lcm_off_test_fops, false}, + {"debug_message", NULL, &proc_debug_message_fops, false}, + {"debug_message_switch", NULL, &proc_debug_message_switch_fops, false}, + {"debug_all_message", NULL, &proc_debug_all_message_fops, false}, + {"debug_all_message_switch", NULL, &proc_debug_all_message_switch_fops, false}, + {"fw_pc_counter", NULL, &proc_fw_pc_counter_fops, false}, + {"show_delta_data", NULL, &proc_get_delta_data_fops, false}, + {"show_raw_data", NULL, &proc_get_raw_data_fops, false}, + {"get_debug_mode_data", NULL, &proc_get_debug_mode_data_fops, false}, + {"rw_tp_reg", NULL, &proc_rw_tp_reg_fops, false}, + {"ver_info", NULL, &proc_ver_info_fops, false}, + {"change_list", NULL, &proc_change_list_fops, false}, + {"sram_test", NULL, &proc_sram_test_fops, false}, + {"fw_cmd", NULL, &proc_fw_cmd_fops, false}, +#if GENERIC_KERNEL_IMAGE + {"show_mp_test_result", NULL, &proc_show_mp_test_result_fops, false}, +#endif +}; + +static char *mmi_kobject_get_path(struct kobject *kobj, gfp_t gfp_mask) +{ + char *path; + int len = 1; + struct kobject *parent = kobj; + + do { + if (parent->name == NULL) { + len = 0; + break; + } + len += strlen(parent->name) + 1; + parent = parent->parent; + } while (parent); + + if (len == 0) + return NULL; + + path = kzalloc(len, gfp_mask); + if (!path) + return NULL; + + --len; + for (parent = kobj; parent; parent = parent->parent) { + int cur = strlen(parent->name); + len -= cur; + memcpy(path + len, parent->name, cur); + *(path + --len) = '/'; + } + pr_debug("kobject: '%s' (%p): %s: path = '%s'\n", kobj->name, + kobj, __func__, path); + + return path; +} + +#ifdef ILI_TOUCH_LAST_TIME +static ssize_t timestamp_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ktime_t last_ktime; + struct timespec64 last_ts; + + last_ktime = ilits->last_event_time; + ilits->last_event_time = 0; + + last_ts = ktime_to_timespec64(last_ktime); + return scnprintf(buf, PAGE_SIZE, "%lld.%ld\n", last_ts.tv_sec, last_ts.tv_nsec); +} +#endif + +static ssize_t path_show(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + ssize_t blen; + const char *path; + + //path = kobject_get_path(&ilits->spi->dev.kobj, GFP_KERNEL); + path = mmi_kobject_get_path(&ilits->spi->dev.kobj, GFP_KERNEL); + blen = scnprintf(pBuf, PAGE_SIZE, "%s\n", path ? path : "na"); + kfree(path); + + return blen; +} + +/* Attribute: vendor (RO) */ +static ssize_t vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ILI_INFO("*** %s() vendor = %s ***\n", __func__, "ilitek"); + return scnprintf(buf, PAGE_SIZE, "ilitek"); +} + +/* Attribute: ic_ver (RO) */ +static ssize_t ic_ver_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%s%x\n%s%d.%d.%.d.%d\n%s%d.%d.%d.%d\n", + "Product ID: ", ilits->chip->product_id, + "Build ID: ", ilits->chip->fw_ver >> 24, (ilits->chip->fw_ver >> 16) & 0xFF, + (ilits->chip->fw_ver >> 8) & 0xFF, ilits->chip->fw_ver & 0xFF, + "Config ID: ", + (ilits->chip->core_ver >> 24) & 0xFF, (ilits->chip->core_ver >> 16) & 0xFF, + (ilits->chip->core_ver >> 8) & 0xFF, ilits->chip->core_ver & 0xFF); +} + +#ifdef ILI_DOUBLE_TAP_CTRL +/* + * gesture value used to indicate which gesture mode type is supported + */ +static ssize_t gesture_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ILI_INFO("supported_gesture_type=%d", ilits->supported_gesture_type); + return scnprintf(buf, PAGE_SIZE, "%02x\n", ilits->supported_gesture_type); +} + +/* + * gesture value used to indicate which gesture mode type is supported. + * the gesture node will be stored when gesture mode updated from system + */ +static ssize_t gesture_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int value; + int err = 0; + + err = sscanf(buf, "%d", &value); + if (err < 0) { + ILI_INFO("Failed to convert value\n"); + return -EINVAL; + } + + err = count; + + switch (value) { + case 0x20: + ILI_INFO("single tap disable\n"); + ilits->ges_sym.single_tap = OFF; + ilits->sys_gesture_type &= 0xFD; + break; + case 0x21: + ILI_INFO("single tap enable\n"); + ilits->ges_sym.single_tap = SINGLE_TAP; + ilits->sys_gesture_type |= 0x02; + break; + case 0x30: + ILI_INFO("double tap disable\n"); + ilits->ges_sym.double_tap = OFF; + ilits->sys_gesture_type &= 0xFB; + break; + case 0x31: + ILI_INFO("double tap enable\n"); + ilits->ges_sym.double_tap = DOUBLE_TAP; + ilits->sys_gesture_type |= 0x04; + break; + default: + ILI_INFO("unsupport gesture mode type\n"); + return err; + } + + ili_gesture_state_switch(); + ILI_INFO("sys_gesture_type=%d, should_enable_gesture=%d\n", ilits->sys_gesture_type, ilits->should_enable_gesture); + + return err; +} + +/* + * gesture type debug value used for nvt driver to check current gesture mode + */ +static ssize_t gesture_type_dbg_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%02x\n", ilits->sys_gesture_type); +} + +static ssize_t gesture_type_dbg_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int value; + int err = 0; + + ILI_DBG("enter\n"); + err = sscanf(buf, "%d", &value); + if (err < 0) { + ILI_INFO("Failed to convert value\n"); + return -EINVAL; + } + + err = count; + ILI_INFO("value=%d\n", value); + + switch (value) { + case 2: //SYS_GESTURE_TYPE_SINGLE_ONLY: + ilits->sys_gesture_type = value; + ilits->ges_sym.single_tap = SINGLE_TAP; + ilits->ges_sym.double_tap = OFF; + ILI_INFO("sys_gesture_type: %d\n", ilits->sys_gesture_type); + break; + case 4: //SYS_GESTURE_TYPE_DOUBLE_ONLY: + ilits->sys_gesture_type = value; + ilits->ges_sym.single_tap = OFF; + ilits->ges_sym.double_tap = DOUBLE_TAP; + ILI_INFO("sys_gesture_type: %d\n", ilits->sys_gesture_type); + break; + case 6: //SYS_GESTURE_TYPE_SINGLE_DOUBLE: + ilits->sys_gesture_type = value; + ilits->ges_sym.single_tap = SINGLE_TAP; + ilits->ges_sym.double_tap = DOUBLE_TAP; + ILI_INFO("sys_gesture_type: %d\n", ilits->sys_gesture_type); + break; + default: + //disable gesture + ilits->sys_gesture_type = 0; + ilits->ges_sym.single_tap = OFF; + ilits->ges_sym.double_tap = OFF; + ILI_INFO("unsupport gesture mode type\n"); + break; + } + + ili_gesture_state_switch(); + ILI_INFO("sys_gesture_type=%d, should_enable_gesture=%d\n", ilits->sys_gesture_type, ilits->should_enable_gesture); + + return err; +} +#endif //ILI_DOUBLE_TAP_CTRL + +static struct device_attribute touchscreen_attributes[] = { + __ATTR_RO(path), + __ATTR_RO(vendor), + __ATTR_RO(ic_ver), +#ifdef ILI_TOUCH_LAST_TIME + __ATTR_RO(timestamp), +#endif +#ifdef ILI_DOUBLE_TAP_CTRL + __ATTR(gesture, S_IRUGO | S_IWUSR | S_IWGRP, gesture_show, gesture_store), + __ATTR(gesture_type_dbg, S_IRUGO | S_IWUSR | S_IWGRP, gesture_type_dbg_show, gesture_type_dbg_store), +#endif + __ATTR_NULL +}; + +int ilitek_sys_init(void) +{ + int i; + s32 ret = 0; + dev_t devno; + struct device_attribute *attrs = touchscreen_attributes; + +#ifdef ILI_PRIMARY_NODE + ret = alloc_chrdev_region(&devno, 0, 1, ILI_SPI_NAME_PRIMARY); +#else + ret = alloc_chrdev_region(&devno, 0, 1, ILI_SPI_NAME); +#endif + if (ret) { + ILI_ERR ("can't allocate chrdev\n"); + return ret; + } else { + + /* set sysfs for firmware */ + touchscreen_class = class_create(THIS_MODULE, "touchscreen"); + if (IS_ERR(touchscreen_class)) { + ret = PTR_ERR(touchscreen_class); + touchscreen_class = NULL; + ILI_ERR("Failed to create touchscreen class!\n"); + return ret; + } + +#ifdef ILI_PRIMARY_NODE + touchscreen_class_dev = device_create(touchscreen_class, NULL, devno, NULL, ILI_SPI_NAME_PRIMARY); +#else + touchscreen_class_dev = device_create(touchscreen_class, NULL, devno, NULL, ILI_SPI_NAME); +#endif + + pr_info(" touchscreen_class_dev = %p \n", touchscreen_class_dev); + if (IS_ERR(touchscreen_class_dev)) { + ret = PTR_ERR(touchscreen_class_dev); + touchscreen_class_dev = NULL; + ILI_ERR("Failed to create device(touchscreen_class_dev)!\n"); + return ret; + } + ILI_INFO("Succeed to create device(touchscreen_class_dev)!\n"); + + for (i = 0; attrs[i].attr.name != NULL; ++i) { + ret = device_create_file(touchscreen_class_dev, &attrs[i]); + if (ret < 0) + goto device_destroy; + } + } + + return ret; + +device_destroy: + for (--i; i >= 0; --i) + device_remove_file(touchscreen_class_dev, &attrs[i]); + + touchscreen_class_dev = NULL; + class_unregister(touchscreen_class); + ILI_ERR("error creating touchscreen class\n"); + + return -ENODEV; +} + +void ili_node_init(void) +{ + int i = 0; + + proc_dir_ilitek = proc_mkdir("ilitek", NULL); + + for (; i < ARRAY_SIZE(iliproc); i++) { + iliproc[i].node = proc_create(iliproc[i].name, 0644, proc_dir_ilitek, iliproc[i].fops); + + if (iliproc[i].node == NULL) { + iliproc[i].isCreated = false; + ILI_ERR("Failed to create %s under /proc\n", iliproc[i].name); + } else { + iliproc[i].isCreated = true; + ILI_INFO("Succeed to create %s under /proc\n", iliproc[i].name); + } + } + + ilitek_sys_init(); +} diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_qcom.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_qcom.c new file mode 100644 index 000000000000..9ad22d72564f --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_qcom.c @@ -0,0 +1,1085 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" +#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) +#include +#endif + +#define DTS_INT_GPIO "touch,irq-gpio" +#define DTS_RESET_GPIO "touch,reset-gpio" +#define DTS_OF_NAME "tchip,ilitek" + +#if IS_ENABLED(CONFIG_DRM_MEDIATEK) +static int ili_disp_notifier_callback(struct notifier_block *nb, unsigned long value, void *v); + +static int ili_tp_power_on_reinit(void) +{ + int ret = 0; + + ILI_DBG("enter, TBD\n"); + + // do esd recovery, bootloader reset + ret = ili_sleep_handler(TP_DEEP_SLEEP); + if (ret < 0) + ILI_INFO("reinit deep sleep suspend ret:%d\n", ret); + else + ILI_INFO("reinit deep sleep suspend!\n"); + + usleep_range(5000, 5100); + + ret = ili_sleep_handler(TP_RESUME); + if (ret < 0) + ILI_INFO("reinit resume ret:%d\n", ret); + else + ILI_INFO("reinit resume!\n"); + + return ret; +} +#endif + +#ifdef ILI_SENSOR_EN +static struct sensors_classdev __maybe_unused sensors_touch_cdev = { + + .name = "dt-gesture", + .vendor = "ilitek", + .version = 1, + .type = SENSOR_TYPE_MOTO_DOUBLE_TAP, + .max_range = "5.0", + .resolution = "5.0", + .sensor_power = "1", + .min_delay = 0, + .max_delay = 0, + /* WAKE_UP & SPECIAL_REPORT */ + .flags = 1 | 6, + .fifo_reserved_event_count = 0, + .fifo_max_event_count = 0, + .enabled = 0, + .delay_msec = 200, + .sensors_enable = NULL, + .sensors_poll_delay = NULL, +}; +#endif + +void ili_tp_reset(void) +{ + ILI_INFO("edge delay = %d\n", ilits->rst_edge_delay); + + /* Need accurate power sequence, do not change it to msleep */ + gpio_direction_output(ilits->tp_rst, 1); + mdelay(1); + gpio_set_value(ilits->tp_rst, 0); + mdelay(5); + gpio_set_value(ilits->tp_rst, 1); + mdelay(ilits->rst_edge_delay); +} + +void ili_input_register(void) +{ + ILI_INFO(); + + ilits->input = input_allocate_device(); + if (ERR_ALLOC_MEM(ilits->input)) { + ILI_ERR("Failed to allocate touch input device\n"); + input_free_device(ilits->input); + return; + } + + ilits->input->name = ilits->hwif->name; + ilits->input->phys = ilits->phys; + ilits->input->dev.parent = ilits->dev; + ilits->input->id.bustype = ilits->hwif->bus_type; + + /* set the supported event type for input device */ + set_bit(EV_ABS, ilits->input->evbit); + set_bit(EV_SYN, ilits->input->evbit); + set_bit(EV_KEY, ilits->input->evbit); + set_bit(BTN_TOUCH, ilits->input->keybit); + set_bit(BTN_TOOL_FINGER, ilits->input->keybit); + set_bit(INPUT_PROP_DIRECT, ilits->input->propbit); + + input_set_abs_params(ilits->input, ABS_MT_POSITION_X, TOUCH_SCREEN_X_MIN, ilits->panel_wid - 1, 0, 0); + input_set_abs_params(ilits->input, ABS_MT_POSITION_Y, TOUCH_SCREEN_Y_MIN, ilits->panel_hei - 1, 0, 0); + input_set_abs_params(ilits->input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ilits->input, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + + if (MT_PRESSURE) + input_set_abs_params(ilits->input, ABS_MT_PRESSURE, 0, 255, 0, 0); + + if (MT_B_TYPE) { +#if KERNEL_VERSION(3, 7, 0) <= LINUX_VERSION_CODE + input_mt_init_slots(ilits->input, MAX_TOUCH_NUM, INPUT_MT_DIRECT); +#else + input_mt_init_slots(ilits->input, MAX_TOUCH_NUM); +#endif /* LINUX_VERSION_CODE */ + } else { + input_set_abs_params(ilits->input, ABS_MT_TRACKING_ID, 0, MAX_TOUCH_NUM, 0, 0); + } + + /* Gesture keys register */ + input_set_capability(ilits->input, EV_KEY, KEY_POWER); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_UP); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_DOWN); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_LEFT); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_RIGHT); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_O); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_E); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_M); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_W); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_S); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_V); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_Z); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_C); + input_set_capability(ilits->input, EV_KEY, KEY_GESTURE_F); + + __set_bit(KEY_GESTURE_POWER, ilits->input->keybit); + __set_bit(KEY_GESTURE_UP, ilits->input->keybit); + __set_bit(KEY_GESTURE_DOWN, ilits->input->keybit); + __set_bit(KEY_GESTURE_LEFT, ilits->input->keybit); + __set_bit(KEY_GESTURE_RIGHT, ilits->input->keybit); + __set_bit(KEY_GESTURE_O, ilits->input->keybit); + __set_bit(KEY_GESTURE_E, ilits->input->keybit); + __set_bit(KEY_GESTURE_M, ilits->input->keybit); + __set_bit(KEY_GESTURE_W, ilits->input->keybit); + __set_bit(KEY_GESTURE_S, ilits->input->keybit); + __set_bit(KEY_GESTURE_V, ilits->input->keybit); + __set_bit(KEY_GESTURE_Z, ilits->input->keybit); + __set_bit(KEY_GESTURE_C, ilits->input->keybit); + __set_bit(KEY_GESTURE_F, ilits->input->keybit); + + /* register the input device to input sub-system */ + if (input_register_device(ilits->input) < 0) { + ILI_ERR("Failed to register touch input device\n"); + input_unregister_device(ilits->input); + input_free_device(ilits->input); + } +} + +void ili_input_pen_register(void) +{ + ilits->input_pen = input_allocate_device(); + if (ERR_ALLOC_MEM(ilits->input_pen)) { + ILI_ERR("Failed to allocate touch input device\n"); + input_free_device(ilits->input_pen); + return; + } + + ilits->input_pen->name = PEN_INPUT_DEVICE; + ilits->input_pen->phys = ilits->phys; + ilits->input_pen->dev.parent = ilits->dev; + ilits->input_pen->id.bustype = ilits->hwif->bus_type; + + /* set the supported event type for input device */ + set_bit(EV_ABS, ilits->input_pen->evbit); + set_bit(EV_SYN, ilits->input_pen->evbit); + set_bit(EV_KEY, ilits->input_pen->evbit); + set_bit(BTN_TOUCH, ilits->input_pen->keybit); + set_bit(BTN_TOOL_PEN, ilits->input_pen->keybit); + set_bit(BTN_STYLUS, ilits->input_pen->keybit); + set_bit(BTN_STYLUS2, ilits->input_pen->keybit); + set_bit(INPUT_PROP_DIRECT, ilits->input_pen->propbit); + + input_set_abs_params(ilits->input_pen, ABS_X, 0, ilits->panel_wid, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_Y, 0, ilits->panel_hei, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_PRESSURE, 0, MAX_PRESSURE, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_TILT_X, -60, 60, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_TILT_Y, -60, 60, 0, 0); + input_set_abs_params(ilits->input_pen, ABS_DISTANCE, 0, 1, 0, 0); + + /* register the input device to input sub-system */ + if (input_register_device(ilits->input_pen) < 0) { + ILI_ERR("Failed to register touch input device\n"); + input_unregister_device(ilits->input_pen); + input_free_device(ilits->input_pen); + } + ILI_INFO("Input Pen device for Single Touch\n"); + ILI_DBG("Input pen Register.\n"); +} + +#if REGULATOR_POWER +void ili_plat_regulator_power_on(bool status) +{ + ILI_INFO("%s\n", status ? "POWER ON" : "POWER OFF"); + + if (status) { + if (ilits->vdd) { + if (regulator_enable(ilits->vdd) < 0) + ILI_ERR("regulator_enable VDD fail\n"); + } + if (ilits->vcc) { + if (regulator_enable(ilits->vcc) < 0) + ILI_ERR("regulator_enable VCC fail\n"); + } + } else { + if (ilits->vdd) { + if (regulator_disable(ilits->vdd) < 0) + ILI_ERR("regulator_enable VDD fail\n"); + } + if (ilits->vcc) { + if (regulator_disable(ilits->vcc) < 0) + ILI_ERR("regulator_enable VCC fail\n"); + } + } + atomic_set(&ilits->ice_stat, DISABLE); + mdelay(5); +} + +static void ilitek_plat_regulator_power_init(void) +{ + const char *vdd_name = "vdd"; + const char *vcc_name = "vcc"; + + ilits->vdd = regulator_get(ilits->dev, vdd_name); + if (ERR_ALLOC_MEM(ilits->vdd)) { + ILI_ERR("regulator_get VDD fail\n"); + ilits->vdd = NULL; + } + if (regulator_set_voltage(ilits->vdd, VDD_VOLTAGE, VDD_VOLTAGE) < 0) + ILI_ERR("Failed to set VDD %d\n", VDD_VOLTAGE); + + ilits->vcc = regulator_get(ilits->dev, vcc_name); + if (ERR_ALLOC_MEM(ilits->vcc)) { + ILI_ERR("regulator_get VCC fail.\n"); + ilits->vcc = NULL; + } + if (regulator_set_voltage(ilits->vcc, VCC_VOLTAGE, VCC_VOLTAGE) < 0) + ILI_ERR("Failed to set VCC %d\n", VCC_VOLTAGE); + + ili_plat_regulator_power_on(true); +} +#endif + +static int ilitek_plat_gpio_register(void) +{ + int ret = 0; + u32 flag; + struct device_node *dev_node = ilits->dev->of_node; + + ilits->tp_int = of_get_named_gpio_flags(dev_node, DTS_INT_GPIO, 0, &flag); + ilits->tp_rst = of_get_named_gpio_flags(dev_node, DTS_RESET_GPIO, 0, &flag); + + ILI_INFO("TP INT: %d\n", ilits->tp_int); + ILI_INFO("TP RESET: %d\n", ilits->tp_rst); + + if (!gpio_is_valid(ilits->tp_int)) { + ILI_ERR("Invalid INT gpio: %d\n", ilits->tp_int); + return -EBADR; + } + + if (!gpio_is_valid(ilits->tp_rst)) { + ILI_ERR("Invalid RESET gpio: %d\n", ilits->tp_rst); + return -EBADR; + } + + ret = gpio_request(ilits->tp_int, "TP_INT"); + if (ret < 0) { + ILI_ERR("Request IRQ GPIO failed, ret = %d\n", ret); + gpio_free(ilits->tp_int); + ret = gpio_request(ilits->tp_int, "TP_INT"); + if (ret < 0) { + ILI_ERR("Retrying request INT GPIO still failed , ret = %d\n", ret); + goto out; + } + } + + ret = gpio_request(ilits->tp_rst, "TP_RESET"); + if (ret < 0) { + ILI_ERR("Request RESET GPIO failed, ret = %d\n", ret); + gpio_free(ilits->tp_rst); + ret = gpio_request(ilits->tp_rst, "TP_RESET"); + if (ret < 0) { + ILI_ERR("Retrying request RESET GPIO still failed , ret = %d\n", ret); + goto out; + } + } + +out: + gpio_direction_input(ilits->tp_int); + return ret; +} + +void ili_irq_disable(void) +{ + unsigned long flag; + + spin_lock_irqsave(&ilits->irq_spin, flag); + + if (atomic_read(&ilits->irq_stat) == DISABLE) + goto out; + + if (!ilits->irq_num) { + ILI_ERR("gpio_to_irq (%d) is incorrect\n", ilits->irq_num); + goto out; + } + + disable_irq_nosync(ilits->irq_num); + atomic_set(&ilits->irq_stat, DISABLE); + ILI_DBG("Disable irq success\n"); + +out: + spin_unlock_irqrestore(&ilits->irq_spin, flag); +} + +void ili_irq_enable(void) +{ + unsigned long flag; + + spin_lock_irqsave(&ilits->irq_spin, flag); + + if (atomic_read(&ilits->irq_stat) == ENABLE) + goto out; + + if (!ilits->irq_num) { + ILI_ERR("gpio_to_irq (%d) is incorrect\n", ilits->irq_num); + goto out; + } + + enable_irq(ilits->irq_num); + atomic_set(&ilits->irq_stat, ENABLE); + ILI_DBG("Enable irq success\n"); + +out: + spin_unlock_irqrestore(&ilits->irq_spin, flag); +} + +static irqreturn_t ilitek_plat_isr_top_half(int irq, void *dev_id) +{ + if (irq != ilits->irq_num) { + ILI_ERR("Incorrect irq number (%d)\n", irq); + return IRQ_NONE; + } + + if (atomic_read(&ilits->cmd_int_check) == ENABLE) { + atomic_set(&ilits->cmd_int_check, DISABLE); + ILI_DBG("CMD INT detected, ignore\n"); + wake_up(&(ilits->inq)); + return IRQ_HANDLED; + } + + if (ilits->prox_near) { + ILI_INFO("Proximity event, ignore interrupt!\n"); + return IRQ_HANDLED; + } + + ILI_DBG("report: %d, rst: %d, fw: %d, switch: %d, mp: %d, sleep: %d, esd: %d, igr:%d\n", + ilits->report, + atomic_read(&ilits->tp_reset), + atomic_read(&ilits->fw_stat), + atomic_read(&ilits->tp_sw_mode), + atomic_read(&ilits->mp_stat), + atomic_read(&ilits->tp_sleep), + atomic_read(&ilits->esd_stat), + atomic_read(&ilits->ignore_report)); + + if (!ilits->report || atomic_read(&ilits->tp_reset) || atomic_read(&ilits->ignore_report) || + atomic_read(&ilits->fw_stat) || atomic_read(&ilits->tp_sw_mode) || + atomic_read(&ilits->mp_stat) || atomic_read(&ilits->tp_sleep) || + atomic_read(&ilits->esd_stat)) { + ILI_DBG("ignore interrupt !\n"); + return IRQ_HANDLED; + } + + return IRQ_WAKE_THREAD; +} + +static irqreturn_t ilitek_plat_isr_bottom_half(int irq, void *dev_id) +{ + if (mutex_is_locked(&ilits->touch_mutex)) { + ILI_DBG("touch is locked, ignore\n"); + return IRQ_HANDLED; + } + mutex_lock(&ilits->touch_mutex); + ili_report_handler(); + mutex_unlock(&ilits->touch_mutex); + return IRQ_HANDLED; +} + +void ili_irq_unregister(void) +{ + devm_free_irq(ilits->dev, ilits->irq_num, NULL); +} + +int ili_irq_register(int type) +{ + int ret = 0; + static bool get_irq_pin; + + atomic_set(&ilits->irq_stat, DISABLE); + + if (get_irq_pin == false) { + ilits->irq_num = gpio_to_irq(ilits->tp_int); + get_irq_pin = true; + } + + ILI_INFO("ilits->irq_num = %d\n", ilits->irq_num); + + ret = devm_request_threaded_irq(ilits->dev, ilits->irq_num, + ilitek_plat_isr_top_half, + ilitek_plat_isr_bottom_half, + type | IRQF_ONESHOT, "ilitek", NULL); + + if (type == IRQF_TRIGGER_FALLING) + ILI_INFO("IRQ TYPE = IRQF_TRIGGER_FALLING\n"); + if (type == IRQF_TRIGGER_RISING) + ILI_INFO("IRQ TYPE = IRQF_TRIGGER_RISING\n"); + + if (ret != 0) + ILI_ERR("Failed to register irq handler, irq = %d, ret = %d\n", ilits->irq_num, ret); + + atomic_set(&ilits->irq_stat, ENABLE); + + return ret; +} + +#if IS_ENABLED(CONFIG_DRM_MEDIATEK) +static int ili_disp_notifier_callback(struct notifier_block *nb, + unsigned long value, void *v) +{ + int *data = (int *)v; + + ILI_DBG("entery\n"); + if (v) { + if (value == MTK_DISP_EARLY_EVENT_BLANK) { + /* before fb blank */ + ILI_INFO("event %lu not care", value); + } else if (value == MTK_DISP_EVENT_BLANK) { + if (*data == MTK_DISP_BLANK_UNBLANK) { + ILI_INFO("TP resume: event = %lu, TP_RESUME\n", value); + if (ili_sleep_handler(TP_RESUME) < 0) + ILI_ERR("TP resume failed\n"); + } + else if (*data == MTK_DISP_BLANK_POWERDOWN) { +#ifdef ILI_DOUBLE_TAP_CTRL + if (ilits->should_enable_gesture) { + ILI_INFO("TP suspend: tap gesture suspend\n"); + if (ili_sleep_handler(TP_SUSPEND) < 0) + ILI_ERR("TP suspend failed\n"); +#ifdef ILI_SET_TOUCH_STATE + touch_set_state(TOUCH_LOW_POWER_STATE, TOUCH_PANEL_IDX_PRIMARY); +#endif + } + else { + ILI_INFO("TP suspend: TP_DEEP_SLEEP event = %lu\n", value); + if (ili_sleep_handler(TP_DEEP_SLEEP) < 0) + ILI_ERR("TP suspend deep sleep fail\n"); +#ifdef ILI_SET_TOUCH_STATE + touch_set_state(TOUCH_DEEP_SLEEP_STATE, TOUCH_PANEL_IDX_PRIMARY); +#endif + } +#else //ILI_DOUBLE_TAP_CTRL + ILI_INFO("TP suspend: event = %lu, TP_DEEP_SLEEP\n", value); + if (ili_sleep_handler(TP_DEEP_SLEEP) < 0) + ILI_ERR("TP suspend deep sleep failed\n"); +#endif //ILI_DOUBLE_TAP_CTRL + } + } + } + + return 0; +} +#endif + +#if SPRD_SYSFS_SUSPEND_RESUME +static ssize_t ts_suspend_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%s\n", ilits->tp_suspend ? "true" : "false"); +} + +static ssize_t ts_suspend_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + if ((buf[0] == '1') && !ilits->tp_suspend) + ili_sleep_handler(TP_DEEP_SLEEP); + else if ((buf[0] == '0') && ilits->tp_suspend) + ili_sleep_handler(TP_RESUME); + + return count; +} +static DEVICE_ATTR_RW(ts_suspend); + +static struct attribute *ilitek_dev_suspend_atts[] = { + &dev_attr_ts_suspend.attr, + NULL +}; + +static const struct attribute_group ilitek_dev_suspend_atts_group = { + .attrs = ilitek_dev_suspend_atts, +}; + +static const struct attribute_group *ilitek_dev_attr_groups[] = { + &ilitek_dev_suspend_atts_group, + NULL +}; + +int ili_sysfs_add_device(struct device *dev) +{ + int ret = 0, i; + + for (i = 0; ilitek_dev_attr_groups[i]; i++) { + ret = sysfs_create_group(&dev->kobj, ilitek_dev_attr_groups[i]); + if (ret) { + while (--i >= 0) { + sysfs_remove_group(&dev->kobj, ilitek_dev_attr_groups[i]); + } + break; + } + } + + return ret; +} + +int ili_sysfs_remove_device(struct device *dev) +{ + int i; + + sysfs_remove_link(NULL, "touchscreen"); + for (i = 0; ilitek_dev_attr_groups[i]; i++) { + sysfs_remove_group(&dev->kobj, ilitek_dev_attr_groups[i]); + } + + return 0; +} +#elif SUSPEND_RESUME_SUPPORT + +#if defined(CONFIG_FB) || defined(CONFIG_DRM) +#if defined(__DRM_PANEL_H__) && defined(DRM_PANEL_EARLY_EVENT_BLANK) +static struct drm_panel *active_panel; + +static int ili_v3_drm_check_dt(struct device_node *np) +{ + int i = 0; + int count = 0; + struct device_node *node = NULL; + struct drm_panel *panel = NULL; + + count = of_count_phandle_with_args(np, "panel", NULL); + if (count <= 0) { + ILI_ERR("find drm_panel count(%d) fail", count); + return 0; + } + ILI_INFO("find drm_panel count(%d) ", count); + for (i = 0; i < count; i++) { + node = of_parse_phandle(np, "panel", i); + ILI_INFO("node%p", node); + panel = of_drm_find_panel(node); + ILI_INFO("panel%p ", panel); + + of_node_put(node); + if (!IS_ERR(panel)) { + ILI_INFO("find drm_panel successfully"); + active_panel = panel; + return 0; + } + } + + ILI_ERR("no find drm_panel"); + return -ENODEV; +} + +static int drm_notifier_callback(struct notifier_block *self, unsigned long event, void *data) +{ + struct drm_panel_notifier *evdata = data; + int *blank = NULL; + + if (!evdata) { + ILI_ERR("evdata is null"); + return 0; + } + + if (!((event == DRM_PANEL_EARLY_EVENT_BLANK) + || (event == DRM_PANEL_EVENT_BLANK))) { + ILI_INFO("event(%lu) do not need process\n", event); + return 0; + } + + blank = evdata->data; + ILI_INFO("DRM event:%lu,blank:%d", event, *blank); + switch (*blank) { + case DRM_PANEL_BLANK_UNBLANK: + if (DRM_PANEL_EARLY_EVENT_BLANK == event) { + ILI_INFO("resume: event = %lu, not care\n", event); + } else if (DRM_PANEL_EVENT_BLANK == event) { + ILI_INFO("resume: event = %lu, TP_RESUME\n", event); + if (ili_sleep_handler(TP_RESUME) < 0) + ILI_ERR("TP resume failed\n"); + } + break; + case DRM_PANEL_BLANK_POWERDOWN: + if (DRM_PANEL_EARLY_EVENT_BLANK == event) { + ILI_INFO("suspend: event = %lu, TP_SUSPEND\n", event); + if (ili_sleep_handler(TP_DEEP_SLEEP) < 0) + ILI_ERR("TP suspend failed\n"); + } else if (DRM_PANEL_EVENT_BLANK == event) { + ILI_INFO("suspend: event = %lu, not care\n", event); + } + break; + default: + ILI_INFO("DRM BLANK(%d) do not need process\n", *blank); + break; + } + + return 0; +} +#else +static int ilitek_plat_notifier_fb(struct notifier_block *self, unsigned long event, void *data) +{ + int *blank; + struct fb_event *evdata = data; + + ILI_INFO("Notifier's event = %ld\n", event); + + /* + * FB_EVENT_BLANK(0x09): A hardware display blank change occurred. + * FB_EARLY_EVENT_BLANK(0x10): A hardware display blank early change occurred. + */ + if (evdata && evdata->data) { + blank = evdata->data; + switch (*blank) { +#ifdef CONFIG_DRM_MSM + case MSM_DRM_BLANK_POWERDOWN: +#else + case FB_BLANK_POWERDOWN: +#endif +#if CONFIG_PLAT_SPRD + case DRM_MODE_DPMS_OFF: +#endif /* CONFIG_PLAT_SPRD */ + if (TP_SUSPEND_PRIO) { +#ifdef CONFIG_DRM_MSM + if (event != MSM_DRM_EARLY_EVENT_BLANK) +#else + if (event != FB_EARLY_EVENT_BLANK) +#endif + return NOTIFY_DONE; + } else { +#ifdef CONFIG_DRM_MSM + if (event != MSM_DRM_EVENT_BLANK) +#else + if (event != FB_EVENT_BLANK) +#endif + return NOTIFY_DONE; + } + if (ili_sleep_handler(TP_DEEP_SLEEP) < 0) + ILI_ERR("TP suspend failed\n"); + break; +#ifdef CONFIG_DRM_MSM + case MSM_DRM_BLANK_UNBLANK: + case MSM_DRM_BLANK_NORMAL: +#else + case FB_BLANK_UNBLANK: + case FB_BLANK_NORMAL: +#endif + +#if CONFIG_PLAT_SPRD + case DRM_MODE_DPMS_ON: +#endif /* CONFIG_PLAT_SPRD */ + +#ifdef CONFIG_DRM_MSM + if (event == MSM_DRM_EVENT_BLANK) +#else + if (event == FB_EVENT_BLANK) +#endif + { + if (ili_sleep_handler(TP_RESUME) < 0) + ILI_ERR("TP resume failed\n"); + + } + break; + default: + ILI_ERR("Unknown event, blank = %d\n", *blank); + break; + } + } + return NOTIFY_OK; +} +#endif/*defined(__DRM_PANEL_H__) && defined(DRM_PANEL_EARLY_EVENT_BLANK)*/ +#elif defined(CONFIG_HAS_EARLYSUSPEND) +static void ilitek_plat_early_suspend(struct early_suspend *h) +{ + if (ili_sleep_handler(TP_DEEP_SLEEP) < 0) + ILI_ERR("TP suspend failed\n"); +} + +static void ilitek_plat_late_resume(struct early_suspend *h) +{ + if (ili_sleep_handler(TP_RESUME) < 0) + ILI_ERR("TP resume failed\n"); +} +#endif/*defined(CONFIG_FB) || defined(CONFIG_DRM_MSM)*/ + +#ifdef ILI_SENSOR_EN +static int ili_sensor_set_enable(struct sensors_classdev *sensors_cdev, + unsigned int enable) +{ +#ifdef ILI_DOUBLE_TAP_CTRL + ILI_DBG("double tap ctrl, do nothing\n"); +#else + ILI_INFO("Gesture set enable %d!", enable); + mutex_lock(&ilits->state_mutex); + if (enable == 1) { + ilits->should_enable_gesture = true; + } else if (enable == 0) { + ilits->should_enable_gesture = false; + } else { + ILI_INFO("unknown enable symbol\n"); + } + mutex_unlock(&ilits->state_mutex); +#endif + return 0; +} + +static int ili_sensor_init(struct ilitek_ts_data *data) +{ + struct ili_sensor_platform_data *sensor_pdata; + struct input_dev *sensor_input_dev; + int err; + + sensor_input_dev = input_allocate_device(); + if (!sensor_input_dev) { + ILI_ERR("Failed to allocate device"); + goto exit; + } + + sensor_pdata = devm_kzalloc(&sensor_input_dev->dev, + sizeof(struct ili_sensor_platform_data), + GFP_KERNEL); + if (!sensor_pdata) { + ILI_ERR("Failed to allocate memory"); + goto free_sensor_pdata; + } + data->sensor_pdata = sensor_pdata; + + if (data->report_gesture_key) { + __set_bit(EV_KEY, sensor_input_dev->evbit); + __set_bit(KEY_F1, sensor_input_dev->keybit); +#ifdef ILI_DOUBLE_TAP_CTRL + __set_bit(KEY_F4, sensor_input_dev->keybit); +#endif + } else { + __set_bit(EV_ABS, sensor_input_dev->evbit); + input_set_abs_params(sensor_input_dev, ABS_DISTANCE, + 0, REPORT_MAX_COUNT, 0, 0); + } + __set_bit(EV_SYN, sensor_input_dev->evbit); + + sensor_input_dev->name = "double-tap"; + data->sensor_pdata->input_sensor_dev = sensor_input_dev; + + err = input_register_device(sensor_input_dev); + if (err) { + ILI_ERR("Unable to register device, err=%d", err); + goto free_sensor_input_dev; + } + + sensor_pdata->ps_cdev = sensors_touch_cdev; + sensor_pdata->ps_cdev.sensors_enable = ili_sensor_set_enable; + sensor_pdata->data = data; + + err = sensors_classdev_register(&sensor_input_dev->dev, + &sensor_pdata->ps_cdev); + if (err) + goto unregister_sensor_input_device; + + return 0; + +unregister_sensor_input_device: + input_unregister_device(data->sensor_pdata->input_sensor_dev); +free_sensor_input_dev: + input_free_device(data->sensor_pdata->input_sensor_dev); +free_sensor_pdata: + devm_kfree(&sensor_input_dev->dev, sensor_pdata); + data->sensor_pdata = NULL; +exit: + return 1; +} + +int ili_sensor_remove(struct ilitek_ts_data *data) +{ + sensors_classdev_unregister(&data->sensor_pdata->ps_cdev); + input_unregister_device(data->sensor_pdata->input_sensor_dev); + devm_kfree(&data->sensor_pdata->input_sensor_dev->dev, + data->sensor_pdata); + data->sensor_pdata = NULL; + data->wakeable = false; + data->should_enable_gesture = false; + return 0; +} +#endif + +#ifdef ILI_DOUBLE_TAP_CTRL +void ili_gesture_state_switch(void) +{ + if (ilits->sys_gesture_type) { + //gesture enable + if (!ilits->should_enable_gesture) { + ilits->should_enable_gesture = true; + +#ifdef ILI_SET_TOUCH_STATE + touch_set_state(TOUCH_LOW_POWER_STATE, TOUCH_PANEL_IDX_PRIMARY); +#endif + ILI_INFO("gesture switch to enable"); + } + } + else { + //gesture disable + if (ilits->should_enable_gesture) { + ilits->should_enable_gesture = false; +#ifdef ILI_SET_TOUCH_STATE + touch_set_state(TOUCH_DEEP_SLEEP_STATE, TOUCH_PANEL_IDX_PRIMARY); +#endif + ILI_INFO("gesture switch to disable"); + } + } +} +#endif + +static void ilitek_plat_sleep_init(void) +{ +#if IS_ENABLED(CONFIG_DRM_MEDIATEK) + int ret; + void **mtk_ret = NULL; + + ILI_INFO("init disp_notifier cb\n"); + ilits->disp_notifier.notifier_call = ili_disp_notifier_callback; + ret = mtk_disp_notifier_register("ILI Touch", &ilits->disp_notifier); + if (ret) { + ILI_ERR("Failed to register disp notifier client:%d", ret); + goto err_register_disp_notif_failed; + } + + ILI_DBG("disp notifier TP power_on reset config\n"); + if (mtk_panel_tch_handle_init()) { + mtk_ret = mtk_panel_tch_handle_init(); + *mtk_ret = (void *)ili_tp_power_on_reinit; + } + else + ILI_INFO("mtk_panel_tch_handle_init NULL\n"); + + return; +#elif defined(CONFIG_FB) || defined(CONFIG_DRM) + ILI_INFO("Init notifier_fb struct\n"); +#if defined(__DRM_PANEL_H__) + ilits->notifier_fb.notifier_call = drm_notifier_callback; + if (active_panel) { + if (drm_panel_notifier_register(active_panel, &ilits->notifier_fb)) + ILI_ERR("[DRM]drm_panel_notifier_register fail\n"); + } +#else + ilits->notifier_fb.notifier_call = ilitek_plat_notifier_fb; +#if defined(CONFIG_DRM_MSM) + if (msm_drm_register_client(&ilits->notifier_fb)) { + ILI_ERR("msm_drm_register_client Unable to register fb_notifier\n"); + } +#else +#if CONFIG_PLAT_SPRD + if (adf_register_client(&ilits->notifier_fb)) + ILI_ERR("Unable to register notifier_fb\n"); +#else + if (fb_register_client(&ilits->notifier_fb)) + ILI_ERR("Unable to register notifier_fb\n"); +#endif /* CONFIG_PLAT_SPRD */ +#endif /* CONFIG_DRM_MSM */ +#endif/*defined(__DRM_PANEL_H__) && defined(DRM_PANEL_EARLY_EVENT_BLANK)*/ +#elif defined(CONFIG_HAS_EARLYSUSPEND) + ILI_INFO("Init eqarly_suspend struct\n"); + ilits->early_suspend.suspend = ilitek_plat_early_suspend; + ilits->early_suspend.resume = ilitek_plat_late_resume; + ilits->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + register_early_suspend(&ilits->early_suspend); +#endif + +#if IS_ENABLED(CONFIG_DRM_MEDIATEK) +err_register_disp_notif_failed: + ret = mtk_disp_notifier_unregister(&ilits->disp_notifier); + if (ret) + ILI_ERR("Error unregistering disp_notifier\n"); +#endif +} +#endif/*SPRD_SYSFS_SUSPEND_RESUME*/ + +static int ilitek_plat_probe(void) +{ +#ifdef ILI_SENSOR_EN + static bool initialized_sensor; +#endif +#if SUSPEND_RESUME_SUPPORT +#if defined(__DRM_PANEL_H__) && defined(DRM_PANEL_EARLY_EVENT_BLANK) + int ret = 0; +#endif +#endif + ILI_INFO("platform probe\n"); + +#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) + if (ilits->dev->of_node && !mmi_device_is_available(ilits->dev->of_node)) { + ILI_ERR("%s : mmi: device not supported\n", __func__); + return -ENODEV; + } +#endif +#if REGULATOR_POWER + ilitek_plat_regulator_power_init(); +#endif + +#if SUSPEND_RESUME_SUPPORT +#if defined(__DRM_PANEL_H__) && defined(DRM_PANEL_EARLY_EVENT_BLANK) + ret = ili_v3_drm_check_dt(ilits->dev->of_node); + if (ret) { + ILI_ERR("[ili_v3_drm_check_dt] parse drm-panel fail"); + } +#endif +#endif + + if (ilitek_plat_gpio_register() < 0) + ILI_ERR("Register gpio failed\n"); + + ili_irq_register(ilits->irq_tirgger_type); + + if (ili_tddi_init() < 0) { + ILI_ERR("ILITEK Driver probe failed\n"); + ili_irq_unregister(); + ili_dev_remove(DISABLE); + return -ENODEV; + } +#if SPRD_SYSFS_SUSPEND_RESUME + ili_sysfs_add_device(ilits->dev); + if (sysfs_create_link(NULL, &ilits->dev->kobj, "touchscreen") < 0) + ILI_INFO("Failed to create link!\n"); +#elif SUSPEND_RESUME_SUPPORT + ilitek_plat_sleep_init(); +#endif + ilits->pm_suspend = false; + init_completion(&ilits->pm_completion); +#if CHARGER_NOTIFIER_CALLBACK +#if KERNEL_VERSION(4, 1, 0) <= LINUX_VERSION_CODE + /* add_for_charger_start */ + ilitek_plat_charger_init(); + /* add_for_charger_end */ +#endif +#endif + +#ifdef ILI_SENSOR_EN + mutex_init(&ilits->state_mutex); + if (!initialized_sensor) { +#ifdef CONFIG_HAS_WAKELOCK + wake_lock_init(&(ilits->gesture_wakelock), WAKE_LOCK_SUSPEND, "dt-wake-lock"); +#else + PM_WAKEUP_REGISTER(ilits->dev, ilits->gesture_wakelock, "dt-wake-lock"); + if (!ilits->gesture_wakelock) { + ILI_ERR("ILITEK Driver failed to load. wakeup_source_init failed."); + return -ENOMEM; + } +#endif + if (!ili_sensor_init(ilits)) + initialized_sensor = true; + } +#endif + + ILI_INFO("ILITEK Driver loaded successfully!#"); + return 0; +} + +static int ilitek_tp_pm_suspend(struct device *dev) +{ + ILI_INFO("CALL BACK TP PM SUSPEND"); + ilits->pm_suspend = true; +#if KERNEL_VERSION(3, 12, 0) >= LINUX_VERSION_CODE + ilits->pm_completion.done = 0; +#else + reinit_completion(&ilits->pm_completion); +#endif + return 0; +} + +static int ilitek_tp_pm_resume(struct device *dev) +{ + ILI_INFO("CALL BACK TP PM RESUME"); + ilits->pm_suspend = false; + complete(&ilits->pm_completion); + return 0; +} + +static int ilitek_plat_remove(void) +{ + ILI_INFO("remove plat dev\n"); +#if IS_ENABLED(CONFIG_DRM_MEDIATEK) + if (ilits && mtk_disp_notifier_unregister(&ilits->disp_notifier)) + ILI_ERR("Error unregistering disp_notifier\n"); +#endif +#if SPRD_SYSFS_SUSPEND_RESUME + ili_sysfs_remove_device(ilits->dev); +#endif + ili_dev_remove(ENABLE); + return 0; +} + +static const struct dev_pm_ops tp_pm_ops = { + .suspend = ilitek_tp_pm_suspend, + .resume = ilitek_tp_pm_resume, +}; + +static const struct of_device_id tp_match_table[] = { + {.compatible = DTS_OF_NAME}, + {}, +}; + +#ifdef ROI +struct ts_device_ops ilitek_ops = { + .chip_roi_rawdata = ili_knuckle_roi_rawdata, + .chip_roi_switch = ili_knuckle_roi_switch, +}; +#endif + +static struct ilitek_hwif_info hwif = { + .bus_type = TDDI_INTERFACE, + .plat_type = TP_PLAT_QCOM, + .owner = THIS_MODULE, + .name = TDDI_DEV_ID, + .of_match_table = of_match_ptr(tp_match_table), + .plat_probe = ilitek_plat_probe, + .plat_remove = ilitek_plat_remove, + .pm = &tp_pm_ops, +}; + +static int __init ilitek_plat_dev_init(void) +{ + ILI_INFO("ILITEK TP driver init for QCOM\n"); + if (ili_dev_init(&hwif) < 0) { + ILI_ERR("Failed to register i2c/spi bus driver\n"); + return -ENODEV; + } + return 0; +} + +static void __exit ilitek_plat_dev_exit(void) +{ + ILI_INFO("remove plat dev\n"); + ili_dev_remove(ENABLE); +} + +#if defined(__DRM_PANEL_H__) && defined(DRM_PANEL_EARLY_EVENT_BLANK) +late_initcall(ilitek_plat_dev_init); +#else +module_init(ilitek_plat_dev_init); +#endif +#if KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); +#endif +module_exit(ilitek_plat_dev_exit); +MODULE_AUTHOR("ILITEK"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_spi.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_spi.c new file mode 100644 index 000000000000..e7ba7a4a3323 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_spi.c @@ -0,0 +1,910 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" + +struct touch_bus_info { + struct spi_driver bus_driver; + struct ilitek_hwif_info *hwif; +}; + +struct ilitek_ts_data *ilits; + +#if defined(ILI_MTK_CHECK_PANEL) || defined(ILI_TP_MODULE_EN) +const char *active_panel_name; +#endif + +#if SPI_DMA_TRANSFER_SPLIT +#if SPI_DMA_TRANSFER_SPLIT_OLD +#define DMA_TRANSFER_MAX_CHUNK 64 /* number of chunks to be transferred. */ +#define DMA_TRANSFER_MAX_LEN 1024 /* length of a chunk. */ + +int ili_spi_write_then_read_split(struct spi_device *spi, + const void *txbuf, unsigned n_tx, + void *rxbuf, unsigned n_rx) +{ + int status = -1, duplex_len = 0; + int xfercnt = 0, xferlen = 0, xferloop = 0; + int offset = 0; + u8 cmd = 0; + struct spi_message message; + struct spi_transfer *xfer; + + xfer = kzalloc(DMA_TRANSFER_MAX_CHUNK * sizeof(struct spi_transfer), GFP_KERNEL); + + if (n_rx > SPI_RX_BUF_SIZE) { + ILI_ERR("Rx length is greater than spi local buf, abort\n"); + status = -ENOMEM; + goto out; + } + + spi_message_init(&message); + memset(ilits->spi_tx, 0x0, SPI_TX_BUF_SIZE); + memset(ilits->spi_rx, 0x0, SPI_RX_BUF_SIZE); + + if ((n_tx > 0) && (n_rx > 0)) + cmd = SPI_READ; + else + cmd = SPI_WRITE; + + switch (cmd) { + case SPI_WRITE: + if (n_tx % DMA_TRANSFER_MAX_LEN) + xferloop = (n_tx / DMA_TRANSFER_MAX_LEN) + 1; + else + xferloop = n_tx / DMA_TRANSFER_MAX_LEN; + + xferlen = n_tx; + memcpy(ilits->spi_tx, (u8 *)txbuf, xferlen); + + for (xfercnt = 0; xfercnt < xferloop; xfercnt++) { + if (xferlen > DMA_TRANSFER_MAX_LEN) + xferlen = DMA_TRANSFER_MAX_LEN; + + xfer[xfercnt].len = xferlen; + xfer[xfercnt].tx_buf = ilits->spi_tx + xfercnt * DMA_TRANSFER_MAX_LEN; + spi_message_add_tail(&xfer[xfercnt], &message); + xferlen = n_tx - (xfercnt+1) * DMA_TRANSFER_MAX_LEN; + } + status = spi_sync(spi, &message); + break; + case SPI_READ: + if (n_tx > DMA_TRANSFER_MAX_LEN) { + ILI_ERR("Tx length must be lower than dma length (%d).\n", DMA_TRANSFER_MAX_LEN); + status = -EINVAL; + break; + } + + if (!atomic_read(&ilits->ice_stat)) + offset = 2; + + memcpy(ilits->spi_tx, txbuf, n_tx); + duplex_len = n_tx + n_rx + offset; + + if (duplex_len % DMA_TRANSFER_MAX_LEN) + xferloop = (duplex_len / DMA_TRANSFER_MAX_LEN) + 1; + else + xferloop = duplex_len / DMA_TRANSFER_MAX_LEN; + + xferlen = duplex_len; + for (xfercnt = 0; xfercnt < xferloop; xfercnt++) { + if (xferlen > DMA_TRANSFER_MAX_LEN) + xferlen = DMA_TRANSFER_MAX_LEN; + + xfer[xfercnt].len = xferlen; + xfer[xfercnt].tx_buf = ilits->spi_tx; + xfer[xfercnt].rx_buf = ilits->spi_rx + xfercnt * DMA_TRANSFER_MAX_LEN; + spi_message_add_tail(&xfer[xfercnt], &message); + xferlen = duplex_len - (xfercnt + 1) * DMA_TRANSFER_MAX_LEN; + } + + status = spi_sync(spi, &message); + if (status == 0) { + if (ilits->spi_rx[1] != SPI_ACK && !atomic_read(&ilits->ice_stat)) { + status = DO_SPI_RECOVER; + ILI_ERR("Do spi recovery: rxbuf[1] = 0x%x, ice = %d\n", ilits->spi_rx[1], atomic_read(&ilits->ice_stat)); + break; + } + + memcpy((u8 *)rxbuf, ilits->spi_rx + offset + 1, n_rx); + } else { + ILI_ERR("spi read fail, status = %d\n", status); + } + break; + default: + ILI_INFO("Unknown command 0x%x\n", cmd); + break; + } + +out: + ipio_kfree((void **)&xfer); + return status; +} +#else +#define DMA_TRANSFER_MAX_CHUNK 4 /* number of chunks to be transferred. */ +#define DMA_TRANSFER_MAX_LEN 4096 /* length of a chunk. */ + +int ili_spi_write_then_read_split(struct spi_device *spi, + const void *txbuf, unsigned n_tx, + void *rxbuf, unsigned n_rx) +{ + int status = -1, duplex_len = 0; + int xfercnt = 0, xferlen = 0, xferloop = 0; + int offset = 0; + u8 cmd = 0; + struct spi_message message; + struct spi_transfer xfer[DMA_TRANSFER_MAX_CHUNK]; + + if (n_rx > SPI_RX_BUF_SIZE) { + ILI_ERR("Rx length is greater than spi local buf, abort\n"); + status = -ENOMEM; + goto out; + } + + spi_message_init(&message); + memset(xfer, 0, sizeof(xfer)); + memset(ilits->spi_tx, 0x0, SPI_TX_BUF_SIZE); + memset(ilits->spi_rx, 0x0, SPI_RX_BUF_SIZE); + + if ((n_tx > 0) && (n_rx > 0)) + cmd = SPI_READ; + else + cmd = SPI_WRITE; + + switch (cmd) { + case SPI_WRITE: + if (n_tx % DMA_TRANSFER_MAX_LEN) + xferloop = (n_tx / DMA_TRANSFER_MAX_LEN) + 1; + else + xferloop = n_tx / DMA_TRANSFER_MAX_LEN; + + if (xferloop > DMA_TRANSFER_MAX_CHUNK) { + ILI_ERR("xferloop = %d > %d\n", xferloop, DMA_TRANSFER_MAX_CHUNK); + status = -EINVAL; + break; + } + + xferlen = n_tx; + memcpy(ilits->spi_tx, (u8 *)txbuf, xferlen); + + for (xfercnt = 0; xfercnt < xferloop; xfercnt++) { + if (xferlen > DMA_TRANSFER_MAX_LEN) + xferlen = DMA_TRANSFER_MAX_LEN; + + xfer[xfercnt].len = xferlen; + xfer[xfercnt].tx_buf = ilits->spi_tx + xfercnt * DMA_TRANSFER_MAX_LEN; + spi_message_add_tail(&xfer[xfercnt], &message); + xferlen = n_tx - (xfercnt+1) * DMA_TRANSFER_MAX_LEN; + } + status = spi_sync(spi, &message); + break; + case SPI_READ: + if (n_tx > DMA_TRANSFER_MAX_LEN) { + ILI_ERR("Tx length must be lower than dma length (%d).\n", DMA_TRANSFER_MAX_LEN); + status = -EINVAL; + break; + } + + if (!atomic_read(&ilits->ice_stat)) + offset = 2; + + memcpy(ilits->spi_tx, txbuf, n_tx); + duplex_len = n_tx + n_rx + offset; + + if (duplex_len % DMA_TRANSFER_MAX_LEN) + xferloop = (duplex_len / DMA_TRANSFER_MAX_LEN) + 1; + else + xferloop = duplex_len / DMA_TRANSFER_MAX_LEN; + + if (xferloop > DMA_TRANSFER_MAX_CHUNK) { + ILI_ERR("xferloop = %d > %d\n", xferloop, DMA_TRANSFER_MAX_CHUNK); + status = -EINVAL; + break; + } + + xferlen = duplex_len; + for (xfercnt = 0; xfercnt < xferloop; xfercnt++) { + if (xferlen > DMA_TRANSFER_MAX_LEN) + xferlen = DMA_TRANSFER_MAX_LEN; + + xfer[xfercnt].len = xferlen; + xfer[xfercnt].tx_buf = ilits->spi_tx; + xfer[xfercnt].rx_buf = ilits->spi_rx + xfercnt * DMA_TRANSFER_MAX_LEN; + spi_message_add_tail(&xfer[xfercnt], &message); + xferlen = duplex_len - (xfercnt + 1) * DMA_TRANSFER_MAX_LEN; + } + + status = spi_sync(spi, &message); + if (status == 0) { + if (ilits->spi_rx[1] != SPI_ACK && !atomic_read(&ilits->ice_stat)) { + status = DO_SPI_RECOVER; + ILI_ERR("Do spi recovery: rxbuf[1] = 0x%x, ice = %d\n", ilits->spi_rx[1], atomic_read(&ilits->ice_stat)); + break; + } + + memcpy((u8 *)rxbuf, ilits->spi_rx + offset + 1, n_rx); + } else { + ILI_ERR("spi read fail, status = %d\n", status); + } + break; + default: + ILI_INFO("Unknown command 0x%x\n", cmd); + break; + } + +out: + return status; +} +#endif +#else +int ili_spi_write_then_read_direct(struct spi_device *spi, + const void *txbuf, unsigned n_tx, + void *rxbuf, unsigned n_rx) +{ + int status = -1, duplex_len = 0; + int offset = 0; + u8 cmd; + struct spi_message message; + struct spi_transfer xfer; + + if (n_rx > SPI_RX_BUF_SIZE) { + ILI_ERR("Rx length is greater than spi local buf, abort\n"); + status = -ENOMEM; + goto out; + } + + spi_message_init(&message); + memset(&xfer, 0, sizeof(xfer)); + + if ((n_tx > 0) && (n_rx > 0)) + cmd = SPI_READ; + else + cmd = SPI_WRITE; + + switch (cmd) { + case SPI_WRITE: + xfer.len = n_tx; + xfer.tx_buf = txbuf; + spi_message_add_tail(&xfer, &message); + status = spi_sync(spi, &message); + break; + case SPI_READ: + if (!atomic_read(&ilits->ice_stat)) + offset = 2; + + duplex_len = n_tx + n_rx + offset; + if ((duplex_len > SPI_TX_BUF_SIZE) || + (duplex_len > SPI_RX_BUF_SIZE)) { + ILI_ERR("duplex_len is over than dma buf, abort\n"); + status = -ENOMEM; + break; + } + + memset(ilits->spi_tx, 0x0, SPI_TX_BUF_SIZE); + memset(ilits->spi_rx, 0x0, SPI_RX_BUF_SIZE); + + xfer.len = duplex_len; + memcpy(ilits->spi_tx, txbuf, n_tx); + xfer.tx_buf = ilits->spi_tx; + xfer.rx_buf = ilits->spi_rx; + + spi_message_add_tail(&xfer, &message); + status = spi_sync(spi, &message); + if (status == 0) { + if (ilits->spi_rx[1] != SPI_ACK && !atomic_read(&ilits->ice_stat)) { + status = DO_SPI_RECOVER; + ILI_ERR("Do spi recovery: rxbuf[1] = 0x%x, ice = %d\n", ilits->spi_rx[1], atomic_read(&ilits->ice_stat)); + break; + } + + memcpy((u8 *)rxbuf, ilits->spi_rx + offset + 1, n_rx); + } else { + ILI_ERR("spi read fail, status = %d\n", status); + } + break; + default: + ILI_INFO("Unknown command 0x%x\n", cmd); + break; + } + +out: + return status; +} +#endif + +static int ili_spi_mp_pre_cmd(u8 cdc) +{ + u8 pre[5] = {0}; + + if (!atomic_read(&ilits->mp_stat) || cdc != P5_X_SET_CDC_INIT || + ilits->chip->core_ver >= CORE_VER_1430) + return 0; + + ILI_DBG("mp test with pre commands\n"); + + pre[0] = SPI_WRITE; + pre[1] = 0x0;/* dummy byte */ + pre[2] = 0x2;/* Write len byte */ + pre[3] = P5_X_READ_DATA_CTRL; + pre[4] = P5_X_GET_CDC_DATA; + if (ilits->spi_write_then_read(ilits->spi, pre, 5, NULL, 0) < 0) { + ILI_ERR("Failed to write pre commands\n"); + return -1; + } + + pre[0] = SPI_WRITE; + pre[1] = 0x0;/* dummy byte */ + pre[2] = 0x1;/* Write len byte*/ + pre[3] = P5_X_GET_CDC_DATA; + if (ilits->spi_write_then_read(ilits->spi, pre, 4, NULL, 0) < 0) { + ILI_ERR("Failed to write pre commands\n"); + return -1; + } + return 0; +} + +static int ili_spi_pll_clk_wakeup(void) +{ + int index = 0; + u8 wdata[32] = {0}; + u8 wakeup[9] = {0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3}; + u32 wlen = sizeof(wakeup); + + wdata[0] = SPI_WRITE; + wdata[1] = wlen >> 8; + wdata[2] = wlen & 0xff; + index = 3; + + ipio_memcpy(&wdata[index], wakeup, wlen, wlen); + + wlen += index; + + ILI_INFO("Write dummy to wake up spi pll clk\n"); + if (ilits->spi_write_then_read(ilits->spi, wdata, wlen, NULL, 0) < 0) { + ILI_INFO("spi slave write error\n"); + return -1; + } + mdelay(1); + return 0; +} + +static int ili_spi_wrapper(u8 *txbuf, u32 wlen, u8 *rxbuf, u32 rlen, bool spi_irq, bool i2c_irq) +{ + int ret = 0; + int mode = 0, index = 0; + u8 wdata[128] = {0}; + u8 checksum = 0; + bool ice = atomic_read(&ilits->ice_stat); + + if (wlen > 0) { + if (!txbuf) { + ILI_ERR("txbuf is null\n"); + return -ENOMEM; + } + + /* 3 bytes data consist of length and header */ + if ((wlen + 4) > sizeof(wdata)) { + ILI_ERR("WARNING! wlen(%d) > wdata(%d), using wdata length to transfer\n", wlen, (int)sizeof(wdata)); + wlen = sizeof(wdata) - 4; + } + } + + if (rlen > 0) { + if (!rxbuf) { + ILI_ERR("rxbuf is null\n"); + return -ENOMEM; + } + } + + if (rlen > 0 && !wlen) + mode = SPI_READ; + else + mode = SPI_WRITE; + + if (ilits->int_pulse) + ilits->detect_int_stat = ili_ic_check_int_pulse; + else + ilits->detect_int_stat = ili_ic_check_int_level; + + if (spi_irq) + atomic_set(&ilits->cmd_int_check, ENABLE); + + switch (mode) { + case SPI_WRITE: + atomic_set(&ilits->ignore_report, START); +#if (PLL_CLK_WAKEUP_TP_RESUME == ENABLE) + if (ilits->pll_clk_wakeup == true) { +#else + if ((ilits->pll_clk_wakeup == true) && (ilits->tp_suspend == true)) { +#endif + ret = ili_spi_pll_clk_wakeup(); + if (ret < 0) { + ILI_ERR("Wakeup pll clk error\n"); + break; + } + } + if (ice) { + wdata[0] = SPI_WRITE; + index = 1; + } else { + wdata[0] = SPI_WRITE; + wdata[1] = wlen >> 8; + wdata[2] = wlen & 0xff; + index = 3; + } + + ipio_memcpy(&wdata[index], txbuf, wlen, wlen); + + wlen += index; + + /* + * NOTE: If TP driver is doing MP test and commanding 0xF1 to FW, we add a checksum + * to the last index and plus 1 with size. + */ + if (atomic_read(&ilits->mp_stat) && wdata[index] == P5_X_SET_CDC_INIT) { + checksum = ili_calc_packet_checksum(&wdata[index], wlen - index); + wdata[wlen] = checksum; + wlen++; + wdata[1] = (wlen - index) >> 8; + wdata[2] = (wlen - index) & 0xff; + ili_dump_data(wdata, 8, wlen, 0, "mp cdc cmd with checksum"); + } + + ret = ilits->spi_write_then_read(ilits->spi, wdata, wlen, txbuf, 0); + if (!ice) { + ILI_DBG("send cmd delay 1ms\n"); + mdelay(1); + } + + if (ret < 0) { + ILI_INFO("spi-wrapper write error\n"); + break; + } + + /* Won't break if it needs to read data following with writing. */ + if (!rlen) + break; + #if 0 /* if warning: this statement may fall through modify 0 to 1 */ + else { + if (!ice && spi_irq) { + /* Check INT triggered by FW when sending cmds. */ + if (ilits->detect_int_stat(false) < 0) { + ILI_ERR("ERROR! Check INT timeout\n"); + ret = -ETIME; + break; + } + } + + ret = ili_spi_mp_pre_cmd(wdata[3]); + if (ret < 0) + ILI_ERR("spi-wrapper mp pre cmd error\n"); + + wdata[0] = SPI_READ; + + ret = ilits->spi_write_then_read(ilits->spi, wdata, 1, rxbuf, rlen); + if (ret < 0) + ILI_ERR("spi-wrapper read error\n"); + + break; + } + #endif + case SPI_READ: + if (!ice && spi_irq) { + /* Check INT triggered by FW when sending cmds. */ + if (ilits->detect_int_stat(false) < 0) { + ILI_ERR("ERROR! Check INT timeout\n"); + ret = -ETIME; + break; + } + } + + ret = ili_spi_mp_pre_cmd(wdata[3]); + if (ret < 0) + ILI_ERR("spi-wrapper mp pre cmd error\n"); + + wdata[0] = SPI_READ; + + ret = ilits->spi_write_then_read(ilits->spi, wdata, 1, rxbuf, rlen); + if (ret < 0) + ILI_ERR("spi-wrapper read error\n"); + + break; + default: + ILI_ERR("Unknown spi mode (%d)\n", mode); + ret = -EINVAL; + break; + } + + atomic_set(&ilits->ignore_report, END); + + if (spi_irq) + atomic_set(&ilits->cmd_int_check, DISABLE); + + return ret; +} + +int ili_core_spi_setup(int num) +{ + u32 freq[] = { + TP_SPI_CLK_1M, + TP_SPI_CLK_2M, + TP_SPI_CLK_3M, + TP_SPI_CLK_4M, + TP_SPI_CLK_5M, + TP_SPI_CLK_6M, + TP_SPI_CLK_7M, + TP_SPI_CLK_8M, + TP_SPI_CLK_9M, + TP_SPI_CLK_10M, + TP_SPI_CLK_11M, + TP_SPI_CLK_12M, + TP_SPI_CLK_13M, + TP_SPI_CLK_14M, + TP_SPI_CLK_15M + }; + + if (num >= ARRAY_SIZE(freq)) { + ILI_ERR("Invaild clk freq, set default clk freq\n"); + num = 7; + } + + ILI_INFO("spi clock = %d\n", freq[num]); + + ilits->spi->mode = SPI_MODE_0; + ilits->spi->bits_per_word = 8; + ilits->spi->max_speed_hz = freq[num]; + ilits->spi->chip_select = 0; + + if (spi_setup(ilits->spi) < 0) { + ILI_ERR("Failed to setup spi device\n"); + return -ENODEV; + } + + ILI_INFO("name = %s, bus_num = %d,cs = %d, mode = %d, speed = %d\n", + ilits->spi->modalias, + ilits->spi->master->bus_num, + ilits->spi->chip_select, + ilits->spi->mode, + ilits->spi->max_speed_hz); + return 0; +} + +void ili_parse_tp_module(void) +{ + int tp_module = 0; + +#ifdef ILI_TP_MODULE_EN + if(active_panel_name) { + if (strstr(active_panel_name, "tm") || strstr(active_panel_name, "tianma")) { + tp_module = MODEL_TM; + } + else if (strstr(active_panel_name, "djn")) { + tp_module = MODEL_DJ; + } + else if (strstr(active_panel_name, "txd")) { + tp_module = MODEL_TXD; + } + else if (strstr(active_panel_name, "csot")) { + tp_module = MODEL_CSOT; + } + else if (strstr(active_panel_name, "boe")) { + tp_module = MODEL_BOE; + } + else if (strstr(active_panel_name, "auo")) { + tp_module = MODEL_AUO; + } + else + ILI_INFO("MODEL for panel:%s to be added!\n", active_panel_name); + + if (tp_module) + ILI_INFO("get tp_module:%d\n", tp_module); + } + else + ILI_INFO("active_panel NULL\n"); + +#endif + + ilits->tp_module = tp_module; +} + +static int parse_dt(struct device_node *np) +{ + int32_t ret = 0; + +#ifdef ILI_DOUBLE_TAP_CTRL + uint32_t value; + + if (!of_property_read_u32(np, "ilitek,supported_gesture_type", &value)) { + ilits->supported_gesture_type = (uint8_t)value; + ILI_INFO("supported_gesture_type=%d\n", ilits->supported_gesture_type); + } + else + ILI_INFO("warn: supported_gesture_type not set\n"); +#endif //ILI_DOUBLE_TAP_CTRL + +#ifdef ILI_SENSOR_EN + if (of_property_read_bool(np, "ilitek,report_gesture_key")) { + ILI_INFO("ilitek,report_gesture_key set"); + ilits->report_gesture_key = 1; + } else { + ilits->report_gesture_key = 0; + } +#endif + +#if CHARGER_NOTIFIER_CALLBACK + ret = of_property_read_string(np, "touch,psy-name", &ilits->psy_name); + if (ilits->psy_name) + ILI_INFO("%s: get psy_name:%s", __func__, ilits->psy_name); +#endif + + return ret; +} + +#ifdef ILI_MTK_CHECK_PANEL +static void ili_get_active_panel(void) +{ + int rc; + struct device_node *chosen = of_find_node_by_name(NULL, "chosen"); + + if(chosen) { + rc = of_property_read_string(chosen, "mmi,panel_name", (const char **)&active_panel_name); + if (rc) + ILI_INFO("mmi,panel_name null\n"); + else + ILI_DBG("active_panel_name=%s\n", active_panel_name); + } + else + ILI_INFO("chosen node null\n"); + +} + +static int ili_check_panel(void) +{ + ILI_DBG("enter"); + ili_get_active_panel(); + + if (!active_panel_name) + ILI_INFO("active_panel NULL\n"); + else if(strstr(active_panel_name, "ili78") || strstr(active_panel_name, "ili98") || strstr(active_panel_name, "il77")) + { + ILI_INFO("matched active_panel:%s ", active_panel_name); + return 0; + } + else + ILI_DBG("not macthed active_panel:%s\n", active_panel_name); + + return -1; +} + +#endif + +static int ilitek_spi_probe(struct spi_device *spi) +{ + struct touch_bus_info *info = + container_of(to_spi_driver(spi->dev.driver), + struct touch_bus_info, bus_driver); + +#ifdef ILI_MTK_CHECK_PANEL + int ret; +#endif + + ILI_INFO("ilitek spi probe\n"); + + if (!spi) { + ILI_ERR("spi device is NULL\n"); + return -ENODEV; + } + +#ifdef ILI_MTK_CHECK_PANEL + ret = ili_check_panel(); + if (ret) { + ILI_INFO("check panel error\n"); + return ret; + } +#endif + + ilits = devm_kzalloc(&spi->dev, sizeof(struct ilitek_ts_data), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits)) { + ILI_ERR("Failed to allocate ts memory, %ld\n", PTR_ERR(ilits)); + return -ENOMEM; + } + + if (spi->master->flags & SPI_MASTER_HALF_DUPLEX) { + ILI_ERR("Full duplex not supported by master\n"); + return -EIO; + } + + ilits->update_buf = kzalloc(MAX_HEX_FILE_SIZE, GFP_KERNEL | GFP_DMA); + if (ERR_ALLOC_MEM(ilits->update_buf)) { + ILI_ERR("fw kzalloc error\n"); + return -ENOMEM; + } + + /* Used for receiving touch data only, do not mix up with others. */ + ilits->tr_buf = kzalloc(TR_BUF_SIZE, GFP_ATOMIC); + if (ERR_ALLOC_MEM(ilits->tr_buf)) { + ILI_ERR("failed to allocate touch report buffer\n"); + return -ENOMEM; + } + + ilits->spi_tx = kzalloc(SPI_TX_BUF_SIZE, GFP_KERNEL | GFP_DMA); + if (ERR_ALLOC_MEM(ilits->spi_tx)) { + ILI_ERR("Failed to allocate spi tx buffer\n"); + return -ENOMEM; + } + + ilits->spi_rx = kzalloc(SPI_RX_BUF_SIZE, GFP_KERNEL | GFP_DMA); + if (ERR_ALLOC_MEM(ilits->spi_rx)) { + ILI_ERR("Failed to allocate spi rx buffer\n"); + return -ENOMEM; + } + + ilits->gcoord = kzalloc(sizeof(struct gesture_coordinate), GFP_KERNEL); + if (ERR_ALLOC_MEM(ilits->gcoord)) { + ILI_ERR("Failed to allocate gresture coordinate buffer\n"); + return -ENOMEM; + } + + ilits->i2c = NULL; + ilits->spi = spi; + ilits->dev = &spi->dev; + ilits->hwif = info->hwif; + ilits->phys = "SPI"; + ilits->wrapper = ili_spi_wrapper; + ilits->detect_int_stat = ili_ic_check_int_pulse; + ilits->int_pulse = true; + ilits->mp_retry = false; + +#if SPI_DMA_TRANSFER_SPLIT + ilits->spi_write_then_read = ili_spi_write_then_read_split; +#else + ilits->spi_write_then_read = ili_spi_write_then_read_direct; +#endif + + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + ilits->tp_data_format = DATA_FORMAT_DEMO; + ilits->tp_data_len = P5_X_DEMO_MODE_PACKET_LEN; + ilits->tp_data_mode = AP_MODE; + + if (TDDI_RST_BIND) + ilits->reset = TP_IC_WHOLE_RST_WITH_FLASH; + else + ilits->reset = TP_HW_RST_ONLY; + + ilits->rst_edge_delay = 10; + ilits->fw_open = REQUEST_FIRMWARE; + ilits->fw_upgrade_mode = UPGRADE_IRAM; + ilits->mp_move_code = ili_move_mp_code_iram; + ilits->gesture_move_code = ili_move_gesture_code_iram; + ilits->esd_recover = ili_wq_esd_spi_check; + ilits->esd_func_ctrl = ENABLE_WQ_ESD; + ilits->ges_recover = ili_touch_esd_gesture_iram; + ilits->gesture_mode = DATA_FORMAT_GESTURE_INFO; + ilits->gesture_demo_ctrl = DISABLE; + ilits->wtd_ctrl = OFF; + ilits->report = ENABLE; + ilits->dnp = DISABLE; + ilits->dlnp = DISABLE; + ilits->irq_tirgger_type = IRQF_TRIGGER_FALLING; + ilits->info_from_hex = ENABLE; + ilits->wait_int_timeout = AP_INT_TIMEOUT; + ilits->ice_flash_cs_ctrl = ENABLE; + ilits->compress_disable = ENABLE; + ilits->compress_handonly_disable = ENABLE; + ilits->compress_penonly_disable = ENABLE; +#if MULTI_REPORT_RATE + ilits->current_report_rate_mode = DDI60_TP120; /*Default report mode*/ +#endif + + //---parse dts--- + parse_dt(spi->dev.of_node); + + //---parse tp module--- + ili_parse_tp_module(); + +#if ENABLE_GESTURE + ilits->gesture = ENABLE; + ilits->ges_sym.double_tap = DOUBLE_TAP; + ilits->ges_sym.alphabet_line_2_top = ALPHABET_LINE_2_TOP; + ilits->ges_sym.alphabet_line_2_bottom = ALPHABET_LINE_2_BOTTOM; + ilits->ges_sym.alphabet_line_2_left = ALPHABET_LINE_2_LEFT; + ilits->ges_sym.alphabet_line_2_right = ALPHABET_LINE_2_RIGHT; + ilits->ges_sym.alphabet_m = ALPHABET_M; + ilits->ges_sym.alphabet_w = ALPHABET_W; + ilits->ges_sym.alphabet_c = ALPHABET_C; + ilits->ges_sym.alphabet_E = ALPHABET_E; + ilits->ges_sym.alphabet_V = ALPHABET_V; + ilits->ges_sym.alphabet_O = ALPHABET_O; + ilits->ges_sym.alphabet_S = ALPHABET_S; + ilits->ges_sym.alphabet_Z = ALPHABET_Z; + ilits->ges_sym.alphabet_V_down = ALPHABET_V_DOWN; + ilits->ges_sym.alphabet_V_left = ALPHABET_V_LEFT; + ilits->ges_sym.alphabet_V_right = ALPHABET_V_RIGHT; + ilits->ges_sym.alphabet_two_line_2_bottom = ALPHABET_TWO_LINE_2_BOTTOM; + ilits->ges_sym.alphabet_F = ALPHABET_F; + ilits->ges_sym.alphabet_AT = ALPHABET_AT; + + ILI_INFO("gesture eanble:%d\n", ilits->gesture); +#endif + + if (ili_core_spi_setup(SPI_CLK) < 0) + return -EINVAL; + + return info->hwif->plat_probe(); +} + +static int ilitek_spi_remove(struct spi_device *spi) +{ + ILI_INFO(); + return 0; +} + +static struct spi_device_id tp_spi_id[] = { + {TDDI_DEV_ID, 0}, + {}, +}; + +int ili_interface_dev_init(struct ilitek_hwif_info *hwif) +{ + struct touch_bus_info *info; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) { + ILI_ERR("faied to allocate spi_driver\n"); + return -ENOMEM; + } + + if (hwif->bus_type != BUS_SPI) { + ILI_ERR("Not SPI dev\n"); + ipio_kfree((void **)&info); + return -EINVAL; + } + + hwif->info = info; + + info->bus_driver.driver.name = hwif->name; + info->bus_driver.driver.owner = hwif->owner; + info->bus_driver.driver.of_match_table = hwif->of_match_table; + info->bus_driver.driver.pm = hwif->pm; + + info->bus_driver.probe = ilitek_spi_probe; + info->bus_driver.remove = ilitek_spi_remove; + info->bus_driver.id_table = tp_spi_id; + + info->hwif = hwif; + return spi_register_driver(&info->bus_driver); +} + +void ili_interface_dev_exit(struct ilitek_ts_data *ts, bool flag) +{ + struct touch_bus_info *info = (struct touch_bus_info *)ilits->hwif->info; + + ILI_INFO("remove spi dev\n"); + kfree(ilits->update_buf); + kfree(ilits->spi_tx); + kfree(ilits->spi_rx); + + if (flag == ENABLE) { + spi_unregister_driver(&info->bus_driver); + ipio_kfree((void **)&info); + } +} diff --git a/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_touch.c b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_touch.c new file mode 100644 index 000000000000..0dfcee1369d6 --- /dev/null +++ b/drivers/input/touchscreen/ilitek_v3_mmi/ilitek_v3_touch.c @@ -0,0 +1,2389 @@ +/* + * ILITEK Touch IC driver + * + * Copyright (C) 2011 ILI Technology Corporation. + * + * Author: Dicky Chiang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ilitek_v3.h" + +/*gesture info mode*/ +struct ili_demo_debug_info_id0 { + u32 id : 8; + u32 sys_powr_state_e : 3; + u32 sys_state_e : 3; + u32 tp_state_e : 2; + + u32 touch_palm_state : 2; + u32 app_an_statu_e : 3; + u32 app_sys_bg_err : 1; + u32 g_b_wrong_bg : 1; + u32 reserved0 : 1; + + u32 normal_mode : 1; + u32 charger_mode : 1; + u32 glove_mode : 1; + u32 stylus_mode : 1; + u32 multi_mode : 1; + u32 noise_mode : 1; + u32 palm_plus_mode : 1; + u32 floating_mode : 1; + + u32 algo_pt_status0 : 3; + u32 algo_pt_status1 : 3; + u32 algo_pt_status2 : 3; + u32 algo_pt_status3 : 3; + u32 algo_pt_status4 : 3; + u32 algo_pt_status5 : 3; + u32 algo_pt_status6 : 3; + u32 algo_pt_status7 : 3; + u32 algo_pt_status8 : 3; + u32 algo_pt_status9 : 3; + u32 reserved2 : 2; + + u32 hopping_flg : 1; + u32 hopping_index : 5; + u32 frequency_h : 2; + u32 frequency_l : 8; + u32 reserved3 : 8; + u32 reserved4 : 8; + +}; + +void ili_dump_data(void *data, int type, int len, int row_len, const char *name) +{ + int i, row = 31; + u8 *p8 = NULL; + s32 *p32 = NULL; + s16 *p16 = NULL; + + if (!debug_en) + return; + + if (row_len > 0) + row = row_len; + + if (data == NULL) { + ILI_ERR("The data going to dump is NULL\n"); + return; + } + + pr_cont("\n\n"); + pr_cont("ILITEK: Dump %s data\n", name); + pr_cont("ILITEK: "); + + if (type == 8) + p8 = (u8 *) data; + if (type == 32 || type == 10) + p32 = (s32 *) data; + if (type == 16) + p16 = (s16 *) data; + + for (i = 0; i < len; i++) { + if (type == 8) + pr_cont(" %4x ", p8[i]); + else if (type == 32) + pr_cont(" %4x ", p32[i]); + else if (type == 10) + pr_cont(" %4d ", p32[i]); + else if (type == 16) + pr_cont(" %4d ", p16[i]); + + if ((i % row) == row - 1) { + pr_cont("\n"); + pr_cont("ILITEK: "); + } + } + pr_cont("\n\n"); +} + +static void dma_clear_reg_setting(void) +{ + /* 1. interrupt t0/t1 enable flag */ + if (ili_ice_mode_bit_mask_write(INTR32_ADDR, INTR32_reg_t0_int_en | INTR32_reg_t1_int_en, (0 << 24)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR32_reg_t0_int_en | INTR32_reg_t1_int_en, INTR32_ADDR); + + /* 2. clear tdi_err_int_flag */ + if (ili_ice_mode_bit_mask_write(INTR2_ADDR, INTR2_tdi_err_int_flag_clear, (1 << 18)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR2_tdi_err_int_flag_clear, INTR2_ADDR); + + /* 3. clear dma channel 0 src1 info */ + if (ili_ice_mode_write(DMA49_reg_dma_ch0_src1_addr, 0x00000000, 4) < 0) + ILI_ERR("Write 0x00000000 at %x failed\n", DMA49_reg_dma_ch0_src1_addr); + if (ili_ice_mode_write(DMA50_reg_dma_ch0_src1_step_inc, 0x00, 1) < 0) + ILI_ERR("Write 0x0 at %x failed\n", DMA50_reg_dma_ch0_src1_step_inc); + if (ili_ice_mode_bit_mask_write(DMA50_ADDR, DMA50_reg_dma_ch0_src1_format | DMA50_reg_dma_ch0_src1_en, BIT(31)) < 0) + ILI_ERR("Write %lu at %x failed\n", DMA50_reg_dma_ch0_src1_format | DMA50_reg_dma_ch0_src1_en, DMA50_ADDR); + + /* 4. clear dma channel 0 trigger select */ + if (ili_ice_mode_bit_mask_write(DMA48_ADDR, DMA48_reg_dma_ch0_trigger_sel, (0 << 16)) < 0) + ILI_ERR("Write %lu at %x failed\n", DMA48_reg_dma_ch0_trigger_sel, DMA48_ADDR); + if (ili_ice_mode_bit_mask_write(INTR1_ADDR, INTR1_reg_flash_int_flag, (1 << 25)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR1_reg_flash_int_flag, INTR1_ADDR); + + /* 5. clear dma flash setting */ + ili_flash_clear_dma(); +} + +static void dma_trigger_reg_setting(u32 reg_dest_addr, u32 flash_start_addr, u32 copy_size) +{ + int retry = 30; + u32 stat = 0; + + /* 1. set dma channel 0 clear */ + if (ili_ice_mode_bit_mask_write(DMA48_ADDR, DMA48_reg_dma_ch0_start_clear, (1 << 25)) < 0) + ILI_ERR("Write %lu at %x failed\n", DMA48_reg_dma_ch0_start_clear, DMA48_ADDR); + + /* 2. set dma channel 0 src1 info */ + if (ili_ice_mode_write(DMA49_reg_dma_ch0_src1_addr, 0x00041010, 4) < 0) + ILI_ERR("Write 0x00041010 at %x failed\n", DMA49_reg_dma_ch0_src1_addr); + if (ili_ice_mode_write(DMA50_reg_dma_ch0_src1_step_inc, 0x00, 1) < 0) + ILI_ERR("Write 0x00 at %x failed\n", DMA50_reg_dma_ch0_src1_step_inc); + if (ili_ice_mode_bit_mask_write(DMA50_ADDR, DMA50_reg_dma_ch0_src1_format | DMA50_reg_dma_ch0_src1_en, BIT(31)) < 0) + ILI_ERR("Write %lu at %x failed\n", DMA50_reg_dma_ch0_src1_format | DMA50_reg_dma_ch0_src1_en, DMA50_ADDR); + + /* 3. set dma channel 0 src2 info */ + if (ili_ice_mode_bit_mask_write(DMA52_ADDR, DMA52_reg_dma_ch0_src2_en, (0 << 31)) < 0) + ILI_ERR("Write %lu at %x failed\n", DMA52_reg_dma_ch0_src2_en, DMA52_ADDR); + + /* 4. set dma channel 0 dest info */ + if (ili_ice_mode_write(DMA53_reg_dma_ch0_dest_addr, reg_dest_addr, 3) < 0) + ILI_ERR("Write %x at %x failed\n", reg_dest_addr, DMA53_reg_dma_ch0_dest_addr); + if (ili_ice_mode_write(DMA54_reg_dma_ch0_dest_step_inc, 0x01, 1) < 0) + ILI_ERR("Write 0x01 at %x failed\n", DMA54_reg_dma_ch0_dest_step_inc); + + if (ili_ice_mode_write(DMA54_ADDR, DMA54_reg_dma_ch0_dest_format | DMA54_reg_dma_ch0_dest_en, BIT(31)) < 0) + ILI_ERR("Write %lu at %x failed\n", DMA54_reg_dma_ch0_dest_format | DMA54_reg_dma_ch0_dest_en, DMA54_ADDR); + + /* 5. set dma channel 0 trafer info */ + if (ili_ice_mode_write(DMA55_reg_dma_ch0_trafer_counts, copy_size, 4) < 0) + ILI_ERR("Write %x at %x failed\n", copy_size, DMA55_reg_dma_ch0_trafer_counts); + if (ili_ice_mode_bit_mask_write(DMA55_ADDR, DMA55_reg_dma_ch0_trafer_mode, (0 << 24)) < 0) + ILI_ERR("Write %lu at %x failed\n", DMA55_reg_dma_ch0_trafer_mode, DMA55_ADDR); + + /* 6. set dma channel 0 int info */ + if (ili_ice_mode_bit_mask_write(INTR33_ADDR, INTR33_reg_dma_ch0_int_en, (1 << 17)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR33_reg_dma_ch0_int_en, INTR33_ADDR); + + /* 7. set dma channel 0 trigger select */ + if (ili_ice_mode_bit_mask_write(DMA48_ADDR, DMA48_reg_dma_ch0_trigger_sel, (1 << 16)) < 0) + ILI_ERR("Write %lu at %x failed\n", DMA48_reg_dma_ch0_trigger_sel, DMA48_ADDR); + + /* 8. set dma flash setting */ + ili_flash_dma_write(flash_start_addr, (flash_start_addr+copy_size), copy_size); + + /* 9. clear flash and dma ch0 int flag */ + if (ili_ice_mode_bit_mask_write(INTR1_ADDR, INTR1_reg_dma_ch1_int_flag | INTR1_reg_flash_int_flag, BIT(16) | BIT(25)) < 0) + ILI_ERR("Write %lu at %x failed\n", INTR1_reg_dma_ch1_int_flag | INTR1_reg_flash_int_flag, INTR1_ADDR); + if (ili_ice_mode_bit_mask_write(0x041013, BIT(0), 1) < 0) /* patch */ + ILI_ERR("Write %lu at %x failed\n", BIT(0), 0x041013); + + /* DMA Trigger */ + if (ili_ice_mode_write(FLASH4_reg_rcv_data, 0xFF, 1) < 0) + ILI_ERR("Trigger DMA failed\n"); + + /* waiting for fw reload code completed. */ + while (retry > 0) { + if (ili_ice_mode_read(INTR1_ADDR, &stat, sizeof(u32)) < 0) { + ILI_ERR("Read 0x%x error\n", INTR1_ADDR); + retry--; + continue; + } + + ILI_DBG("fw dma stat = %x\n", stat); + + if ((stat & BIT(16)) == BIT(16)) + break; + + retry--; + usleep_range(1000, 1000); + } + + if (retry <= 0) + ILI_ERR("DMA fail: Regsiter = 0x%x Flash = 0x%x, Size = %d\n", + reg_dest_addr, flash_start_addr, copy_size); + + /* CS High */ + if (ili_ice_mode_write(FLASH0_reg_flash_csb, 0x1, 1) < 0) + ILI_ERR("Pull CS High failed\n"); + /* waiting for CS status done */ + mdelay(10); +} + +int ili_move_mp_code_flash(void) +{ + int ret = 0, retry = 10; + u32 mp_text_size = 0, mp_andes_init_size = 0, stat = 0; + u32 mp_flash_addr, mp_size, overlay_start_addr, overlay_end_addr; + bool dma_trigger_enable = 0; + u8 cmd[2] = {0}; + u8 data[16] = {0}; + + cmd[0] = P5_X_MP_TEST_MODE_INFO; + ret = ilits->wrapper(cmd, sizeof(u8), data, ilits->protocol->mp_info_len, ON, OFF); + ili_dump_data(data, 8, ilits->protocol->mp_info_len, 0, "MP overlay info"); + if (ret < 0) { + ILI_ERR("Failed to write info cmd\n"); + goto out; + } + + dma_trigger_enable = 0; + + mp_flash_addr = data[3] + (data[2] << 8) + (data[1] << 16); + mp_size = data[6] + (data[5] << 8) + (data[4] << 16); + overlay_start_addr = data[9] + (data[8] << 8) + (data[7] << 16); + overlay_end_addr = data[12] + (data[11] << 8) + (data[10] << 16); + + if (overlay_start_addr != 0x0 && overlay_end_addr != 0x0 + && data[0] == P5_X_MP_TEST_MODE_INFO) + dma_trigger_enable = 1; + + ILI_INFO("MP info Overlay: Enable = %d, addr = 0x%x ~ 0x%x, flash addr = 0x%x, mp size = 0x%x\n", + dma_trigger_enable, overlay_start_addr, + overlay_end_addr, mp_flash_addr, mp_size); + + if (ilits->chip->core_ver >= CORE_VER_1700) { + cmd[0] = P5_X_NEW_CONTROL_FORMAT; + } else { + cmd[0] = P5_X_MODE_CONTROL; + } + cmd[1] = P5_X_FW_TEST_MODE; + ret = ilits->wrapper(cmd, 2, NULL, 0, ON, OFF); + if (ret < 0) + goto out; + + /* Check if ic is ready switching test mode from demo mode */ + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + ret = ili_ic_check_busy(20, 50, ON); /* Set busy as 0x41 */ + if (ret < 0) + goto out; + + ilits->ice_flash_cs_ctrl = DISABLE; + if (ilits->cascade_info_block.nNum != 0) { + ret = ili_ice_mode_ctrl_by_mode(ENABLE, OFF, BOTH); + } else { + ret = ili_ice_mode_ctrl(ENABLE, OFF); + } + ilits->ice_flash_cs_ctrl = ENABLE; + + if (ret < 0) + goto out; + + if (dma_trigger_enable) { + mp_andes_init_size = overlay_start_addr; + mp_text_size = (mp_size - overlay_end_addr) + 1; + ILI_INFO("MP andes init size = %d , MP text size = %d\n", mp_andes_init_size, mp_text_size); + + dma_clear_reg_setting(); + + ILI_INFO("[Move ANDES.INIT to DRAM]\n"); + dma_trigger_reg_setting(0, mp_flash_addr, mp_andes_init_size); /* DMA ANDES.INIT */ + + dma_clear_reg_setting(); + + ILI_INFO("[Move MP.TEXT to DRAM]\n"); + dma_trigger_reg_setting(overlay_end_addr, (mp_flash_addr + overlay_start_addr), mp_text_size); + + dma_clear_reg_setting(); + } else { + if (ilits->cascade_info_block.nNum != 0) { + /* DMA Trigger */ + if (ili_ice_mode_write_by_mode(FLASH4_reg_rcv_data, 0xFF, 1, BOTH) < 0) + ILI_ERR("Trigger DMA failed\n"); + + /* waiting for fw reload code completed. */ + while (retry > 0) { + if (ili_ice_mode_read_by_mode(INTR1_FLASH_INT_FLAG, &stat, sizeof(u32), MASTER) < 0) { + ILI_ERR("Read 0x%x error\n", INTR1_FLASH_INT_FLAG); + retry--; + continue; + } + + ILI_DBG("fw dma stat = 0x%x\n", stat); + + if ((stat & BIT(1)) == BIT(1)) + break; + + retry--; + usleep_range(10000, 10000); + } + + if (retry <= 0) + ILI_ERR("Polling DMA fail: Regsiter = 0x%X state = 0x%X\n", INTR1_FLASH_INT_FLAG, stat); + + /* CS High */ + if (ili_ice_mode_write_by_mode(FLASH0_reg_flash_csb, 0x1, 1, BOTH) < 0) + ILI_ERR("Pull CS High failed\n"); + + /* waiting for CS status done */ + mdelay(10); + } else { + if (ili_ice_mode_write(FLASH4_reg_rcv_data, 0xFF, 1) < 0) + ILI_ERR("Trigger DMA failed\n"); + + /* waiting for fw reload code completed. */ + while (retry > 0) { + if (ili_ice_mode_read(INTR1_FLASH_INT_FLAG, &stat, sizeof(u32)) < 0) { + ILI_ERR("Read 0x%x error\n", INTR1_FLASH_INT_FLAG); + retry--; + continue; + } + + ILI_DBG("fw dma stat = 0x%x\n", stat); + + if ((stat & BIT(1)) == BIT(1)) + break; + + retry--; + usleep_range(10000, 10000); + } + + if (retry <= 0) + ILI_ERR("Polling DMA fail: Regsiter = 0x%X state = 0x%X\n", INTR1_FLASH_INT_FLAG, stat); + + /* CS High */ + if (ili_ice_mode_write(FLASH0_reg_flash_csb, 0x1, 1) < 0) + ILI_ERR("Pull CS High failed\n"); + + /* waiting for CS status done */ + mdelay(10); + } + } + + if (ilits->cascade_info_block.nNum != 0) { + if (ili_cascade_reset_ctrl(TP_IC_WHOLE_RST_WITHOUT_FLASH, false) < 0) + ILI_ERR("IC whole reset without flash failed during moving mp code\n"); + } else { + if (ili_reset_ctrl(TP_IC_WHOLE_RST_WITHOUT_FLASH) < 0) + ILI_ERR("IC whole reset without flash failed during moving mp code\n"); + } + + ret = ili_ice_mode_ctrl(DISABLE, OFF); + if (ret < 0) + goto out; + + /* Check if ic is already in test mode */ + ilits->actual_tp_mode = P5_X_FW_TEST_MODE; /* set busy as 0x51 */ + ret = ili_ic_check_busy(20, 50, ON); + if (ret < 0) + ILI_ERR("Check cdc timeout failed after moved mp code\n"); + +out: + return ret; +} + +int ili_move_mp_code_iram(void) +{ + ILI_INFO("Download MP code to iram\n"); + return ili_fw_upgrade_handler(NULL); +} + +int ili_proximity_near(int mode) +{ + int ret = 0; + + ilits->prox_near = true; + + switch (mode) { + case DDI_POWER_ON: + /* + * If the power of VSP and VSN keeps alive when proximity near event + * occures, TP can just go to sleep in. + */ + ret = ili_ic_func_ctrl("sleep", SLEEP_IN); + if (ret < 0) + ILI_ERR("Write sleep in cmd failed\n"); + break; + case DDI_POWER_OFF: + ILI_INFO("DDI POWER OFF, do nothing\n"); + break; + default: + ILI_ERR("Unknown mode (%d)\n", mode); + ret = -EINVAL; + break; + } + return ret; +} + +int ili_proximity_far(int mode) +{ + int ret = 0; + u8 cmd[2] = {0}; + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; + + if (!ilits->prox_near) { + ILI_INFO("No proximity near event, break\n"); + return 0; + } + + switch (mode) { + case WAKE_UP_GESTURE_RECOVERY: + /* + * If the power of VSP and VSN has been shut down previsouly, + * TP should go through gesture recovery to get back. + */ + ili_gesture_recovery(); + break; + case WAKE_UP_SWITCH_GESTURE_MODE: + /* + * If the power of VSP and VSN keeps alive in the event of proximity near, + * TP can be just recovered by switching gesture mode to get back. + */ + cmd[0] = 0xF6; + cmd[1] = 0x0A; + + ILI_INFO("write prepare gesture command 0xF6 0x0A\n"); + ret = ilits->wrapper(cmd, 2, NULL, 0, ON, OFF); + if (ret < 0) { + ILI_INFO("write prepare gesture command error\n"); + break; + } + + ret = ili_set_tp_data_len(ilits->gesture_mode, true, &data_type); + if (ret < 0) + ILI_ERR("Switch to gesture mode failed during proximity far\n"); + break; + default: + ILI_ERR("Unknown mode (%d)\n", mode); + ret = -EINVAL; + break; + } + + ilits->prox_near = false; + + return ret; +} + +int ili_move_gesture_code_flash(int mode) +{ + int ret = 0; + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; + + /* + * NOTE: If functions need to be added during suspend, + * they must be called before gesture cmd reaches to FW. + */ + + ILI_INFO("Gesture mode = %d\n", mode); + ret = ili_set_tp_data_len(mode, true, &data_type); + + return ret; +} + +void ili_set_gesture_symbol(void) +{ + u8 cmd[7] = {0}; + struct gesture_symbol *ptr_sym = &ilits->ges_sym; + u8 *ptr; + + ptr = (u8 *) ptr_sym; + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = 0x01; + cmd[2] = 0x0A; + cmd[3] = 0x08; + cmd[4] = ptr[0]; + cmd[5] = ptr[1]; + cmd[6] = ptr[2]; + + ili_dump_data(cmd, 8, sizeof(cmd), 0, "Gesture symbol"); + + if (ilits->wrapper(cmd, 2, NULL, 0, ON, OFF) < 0) { + ILI_ERR("Write pre cmd failed\n"); + return; + + } + + if (ilits->wrapper(&cmd[1], (sizeof(cmd) - 1), NULL, 0, ON, OFF)) { + ILI_ERR("Write gesture symbol fail\n"); + return; + } + + ILI_INFO(" single_tap = %d\n", ilits->ges_sym.single_tap); + ILI_INFO(" double_tap = %d\n", ilits->ges_sym.double_tap); + ILI_DBG(" alphabet_line_2_top = %d\n", ilits->ges_sym.alphabet_line_2_top); + ILI_DBG(" alphabet_line_2_bottom = %d\n", ilits->ges_sym.alphabet_line_2_bottom); + ILI_DBG(" alphabet_line_2_left = %d\n", ilits->ges_sym.alphabet_line_2_left); + ILI_DBG(" alphabet_line_2_right = %d\n", ilits->ges_sym.alphabet_line_2_right); + ILI_DBG(" alphabet_w = %d\n", ilits->ges_sym.alphabet_w); + ILI_DBG(" alphabet_c = %d\n", ilits->ges_sym.alphabet_c); + ILI_DBG(" alphabet_E = %d\n", ilits->ges_sym.alphabet_E); + ILI_DBG(" alphabet_V = %d\n", ilits->ges_sym.alphabet_V); + ILI_DBG(" alphabet_O = %d\n", ilits->ges_sym.alphabet_O); + ILI_DBG(" alphabet_S = %d\n", ilits->ges_sym.alphabet_S); + ILI_DBG(" alphabet_Z = %d\n", ilits->ges_sym.alphabet_Z); + ILI_DBG(" alphabet_V_down = %d\n", ilits->ges_sym.alphabet_V_down); + ILI_DBG(" alphabet_V_left = %d\n", ilits->ges_sym.alphabet_V_left); + ILI_DBG(" alphabet_V_right = %d\n", ilits->ges_sym.alphabet_V_right); + ILI_DBG(" alphabet_two_line_2_bottom= %d\n", ilits->ges_sym.alphabet_two_line_2_bottom); + ILI_DBG(" alphabet_F= %d\n", ilits->ges_sym.alphabet_F); + ILI_DBG(" alphabet_AT= %d\n", ilits->ges_sym.alphabet_AT); + +} + +int ili_move_gesture_code_iram(int mode) +{ + int i, ret = 0, timeout = 100; + u8 cmd[2] = {0}; + u8 cmd_write[3] = {0x01, 0x0A, 0x05}; + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; + u8 backup_rec_state = 0; + + /* + * NOTE: If functions need to be added during suspend, + * they must be called before gesture cmd reaches to FW. + */ + + ILI_INFO("Gesture code loaded by %s\n", ilits->gesture_load_code ? "driver" : "firmware"); + + if (!ilits->gesture_load_code) { + ret = ili_set_tp_data_len(mode, true, &data_type); + goto out; + } + + /*pre-command for ili_ic_func_ctrl("lpwg", 0x3)*/ + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = 0x1; + ret = ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Write 0xF6,0x1 failed\n"); + goto out; + } + + ret = ili_ic_func_ctrl("lpwg", 0x3); + if (ret < 0) { + ILI_ERR("write gesture flag failed\n"); + goto out; + } + + ret = ili_set_tp_data_len(mode, true, &data_type); + if (ret < 0) { + ILI_ERR("Failed to set tp data length\n"); + goto out; + } + + ili_irq_enable(); + /* Prepare Check Ready */ + cmd[0] = P5_X_READ_DATA_CTRL; + cmd[1] = 0xA; + ret = ilits->wrapper(cmd, sizeof(cmd), NULL, 0, OFF, OFF); + if (ret < 0) { + ILI_ERR("Write 0xF6,0xA failed\n"); + goto out; + } + + for (i = 0; i < timeout; i++) { + /* Check ready for load code */ + ret = ilits->wrapper(cmd_write, sizeof(cmd_write), cmd, sizeof(u8), ON, OFF); + ILI_DBG("gesture ready byte = 0x%x\n", cmd[0]); + + if (cmd[0] == 0x91) { + ILI_INFO("Ready to load gesture code\n"); + break; + } + mdelay(2); + } + ili_irq_disable(); + + if (i >= timeout) { + ILI_ERR("Gesture is not ready (0x%x), try to run its recovery\n", cmd[0]); + return ili_gesture_recovery(); + } + + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME) { + backup_rec_state = func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state; + func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state = DISABLE; + ILI_INFO("Doing gesture dynamic load code, Cannot reset %s CMD, rec_state %d \n", func_ctrl[FUNC_CTRL_PROXIMITY_IDX].name, func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state); + } + + ret = ili_fw_upgrade_handler(NULL); + if (ret < 0) { + ILI_ERR("FW upgrade failed during moving code\n"); + goto out; + } + + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME) { + func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state = backup_rec_state; + ILI_INFO("Recovery %s rec_state %d \n", func_ctrl[FUNC_CTRL_PROXIMITY_IDX].name, func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state); + } + + /* Resume gesture loader */ + ret = ili_ic_func_ctrl("lpwg", 0x6); + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME && ilits->proxmity_face == true) { + ret = ili_ic_func_ctrl("lpwg", 0x21); + } + + if (ret < 0) { + ILI_ERR("write resume loader error"); + goto out; + } + +out: + return ret; +} + +u8 ili_calc_packet_checksum(u8 *packet, int len) +{ + int i; + s32 sum = 0; + + for (i = 0; i < len; i++) + sum += packet[i]; + + return (u8) ((-sum) & 0xFF); +} + +int ili_touch_esd_gesture_flash(void) +{ + int ret = 0, retry = 100; + u32 answer = 0, slave_answer = 0; + int ges_pwd_addr = I2C_ESD_GESTURE_CORE146_PWD_ADDR; + int ges_pwd = ESD_GESTURE_CORE146_PWD; + int ges_run = I2C_ESD_GESTURE_CORE146_RUN; + int pwd_len = 2; + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; + + if (ilits->chip->core_ver < CORE_VER_1460) { + ges_pwd_addr = I2C_ESD_GESTURE_PWD_ADDR; + ges_pwd = ESD_GESTURE_PWD; + ges_run = I2C_ESD_GESTURE_RUN; + pwd_len = 4; + } + + if (ilits->cascade_info_block.nNum != 0) { + ret = ili_ice_mode_ctrl_by_mode(ENABLE, OFF, BOTH); + } else { + ret = ili_ice_mode_ctrl(ENABLE, OFF); + } + + if (ret < 0) { + ILI_ERR("Enable ice mode failed during gesture recovery\n"); + return ret; + } + + ILI_INFO("ESD Gesture PWD Addr = 0x%X, PWD = 0x%X, GES_RUN = 0%X, core_ver = 0x%X\n", + ges_pwd_addr, ges_pwd, ges_run, ilits->chip->core_ver); + + /* write a special password to inform FW go back into gesture mode */ + if (ilits->cascade_info_block.nNum != 0) { + ret = ili_ice_mode_write_by_mode(ges_pwd_addr, ges_pwd, pwd_len, BOTH); + } else { + ret = ili_ice_mode_write(ges_pwd_addr, ges_pwd, pwd_len); + } + + if (ret < 0) { + ILI_ERR("write password failed\n"); + goto out; + } + + /* HW reset gives effect to FW receives password successed */ + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + + if (ilits->cascade_info_block.nNum != 0) { + ret = ili_cascade_reset_ctrl(ilits->reset, false); + } else { + ret = ili_reset_ctrl(ilits->reset); + } + + if (ret < 0) { + ILI_ERR("TP Reset failed during gesture recovery\n"); + goto out; + } + + if (ilits->cascade_info_block.nNum != 0) { + ili_ice_mode_ctrl_by_mode(ENABLE, ON, BOTH); + } else { + ret = ili_ice_mode_ctrl(ENABLE, ON); + } + + if (ret < 0) { + ILI_ERR("Enable ice mode failed during gesture recovery\n"); + goto out; + } + + /* polling Cascade Slave another specific register to see if gesutre is enabled properly */ + if (ilits->cascade_info_block.nNum != 0) { + do { + ret = ili_ice_mode_read_by_mode(ges_pwd_addr, &slave_answer, pwd_len, SLAVE); + + if (ret < 0) { + ILI_ERR("Read Slave gesture answer error\n"); + goto out; + } + + if (slave_answer != ges_run) + ILI_INFO("ret = 0x%X, slave_answer = 0x%X\n", slave_answer, ges_run); + + mdelay(2); + } while (slave_answer != ges_run && --retry > 0); + } + + /* polling another specific register to see if gesutre is enabled properly */ + do { + ret = ili_ice_mode_read_by_mode(ges_pwd_addr, &answer, pwd_len, MASTER); + + if (ret < 0) { + ILI_ERR("Read Master gesture answer error\n"); + goto out; + } + + if (answer != ges_run) + ILI_INFO("ret = 0x%X, slave_answer = 0x%X\n", answer, ges_run); + + mdelay(2); + } while (answer != ges_run && --retry > 0); + + if (retry <= 0) { + ILI_ERR("Enter gesture failed\n"); + ret = -1; + goto out; + } + + ILI_INFO("0x%X Enter gesture successfully\n", answer); + +out: + if (ilits->cascade_info_block.nNum != 0) { + ili_ice_mode_ctrl_by_mode(DISABLE, ON, BOTH); + } else { + if (ili_ice_mode_ctrl(DISABLE, ON) < 0) { + ILI_ERR("Disable ice mode failed during gesture recovery\n"); + } + } + + if (ret >= 0) { + ilits->actual_tp_mode = P5_X_FW_GESTURE_MODE; + ili_set_tp_data_len(ilits->gesture_mode, false, &data_type); + } + + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME && ilits->proxmity_face == true) { + ret = ili_ic_func_ctrl("proximity", 0x01); + ret = ili_ic_func_ctrl("lpwg", 0x21); + if (ret < 0) { + ILI_ERR("Write func ctrl cmd failed\n"); + } + } + + return ret; +} + +int ili_touch_esd_gesture_iram(void) +{ + int ret = 0, retry = 100; + u32 answer = 0, slave_answer = 0; + int ges_pwd_addr = SPI_ESD_GESTURE_CORE146_PWD_ADDR; + int slave_ges_pwd_addr = SPI_ESD_GESTURE_CORE146_PWD_ADDR; + int ges_pwd = ESD_GESTURE_CORE146_PWD; + int ges_run = SPI_ESD_GESTURE_CORE146_RUN; + int pwd_len = 2; + u8 data_type = P5_X_FW_SIGNAL_DATA_MODE; + u8 backup_rec_state = 0; + + if (!ilits->gesture_load_code) { + ges_run = I2C_ESD_GESTURE_CORE146_RUN; + } + + if (ilits->chip->core_ver < CORE_VER_1460) { + if (ilits->chip->core_ver >= CORE_VER_1420) + ges_pwd_addr = I2C_ESD_GESTURE_PWD_ADDR; + else + ges_pwd_addr = SPI_ESD_GESTURE_PWD_ADDR; + ges_pwd = ESD_GESTURE_PWD; + ges_run = SPI_ESD_GESTURE_RUN; + pwd_len = 4; + } + + ILI_INFO("ESD Gesture PWD Addr = 0x%X, PWD = 0x%X, GES_RUN = 0x%X, core_ver = 0x%X\n", + ges_pwd_addr, ges_pwd, ges_run, ilits->chip->core_ver); + + if (ilits->cascade_info_block.nNum != 0) { + ili_set_bypass_mode(OFF); + } else { + ret = ili_ice_mode_ctrl(ENABLE, OFF); + } + + if (ret < 0) { + ILI_ERR("Enable ice mode failed during gesture recovery\n"); + goto fail; + } + + /* write a special password to inform FW go back into gesture mode */ + ret = ili_ice_mode_write(ges_pwd_addr, ges_pwd, pwd_len); + if (ret < 0) { + ILI_ERR("write password failed\n"); + goto fail; + } + + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME) { + backup_rec_state = func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state; + func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state = DISABLE; + ILI_INFO("Doing gesture dynamic load code, Cannot reset %s CMD, rec_state %d \n", func_ctrl[FUNC_CTRL_PROXIMITY_IDX].name, func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state); + } + + /* Host download gives effect to FW receives password successed */ + ilits->actual_tp_mode = P5_X_FW_AP_MODE; + ret = ili_fw_upgrade_handler(NULL); + if (ret < 0) { + ILI_ERR("FW upgrade failed during gesture recovery\n"); + goto fail; + } + + /* Wait for fw running code finished. */ + if (ilits->info_from_hex || (ilits->chip->core_ver >= CORE_VER_1410)) + msleep(50); + + if (ilits->cascade_info_block.nNum != 0) { + ili_set_bypass_mode(ON); + } else { + ret = ili_ice_mode_ctrl(ENABLE, ON); + } + + if (ret < 0) { + ILI_ERR("Enable ice mode failed during gesture recovery\n"); + goto fail; + } + + if (ilits->cascade_info_block.nNum != 0) { + /* polling Cascade Slave another specific register to see if gesutre is enabled properly */ + do { + if (ilits->cascade_info_block.nNum != 0) { + ili_mspi_read_slave_register(slave_ges_pwd_addr, &slave_answer, sizeof(u32)); + + if (slave_answer != ges_run) + ILI_INFO("ret = 0x%X, slave answer = 0x%X\n", slave_answer, ges_run); + } + + mdelay(2); + } while (slave_answer != ges_run && --retry > 0); + } + + /* polling another specific register to see if gesutre is enabled properly */ + do { + ret = ili_ice_mode_read(ges_pwd_addr, &answer, pwd_len); + if (ret < 0) { + ILI_ERR("Read gesture answer error\n"); + goto fail; + } + + if (answer != ges_run) + ILI_INFO("ret = 0x%X, answer = 0x%X\n", answer, ges_run); + + mdelay(2); + } while (answer != ges_run && --retry > 0); + + if (retry <= 0) { + ILI_ERR("Enter gesture failed\n"); + ret = -1; + goto fail; + } + + ILI_INFO("Enter gesture successfully\n"); + + ret = ili_ice_mode_ctrl(DISABLE, ON); + if (ret < 0) { + ILI_ERR("Disable ice mode failed during gesture recovery\n"); + goto fail; + } + + ILI_INFO("Gesture code loaded by %s\n", ilits->gesture_load_code ? "driver" : "firmware"); + + if (!ilits->gesture_load_code) { + ilits->actual_tp_mode = P5_X_FW_GESTURE_MODE; + ili_set_tp_data_len(ilits->gesture_mode, false, &data_type); + goto out; + } + + /* Load gesture code */ + ilits->actual_tp_mode = P5_X_FW_GESTURE_MODE; + ili_set_tp_data_len(ilits->gesture_mode, false, &data_type); + ret = ili_fw_upgrade_handler(NULL); + if (ret < 0) { + ILI_ERR("Failed to load code during gesture recovery\n"); + goto fail; + } + + if (ilits->prox_face_mode == PROXIMITY_SUSPEND_RESUME) { + func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state = backup_rec_state; + ILI_INFO("Recovery %s rec_state %d \n", func_ctrl[FUNC_CTRL_PROXIMITY_IDX].name, func_ctrl[FUNC_CTRL_PROXIMITY_IDX].rec_state); + + /* Resume gesture loader */ + ret = ili_ic_func_ctrl("lpwg", 0x6); + + if (ilits->proxmity_face == true) { + ret = ili_ic_func_ctrl("proximity", 0x01); + ret = ili_ic_func_ctrl("lpwg", 0x21); + } + } else { + /* Resume gesture loader */ + ret = ili_ic_func_ctrl("lpwg", 0x6); + } + + if (ret < 0) { + ILI_ERR("write resume loader error"); + goto fail; + } + +out: + return ret; + +fail: + ilits->actual_tp_mode = P5_X_FW_GESTURE_MODE; + ili_ice_mode_ctrl(DISABLE, ON); + + return ret; +} + +void ili_demo_debug_info_id0(u8 *buf, size_t len) +{ + struct ili_demo_debug_info_id0 id0; + + ipio_memcpy(&id0, buf, sizeof(id0), len); + ILI_INFO("id0 len = %d,strucy len = %d", (int)len, (int)sizeof(id0)); + + ILI_INFO("id = %d\n", id0.id); + ILI_INFO("app_sys_powr_state_e = %d\n", id0.sys_powr_state_e); + ILI_INFO("app_sys_state_e = %d\n", id0.sys_state_e); + ILI_INFO("tp_state_e = %d\n", id0.tp_state_e); + + ILI_INFO("touch_palm_state_e = %d\n", id0.touch_palm_state); + ILI_INFO("app_an_statu_e = %d\n", id0.app_an_statu_e); + ILI_INFO("app_sys_bg_err = %d\n", id0.app_sys_bg_err); + ILI_INFO("g_b_wrong_bg = %d\n", id0.g_b_wrong_bg); + ILI_INFO("reserved0 = %d\n", id0.reserved0); + + ILI_INFO("normal_mode = %d\n", id0.normal_mode); + ILI_INFO("charger_mode = %d\n", id0.charger_mode); + ILI_INFO("glove_mode = %d\n", id0.glove_mode); + ILI_INFO("stylus_mode = %d\n", id0.stylus_mode); + ILI_INFO("multi_mode = %d\n", id0.multi_mode); + ILI_INFO("noise_mode = %d\n", id0.noise_mode); + ILI_INFO("palm_plus_mode = %d\n", id0.palm_plus_mode); + ILI_INFO("floating_mode = %d\n", id0.floating_mode); + + ILI_INFO("algo_pt_status0 = %d\n", id0.algo_pt_status0); + ILI_INFO("algo_pt_status1 = %d\n", id0.algo_pt_status1); + ILI_INFO("algo_pt_status2 = %d\n", id0.algo_pt_status2); + ILI_INFO("algo_pt_status3 = %d\n", id0.algo_pt_status3); + ILI_INFO("algo_pt_status4 = %d\n", id0.algo_pt_status4); + ILI_INFO("algo_pt_status5 = %d\n", id0.algo_pt_status5); + ILI_INFO("algo_pt_status6 = %d\n", id0.algo_pt_status6); + ILI_INFO("algo_pt_status7 = %d\n", id0.algo_pt_status7); + ILI_INFO("algo_pt_status8 = %d\n", id0.algo_pt_status8); + ILI_INFO("algo_pt_status9 = %d\n", id0.algo_pt_status9); + ILI_INFO("reserved2 = %d\n", id0.reserved2); + + ILI_INFO("hopping_flg = %d\n", id0.hopping_flg); + ILI_INFO("hopping_index = %d\n", id0.hopping_index); + ILI_INFO("frequency = %d\n", (id0.frequency_h << 8 | id0.frequency_l)); + ILI_INFO("reserved3 = %d\n", id0.reserved3); + ILI_INFO("reserved4 = %d\n", id0.reserved4); + +} + +void ili_demo_debug_info_mode(u8 *buf, size_t len) +{ + u8 *info_ptr; + u8 info_id, info_len; + + ili_report_ap_mode(buf, len); + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + info_ptr = buf + P5_X_DEMO_MODE_PACKET_LEN; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + info_ptr = buf + P5_X_DEMO_MODE_PACKET_LEN_HIGH_RESOLUTION; + } else { + info_ptr = buf + P5_X_DEMO_MODE_PACKET_LEN; + } + info_len = info_ptr[0]; + info_id = info_ptr[1]; + + ILI_INFO("info len = %d ,id = %d\n", info_len, info_id); + if (info_id == 0) { + ilits->demo_debug_info[info_id](&info_ptr[1], info_len); + } else { + ILI_INFO("Not support this id %d\n", info_id); + } +} + +static void ilitek_tddi_touch_send_debug_data(u8 *buf, int len) +{ + int index; + mutex_lock(&ilits->debug_mutex); + + if (!ilits->dnp && !ilits->dlnp) + goto out; + + /* Sending data to apk via the node of debug_message node */ + if (ilits->dnp) { + index = ilits->dbf; + + if (!ilits->dbl[ilits->dbf].mark) { + ilits->dbf = ((ilits->dbf + 1) % TR_BUF_LIST_SIZE); + } else { + /*keep the last frame buffer*/ + if (ilits->dbf == 0) + index = TR_BUF_LIST_SIZE - 1; + else + index = ilits->dbf -1; + + ilits->all_frame_full = true; + ILI_DBG("Frame buf is full. \n"); + } + + if (ilits->dbl[index].data == NULL) { + ILI_ERR("BUFFER %d error\n", index); + goto out; + } + ipio_memcpy(ilits->dbl[index].data, buf, len, TR_BUF_SIZE); + ilits->dbl[index].mark = true; + + wake_up(&(ilits->inq)); + goto out; + } + + if (ilits->dlnp) { + /* ping pong buffer */ + index = ilits->dbf_in_idx; + ILI_DBG("ping pong buffer index = %d, mark = %d \n", index, ilits->dbf_in[index].mark); + if (ilits->dbf_in[index].data == NULL) { + ILI_ERR("INPUT BUFFER %d error\n", index); + goto out; + } + + if (ilits->dbf_in_idx < TR_BUF_LIST_SIZE) { + ipio_memcpy(ilits->dbf_in[index].data, buf, len, TR_BUF_SIZE); + ilits->dbf_in_idx++; + ilits->dbf_in[index].mark = true; + } else { + ILI_DBG("input buffer is fully.\n"); + } + + wake_up(&(ilits->inq)); + goto out; + } + +out: + mutex_unlock(&ilits->debug_mutex); +} + +static void ilitek_tddi_touch_customer_data_parsing(u8 *buf) +{ + int i = 0; + const int others = 16; + int index = 0; + struct ilitek_axis_info axis_info[MAX_TOUCH_NUM]; + bool palmflag = false; + ilits->finger = 0; + if (ilits->rib.nCustomerType == POSITION_CUSTOMER_TYPE_ON && ilits->tp_data_format == DATA_FORMAT_DEMO) { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + index = P5_X_5B_LOW_RESOLUTION_LENGTH - others - P5_X_INFO_CHECKSUM_LENGTH; + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if ((buf[(4 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(4 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(4 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF)) { + continue; + } + axis_info[ilits->finger].degree = buf[(5 * i) + index]; + axis_info[ilits->finger].width_major = (((buf[(5 * i) + 1 + index]) << 8) | (buf[(5 * i) + 2 + index])); + axis_info[ilits->finger].width_minor = (((buf[(5 * i) + 3 + index]) << 8) | (buf[(5 * i) + 4 + index])); + ILI_DBG("finger = %d, degree = %d, width_major = %d, width_minor = %d\n", ilits->finger, axis_info[ilits->finger].degree, axis_info[ilits->finger].width_major, axis_info[ilits->finger].width_minor); + ilits->finger++; + } + palmflag = ((buf[index + P5_X_CUSTOMER_LENGTH + 2] & 0x08) >> 3); + ILI_DBG("palmflag = %d\n", palmflag); + + for (i = 0; i < others; i++) { + ILI_DBG("Other Information byte[%d]:%02x\n", i, buf[index + P5_X_CUSTOMER_LENGTH + i]); + } + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + index = P5_X_DEMO_MODE_PACKET_LEN_HIGH_RESOLUTION - others - P5_X_INFO_CHECKSUM_LENGTH; + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if ((buf[(5 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(5 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && + (buf[(5 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(5 * i) + 4 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF)) { + continue; + } + axis_info[ilits->finger].degree = buf[(5 * i) + index]; + axis_info[ilits->finger].width_major = (((buf[(5 * i) + 1 + index]) << 8) | (buf[(5 * i) + 2 + index])); + axis_info[ilits->finger].width_minor = (((buf[(5 * i) + 3 + index]) << 8) | (buf[(5 * i) + 4 + index])); + ILI_DBG("finger = %d, degree = %d, width_major = %d, width_minor = %d\n", ilits->finger, axis_info[ilits->finger].degree, axis_info[ilits->finger].width_major, axis_info[ilits->finger].width_minor); + ilits->finger++; + } + palmflag = ((buf[index + P5_X_CUSTOMER_LENGTH + 2] & 0x08) >> 3); + ILI_DBG("palmflag = %d\n", palmflag); + + for (i = 0; i < others; i++) { + ILI_DBG("Other Information byte[%d]:%02x\n", i, buf[index + P5_X_CUSTOMER_LENGTH + i]); + } + } + } else if (ilits->rib.nCustomerType == POSITION_CUSTOMER_TYPE_ON && ilits->tp_data_format == DATA_FORMAT_DEBUG) { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + index = P5_X_DEBUG_LOW_RESOLUTION_FINGER_DATA_LENGTH + (2 * ilits->xch_num * ilits->ych_num) + (ilits->stx * 2) + (ilits->srx * 2) + (2 * 2); + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if ((buf[(3 * i) + 1 + P5_X_DEBUG_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(3 * i) + 2 + P5_X_DEBUG_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(3 * i) + 3 + P5_X_DEBUG_MODE_PACKET_INFO_LEN] == 0xFF)) { + continue; + } + axis_info[ilits->finger].degree = buf[(5 * i) + index]; + axis_info[ilits->finger].width_major = (((buf[(5 * i) + 1 + index]) << 8) | (buf[(5 * i) + 2 + index])); + axis_info[ilits->finger].width_minor = (((buf[(5 * i) + 3 + index]) << 8) | (buf[(5 * i) + 4 + index])); + ILI_DBG("finger = %d, degree = %d, width_major = %d, width_minor = %d\n", ilits->finger, axis_info[ilits->finger].degree, axis_info[ilits->finger].width_major, axis_info[ilits->finger].width_minor); + ilits->finger++; + } + palmflag = ((buf[index + P5_X_CUSTOMER_LENGTH + 2] & 0x08) >> 3); + ILI_DBG("palmflag = %d\n", palmflag); + + for (i = 0; i < others; i++) { + ILI_DBG("Other Information byte[%d]:%02x\n", i, buf[index + P5_X_CUSTOMER_LENGTH + i]); + } + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + index = P5_X_DEBUG_HIGH_RESOLUTION_FINGER_DATA_LENGTH + (2 * ilits->xch_num * ilits->ych_num) + (ilits->stx * 2) + (ilits->srx * 2) + (2 * 2); + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if ((buf[(4 * i) + 1 + P5_X_DEBUG_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(4 * i) + 2 + P5_X_DEBUG_MODE_PACKET_INFO_LEN] == 0xFF) && + (buf[(4 * i) + 3 + P5_X_DEBUG_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(4 * i) + 4 + P5_X_DEBUG_MODE_PACKET_INFO_LEN] == 0xFF)) { + continue; + } + axis_info[ilits->finger].degree = buf[(5 * i) + index]; + axis_info[ilits->finger].width_major = (((buf[(5 * i) + 1 + index]) << 8) | (buf[(5 * i) + 2 + index])); + axis_info[ilits->finger].width_minor = (((buf[(5 * i) + 3 + index]) << 8) | (buf[(5 * i) + 4 + index])); + ILI_DBG("finger = %d, degree = %d, width_major = %d, width_minor = %d\n", ilits->finger, axis_info[ilits->finger].degree, axis_info[ilits->finger].width_major, axis_info[ilits->finger].width_minor); + ilits->finger++; + } + palmflag = ((buf[index + P5_X_CUSTOMER_LENGTH + 2] & 0x08) >> 3); + ILI_DBG("palmflag = %d\n", palmflag); + + for (i = 0; i < others; i++) { + ILI_DBG("Other Information byte[%d]:%02x\n", i, buf[index + P5_X_CUSTOMER_LENGTH + i]); + } + } + } + +} + +void ili_touch_press(u16 x, u16 y, u16 pressure, u16 id) +{ + ILI_DBG("Touch Press: id = %d, x = %d, y = %d, p = %d\n", id, x, y, pressure); + + if (MT_B_TYPE) { + input_mt_slot(ilits->input, id); + input_mt_report_slot_state(ilits->input, MT_TOOL_FINGER, true); + input_report_abs(ilits->input, ABS_MT_POSITION_X, x); + input_report_abs(ilits->input, ABS_MT_POSITION_Y, y); + if (MT_PRESSURE) + input_report_abs(ilits->input, ABS_MT_PRESSURE, pressure); + } else { + input_report_key(ilits->input, BTN_TOUCH, 1); + input_report_abs(ilits->input, ABS_MT_TRACKING_ID, id); + input_report_abs(ilits->input, ABS_MT_TOUCH_MAJOR, 1); + input_report_abs(ilits->input, ABS_MT_WIDTH_MAJOR, 1); + input_report_abs(ilits->input, ABS_MT_POSITION_X, x); + input_report_abs(ilits->input, ABS_MT_POSITION_Y, y); + if (MT_PRESSURE) + input_report_abs(ilits->input, ABS_MT_PRESSURE, pressure); + + input_mt_sync(ilits->input); + } +} + +void ili_touch_release(u16 x, u16 y, u16 id) +{ + ILI_DBG("Touch Release: id = %d, x = %d, y = %d\n", id, x, y); + + if (MT_B_TYPE) { + input_mt_slot(ilits->input, id); + input_mt_report_slot_state(ilits->input, MT_TOOL_FINGER, false); + } else { + input_report_key(ilits->input, BTN_TOUCH, 0); + input_mt_sync(ilits->input); + } +} + +void ili_touch_release_all_point(void) +{ + int i; + ILI_DBG("Touch Release All\n"); + if (MT_B_TYPE) { + for (i = 0 ; i < MAX_TOUCH_NUM; i++) + ili_touch_release(0, 0, i); + + input_report_key(ilits->input, BTN_TOUCH, 0); + input_report_key(ilits->input, BTN_TOOL_FINGER, 0); + } else { + ili_touch_release(0, 0, 0); + } + input_sync(ilits->input); +} + +static struct ilitek_touch_info touch_info[MAX_TOUCH_NUM + MAX_PEN_NUM]; +#ifdef ILI_TOUCH_LAST_TIME +static bool time_flag = 1; +#endif + +void ili_report_ap_mode(u8 *buf, int len) +{ + int i = 0; + u32 xop = 0, yop = 0; + + memset(touch_info, 0x0, sizeof(touch_info)); + + ilits->finger = 0; + + for (i = 0; i < MAX_TOUCH_NUM; i++) { + + if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + if ((buf[(4 * i) + 1] == 0xFF) && (buf[(4 * i) + 2] == 0xFF) && (buf[(4 * i) + 3] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = (((buf[(4 * i) + 1] & 0xF0) << 4) | (buf[(4 * i) + 2])); + yop = (((buf[(4 * i) + 1] & 0x0F) << 8) | (buf[(4 * i) + 3])); + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + if ((buf[(4 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(4 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(4 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = (((buf[(4 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] & 0xF0) << 4) | (buf[(4 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN])); + yop = (((buf[(4 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] & 0x0F) << 8) | (buf[(4 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN])); + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + if ((buf[(5 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(5 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && + (buf[(5 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(5 * i) + 4 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = ((buf[(5 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] << 8) | (buf[(5 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN])); + yop = ((buf[(5 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN] << 8) | (buf[(5 * i) + 4 + P5_X_DEMO_MODE_PACKET_INFO_LEN])); + } + + if (ilits->trans_xy) { + touch_info[ilits->finger].x = xop; + touch_info[ilits->finger].y = yop; + } else { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[ilits->finger].x = xop * ilits->panel_wid / TPD_WIDTH; + touch_info[ilits->finger].y = yop * ilits->panel_hei / TPD_HEIGHT; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + touch_info[ilits->finger].x = xop * ilits->panel_wid / ilits->max_x; + touch_info[ilits->finger].y = yop * ilits->panel_hei / ilits->max_y; + } + } + + touch_info[ilits->finger].id = i; + + if (MT_PRESSURE) { + if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[ilits->finger].pressure = buf[(4 * i) + 4]; + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[ilits->finger].pressure = buf[(4 * i) + 4 + P5_X_DEMO_MODE_PACKET_INFO_LEN]; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + touch_info[ilits->finger].pressure = buf[(5 * i) + 5 + P5_X_DEMO_MODE_PACKET_INFO_LEN]; + } + } else { + touch_info[ilits->finger].pressure = 1; + } + + ILI_DBG("original x = %d, y = %d\n", xop, yop); + ilits->finger++; + if (MT_B_TYPE) + ilits->curt_touch[i] = 1; + } + +#ifdef ROI + ili_read_knuckle_roi_data(); +#endif + ILI_DBG("figner number = %d, LastTouch = %d\n", ilits->finger, ilits->last_touch); + + if (ilits->finger) { +#ifdef ILI_TOUCH_LAST_TIME + if (time_flag) { + ilits->last_event_time = ktime_get_boottime(); + time_flag = 0; + ILI_DBG("set last_event_time\n"); + } +#endif + if (MT_B_TYPE) { + for (i = 0; i < ilits->finger; i++) { + input_report_key(ilits->input, BTN_TOUCH, 1); + ili_touch_press(touch_info[i].x, touch_info[i].y, touch_info[i].pressure, touch_info[i].id); + input_report_key(ilits->input, BTN_TOOL_FINGER, 1); + } + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->curt_touch[i] == 0 && ilits->prev_touch[i] == 1) + ili_touch_release(0, 0, i); + ilits->prev_touch[i] = ilits->curt_touch[i]; + } + } else { + for (i = 0; i < ilits->finger; i++) + ili_touch_press(touch_info[i].x, touch_info[i].y, touch_info[i].pressure, touch_info[i].id); + } + input_sync(ilits->input); + ilits->last_touch = ilits->finger; + } else { + if (ilits->last_touch) { +#ifdef ILI_TOUCH_LAST_TIME + time_flag = 1; + ILI_DBG("last touch, reset time_flag\n"); +#endif + if (MT_B_TYPE) { + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->curt_touch[i] == 0 && ilits->prev_touch[i] == 1) + ili_touch_release(0, 0, i); + ilits->prev_touch[i] = ilits->curt_touch[i]; + } + input_report_key(ilits->input, BTN_TOUCH, 0); + input_report_key(ilits->input, BTN_TOOL_FINGER, 0); + } else { + ili_touch_release(0, 0, 0); + } + input_sync(ilits->input); + ilits->last_touch = 0; + } + } + ilitek_tddi_touch_customer_data_parsing(buf); + ilitek_tddi_touch_send_debug_data(buf, len); +} + +static void ili_pen_down(u16 x, u16 y, u16 pressure) +{ + ILI_DBG("Pen Down: x = %d, y = %d, pressure = %d, TipSwitch = %d, InRange = %d\n", x, y, pressure, ilits->pen_info.TipSwitch, ilits->pen_info.InRange); + input_report_abs(ilits->input_pen, ABS_X, x); + input_report_abs(ilits->input_pen, ABS_Y, y); + input_report_abs(ilits->input_pen, ABS_PRESSURE, pressure); + input_report_key(ilits->input_pen, BTN_TOUCH, ilits->pen_info.TipSwitch); + input_report_key(ilits->input_pen, BTN_TOOL_PEN, ilits->pen_info.InRange); + input_report_key(ilits->input_pen, BTN_STYLUS, ilits->pen_info.BarelSwitch); + input_report_key(ilits->input_pen, BTN_STYLUS2, ilits->pen_info.Eraser); + input_report_abs(ilits->input_pen, ABS_TILT_X, ilits->pen_info.tilt_x); + input_report_abs(ilits->input_pen, ABS_TILT_Y, ilits->pen_info.tilt_y); + + /* Hover Report Rate Test */ + if (ilits->pen_info.TipSwitch) { + input_report_abs(ilits->input_pen, ABS_DISTANCE, 0); + } else if ( ilits->pen_info.TipSwitch == 0 && ilits->pen_info.InRange == 1 ) { + if (ilits->pen_info.distance_cnt == 1) { + ilits->pen_info.distance_cnt = 2; + } else { + ilits->pen_info.distance_cnt = 1; + } + input_report_abs(ilits->input_pen, ABS_DISTANCE, ilits->pen_info.distance_cnt); + } + + input_sync(ilits->input_pen); +} + +void ili_pen_release(void) +{ +#if ENABLE_PEN_MODE + ILI_DBG("Pen Release \n"); + ilits->pen_info.active = false; + input_report_key(ilits->input_pen, BTN_TOUCH, false); + input_report_key(ilits->input_pen, BTN_TOOL_PEN, false); + input_report_key(ilits->input_pen, BTN_STYLUS, false); + input_report_key(ilits->input_pen, BTN_STYLUS2, false); + input_report_abs(ilits->input_pen, ABS_DISTANCE, 1); + input_sync(ilits->input_pen); +#endif +} + +void ili_pen_demo_mode_report_point(u8 *buf, int len) +{ + int i = 0, pen_id_index = 0; + u32 xop = 0, yop = 0, PenStartIdx = 0; + + memset(touch_info, 0x0, sizeof(touch_info)); + + ilits->finger = 0; + ilits->pen = 0; + + if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + PenStartIdx = P5_X_DEMO_LOW_RESOLUTION_FINGER_DATA_LENGTH + P5_X_P_SENSOR_KEY_LENGTH; + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + PenStartIdx = P5_X_DEMO_LOW_RESOLUTION_FINGER_DATA_LENGTH + P5_X_P_SENSOR_KEY_LENGTH + P5_X_CUSTOMER_LENGTH; + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + PenStartIdx = P5_X_DEMO_HIGH_RESOLUTION_FINGER_DATA_LENGTH + P5_X_P_SENSOR_KEY_LENGTH + P5_X_CUSTOMER_LENGTH; + } else if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + PenStartIdx = P5_X_DEMO_HIGH_RESOLUTION_FINGER_DATA_LENGTH + P5_X_P_SENSOR_KEY_LENGTH; + } + + if (buf[len - P5_X_INFO_CHECKSUM_LENGTH - 1] != ONLY_REPORT_HAND) { + ILI_DBG("Pen Switch = 0x%X\n", buf[PenStartIdx]); + if ((buf[PenStartIdx] & TIPSWITCH_HOVER_BIT) == RELEASE_PEN) { + ilits->pen_info.active = false; + } else { + ilits->pen_info.active = true; + } + } else { + ilits->pen_info.active = false; + } + ILI_DBG("Pen is active : %s\n", ilits->pen_info.active ? "True" : "False"); + + for (i = 0; i < ilits->touch_num; i++) { + if (i >= MAX_TOUCH_NUM) { + if (ilits->pen_info.active) { + xop = ((buf[PenStartIdx + 2] << 8) | (buf[PenStartIdx + 3])); + yop = ((buf[PenStartIdx + 4] << 8) | (buf[PenStartIdx + 5])); + + ilits->pen_info.TipSwitch = buf[PenStartIdx] & BIT(0); + ilits->pen_info.BarelSwitch = (buf[PenStartIdx] & BIT(1)) >> 1; + ilits->pen_info.Eraser = (buf[PenStartIdx] & BIT(2)) >> 2; + ilits->pen_info.InRange = (buf[PenStartIdx] & BIT(4)) >> 4; + + if ( buf[PenStartIdx + TOUCH_TILT_OFFSET] & NEGITIVE_FLAG ) { + /* Transfer Tilt to Negitive */ + ilits->pen_info.tilt_x = buf[PenStartIdx + TOUCH_TILT_OFFSET] | 0xFFFFFF00; + } else { + ilits->pen_info.tilt_x = buf[PenStartIdx + TOUCH_TILT_OFFSET]; + } + + if ( buf[PenStartIdx + TOUCH_TILT_OFFSET + 1] & NEGITIVE_FLAG ) { + /* Transfer Tilt to Negitive */ + ilits->pen_info.tilt_y = buf[PenStartIdx + TOUCH_TILT_OFFSET + 1] | 0xFFFFFF00; + } else { + ilits->pen_info.tilt_y = buf[PenStartIdx + TOUCH_TILT_OFFSET + 1]; + } + + /* Pen ID */ + for (pen_id_index = 0; pen_id_index < P5_X_PEN_ID_LEN; pen_id_index++) { + ilits->pen_info.pen_id[pen_id_index] = buf[PenStartIdx + PEN_ID_OFFSET + pen_id_index]; + } + } else { + ilits->curt_touch[PEN_INDEX] = 0; + ILI_DBG("Report Switch is Only Report Hand\n"); + continue; + } + } else { + if (buf[len - P5_X_INFO_CHECKSUM_LENGTH - 1] != ONLY_REPORT_PEN) { + if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + if ((buf[(4 * i) + 1] == 0xFF) && (buf[(4 * i) + 2] == 0xFF) && (buf[(4 * i) + 3] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = (((buf[(4 * i) + 1] & 0xF0) << 4) | (buf[(4 * i) + 2])); + yop = (((buf[(4 * i) + 1] & 0x0F) << 8) | (buf[(4 * i) + 3])); + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + if ((buf[(4 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(4 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(4 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = (((buf[(4 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] & 0xF0) << 4) | (buf[(4 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN])); + yop = (((buf[(4 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] & 0x0F) << 8) | (buf[(4 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN])); + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + if ((buf[(5 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(5 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && + (buf[(5 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF) && (buf[(5 * i) + 4 + P5_X_DEMO_MODE_PACKET_INFO_LEN] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = ((buf[(5 * i) + 1 + P5_X_DEMO_MODE_PACKET_INFO_LEN] << 8) | (buf[(5 * i) + 2 + P5_X_DEMO_MODE_PACKET_INFO_LEN])); + yop = ((buf[(5 * i) + 3 + P5_X_DEMO_MODE_PACKET_INFO_LEN] << 8) | (buf[(5 * i) + 4 + P5_X_DEMO_MODE_PACKET_INFO_LEN])); + } + } else { + continue; + } + } + + if (ilits->pen_info.active == true) { + if (ilits->trans_xy) { + touch_info[PEN_INDEX].x = xop; + touch_info[PEN_INDEX].y = yop; + } else { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[PEN_INDEX].x = xop * ilits->panel_wid / TPD_WIDTH; + touch_info[PEN_INDEX].y = yop * ilits->panel_hei / TPD_HEIGHT; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + touch_info[PEN_INDEX].x = xop * ilits->panel_wid / ilits->max_x; + touch_info[PEN_INDEX].y = yop * ilits->panel_hei / ilits->max_y; + } + } + touch_info[PEN_INDEX].id = i; + touch_info[PEN_INDEX].pressure = ( buf[PenStartIdx + TOUCH_PRESS_OFFSET] << 8 ) + buf[PenStartIdx + TOUCH_PRESS_OFFSET + 1]; + + ilits->pen++; + ilits->curt_touch[PEN_INDEX] = 1; + ilits->prev_touch[PEN_INDEX] = 1; + } else { + if (ilits->trans_xy) { + touch_info[ilits->finger].x = xop; + touch_info[ilits->finger].y = yop; + } else { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[ilits->finger].x = xop * ilits->panel_wid / TPD_WIDTH; + touch_info[ilits->finger].y = yop * ilits->panel_hei / TPD_HEIGHT; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + touch_info[ilits->finger].x = xop * ilits->panel_wid / ilits->max_x; + touch_info[ilits->finger].y = yop * ilits->panel_hei / ilits->max_y; + } + } + touch_info[ilits->finger].id = i; + + if (MT_PRESSURE) { + if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[ilits->finger].pressure = buf[(4 * i) + 4]; + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[ilits->finger].pressure = buf[(4 * i) + 4 + P5_X_DEMO_MODE_PACKET_INFO_LEN]; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + touch_info[ilits->finger].pressure = buf[(5 * i) + 5 + P5_X_DEMO_MODE_PACKET_INFO_LEN]; + } + } else { + touch_info[ilits->finger].pressure = 1; + } + + ilits->finger++; + if (MT_B_TYPE) + ilits->curt_touch[i] = 1; + } + + ILI_DBG("original x = %d, y = %d\n", xop, yop); + } + +#ifdef ROI + ili_read_knuckle_roi_data(); +#endif + ILI_DBG("figner number = %d, LastTouch = %d\n", ilits->finger, ilits->last_touch); + + if (ilits->pen) { + if (ilits->pen_info.finger_touch) { + ilits->pen_info.finger_touch = false; + ili_touch_release_all_point(); + + if (MT_PRESSURE) + input_report_abs(ilits->input, ABS_MT_PRESSURE, 0); + } + /* Pen Down */ + ili_pen_down(touch_info[PEN_INDEX].x, touch_info[PEN_INDEX].y, touch_info[PEN_INDEX].pressure); + } else { + /* Pen Up */ + if (ilits->curt_touch[PEN_INDEX] == 0 && ilits->prev_touch[PEN_INDEX] == 1) { + ili_pen_release(); + } + ilits->prev_touch[PEN_INDEX] = ilits->curt_touch[PEN_INDEX]; + } + + if (ilits->pen == 0) { + if (ilits->finger) { + if (MT_B_TYPE) { + /* Finger Touch */ + for (i = 0; i < ilits->finger; i++) { + if (touch_info[i].id < MAX_TOUCH_NUM) { + ilits->pen_info.finger_touch = true; + input_report_key(ilits->input, BTN_TOUCH, 1); + ili_touch_press(touch_info[i].x, touch_info[i].y, touch_info[i].pressure, touch_info[i].id); + input_report_key(ilits->input, BTN_TOOL_FINGER, 1); + } + } + /* Finger Release */ + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->curt_touch[i] == 0 && ilits->prev_touch[i] == 1) { + ili_touch_release(0, 0, i); + } + ilits->prev_touch[i] = ilits->curt_touch[i]; + } + } else { + for (i = 0; i < ilits->finger; i++) { + if (touch_info[i].id < MAX_TOUCH_NUM) { + ili_touch_press(touch_info[i].x, touch_info[i].y, touch_info[i].pressure, touch_info[i].id); + } + } + } + input_sync(ilits->input); + ilits->last_touch = ilits->finger; + } else { + if (ilits->last_touch) { + if (MT_B_TYPE) { + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->curt_touch[i] == 0 && ilits->prev_touch[i] == 1) + ili_touch_release(0, 0, i); + ilits->prev_touch[i] = ilits->curt_touch[i]; + } + + if (MT_PRESSURE) + input_report_abs(ilits->input, ABS_MT_PRESSURE, 0); + + input_report_key(ilits->input, BTN_TOUCH, 0); + input_report_key(ilits->input, BTN_TOOL_FINGER, 0); + } else { + ili_touch_release(0, 0, 0); + } + input_sync(ilits->input); + ilits->last_touch = 0; + ilits->pen_info.finger_touch = false; + } + } + } +} + +void ili_report_pen_ap_mode(u8 *buf, int len) +{ + ili_pen_demo_mode_report_point(buf, len); + ilitek_tddi_touch_customer_data_parsing(buf); + ilitek_tddi_touch_send_debug_data(buf, len); +} + +/*Pen report single event, Finger report Mulit event*/ +void ili_pen_debug_mode_report_point(u8 *buf, int len, u8 offset) +{ + int i = 0, pen_id_index = 0; + u32 xop = 0, yop = 0, PenStartIdx = 0; + static u8 p[MAX_TOUCH_NUM]; + + memset(touch_info, 0x0, sizeof(touch_info)); + + ilits->finger = 0; + ilits->pen = 0; + + for (i = 0; i < ilits->touch_num; i++) { + if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + PenStartIdx = P5_X_DEBUG_LOW_RESOLUTION_FINGER_DATA_LENGTH + ilits->cdc_data_len; + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + PenStartIdx = P5_X_DEBUG_LOW_RESOLUTION_FINGER_DATA_LENGTH + ilits->cdc_data_len + P5_X_CUSTOMER_LENGTH; + } else if (ilits->rib.nCustomerType != ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + PenStartIdx = P5_X_DEBUG_HIGH_RESOLUTION_FINGER_DATA_LENGTH + ilits->cdc_data_len + P5_X_CUSTOMER_LENGTH; + } else if (ilits->rib.nCustomerType == ilits->customertype_off && ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + PenStartIdx = P5_X_DEBUG_HIGH_RESOLUTION_FINGER_DATA_LENGTH + ilits->cdc_data_len; + } + + /* cdc debug lite */ + if (ilits->tp_data_format == DATA_FORMAT_DEBUG_LITE_ROI || ilits->tp_data_format == DATA_FORMAT_DEBUG_LITE_WINDOW + || ilits->tp_data_format == DATA_FORMAT_DEBUG_LITE_AREA) { + /* PenStartIdx = P5_X_DEBUG_LITE_LENGTH - Pendata - other len - checksum */ + PenStartIdx = 284; + } else if (ilits->tp_data_format == DATA_FORMAT_DEBUG_LITE_PEN) { + /* PenStartIdx = P5_X_DEBUG_LITE_PEN_LENGTH - Pendata - PenCDCData - other len - checksum */ + PenStartIdx = 39; + /* debug lite pen only support pen and 1 finger */ + if (i > 0 && i < MAX_TOUCH_NUM) + continue; + } + + PenStartIdx -= offset; + + if (buf[len - offset - P5_X_INFO_CHECKSUM_LENGTH - 1] != ONLY_REPORT_HAND) { + ILI_DBG("Pen Switch = 0x%X\n", buf[PenStartIdx]); + if ((buf[PenStartIdx] & TIPSWITCH_HOVER_BIT) == RELEASE_PEN) { + ilits->pen_info.active = false; + } else { + ilits->pen_info.active = true; + } + } else { + ilits->pen_info.active = false; + } + ILI_DBG("Pen is active : %s\n", ilits->pen_info.active ? "True" : "False"); + + if (i >= MAX_TOUCH_NUM) { + if (ilits->pen_info.active) { + xop = ((buf[PenStartIdx + 2] << 8) | (buf[PenStartIdx + 3])); + yop = ((buf[PenStartIdx + 4] << 8) | (buf[PenStartIdx + 5])); + + ilits->pen_info.TipSwitch = buf[PenStartIdx] & BIT(0); + ilits->pen_info.BarelSwitch = (buf[PenStartIdx] & BIT(1)) >> 1; + ilits->pen_info.Eraser = (buf[PenStartIdx] & BIT(2)) >> 2; + ilits->pen_info.InRange = (buf[PenStartIdx] & BIT(4)) >> 4; + + if ( buf[PenStartIdx + TOUCH_TILT_OFFSET] & NEGITIVE_FLAG ) { + /* Transfer Tilt to Negitive */ + ilits->pen_info.tilt_x = buf[PenStartIdx + TOUCH_TILT_OFFSET] | 0xFFFFFF00; + } else { + ilits->pen_info.tilt_x = buf[PenStartIdx + TOUCH_TILT_OFFSET]; + } + + if ( buf[PenStartIdx + TOUCH_TILT_OFFSET + 1] & NEGITIVE_FLAG ) { + /* Transfer Tilt to Negitive */ + ilits->pen_info.tilt_y = buf[PenStartIdx + TOUCH_TILT_OFFSET + 1] | 0xFFFFFF00; + } else { + ilits->pen_info.tilt_y = buf[PenStartIdx + TOUCH_TILT_OFFSET + 1]; + } + + if ( ilits->pen_info.TipSwitch ) { + /* Pen ID */ + for (pen_id_index = 0; pen_id_index < P5_X_PEN_ID_LEN; pen_id_index++) { + ilits->pen_info.pen_id[pen_id_index] = buf[PenStartIdx + PEN_ID_OFFSET + pen_id_index]; + } + ILI_DBG("\n"); + } + } else { + ilits->curt_touch[PEN_INDEX] = 0; + ILI_DBG("Report Switch is Only Report Hand\n"); + continue; + } + } else { + if (buf[len - P5_X_INFO_CHECKSUM_LENGTH - 1] != ONLY_REPORT_PEN) { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + if ((buf[(3 * i)] == 0xFF) && (buf[(3 * i) + 1] == 0xFF) && (buf[(3 * i) + 2] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = (((buf[(3 * i)] & 0xF0) << 4) | (buf[(3 * i) + 1])); + yop = (((buf[(3 * i)] & 0x0F) << 8) | (buf[(3 * i) + 2])); + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + if ((buf[(4 * i)] == 0xFF) && (buf[(4 * i) + 1] == 0xFF) && (buf[(4 * i) + 2] == 0xFF) && (buf[(4 * i) + 3] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = ((buf[(4 * i) + 0] << 8) | (buf[(4 * i) + 1])); + yop = ((buf[(4 * i) + 2] << 8) | (buf[(4 * i) + 3])); + } + } else { + continue; + } + } + + if (ilits->pen_info.active == true) { + if (ilits->trans_xy) { + touch_info[PEN_INDEX].x = xop; + touch_info[PEN_INDEX].y = yop; + } else { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[PEN_INDEX].x = xop * ilits->panel_wid / TPD_WIDTH; + touch_info[PEN_INDEX].y = yop * ilits->panel_hei / TPD_HEIGHT; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + touch_info[PEN_INDEX].x = xop * ilits->panel_wid / ilits->max_x; + touch_info[PEN_INDEX].y = yop * ilits->panel_hei / ilits->max_y; + } + } + + touch_info[PEN_INDEX].id = i; + touch_info[PEN_INDEX].pressure = ( buf[PenStartIdx + TOUCH_PRESS_OFFSET] << 8 ) + buf[PenStartIdx + TOUCH_PRESS_OFFSET + 1]; + + ilits->pen++; + ilits->curt_touch[PEN_INDEX] = 1; + ilits->prev_touch[PEN_INDEX] = 1; + } else { + if (ilits->trans_xy) { + touch_info[ilits->finger].x = xop; + touch_info[ilits->finger].y = yop; + } else { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[ilits->finger].x = xop * ilits->panel_wid / TPD_WIDTH; + touch_info[ilits->finger].y = yop * ilits->panel_hei / TPD_HEIGHT; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + touch_info[ilits->finger].x = xop * ilits->panel_wid / ilits->max_x; + touch_info[ilits->finger].y = yop * ilits->panel_hei / ilits->max_y; + } + } + touch_info[ilits->finger].id = i; + + if (MT_PRESSURE) { + /* + * Since there's no pressure data in debug mode, we make fake values + * for android system if pressure needs to be reported. + */ + if (p[ilits->finger] == 1) + touch_info[ilits->finger].pressure = p[ilits->finger] = 2; + else + touch_info[ilits->finger].pressure = p[ilits->finger] = 1; + } else { + touch_info[ilits->finger].pressure = 1; + } + + ilits->finger++; + if (MT_B_TYPE) + ilits->curt_touch[i] = 1; + } + + ILI_DBG("original x = %d, y = %d\n", xop, yop); + } + + ILI_DBG("figner number = %d, LastTouch = %d\n", ilits->finger, ilits->last_touch); + + if (ilits->pen) { + if (ilits->pen_info.finger_touch) { + ilits->pen_info.finger_touch = false; + ili_touch_release_all_point(); + + if (MT_PRESSURE) + input_report_abs(ilits->input, ABS_MT_PRESSURE, 0); + } + /* Pen Down */ + ili_pen_down(touch_info[PEN_INDEX].x, touch_info[PEN_INDEX].y, touch_info[PEN_INDEX].pressure); + } else { + /* Pen Up */ + if (ilits->curt_touch[PEN_INDEX] == 0 && ilits->prev_touch[PEN_INDEX] == 1) { + ili_pen_release(); + } + ilits->prev_touch[PEN_INDEX] = ilits->curt_touch[PEN_INDEX]; + } + + if (ilits->pen == 0) { + if (ilits->finger) { + if (MT_B_TYPE) { + /* Finger Touch */ + for (i = 0; i < ilits->finger; i++) { + if (touch_info[i].id < MAX_TOUCH_NUM) { + ilits->pen_info.finger_touch = true; + input_report_key(ilits->input, BTN_TOUCH, 1); + ili_touch_press(touch_info[i].x, touch_info[i].y, touch_info[i].pressure, touch_info[i].id); + input_report_key(ilits->input, BTN_TOOL_FINGER, 1); + } + } + /* Finger Release */ + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->curt_touch[i] == 0 && ilits->prev_touch[i] == 1) { + ili_touch_release(0, 0, i); + } + ilits->prev_touch[i] = ilits->curt_touch[i]; + } + } else { + for (i = 0; i < ilits->finger; i++) { + if (touch_info[i].id < MAX_TOUCH_NUM) { + ili_touch_press(touch_info[i].x, touch_info[i].y, touch_info[i].pressure, touch_info[i].id); + } + } + } + input_sync(ilits->input); + ilits->last_touch = ilits->finger; + } else { + if (ilits->last_touch) { + if (MT_B_TYPE) { + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->curt_touch[i] == 0 && ilits->prev_touch[i] == 1) + ili_touch_release(0, 0, i); + ilits->prev_touch[i] = ilits->curt_touch[i]; + } + + if (MT_PRESSURE) + input_report_abs(ilits->input, ABS_MT_PRESSURE, 0); + + input_report_key(ilits->input, BTN_TOUCH, 0); + input_report_key(ilits->input, BTN_TOOL_FINGER, 0); + } else { + ili_touch_release(0, 0, 0); + } + input_sync(ilits->input); + ilits->last_touch = 0; + ilits->pen_info.finger_touch = false; + } + } + } +} + +void ili_debug_mode_report_point(u8 *buf, int len) +{ + int i = 0; + u32 xop = 0, yop = 0; + static u8 p[MAX_TOUCH_NUM]; + + memset(touch_info, 0x0, sizeof(touch_info)); + + ilits->finger = 0; + + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + if ((buf[(3 * i)] == 0xFF) && (buf[(3 * i) + 1] == 0xFF) && (buf[(3 * i) + 2] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = (((buf[(3 * i)] & 0xF0) << 4) | (buf[(3 * i) + 1])); + yop = (((buf[(3 * i)] & 0x0F) << 8) | (buf[(3 * i) + 2])); + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + if ((buf[(4 * i)] == 0xFF) && (buf[(4 * i) + 1] == 0xFF) && (buf[(4 * i) + 2] == 0xFF) && (buf[(4 * i) + 3] == 0xFF)) { + if (MT_B_TYPE) + ilits->curt_touch[i] = 0; + continue; + } + xop = ((buf[(4 * i) + 0] << 8) | (buf[(4 * i) + 1])); + yop = ((buf[(4 * i) + 2] << 8) | (buf[(4 * i) + 3])); + } + + if (ilits->trans_xy) { + touch_info[ilits->finger].x = xop; + touch_info[ilits->finger].y = yop; + } else { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + touch_info[ilits->finger].x = xop * ilits->panel_wid / TPD_WIDTH; + touch_info[ilits->finger].y = yop * ilits->panel_hei / TPD_HEIGHT; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + touch_info[ilits->finger].x = xop * ilits->panel_wid / ilits->max_x; + touch_info[ilits->finger].y = yop * ilits->panel_hei / ilits->max_y; + } + } + + touch_info[ilits->finger].id = i; + + if (MT_PRESSURE) { + /* + * Since there's no pressure data in debug mode, we make fake values + * for android system if pressure needs to be reported. + */ + if (p[ilits->finger] == 1) + touch_info[ilits->finger].pressure = p[ilits->finger] = 2; + else + touch_info[ilits->finger].pressure = p[ilits->finger] = 1; + } else { + touch_info[ilits->finger].pressure = 1; + } + + ILI_DBG("original x = %d, y = %d\n", xop, yop); + ilits->finger++; + if (MT_B_TYPE) + ilits->curt_touch[i] = 1; + } + + ILI_DBG("figner number = %d, LastTouch = %d\n", ilits->finger, ilits->last_touch); + + if (ilits->finger) { + if (MT_B_TYPE) { + for (i = 0; i < ilits->finger; i++) { + input_report_key(ilits->input, BTN_TOUCH, 1); + ili_touch_press(touch_info[i].x, touch_info[i].y, touch_info[i].pressure, touch_info[i].id); + input_report_key(ilits->input, BTN_TOOL_FINGER, 1); + } + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->curt_touch[i] == 0 && ilits->prev_touch[i] == 1) + ili_touch_release(0, 0, i); + ilits->prev_touch[i] = ilits->curt_touch[i]; + } + } else { + for (i = 0; i < ilits->finger; i++) + ili_touch_press(touch_info[i].x, touch_info[i].y, touch_info[i].pressure, touch_info[i].id); + } + input_sync(ilits->input); + ilits->last_touch = ilits->finger; + } else { + if (ilits->last_touch) { + if (MT_B_TYPE) { + for (i = 0; i < MAX_TOUCH_NUM; i++) { + if (ilits->curt_touch[i] == 0 && ilits->prev_touch[i] == 1) + ili_touch_release(0, 0, i); + ilits->prev_touch[i] = ilits->curt_touch[i]; + } + input_report_key(ilits->input, BTN_TOUCH, 0); + input_report_key(ilits->input, BTN_TOOL_FINGER, 0); + } else { + ili_touch_release(0, 0, 0); + } + input_sync(ilits->input); + ilits->last_touch = 0; + } + } +} + +void ili_report_debug_mode(u8 *buf, int len) +{ + ili_debug_mode_report_point(buf + 5, len); + + ilitek_tddi_touch_customer_data_parsing(buf); + + ilitek_tddi_touch_send_debug_data(buf, len); +} + +void ili_report_pen_debug_mode(u8 *buf, int len) +{ + u8 offset = 5; + ilits->touch_num = MAX_TOUCH_NUM + MAX_PEN_NUM; + ILI_DBG("Pen Type = 0x%X, Max Touch Num = %d, Pen Data Mode = %d\n",ilits->pen_info.report_type, ilits->touch_num, ilits->pen_info.pen_data_mode); + + ili_pen_debug_mode_report_point(buf + offset, len, offset); + + if (ilits->pen_info.report_type != P5_X_ONLY_PEN_TYPE) { + ilitek_tddi_touch_customer_data_parsing(buf); + } + + ilitek_tddi_touch_send_debug_data(buf, len); +} + +void ili_report_debug_lite_mode(u8 *buf, int len) +{ + ili_debug_mode_report_point(buf + 4, len); + + ilitek_tddi_touch_send_debug_data(buf, len); +} + +void ili_report_proximity_mode(u8 *buf, int len) +{ + struct input_dev *input = ilits->input; + u8 proxmity_face_status = PROXIMITY_NONE_STATE_0; + + if (!ilits->prox_face_mode) { + ILI_ERR("proximity face mode Error\n"); + return; + } + + ili_irq_disable(); + + if (buf[1] == PROXIMITY_NEAR_STATE_1 || buf[1] == PROXIMITY_NEAR_STATE_2 || buf[1] == PROXIMITY_NEAR_STATE_3) { + proxmity_face_status = PROXIMITY_NEAR_STATE; + ILI_DBG("Set proximity State : Near, cmd : %X\n", buf[1]); + } else if(buf[1] == PROXIMITY_FAR_STATE_5) { + proxmity_face_status = PROXIMITY_FAR_STATE; + ILI_DBG("Set proximity State : Far, cmd : %X\n", buf[1]); + } else { + proxmity_face_status = PROXIMITY_IGNORE_STATE; + ILI_DBG("Set proximity State : Ignore, cmd : %X\n", buf[1]); + } + + if ((ilits->actual_tp_mode == P5_X_FW_AP_MODE) && (proxmity_face_status == PROXIMITY_NEAR_STATE) && (ilits->power_status == true) && (ilits->proxmity_face == false)) { + input_report_key(input, KEY_GESTURE_POWER, 1); + input_sync(input); + input_report_key(input, KEY_GESTURE_POWER, 0); + input_sync(input); + ilits->proxmity_face = true; + } else if ((ilits->actual_tp_mode == P5_X_FW_GESTURE_MODE) && (proxmity_face_status == PROXIMITY_FAR_STATE) && (ilits->power_status == false) && (ilits->proxmity_face == true)) { + input_report_key(input, KEY_GESTURE_POWER, 1); + input_sync(input); + input_report_key(input, KEY_GESTURE_POWER, 0); + input_sync(input); + ilits->proxmity_face = false; + } + + ILI_DBG("TP mode (0x%x)\n", ilits->actual_tp_mode); + ILI_DBG("power_status %s\n", ilits->power_status ? "True" : "False"); + ILI_DBG("proxmity face status : %s, proxmity face : %s\n", (proxmity_face_status == PROXIMITY_NEAR_STATE) ? "Near" : (proxmity_face_status == PROXIMITY_FAR_STATE) ? "Far" : "Ignore", ilits->proxmity_face ? "True" : "False"); + + ili_irq_enable(); +} + +void ili_report_gesture_mode(u8 *buf, int len) +{ + int lu_x = 0, lu_y = 0, rd_x = 0, rd_y = 0, score = 0; + struct gesture_coordinate *gc = ilits->gcoord; +#ifdef ILI_SENSOR_EN + static int report_cnt = 0; +#else + struct input_dev *input = ilits->input; +#endif + bool transfer = ilits->trans_xy; + u8 ges[P5_X_GESTURE_INFO_LENGTH_HIGH_RESOLUTION] = {0}; + + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + ipio_memcpy(ges, buf, len, P5_X_GESTURE_INFO_LENGTH); + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + ipio_memcpy(ges, buf, len, P5_X_GESTURE_INFO_LENGTH_HIGH_RESOLUTION); + } + + memset(gc, 0x0, sizeof(struct gesture_coordinate)); + + gc->code = ges[1]; + + /* Parsing gesture coordinate & Score*/ + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + score = ges[36]; + gc->pos_start.x = ((ges[4] & 0xF0) << 4) | ges[5]; + gc->pos_start.y = ((ges[4] & 0x0F) << 8) | ges[6]; + gc->pos_end.x = ((ges[7] & 0xF0) << 4) | ges[8]; + gc->pos_end.y = ((ges[7] & 0x0F) << 8) | ges[9]; + gc->pos_1st.x = ((ges[16] & 0xF0) << 4) | ges[17]; + gc->pos_1st.y = ((ges[16] & 0x0F) << 8) | ges[18]; + gc->pos_2nd.x = ((ges[19] & 0xF0) << 4) | ges[20]; + gc->pos_2nd.y = ((ges[19] & 0x0F) << 8) | ges[21]; + gc->pos_3rd.x = ((ges[22] & 0xF0) << 4) | ges[23]; + gc->pos_3rd.y = ((ges[22] & 0x0F) << 8) | ges[24]; + gc->pos_4th.x = ((ges[25] & 0xF0) << 4) | ges[26]; + gc->pos_4th.y = ((ges[25] & 0x0F) << 8) | ges[27]; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + score = ges[46]; + gc->pos_start.x = (ges[4] << 8) | ges[5]; + gc->pos_start.y = (ges[6] << 8) | ges[7]; + gc->pos_end.x = (ges[8] << 8) | ges[9]; + gc->pos_end.y = (ges[10] << 8) | ges[11]; + gc->pos_1st.x = (ges[20] << 8) | ges[21]; + gc->pos_1st.y = (ges[22] << 8) | ges[23]; + gc->pos_2nd.x = (ges[24] << 4) | ges[25]; + gc->pos_2nd.y = (ges[26] << 8) | ges[27]; + gc->pos_3rd.x = (ges[28] << 8) | ges[29]; + gc->pos_3rd.y = (ges[30] << 8) | ges[31]; + gc->pos_4th.x = (ges[32] << 8) | ges[33]; + gc->pos_4th.y = (ges[34] << 8) | ges[35]; + } + ILI_INFO("gesture code = 0x%x, score = %d\n", gc->code, score); + + switch (gc->code) { + case GESTURE_SINGLECLICK: + case GESTURE_DOUBLECLICK: + ILI_INFO("Gesture Click key event 0x%x\n", gc->code); +#ifdef ILI_SENSOR_EN + if (!(ilits->wakeable && ilits->should_enable_gesture)) { + ILI_INFO("Gesture got but wakeable not set. Skip this gesture."); + return; + } + if (ilits->report_gesture_key) { + int key_code = KEY_F1; +#ifdef ILI_DOUBLE_TAP_CTRL + if (GESTURE_DOUBLECLICK == gc->code) { + key_code = KEY_F4; + } +#endif + input_report_key(ilits->sensor_pdata->input_sensor_dev, key_code, 1); + input_sync(ilits->sensor_pdata->input_sensor_dev); + input_report_key(ilits->sensor_pdata->input_sensor_dev, key_code, 0); + input_sync(ilits->sensor_pdata->input_sensor_dev); + ++report_cnt; + ILI_INFO("input report keycode %d, report_cnt: %d", key_code, report_cnt); + } else { + input_report_abs(ilits->sensor_pdata->input_sensor_dev, + ABS_DISTANCE, + ++report_cnt); + input_sync(ilits->sensor_pdata->input_sensor_dev); + } + if (report_cnt >= REPORT_MAX_COUNT) { + report_cnt = 0; + } +#ifdef CONFIG_HAS_WAKELOCK + wake_lock_timeout(&(ilits->gesture_wakelock), msecs_to_jiffies(5000)); +#else + PM_WAKEUP_EVENT(ilits->gesture_wakelock, 5000); +#endif +#else + input_report_key(input, KEY_GESTURE_POWER, 1); + input_sync(input); + input_report_key(input, KEY_GESTURE_POWER, 0); + input_sync(input); +#endif + gc->type = GESTURE_DOUBLECLICK; + gc->clockwise = 1; + gc->pos_end.x = gc->pos_start.x; + gc->pos_end.y = gc->pos_start.y; + break; + case GESTURE_LEFT: + gc->type = GESTURE_LEFT; + gc->clockwise = 1; + break; + case GESTURE_RIGHT: + gc->type = GESTURE_RIGHT; + gc->clockwise = 1; + break; + case GESTURE_UP: + gc->type = GESTURE_UP; + gc->clockwise = 1; + break; + case GESTURE_DOWN: + gc->type = GESTURE_DOWN; + gc->clockwise = 1; + break; + case GESTURE_O: + gc->type = GESTURE_O; + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + gc->clockwise = (ges[34] > 1) ? 0 : ges[34]; + lu_x = (((ges[28] & 0xF0) << 4) | (ges[29])); + lu_y = (((ges[28] & 0x0F) << 8) | (ges[30])); + rd_x = (((ges[31] & 0xF0) << 4) | (ges[32])); + rd_y = (((ges[31] & 0x0F) << 8) | (ges[33])); + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + gc->clockwise = (ges[44] > 1) ? 0 : ges[44]; + lu_x = ((ges[36] << 8) | (ges[37])); + lu_y = ((ges[38] << 8) | (ges[39])); + rd_x = ((ges[40] << 8) | (ges[41])); + rd_y = ((ges[42] << 8) | (ges[43])); + } + + gc->pos_1st.x = ((rd_x + lu_x) / 2); + gc->pos_1st.y = lu_y; + gc->pos_2nd.x = lu_x; + gc->pos_2nd.y = ((rd_y + lu_y) / 2); + gc->pos_3rd.x = ((rd_x + lu_x) / 2); + gc->pos_3rd.y = rd_y; + gc->pos_4th.x = rd_x; + gc->pos_4th.y = ((rd_y + lu_y) / 2); + break; + case GESTURE_W: + gc->type = GESTURE_W; + gc->clockwise = 1; + break; + case GESTURE_M: + gc->type = GESTURE_M; + gc->clockwise = 1; + break; + case GESTURE_V: + gc->type = GESTURE_V; + gc->clockwise = 1; + break; + case GESTURE_C: + gc->type = GESTURE_C; + gc->clockwise = 1; + break; + case GESTURE_E: + gc->type = GESTURE_E; + gc->clockwise = 1; + break; + case GESTURE_S: + gc->type = GESTURE_S; + gc->clockwise = 1; + break; + case GESTURE_Z: + gc->type = GESTURE_Z; + gc->clockwise = 1; + break; + case GESTURE_TWOLINE_DOWN: + gc->type = GESTURE_TWOLINE_DOWN; + gc->clockwise = 1; + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + gc->pos_1st.x = (((ges[10] & 0xF0) << 4) | (ges[11])); + gc->pos_1st.y = (((ges[10] & 0x0F) << 8) | (ges[12])); + gc->pos_2nd.x = (((ges[13] & 0xF0) << 4) | (ges[14])); + gc->pos_2nd.y = (((ges[13] & 0x0F) << 8) | (ges[15])); + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + gc->pos_1st.x = ((ges[12] << 8) | (ges[13])); + gc->pos_1st.y = ((ges[14] << 8) | (ges[15])); + gc->pos_2nd.x = ((ges[16] << 8) | (ges[17])); + gc->pos_2nd.y = ((ges[18] << 8) | (ges[19])); + } + break; + default: + ILI_ERR("Unknown gesture code\n"); + break; + } + + if (!transfer) { + if (ilits->rib.nReportResolutionMode == POSITION_LOW_RESOLUTION) { + gc->pos_start.x = gc->pos_start.x * ilits->panel_wid / TPD_WIDTH; + gc->pos_start.y = gc->pos_start.y * ilits->panel_hei / TPD_HEIGHT; + gc->pos_end.x = gc->pos_end.x * ilits->panel_wid / TPD_WIDTH; + gc->pos_end.y = gc->pos_end.y * ilits->panel_hei / TPD_HEIGHT; + gc->pos_1st.x = gc->pos_1st.x * ilits->panel_wid / TPD_WIDTH; + gc->pos_1st.y = gc->pos_1st.y * ilits->panel_hei / TPD_HEIGHT; + gc->pos_2nd.x = gc->pos_2nd.x * ilits->panel_wid / TPD_WIDTH; + gc->pos_2nd.y = gc->pos_2nd.y * ilits->panel_hei / TPD_HEIGHT; + gc->pos_3rd.x = gc->pos_3rd.x * ilits->panel_wid / TPD_WIDTH; + gc->pos_3rd.y = gc->pos_3rd.y * ilits->panel_hei / TPD_HEIGHT; + gc->pos_4th.x = gc->pos_4th.x * ilits->panel_wid / TPD_WIDTH; + gc->pos_4th.y = gc->pos_4th.y * ilits->panel_hei / TPD_HEIGHT; + } else if (ilits->rib.nReportResolutionMode == POSITION_HIGH_RESOLUTION) { + gc->pos_start.x = gc->pos_start.x * ilits->panel_wid / ilits->max_x; + gc->pos_start.y = gc->pos_start.y * ilits->panel_hei / ilits->max_y; + gc->pos_end.x = gc->pos_end.x * ilits->panel_wid / ilits->max_x; + gc->pos_end.y = gc->pos_end.y * ilits->panel_hei / ilits->max_y; + gc->pos_1st.x = gc->pos_1st.x * ilits->panel_wid / ilits->max_x; + gc->pos_1st.y = gc->pos_1st.y * ilits->panel_hei / ilits->max_y; + gc->pos_2nd.x = gc->pos_2nd.x * ilits->panel_wid / ilits->max_x; + gc->pos_2nd.y = gc->pos_2nd.y * ilits->panel_hei / ilits->max_y; + gc->pos_3rd.x = gc->pos_3rd.x * ilits->panel_wid / ilits->max_x; + gc->pos_3rd.y = gc->pos_3rd.y * ilits->panel_hei / ilits->max_y; + gc->pos_4th.x = gc->pos_4th.x * ilits->panel_wid / ilits->max_x; + gc->pos_4th.y = gc->pos_4th.y * ilits->panel_hei / ilits->max_y; + } + + } + + ILI_INFO("Transfer = %d, Type = %d, clockwise = %d\n", transfer, gc->type, gc->clockwise); + ILI_INFO("Gesture Points: (%d, %d)(%d, %d)(%d, %d)(%d, %d)(%d, %d)(%d, %d)\n", + gc->pos_start.x, gc->pos_start.y, + gc->pos_end.x, gc->pos_end.y, + gc->pos_1st.x, gc->pos_1st.y, + gc->pos_2nd.x, gc->pos_2nd.y, + gc->pos_3rd.x, gc->pos_3rd.y, + gc->pos_4th.x, gc->pos_4th.y); + + ilitek_tddi_touch_send_debug_data(buf, len); +} + +void ili_report_i2cuart_mode(u8 *buf, int len) +{ + int type = buf[3] & 0x0F; + int need_read_len = 0, one_data_bytes = 0; + int actual_len = len - 5; + int uart_len; + u8 *uart_buf = NULL, *total_buf = NULL; + + ILI_DBG("data[3] = %x, type = %x, actual_len = %d\n", + buf[3], type, actual_len); + + need_read_len = buf[1] * buf[2]; + + if (type == 0 || type == 1 || type == 6) { + one_data_bytes = 1; + } else if (type == 2 || type == 3) { + one_data_bytes = 2; + } else if (type == 4 || type == 5) { + one_data_bytes = 4; + } + + need_read_len = need_read_len * one_data_bytes + 1; + ILI_DBG("need_read_len = %d one_data_bytes = %d\n", need_read_len, one_data_bytes); + + if (need_read_len <= actual_len) { + ilitek_tddi_touch_send_debug_data(buf, len); + goto out; + } + + uart_len = need_read_len - actual_len; + ILI_DBG("uart len = %d\n", uart_len); + + uart_buf = kcalloc(uart_len, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(uart_buf)) { + ILI_ERR("Failed to allocate uart_buf memory %ld\n", PTR_ERR(uart_buf)); + goto out; + } + + if (ilits->wrapper(NULL, 0, uart_buf, uart_len, OFF, OFF) < 0) { + ILI_ERR("i2cuart read data failed\n"); + goto out; + } + + total_buf = kcalloc(len + uart_len, sizeof(u8), GFP_KERNEL); + if (ERR_ALLOC_MEM(total_buf)) { + ILI_ERR("Failed to allocate total_buf memory %ld\n", PTR_ERR(total_buf)); + goto out; + } + + memcpy(total_buf, buf, len); + memcpy(total_buf + len, uart_buf, uart_len); + ilitek_tddi_touch_send_debug_data(total_buf, len + uart_len); + +out: + ipio_kfree((void **)&uart_buf); + ipio_kfree((void **)&total_buf); + return; +} + +#ifdef ROI +int ili_read_knuckle_roi_data(void) +{ + int i = 0; + int ret = 0; + struct ts_kit_device_data *ts_dev_data = ilits->ts_dev_data; + + ILI_DBG("roi_switch = %d, roi_support =%d\n", + ts_dev_data->ts_platform_data->feature_info.roi_info.roi_switch, + ts_dev_data->ts_platform_data->feature_info.roi_info.roi_supported); + + ILI_INFO("last_fingers = %d, cur_fingers =%d\n", + ilits->last_touch, + ilits->finger); + + if (ts_dev_data->ts_platform_data->feature_info.roi_info.roi_switch && ts_dev_data->ts_platform_data->feature_info.roi_info.roi_supported) { + if (ilits->last_touch != ilits->finger && ilits->finger <= ILITEK_KNUCKLE_ROI_FINGERS) { + ret = ili_config_knuckle_roi_ctrl(CMD_ROI_DATA); + if (ret) { + ILI_ERR("write data failed, ret = %d\n", ret); + return ret; + } + mdelay(1); + ret = ilits->wrapper(NULL, 0, ilits->knuckle_roi_data, ROI_DATA_READ_LENGTH, OFF, OFF); + if (ret) { + ILI_ERR("read data failed, ret = %d\n", ret); + return ret; + } + + ILI_DBG("index = %d, fixed = %d, peak_row = %d, peak_colum = %d\n", + ilits->knuckle_roi_data[0], + ilits->knuckle_roi_data[1], + ilits->knuckle_roi_data[2], + ilits->knuckle_roi_data[3]); + if (debug_en) { + printk("=================== roi data in bytes ===================\n"); + for (i = 4; i < ROI_DATA_READ_LENGTH; i++) { + printk(KERN_CONT "%3d ", ilits->knuckle_roi_data[i]); + if ((i - 3) % 14 == 0) { /* 14 * 14 rawdata bytes */ + printk("\n"); + } + } + } + } + } + return 0; +} +#endif