From 238449cd7800ff414d8834271e493d4b994bc012 Mon Sep 17 00:00:00 2001 From: dw-aceinna Date: Mon, 19 Oct 2020 19:43:09 +0800 Subject: [PATCH] new release to v1.0.7; see Readme.md for release note --- .gitignore | 1 + FreeRTOS/include/FreeRTOS.h | 2 +- FreeRTOS/include/osapi.h | 2 +- INS/ins_interface_API.h | 94 + INS/libINS.a | Bin 0 -> 194210 bytes INS/library.json | 13 + LWIP/lwip-1.4.1/src/netif/ethernetif.c | 16 +- LWIP/lwip_app/driver_tcp/tcp_driver.c | 444 ++ LWIP/lwip_app/driver_tcp/tcp_driver.h | 53 + LWIP/lwip_app/ntrip/inc/m_base64.h | 15 + LWIP/lwip_app/ntrip/inc/m_ntrip_client.h | 64 + LWIP/lwip_app/ntrip/src/m_base64.c | 77 + LWIP/lwip_app/ntrip/src/m_ntrip_client.c | 435 ++ LWIP/lwip_app/user/inc/lwip_comm.h | 74 +- LWIP/lwip_app/user/inc/lwipopts.h | 141 + LWIP/lwip_app/user/inc/netbios.h | 2 + LWIP/lwip_app/user/inc/netconn.h | 38 + LWIP/lwip_app/user/src/lwip_comm.c | 477 +- LWIP/lwip_app/user/src/netbios.c | 2 +- LWIP/lwip_app/user/src/netconn.c | 149 + LWIP/lwip_app/webserver/inc/fsdata.h | 5338 ++++++++++++++--- LWIP/lwip_app/webserver/inc/httpd.h | 2 +- LWIP/lwip_app/webserver/src/httpd.c | 12 +- LWIP/lwip_app/webserver/src/httpd_handler.c | 1681 +++++- Platform/BT/include/bt_packet.h | 62 + Platform/BT/include/json_parse.h | 27 + Platform/BT/src/bt_packet.c | 195 + Platform/BT/src/json_parse.c | 194 + Platform/Board/include/boardDefinition.h | 61 +- Platform/Board/include/bsp.h | 8 +- Platform/Board/include/stm32f4xx_hal_conf.h | 8 +- Platform/Board/src/bsp.c | 93 +- Platform/Board/src/stm32f4xx_hal_msp.c | 113 + Platform/CAN/include/can.h | 81 + Platform/CAN/include/car_data.h | 29 + Platform/CAN/include/sae_j1939.h | 457 ++ .../CAN/include/taskCanCommunicationJ1939.h | 36 + Platform/CAN/include/user_message_can.h | 15 + Platform/CAN/src/can.c | 370 ++ Platform/CAN/src/car_data.c | 178 + Platform/CAN/src/sae_j1939.c | 650 ++ Platform/CAN/src/sae_j1939_slave.c | 560 ++ Platform/CAN/src/taskCANcommunicationJ1939.c | 127 + Platform/CAN/src/user_message_can.c | 280 + Platform/Core/include/parameters.h | 11 - Platform/Core/include/ucb_packet.h | 5 +- Platform/Core/src/configuration.c | 12 +- Platform/Core/src/debug.c | 24 +- Platform/Core/src/handle_packet.c | 89 +- Platform/Core/src/parameters.c | 389 +- Platform/Core/src/platform.c | 9 + Platform/Core/src/send_packet.c | 373 +- Platform/Core/src/serial_port.c | 39 +- Platform/Core/src/ucb_packet.c | 16 +- Platform/Driver/include/exit.h | 2 + Platform/Driver/include/rng.h | 8 + Platform/Driver/include/spi.h | 23 + Platform/Driver/include/timer.h | 2 +- Platform/Driver/include/uart.h | 4 +- Platform/Driver/src/exit.c | 22 +- Platform/Driver/src/rng.c | 19 + Platform/Driver/src/spi.c | 242 + Platform/Driver/src/timer.c | 43 +- Platform/Driver/src/uart.c | 45 +- Platform/commAPI.h | 5 +- Platform/common/include/constants.h | 2 +- Platform/common/include/nav_math.h | 1 + Platform/common/include/scaling.h | 78 + Platform/common/include/utils.h | 4 +- Platform/common/src/nav_math.c | 19 + Platform/common/src/utils.c | 179 +- Platform/configurationAPI.h | 4 +- Platform/gnss_data/include/rtcm.h | 37 + Platform/gnss_data/include/rtklib_core.h | 1 + Platform/gnss_data/src/rtcm.c | 133 +- Platform/gnss_data_api.h | 26 + Platform/hwAPI.h | 8 +- Platform/library.json | 3 +- Platform/platform_version.h | 12 +- README.md | 20 + STM32F469/HAL/Src/stm32f4xx_hal_spi.c | 2 +- Sensors/calibrationAPI.h | 3 +- Sensors/eepromAPI.h | 106 +- Sensors/libSensors.a | Bin 53318 -> 55732 bytes Sensors/sensorsAPI.h | 61 +- library.json | 42 +- 86 files changed, 13333 insertions(+), 1466 deletions(-) create mode 100644 INS/ins_interface_API.h create mode 100644 INS/libINS.a create mode 100644 INS/library.json create mode 100644 LWIP/lwip_app/driver_tcp/tcp_driver.c create mode 100644 LWIP/lwip_app/driver_tcp/tcp_driver.h create mode 100644 LWIP/lwip_app/ntrip/inc/m_base64.h create mode 100644 LWIP/lwip_app/ntrip/inc/m_ntrip_client.h create mode 100644 LWIP/lwip_app/ntrip/src/m_base64.c create mode 100644 LWIP/lwip_app/ntrip/src/m_ntrip_client.c create mode 100644 LWIP/lwip_app/user/inc/netconn.h create mode 100644 LWIP/lwip_app/user/src/netconn.c create mode 100644 Platform/BT/include/bt_packet.h create mode 100644 Platform/BT/include/json_parse.h create mode 100644 Platform/BT/src/bt_packet.c create mode 100644 Platform/BT/src/json_parse.c create mode 100644 Platform/CAN/include/can.h create mode 100644 Platform/CAN/include/car_data.h create mode 100644 Platform/CAN/include/sae_j1939.h create mode 100644 Platform/CAN/include/taskCanCommunicationJ1939.h create mode 100644 Platform/CAN/include/user_message_can.h create mode 100644 Platform/CAN/src/can.c create mode 100644 Platform/CAN/src/car_data.c create mode 100644 Platform/CAN/src/sae_j1939.c create mode 100644 Platform/CAN/src/sae_j1939_slave.c create mode 100644 Platform/CAN/src/taskCANcommunicationJ1939.c create mode 100644 Platform/CAN/src/user_message_can.c create mode 100644 Platform/Driver/include/rng.h create mode 100644 Platform/Driver/include/spi.h create mode 100644 Platform/Driver/src/rng.c create mode 100644 Platform/Driver/src/spi.c create mode 100644 Platform/common/include/scaling.h diff --git a/.gitignore b/.gitignore index 5a5f80a..8c386b3 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ _ReSharper*/ .vs/ #Nuget packages folder packages/ +.vscode/ \ No newline at end of file diff --git a/FreeRTOS/include/FreeRTOS.h b/FreeRTOS/include/FreeRTOS.h index 319f6b8..33b9f14 100644 --- a/FreeRTOS/include/FreeRTOS.h +++ b/FreeRTOS/include/FreeRTOS.h @@ -105,7 +105,7 @@ extern "C" { /* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ #ifndef configUSE_NEWLIB_REENTRANT - #define configUSE_NEWLIB_REENTRANT 0 + #define configUSE_NEWLIB_REENTRANT 1 #endif /* Required if struct _reent is used. */ diff --git a/FreeRTOS/include/osapi.h b/FreeRTOS/include/osapi.h index a8b1037..edb0954 100644 --- a/FreeRTOS/include/osapi.h +++ b/FreeRTOS/include/osapi.h @@ -16,7 +16,7 @@ extern int gIsrDisableCount; #define getSystemTime() osKernelSysTick() #define getSystemTimeAsDouble() (double)osKernelSysTick()/configTICK_RATE_HZ; - +#define timeElapsed(since) (osKernelSysTick() - since) #define OS_INFINITE_TIMEOUT portMAX_DELAY diff --git a/INS/ins_interface_API.h b/INS/ins_interface_API.h new file mode 100644 index 0000000..7ecc1e7 --- /dev/null +++ b/INS/ins_interface_API.h @@ -0,0 +1,94 @@ +/** *************************************************************************** + * @file int_interface_API.h API functions for Magnitometer functionality + * + * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + * PARTICULAR PURPOSE. + * + *****************************************************************************/ +/******************************************************************************* +Copyright 2018 ACEINNA, INC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*******************************************************************************/ +#ifndef INS_INTERFACE_API +#define INS_INTERFACE_API +#include +#include "gnss_data_api.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #define ARM_MCU +#endif + + +int8_t SetStartGNSSWeek(int32_t week); + +int8_t GetKFStatus(); +extern int8_t nhcflag; +extern int8_t GNSSOBSFLAG; +extern double lastgnsstime; +extern int KFStatus; + + +void ins_gnss_time_update(); +void ins_fusion(); +int copy_gnss_result(gnss_solution_t *gnss_sol); +int get_mGnssInsSystem_mlc_STATUS(); + +BOOL Fill_std1PacketPayload_ins(uint8_t *payload, uint8_t *payloadLen); +BOOL ins_Fill_posPacketPayload(uint8_t *payload, uint8_t *payloadLen); +BOOL ins_Fill_inspvaPacketPayload(uint8_t *payload, uint8_t *payloadLen); + +void set_wheel_tick_update_flag(int state); +int get_wheel_tick_update_flag(); +void add_wheel_tick_count(); +void set_wheel_tick_fwd(uint8_t fwd_flag); + + +extern char ggaBuff[]; +extern char pashrBuff[]; + + +int32_t get_ins_status(); +int32_t get_pos_type(); +double get_ins_latitude(); +double get_ins_longitude(); +double get_ins_height(); +double get_ins_north_velocity(); +double get_ins_east_velocity(); +double get_ins_up_velocity(); +double get_ins_roll(); +double get_ins_pitch(); +double get_ins_azimuth(); +float get_ins_latitude_std(); +float get_ins_longitude_std(); +float get_ins_altitude_std(); +float get_ins_north_velocity_std(); +float get_ins_east_velocity_std(); +float get_ins_up_velocity_std(); +float get_ins_roll_std(); +float get_ins_pitch_std(); +float get_ins_azimuth_std(); + +BOOL user_car_speed_handler(uint8_t *payload, uint8_t *payloadLen); + +/*--------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +#endif diff --git a/INS/libINS.a b/INS/libINS.a new file mode 100644 index 0000000000000000000000000000000000000000..d15f934451feb517fd1c8a9442cbd407ba3bea1a GIT binary patch literal 194210 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

a)Obpg4F_*;L3X4g`Jt?neZC#>T(>^ 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 YVhattm4{)S54UlqQolo5>}7HP2N}9|;s5{u literal 0 HcmV?d00001 diff --git a/INS/library.json b/INS/library.json new file mode 100644 index 0000000..a1681c0 --- /dev/null +++ b/INS/library.json @@ -0,0 +1,13 @@ +{ + "name": "INS", + "version": "0.0.1", + "description": "GNSS/INS library", + "build": { + "flags": [ + "-I include", + "-I ." + ], + "libArchive": true, + "platforms": "aceinna_imu" + } + } diff --git a/LWIP/lwip-1.4.1/src/netif/ethernetif.c b/LWIP/lwip-1.4.1/src/netif/ethernetif.c index e812d78..afb8729 100644 --- a/LWIP/lwip-1.4.1/src/netif/ethernetif.c +++ b/LWIP/lwip-1.4.1/src/netif/ethernetif.c @@ -141,6 +141,8 @@ void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth) ******************************************************************************/ static void low_level_init(struct netif *netif) { + uint8_t* p_mac = get_static_mac(); + KSZ8041NL_reset_port_init(); KSZ8041NL_reset(); @@ -150,7 +152,7 @@ static void low_level_init(struct netif *netif) EthHandle.Init.Speed = ETH_SPEED_100M; EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX; EthHandle.Init.PhyAddress = KSZ8041NL_PHY_ADDRESS; - EthHandle.Init.MACAddr = gUserConfiguration.mac; //gnetif.hwaddr; + EthHandle.Init.MACAddr = p_mac; //gnetif.hwaddr; EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE; EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII; @@ -167,12 +169,12 @@ static void low_level_init(struct netif *netif) netif->hwaddr_len = ETHARP_HWADDR_LEN; /* set netif MAC hardware address */ - netif->hwaddr[0] = gUserConfiguration.mac[0]; - netif->hwaddr[1] = gUserConfiguration.mac[1]; - netif->hwaddr[2] = gUserConfiguration.mac[2]; - netif->hwaddr[3] = gUserConfiguration.mac[3]; - netif->hwaddr[4] = gUserConfiguration.mac[4]; - netif->hwaddr[5] = gUserConfiguration.mac[5]; + netif->hwaddr[0] = p_mac[0]; + netif->hwaddr[1] = p_mac[1]; + netif->hwaddr[2] = p_mac[2]; + netif->hwaddr[3] = p_mac[3]; + netif->hwaddr[4] = p_mac[4]; + netif->hwaddr[5] = p_mac[5]; netif->mtu = 1500; diff --git a/LWIP/lwip_app/driver_tcp/tcp_driver.c b/LWIP/lwip_app/driver_tcp/tcp_driver.c new file mode 100644 index 0000000..1ab0e3e --- /dev/null +++ b/LWIP/lwip_app/driver_tcp/tcp_driver.c @@ -0,0 +1,444 @@ +#include "string.h" +#include "stm32f4xx_hal.h" +#include "osapi.h" +#include "user_config.h" +#include "calibrationAPI.h" +#include "platformAPI.h" +#include "uart.h" + +#include "serial_port.h" +#include "uart.h" +#include "crc16.h" +#include "ucb_packet.h" +#include "platformAPI.h" +#include "configuration.h" +#include "user_message.h" +#include "lwip/ip.h" +#include "lwip/opt.h" + +#include "lwip/udp.h" +#include "lwip/netif.h" +#include "netbios.h" +#include "commAPI.h" +#include "user_config.h" +#include "tcp_driver.h" +#include "cJSON.h" +#include "app_version.h" + +client_s driver_client; +client_s driver_data_client; + +uint8_t driver_tx_buf[DRIVER_TX_BUFSIZE]; +uint8_t driver_rx_buf[DRIVER_RX_BUFSIZE]; +uint8_t driver_data_tx_buf[DRIVER_TX_BUFSIZE]; +uint8_t driver_data_rx_buf[DRIVER_RX_BUFSIZE]; + +ip_addr_t server_ip; + +void client_link_down(uint8_t* client_state) +{ + if (*client_state >= CLIENT_STATE_CONNECT && *client_state <= CLIENT_STATE_INTERACTIVE) + { + *client_state = CLIENT_STATE_LINK_DOWN; + } +} + +err_t client_write_data(client_s* client, uint8_t *tx_buf, uint16_t tx_len, uint8_t apiflags) +{ + err_t err; + + err = netconn_write(client->client, tx_buf, tx_len, apiflags); + if (ERR_IS_FATAL(err)) + { + if (client->client_state == CLIENT_STATE_REQUEST || client->client_state == CLIENT_STATE_INTERACTIVE) + { + client->client_state = CLIENT_STATE_CONNECT; + } + } + + return err; +} + + +err_t client_read_data(client_s* client, uint8_t *rx_buf, uint16_t *rx_len) +{ + struct netbuf *rxNetbuf; + uint16_t len = 0; + struct pbuf *q; + err_t err; + + err = netconn_recv(client->client, &rxNetbuf); + if (err == ERR_OK) + { + taskENTER_CRITICAL(); + for (q = rxNetbuf->p; q != NULL; q = q->next) + { + if (q->len > (DRIVER_RX_BUFSIZE - len)) + memcpy(rx_buf + len, q->payload, (DRIVER_RX_BUFSIZE - len)); + else + memcpy(rx_buf + len, q->payload, q->len); + len += q->len; + if (len > DRIVER_RX_BUFSIZE) + break; + } + *rx_len = len; + taskEXIT_CRITICAL(); + } + netbuf_delete(rxNetbuf); + + if (ERR_IS_FATAL(err)) + { + client->client_state = CLIENT_STATE_CONNECT; + } + + return err; +} + +uint8_t is_client_interactive(client_s* client) +{ + return (client->client_state == CLIENT_STATE_INTERACTIVE); +} + +uint8_t client_push_tx_data(client_s* client, uint8_t* buf, uint16_t len) +{ + if (is_client_interactive(client)) + { + fifo_push(&client->client_tx_fifo, (uint8_t*)buf, len); + return 1; + } + return 0; +} + +uint8_t driver_data_push(uint8_t* buf, uint16_t len) +{ + osMutexWait(driver_data_client.tx_fifo_mutex, osWaitForever); + client_push_tx_data(&driver_data_client,buf,len); + osMutexRelease(driver_data_client.tx_fifo_mutex); +} + +uint8_t driver_push(uint8_t* buf, uint16_t len) +{ + osMutexWait(driver_client.tx_fifo_mutex, osWaitForever); + client_push_tx_data(&driver_client,buf,len); + osMutexRelease(driver_client.tx_fifo_mutex); +} + + +void set_server_ip(ip_addr_t* value) +{ + memcpy(&server_ip,value,sizeof(ip_addr_t)); +} + + +extern uint8_t debug_com_log_on; +extern uint32_t debug_p1_log_delay; +void driver_interface(void) +{ + static ip_addr_t server_ipaddr; + static uint8_t tx_buf[512]; + static uint8_t write_fail = 0; + uint16_t tx_len = 0; + err_t err; + if (is_eth_link_down()) + { + client_link_down(&driver_client); + } + + switch (driver_client.client_state) + { + case CLIENT_STATE_CONNECT: + if(server_ip.addr == 0) + { + break; + } + if (driver_client.client != NULL) + { + netconn_close(driver_client.client); + // osDelay(100); + netconn_delete(driver_client.client); + driver_client.client = NULL; + } + + // OS_Delay(50); + driver_client.client = netconn_new(NETCONN_TCP); + + err = IP4_ADDR(&server_ipaddr, ip4_addr1(&server_ip.addr), ip4_addr2(&server_ip.addr), \ + ip4_addr3(&server_ip.addr), ip4_addr4(&server_ip.addr)); + + if (err) + { + err = netconn_connect(driver_client.client, &server_ipaddr, driver_client_port); + if (err == ERR_OK) + { + driver_client.client->recv_timeout = 10; + driver_client.client->send_timeout = 100; + driver_client.client_state = CLIENT_STATE_REQUEST; + } + else + { + } + } + break; + + case CLIENT_STATE_REQUEST: + // uart_write_bytes(UART_DEBUG,"start write data\r\n",strlen("start write data\r\n"),1); + // OS_Delay(100); + sprintf(tx_buf,"hello pc i'm openrtk\r\n"); + tx_len = strlen(tx_buf); + err = client_write_data(&driver_client, tx_buf, tx_len, NETCONN_COPY); + if (err == ERR_OK) + { + OS_Delay(100); + uint16_t rx_len = 0; + err = client_read_data(&driver_client, driver_rx_buf, &rx_len); + if (rx_len && strstr((char *)driver_rx_buf, "i am pc") != NULL) + { + driver_client.client_state = CLIENT_STATE_INTERACTIVE; + } + } + else + { + write_fail++; + if (write_fail >= 5) + { + driver_client.client_state = CLIENT_STATE_OFF; + } + } + break; + case CLIENT_STATE_INTERACTIVE: + handle_tcp_commands(); + break; + case CLIENT_STATE_LINK_DOWN: + if (driver_client.client != NULL) + { + netconn_close(driver_client.client); + osDelay(100); + netconn_delete(driver_client.client); + driver_client.client = NULL; + } + driver_client.client_state = CLIENT_STATE_OFF; + break; + + case CLIENT_STATE_OFF: + if (!is_eth_link_down()) + { + if (get_eth_mode() == ETHMODE_DHCP) + { + if (is_dhcp_address_assigned()) + { + driver_client.client_state = CLIENT_STATE_CONNECT; + } + } + else if (get_eth_mode() == ETHMODE_STATIC) + { + driver_client.client_state = CLIENT_STATE_CONNECT; + } + } + + OS_Delay(20); + break; + + default: + OS_Delay(100); + break; + } +} + + + + + +void driver_output_data_interface(void) +{ + static ip_addr_t server_ipaddr; + static uint8_t tx_buf[DRIVER_TX_BUFSIZE]; + static uint8_t write_fail = 0; + uint16_t tx_len = 0; + err_t err; + cJSON *root, *fmt; + char *out; + if (is_eth_link_down()) + { + client_link_down(&driver_data_client); + } + + switch (driver_data_client.client_state) + { + case CLIENT_STATE_CONNECT: + if(server_ip.addr == 0) + { + break; + } + if (driver_data_client.client != NULL) + { + netconn_close(driver_data_client.client); + // osDelay(100); + netconn_delete(driver_data_client.client); + driver_data_client.client = NULL; + } + + // OS_Delay(50); + driver_data_client.client = netconn_new(NETCONN_TCP); + + err = IP4_ADDR(&server_ipaddr, ip4_addr1(&server_ip.addr), ip4_addr2(&server_ip.addr), \ + ip4_addr3(&server_ip.addr), ip4_addr4(&server_ip.addr)); + + if (err) + { + err = netconn_connect(driver_data_client.client, &server_ipaddr, driver_data_client_port); + if (err == ERR_OK) + { + driver_data_client.client->recv_timeout = 10; + driver_data_client.client->send_timeout = 100; + driver_data_client.client_state = CLIENT_STATE_REQUEST; + } + else + { + } + } + break; + + case CLIENT_STATE_REQUEST: + // OS_Delay(100); + sprintf(tx_buf,"hello pc i'm openrtk_data\r\n"); + tx_len = strlen(tx_buf); + err = client_write_data(&driver_data_client, tx_buf, tx_len, NETCONN_COPY); + if (err == ERR_OK) + { + OS_Delay(100); + uint16_t rx_len = 0; + err = client_read_data(&driver_data_client, driver_data_rx_buf, &rx_len); + if(rx_len) + { + if (strstr((const char*)driver_data_rx_buf, "get configuration\r\n") != NULL) + { + root = cJSON_CreateObject(); + cJSON_AddItemToObject(root, "openrtk configuration", fmt = cJSON_CreateObject()); + cJSON_AddItemToObject(fmt, "Product Name", cJSON_CreateString(PRODUCT_NAME_STRING)); + cJSON_AddItemToObject(fmt, "Product PN", cJSON_CreateString((const char *)platformBuildInfo())); + cJSON_AddItemToObject(fmt, "Product SN", cJSON_CreateNumber(GetUnitSerialNum())); + cJSON_AddItemToObject(fmt, "Version", cJSON_CreateString(APP_VERSION_STRING)); + + uint8_t *user_packet_type = get_user_packet_type(); + char packet_type_str[5] = {0}; + packet_type_str[0] = user_packet_type[0]; + packet_type_str[1] = user_packet_type[1]; + + uint16_t user_packet_rate = get_user_packet_rate(); + + cJSON_AddItemToObject(fmt, "userPacketType", cJSON_CreateString(packet_type_str)); + cJSON_AddItemToObject(fmt, "userPacketRate", cJSON_CreateNumber(user_packet_rate)); + + float *ins_para = get_user_ins_para(); + cJSON_AddItemToObject(fmt, "leverArmBx", cJSON_CreateNumber(*ins_para)); + cJSON_AddItemToObject(fmt, "leverArmBy", cJSON_CreateNumber(*(ins_para + 1))); + cJSON_AddItemToObject(fmt, "leverArmBz", cJSON_CreateNumber(*(ins_para + 2))); + cJSON_AddItemToObject(fmt, "pointOfInterestBx", cJSON_CreateNumber(*(ins_para + 3))); + cJSON_AddItemToObject(fmt, "pointOfInterestBy", cJSON_CreateNumber(*(ins_para + 4))); + cJSON_AddItemToObject(fmt, "pointOfInterestBz", cJSON_CreateNumber(*(ins_para + 5))); + cJSON_AddItemToObject(fmt, "rotationRbvx", cJSON_CreateNumber(*(ins_para + 6))); + cJSON_AddItemToObject(fmt, "rotationRbvy", cJSON_CreateNumber(*(ins_para + 7))); + cJSON_AddItemToObject(fmt, "rotationRbvz", cJSON_CreateNumber(*(ins_para + 8))); + + out = cJSON_Print(root); + cJSON_Delete(root); + client_write_data(&driver_data_client, out, strlen(out), NETCONN_COPY); + // uart_write_bytes(UART_DEBUG, out, strlen(out), 1); + free(out); + debug_com_log_on = 0; + } + if (strstr((const char*)driver_data_rx_buf, "log debug on\r\n") != NULL) + { + debug_com_log_on = 1; + debug_p1_log_delay = 100; + driver_data_client.client_state = CLIENT_STATE_INTERACTIVE; + } + } + // if (rx_len && strstr((char *)driver_data_rx_buf, "i am pc") != NULL) + // { + // driver_data_client.client_state = CLIENT_STATE_INTERACTIVE; + // } + } + else + { + write_fail++; + if (write_fail >= 5) + { + driver_data_client.client_state = CLIENT_STATE_OFF; + } + } + break; + case CLIENT_STATE_INTERACTIVE: + tx_len = fifo_get(&driver_data_client.client_tx_fifo, tx_buf, DRIVER_TX_BUFSIZE); + if (tx_len) + { + err = client_write_data(&driver_data_client,tx_buf, tx_len, NETCONN_NOFLAG); + if (err != 0) { + write_fail++; + if (write_fail >= 3) + { + driver_data_client.client_state = CLIENT_STATE_OFF; + } + } + } + break; + case CLIENT_STATE_LINK_DOWN: + if (driver_data_client.client != NULL) + { + netconn_close(driver_data_client.client); + osDelay(100); + netconn_delete(driver_data_client.client); + driver_data_client.client = NULL; + } + driver_data_client.client_state = CLIENT_STATE_OFF; + break; + + case CLIENT_STATE_OFF: + if (!is_eth_link_down()) + { + if (get_eth_mode() == ETHMODE_DHCP) + { + if (is_dhcp_address_assigned()) + { + driver_data_client.client_state = CLIENT_STATE_CONNECT; + } + } + else if (get_eth_mode() == ETHMODE_STATIC) + { + driver_data_client.client_state = CLIENT_STATE_CONNECT; + } + } + + OS_Delay(20); + break; + + default: + OS_Delay(100); + break; + } +} + +void tcp_driver_fifo_init() +{ + fifo_init(&driver_client.client_tx_fifo, driver_tx_buf, DRIVER_TX_BUFSIZE); + osMutexDef(FIFO_MUTEX); + driver_client.tx_fifo_mutex = osMutexCreate(osMutex(FIFO_MUTEX)); +} + +void tcp_driver_data_fifo_init() +{ + fifo_init(&driver_data_client.client_tx_fifo, driver_data_tx_buf, DRIVER_TX_BUFSIZE); + osMutexDef(FIFO_MUTEX); + driver_data_client.tx_fifo_mutex = osMutexCreate(osMutex(FIFO_MUTEX)); +} + + +uint8_t get_tcp_driver_state() +{ + return driver_client.client_state; +} + +uint8_t get_tcp_data_driver_state() +{ + return driver_data_client.client_state; +} diff --git a/LWIP/lwip_app/driver_tcp/tcp_driver.h b/LWIP/lwip_app/driver_tcp/tcp_driver.h new file mode 100644 index 0000000..5bee99b --- /dev/null +++ b/LWIP/lwip_app/driver_tcp/tcp_driver.h @@ -0,0 +1,53 @@ +#ifndef _TCP_DRIVER_H_ +#define _TCP_DRIVER_H_ + +#include +#include "lwip/err.h" +#include "lwip/api.h" +#include "lwip/opt.h" +#include "lwip_comm.h" +#include "lwip/sys.h" +#include "lwip/api.h" +#include "utils.h" + +#define driver_server_ip "192.168.1.1" + +#define driver_client_port 2203 +#define driver_data_client_port 2204 + +#define DRIVER_TX_BUFSIZE (4*1024) +#define DRIVER_RX_BUFSIZE 500 + + +typedef enum +{ + CLIENT_STATE_OFF = 0, + CLIENT_STATE_CONNECT = 1, + CLIENT_STATE_REQUEST = 2, + CLIENT_STATE_INTERACTIVE = 3, + CLIENT_STATE_TIMEOUT = 4, + CLIENT_STATE_LINK_DOWN = 5 +} driver_client_state_enum_t; + + +typedef struct CLIENT_S_ +{ + struct netconn *client; + uint8_t client_state; + fifo_type client_tx_fifo; + fifo_type client_rx_fifo; + osMutexId tx_fifo_mutex; +}client_s; + +void driver_interface(void); +void driver_output_data_interface(void); +err_t client_read_data(client_s* client, uint8_t *rx_buf, uint16_t *rx_len); +void tcp_driver_fifo_init(); +void tcp_driver_data_fifo_init(); +uint8_t get_tcp_driver_state(); +uint8_t get_tcp_data_driver_state(); +uint8_t driver_data_push(uint8_t* buf, uint16_t len); +uint8_t driver_push(uint8_t* buf, uint16_t len); +err_t client_write_data(client_s* client, uint8_t *tx_buf, uint16_t tx_len, uint8_t apiflags); + +#endif diff --git a/LWIP/lwip_app/ntrip/inc/m_base64.h b/LWIP/lwip_app/ntrip/inc/m_base64.h new file mode 100644 index 0000000..7d042ec --- /dev/null +++ b/LWIP/lwip_app/ntrip/inc/m_base64.h @@ -0,0 +1,15 @@ +#ifndef BASE_STATION + +#ifndef _M_BASE64_H +#define _M_BASE64_H + +#include +#include +#include + +void base64_encode(uint8_t *str, uint8_t *res); +void bae64_decode(uint8_t *code, uint8_t *res); + +#endif + +#endif diff --git a/LWIP/lwip_app/ntrip/inc/m_ntrip_client.h b/LWIP/lwip_app/ntrip/inc/m_ntrip_client.h new file mode 100644 index 0000000..53f9d4a --- /dev/null +++ b/LWIP/lwip_app/ntrip/inc/m_ntrip_client.h @@ -0,0 +1,64 @@ +#ifndef BASE_STATION + +#ifndef _NTRIP_CLIENT_H_ +#define _NTRIP_CLIENT_H_ + +#include +#include "lwip/err.h" +#include "lwip/api.h" +#include "lwip/opt.h" +#include "lwip_comm.h" +#include "lwip/sys.h" +#include "lwip/api.h" +#include "utils.h" + +// ntrip buffer size +#define NTRIP_TX_BUFSIZE 2000 +#define NTRIP_RX_BUFSIZE 2000 + +// ntrip client start +#define NTRIP_START_OFF 0 +#define NTRIP_START_ON 1 + +// ntrip base stream +#define BSAE_OFF 0 +#define BSAE_ON 1 + +// ntrip client state +typedef enum +{ + NTRIP_STATE_OFF = 0, + NTRIP_STATE_CONNECT = 1, + NTRIP_STATE_REQUEST = 2, + NTRIP_STATE_INTERACTIVE = 3, + NTRIP_STATE_TIMEOUT = 4, + NTRIP_STATE_LINK_DOWN = 5 +} ntrip_client_state_enum_t; + +extern struct netconn *Ntrip_client; +extern uint8_t NTRIP_client_state; + +extern fifo_type ntrip_tx_fifo; +extern fifo_type ntrip_rx_fifo; +extern uint8_t ntripTxBuf[NTRIP_TX_BUFSIZE]; +extern uint8_t ntripRxBuf[NTRIP_RX_BUFSIZE]; +extern uint32_t ntripStreamCount; + +#define NTRIP_STREAM_CONNECTED_MAX_COUNT 20 + +void fill_localrtk_request_payload(uint8_t* payload, uint16_t *payloadLen); + +err_t ntrip_read_data(uint8_t *rxBuf, uint16_t *rxLen); +err_t ntrip_push_rx_data(fifo_type* fifo); +err_t ntrip_write_data(uint8_t *txBuf, uint16_t txLen, uint8_t apiflags); +uint8_t ntrip_push_tx_data(uint8_t* buf, uint16_t len); +void ntrip_link_down(void); +uint8_t is_ntrip_interactive(void); +void add_ntrip_stream_count(void); +void clear_ntrip_stream_count(void); +uint8_t is_ntrip_stream_available(void); +void NTRIP_interface(void); + +#endif + +#endif diff --git a/LWIP/lwip_app/ntrip/src/m_base64.c b/LWIP/lwip_app/ntrip/src/m_base64.c new file mode 100644 index 0000000..2943a49 --- /dev/null +++ b/LWIP/lwip_app/ntrip/src/m_base64.c @@ -0,0 +1,77 @@ +#ifndef BASE_STATION + +#include "m_base64.h" +#include "string.h" + +void base64_encode(uint8_t *str, uint8_t *res) +{ + uint32_t len, str_len; + uint16_t i, j; + uint8_t base64_table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + str_len = strlen((const char*)str); + if (str_len % 3 == 0) + len = str_len / 3 * 4; + else + len = (str_len / 3 + 1) * 4; + + res[len] = '\0'; + + for (i = 0, j = 0; i < len - 2; j += 3, i += 4) + { + res[i] = base64_table[str[j] >> 2]; + res[i + 1] = base64_table[(str[j] & 0x3) << 4 | (str[j + 1] >> 4)]; + res[i + 2] = base64_table[(str[j + 1] & 0xf) << 2 | (str[j + 2] >> 6)]; + res[i + 3] = base64_table[str[j + 2] & 0x3f]; + } + + switch (str_len % 3) + { + case 1: + res[i - 2] = '='; + res[i - 1] = '='; + break; + case 2: + res[i - 1] = '='; + break; + } +} + +void bae64_decode(uint8_t *code, uint8_t *res) +{ + int table[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, + 63, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51}; + long len; + long str_len; + int i, j; + + len = strlen((const char*)code); + if (strstr((const char*)code, "==")) + str_len = len / 4 * 3 - 2; + else if (strstr((const char*)code, "=")) + str_len = len / 4 * 3 - 1; + else + str_len = len / 4 * 3; + + res = malloc(sizeof(unsigned char) * str_len + 1); + res[str_len] = '\0'; + + for (i = 0, j = 0; i < len - 2; j += 3, i += 4) + { + res[j] = ((unsigned char)table[code[i]]) << 2 | (((unsigned char)table[code[i + 1]]) >> 4); + res[j + 1] = (((unsigned char)table[code[i + 1]]) << 4) | (((unsigned char)table[code[i + 2]]) >> 2); + res[j + 2] = (((unsigned char)table[code[i + 2]]) << 6) | ((unsigned char)table[code[i + 3]]); + } +} + +#endif diff --git a/LWIP/lwip_app/ntrip/src/m_ntrip_client.c b/LWIP/lwip_app/ntrip/src/m_ntrip_client.c new file mode 100644 index 0000000..0ec486e --- /dev/null +++ b/LWIP/lwip_app/ntrip/src/m_ntrip_client.c @@ -0,0 +1,435 @@ +#ifndef BASE_STATION + +#include + +#include "m_ntrip_client.h" +#include "m_base64.h" +#include "stm32f4xx_hal.h" +#include "osapi.h" +#include "user_config.h" +#include "calibrationAPI.h" +#include "platformAPI.h" +#include "uart.h" + + +// ntrip +struct netconn *Ntrip_client = NULL; +uint8_t NTRIP_client_state = NTRIP_STATE_OFF; + +// ntrip buf +fifo_type ntrip_tx_fifo; +fifo_type ntrip_rx_fifo; +CCMRAM uint8_t ntripTxBuf[NTRIP_TX_BUFSIZE]; +CCMRAM uint8_t ntripRxBuf[NTRIP_RX_BUFSIZE]; +uint32_t ntripStreamCount = NTRIP_STREAM_CONNECTED_MAX_COUNT; + +/** *************************************************************************** + * @name fill_localrtk_request_payload() + * @brief fill Local RTK Request + * @param *payload point to buffer + * *payloadLen point to buffer length + * @retval N/A + ******************************************************************************/ +void fill_localrtk_request_payload(uint8_t *payload, uint16_t *payloadLen) +{ + uint8_t temp[25]; + + strcpy((char *)payload, "GET /"); + strcat((char *)payload, (const char *)get_ntrip_client_mount_point()); + strcat((char *)payload, " HTTP/1.1\r\n"); + strcat((char *)payload, "User-Agent: NTRIP Aceinna/0.1\r\n"); + + strcat((char *)payload, "Ntrip-Sn:"); + sprintf((char *)temp, "%ld", GetUnitSerialNum()); + strcat((char *)payload, (const char *)temp); + strcat((char *)payload, "\r\n"); + + strcat((char *)payload, "Ntrip-Pn:"); + strcpy((char *)temp, (const char *)platformBuildInfo()); + for (uint8_t i = 0; i < strlen((const char*)temp); i++) + { + if (temp[i] == ' ') + { + temp[i] = 0; + break; + } + } + strcat((char *)payload, (const char *)temp); + strcat((char *)payload, "\r\n"); + + strcat((char *)payload, "Authorization: Basic "); + + uint8_t key[100]; + uint8_t base64_buf[128]; + strcpy((char *)key, (const char *)get_ntrip_client_username()); + strcat((char *)key, ":"); + strcat((char *)key, (const char *)get_ntrip_client_password()); + base64_encode(key, base64_buf); + + strcat((char *)payload, (const char *)base64_buf); + strcat((char *)payload, "\r\n\r\n"); + + *payloadLen = strlen((const char *)payload); +} + +/** *************************************************************************** + * @name ntrip_read_data() + * @brief ntrip client revieve function + * @param *rxBuf point to ntrip client recieve buffer + * *rxLen point to buffer length + * @retval success(ERR_OK) fail(other) + ******************************************************************************/ +err_t ntrip_read_data(uint8_t *rxBuf, uint16_t *rxLen) +{ + struct netbuf *rxNetbuf; + uint16_t len = 0; + struct pbuf *q; + err_t err; + + err = netconn_recv(Ntrip_client, &rxNetbuf); + if (err == ERR_OK) + { + taskENTER_CRITICAL(); + for (q = rxNetbuf->p; q != NULL; q = q->next) + { + if (q->len > (NTRIP_RX_BUFSIZE - len)) + memcpy(rxBuf + len, q->payload, (NTRIP_RX_BUFSIZE - len)); + else + memcpy(rxBuf + len, q->payload, q->len); + len += q->len; + if (len > NTRIP_RX_BUFSIZE) + break; + } + *rxLen = len; + taskEXIT_CRITICAL(); + } + netbuf_delete(rxNetbuf); + + if (ERR_IS_FATAL(err)) + { +#ifdef DEVICE_DEBUG + printf("ntrip_read_data fail %d\r\n", err); +#endif + NTRIP_client_state = NTRIP_STATE_CONNECT; + } + + return err; +} + +/** *************************************************************************** + * @name ntrip_push_rx_data() + * @brief ntrip client revieve data and push to rx fifo + * @param *fifo point to rx fifo + * @retval success(ERR_OK) fail(other) + ******************************************************************************/ +err_t ntrip_push_rx_data(fifo_type* fifo) +{ + struct netbuf *rxNetbuf; + struct pbuf *q; + err_t err; + uint16_t len = 0; + + err = netconn_recv(Ntrip_client, &rxNetbuf); + if (err == ERR_OK) + { + taskENTER_CRITICAL(); + for (q = rxNetbuf->p; q != NULL; q = q->next) + { + fifo_push(fifo, q->payload, q->len); + len += q->len; + } + taskEXIT_CRITICAL(); + //printf("ntrip_push_rx_data=%d\r\n", len); + } + netbuf_delete(rxNetbuf); + + if (ERR_IS_FATAL(err)) + { +#ifdef DEVICE_DEBUG + printf("ntrip_push_rx_data fail %d\r\n", err); +#endif + NTRIP_client_state = NTRIP_STATE_CONNECT; + } + + return err; +} + +/** *************************************************************************** + * @name ntrip_write_data + * @brief ntrip client write function + * @param *txBuf point to ntrip client send buffer + * [in] txLen buffer length + * [in] apiflags write flag + * @retval success(ERR_OK) fail(other) + ******************************************************************************/ +err_t ntrip_write_data(uint8_t *txBuf, uint16_t txLen, uint8_t apiflags) +{ + err_t err; + + err = netconn_write(Ntrip_client, txBuf, txLen, apiflags); + if (ERR_IS_FATAL(err)) + { +#ifdef DEVICE_DEBUG + printf("ntrip_write_data fail %d\r\n", err); +#endif + if (NTRIP_client_state == NTRIP_STATE_REQUEST || NTRIP_client_state == NTRIP_STATE_INTERACTIVE) + { + NTRIP_client_state = NTRIP_STATE_CONNECT; + } + } + + return err; +} + +/** *************************************************************************** + * @name ntrip_push_tx_data + * @brief push data to tx fifo + * @param *buf point to send data buffer + * len send length + * @retval success(1) fail(0) + ******************************************************************************/ +uint8_t ntrip_push_tx_data(uint8_t* buf, uint16_t len) +{ + if (is_ntrip_interactive()) + { + fifo_push(&ntrip_tx_fifo, (uint8_t*)buf, len); + return 1; + } + return 0; +} + +/** *************************************************************************** + * @name ntrip_link_down + * @brief link down ntrip client + * @param + * @retval + ******************************************************************************/ +void ntrip_link_down(void) +{ + if (NTRIP_client_state >= NTRIP_STATE_CONNECT && NTRIP_client_state <= NTRIP_STATE_INTERACTIVE) + { + NTRIP_client_state = NTRIP_STATE_LINK_DOWN; + } +} + +/** *************************************************************************** + * @name is_ntrip_interactive + * @brief get ntrip state + * @param + * @retval true: is connected false: others + ******************************************************************************/ +uint8_t is_ntrip_interactive(void) +{ + return (NTRIP_client_state == NTRIP_STATE_INTERACTIVE); +} + +/** *************************************************************************** + * @name add_ntrip_stream_count + * @brief add count + * @param + * @retval + ******************************************************************************/ +void add_ntrip_stream_count(void) +{ + ntripStreamCount++; +} + +/** *************************************************************************** + * @name clear_ntrip_stream_count + * @brief reset count + * @param + * @retval + ******************************************************************************/ +void clear_ntrip_stream_count(void) +{ + ntripStreamCount = 0; +} + +/** *************************************************************************** + * @name is_ntrip_stream_available + * @brief get ntrip stream state + * @param + * @retval true: available false: unavailable + ******************************************************************************/ +uint8_t is_ntrip_stream_available(void) +{ + return (ntripStreamCount < NTRIP_STREAM_CONNECTED_MAX_COUNT); +} + +/** *************************************************************************** + * @name NTRIP_interface + * @brief ntrip client interface + * @param N/A + * @retval N/A + ******************************************************************************/ +void NTRIP_interface(void) +{ + static ip_addr_t server_ipaddr; + static uint8_t txBuf[512]; + static uint8_t write_fail = 0; + uint16_t txLen = 0; + err_t err; + + if (is_eth_link_down()) + { + ntrip_link_down(); + } + + switch (NTRIP_client_state) + { + case NTRIP_STATE_CONNECT: +#ifdef DEVICE_DEBUG + printf("ntrip:connect...\r\n"); +#endif + +#ifdef DEVICE_DEBUG + printf("ntrip:reset start...\r\n"); +#endif + if (Ntrip_client != NULL) + { + netconn_close(Ntrip_client); + osDelay(100); + netconn_delete(Ntrip_client); + Ntrip_client = NULL; + } +#ifdef DEVICE_DEBUG + printf("ntrip:reset over!\r\n"); +#endif + + OS_Delay(50); + Ntrip_client = netconn_new(NETCONN_TCP); + + err = ipaddr_aton((const char*)get_ntrip_client_ip(), &server_ipaddr); + if (!err) + { + for (uint8_t i = 0; i < 5; i++) + { + err = dns_get_ip_by_hostname((uint8_t*)get_ntrip_client_ip(), &server_ipaddr); + if (err) + { + break; + } + else + { + OS_Delay(3000); + } + } + } + + if (err) + { +#ifdef DEVICE_DEBUG + printf("ntrip:server ip %s\r\n", ip_ntoa(&server_ipaddr)); +#endif + err = netconn_connect(Ntrip_client, &server_ipaddr, get_ntrip_client_port()); + if (err == ERR_OK) + { + Ntrip_client->recv_timeout = 10; + Ntrip_client->send_timeout = 100; + + NTRIP_client_state = NTRIP_STATE_REQUEST; +#ifdef DEVICE_DEBUG + printf("ntrip:connect success!\r\n"); +#endif + } + else + { +#ifdef DEVICE_DEBUG + printf("ntrip:connect err {%d}\r\n", err); +#endif + } + } + break; + + case NTRIP_STATE_REQUEST: +#ifdef DEVICE_DEBUG + printf("ntrip:request...\r\n"); +#endif + OS_Delay(100); + fill_localrtk_request_payload(txBuf, &txLen); + + err = ntrip_write_data(txBuf, txLen, NETCONN_COPY); + if (err == ERR_OK) + { + OS_Delay(1000); + uint16_t rxLen = 0; + err = ntrip_read_data(ntripRxBuf, &rxLen); + if (err == ERR_OK) + { + ntripRxBuf[rxLen] = 0; + if (rxLen && strstr((char *)ntripRxBuf, "ICY 200 OK") != NULL) + { +#ifdef DEVICE_DEBUG + printf("ntrip:ICY 200 OK\r\n"); +#endif + NTRIP_client_state = NTRIP_STATE_INTERACTIVE; + write_fail = 0; + OS_Delay(100); + } + } + } + break; + + case NTRIP_STATE_INTERACTIVE: + err = ntrip_push_rx_data(&ntrip_rx_fifo); + //printf("rx err=%d\r\n",err); + txLen = fifo_get(&ntrip_tx_fifo, txBuf, 512); + if (txLen) + { + err = ntrip_write_data(txBuf, txLen, NETCONN_NOFLAG); + if (err != 0) { +#ifdef DEVICE_DEBUG + printf("ntrip:tx err {%d}\r\n", err); +#endif + write_fail++; + if (write_fail >= 3) + { + NTRIP_client_state = NTRIP_STATE_OFF; + } + } + } + break; + + case NTRIP_STATE_LINK_DOWN: +#ifdef DEVICE_DEBUG + printf("ntrip:link down start...\r\n"); +#endif + if (Ntrip_client != NULL) + { + netconn_close(Ntrip_client); + osDelay(100); + netconn_delete(Ntrip_client); + Ntrip_client = NULL; + } +#ifdef DEVICE_DEBUG + printf("ntrip:link down over!\r\n"); +#endif + NTRIP_client_state = NTRIP_STATE_OFF; + break; + + case NTRIP_STATE_OFF: + if (!is_eth_link_down()) + { + if (get_eth_mode() == ETHMODE_DHCP) + { + if (is_dhcp_address_assigned()) + { + NTRIP_client_state = NTRIP_STATE_CONNECT; + } + } + else if (get_eth_mode() == ETHMODE_STATIC) + { + NTRIP_client_state = NTRIP_STATE_CONNECT; + } + } + + OS_Delay(20); + break; + + default: + OS_Delay(100); + break; + } +} + +#endif diff --git a/LWIP/lwip_app/user/inc/lwip_comm.h b/LWIP/lwip_app/user/inc/lwip_comm.h index eedd781..25a889b 100644 --- a/LWIP/lwip_app/user/inc/lwip_comm.h +++ b/LWIP/lwip_app/user/inc/lwip_comm.h @@ -1,29 +1,61 @@ #ifndef _LWIP_COMM_H #define _LWIP_COMM_H +#ifndef BASE_STATION + #include #include "lwipopts.h" #include "lwip/ip_addr.h" #include "user_config.h" -/*Static IP ADDRESS*/ -#define IP_ADDR0 (uint8_t) gUserConfiguration.staticIp[0] -#define IP_ADDR1 (uint8_t) gUserConfiguration.staticIp[1] -#define IP_ADDR2 (uint8_t) gUserConfiguration.staticIp[2] -#define IP_ADDR3 (uint8_t) gUserConfiguration.staticIp[3] +#define ETH_LINK_DOWN 0 +#define ETH_LINK_UP 1 + +#define MAX_DHCP_TRIES 5 + +typedef enum +{ + DHCP_STATE_OFF = 0, + DHCP_STATE_START = 1, + DHCP_STATE_WAIT_ADDRESS = 2, + DHCP_STATE_ADDRESS_ASSIGNED = 3, + DHCP_STATE_TIMEOUT = 4, + DHCP_STATE_LINK_DOWN = 5 +} dhcp_state_enum_t; + +extern struct netif gnetif; +extern uint8_t eth_link_state; +extern uint8_t eth_dhcp_state; -/*NETMASK*/ -#define NETMASK_ADDR0 (uint8_t) gUserConfiguration.netmask[0] -#define NETMASK_ADDR1 (uint8_t) gUserConfiguration.netmask[1] -#define NETMASK_ADDR2 (uint8_t) gUserConfiguration.netmask[2] -#define NETMASK_ADDR3 (uint8_t) gUserConfiguration.netmask[3] +void ethernet_init(void); -/*Gateway Address*/ -#define GW_ADDR0 (uint8_t) gUserConfiguration.gateway[0] -#define GW_ADDR1 (uint8_t) gUserConfiguration.gateway[1] -#define GW_ADDR2 (uint8_t) gUserConfiguration.gateway[2] -#define GW_ADDR3 (uint8_t) gUserConfiguration.gateway[3] +uint8_t dhcp_supplied_address(const struct netif *netif); +void user_notification(struct netif *netif); +void ethernetif_notify_conn_changed(struct netif *netif); + +void set_eth_link_up(void); +void set_eth_link_down(void); +uint8_t is_eth_link_down(void); + +void netif_ethernet_config_changed(void); +void netif_ntrip_config_changed(void); +void netif_set_static_ip(struct netif *netif); +void dhcp_link_down(void); +uint8_t is_dhcp_address_assigned(void); + +void dhcp_thread(void const *argument); +uint8_t dns_get_ip_by_hostname(uint8_t *hostname, ip_addr_t* addr); + + +#else // BASE_STATION + + +#include +#include "lwipopts.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "user_config.h" #define ETH_LINK_DOWN 0 #define ETH_LINK_UP 1 @@ -55,13 +87,21 @@ void set_eth_link_down(void); uint8_t is_eth_link_down(void); void netif_ethernet_config_changed(void); -void netif_ntrip_config_changed(void); +void netif_station_tcp_config_changed(void); void netif_set_static_ip(struct netif *netif); void dhcp_link_down(void); uint8_t is_dhcp_address_assigned(void); +uint8_t* get_netif_ip(void); +uint8_t* get_netif_netmask(void); +uint8_t* get_netif_gateway(void); + void dhcp_thread(void const *argument); -uint8_t dns_get_ip_by_hostname(uint8_t *hostname, ip_addr_t* addr); + +err_t get_ip_by_host(const char *host, ip_addr_t *ip); + + +#endif #endif diff --git a/LWIP/lwip_app/user/inc/lwipopts.h b/LWIP/lwip_app/user/inc/lwipopts.h index 7be4574..ee056f0 100644 --- a/LWIP/lwip_app/user/inc/lwipopts.h +++ b/LWIP/lwip_app/user/inc/lwipopts.h @@ -1,6 +1,8 @@ #ifndef __LWIPOPTS_H__ #define __LWIPOPTS_H__ +#ifndef BASE_STATION + #define NO_SYS 0 #define SYS_LIGHTWEIGHT_PROT 1 @@ -120,4 +122,143 @@ */ //#define LWIP_DEBUG + +#else // BASE_STATION + + +#define NO_SYS 0 + +#define SYS_LIGHTWEIGHT_PROT 1 + +/* ---------- TCP ---------- */ +#define LWIP_TCP 1 +#define TCP_TTL 255 + +#define TCP_QUEUE_OOSEQ 1 + +#define TCP_MSS (1500 - 40) +#define TCP_SND_BUF (4*TCP_MSS) +#define TCP_SND_QUEUELEN (2*TCP_SND_BUF/TCP_MSS) +#define TCP_WND (2*TCP_MSS) + +/* ---------- Memory options ---------- */ +#define MEM_ALIGNMENT 4 +#define MEM_SIZE (20*1024) +#define MEMP_NUM_PBUF 20 +#define MEMP_NUM_RAW_PCB 4 +#define MEMP_NUM_UDP_PCB 4 +#define MEMP_NUM_TCP_PCB (TCP_WND + TCP_SND_BUF)/TCP_MSS +#define MEMP_NUM_TCP_PCB_LISTEN 1 +#define MEMP_NUM_TCP_SEG 20 +#define MEMP_NUM_SYS_TIMEOUT 8 +#define MEMP_NUM_NETBUF 10 +#define MEMP_NUM_NETCONN 10 + +/* ---------- Pbuf ---------- */ +#define PBUF_POOL_SIZE 20 +#define PBUF_POOL_BUFSIZE 512 + + +/* ---------- ICMP ---------- */ +#define LWIP_ICMP 1 + +/* ---------- DNS ----------- */ +#define LWIP_DNS 1 + +/* ---------- DHCP ---------- */ +#define LWIP_DHCP 1 +#define LWIP_NETIF_HOSTNAME 1 + +/* ---------- UDP ----------- */ +#define LWIP_UDP 1 +#define UDP_TTL 255 +#define LWIP_UDPLITE 1 + +/* ---------- Statistics options ---------- */ +#define LWIP_STATS 0 +#define LWIP_PROVIDE_ERRNO 1 + +/* ---------- link callback options ---------- */ +#define LWIP_NETIF_LINK_CALLBACK 1 + +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ +#define CHECKSUM_BY_HARDWARE + +#ifdef CHECKSUM_BY_HARDWARE +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 +#define CHECKSUM_GEN_ICMP 0 +#else +#define CHECKSUM_GEN_IP 1 +#define CHECKSUM_GEN_UDP 1 +#define CHECKSUM_GEN_TCP 1 +#define CHECKSUM_CHECK_IP 1 +#define CHECKSUM_CHECK_UDP 1 +#define CHECKSUM_CHECK_TCP 1 +#define CHECKSUM_GEN_ICMP 1 +#endif + +/* + ------------------------------------------- + ---------- SequentialAPI---------- + ------------------------------------------- +*/ +#define LWIP_NETCONN 1 + +/* + ---------------------------------- + ---------- Socket API---------- + ---------------------------------- +*/ +#define LWIP_SOCKET 1 + +/* + ---------------------------------- + -------- RCV/SND Time Out -------- + ---------------------------------- +*/ +#define LWIP_SO_RCVTIMEO 1 +#define LWIP_SO_SNDTIMEO 1 + +#define LWIP_TCP_KEEPALIVE 1 +#define TCP_KEEPIDLE_DEFAULT 5000UL +#define TCP_KEEPINTVL_DEFAULT 1000UL +#define TCP_KEEPCNT_DEFAULT 5UL + +/* + --------------------------------- + ---------- OS options ---------- + --------------------------------- +*/ +#define TCPIP_THREAD_NAME "TCP/IP" +#define TCPIP_THREAD_STACKSIZE 3*1024 +#define TCPIP_MBOX_SIZE 20 +#define DEFAULT_UDP_RECVMBOX_SIZE 20 +#define DEFAULT_TCP_RECVMBOX_SIZE 20 +#define DEFAULT_ACCEPTMBOX_SIZE 20 +#define DEFAULT_THREAD_STACKSIZE 1024 +#define TCPIP_THREAD_PRIO osPriorityAboveNormal + +#define TASK_DHCP_STACK 1024 + +/* + -------------------------------------- + ---------- Lwip DEBUG---------- + -------------------------------------- +*/ +//#define LWIP_DEBUG + +#endif + +#define TASK_USERTCP_STACK 3*1024 + + #endif /* __LWIPOPTS_H__ */ diff --git a/LWIP/lwip_app/user/inc/netbios.h b/LWIP/lwip_app/user/inc/netbios.h index 7d6c684..6a626e9 100644 --- a/LWIP/lwip_app/user/inc/netbios.h +++ b/LWIP/lwip_app/user/inc/netbios.h @@ -5,4 +5,6 @@ void netbios_init(void); #define NETBIOS_LWIP_NAME "OPENRTK" +// #define USER_SN_WEB_NAME + #endif /* __NETBIOS_H__ */ diff --git a/LWIP/lwip_app/user/inc/netconn.h b/LWIP/lwip_app/user/inc/netconn.h new file mode 100644 index 0000000..b17c2f1 --- /dev/null +++ b/LWIP/lwip_app/user/inc/netconn.h @@ -0,0 +1,38 @@ +#ifdef BASE_STATION + +#ifndef _NETCONN_H_ +#define _NETCONN_H_ + +#include +#include "lwip/err.h" +#include "lwip/api.h" +#include "lwip/opt.h" +#include "lwip_comm.h" +#include "lwip/sys.h" +#include "lwip/api.h" +#include "utils.h" + +// netconn client state +typedef enum +{ + NETCONN_STATE_OFF = 0, + NETCONN_STATE_CONNECT = 1, + NETCONN_STATE_REQUEST = 2, + NETCONN_STATE_INTERACTIVE = 3, + NETCONN_STATE_TIMEOUT = 4, + NETCONN_STATE_LINK_DOWN = 5 +} NETCONN_STATE; + +err_t netconn_read(struct netconn *conn, uint8_t *buf, uint16_t *len, uint16_t max_length); +err_t netconn_push_rx_data(struct netconn *conn, fifo_type *rx_fifo); + +uint8_t netconn_push_tx_data(NETCONN_STATE *state, fifo_type *tx_fifo, uint8_t *buf, uint16_t len); +uint16_t netconn_get_rx_data(NETCONN_STATE *state, fifo_type *rx_fifo, uint8_t *buf, uint16_t len); + +void netconn_check_ret(err_t err, NETCONN_STATE *state); +void netconn_link_down(NETCONN_STATE *state); +uint8_t netconn_is_interactive(NETCONN_STATE *state); + +#endif /* _TCP_NETCONN_H_ */ + +#endif diff --git a/LWIP/lwip_app/user/src/lwip_comm.c b/LWIP/lwip_app/user/src/lwip_comm.c index 56af7b3..ee26843 100644 --- a/LWIP/lwip_app/user/src/lwip_comm.c +++ b/LWIP/lwip_app/user/src/lwip_comm.c @@ -1,3 +1,5 @@ +#ifndef BASE_STATION + #include "lwip_comm.h" #include "netif/etharp.h" #include "lwip/dhcp.h" @@ -17,7 +19,7 @@ #include #include "httpd.h" #include "netbios.h" -#include "ntrip_client.h" +#include "m_ntrip_client.h" #include "user_config.h" #include "cmsis_os.h" @@ -108,7 +110,7 @@ void user_notification(struct netif *netif) { set_eth_link_up(); - if (gUserConfiguration.ethMode == ETHMODE_STATIC) + if (get_eth_mode() == ETHMODE_STATIC) { netif_set_static_ip(netif); } @@ -131,7 +133,7 @@ void ethernetif_notify_conn_changed(struct netif *netif) { set_eth_link_up(); - if (gUserConfiguration.ethMode == ETHMODE_STATIC) + if (get_eth_mode() == ETHMODE_STATIC) { netif_set_static_ip(netif); } @@ -183,7 +185,7 @@ void netif_ethernet_config_changed(void) // close connected ntrip ntrip_link_down(); - if (gUserConfiguration.ethMode == ETHMODE_STATIC) + if (get_eth_mode() == ETHMODE_STATIC) { netif_set_static_ip(&gnetif); } @@ -213,22 +215,25 @@ void netif_ntrip_config_changed(void) ******************************************************************************/ void netif_set_static_ip(struct netif *netif) { - ip_addr_t ipaddr; - ip_addr_t netmask; - ip_addr_t gw; + ip_addr_t ip, netmask, gateway; + uint8_t *ip_ary, *netmask_ary, *gateway_ary; - IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); - IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3); - IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); + ip_ary = get_static_ip(); + netmask_ary = get_static_netmask(); + gateway_ary = get_static_gateway(); -#ifdef DEVICE_DEBUG + IP4_ADDR(&ip, ip_ary[0], ip_ary[1], ip_ary[2], ip_ary[3]); + IP4_ADDR(&netmask, netmask_ary[0], netmask_ary[1], netmask_ary[2], netmask_ary[3]); + IP4_ADDR(&gateway, gateway_ary[0], gateway_ary[1], gateway_ary[2], gateway_ary[3]); + +#ifdef STATION_TCP_DEBUG printf("Use static ip:\r\n"); - printf("static ip:%d.%d.%d.%d\r\n", IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); - printf("netmask:%d.%d.%d.%d\r\n", NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3); - printf("gateway:%d.%d.%d.%d\r\n", GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); + printf("static ip:%d.%d.%d.%d\r\n", ip_ary[0], ip_ary[1], ip_ary[2], ip_ary[3]); + printf("netmask:%d.%d.%d.%d\r\n", netmask_ary[0], netmask_ary[1], netmask_ary[2], netmask_ary[3]); + printf("gateway:%d.%d.%d.%d\r\n", gateway_ary[0], gateway_ary[1], gateway_ary[2], gateway_ary[3]); #endif - netif_set_addr(netif, &ipaddr, &netmask, &gw); + netif_set_addr(netif, &ip, &netmask, &gateway); } /** *************************************************************************** @@ -268,7 +273,7 @@ void dhcp_thread(void const *argument) for (;;) { - if (gUserConfiguration.ethMode != ETHMODE_DHCP || is_eth_link_down()) + if (get_eth_mode() != ETHMODE_DHCP || is_eth_link_down()) { dhcp_link_down(); } @@ -345,7 +350,7 @@ void dhcp_thread(void const *argument) case DHCP_STATE_OFF: { - if (gUserConfiguration.ethMode == ETHMODE_DHCP && !is_eth_link_down()) + if (get_eth_mode() == ETHMODE_DHCP && !is_eth_link_down()) { eth_dhcp_state = DHCP_STATE_START; } @@ -393,3 +398,441 @@ uint8_t dns_get_ip_by_hostname(uint8_t *hostname, ip_addr_t* addr) } } + +#else // BASE_STATION + + +#include "lwip_comm.h" +#include "netif/etharp.h" +#include "lwip/dhcp.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/init.h" +#include "lwip/timers.h" +#include "lwip/tcp_impl.h" +#include "lwip/ip_frag.h" +#include "lwip/tcpip.h" +#include "lwip/timers.h" +#include "lwip/dns.h" +#include "ethernetif.h" +#include "stm32f4xx_hal.h" +#include "osapi.h" +#include +#include +#include "httpd.h" +#include "netbios.h" +#include "user_config.h" +#include "cmsis_os.h" +#include "station_tcp.h" + +/* network interface structure */ +struct netif gnetif; +uint8_t eth_link_state = ETH_LINK_DOWN; +uint8_t eth_dhcp_state = DHCP_STATE_OFF; + +/** *************************************************************************** + * @name Netif_Config + * @brief Initializes the lwIP stack + * @param N/A + * @retval N/A + ******************************************************************************/ +static void Netif_Config(void) +{ + ip_addr_t ipaddr; + ip_addr_t netmask; + ip_addr_t gw; + + ip_addr_set_zero(&ipaddr); + ip_addr_set_zero(&netmask); + ip_addr_set_zero(&gw); + + netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input); + + netif_set_default(&gnetif); + + if (netif_is_link_up(&gnetif)) { + netif_set_up(&gnetif); + } else { + netif_set_down(&gnetif); + } + + netif_set_link_callback(&gnetif, ethernetif_update_config); +} + +/** *************************************************************************** + * @name ethernet_init + * @brief init the lwip stack and the ethernet on the board + * @param N/A + * @retval N/A + ******************************************************************************/ +void ethernet_init(void) +{ + tcpip_init(NULL, NULL); + + Netif_Config(); + + netbios_init(); + + /* Initialize webserver */ + httpd_init(); + + user_notification(&gnetif); + + /* Start DHCPClient */ + osThreadDef(DHCP, dhcp_thread, osPriorityLow, 0, TASK_DHCP_STACK); + osThreadCreate(osThread(DHCP), &gnetif); +} + +/** *************************************************************************** + * @name dhcp_supplied_address + * @brief check if DHCP supplied netif->ip_addr + * @param netif : the netif to check + * @retval 1 if DHCP supplied netif->ip_addr (states BOUND or RENEWING), + * 0 otherwise + ******************************************************************************/ +uint8_t dhcp_supplied_address(const struct netif *netif) +{ + if ((netif != NULL) && (netif->dhcp != NULL)) { + struct dhcp* dhcp = netif->dhcp; + return (dhcp->state == DHCP_BOUND) || (dhcp->state == DHCP_RENEWING) || + (dhcp->state == DHCP_REBINDING); + } + return 0; +} + +/** *************************************************************************** + * @name user_notification + * @brief Notify the User about the nework interface config status. + * @param [in] netif : the lwip network interface structure for this ethernetif + * @retval N/A + ******************************************************************************/ +void user_notification(struct netif *netif) +{ + if (netif_is_up(netif)) + { + set_eth_link_up(); + + if (get_eth_mode() == ETHMODE_STATIC) + { + netif_set_static_ip(netif); + } + } + else + { + set_eth_link_down(); + } +} + +/** *************************************************************************** + * @name ethernetif_notify_conn_changed + * @brief This function notify user about link status changement. + * @param [in] netif : the lwip network interface structure for this ethernetif + * @retval N/A + ******************************************************************************/ +void ethernetif_notify_conn_changed(struct netif *netif) +{ + if (netif_is_link_up(netif)) + { + set_eth_link_up(); + + if (get_eth_mode() == ETHMODE_STATIC) + { + netif_set_static_ip(netif); + } + + netif_set_up(netif); + } + else + { +#ifdef STATION_TCP_DEBUG + printf("ETH link down\r\n"); +#endif + set_eth_link_down(); + + netif_set_down(netif); + } +} + +/** *************************************************************************** + * @name set_eth_link_up / set_eth_link_down / is_eth_link_down + * @brief link state + * @param N/A + * @retval + ******************************************************************************/ +void set_eth_link_up(void) +{ + eth_link_state = ETH_LINK_UP; +} + +void set_eth_link_down(void) +{ + eth_link_state = ETH_LINK_DOWN; +} + +uint8_t is_eth_link_down(void) +{ + return (eth_link_state == ETH_LINK_DOWN); +} + +/** *************************************************************************** + * @name netif_ethernet_config_changed + * @brief This function can only be called after changing the eth params + * @param N/A + * @retval N/A + ******************************************************************************/ +void netif_ethernet_config_changed(void) +{ + if (!is_eth_link_down()) + { + // close connected + station_tcp_stop(); + + if (get_eth_mode() == ETHMODE_STATIC) + { + netif_set_static_ip(&gnetif); + } + } +} + +/** *************************************************************************** + * @name netif_station_tcp_config_changed + * @brief This function can only be called after changing the ntrip params + * @param N/A + * @retval N/A + ******************************************************************************/ +void netif_station_tcp_config_changed(void) +{ + // close connected + station_tcp_stop(); +} + +/** *************************************************************************** + * @name netif_set_static_ip + * @brief set static ip + * @param argument: the lwip network interface structure + * @retval N/A + ******************************************************************************/ +void netif_set_static_ip(struct netif *netif) +{ + ip_addr_t ip, netmask, gateway; + uint8_t *ip_ary, *netmask_ary, *gateway_ary; + + ip_ary = get_static_ip(); + netmask_ary = get_static_netmask(); + gateway_ary = get_static_gateway(); + + IP4_ADDR(&ip, ip_ary[0], ip_ary[1], ip_ary[2], ip_ary[3]); + IP4_ADDR(&netmask, netmask_ary[0], netmask_ary[1], netmask_ary[2], netmask_ary[3]); + IP4_ADDR(&gateway, gateway_ary[0], gateway_ary[1], gateway_ary[2], gateway_ary[3]); + +#ifdef STATION_TCP_DEBUG + printf("Use static ip:\r\n"); + printf("static ip:%d.%d.%d.%d\r\n", ip_ary[0], ip_ary[1], ip_ary[2], ip_ary[3]); + printf("netmask:%d.%d.%d.%d\r\n", netmask_ary[0], netmask_ary[1], netmask_ary[2], netmask_ary[3]); + printf("gateway:%d.%d.%d.%d\r\n", gateway_ary[0], gateway_ary[1], gateway_ary[2], gateway_ary[3]); +#endif + + netif_set_addr(netif, &ip, &netmask, &gateway); +} + +/** *************************************************************************** + * @name dhcp_link_down + * @brief dhcp over + * @param argument: N/A + * @retval N/A + ******************************************************************************/ +void dhcp_link_down(void) +{ + if (eth_dhcp_state >= DHCP_STATE_START && eth_dhcp_state <= DHCP_STATE_ADDRESS_ASSIGNED) + { + eth_dhcp_state = DHCP_STATE_LINK_DOWN; + } +} + +/** *************************************************************************** + * @name is_dhcp_address_assigned + * @brief get dhcp state + * @param argument: N/A + * @retval true: dhcp has success false: other + ******************************************************************************/ +uint8_t is_dhcp_address_assigned(void) +{ + return (eth_dhcp_state == DHCP_STATE_ADDRESS_ASSIGNED); +} + +uint8_t* get_netif_ip(void) +{ + if (get_eth_mode() == ETHMODE_DHCP) { + return (uint8_t*)&gnetif.ip_addr; + } else { // ETHMODE_STATIC + return get_static_ip(); + } +} + +uint8_t* get_netif_netmask(void) +{ + if (get_eth_mode() == ETHMODE_DHCP) { + return (uint8_t*)&gnetif.netmask; + } else { // ETHMODE_STATIC + return get_static_netmask(); + } +} + +uint8_t* get_netif_gateway(void) +{ + if (get_eth_mode() == ETHMODE_DHCP) { + return (uint8_t*)&gnetif.gw; + } else { // ETHMODE_STATIC + return get_static_gateway(); + } +} + + +/** *************************************************************************** + * @name dhcp_thread + * @brief DHCP Process + * @param argument: the lwip network interface structure + * @retval N/A + ******************************************************************************/ +void dhcp_thread(void const *argument) +{ + struct netif *netif = (struct netif *)argument; + + for (;;) + { + if (get_eth_mode() != ETHMODE_DHCP || is_eth_link_down()) + { + dhcp_link_down(); + } + + switch (eth_dhcp_state) + { + case DHCP_STATE_START: + { +#ifdef STATION_TCP_DEBUG + printf("DHCP start...\r\n"); +#endif + ip_addr_set_zero(&netif->ip_addr); + ip_addr_set_zero(&netif->netmask); + ip_addr_set_zero(&netif->gw); + dhcp_start(netif); + eth_dhcp_state = DHCP_STATE_WAIT_ADDRESS; + } + break; + + case DHCP_STATE_WAIT_ADDRESS: + { + if (dhcp_supplied_address(netif)) // dhcp ok + { + eth_dhcp_state = DHCP_STATE_ADDRESS_ASSIGNED; + + // printf("DHCP ok!\r\n"); + // printf("IP:%s\r\n", ipaddr_ntoa((const ip_addr_t *)&netif->ip_addr)); + // printf("netmask:%s\r\n", ipaddr_ntoa((const ip_addr_t *)&netif->netmask)); + // printf("gateway:%s\r\n", ipaddr_ntoa((const ip_addr_t *)&netif->gw)); +#ifdef STATION_TCP_DEBUG + printf("DHCP ok!\r\n"); + printf("IP:%s\r\n", ipaddr_ntoa((const ip_addr_t *)&netif->ip_addr)); + printf("netmask:%s\r\n", ipaddr_ntoa((const ip_addr_t *)&netif->netmask)); + printf("gateway:%s\r\n", ipaddr_ntoa((const ip_addr_t *)&netif->gw)); +#endif + } + else + { + /* DHCP timeout */ + if (netif->dhcp->tries > MAX_DHCP_TRIES) + { + eth_dhcp_state = DHCP_STATE_TIMEOUT; + + /* Stop DHCP */ + dhcp_stop(netif); + +#ifdef STATION_TCP_DEBUG + printf("DHCP timeout!\r\n"); +#endif + } + } + } + break; + + case DHCP_STATE_ADDRESS_ASSIGNED: + { + + } + break; + + case DHCP_STATE_TIMEOUT: + { + // process dhcp time out + eth_dhcp_state = DHCP_STATE_OFF; + } + break; + + case DHCP_STATE_LINK_DOWN: + { + /* Stop DHCP */ +#ifdef STATION_TCP_DEBUG + printf("DHCP link down!\r\n"); +#endif + dhcp_stop(netif); + eth_dhcp_state = DHCP_STATE_OFF; + } + break; + + case DHCP_STATE_OFF: + { + if (get_eth_mode() == ETHMODE_DHCP && !is_eth_link_down()) + { + eth_dhcp_state = DHCP_STATE_START; + } + } + break; + + default: + break; + } + + ethernetif_link_state_check(netif); + osDelay(250); + station_tcp_add_stream_timeout(); + } +} + +/** *************************************************************************** + * @name dns_get_callback + * @brief dns found, set the global server ip + * @param argument: the lwip network interface structure + * @retval N/A + ******************************************************************************/ +void dns_get_callback(const char *name, ip_addr_t *host_ip, void *callback_arg) +{ +#ifdef STATION_TCP_DEBUG + printf("hostname %s | ip %s\r\n", name, ip_ntoa(host_ip)); +#endif +} + +/** *************************************************************************** + * @name get_ip_by_host + * @brief dns found, set the global server ip + * @param argument: the lwip network interface structure + * @retval N/A + ******************************************************************************/ +err_t get_ip_by_host(const char *host, ip_addr_t *ip) +{ + err_t err = ERR_OK; + uint8_t i = 0; + + if (!ipaddr_aton(host, ip)) { + for (i = 0; i < 5; i++) { + err = dns_gethostbyname(host, ip, dns_get_callback, NULL); + if (!err) + break; + OS_Delay(3000); + } + } + + return err; +} + +#endif + diff --git a/LWIP/lwip_app/user/src/netbios.c b/LWIP/lwip_app/user/src/netbios.c index 820b9ea..184f5be 100644 --- a/LWIP/lwip_app/user/src/netbios.c +++ b/LWIP/lwip_app/user/src/netbios.c @@ -279,7 +279,7 @@ netbios_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, ip_addr_t *addr, u if (NETBIOS_STRCMP(netbios_name, gnetbios_name) == 0) { struct pbuf *q; struct netbios_resp *resp; - + set_server_ip(addr); q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_resp), PBUF_RAM); if (q != NULL) { resp = (struct netbios_resp*)q->payload; diff --git a/LWIP/lwip_app/user/src/netconn.c b/LWIP/lwip_app/user/src/netconn.c new file mode 100644 index 0000000..769e688 --- /dev/null +++ b/LWIP/lwip_app/user/src/netconn.c @@ -0,0 +1,149 @@ +#ifdef BASE_STATION + +#include "netconn.h" +#include "string.h" + +/** *************************************************************************** + * @name netconn_read + * @brief revieve function, copy rx data to rx_buf + * @param *netcon point to netconn handler + * *buf point to recieve buffer + * *len point to buffer length + * max_length is max buffer length + * @retval err_t + ******************************************************************************/ +err_t netconn_read(struct netconn *conn, uint8_t *buf, uint16_t *len, uint16_t max_length) +{ + struct netbuf *rx_netbuf; + uint16_t len_t = 0; + struct pbuf *q; + err_t err; + + *len = 0; + err = netconn_recv(conn, &rx_netbuf); + if (err == ERR_OK) + { + taskENTER_CRITICAL(); + for (q = rx_netbuf->p; q != NULL; q = q->next) + { + if (q->len > (max_length - len_t)) + memcpy(buf + len_t, q->payload, (max_length - len_t)); + else + memcpy(buf + len_t, q->payload, q->len); + len_t += q->len; + if (len_t > max_length) { + len_t -= q->len; + break; + } else if (len_t == max_length) { + break; + } + } + *len = len_t; + taskEXIT_CRITICAL(); + } + netbuf_delete(rx_netbuf); + + return err; +} + +/** *************************************************************************** + * @name netconn_push_rx_data() + * @brief revieve data and push to rx fifo + * @param *netcon point to netconn handler + * *rx_fifo point to rx fifo + * @retval success(ERR_OK) fail(other) + ******************************************************************************/ +err_t netconn_push_rx_data(struct netconn *conn, fifo_type *rx_fifo) +{ + struct netbuf *rx_netbuf; + struct pbuf *q; + err_t err; + uint16_t len = 0; + + err = netconn_recv(conn, &rx_netbuf); + if (err == ERR_OK) + { + taskENTER_CRITICAL(); + for (q = rx_netbuf->p; q != NULL; q = q->next) + { + fifo_push(rx_fifo, q->payload, q->len); + len += q->len; + } + taskEXIT_CRITICAL(); + } + netbuf_delete(rx_netbuf); + + return err; +} + +/** *************************************************************************** + * @name netconn_push_tx_data + * @brief push data to tx fifo + * @param *buf point to send data buffer + * len send length + * @retval success(1) fail(0) + ******************************************************************************/ +uint8_t netconn_push_tx_data(NETCONN_STATE *state, fifo_type *tx_fifo, uint8_t *buf, uint16_t len) +{ + if (netconn_is_interactive(state)) { + taskENTER_CRITICAL(); + fifo_push(tx_fifo, buf, len); + taskEXIT_CRITICAL(); + return 1; + } + return 0; +} + +/** *************************************************************************** + * @name netconn_get_rx_data + * @brief get data from rx fifo + * @param *buf point to rx data buffer + * len send length + * @retval success(1) fail(0) + ******************************************************************************/ +uint16_t netconn_get_rx_data(NETCONN_STATE *state, fifo_type *rx_fifo, uint8_t* buf, uint16_t len) +{ + if (netconn_is_interactive(state)) { + return fifo_get(rx_fifo, buf, len); + } + return 0; +} + +/** *************************************************************************** + * @name netconn_check_ret + * @brief + * @param + * @retval N/A + ******************************************************************************/ +void netconn_check_ret(err_t err, NETCONN_STATE *state) +{ + if (ERR_IS_FATAL(err)) { + netconn_link_down(state); + } +} + +/** *************************************************************************** + * @name netconn_link_down + * @brief link down netconn, just set state + * @param + * @retval + ******************************************************************************/ +void netconn_link_down(NETCONN_STATE *state) +{ + if (*state >= NETCONN_STATE_CONNECT && *state <= NETCONN_STATE_INTERACTIVE) { + *state = NETCONN_STATE_LINK_DOWN; + } +} + +/** *************************************************************************** + * @name netconn_is_interactive + * @brief get ntrip state + * @param + * @retval true: is connected false: others + ******************************************************************************/ +uint8_t netconn_is_interactive(NETCONN_STATE *state) +{ + return (*state == NETCONN_STATE_INTERACTIVE); +} + +#endif diff --git a/LWIP/lwip_app/webserver/inc/fsdata.h b/LWIP/lwip_app/webserver/inc/fsdata.h index 57f258e..3483208 100644 --- a/LWIP/lwip_app/webserver/inc/fsdata.h +++ b/LWIP/lwip_app/webserver/inc/fsdata.h @@ -1,6 +1,8 @@ #ifndef __FSDATA_H__ #define __FSDATA_H__ +#ifndef BASE_STATION + #include "fs.h" #include "lwip/def.h" #include "fsdatah.h" @@ -30,7 +32,7 @@ static const unsigned char data__css_style_css[] = { " (26 bytes) */ 0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, 0x78,0x74,0x2f,0x63,0x73,0x73,0x0d,0x0a,0x0d,0x0a, -/* raw file data (6384 bytes) */ +/* raw file data (6552 bytes) */ 0x40,0x69,0x6d,0x70,0x6f,0x72,0x74,0x20,0x75,0x72,0x6c,0x28,0x68,0x74,0x74,0x70, 0x3a,0x2f,0x2f,0x66,0x6f,0x6e,0x74,0x73,0x2e,0x67,0x6f,0x6f,0x67,0x6c,0x65,0x61, 0x70,0x69,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x63,0x73,0x73,0x3f,0x66,0x61,0x6d,0x69, @@ -217,8 +219,8 @@ static const unsigned char data__css_style_css[] = { 0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x20,0x6c,0x65,0x66,0x74,0x3b,0x0d,0x0a,0x09, 0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x35,0x30,0x25,0x3b,0x20,0x0d,0x0a,0x09,0x6d, 0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x20,0x61,0x75,0x74,0x6f,0x3b,0x0d,0x0a,0x09, -0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x35,0x30,0x30,0x70,0x78, -0x3b,0x0d,0x0a,0x09,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x35, +0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x37,0x30,0x30,0x70,0x78, +0x3b,0x0d,0x0a,0x09,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x37, 0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x66,0x67,0x74,0x69, 0x74,0x6c,0x65,0x20,0x7b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d, 0x69,0x6c,0x79,0x3a,0x56,0x65,0x72,0x64,0x61,0x6e,0x61,0x3b,0x0d,0x0a,0x09,0x63, @@ -237,200 +239,210 @@ static const unsigned char data__css_style_css[] = { 0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20, 0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d, 0x3a,0x32,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65, -0x6c,0x5f,0x65,0x74,0x68,0x20,0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61, -0x79,0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b, -0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x37,0x30,0x70,0x78,0x3b, -0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x45,0x45,0x45,0x45,0x45, -0x45,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20, -0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69, -0x6e,0x67,0x3a,0x20,0x35,0x70,0x78,0x20,0x30,0x20,0x30,0x20,0x30,0x3b,0x0d,0x0a, -0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x20, -0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x69,0x6e,0x6c, -0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64, -0x74,0x68,0x3a,0x20,0x31,0x35,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c, -0x6f,0x72,0x3a,0x20,0x23,0x45,0x45,0x45,0x45,0x45,0x45,0x3b,0x0d,0x0a,0x09,0x66, -0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38,0x70,0x78,0x3b,0x0d, -0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x35,0x70, -0x78,0x20,0x30,0x20,0x30,0x20,0x30,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6c,0x61, -0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x20,0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73, -0x70,0x6c,0x61,0x79,0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f, -0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x32,0x30,0x30, -0x70,0x78,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x45,0x45, -0x45,0x45,0x45,0x45,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a, -0x65,0x3a,0x20,0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61, -0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x35,0x70,0x78,0x20,0x30,0x20,0x30,0x20,0x30, -0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76, -0x69,0x63,0x65,0x20,0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a, +0x6c,0x5f,0x77,0x68,0x65,0x65,0x6c,0x74,0x69,0x63,0x6b,0x20,0x7b,0x0d,0x0a,0x09, +0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d, +0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20, +0x31,0x33,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20, +0x23,0x45,0x45,0x45,0x45,0x45,0x45,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d, +0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x35,0x70,0x78,0x20,0x30,0x20, +0x30,0x20,0x30,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f, +0x65,0x74,0x68,0x20,0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a, 0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a, -0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x38,0x30,0x70,0x78,0x3b,0x0d,0x0a, +0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x37,0x30,0x70,0x78,0x3b,0x0d,0x0a, 0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x45,0x45,0x45,0x45,0x45,0x45,0x3b, 0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38, 0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67, 0x3a,0x20,0x35,0x70,0x78,0x20,0x30,0x20,0x30,0x20,0x30,0x3b,0x0d,0x0a,0x7d,0x0d, -0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x0d,0x0a,0x7b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74, -0x68,0x3a,0x20,0x32,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x68,0x65,0x69,0x67, -0x68,0x74,0x3a,0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b, -0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x66,0x66,0x66,0x3b,0x0d,0x0a,0x09, -0x62,0x6f,0x78,0x2d,0x73,0x68,0x61,0x64,0x6f,0x77,0x3a,0x20,0x30,0x20,0x31,0x70, -0x78,0x20,0x34,0x70,0x78,0x20,0x72,0x67,0x62,0x61,0x28,0x30,0x2c,0x20,0x30,0x2c, -0x20,0x30,0x2c,0x20,0x30,0x2e,0x33,0x29,0x3b,0x0d,0x0a,0x09,0x70,0x6f,0x73,0x69, -0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x0d,0x0a,0x09,0x66,0x6c, -0x6f,0x61,0x74,0x3a,0x20,0x6c,0x65,0x66,0x74,0x3b,0x0d,0x0a,0x7d,0x20,0x20,0x20, -0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x20, -0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73, -0x69,0x7a,0x65,0x3a,0x20,0x32,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63, -0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x34,0x42,0x34,0x46,0x35,0x35, -0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f, -0x74,0x74,0x6f,0x6d,0x3a,0x20,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20, -0x23,0x33,0x35,0x33,0x41,0x34,0x30,0x3b,0x0d,0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a, -0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x74,0x69,0x74, -0x6c,0x65,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x63,0x6f, -0x6c,0x6f,0x72,0x3a,0x20,0x23,0x66,0x66,0x66,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09, -0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x35,0x70,0x78,0x3b,0x20,0x20, -0x20,0x0d,0x0a,0x09,0x74,0x65,0x78,0x74,0x2d,0x73,0x68,0x61,0x64,0x6f,0x77,0x3a, -0x20,0x30,0x20,0x31,0x70,0x78,0x20,0x30,0x20,0x72,0x67,0x62,0x61,0x28,0x30,0x2c, -0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2e,0x34,0x29,0x3b,0x20,0x20,0x20,0x0d, -0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a, -0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x6f,0x64,0x79,0x0d,0x0a,0x7b,0x0d,0x0a,0x09, -0x6c,0x69,0x73,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x20,0x6e,0x6f,0x6e,0x65, -0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69, -0x74,0x65,0x6d,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74, -0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x70, -0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x72,0x65,0x6c,0x61,0x74,0x69,0x76, -0x65,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, -0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d, -0x0a,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x30,0x70,0x78,0x20, -0x31,0x35,0x70,0x78,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x74,0x65,0x78,0x74,0x2d, -0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6e,0x6f,0x6e,0x65, -0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x36, -0x42,0x36,0x46,0x37,0x30,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70, -0x6c,0x61,0x79,0x3a,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x20,0x20,0x0d,0x0a, -0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20, -0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x46,0x30,0x46,0x30,0x46, -0x30,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f, -0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x3a,0x68,0x6f,0x76,0x65,0x72,0x0d, -0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75, -0x6e,0x64,0x3a,0x20,0x23,0x66,0x30,0x66,0x30,0x66,0x30,0x3b,0x20,0x20,0x20,0x0d, -0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, -0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x2e,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65, -0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b, -0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x36,0x45,0x37,0x35,0x37,0x46,0x3b, -0x20,0x20,0x20,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x66,0x66, -0x66,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62, -0x6f,0x74,0x74,0x6f,0x6d,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x34,0x42, -0x34,0x46,0x35,0x35,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x78,0x2d,0x73, -0x68,0x61,0x64,0x6f,0x77,0x3a,0x20,0x30,0x20,0x31,0x70,0x78,0x20,0x30,0x20,0x23, -0x37,0x41,0x38,0x32,0x38,0x44,0x20,0x69,0x6e,0x73,0x65,0x74,0x3b,0x20,0x20,0x20, -0x0d,0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74, -0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x2e,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76, -0x65,0x3a,0x61,0x66,0x74,0x65,0x72,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20, -0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x62,0x6c,0x6f,0x63, -0x6b,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, -0x3a,0x20,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x20,0x20,0x20,0x0d,0x0a, -0x09,0x74,0x6f,0x70,0x3a,0x20,0x35,0x30,0x25,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09, -0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x20,0x2d,0x36,0x70,0x78, -0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x74,0x6f, -0x70,0x3a,0x20,0x36,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61, -0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62, -0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x36,0x70, -0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61,0x6e,0x73,0x70,0x61,0x72, -0x65,0x6e,0x74,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72, -0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20,0x36,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64, -0x20,0x23,0x36,0x45,0x37,0x35,0x37,0x46,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x20, -0x20,0x20,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x3a,0x6c, -0x61,0x73,0x74,0x2d,0x63,0x68,0x69,0x6c,0x64,0x20,0x2e,0x6d,0x65,0x6e,0x75,0x5f, -0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d, -0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a, -0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x0d,0x0a, -0x23,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x20,0x0d,0x0a, -0x20,0x20,0x20,0x20,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x33, -0x32,0x70,0x78,0x3b,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68, -0x74,0x3a,0x34,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x23,0x73,0x61,0x76, -0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e, -0x0d,0x0a,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x74,0x2d,0x64,0x65, -0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a, -0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x32,0x66,0x34, -0x33,0x35,0x65,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x32, -0x66,0x32,0x66,0x32,0x3b,0x0d,0x0a,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a, -0x20,0x31,0x30,0x70,0x78,0x20,0x30,0x70,0x78,0x20,0x31,0x30,0x70,0x78,0x20,0x30, -0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x77,0x69,0x64,0x74,0x68,0x3a,0x20, -0x31,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69, -0x7a,0x65,0x3a,0x31,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d, -0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x20,0x27,0x52,0x61,0x6c,0x65,0x77,0x61,0x79, -0x27,0x2c,0x43,0x61,0x6d,0x62,0x72,0x69,0x61,0x2c,0x20,0x41,0x72,0x69,0x61,0x6c, -0x2c,0x20,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x0d,0x0a,0x09, -0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x62,0x6f,0x6c,0x64, -0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75, -0x73,0x3a,0x33,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a, -0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x09,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74, -0x2d,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c,0x6c,0x20, -0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d,0x0a,0x09, -0x2d,0x6d,0x6f,0x7a,0x2d,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a, -0x61,0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73, -0x3b,0x0d,0x0a,0x09,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61, -0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b, -0x0d,0x0a,0x7d,0x0d,0x0a,0x23,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f, -0x6e,0x20,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20, -0x7b,0x0d,0x0a,0x20,0x20,0x20,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64, -0x3a,0x23,0x33,0x38,0x35,0x66,0x39,0x65,0x3b,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x23, -0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x2e,0x62,0x75,0x74, -0x74,0x6f,0x6e,0x5f,0x72,0x69,0x67,0x68,0x74,0x0d,0x0a,0x7b,0x0d,0x0a,0x20,0x20, -0x20,0x20,0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f, -0x6e,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72, -0x6f,0x75,0x6e,0x64,0x3a,0x23,0x32,0x66,0x34,0x33,0x35,0x65,0x3b,0x0d,0x0a,0x09, -0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x32,0x66,0x32,0x66,0x32,0x3b,0x0d,0x0a, -0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x30,0x70,0x78,0x20,0x30, -0x70,0x78,0x20,0x31,0x30,0x70,0x78,0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20, -0x20,0x20,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x30,0x30,0x70,0x78,0x3b,0x0d, -0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x36,0x70,0x78, -0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a, -0x20,0x27,0x52,0x61,0x6c,0x65,0x77,0x61,0x79,0x27,0x2c,0x43,0x61,0x6d,0x62,0x72, -0x69,0x61,0x2c,0x20,0x41,0x72,0x69,0x61,0x6c,0x2c,0x20,0x73,0x61,0x6e,0x73,0x2d, -0x73,0x65,0x72,0x69,0x66,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65, -0x69,0x67,0x68,0x74,0x3a,0x62,0x6f,0x6c,0x64,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72, -0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x33,0x70,0x78,0x3b,0x0d, -0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x0d, -0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74, -0x3a,0x20,0x38,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x2d,0x77,0x65,0x62,0x6b,0x69, -0x74,0x2d,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c,0x6c, +0x0a,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x20,0x7b,0x0d, +0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e, +0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68, +0x3a,0x20,0x31,0x35,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72, +0x3a,0x20,0x23,0x45,0x45,0x45,0x45,0x45,0x45,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e, +0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x35,0x70,0x78,0x20, +0x30,0x20,0x30,0x20,0x30,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65, +0x6c,0x5f,0x75,0x73,0x65,0x72,0x20,0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c, +0x61,0x79,0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b, +0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x32,0x30,0x30,0x70,0x78, +0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x45,0x45,0x45,0x45, +0x45,0x45,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a, +0x20,0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64, +0x69,0x6e,0x67,0x3a,0x20,0x35,0x70,0x78,0x20,0x30,0x20,0x30,0x20,0x30,0x3b,0x0d, +0x0a,0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76,0x69,0x63, +0x65,0x20,0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x69, +0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x77, +0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x38,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x63, +0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x45,0x45,0x45,0x45,0x45,0x45,0x3b,0x0d,0x0a, +0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38,0x70,0x78, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20, +0x35,0x70,0x78,0x20,0x30,0x20,0x30,0x20,0x30,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e, +0x6d,0x65,0x6e,0x75,0x0d,0x0a,0x7b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a, +0x20,0x32,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x68,0x65,0x69,0x67,0x68,0x74, +0x3a,0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72, +0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x66,0x66,0x66,0x3b,0x0d,0x0a,0x09,0x62,0x6f, +0x78,0x2d,0x73,0x68,0x61,0x64,0x6f,0x77,0x3a,0x20,0x30,0x20,0x31,0x70,0x78,0x20, +0x34,0x70,0x78,0x20,0x72,0x67,0x62,0x61,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30, +0x2c,0x20,0x30,0x2e,0x33,0x29,0x3b,0x0d,0x0a,0x09,0x70,0x6f,0x73,0x69,0x74,0x69, +0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x0d,0x0a,0x09,0x66,0x6c,0x6f,0x61, +0x74,0x3a,0x20,0x6c,0x65,0x66,0x74,0x3b,0x0d,0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a, +0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x20,0x20,0x0d, +0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a, +0x65,0x3a,0x20,0x32,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67, +0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x34,0x42,0x34,0x46,0x35,0x35,0x3b,0x20, +0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74, +0x6f,0x6d,0x3a,0x20,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x33, +0x35,0x33,0x41,0x34,0x30,0x3b,0x0d,0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a,0x2e,0x6d, +0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x74,0x69,0x74,0x6c,0x65, +0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f, +0x72,0x3a,0x20,0x23,0x66,0x66,0x66,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x70,0x61, +0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x35,0x70,0x78,0x3b,0x20,0x20,0x20,0x0d, +0x0a,0x09,0x74,0x65,0x78,0x74,0x2d,0x73,0x68,0x61,0x64,0x6f,0x77,0x3a,0x20,0x30, +0x20,0x31,0x70,0x78,0x20,0x30,0x20,0x72,0x67,0x62,0x61,0x28,0x30,0x2c,0x20,0x30, +0x2c,0x20,0x30,0x2c,0x20,0x30,0x2e,0x34,0x29,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d, +0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x2e,0x6d, +0x65,0x6e,0x75,0x5f,0x62,0x6f,0x64,0x79,0x0d,0x0a,0x7b,0x0d,0x0a,0x09,0x6c,0x69, +0x73,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x20, +0x20,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, +0x6d,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73, +0x69,0x7a,0x65,0x3a,0x20,0x31,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x70,0x6f,0x73, +0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b, +0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f, +0x6c,0x69,0x6e,0x6b,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09, +0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x30,0x70,0x78,0x20,0x31,0x35, +0x70,0x78,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x74,0x65,0x78,0x74,0x2d,0x64,0x65, +0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x20, +0x20,0x20,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x36,0x42,0x36, +0x46,0x37,0x30,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61, +0x79,0x3a,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62, +0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x31,0x70, +0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x46,0x30,0x46,0x30,0x46,0x30,0x3b, +0x20,0x20,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74, +0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x3a,0x68,0x6f,0x76,0x65,0x72,0x0d,0x0a,0x7b, +0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64, +0x3a,0x20,0x23,0x66,0x30,0x66,0x30,0x66,0x30,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d, +0x20,0x20,0x20,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f, +0x6c,0x69,0x6e,0x6b,0x2e,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x20,0x20, +0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72, +0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x36,0x45,0x37,0x35,0x37,0x46,0x3b,0x20,0x20, +0x20,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x66,0x66,0x66,0x3b, +0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74, +0x74,0x6f,0x6d,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x34,0x42,0x34,0x46, +0x35,0x35,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x78,0x2d,0x73,0x68,0x61, +0x64,0x6f,0x77,0x3a,0x20,0x30,0x20,0x31,0x70,0x78,0x20,0x30,0x20,0x23,0x37,0x41, +0x38,0x32,0x38,0x44,0x20,0x69,0x6e,0x73,0x65,0x74,0x3b,0x20,0x20,0x20,0x0d,0x0a, +0x7d,0x20,0x20,0x20,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d, +0x5f,0x6c,0x69,0x6e,0x6b,0x2e,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x3a, +0x61,0x66,0x74,0x65,0x72,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a, +0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x3b, +0x20,0x20,0x20,0x0d,0x0a,0x09,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20, +0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x74, +0x6f,0x70,0x3a,0x20,0x35,0x30,0x25,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x6d,0x61, +0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x20,0x2d,0x36,0x70,0x78,0x3b,0x20, +0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x74,0x6f,0x70,0x3a, +0x20,0x36,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61,0x6e,0x73, +0x70,0x61,0x72,0x65,0x6e,0x74,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72, +0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x36,0x70,0x78,0x20, +0x73,0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e, +0x74,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x6c, +0x65,0x66,0x74,0x3a,0x20,0x36,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23, +0x36,0x45,0x37,0x35,0x37,0x46,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x20,0x20,0x20, +0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x3a,0x6c,0x61,0x73, +0x74,0x2d,0x63,0x68,0x69,0x6c,0x64,0x20,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74, +0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09, +0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x6e, +0x6f,0x6e,0x65,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x0d,0x0a,0x23,0x73, +0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x20,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x33,0x32,0x70, +0x78,0x3b,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3a, +0x34,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x23,0x73,0x61,0x76,0x65,0x5f, +0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x0d,0x0a, +0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f, +0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x09,0x62, +0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x32,0x66,0x34,0x33,0x35, +0x65,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x32,0x66,0x32, +0x66,0x32,0x3b,0x0d,0x0a,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31, +0x30,0x70,0x78,0x20,0x30,0x70,0x78,0x20,0x31,0x30,0x70,0x78,0x20,0x30,0x70,0x78, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x30, +0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65, +0x3a,0x31,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61, +0x6d,0x69,0x6c,0x79,0x3a,0x20,0x27,0x52,0x61,0x6c,0x65,0x77,0x61,0x79,0x27,0x2c, +0x43,0x61,0x6d,0x62,0x72,0x69,0x61,0x2c,0x20,0x41,0x72,0x69,0x61,0x6c,0x2c,0x20, +0x73,0x61,0x6e,0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x0d,0x0a,0x09,0x66,0x6f, +0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x62,0x6f,0x6c,0x64,0x3b,0x0d, +0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a, +0x33,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x20,0x6e, +0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x09,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x74, +0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c,0x6c,0x20,0x6c,0x69, +0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d,0x0a,0x09,0x2d,0x6d, +0x6f,0x7a,0x2d,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c, +0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d, +0x0a,0x09,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c,0x6c, 0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d,0x0a, -0x09,0x2d,0x6d,0x6f,0x7a,0x2d,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e, -0x3a,0x61,0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30, -0x73,0x3b,0x0d,0x0a,0x09,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a, -0x61,0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73, -0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x23,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74, -0x6f,0x6e,0x20,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x5f,0x72,0x69,0x67,0x68,0x74, -0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x62,0x61,0x63, -0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x33,0x38,0x35,0x66,0x39,0x65,0x3b, -0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x0d,0x0a,0x40,0x6d,0x65,0x64,0x69,0x61,0x20,0x73, -0x63,0x72,0x65,0x65,0x6e,0x20,0x61,0x6e,0x64,0x20,0x28,0x6d,0x61,0x78,0x2d,0x77, -0x69,0x64,0x74,0x68,0x3a,0x20,0x35,0x30,0x65,0x6d,0x29,0x20,0x7b,0x0d,0x0a,0x09, -0x62,0x6f,0x64,0x79,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73, -0x69,0x7a,0x65,0x3a,0x20,0x35,0x35,0x25,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09, -0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x3e,0x20,0x68,0x65,0x61, -0x64,0x65,0x72,0x20,0x68,0x31,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x73,0x69,0x7a, -0x65,0x3a,0x20,0x31,0x36,0x35,0x70,0x78,0x20,0x31,0x30,0x30,0x70,0x78,0x3b,0x0d, -0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67, -0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20,0x31,0x38,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09, -0x7d,0x0d,0x0a,0x09,0x2e,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61, -0x70,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c, -0x65,0x66,0x74,0x3a,0x20,0x31,0x34,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d, -0x0a,0x09,0x2e,0x6d,0x65,0x6e,0x75,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x77,0x69,0x64, -0x74,0x68,0x3a,0x20,0x31,0x34,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a, -0x09,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x7b,0x0d, -0x0a,0x09,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x32,0x32, -0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09,0x2e,0x6d,0x65,0x6e,0x75,0x5f, -0x69,0x74,0x65,0x6d,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73, -0x69,0x7a,0x65,0x3a,0x20,0x31,0x34,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a, -0x09,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x65,0x74,0x68,0x20,0x7b,0x0d,0x0a,0x09, -0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x36,0x30,0x70,0x78,0x3b,0x0d,0x0a, -0x09,0x7d,0x0d,0x0a,0x09,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69, -0x70,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x33, -0x35,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09,0x2e,0x6c,0x61,0x62,0x65, -0x6c,0x5f,0x75,0x73,0x65,0x72,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x77,0x69,0x64,0x74, -0x68,0x3a,0x20,0x31,0x39,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x7d, -}; +0x7d,0x0d,0x0a,0x23,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20, +0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x7b,0x0d, +0x0a,0x20,0x20,0x20,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23, +0x33,0x38,0x35,0x66,0x39,0x65,0x3b,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x23,0x73,0x61, +0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x2e,0x62,0x75,0x74,0x74,0x6f, +0x6e,0x5f,0x72,0x69,0x67,0x68,0x74,0x0d,0x0a,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a, +0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75, +0x6e,0x64,0x3a,0x23,0x32,0x66,0x34,0x33,0x35,0x65,0x3b,0x0d,0x0a,0x09,0x63,0x6f, +0x6c,0x6f,0x72,0x3a,0x23,0x66,0x32,0x66,0x32,0x66,0x32,0x3b,0x0d,0x0a,0x09,0x70, +0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x30,0x70,0x78,0x20,0x30,0x70,0x78, +0x20,0x31,0x30,0x70,0x78,0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09, +0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x36,0x70,0x78,0x3b,0x0d, +0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x20,0x27, +0x52,0x61,0x6c,0x65,0x77,0x61,0x79,0x27,0x2c,0x43,0x61,0x6d,0x62,0x72,0x69,0x61, +0x2c,0x20,0x41,0x72,0x69,0x61,0x6c,0x2c,0x20,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65, +0x72,0x69,0x66,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67, +0x68,0x74,0x3a,0x62,0x6f,0x6c,0x64,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65, +0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x33,0x70,0x78,0x3b,0x0d,0x0a,0x09, +0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20, +0x38,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d, +0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c,0x6c,0x20,0x6c, +0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d,0x0a,0x09,0x2d, +0x6d,0x6f,0x7a,0x2d,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61, +0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b, +0x0d,0x0a,0x09,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c, +0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d, +0x0a,0x7d,0x0d,0x0a,0x23,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e, +0x20,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x5f,0x72,0x69,0x67,0x68,0x74,0x3a,0x68, +0x6f,0x76,0x65,0x72,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x62,0x61,0x63,0x6b,0x67, +0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x33,0x38,0x35,0x66,0x39,0x65,0x3b,0x20,0x0d, +0x0a,0x7d,0x0d,0x0a,0x0d,0x0a,0x40,0x6d,0x65,0x64,0x69,0x61,0x20,0x73,0x63,0x72, +0x65,0x65,0x6e,0x20,0x61,0x6e,0x64,0x20,0x28,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64, +0x74,0x68,0x3a,0x20,0x35,0x30,0x65,0x6d,0x29,0x20,0x7b,0x0d,0x0a,0x09,0x62,0x6f, +0x64,0x79,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a, +0x65,0x3a,0x20,0x35,0x35,0x25,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09,0x2e,0x63, +0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x3e,0x20,0x68,0x65,0x61,0x64,0x65, +0x72,0x20,0x68,0x31,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x73,0x69,0x7a,0x65,0x3a, +0x20,0x31,0x36,0x35,0x70,0x78,0x20,0x31,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c, +0x65,0x66,0x74,0x3a,0x20,0x31,0x38,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d, +0x0a,0x09,0x2e,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20, +0x7b,0x0d,0x0a,0x09,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66, +0x74,0x3a,0x20,0x31,0x34,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09, +0x2e,0x6d,0x65,0x6e,0x75,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x77,0x69,0x64,0x74,0x68, +0x3a,0x20,0x31,0x34,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09,0x2e, +0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x7b,0x0d,0x0a,0x09, +0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x32,0x32,0x70,0x78, +0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74, +0x65,0x6d,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a, +0x65,0x3a,0x20,0x31,0x34,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09,0x2e, +0x6c,0x61,0x62,0x65,0x6c,0x5f,0x77,0x68,0x65,0x65,0x6c,0x74,0x69,0x63,0x6b,0x20, +0x7b,0x0d,0x0a,0x09,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x33,0x30,0x70, +0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f, +0x65,0x74,0x68,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20, +0x31,0x36,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x09,0x2e,0x6c,0x61, +0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x20,0x7b,0x0d,0x0a,0x09,0x09,0x77, +0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x33,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7d, +0x0d,0x0a,0x09,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x20,0x7b, +0x0d,0x0a,0x09,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x39,0x30,0x70,0x78, +0x3b,0x0d,0x0a,0x09,0x7d,0x0d,0x0a,0x7d,}; static const unsigned int dummy_align__images_aceinna_png = 1; static const unsigned char data__images_aceinna_png[] = { @@ -1213,7 +1225,7 @@ Pragma: no-cache 0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, 0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, 0x65,0x0d,0x0a,0x0d,0x0a, -/* raw file data (1811 bytes) */ +/* raw file data (1918 bytes) */ 0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0a, 0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e,0x0a,0x09, 0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65,0x74,0x3d,0x22, @@ -1250,84 +1262,90 @@ Pragma: no-cache 0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f, 0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, -0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x45,0x74,0x68,0x43, +0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x4f,0x64,0x6f,0x43, 0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, 0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22, -0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74, -0x20,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69, -0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73, -0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20, -0x68,0x72,0x65,0x66,0x3d,0x22,0x44,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f, -0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d, -0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x69,0x73, -0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09, -0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c, -0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c, -0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e, -0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f, -0x2f,0x6f,0x70,0x65,0x6e,0x72,0x74,0x6b,0x2e,0x72,0x65,0x61,0x64,0x74,0x68,0x65, -0x64,0x6f,0x63,0x73,0x2e,0x69,0x6f,0x2f,0x65,0x6e,0x2f,0x6c,0x61,0x74,0x65,0x73, -0x74,0x2f,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f, -0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09, -0x09,0x09,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x33,0x33,0x30,0x20,0x4d,0x61,0x6e, -0x75,0x61,0x6c,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09, -0x09,0x3c,0x2f,0x75,0x6c,0x3e,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e, -0x0a,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, -0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0a,0x09, -0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73, -0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x68,0x65,0x61,0x64,0x65,0x72, -0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x31,0x3e,0x41,0x63,0x65,0x69, -0x6e,0x6e,0x61,0x20,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x20,0x3c,0x73,0x70,0x61, -0x6e,0x3e,0x45,0x6d,0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x77,0x65,0x62,0x73,0x65, -0x72,0x76,0x65,0x72,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x68,0x31,0x3e, -0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x0a, -0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, -0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x63,0x66,0x67,0x22,0x3e,0x0a,0x09,0x09, -0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63, -0x66,0x67,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x44,0x65,0x76,0x69,0x63,0x65,0x20, -0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09, -0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x6e,0x22,0x3e, -0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, -0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65, -0x76,0x69,0x63,0x65,0x22,0x3e,0x50,0x72,0x6f,0x64,0x75,0x63,0x74,0x20,0x4e,0x61, -0x6d,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74, -0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x4e,0x61,0x6d, -0x65,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a, -0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, -0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76, -0x69,0x63,0x65,0x22,0x3e,0x49,0x4d,0x55,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c, -0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x69,0x6d,0x75,0x2d, -0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09, -0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, -0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76,0x69,0x63, -0x65,0x22,0x3e,0x50,0x4e,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74, -0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x70,0x6e,0x2d,0x2d,0x3e,0x3c,0x2f, -0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09, -0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, -0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3e,0x46, -0x69,0x72,0x6d,0x77,0x61,0x72,0x65,0x20,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a, -0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21, -0x2d,0x2d,0x23,0x66,0x69,0x72,0x6d,0x77,0x61,0x72,0x65,0x56,0x65,0x72,0x73,0x69, -0x6f,0x6e,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e, -0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, -0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65, -0x76,0x69,0x63,0x65,0x22,0x3e,0x53,0x65,0x72,0x69,0x61,0x6c,0x20,0x4e,0x75,0x6d, -0x62,0x65,0x72,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78, -0x74,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x73,0x65,0x72,0x69,0x61,0x6c,0x4e,0x75,0x6d, -0x77,0x65,0x72,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70, -0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65, -0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64, -0x65,0x76,0x69,0x63,0x65,0x22,0x3e,0x41,0x70,0x70,0x20,0x56,0x65,0x72,0x73,0x69, -0x6f,0x6e,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74, -0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x61,0x70,0x70,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e, -0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09, -0x09,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c, -0x2f,0x64,0x69,0x76,0x3e,0x0a,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e, -0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72, -0x61,0x70,0x20,0x2d,0x2d,0x3e,0x0a,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c, -0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2d, -0x2d,0x3e,0x0a,0x09,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0a,0x3c,0x2f,0x68,0x74, -0x6d,0x6c,0x3e,}; +0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x64,0x6f,0x20,0x43,0x6f,0x6e,0x66, +0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c, +0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61, +0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x45,0x74,0x68,0x43,0x66,0x67,0x2e,0x73,0x68, +0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75, +0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x09,0x09,0x09, +0x09,0x09,0x09,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20,0x53,0x65,0x74,0x74, +0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09, +0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d, +0x22,0x44,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d, +0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x69,0x73,0x2d,0x61,0x63,0x74,0x69, +0x76,0x65,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x44,0x65,0x76,0x69,0x63, +0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a, +0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72, +0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x6f,0x70,0x65,0x6e, +0x72,0x74,0x6b,0x2e,0x72,0x65,0x61,0x64,0x74,0x68,0x65,0x64,0x6f,0x63,0x73,0x2e, +0x69,0x6f,0x2f,0x65,0x6e,0x2f,0x6c,0x61,0x74,0x65,0x73,0x74,0x2f,0x22,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f, +0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x70,0x65, +0x6e,0x52,0x54,0x4b,0x33,0x33,0x30,0x20,0x4d,0x61,0x6e,0x75,0x61,0x6c,0x3c,0x2f, +0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c, +0x3e,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x3c, +0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65, +0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68, +0x65,0x61,0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64, +0x72,0x6f,0x70,0x73,0x2d,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x0a,0x09,0x09, +0x09,0x09,0x09,0x3c,0x68,0x31,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x4f, +0x70,0x65,0x6e,0x52,0x54,0x4b,0x20,0x3c,0x73,0x70,0x61,0x6e,0x3e,0x45,0x6d,0x62, +0x65,0x64,0x64,0x65,0x64,0x20,0x77,0x65,0x62,0x73,0x65,0x72,0x76,0x65,0x72,0x3c, +0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x68,0x31,0x3e,0x0a,0x09,0x09,0x09,0x09, +0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x0a,0x09,0x09,0x09,0x09,0x3c, +0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f, +0x70,0x73,0x2d,0x63,0x66,0x67,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x64, +0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x74,0x69,0x74, +0x6c,0x65,0x22,0x3e,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c, +0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x6e,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09, +0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76,0x69,0x63,0x65,0x22, +0x3e,0x50,0x72,0x6f,0x64,0x75,0x63,0x74,0x20,0x4e,0x61,0x6d,0x65,0x3a,0x3c,0x2f, +0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d, +0x23,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x4e,0x61,0x6d,0x65,0x2d,0x2d,0x3e,0x3c, +0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09, +0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3e, +0x49,0x4d,0x55,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78, +0x74,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x69,0x6d,0x75,0x2d,0x2d,0x3e,0x3c,0x2f,0x74, +0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c, +0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3e,0x50,0x4e, +0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c, +0x21,0x2d,0x2d,0x23,0x70,0x6e,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e, +0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c, +0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65, +0x6c,0x5f,0x64,0x65,0x76,0x69,0x63,0x65,0x22,0x3e,0x46,0x69,0x72,0x6d,0x77,0x61, +0x72,0x65,0x20,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a,0x3c,0x2f,0x6c,0x61,0x62, +0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x66,0x69, +0x72,0x6d,0x77,0x61,0x72,0x65,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x2d,0x2d,0x3e, +0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09, +0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76,0x69,0x63,0x65,0x22, +0x3e,0x53,0x65,0x72,0x69,0x61,0x6c,0x20,0x4e,0x75,0x6d,0x62,0x65,0x72,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d, +0x2d,0x23,0x73,0x65,0x72,0x69,0x61,0x6c,0x4e,0x75,0x6d,0x77,0x65,0x72,0x2d,0x2d, +0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09, +0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x64,0x65,0x76,0x69,0x63,0x65, +0x22,0x3e,0x41,0x70,0x70,0x20,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3a,0x3c,0x2f, +0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d, +0x23,0x61,0x70,0x70,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x2d,0x2d,0x3e,0x3c,0x2f, +0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c, +0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e, +0x0a,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20, +0x2f,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20,0x2d,0x2d, +0x3e,0x0a,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f, +0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2d,0x2d,0x3e,0x0a,0x09,0x3c, +0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,}; static const unsigned int dummy_align__EthCfg_shtml = 3; static const unsigned char data__EthCfg_shtml[] = { @@ -1356,7 +1374,7 @@ Pragma: no-cache 0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, 0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, 0x65,0x0d,0x0a,0x0d,0x0a, -/* raw file data (3056 bytes) */ +/* raw file data (3163 bytes) */ 0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0a, 0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e,0x0a,0x09, 0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65,0x74,0x3d,0x22, @@ -1424,131 +1442,137 @@ Pragma: no-cache 0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e, 0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, 0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68, -0x72,0x65,0x66,0x3d,0x22,0x45,0x74,0x68,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d, +0x72,0x65,0x66,0x3d,0x22,0x4f,0x64,0x6f,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d, 0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, -0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x69,0x73,0x2d,0x61,0x63,0x74,0x69, -0x76,0x65,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x45,0x74,0x68,0x65,0x72, -0x6e,0x65,0x74,0x20,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e,0x3c, -0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c, -0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e, -0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x44,0x65,0x76,0x69,0x63,0x65,0x49, -0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73, -0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b, -0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x44,0x65,0x76,0x69,0x63,0x65,0x20, -0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09, -0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65, -0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66, -0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x6f,0x70,0x65,0x6e,0x72,0x74, -0x6b,0x2e,0x72,0x65,0x61,0x64,0x74,0x68,0x65,0x64,0x6f,0x63,0x73,0x2e,0x69,0x6f, -0x2f,0x65,0x6e,0x2f,0x6c,0x61,0x74,0x65,0x73,0x74,0x2f,0x22,0x20,0x63,0x6c,0x61, -0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, -0x6e,0x6b,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x70,0x65,0x6e,0x52, -0x54,0x4b,0x33,0x33,0x30,0x20,0x4d,0x61,0x6e,0x75,0x61,0x6c,0x3c,0x2f,0x61,0x3e, -0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c,0x3e,0x0a, -0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x3c,0x64,0x69, -0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74, -0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61, -0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f, -0x70,0x73,0x2d,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09, -0x09,0x3c,0x68,0x31,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x4f,0x70,0x65, -0x6e,0x52,0x54,0x4b,0x20,0x3c,0x73,0x70,0x61,0x6e,0x3e,0x45,0x6d,0x62,0x65,0x64, -0x64,0x65,0x64,0x20,0x77,0x65,0x62,0x73,0x65,0x72,0x76,0x65,0x72,0x3c,0x2f,0x73, -0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x68,0x31,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f, -0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x0a,0x09,0x09,0x09,0x09,0x3c,0x64,0x69, -0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73, -0x2d,0x63,0x66,0x67,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76, -0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x74,0x69,0x74,0x6c,0x65, -0x22,0x3e,0x45,0x74,0x68,0x6e,0x65,0x74,0x20,0x53,0x65,0x74,0x74,0x69,0x6e,0x67, -0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x66,0x6f,0x72, -0x6d,0x20,0x69,0x64,0x3d,0x27,0x45,0x74,0x68,0x6e,0x65,0x74,0x43,0x6f,0x6e,0x66, -0x69,0x67,0x27,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54, -0x27,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x27,0x45,0x74,0x68,0x6e,0x65,0x74, -0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x63,0x67,0x69,0x27,0x3e,0x0a,0x09,0x09,0x09, -0x09,0x09,0x09,0x3c,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, -0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x65,0x74,0x68,0x22,0x3e,0x4d,0x4f,0x44,0x45, -0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70, -0x65,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d, -0x27,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x30,0x70,0x78, -0x27,0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x44,0x68,0x63,0x70,0x27, -0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x65,0x74,0x68,0x4d,0x6f,0x64,0x65,0x22,0x20, -0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x64,0x68,0x63,0x70,0x22,0x20,0x2f,0x3e,0x0a, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x65,0x78, -0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22,0x3e, -0x44,0x48,0x43,0x50,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20, +0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09, +0x09,0x4f,0x64,0x6f,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69, +0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09, +0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75, +0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22, +0x45,0x74,0x68,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c, +0x69,0x6e,0x6b,0x20,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x22,0x3e,0x0a, +0x09,0x09,0x09,0x09,0x09,0x09,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20,0x53, +0x65,0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a, +0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72, +0x65,0x66,0x3d,0x22,0x44,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73, +0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x09,0x09, +0x09,0x09,0x09,0x09,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c, +0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c, +0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74, +0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74, +0x70,0x73,0x3a,0x2f,0x2f,0x6f,0x70,0x65,0x6e,0x72,0x74,0x6b,0x2e,0x72,0x65,0x61, +0x64,0x74,0x68,0x65,0x64,0x6f,0x63,0x73,0x2e,0x69,0x6f,0x2f,0x65,0x6e,0x2f,0x6c, +0x61,0x74,0x65,0x73,0x74,0x2f,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d, +0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a, +0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x33,0x33,0x30, +0x20,0x4d,0x61,0x6e,0x75,0x61,0x6c,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e, +0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c,0x3e,0x0a,0x09,0x09,0x09,0x3c,0x2f, +0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70, +0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x68,0x65, +0x61,0x64,0x65,0x72,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x31,0x3e, +0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x20, +0x3c,0x73,0x70,0x61,0x6e,0x3e,0x45,0x6d,0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x77, +0x65,0x62,0x73,0x65,0x72,0x76,0x65,0x72,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c, +0x2f,0x68,0x31,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65, +0x72,0x3e,0x0a,0x0a,0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x63,0x66,0x67,0x22, +0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x63,0x66,0x67,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x45,0x74,0x68, +0x6e,0x65,0x74,0x20,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x64,0x69,0x76, +0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x69,0x64,0x3d, +0x27,0x45,0x74,0x68,0x6e,0x65,0x74,0x43,0x6f,0x6e,0x66,0x69,0x67,0x27,0x20,0x6d, +0x65,0x74,0x68,0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27,0x20,0x61,0x63,0x74, +0x69,0x6f,0x6e,0x3d,0x27,0x45,0x74,0x68,0x6e,0x65,0x74,0x43,0x6f,0x6e,0x66,0x69, +0x67,0x2e,0x63,0x67,0x69,0x27,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c, +0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65, +0x6c,0x5f,0x65,0x74,0x68,0x22,0x3e,0x4d,0x4f,0x44,0x45,0x3a,0x3c,0x2f,0x6c,0x61, +0x62,0x65,0x6c,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, -0x79,0x70,0x65,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74,0x79,0x6c, -0x65,0x3d,0x27,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x33, -0x70,0x78,0x27,0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x53,0x74,0x61, -0x74,0x69,0x63,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x65,0x74,0x68,0x4d,0x6f, -0x64,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x74,0x61,0x74,0x69, -0x63,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x3c,0x74,0x65,0x78,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63, -0x66,0x67,0x63,0x62,0x22,0x3e,0x53,0x54,0x41,0x54,0x49,0x43,0x3c,0x2f,0x74,0x65, -0x78,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x70,0x3e, -0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, -0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x65,0x74, -0x68,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x4d,0x61,0x63,0x27,0x3e, -0x4d,0x41,0x43,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, -0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, -0x64,0x3d,0x27,0x74,0x78,0x74,0x4d,0x61,0x63,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, -0x27,0x6d,0x61,0x63,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20, -0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x3d,0x27,0x64,0x69,0x73,0x61,0x62,0x6c, -0x65,0x64,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09, -0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, -0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x65,0x74,0x68,0x22,0x20,0x66,0x6f,0x72, -0x3d,0x27,0x74,0x78,0x74,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x49,0x70,0x27,0x3e, -0x53,0x54,0x41,0x54,0x49,0x43,0x20,0x49,0x50,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, -0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, -0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x44,0x65,0x66,0x61, -0x75,0x6c,0x74,0x49,0x70,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x64,0x65,0x66, -0x61,0x75,0x6c,0x74,0x49,0x70,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38, -0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c, -0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, -0x6c,0x61,0x62,0x65,0x6c,0x5f,0x65,0x74,0x68,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27, -0x74,0x78,0x74,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x4e,0x65,0x74,0x6d,0x61,0x73, -0x6b,0x27,0x3e,0x53,0x54,0x41,0x54,0x49,0x43,0x20,0x4e,0x45,0x54,0x4d,0x41,0x53, -0x4b,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74, -0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d, -0x27,0x74,0x78,0x74,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x4e,0x65,0x74,0x6d,0x61, -0x73,0x6b,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x64,0x65,0x66,0x61,0x75,0x6c, -0x74,0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27, -0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09, -0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, -0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x65,0x74,0x68,0x22,0x20,0x66,0x6f,0x72, -0x3d,0x27,0x74,0x78,0x74,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x47,0x61,0x74,0x65, -0x77,0x61,0x79,0x27,0x3e,0x53,0x54,0x41,0x54,0x49,0x43,0x20,0x47,0x41,0x54,0x45, -0x57,0x41,0x59,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, -0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, -0x64,0x3d,0x27,0x74,0x78,0x74,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x47,0x61,0x74, -0x65,0x77,0x61,0x79,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x64,0x65,0x66,0x61, -0x75,0x6c,0x74,0x47,0x61,0x74,0x65,0x77,0x61,0x79,0x27,0x20,0x73,0x69,0x7a,0x65, -0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09, -0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65, -0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x3c,0x70,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6c,0x61,0x73,0x73, -0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x27, -0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x53, -0x41,0x56,0x45,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09, -0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f, -0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e, -0x0a,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20, -0x2f,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20,0x2d,0x2d, -0x3e,0x0a,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f, -0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2d,0x2d,0x3e,0x0a,0x0a,0x09, -0x09,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, -0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x27,0x20, -0x73,0x72,0x63,0x3d,0x27,0x45,0x74,0x68,0x6e,0x65,0x74,0x43,0x6f,0x6e,0x66,0x69, -0x67,0x2e,0x6a,0x73,0x27,0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0a, -0x09,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e, -}; +0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x72,0x61, +0x64,0x69,0x6f,0x27,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x27,0x6d,0x61,0x72,0x67, +0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x30,0x70,0x78,0x27,0x20,0x69,0x64,0x3d, +0x27,0x72,0x61,0x64,0x69,0x6f,0x44,0x68,0x63,0x70,0x27,0x20,0x6e,0x61,0x6d,0x65, +0x3d,0x22,0x65,0x74,0x68,0x4d,0x6f,0x64,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65, +0x3d,0x22,0x64,0x68,0x63,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x65,0x78,0x74,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22,0x3e,0x44,0x48,0x43,0x50,0x3c, +0x2f,0x74,0x65,0x78,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27, +0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x27,0x6d,0x61, +0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x33,0x70,0x78,0x27,0x20,0x69, +0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x53,0x74,0x61,0x74,0x69,0x63,0x27,0x20, +0x6e,0x61,0x6d,0x65,0x3d,0x22,0x65,0x74,0x68,0x4d,0x6f,0x64,0x65,0x22,0x20,0x76, +0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x74,0x61,0x74,0x69,0x63,0x22,0x20,0x2f,0x3e, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x65, +0x78,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22, +0x3e,0x53,0x54,0x41,0x54,0x49,0x43,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09, +0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x65,0x74,0x68,0x22,0x20,0x66,0x6f, +0x72,0x3d,0x27,0x74,0x78,0x74,0x4d,0x61,0x63,0x27,0x3e,0x4d,0x41,0x43,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79, +0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78, +0x74,0x4d,0x61,0x63,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x6d,0x61,0x63,0x27, +0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x64,0x69,0x73,0x61,0x62, +0x6c,0x65,0x64,0x3d,0x27,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x27,0x20,0x2f, +0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c, +0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, +0x65,0x6c,0x5f,0x65,0x74,0x68,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74, +0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x49,0x70,0x27,0x3e,0x53,0x54,0x41,0x54,0x49, +0x43,0x20,0x49,0x50,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e, +0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20, +0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x49,0x70, +0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x49, +0x70,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c, +0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61, +0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c, +0x5f,0x65,0x74,0x68,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x44,0x65, +0x66,0x61,0x75,0x6c,0x74,0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x27,0x3e,0x53,0x54, +0x41,0x54,0x49,0x43,0x20,0x4e,0x45,0x54,0x4d,0x41,0x53,0x4b,0x3a,0x3c,0x2f,0x6c, +0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, +0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x44, +0x65,0x66,0x61,0x75,0x6c,0x74,0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x27,0x20,0x6e, +0x61,0x6d,0x65,0x3d,0x27,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x4e,0x65,0x74,0x6d, +0x61,0x73,0x6b,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f, +0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c, +0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, +0x65,0x6c,0x5f,0x65,0x74,0x68,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74, +0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x47,0x61,0x74,0x65,0x77,0x61,0x79,0x27,0x3e, +0x53,0x54,0x41,0x54,0x49,0x43,0x20,0x47,0x41,0x54,0x45,0x57,0x41,0x59,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79, +0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78, +0x74,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x47,0x61,0x74,0x65,0x77,0x61,0x79,0x27, +0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x47,0x61, +0x74,0x65,0x77,0x61,0x79,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27, +0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x64, +0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74, +0x6f,0x6e,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c, +0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74, +0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69, +0x74,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x53,0x41,0x56,0x45,0x27,0x20, +0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e, +0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x0a,0x09,0x09,0x09, +0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e,0x74, +0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20,0x2d,0x2d,0x3e,0x0a,0x09,0x09,0x3c, +0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e,0x74,0x61, +0x69,0x6e,0x65,0x72,0x20,0x2d,0x2d,0x3e,0x0a,0x0a,0x09,0x09,0x3c,0x73,0x63,0x72, +0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x2f,0x6a, +0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x27,0x20,0x73,0x72,0x63,0x3d,0x27, +0x45,0x74,0x68,0x6e,0x65,0x74,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x6a,0x73,0x27, +0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0a,0x09,0x3c,0x2f,0x62,0x6f, +0x64,0x79,0x3e,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,}; static const unsigned int dummy_align__NtripCfg_shtml = 4; static const unsigned char data__NtripCfg_shtml[] = { @@ -1578,7 +1602,7 @@ Pragma: no-cache 0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, 0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, 0x65,0x0d,0x0a,0x0d,0x0a, -/* raw file data (3654 bytes) */ +/* raw file data (3763 bytes) */ 0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0d, 0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e, 0x0d,0x0a,0x09,0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65, @@ -1680,136 +1704,766 @@ Pragma: no-cache 0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09, 0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65, 0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66, -0x3d,0x22,0x45,0x74,0x68,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20, +0x3d,0x22,0x4f,0x64,0x6f,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20, 0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d, -0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x45, -0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x3c, -0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c, -0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, -0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x44,0x65, -0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20, +0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f, +0x64,0x6f,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e, +0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09, +0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f, +0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x45, +0x74,0x68,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, +0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x45,0x74,0x68,0x65, +0x72,0x6e,0x65,0x74,0x20,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e, +0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20, 0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d, -0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x44, -0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c,0x2f, -0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c, -0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e, -0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f, -0x2f,0x6f,0x70,0x65,0x6e,0x72,0x74,0x6b,0x2e,0x72,0x65,0x61,0x64,0x74,0x68,0x65, -0x64,0x6f,0x63,0x73,0x2e,0x69,0x6f,0x2f,0x65,0x6e,0x2f,0x6c,0x61,0x74,0x65,0x73, -0x74,0x2f,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f, -0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09, -0x09,0x09,0x09,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x33,0x33,0x30,0x20,0x4d,0x61, -0x6e,0x75,0x61,0x6c,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09, -0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64, -0x69,0x76,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, -0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70, -0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, -0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x3e,0x0d,0x0a,0x09, -0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73, -0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x68,0x65,0x61,0x64,0x65, -0x72,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x31,0x3e,0x41, -0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x20,0x3c, -0x73,0x70,0x61,0x6e,0x3e,0x45,0x6d,0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x77,0x65, -0x62,0x73,0x65,0x72,0x76,0x65,0x72,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c,0x2f, -0x68,0x31,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64, -0x65,0x72,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6e,0x61,0x76,0x20,0x63, -0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x63,0x66, -0x67,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69, -0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x74,0x69,0x74,0x6c, -0x65,0x22,0x3e,0x4e,0x54,0x52,0x49,0x50,0x20,0x53,0x65,0x72,0x76,0x65,0x72,0x20, -0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x73,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a, +0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x44,0x65,0x76,0x69,0x63, +0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, +0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x44,0x65,0x76,0x69, +0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20, +0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x6f,0x70, +0x65,0x6e,0x72,0x74,0x6b,0x2e,0x72,0x65,0x61,0x64,0x74,0x68,0x65,0x64,0x6f,0x63, +0x73,0x2e,0x69,0x6f,0x2f,0x65,0x6e,0x2f,0x6c,0x61,0x74,0x65,0x73,0x74,0x2f,0x22, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, +0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09, +0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x33,0x33,0x30,0x20,0x4d,0x61,0x6e,0x75,0x61, +0x6c,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09, +0x3c,0x2f,0x75,0x6c,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0d, +0x0a,0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09, +0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x31,0x3e,0x41,0x63,0x65,0x69, +0x6e,0x6e,0x61,0x20,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x20,0x3c,0x73,0x70,0x61, +0x6e,0x3e,0x45,0x6d,0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x77,0x65,0x62,0x73,0x65, +0x72,0x76,0x65,0x72,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x68,0x31,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6e,0x61,0x76,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x63,0x66,0x67,0x22,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e, +0x4e,0x54,0x52,0x49,0x50,0x20,0x53,0x65,0x72,0x76,0x65,0x72,0x20,0x53,0x65,0x74, +0x74,0x69,0x6e,0x67,0x73,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x69,0x64, -0x3d,0x27,0x4e,0x74,0x72,0x69,0x70,0x43,0x6f,0x6e,0x66,0x69,0x67,0x27,0x20,0x6d, -0x65,0x74,0x68,0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27,0x20,0x61,0x63,0x74, -0x69,0x6f,0x6e,0x3d,0x27,0x4e,0x74,0x72,0x69,0x70,0x43,0x6f,0x6e,0x66,0x69,0x67, -0x2e,0x63,0x67,0x69,0x27,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70, -0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c, -0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x22,0x20,0x66,0x6f,0x72,0x3d, -0x27,0x74,0x78,0x74,0x55,0x72,0x6c,0x27,0x3e,0x49,0x50,0x3a,0x3c,0x2f,0x6c,0x61, -0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d, -0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x49,0x70, -0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x69,0x70,0x27,0x20,0x73,0x69,0x7a,0x65, +0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x69,0x64,0x3d,0x27,0x4e, +0x74,0x72,0x69,0x70,0x43,0x6f,0x6e,0x66,0x69,0x67,0x27,0x20,0x6d,0x65,0x74,0x68, +0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e, +0x3d,0x27,0x4e,0x74,0x72,0x69,0x70,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x63,0x67, +0x69,0x27,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c, +0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65, +0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78, +0x74,0x55,0x72,0x6c,0x27,0x3e,0x49,0x50,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c, +0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65, +0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x49,0x70,0x27,0x20,0x6e, +0x61,0x6d,0x65,0x3d,0x27,0x69,0x70,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31, +0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x22, +0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x72,0x74,0x27,0x3e,0x50, +0x4f,0x52,0x54,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, +0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, +0x64,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x72,0x74,0x27,0x20,0x6e,0x61,0x6d,0x65, +0x3d,0x27,0x70,0x6f,0x72,0x74,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38, +0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09, +0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x22,0x20,0x66,0x6f, +0x72,0x3d,0x27,0x74,0x78,0x74,0x4d,0x6f,0x75,0x6e,0x74,0x50,0x6f,0x69,0x6e,0x74, +0x27,0x3e,0x4d,0x4f,0x55,0x4e,0x54,0x20,0x50,0x4f,0x49,0x4e,0x54,0x3a,0x3c,0x2f, +0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70, +0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74, +0x4d,0x6f,0x75,0x6e,0x74,0x50,0x6f,0x69,0x6e,0x74,0x27,0x20,0x6e,0x61,0x6d,0x65, +0x3d,0x27,0x6d,0x6f,0x75,0x6e,0x74,0x50,0x6f,0x69,0x6e,0x74,0x27,0x20,0x73,0x69, +0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a, +0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72, +0x69,0x70,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72, +0x6e,0x61,0x6d,0x65,0x27,0x3e,0x55,0x53,0x45,0x52,0x20,0x4e,0x41,0x4d,0x45,0x3a, +0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, +0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74, +0x78,0x74,0x55,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x27,0x20,0x6e,0x61,0x6d,0x65, +0x3d,0x27,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x27,0x20,0x73,0x69,0x7a,0x65, 0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, 0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72, -0x69,0x70,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x72,0x74, -0x27,0x3e,0x50,0x4f,0x52,0x54,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c, -0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74, -0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x72,0x74,0x27,0x20,0x6e, -0x61,0x6d,0x65,0x3d,0x27,0x70,0x6f,0x72,0x74,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d, -0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x09,0x09, -0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, -0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x22, -0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x4d,0x6f,0x75,0x6e,0x74,0x50,0x6f, -0x69,0x6e,0x74,0x27,0x3e,0x4d,0x4f,0x55,0x4e,0x54,0x20,0x50,0x4f,0x49,0x4e,0x54, -0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20, -0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27, -0x74,0x78,0x74,0x4d,0x6f,0x75,0x6e,0x74,0x50,0x6f,0x69,0x6e,0x74,0x27,0x20,0x6e, -0x61,0x6d,0x65,0x3d,0x27,0x6d,0x6f,0x75,0x6e,0x74,0x50,0x6f,0x69,0x6e,0x74,0x27, -0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70, -0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62, -0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f, -0x6e,0x74,0x72,0x69,0x70,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x55, -0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x27,0x3e,0x55,0x53,0x45,0x52,0x20,0x4e,0x41, -0x4d,0x45,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75, -0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64, -0x3d,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x27,0x20,0x6e, -0x61,0x6d,0x65,0x3d,0x27,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x27,0x20,0x73, -0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d, +0x69,0x70,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x41,0x70,0x69,0x6b, +0x65,0x79,0x27,0x3e,0x50,0x41,0x53,0x53,0x57,0x4f,0x52,0x44,0x3a,0x3c,0x2f,0x6c, +0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, +0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x50, +0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x70, +0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31, +0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09, +0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x22,0x3e,0x4e, +0x54,0x52,0x49,0x50,0x20,0x53,0x54,0x41,0x54,0x55,0x53,0x3a,0x3c,0x2f,0x6c,0x61, +0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x63,0x6f, +0x6e,0x6e,0x65,0x63,0x74,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66, +0x67,0x63,0x62,0x22,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x6e,0x74,0x72,0x69,0x70,0x43, +0x6f,0x6e,0x6e,0x65,0x63,0x74,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c, +0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, +0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x22,0x3e,0x42,0x41,0x53,0x45,0x20,0x53, +0x54,0x41,0x54,0x55,0x53,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74, +0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x73,0x74,0x72,0x65,0x61,0x6d,0x22,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22,0x3e,0x3c,0x21, +0x2d,0x2d,0x23,0x6e,0x74,0x72,0x69,0x70,0x53,0x74,0x72,0x65,0x61,0x6d,0x2d,0x2d, +0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x09, +0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76, +0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x76, +0x61,0x6c,0x75,0x65,0x3d,0x27,0x53,0x41,0x56,0x45,0x27,0x20,0x2f,0x3e,0x3c,0x2f, +0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69, +0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f, +0x72,0x6d,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x6e,0x61,0x76,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x09,0x09, +0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e, +0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20,0x2d,0x2d,0x3e,0x0d,0x0a,0x09, +0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e, +0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2d,0x2d,0x3e,0x0d,0x0a,0x09,0x09,0x0d,0x0a, +0x09,0x09,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27, +0x74,0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x27, +0x20,0x73,0x72,0x63,0x3d,0x27,0x4e,0x74,0x72,0x69,0x70,0x43,0x6f,0x6e,0x66,0x69, +0x67,0x2e,0x6a,0x73,0x27,0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d, +0x0a,0x09,0x09,0x0d,0x0a,0x09,0x09,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e, +0x0d,0x0a,0x09,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74, +0x6d,0x6c,0x3e,}; + +static const unsigned int dummy_align__OdoCfg_shtml = 5; +static const unsigned char data__OdoCfg_shtml[] = { +/* /OdoCfg.shtml (14 chars) */ +0x2f,0x4f,0x64,0x6f,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/html +Expires: Fri, 10 Apr 2008 14:00:00 GMT +Pragma: no-cache + +" (85 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x45,0x78,0x70,0x69,0x72,0x65,0x73, +0x3a,0x20,0x46,0x72,0x69,0x2c,0x20,0x31,0x30,0x20,0x41,0x70,0x72,0x20,0x32,0x30, +0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, +0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, +0x65,0x0d,0x0a,0x0d,0x0a, +/* raw file data (9490 bytes) */ +0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0d, +0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e, +0x0d,0x0a,0x09,0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65, +0x74,0x3d,0x22,0x55,0x54,0x46,0x2d,0x38,0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x09,0x09, +0x3c,0x74,0x69,0x74,0x6c,0x65,0x3e,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x3c,0x2f, +0x74,0x69,0x74,0x6c,0x65,0x3e,0x0d,0x0a,0x09,0x09,0x3c,0x6c,0x69,0x6e,0x6b,0x20, +0x72,0x65,0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22, +0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x2f,0x63,0x73,0x73,0x22, +0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x63,0x73,0x73,0x2f,0x73,0x74,0x79,0x6c,0x65, +0x2e,0x63,0x73,0x73,0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x09,0x09,0x3c,0x73,0x63,0x72, +0x69,0x70,0x74,0x3e,0x0d,0x0a,0x09,0x09,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e, +0x20,0x24,0x28,0x69,0x64,0x29,0x20,0x7b,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20, +0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d, +0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x69,0x64,0x29,0x3b,0x20,0x7d,0x3b,0x0d, +0x0a,0x09,0x09,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x4f,0x64,0x6f,0x43, +0x6f,0x6e,0x66,0x69,0x67,0x43,0x61,0x6c,0x6c,0x62,0x61,0x63,0x6b,0x28,0x6f,0x29, +0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x69,0x66,0x20,0x28,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74, +0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x6f,0x2e,0x77,0x6c, +0x6d,0x6f,0x64,0x65,0x29,0x29,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e, +0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x6f, +0x2e,0x77,0x6c,0x6d,0x6f,0x64,0x65,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64, +0x20,0x3d,0x20,0x27,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x27,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x64, +0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65, +0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x6f,0x2e,0x63,0x61,0x6e,0x6d,0x6f,0x64,0x65, +0x29,0x29,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45, +0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x6f,0x2e,0x63,0x61,0x6e, +0x6d,0x6f,0x64,0x65,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x20,0x3d,0x20, +0x27,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x6a,0x73,0x6c,0x65,0x6e,0x67, +0x74,0x68,0x3d,0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x6a,0x73,0x32,0x20, +0x69,0x6e,0x20,0x6f,0x2e,0x63,0x61,0x6e,0x4d,0x65,0x73,0x67,0x29,0x7b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x6a,0x73,0x6c,0x65,0x6e,0x67,0x74,0x68,0x2b,0x2b,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x6f,0x54,0x61,0x62, +0x6c,0x65,0x20,0x3d,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65, +0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x6f,0x54, +0x61,0x62,0x6c,0x65,0x22,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x74,0x62,0x6f,0x64,0x79,0x20,0x3d, +0x20,0x6f,0x54,0x61,0x62,0x6c,0x65,0x2e,0x74,0x42,0x6f,0x64,0x69,0x65,0x73,0x5b, +0x30,0x5d,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x77,0x68,0x69,0x6c,0x65,0x20,0x28,0x6a,0x73,0x6c,0x65,0x6e,0x67,0x74,0x68, +0x20,0x21,0x3d,0x20,0x74,0x62,0x6f,0x64,0x79,0x2e,0x72,0x6f,0x77,0x73,0x2e,0x6c, +0x65,0x6e,0x67,0x74,0x68,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6a,0x73, +0x6c,0x65,0x6e,0x67,0x74,0x68,0x20,0x3e,0x20,0x74,0x62,0x6f,0x64,0x79,0x2e,0x72, +0x6f,0x77,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x29,0x20,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x61,0x64,0x64,0x52,0x6f,0x77,0x28,0x29,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20, +0x65,0x6c,0x73,0x65,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x65,0x6c,0x65, +0x74,0x65,0x52,0x6f,0x77,0x28,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x20, +0x3d,0x20,0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x76,0x61,0x72,0x20,0x62,0x20,0x3d,0x20,0x30,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x6c, +0x65,0x74,0x20,0x6a,0x20,0x69,0x6e,0x20,0x6f,0x2e,0x63,0x61,0x6e,0x4d,0x65,0x73, +0x67,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x6b,0x20,0x69,0x6e,0x20, +0x6f,0x2e,0x63,0x61,0x6e,0x4d,0x65,0x73,0x67,0x5b,0x6a,0x5d,0x29,0x20,0x7b,0x0d, 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62, +0x20,0x20,0x20,0x20,0x20,0x74,0x62,0x6f,0x64,0x79,0x2e,0x72,0x6f,0x77,0x73,0x5b, +0x61,0x5d,0x2e,0x63,0x65,0x6c,0x6c,0x73,0x5b,0x62,0x5d,0x2e,0x69,0x6e,0x6e,0x65, +0x72,0x48,0x54,0x4d,0x4c,0x20,0x3d,0x20,0x22,0x3c,0x64,0x69,0x76,0x20,0x63,0x6f, +0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d,0x27,0x74, +0x72,0x75,0x65,0x27,0x3e,0x22,0x20,0x2b,0x20,0x6f,0x2e,0x63,0x61,0x6e,0x4d,0x65, +0x73,0x67,0x5b,0x6a,0x5d,0x5b,0x6b,0x5d,0x20,0x2b,0x20,0x22,0x3c,0x2f,0x64,0x69, +0x76,0x3e,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x20,0x3d,0x20,0x62,0x20, +0x2b,0x20,0x31,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x61,0x20,0x2b, +0x20,0x31,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x62,0x20,0x3d,0x20,0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x67,0x54, +0x61,0x62,0x6c,0x65,0x20,0x3d,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e, +0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22, +0x67,0x54,0x61,0x62,0x6c,0x65,0x22,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x67,0x62,0x6f,0x64,0x79, +0x20,0x3d,0x20,0x67,0x54,0x61,0x62,0x6c,0x65,0x2e,0x74,0x42,0x6f,0x64,0x69,0x65, +0x73,0x5b,0x30,0x5d,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x6a,0x20,0x69,0x6e, +0x20,0x6f,0x2e,0x67,0x65,0x61,0x72,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x67,0x62,0x6f,0x64, +0x79,0x2e,0x72,0x6f,0x77,0x73,0x5b,0x61,0x5d,0x2e,0x63,0x65,0x6c,0x6c,0x73,0x5b, +0x31,0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x20,0x3d,0x20,0x22, +0x3c,0x64,0x69,0x76,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74, +0x61,0x62,0x6c,0x65,0x3d,0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x22,0x20,0x2b,0x20, +0x6f,0x2e,0x67,0x65,0x61,0x72,0x5b,0x6a,0x5d,0x20,0x2b,0x20,0x22,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x61,0x20,0x2b,0x20,0x31, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, +0x0d,0x0a,0x09,0x09,0x7d,0x3b,0x0d,0x0a,0x09,0x09,0x66,0x75,0x6e,0x63,0x74,0x69, +0x6f,0x6e,0x20,0x61,0x64,0x64,0x52,0x6f,0x77,0x28,0x29,0x7b,0x0d,0x0a,0x09,0x09, +0x09,0x76,0x61,0x72,0x20,0x6f,0x54,0x61,0x62,0x6c,0x65,0x20,0x3d,0x20,0x64,0x6f, +0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e, +0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x6f,0x54,0x61,0x62,0x6c,0x65,0x22,0x29,0x3b, +0x0d,0x0a,0x09,0x09,0x09,0x76,0x61,0x72,0x20,0x74,0x62,0x6f,0x64,0x79,0x20,0x3d, +0x20,0x6f,0x54,0x61,0x62,0x6c,0x65,0x2e,0x74,0x42,0x6f,0x64,0x69,0x65,0x73,0x5b, +0x30,0x5d,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x74,0x62,0x6f,0x64,0x79,0x2e,0x72,0x6f,0x77,0x73,0x2e, +0x6c,0x65,0x6e,0x67,0x74,0x68,0x20,0x3c,0x20,0x33,0x29,0x20,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76, +0x61,0x72,0x20,0x74,0x72,0x20,0x3d,0x20,0x74,0x62,0x6f,0x64,0x79,0x2e,0x69,0x6e, +0x73,0x65,0x72,0x74,0x52,0x6f,0x77,0x28,0x74,0x62,0x6f,0x64,0x79,0x2e,0x72,0x6f, +0x77,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72, +0x20,0x74,0x64,0x5f,0x30,0x20,0x3d,0x20,0x74,0x72,0x2e,0x69,0x6e,0x73,0x65,0x72, +0x74,0x43,0x65,0x6c,0x6c,0x28,0x30,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x64,0x5f,0x30,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x20,0x3d,0x20,0x22,0x3c,0x64,0x69, +0x76,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c, +0x65,0x3d,0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x74,0x64,0x5f,0x31,0x20,0x3d,0x20,0x74,0x72, +0x2e,0x69,0x6e,0x73,0x65,0x72,0x74,0x43,0x65,0x6c,0x6c,0x28,0x31,0x29,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x74,0x64,0x5f,0x31,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x20, +0x3d,0x20,0x22,0x3c,0x64,0x69,0x76,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65, +0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d,0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x3c, +0x2f,0x64,0x69,0x76,0x3e,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x74,0x64,0x5f, +0x32,0x20,0x3d,0x20,0x74,0x72,0x2e,0x69,0x6e,0x73,0x65,0x72,0x74,0x43,0x65,0x6c, +0x6c,0x28,0x32,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x64,0x5f,0x32,0x2e,0x69,0x6e,0x6e,0x65, +0x72,0x48,0x54,0x4d,0x4c,0x20,0x3d,0x20,0x22,0x3c,0x64,0x69,0x76,0x20,0x63,0x6f, +0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d,0x27,0x74, +0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76, +0x61,0x72,0x20,0x74,0x64,0x5f,0x33,0x20,0x3d,0x20,0x74,0x72,0x2e,0x69,0x6e,0x73, +0x65,0x72,0x74,0x43,0x65,0x6c,0x6c,0x28,0x33,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x64,0x5f, +0x33,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x20,0x3d,0x20,0x22,0x3c, +0x64,0x69,0x76,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61, +0x62,0x6c,0x65,0x3d,0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x64,0x69,0x76, +0x3e,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x74,0x64,0x5f,0x34,0x20,0x3d,0x20, +0x74,0x72,0x2e,0x69,0x6e,0x73,0x65,0x72,0x74,0x43,0x65,0x6c,0x6c,0x28,0x34,0x29, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x74,0x64,0x5f,0x34,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d, +0x4c,0x20,0x3d,0x20,0x22,0x3c,0x64,0x69,0x76,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e, +0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d,0x27,0x74,0x72,0x75,0x65,0x27, +0x3e,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x74, +0x64,0x5f,0x35,0x20,0x3d,0x20,0x74,0x72,0x2e,0x69,0x6e,0x73,0x65,0x72,0x74,0x43, +0x65,0x6c,0x6c,0x28,0x35,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x64,0x5f,0x35,0x2e,0x69,0x6e, +0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x20,0x3d,0x20,0x22,0x3c,0x64,0x69,0x76,0x20, +0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d, +0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x76,0x61,0x72,0x20,0x74,0x64,0x5f,0x36,0x20,0x3d,0x20,0x74,0x72,0x2e,0x69, +0x6e,0x73,0x65,0x72,0x74,0x43,0x65,0x6c,0x6c,0x28,0x36,0x29,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74, +0x64,0x5f,0x36,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x20,0x3d,0x20, +0x22,0x3c,0x64,0x69,0x76,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69, +0x74,0x61,0x62,0x6c,0x65,0x3d,0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x74,0x64,0x5f,0x37,0x20, +0x3d,0x20,0x74,0x72,0x2e,0x69,0x6e,0x73,0x65,0x72,0x74,0x43,0x65,0x6c,0x6c,0x28, +0x37,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x74,0x64,0x5f,0x37,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48, +0x54,0x4d,0x4c,0x20,0x3d,0x20,0x22,0x3c,0x64,0x69,0x76,0x20,0x63,0x6f,0x6e,0x74, +0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d,0x27,0x74,0x72,0x75, +0x65,0x27,0x3e,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72, +0x20,0x74,0x64,0x5f,0x38,0x20,0x3d,0x20,0x74,0x72,0x2e,0x69,0x6e,0x73,0x65,0x72, +0x74,0x43,0x65,0x6c,0x6c,0x28,0x38,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x64,0x5f,0x38,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x20,0x3d,0x20,0x22,0x3c,0x64,0x69, +0x76,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c, +0x65,0x3d,0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x22, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, +0x0d,0x0a,0x09,0x09,0x7d,0x0d,0x0a,0x09,0x09,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f, +0x6e,0x20,0x64,0x65,0x6c,0x65,0x74,0x65,0x52,0x6f,0x77,0x28,0x29,0x7b,0x0d,0x0a, +0x09,0x09,0x09,0x76,0x61,0x72,0x20,0x6f,0x54,0x61,0x62,0x6c,0x65,0x20,0x3d,0x20, +0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d, +0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x6f,0x54,0x61,0x62,0x6c,0x65,0x22, +0x29,0x3b,0x0d,0x0a,0x09,0x09,0x09,0x76,0x61,0x72,0x20,0x74,0x62,0x6f,0x64,0x79, +0x20,0x3d,0x20,0x6f,0x54,0x61,0x62,0x6c,0x65,0x2e,0x74,0x42,0x6f,0x64,0x69,0x65, +0x73,0x5b,0x30,0x5d,0x3b,0x0d,0x0a,0x09,0x09,0x09,0x74,0x62,0x6f,0x64,0x79,0x2e, +0x64,0x65,0x6c,0x65,0x74,0x65,0x52,0x6f,0x77,0x28,0x74,0x62,0x6f,0x64,0x79,0x2e, +0x72,0x6f,0x77,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x2d,0x31,0x29,0x3b,0x0d, +0x0a,0x09,0x09,0x7d,0x0d,0x0a,0x09,0x09,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74, +0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x09,0x3c,0x62, +0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x22,0x3e,0x0d, +0x0a,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61, +0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f, +0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x20,0x20,0x0d,0x0a,0x09,0x09,0x09,0x09, +0x09,0x3c,0x68,0x31,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75, +0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x4d, +0x45,0x4e,0x55,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f, +0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x75,0x6c, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x6f,0x64, +0x79,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e, +0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x4e,0x74,0x72,0x69,0x70,0x43,0x66, +0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4e,0x54,0x52,0x49,0x50,0x20,0x53,0x65, +0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a, +0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72, +0x65,0x66,0x3d,0x22,0x55,0x73,0x65,0x72,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d, +0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09, +0x09,0x09,0x55,0x73,0x65,0x72,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61, +0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09, +0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d, +0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65, +0x66,0x3d,0x22,0x4f,0x64,0x6f,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, +0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65, +0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x64,0x6f,0x20,0x43,0x6f, +0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c, +0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22, +0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x45,0x74,0x68,0x43,0x66,0x67, +0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d, +0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d, +0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20, +0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20, +0x68,0x72,0x65,0x66,0x3d,0x22,0x44,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f, +0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d, +0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d, +0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e, +0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09, +0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d, +0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x6f,0x70,0x65,0x6e,0x72,0x74,0x6b, +0x2e,0x72,0x65,0x61,0x64,0x74,0x68,0x65,0x64,0x6f,0x63,0x73,0x2e,0x69,0x6f,0x2f, +0x65,0x6e,0x2f,0x6c,0x61,0x74,0x65,0x73,0x74,0x2f,0x22,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e, +0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x70,0x65,0x6e,0x52, +0x54,0x4b,0x33,0x33,0x30,0x20,0x4d,0x61,0x6e,0x75,0x61,0x6c,0x3c,0x2f,0x61,0x3e, +0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x09,0x09,0x09, +0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74, +0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x65,0x61, +0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f, +0x70,0x73,0x2d,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x68,0x31,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x4f,0x70,0x65, +0x6e,0x52,0x54,0x4b,0x20,0x3c,0x73,0x70,0x61,0x6e,0x3e,0x45,0x6d,0x62,0x65,0x64, +0x64,0x65,0x64,0x20,0x77,0x65,0x62,0x73,0x65,0x72,0x76,0x65,0x72,0x3c,0x2f,0x73, +0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61, +0x64,0x65,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6e,0x61,0x76,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x63,0x66,0x67,0x22,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x63,0x66,0x67,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x43,0x41,0x4e,0x20,0x4d, +0x65,0x73,0x73,0x61,0x67,0x65,0x20,0x4d,0x6f,0x64,0x65,0x3c,0x2f,0x64,0x69,0x76, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x69,0x64, +0x3d,0x22,0x6f,0x54,0x61,0x62,0x6c,0x65,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d, +0x22,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f, +0x72,0x3a,0x23,0x65,0x65,0x65,0x65,0x65,0x65,0x3b,0x22,0x20,0x62,0x6f,0x72,0x64, +0x65,0x72,0x63,0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x23,0x61,0x61,0x61,0x61,0x61,0x61, +0x22,0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x31,0x22,0x20,0x63,0x65,0x6c, +0x6c,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3d,0x22,0x30,0x22,0x20,0x77,0x69,0x64, +0x74,0x68,0x3d,0x22,0x37,0x30,0x30,0x70,0x78,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x68,0x20,0x77,0x69,0x64,0x74, +0x68,0x3d,0x22,0x31,0x30,0x30,0x70,0x78,0x22,0x3e,0x4d,0x65,0x73,0x67,0x49,0x44, +0x3c,0x2f,0x74,0x68,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x74,0x68,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x35, +0x70,0x78,0x22,0x3e,0x53,0x74,0x61,0x72,0x74,0x62,0x69,0x74,0x3c,0x2f,0x74,0x68, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x74,0x68,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x35,0x70,0x78,0x22,0x3e, +0x4c,0x65,0x6e,0x67,0x74,0x68,0x3c,0x2f,0x74,0x68,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x68,0x20,0x77,0x69,0x64, +0x74,0x68,0x3d,0x22,0x37,0x35,0x70,0x78,0x22,0x3e,0x45,0x6e,0x64,0x69,0x61,0x6e, +0x3c,0x2f,0x74,0x68,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x74,0x68,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x35, +0x70,0x78,0x22,0x3e,0x53,0x69,0x67,0x6e,0x3c,0x2f,0x74,0x68,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x68,0x20,0x77, +0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x35,0x70,0x78,0x22,0x3e,0x46,0x61,0x63,0x74, +0x6f,0x72,0x3c,0x2f,0x74,0x68,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x68,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22, +0x37,0x35,0x70,0x78,0x22,0x3e,0x4f,0x66,0x66,0x73,0x65,0x74,0x3c,0x2f,0x74,0x68, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x74,0x68,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x35,0x70,0x78,0x22,0x3e, +0x55,0x6e,0x69,0x74,0x3c,0x2f,0x74,0x68,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x68,0x20,0x77,0x69,0x64,0x74,0x68, +0x3d,0x22,0x37,0x35,0x70,0x78,0x22,0x3e,0x53,0x6f,0x75,0x72,0x63,0x65,0x3c,0x2f, +0x74,0x68,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74, +0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x68, +0x65,0x61,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74, +0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x2f,0x74,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74, +0x61,0x62,0x6c,0x65,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20, +0x6f,0x6e,0x43,0x6c,0x69,0x63,0x6b,0x3d,0x22,0x61,0x64,0x64,0x52,0x6f,0x77,0x28, +0x29,0x3b,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x77,0x69,0x64,0x74,0x68, +0x3a,0x32,0x30,0x70,0x78,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a, +0x31,0x36,0x70,0x78,0x3b,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x2b,0x22, +0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, +0x79,0x70,0x65,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x6f,0x6e,0x43, +0x6c,0x69,0x63,0x6b,0x3d,0x22,0x64,0x65,0x6c,0x65,0x74,0x65,0x52,0x6f,0x77,0x28, +0x29,0x3b,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x77,0x69,0x64,0x74,0x68, +0x3a,0x32,0x30,0x70,0x78,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a, +0x31,0x36,0x70,0x78,0x3b,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x2d,0x22, +0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x3c,0x62,0x72,0x3e, +0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x69, +0x64,0x3d,0x22,0x67,0x54,0x61,0x62,0x6c,0x65,0x22,0x20,0x73,0x74,0x79,0x6c,0x65, +0x3d,0x22,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c, +0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x65,0x65,0x65,0x3b,0x22,0x20,0x62,0x6f,0x72, +0x64,0x65,0x72,0x63,0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x23,0x61,0x61,0x61,0x61,0x61, +0x61,0x22,0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x31,0x22,0x20,0x63,0x65, +0x6c,0x6c,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3d,0x22,0x32,0x22,0x20,0x77,0x69, +0x64,0x74,0x68,0x3d,0x22,0x31,0x35,0x30,0x70,0x78,0x22,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x68,0x20,0x77,0x69,0x64, +0x74,0x68,0x3d,0x22,0x37,0x35,0x70,0x78,0x22,0x3e,0x47,0x65,0x61,0x72,0x3c,0x2f, +0x74,0x68,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x74,0x68,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x35,0x70,0x78, +0x22,0x3e,0x56,0x61,0x6c,0x75,0x65,0x3c,0x2f,0x74,0x68,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x72,0x3e, +0x3c,0x74,0x64,0x3e,0x50,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x63,0x6f, +0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d,0x27,0x74, +0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x72, +0x3e,0x3c,0x74,0x64,0x3e,0x52,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x63, +0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d,0x27, +0x74,0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74, +0x72,0x3e,0x3c,0x74,0x64,0x3e,0x4e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20, +0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65,0x3d, +0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x74,0x72,0x3e,0x3c,0x74,0x64,0x3e,0x44,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64, +0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x65,0x64,0x69,0x74,0x61,0x62,0x6c,0x65, +0x3d,0x27,0x74,0x72,0x75,0x65,0x27,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74, +0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x62, +0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c, +0x65,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x3c,0x62,0x72,0x3e, +0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x48,0x61, +0x72,0x64,0x77,0x61,0x72,0x65,0x20,0x4d,0x6f,0x64,0x65,0x3c,0x2f,0x64,0x69,0x76, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x69,0x64,0x3d, +0x27,0x4f,0x64,0x6f,0x43,0x6f,0x6e,0x66,0x69,0x67,0x27,0x20,0x6d,0x65,0x74,0x68, +0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e, +0x3d,0x27,0x4f,0x64,0x6f,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x63,0x67,0x69,0x27, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x61,0x62, 0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f, -0x6e,0x74,0x72,0x69,0x70,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x41, -0x70,0x69,0x6b,0x65,0x79,0x27,0x3e,0x50,0x41,0x53,0x53,0x57,0x4f,0x52,0x44,0x3a, -0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, -0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74, -0x78,0x74,0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x27,0x20,0x6e,0x61,0x6d,0x65, -0x3d,0x27,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x27,0x20,0x73,0x69,0x7a,0x65, -0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x09, -0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, -0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70, -0x22,0x3e,0x4e,0x54,0x52,0x49,0x50,0x20,0x53,0x54,0x41,0x54,0x55,0x53,0x3a,0x3c, -0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d, -0x22,0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, -0x22,0x63,0x66,0x67,0x63,0x62,0x22,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x6e,0x74,0x72, -0x69,0x70,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65, -0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c, -0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, -0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6e,0x74,0x72,0x69,0x70,0x22,0x3e,0x42,0x41,0x53, -0x45,0x20,0x53,0x54,0x41,0x54,0x55,0x53,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c, -0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x73,0x74,0x72,0x65,0x61, -0x6d,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22, -0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x6e,0x74,0x72,0x69,0x70,0x53,0x74,0x72,0x65,0x61, -0x6d,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d, -0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22, -0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0d,0x0a,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x69, -0x6e,0x70,0x75,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74, -0x6f,0x6e,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69,0x74, -0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x53,0x41,0x56,0x45,0x27,0x20,0x2f, -0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x77,0x68,0x65,0x65,0x6c,0x74,0x69,0x63,0x6b,0x22,0x3e,0x50,0x49,0x4e,0x20,0x4d, +0x6f,0x64,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74, +0x79,0x6c,0x65,0x3d,0x27,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74, +0x3a,0x30,0x70,0x78,0x27,0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x57, +0x68,0x65,0x65,0x6c,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x77,0x6c,0x6d,0x6f, +0x64,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x57,0x48,0x45,0x45,0x4c, +0x54,0x49,0x43,0x4b,0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x65,0x78,0x74,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22,0x3e,0x57,0x48,0x45,0x45,0x4c,0x54, +0x49,0x43,0x4b,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, +0x79,0x70,0x65,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74,0x79,0x6c, +0x65,0x3d,0x27,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x33, +0x70,0x78,0x27,0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x53,0x50,0x49, +0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x77,0x6c,0x6d,0x6f,0x64,0x65,0x22,0x20, +0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x53,0x50,0x49,0x5f,0x4e,0x53,0x53,0x22,0x20, +0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x74,0x65,0x78,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67, +0x63,0x62,0x22,0x3e,0x53,0x50,0x49,0x5f,0x4e,0x53,0x53,0x3c,0x2f,0x74,0x65,0x78, +0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x70,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x61,0x62,0x65, +0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x77, +0x68,0x65,0x65,0x6c,0x74,0x69,0x63,0x6b,0x22,0x3e,0x43,0x41,0x4e,0x20,0x4d,0x6f, +0x64,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20, +0x74,0x79,0x70,0x65,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74,0x79, +0x6c,0x65,0x3d,0x27,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a, +0x30,0x70,0x78,0x27,0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x43,0x41, +0x52,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x63,0x61,0x6e,0x6d,0x6f,0x64,0x65, +0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x43,0x41,0x52,0x22,0x20,0x2f,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74, +0x65,0x78,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62, +0x22,0x3e,0x43,0x41,0x52,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74, +0x79,0x6c,0x65,0x3d,0x27,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74, +0x3a,0x33,0x70,0x78,0x27,0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x4a, +0x31,0x39,0x33,0x39,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x63,0x61,0x6e,0x6d, +0x6f,0x64,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x4a,0x31,0x39,0x33, +0x39,0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x74,0x65,0x78,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x63,0x66,0x67,0x63,0x62,0x22,0x3e,0x4a,0x31,0x39,0x33,0x39,0x3c,0x2f,0x74,0x65, +0x78,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x70, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,0x69,0x64, +0x3d,0x22,0x63,0x61,0x6e,0x4d,0x65,0x73,0x67,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d, +0x22,0x63,0x61,0x6e,0x4d,0x65,0x73,0x67,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d, +0x22,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x22,0x2f,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,0x69,0x64,0x3d, +0x22,0x67,0x65,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x67,0x65,0x61, +0x72,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x64,0x69,0x73,0x70,0x6c,0x61, +0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x22,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, -0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64, +0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74, +0x6f,0x6e,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70, +0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62, +0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x62,0x75,0x74, +0x74,0x6f,0x6e,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x53,0x41,0x56,0x45, +0x27,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65,0x22,0x2f,0x3e,0x3c,0x2f,0x70, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, -0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x6e, -0x61,0x76,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d, -0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f, -0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20,0x2d,0x2d,0x3e, -0x0d,0x0a,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f, -0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2d,0x2d,0x3e,0x0d,0x0a,0x09, -0x09,0x0d,0x0a,0x09,0x09,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70, -0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69, -0x70,0x74,0x27,0x20,0x73,0x72,0x63,0x3d,0x27,0x4e,0x74,0x72,0x69,0x70,0x43,0x6f, -0x6e,0x66,0x69,0x67,0x2e,0x6a,0x73,0x27,0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70, -0x74,0x3e,0x0d,0x0a,0x09,0x09,0x0d,0x0a,0x09,0x09,0x3c,0x2f,0x73,0x63,0x72,0x69, -0x70,0x74,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c, -0x2f,0x68,0x74,0x6d,0x6c,0x3e,}; +0x2f,0x6e,0x61,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63, +0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2d,0x2d,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65, +0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x22,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x61,0x76, +0x65,0x2e,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x20,0x3d,0x20,0x66,0x75,0x6e,0x63, +0x74,0x69,0x6f,0x6e,0x28,0x29,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x74,0x72,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x72,0x61,0x79,0x4c,0x69,0x73,0x74,0x20, +0x3d,0x20,0x5b,0x5d,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x76,0x61,0x72,0x20, +0x69,0x3d,0x31,0x3b,0x20,0x69,0x3c,0x6f,0x54,0x61,0x62,0x6c,0x65,0x2e,0x72,0x6f, +0x77,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x7b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x64,0x61,0x74,0x65,0x20,0x3d, +0x20,0x7b,0x7d,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x72,0x20,0x3d,0x20,0x6f, +0x54,0x61,0x62,0x6c,0x65,0x2e,0x72,0x6f,0x77,0x73,0x5b,0x69,0x5d,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x64,0x61,0x74,0x65,0x2e,0x4d,0x65,0x73,0x67,0x49,0x44,0x20, +0x3d,0x20,0x74,0x72,0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b, +0x30,0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x64,0x61,0x74,0x65,0x2e,0x53,0x74,0x61,0x72,0x74,0x42,0x69,0x74, +0x20,0x3d,0x20,0x74,0x72,0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73, +0x5b,0x31,0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x64,0x61,0x74,0x65,0x2e,0x4c,0x65,0x6e,0x67,0x74,0x68,0x20, +0x3d,0x20,0x74,0x72,0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b, +0x32,0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x64,0x61,0x74,0x65,0x2e,0x45,0x6e,0x64,0x69,0x61,0x6e,0x20,0x3d, +0x20,0x74,0x72,0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b,0x33, +0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x64,0x61,0x74,0x65,0x2e,0x53,0x69,0x67,0x6e,0x20,0x3d,0x20,0x74,0x72, +0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b,0x34,0x5d,0x2e,0x69, +0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64, +0x61,0x74,0x65,0x2e,0x46,0x61,0x63,0x74,0x6f,0x72,0x20,0x3d,0x20,0x74,0x72,0x2e, +0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b,0x35,0x5d,0x2e,0x69,0x6e, +0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x61, +0x74,0x65,0x2e,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x74,0x72,0x2e,0x63, +0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b,0x36,0x5d,0x2e,0x69,0x6e,0x6e, +0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x61,0x74, +0x65,0x2e,0x55,0x6e,0x69,0x74,0x20,0x3d,0x20,0x74,0x72,0x2e,0x63,0x68,0x69,0x6c, +0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b,0x37,0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54, +0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x61,0x74,0x65,0x2e,0x53, +0x6f,0x75,0x72,0x63,0x65,0x20,0x3d,0x20,0x74,0x72,0x2e,0x63,0x68,0x69,0x6c,0x64, +0x4e,0x6f,0x64,0x65,0x73,0x5b,0x38,0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65, +0x78,0x74,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x72,0x61,0x79,0x4c,0x69, +0x73,0x74,0x2e,0x70,0x75,0x73,0x68,0x28,0x64,0x61,0x74,0x65,0x29,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x6a,0x73,0x6f,0x6e,0x53,0x74,0x72,0x69,0x6e, +0x67,0x20,0x3d,0x20,0x4a,0x53,0x4f,0x4e,0x2e,0x73,0x74,0x72,0x69,0x6e,0x67,0x69, +0x66,0x79,0x28,0x61,0x72,0x72,0x61,0x79,0x4c,0x69,0x73,0x74,0x29,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d, +0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x27,0x63,0x61,0x6e,0x4d,0x65,0x73,0x67, +0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6a,0x73,0x6f,0x6e,0x53, +0x74,0x72,0x69,0x6e,0x67,0x3b,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x64,0x61, +0x74,0x65,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x61,0x74,0x65,0x2e,0x50, +0x20,0x3d,0x20,0x67,0x54,0x61,0x62,0x6c,0x65,0x2e,0x72,0x6f,0x77,0x73,0x5b,0x31, +0x5d,0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b,0x31,0x5d,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x61,0x74,0x65, +0x2e,0x52,0x20,0x3d,0x20,0x67,0x54,0x61,0x62,0x6c,0x65,0x2e,0x72,0x6f,0x77,0x73, +0x5b,0x32,0x5d,0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73,0x5b,0x31, +0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x61, +0x74,0x65,0x2e,0x4e,0x20,0x3d,0x20,0x67,0x54,0x61,0x62,0x6c,0x65,0x2e,0x72,0x6f, +0x77,0x73,0x5b,0x33,0x5d,0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64,0x65,0x73, +0x5b,0x31,0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x64,0x61,0x74,0x65,0x2e,0x44,0x20,0x3d,0x20,0x67,0x54,0x61,0x62,0x6c,0x65,0x2e, +0x72,0x6f,0x77,0x73,0x5b,0x34,0x5d,0x2e,0x63,0x68,0x69,0x6c,0x64,0x4e,0x6f,0x64, +0x65,0x73,0x5b,0x31,0x5d,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x6a,0x73,0x6f,0x6e,0x53,0x74,0x72,0x69,0x6e,0x67,0x20,0x3d,0x20,0x4a, +0x53,0x4f,0x4e,0x2e,0x73,0x74,0x72,0x69,0x6e,0x67,0x69,0x66,0x79,0x28,0x64,0x61, +0x74,0x65,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67, +0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x27,0x67, +0x65,0x61,0x72,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6a,0x73, +0x6f,0x6e,0x53,0x74,0x72,0x69,0x6e,0x67,0x3b,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x4f,0x64,0x6f, +0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x73,0x75,0x62,0x6d,0x69,0x74,0x28,0x29,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d, +0x0a,0x09,0x09,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x09,0x09, +0x0d,0x0a,0x09,0x09,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65, +0x3d,0x27,0x74,0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70, +0x74,0x27,0x20,0x73,0x72,0x63,0x3d,0x27,0x4f,0x64,0x6f,0x43,0x6f,0x6e,0x66,0x69, +0x67,0x2e,0x6a,0x73,0x27,0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d, +0x0a,0x09,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d, +0x6c,0x3e,}; -static const unsigned int dummy_align__UserCfg_shtml = 5; +static const unsigned int dummy_align__UserCfg_shtml = 6; static const unsigned char data__UserCfg_shtml[] = { /* /UserCfg.shtml (15 chars) */ 0x2f,0x55,0x73,0x65,0x72,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x00,0x00, @@ -1836,7 +2490,7 @@ Pragma: no-cache 0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, 0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, 0x65,0x0d,0x0a,0x0d,0x0a, -/* raw file data (4640 bytes) */ +/* raw file data (4749 bytes) */ 0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0d, 0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e, 0x0d,0x0a,0x09,0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65, @@ -1936,198 +2590,204 @@ Pragma: no-cache 0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e, 0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20, 0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d, -0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x45,0x74,0x68,0x43,0x66, +0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x4f,0x64,0x6f,0x43,0x66, 0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, 0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e, -0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74, -0x20,0x53,0x65,0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69, -0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73, -0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61, -0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x44,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66, -0x6f,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, -0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e, -0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49, -0x6e,0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09, -0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65, -0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66, -0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x6f,0x70,0x65,0x6e,0x72,0x74, -0x6b,0x2e,0x72,0x65,0x61,0x64,0x74,0x68,0x65,0x64,0x6f,0x63,0x73,0x2e,0x69,0x6f, -0x2f,0x65,0x6e,0x2f,0x6c,0x61,0x74,0x65,0x73,0x74,0x2f,0x22,0x20,0x63,0x6c,0x61, -0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, -0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x70,0x65,0x6e, -0x52,0x54,0x4b,0x33,0x33,0x30,0x20,0x4d,0x61,0x6e,0x75,0x61,0x6c,0x3c,0x2f,0x61, -0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c, -0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x09,0x09, -0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e, -0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09, -0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e, -0x74,0x65,0x6e,0x74,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x65, -0x61,0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72, -0x6f,0x70,0x73,0x2d,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x0d,0x0a,0x09,0x09, -0x09,0x09,0x09,0x09,0x3c,0x68,0x31,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20, -0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x20,0x3c,0x73,0x70,0x61,0x6e,0x3e,0x45,0x6d, -0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x77,0x65,0x62,0x73,0x65,0x72,0x76,0x65,0x72, -0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x09, -0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a,0x09,0x09, -0x09,0x09,0x09,0x3c,0x6e,0x61,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63, -0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x63,0x66,0x67,0x22,0x3e,0x0d,0x0a,0x20,0x20, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x64,0x6f,0x20,0x43,0x6f,0x6e,0x66, +0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c, +0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c, +0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x45,0x74,0x68,0x43,0x66,0x67,0x2e,0x73, +0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09, +0x09,0x09,0x09,0x09,0x09,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20,0x53,0x65, +0x74,0x74,0x69,0x6e,0x67,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a, +0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72, +0x65,0x66,0x3d,0x22,0x44,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73, +0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x09, +0x09,0x09,0x09,0x09,0x09,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f, +0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09, +0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f, +0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68, +0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x6f,0x70,0x65,0x6e,0x72,0x74,0x6b,0x2e,0x72, +0x65,0x61,0x64,0x74,0x68,0x65,0x64,0x6f,0x63,0x73,0x2e,0x69,0x6f,0x2f,0x65,0x6e, +0x2f,0x6c,0x61,0x74,0x65,0x73,0x74,0x2f,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22, +0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b, +0x33,0x33,0x30,0x20,0x4d,0x61,0x6e,0x75,0x61,0x6c,0x3c,0x2f,0x61,0x3e,0x3c,0x2f, +0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c,0x3e,0x0d,0x0a, +0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x64, +0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e, +0x74,0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x64, +0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e, +0x74,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65, +0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73, +0x2d,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09, +0x09,0x3c,0x68,0x31,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x4f,0x70,0x65, +0x6e,0x52,0x54,0x4b,0x20,0x3c,0x73,0x70,0x61,0x6e,0x3e,0x45,0x6d,0x62,0x65,0x64, +0x64,0x65,0x64,0x20,0x77,0x65,0x62,0x73,0x65,0x72,0x76,0x65,0x72,0x3c,0x2f,0x73, +0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09, +0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09, +0x3c,0x6e,0x61,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72, +0x6f,0x70,0x73,0x2d,0x63,0x66,0x67,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73, -0x3d,0x22,0x63,0x66,0x67,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x55,0x73,0x65,0x72, -0x20,0x50,0x61,0x72,0x61,0x6d,0x65,0x74,0x65,0x72,0x73,0x3c,0x2f,0x64,0x69,0x76, -0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d, -0x20,0x69,0x64,0x3d,0x27,0x55,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x27, -0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27,0x20,0x61, -0x63,0x74,0x69,0x6f,0x6e,0x3d,0x27,0x55,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69, -0x67,0x2e,0x63,0x67,0x69,0x27,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c, -0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, -0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d, -0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79, -0x70,0x65,0x27,0x3e,0x55,0x73,0x65,0x72,0x5f,0x50,0x61,0x63,0x6b,0x65,0x74,0x5f, -0x54,0x79,0x70,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e, -0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20, -0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65, -0x74,0x54,0x79,0x70,0x65,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x75,0x73,0x65, -0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27,0x20,0x73,0x69,0x7a, -0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63, +0x66,0x67,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x55,0x73,0x65,0x72,0x20,0x50,0x61, +0x72,0x61,0x6d,0x65,0x74,0x65,0x72,0x73,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, -0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73, -0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72, -0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x27,0x3e,0x55,0x73,0x65,0x72, -0x5f,0x50,0x61,0x63,0x6b,0x65,0x74,0x5f,0x52,0x61,0x74,0x65,0x3a,0x3c,0x2f,0x6c, -0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, -0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x55, -0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x27,0x20,0x6e, -0x61,0x6d,0x65,0x3d,0x27,0x75,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x52, -0x61,0x74,0x65,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f, -0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, -0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, -0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d, -0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x3e, -0x4c,0x65,0x76,0x65,0x6c,0x5f,0x41,0x72,0x6d,0x5f,0x42,0x78,0x3a,0x3c,0x2f,0x6c, -0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, -0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x4c, -0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, -0x27,0x6c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x20,0x73,0x69,0x7a, -0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x69,0x64, +0x3d,0x27,0x55,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x27,0x20,0x6d,0x65, +0x74,0x68,0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27,0x20,0x61,0x63,0x74,0x69, +0x6f,0x6e,0x3d,0x27,0x55,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x63, +0x67,0x69,0x27,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x70,0x3e,0x3c, +0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, +0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78, +0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27, +0x3e,0x55,0x73,0x65,0x72,0x5f,0x50,0x61,0x63,0x6b,0x65,0x74,0x5f,0x54,0x79,0x70, +0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d, +0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79, +0x70,0x65,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x75,0x73,0x65,0x72,0x50,0x61, +0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27, +0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, -0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73, -0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65, -0x72,0x41,0x72,0x6d,0x42,0x79,0x27,0x3e,0x4c,0x65,0x76,0x65,0x6c,0x5f,0x41,0x72, -0x6d,0x5f,0x42,0x79,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e, -0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20, -0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42, -0x79,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x6c,0x65,0x76,0x65,0x72,0x41,0x72, -0x6d,0x42,0x79,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f, -0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, -0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, -0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d, -0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x7a,0x27,0x3e, -0x4c,0x65,0x76,0x65,0x6c,0x5f,0x41,0x72,0x6d,0x5f,0x42,0x7a,0x3a,0x3c,0x2f,0x6c, -0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, -0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x4c, -0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x7a,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, -0x27,0x6c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x7a,0x27,0x20,0x73,0x69,0x7a, -0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22, +0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63, +0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x27,0x3e,0x55,0x73,0x65,0x72,0x5f,0x50,0x61, +0x63,0x6b,0x65,0x74,0x5f,0x52,0x61,0x74,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, +0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, +0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72, +0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x27,0x20,0x6e,0x61,0x6d,0x65, +0x3d,0x27,0x75,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65, +0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f, +0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c, +0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, +0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78, +0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x3e,0x4c,0x65,0x76, +0x65,0x6c,0x5f,0x41,0x72,0x6d,0x5f,0x42,0x78,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, +0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, +0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65, +0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x6c,0x65, +0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27, +0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, -0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73, -0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e, -0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x78,0x27,0x3e,0x50, -0x6f,0x69,0x6e,0x74,0x5f,0x4f,0x66,0x5f,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74, -0x5f,0x42,0x78,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, -0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, -0x64,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74, -0x65,0x72,0x65,0x73,0x74,0x42,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x70, -0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x78, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22, +0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72, +0x6d,0x42,0x79,0x27,0x3e,0x4c,0x65,0x76,0x65,0x6c,0x5f,0x41,0x72,0x6d,0x5f,0x42, +0x79,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d, +0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x79,0x27,0x20, +0x6e,0x61,0x6d,0x65,0x3d,0x27,0x6c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x79, 0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f, 0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c, 0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, 0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78, -0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74, -0x42,0x79,0x27,0x3e,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x4f,0x66,0x5f,0x49,0x6e,0x74, -0x65,0x72,0x65,0x73,0x74,0x5f,0x42,0x79,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c, -0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65, -0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74, -0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x79,0x27,0x20,0x6e,0x61, -0x6d,0x65,0x3d,0x27,0x70,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72, -0x65,0x73,0x74,0x42,0x79,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27, +0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x7a,0x27,0x3e,0x4c,0x65,0x76, +0x65,0x6c,0x5f,0x41,0x72,0x6d,0x5f,0x42,0x7a,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, +0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, +0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65, +0x72,0x41,0x72,0x6d,0x42,0x7a,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x6c,0x65, +0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x7a,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27, +0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22, +0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66, +0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x78,0x27,0x3e,0x50,0x6f,0x69,0x6e, +0x74,0x5f,0x4f,0x66,0x5f,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x5f,0x42,0x78, +0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20, +0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27, +0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65, +0x73,0x74,0x42,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x70,0x6f,0x69,0x6e, +0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x78,0x27,0x20,0x73, +0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62, +0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f, +0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f, +0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x79,0x27, +0x3e,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x4f,0x66,0x5f,0x49,0x6e,0x74,0x65,0x72,0x65, +0x73,0x74,0x5f,0x42,0x79,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69, +0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27, +0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49, +0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x79,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, +0x27,0x70,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74, +0x42,0x79,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70, +0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c, +0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27, +0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65, +0x73,0x74,0x42,0x7a,0x27,0x3e,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x4f,0x66,0x5f,0x49, +0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x5f,0x42,0x7a,0x3a,0x3c,0x2f,0x6c,0x61,0x62, +0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27, +0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x69, +0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x7a,0x27,0x20, +0x6e,0x61,0x6d,0x65,0x3d,0x27,0x70,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74, +0x65,0x72,0x65,0x73,0x74,0x42,0x7a,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31, +0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20, +0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e, +0x52,0x62,0x76,0x78,0x27,0x3e,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x52, +0x62,0x76,0x78,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, +0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, +0x64,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62, +0x76,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72,0x6f,0x74,0x61,0x74,0x69, +0x6f,0x6e,0x52,0x62,0x76,0x78,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36, +0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66, +0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52, +0x62,0x76,0x79,0x27,0x3e,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x52,0x62, +0x76,0x79,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64, +0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76, +0x79,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72,0x6f,0x74,0x61,0x74,0x69,0x6f, +0x6e,0x52,0x62,0x76,0x79,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27, 0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, 0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x66,0x6f, -0x72,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74, -0x65,0x72,0x65,0x73,0x74,0x42,0x7a,0x27,0x3e,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x4f, -0x66,0x5f,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x5f,0x42,0x7a,0x3a,0x3c,0x2f, -0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70, -0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74, -0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42, -0x7a,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x70,0x6f,0x69,0x6e,0x74,0x4f,0x66, -0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x7a,0x27,0x20,0x73,0x69,0x7a,0x65, -0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, -0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65, -0x72,0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74, -0x69,0x6f,0x6e,0x52,0x62,0x76,0x78,0x27,0x3e,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f, -0x6e,0x5f,0x52,0x62,0x76,0x78,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c, -0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74, -0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f, -0x6e,0x52,0x62,0x76,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72,0x6f,0x74, -0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x78,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d, -0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x72,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62, +0x76,0x7a,0x27,0x3e,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x52,0x62,0x76, +0x7a,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d, +0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x7a, +0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e, +0x52,0x62,0x76,0x7a,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20, +0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63, -0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72, -0x22,0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69, -0x6f,0x6e,0x52,0x62,0x76,0x79,0x27,0x3e,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e, -0x5f,0x52,0x62,0x76,0x79,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69, -0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27, -0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e, -0x52,0x62,0x76,0x79,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72,0x6f,0x74,0x61, -0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x79,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27, -0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65,0x5f,0x62,0x75, +0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, -0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x75,0x73,0x65,0x72,0x22, -0x20,0x66,0x6f,0x72,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f, -0x6e,0x52,0x62,0x76,0x7a,0x27,0x3e,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x5f, -0x52,0x62,0x76,0x7a,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e, -0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20, -0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52, -0x62,0x76,0x7a,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72,0x6f,0x74,0x61,0x74, -0x69,0x6f,0x6e,0x52,0x62,0x76,0x7a,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31, -0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70, +0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x76,0x61,0x6c,0x75,0x65, +0x3d,0x27,0x53,0x41,0x56,0x45,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65, -0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74, -0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20, -0x74,0x79,0x70,0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x76,0x61, -0x6c,0x75,0x65,0x3d,0x27,0x53,0x41,0x56,0x45,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70, -0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76, -0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72, -0x6d,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x6e,0x61,0x76,0x3e,0x0d, -0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x09,0x09,0x09, -0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e,0x74, -0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20,0x2d,0x2d,0x3e,0x0d,0x0a,0x09,0x09, -0x3c,0x2f,0x64,0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e,0x74, -0x61,0x69,0x6e,0x65,0x72,0x20,0x2d,0x2d,0x3e,0x0d,0x0a,0x09,0x09,0x0d,0x0a,0x09, -0x09,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, -0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x27,0x20, -0x73,0x72,0x63,0x3d,0x27,0x55,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e, -0x6a,0x73,0x27,0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x09, -0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e, -}; +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0d, +0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x6e,0x61,0x76,0x3e,0x0d,0x0a,0x09,0x09, +0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74, +0x2d,0x77,0x72,0x61,0x70,0x20,0x2d,0x2d,0x3e,0x0d,0x0a,0x09,0x09,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x3c,0x21,0x2d,0x2d,0x20,0x2f,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e, +0x65,0x72,0x20,0x2d,0x2d,0x3e,0x0d,0x0a,0x09,0x09,0x0d,0x0a,0x09,0x09,0x3c,0x73, +0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74, +0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x27,0x20,0x73,0x72,0x63, +0x3d,0x27,0x55,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x6a,0x73,0x27, +0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x62, +0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,}; @@ -2171,8 +2831,16 @@ sizeof(data__NtripCfg_shtml) - 16, 1, }}; -const struct fsdata_file file__UserCfg_shtml[] = { { +const struct fsdata_file file__OdoCfg_shtml[] = { { file__NtripCfg_shtml, +data__OdoCfg_shtml, +data__OdoCfg_shtml + 16, +sizeof(data__OdoCfg_shtml) - 16, +1, +}}; + +const struct fsdata_file file__UserCfg_shtml[] = { { +file__OdoCfg_shtml, data__UserCfg_shtml, data__UserCfg_shtml + 16, sizeof(data__UserCfg_shtml) - 16, @@ -2180,6 +2848,3302 @@ sizeof(data__UserCfg_shtml) - 16, }}; #define FS_ROOT file__UserCfg_shtml -#define FS_NUMFILES 6 +#define FS_NUMFILES 7 + + + +#else // BASE_STATION + + +#include "fs.h" +#include "lwip/def.h" +#include "fsdatah.h" + + +#define file_NULL (struct fsdata_file *) NULL + + +static const unsigned int dummy_align__css_style_css = 0; +static const unsigned char data__css_style_css[] = { +/* /css/style.css (15 chars) */ +0x2f,0x63,0x73,0x73,0x2f,0x73,0x74,0x79,0x6c,0x65,0x2e,0x63,0x73,0x73,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/css + +" (26 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x63,0x73,0x73,0x0d,0x0a,0x0d,0x0a, +/* raw file data (6882 bytes) */ +0x40,0x69,0x6d,0x70,0x6f,0x72,0x74,0x20,0x75,0x72,0x6c,0x28,0x68,0x74,0x74,0x70, +0x3a,0x2f,0x2f,0x66,0x6f,0x6e,0x74,0x73,0x2e,0x67,0x6f,0x6f,0x67,0x6c,0x65,0x61, +0x70,0x69,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x63,0x73,0x73,0x3f,0x66,0x61,0x6d,0x69, +0x6c,0x79,0x3d,0x52,0x61,0x6c,0x65,0x77,0x61,0x79,0x3a,0x32,0x30,0x30,0x2c,0x34, +0x30,0x30,0x2c,0x37,0x30,0x30,0x2c,0x38,0x30,0x30,0x29,0x3b,0x0d,0x0a,0x0d,0x0a, +0x2f,0x2a,0x20,0x43,0x53,0x53,0x20,0x72,0x65,0x73,0x65,0x74,0x20,0x2a,0x2f,0x0d, +0x0a,0x62,0x6f,0x64,0x79,0x2c,0x64,0x69,0x76,0x2c,0x64,0x6c,0x2c,0x64,0x74,0x2c, +0x64,0x64,0x2c,0x75,0x6c,0x2c,0x6f,0x6c,0x2c,0x6c,0x69,0x2c,0x68,0x31,0x2c,0x68, +0x32,0x2c,0x68,0x33,0x2c,0x68,0x34,0x2c,0x68,0x35,0x2c,0x68,0x36,0x2c,0x70,0x72, +0x65,0x2c,0x66,0x6f,0x72,0x6d,0x2c,0x66,0x69,0x65,0x6c,0x64,0x73,0x65,0x74,0x2c, +0x69,0x6e,0x70,0x75,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x2c,0x70, +0x2c,0x62,0x6c,0x6f,0x63,0x6b,0x71,0x75,0x6f,0x74,0x65,0x2c,0x74,0x68,0x2c,0x74, +0x64,0x20,0x7b,0x20,0x0d,0x0a,0x09,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x3b, +0x0d,0x0a,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x30,0x3b,0x0d,0x0a,0x7d, +0x0d,0x0a,0x68,0x74,0x6d,0x6c,0x2c,0x62,0x6f,0x64,0x79,0x20,0x7b,0x0d,0x0a,0x09, +0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x3b,0x0d,0x0a,0x09,0x70,0x61,0x64,0x64, +0x69,0x6e,0x67,0x3a,0x30,0x3b,0x0d,0x0a,0x09,0x68,0x65,0x69,0x67,0x68,0x74,0x3a, +0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x74,0x61,0x62,0x6c,0x65, +0x20,0x7b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6c, +0x61,0x70,0x73,0x65,0x3a,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3b,0x0d,0x0a, +0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x3a, +0x30,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x66,0x69,0x65,0x6c,0x64,0x73,0x65,0x74,0x2c, +0x69,0x6d,0x67,0x20,0x7b,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a, +0x30,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x2c,0x63, +0x61,0x70,0x74,0x69,0x6f,0x6e,0x2c,0x63,0x69,0x74,0x65,0x2c,0x63,0x6f,0x64,0x65, +0x2c,0x64,0x66,0x6e,0x2c,0x74,0x68,0x2c,0x76,0x61,0x72,0x20,0x7b,0x0d,0x0a,0x09, +0x66,0x6f,0x6e,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x6e,0x6f,0x72,0x6d,0x61, +0x6c,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74, +0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x6f,0x6c,0x2c, +0x75,0x6c,0x20,0x7b,0x0d,0x0a,0x09,0x6c,0x69,0x73,0x74,0x2d,0x73,0x74,0x79,0x6c, +0x65,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x63,0x61,0x70,0x74, +0x69,0x6f,0x6e,0x2c,0x74,0x68,0x20,0x7b,0x0d,0x0a,0x09,0x74,0x65,0x78,0x74,0x2d, +0x61,0x6c,0x69,0x67,0x6e,0x3a,0x6c,0x65,0x66,0x74,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a, +0x68,0x31,0x2c,0x68,0x32,0x2c,0x68,0x33,0x2c,0x68,0x34,0x2c,0x68,0x35,0x2c,0x68, +0x36,0x20,0x7b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a, +0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69, +0x67,0x68,0x74,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a, +0x0d,0x0a,0x61,0x62,0x62,0x72,0x2c,0x61,0x63,0x72,0x6f,0x6e,0x79,0x6d,0x20,0x7b, +0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x30,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x61, +0x72,0x74,0x69,0x63,0x6c,0x65,0x2c,0x20,0x61,0x73,0x69,0x64,0x65,0x2c,0x20,0x64, +0x65,0x74,0x61,0x69,0x6c,0x73,0x2c,0x20,0x66,0x69,0x67,0x63,0x61,0x70,0x74,0x69, +0x6f,0x6e,0x2c,0x20,0x66,0x69,0x67,0x75,0x72,0x65,0x2c,0x0d,0x0a,0x66,0x6f,0x6f, +0x74,0x65,0x72,0x2c,0x20,0x68,0x65,0x61,0x64,0x65,0x72,0x2c,0x20,0x68,0x67,0x72, +0x6f,0x75,0x70,0x2c,0x20,0x6d,0x65,0x6e,0x75,0x2c,0x20,0x6e,0x61,0x76,0x2c,0x20, +0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70, +0x6c,0x61,0x79,0x3a,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a, +0x2f,0x2a,0x20,0x47,0x65,0x6e,0x65,0x72,0x61,0x6c,0x20,0x62,0x6f,0x64,0x79,0x20, +0x53,0x74,0x79,0x6c,0x65,0x20,0x2a,0x2f,0x0d,0x0a,0x62,0x6f,0x64,0x79,0x7b,0x0d, +0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x20,0x41, +0x72,0x69,0x61,0x6c,0x2c,0x20,0x27,0x52,0x61,0x6c,0x65,0x77,0x61,0x79,0x27,0x2c, +0x43,0x61,0x6d,0x62,0x72,0x69,0x61,0x2c,0x20,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65, +0x72,0x69,0x66,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e, +0x64,0x3a,0x20,0x23,0x32,0x35,0x32,0x35,0x32,0x35,0x3b,0x0d,0x0a,0x09,0x66,0x6f, +0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x34,0x30,0x30,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20, +0x31,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72, +0x3a,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x46,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x72,0x65,0x6c,0x61,0x74,0x69, +0x76,0x65,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3a, +0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x6c,0x72,0x7b, +0x0d,0x0a,0x09,0x63,0x6c,0x65,0x61,0x72,0x3a,0x20,0x62,0x6f,0x74,0x68,0x3b,0x0d, +0x0a,0x7d,0x0d,0x0a,0x2f,0x2a,0x20,0x74,0x6f,0x70,0x20,0x48,0x65,0x61,0x64,0x65, +0x72,0x20,0x53,0x74,0x79,0x6c,0x65,0x20,0x2a,0x2f,0x0d,0x0a,0x2e,0x63,0x6f,0x64, +0x72,0x6f,0x70,0x73,0x2d,0x74,0x6f,0x70,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66, +0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x20,0x43,0x61,0x6d,0x62, +0x72,0x69,0x61,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65, +0x3a,0x20,0x33,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x7a,0x2d,0x69,0x6e,0x64,0x65, +0x78,0x3a,0x20,0x39,0x39,0x39,0x39,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x62,0x6f, +0x78,0x2d,0x73,0x68,0x61,0x64,0x6f,0x77,0x3a,0x20,0x31,0x70,0x78,0x20,0x30,0x70, +0x78,0x20,0x32,0x70,0x78,0x20,0x72,0x67,0x62,0x61,0x28,0x30,0x2c,0x30,0x2c,0x30, +0x2c,0x30,0x2e,0x32,0x29,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f, +0x75,0x6e,0x64,0x3a,0x20,0x72,0x67,0x62,0x61,0x28,0x32,0x35,0x35,0x2c,0x20,0x32, +0x35,0x35,0x2c,0x20,0x32,0x35,0x35,0x2c,0x20,0x30,0x29,0x3b,0x0d,0x0a,0x7d,0x0d, +0x0a,0x2e,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73,0x2d,0x74,0x6f,0x70,0x20,0x61,0x7b, +0x0d,0x0a,0x09,0x6c,0x65,0x74,0x74,0x65,0x72,0x2d,0x73,0x70,0x61,0x63,0x69,0x6e, +0x67,0x3a,0x20,0x31,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c, +0x6f,0x72,0x3a,0x20,0x72,0x67,0x62,0x28,0x32,0x35,0x35,0x2c,0x20,0x32,0x35,0x35, +0x2c,0x20,0x32,0x35,0x35,0x29,0x3b,0x0d,0x0a,0x09,0x74,0x65,0x78,0x74,0x2d,0x73, +0x68,0x61,0x64,0x6f,0x77,0x3a,0x20,0x30,0x70,0x78,0x20,0x31,0x70,0x78,0x20,0x31, +0x70,0x78,0x20,0x23,0x43,0x43,0x43,0x43,0x43,0x43,0x3b,0x0d,0x0a,0x09,0x64,0x69, +0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x20,0x6c,0x65,0x66,0x74,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66, +0x74,0x3a,0x20,0x31,0x32,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x6f, +0x64,0x72,0x6f,0x70,0x73,0x2d,0x74,0x6f,0x70,0x20,0x73,0x70,0x61,0x6e,0x2e,0x72, +0x69,0x67,0x68,0x74,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, +0x3a,0x20,0x72,0x69,0x67,0x68,0x74,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f, +0x6c,0x6f,0x72,0x3a,0x20,0x72,0x67,0x62,0x28,0x32,0x35,0x35,0x2c,0x20,0x32,0x35, +0x35,0x2c,0x20,0x32,0x35,0x35,0x29,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x6f, +0x64,0x72,0x6f,0x70,0x73,0x2d,0x74,0x6f,0x70,0x20,0x73,0x70,0x61,0x6e,0x2e,0x72, +0x69,0x67,0x68,0x74,0x20,0x61,0x7b,0x0d,0x0a,0x09,0x66,0x6c,0x6f,0x61,0x74,0x3a, +0x20,0x6c,0x65,0x66,0x74,0x3b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79, +0x3a,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x6f, +0x64,0x72,0x6f,0x70,0x73,0x2d,0x74,0x6f,0x70,0x20,0x73,0x70,0x61,0x6e,0x2e,0x72, +0x69,0x67,0x68,0x74,0x20,0x61,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x0d,0x0a,0x09, +0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x72,0x67,0x62,0x28, +0x32,0x35,0x35,0x2c,0x20,0x32,0x35,0x35,0x2c,0x20,0x32,0x35,0x35,0x29,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x72,0x67,0x62,0x28, +0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2f,0x2a, +0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x20,0x2a,0x2f,0x0d,0x0a,0x2e,0x63,0x6f, +0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x7b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68, +0x3a,0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x6f,0x73, +0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x66,0x69,0x78,0x65,0x64,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x74,0x6f,0x70,0x3a,0x20,0x34,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x31,0x30,0x30,0x25,0x3b, +0x0d,0x0a,0x7d,0x0d,0x0a,0x2f,0x2a,0x20,0x6d,0x65,0x6e,0x75,0x20,0x2a,0x2f,0x0d, +0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x0d,0x0a,0x7b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74, +0x68,0x3a,0x20,0x32,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x68,0x65,0x69,0x67, +0x68,0x74,0x3a,0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b, +0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x72,0x67,0x62,0x28,0x34,0x35,0x2c,0x20, +0x34,0x35,0x2c,0x20,0x34,0x35,0x29,0x3b,0x0d,0x0a,0x09,0x70,0x6f,0x73,0x69,0x74, +0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x66,0x6c,0x6f,0x61,0x74,0x3a,0x20,0x6c,0x65,0x66,0x74,0x3b,0x0d,0x0a,0x7d,0x20, +0x20,0x20,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72, +0x20,0x20,0x20,0x0d,0x0a,0x7b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69, +0x7a,0x65,0x3a,0x20,0x32,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b, +0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x33,0x42,0x33,0x46,0x34,0x35,0x3b, +0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d, +0x3a,0x20,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x66,0x66,0x66, +0x66,0x66,0x66,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x74,0x6f, +0x70,0x3a,0x20,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x66,0x66, +0x66,0x66,0x66,0x66,0x3b,0x0d,0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a,0x2e,0x6d,0x65, +0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x74,0x69,0x74,0x6c,0x65,0x0d, +0x0a,0x7b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x66,0x66,0x66, +0x66,0x66,0x66,0x3b,0x0d,0x0a,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20, +0x31,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x74,0x2d, +0x73,0x68,0x61,0x64,0x6f,0x77,0x3a,0x20,0x30,0x20,0x31,0x70,0x78,0x20,0x30,0x20, +0x72,0x67,0x62,0x61,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2e, +0x34,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c, +0x69,0x67,0x6e,0x3a,0x20,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x0d,0x0a,0x7d,0x0d, +0x0a,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x6f,0x64,0x79,0x0d,0x0a,0x7b, +0x0d,0x0a,0x09,0x6c,0x69,0x73,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x20,0x6e, +0x6f,0x6e,0x65,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x0d,0x0a,0x09,0x66, +0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x36,0x70,0x78,0x3b,0x0d, +0x0a,0x09,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x72,0x65,0x6c,0x61, +0x74,0x69,0x76,0x65,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f, +0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20, +0x20,0x20,0x0d,0x0a,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x30, +0x70,0x78,0x3b,0x20,0x0d,0x0a,0x09,0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f, +0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x09, +0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x64,0x64,0x64,0x64,0x64,0x64,0x3b,0x20, +0x20,0x20,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x62,0x6c, +0x6f,0x63,0x6b,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72, +0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c, +0x69,0x64,0x20,0x23,0x46,0x65,0x46,0x65,0x46,0x65,0x3b,0x20,0x20,0x20,0x0d,0x0a, +0x7d,0x0d,0x0a,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, +0x6e,0x6b,0x3a,0x68,0x6f,0x76,0x65,0x72,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a, +0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x66,0x30, +0x66,0x30,0x66,0x30,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23, +0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d,0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a,0x2e, +0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x2e,0x69, +0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x20,0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20, +0x20,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20, +0x72,0x67,0x62,0x28,0x32,0x35,0x32,0x2c,0x20,0x32,0x34,0x38,0x2c,0x20,0x32,0x34, +0x38,0x29,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x30,0x30, +0x30,0x30,0x30,0x30,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a, +0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x2e, +0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x3a,0x61,0x66,0x74,0x65,0x72,0x20, +0x20,0x20,0x0d,0x0a,0x7b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c, +0x61,0x79,0x3a,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09, +0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x61,0x62,0x73,0x6f,0x6c,0x75, +0x74,0x65,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x74,0x6f,0x70,0x3a,0x20,0x35,0x30, +0x25,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74, +0x6f,0x70,0x3a,0x20,0x2d,0x36,0x70,0x78,0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62, +0x6f,0x72,0x64,0x65,0x72,0x2d,0x74,0x6f,0x70,0x3a,0x20,0x36,0x70,0x78,0x20,0x73, +0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74, +0x3b,0x20,0x20,0x20,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f, +0x74,0x74,0x6f,0x6d,0x3a,0x20,0x36,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20, +0x74,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,0x3b,0x20,0x20,0x20,0x0d, +0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20,0x36, +0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x36,0x45,0x37,0x35,0x37,0x46, +0x3b,0x20,0x20,0x20,0x0d,0x0a,0x7d,0x20,0x20,0x20,0x0d,0x0a,0x0d,0x0a,0x2f,0x2a, +0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x20,0x77,0x72,0x61,0x70,0x20,0x2a,0x2f, +0x0d,0x0a,0x2e,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20, +0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65, +0x66,0x74,0x3a,0x20,0x32,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72, +0x3a,0x20,0x72,0x67,0x62,0x28,0x32,0x35,0x32,0x2c,0x20,0x32,0x34,0x38,0x2c,0x20, +0x32,0x34,0x38,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68, +0x74,0x3a,0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f, +0x6c,0x6f,0x72,0x3a,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x30,0x70,0x78, +0x20,0x32,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74, +0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x20,0x41,0x72,0x69,0x61,0x6c,0x2c,0x20, +0x27,0x54,0x69,0x6d,0x65,0x73,0x20,0x4e,0x65,0x77,0x20,0x52,0x6f,0x6d,0x61,0x6e, +0x27,0x2c,0x20,0x27,0x52,0x61,0x6c,0x65,0x77,0x61,0x79,0x27,0x2c,0x20,0x73,0x61, +0x6e,0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x6f, +0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x3a,0x20,0x61,0x75,0x74,0x6f,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31, +0x37,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x6d,0x69,0x6e,0x2d,0x77,0x69, +0x64,0x74,0x68,0x3a,0x20,0x36,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a, +0x0d,0x0a,0x2e,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20, +0x3e,0x20,0x68,0x65,0x61,0x64,0x65,0x72,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70, +0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x32, +0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74, +0x2d,0x77,0x72,0x61,0x70,0x20,0x3e,0x20,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x68, +0x31,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a, +0x65,0x3a,0x20,0x32,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f, +0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x62,0x6f,0x6c,0x64,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x62,0x6f, +0x74,0x74,0x6f,0x6d,0x3a,0x20,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e, +0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20,0x3e,0x20,0x68, +0x65,0x61,0x64,0x65,0x72,0x20,0x68,0x32,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66, +0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x32,0x30,0x70,0x78,0x3b,0x0d, +0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61, +0x70,0x20,0x3e,0x20,0x73,0x75,0x62,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61, +0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20,0x35,0x70,0x78,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x62,0x6f, +0x74,0x74,0x6f,0x6d,0x3a,0x20,0x32,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d, +0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38,0x70, +0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d, +0x77,0x72,0x61,0x70,0x20,0x3e,0x20,0x73,0x75,0x62,0x20,0x68,0x31,0x7b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x32, +0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x77, +0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x35,0x32,0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a, +0x20,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63,0x6f,0x6e,0x74,0x65, +0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x20,0x3e,0x20,0x73,0x75,0x62,0x20,0x68,0x32, +0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65, +0x3a,0x20,0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64, +0x64,0x69,0x6e,0x67,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x32,0x70,0x78, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x38, +0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65, +0x6c,0x5f,0x78,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x70,0x6c,0x61, +0x79,0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b, +0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x30,0x30,0x30,0x30,0x30, +0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a, +0x65,0x3a,0x20,0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61, +0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x20,0x35,0x70,0x78,0x3b,0x0d,0x0a, +0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x6d,0x7b,0x0d,0x0a,0x09,0x64, +0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62, +0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x36, +0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x30, +0x30,0x30,0x30,0x30,0x30,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69, +0x7a,0x65,0x3a,0x20,0x31,0x37,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70, +0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x30,0x70,0x78,0x20,0x35,0x70,0x78,0x20, +0x33,0x70,0x78,0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6c,0x61, +0x62,0x65,0x6c,0x5f,0x31,0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79, +0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d, +0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x37,0x30,0x70,0x78,0x3b,0x0d, +0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30, +0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31, +0x37,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e, +0x67,0x3a,0x20,0x30,0x70,0x78,0x20,0x35,0x70,0x78,0x20,0x33,0x70,0x78,0x20,0x30, +0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x32, +0x7b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x69,0x6e,0x6c, +0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64, +0x74,0x68,0x3a,0x20,0x32,0x31,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c, +0x6f,0x72,0x3a,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d,0x0a,0x09,0x66, +0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x37,0x70,0x78,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x30,0x70, +0x78,0x20,0x35,0x70,0x78,0x20,0x33,0x70,0x78,0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a, +0x7d,0x0d,0x0a,0x2e,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x33,0x7b,0x0d,0x0a,0x09,0x64, +0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62, +0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x32, +0x32,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23, +0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73, +0x69,0x7a,0x65,0x3a,0x20,0x31,0x37,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x30,0x70,0x78,0x20,0x35,0x70,0x78, +0x20,0x33,0x70,0x78,0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x63, +0x66,0x67,0x63,0x62,0x20,0x7b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61, +0x6d,0x69,0x6c,0x79,0x3a,0x56,0x65,0x72,0x64,0x61,0x6e,0x61,0x3b,0x0d,0x0a,0x09, +0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d, +0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x36,0x70, +0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2d,0x73, +0x65,0x74,0x74,0x69,0x6e,0x67,0x2d,0x62,0x6b,0x7b,0x0d,0x0a,0x09,0x70,0x6f,0x73, +0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x66,0x69,0x78,0x65,0x64,0x3b,0x0d,0x0a,0x09, +0x6c,0x65,0x66,0x74,0x3a,0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x74,0x6f,0x70, +0x3a,0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f, +0x75,0x6e,0x64,0x3a,0x20,0x23,0x30,0x30,0x30,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64, +0x74,0x68,0x3a,0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x09,0x68,0x65,0x69,0x67, +0x68,0x74,0x3a,0x20,0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b, +0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x72,0x67,0x62,0x61,0x28,0x30,0x2c,0x30, +0x2c,0x30,0x2c,0x30,0x2e,0x35,0x29,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x77,0x69,0x6e, +0x64,0x6f,0x77,0x2d,0x73,0x65,0x74,0x74,0x69,0x6e,0x67,0x7b,0x0d,0x0a,0x09,0x70, +0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x72,0x65,0x6c,0x61,0x74,0x69,0x76, +0x65,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a, +0x20,0x23,0x66,0x66,0x66,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20, +0x35,0x30,0x25,0x3b,0x0d,0x0a,0x09,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x38, +0x30,0x25,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64, +0x69,0x75,0x73,0x3a,0x20,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x6d,0x61,0x72,0x67, +0x69,0x6e,0x3a,0x20,0x35,0x25,0x20,0x61,0x75,0x74,0x6f,0x3b,0x0d,0x0a,0x7d,0x0d, +0x0a,0x2e,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2d,0x73,0x65,0x74,0x74,0x69,0x6e,0x67, +0x20,0x3e,0x20,0x68,0x65,0x61,0x64,0x65,0x72,0x7b,0x0d,0x0a,0x09,0x68,0x65,0x69, +0x67,0x68,0x74,0x3a,0x20,0x34,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x70,0x6f,0x73, +0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b, +0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38, +0x70,0x78,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x32,0x35,0x70, +0x78,0x3b,0x0d,0x0a,0x09,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x32,0x35,0x70, +0x78,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69, +0x75,0x73,0x3a,0x20,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67, +0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x72,0x65,0x64,0x3b,0x0d,0x0a,0x09,0x63,0x6f, +0x6c,0x6f,0x72,0x3a,0x20,0x23,0x66,0x66,0x66,0x3b,0x0d,0x0a,0x09,0x72,0x69,0x67, +0x68,0x74,0x3a,0x20,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x74,0x6f,0x70,0x3a,0x20, +0x35,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67, +0x6e,0x3a,0x20,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x0d, +0x0a,0x23,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x7b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20, +0x35,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e, +0x67,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x32,0x70,0x78,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x30,0x30,0x30,0x30, +0x30,0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69, +0x7a,0x65,0x3a,0x20,0x31,0x38,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x73, +0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3e,0x20,0x68,0x31,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x38, +0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65, +0x69,0x67,0x68,0x74,0x3a,0x20,0x62,0x6f,0x6c,0x64,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a, +0x20,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x0d,0x0a,0x23,0x73,0x61,0x76, +0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x31,0x70,0x78,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74, +0x6f,0x6d,0x3a,0x35,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x68,0x65,0x69, +0x67,0x68,0x74,0x3a,0x34,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x23,0x73, +0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x2e,0x62,0x75,0x74,0x74, +0x6f,0x6e,0x0d,0x0a,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x74,0x2d, +0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x6e,0x6f,0x6e,0x65,0x3b, +0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x32, +0x66,0x34,0x33,0x35,0x65,0x3b,0x0d,0x0a,0x09,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23, +0x66,0x32,0x66,0x32,0x66,0x32,0x3b,0x0d,0x0a,0x09,0x70,0x61,0x64,0x64,0x69,0x6e, +0x67,0x3a,0x20,0x31,0x30,0x70,0x78,0x20,0x30,0x70,0x78,0x20,0x31,0x30,0x70,0x78, +0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x77,0x69,0x64,0x74,0x68, +0x3a,0x20,0x31,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d, +0x73,0x69,0x7a,0x65,0x3a,0x31,0x36,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e, +0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x20,0x27,0x52,0x61,0x6c,0x65,0x77, +0x61,0x79,0x27,0x2c,0x43,0x61,0x6d,0x62,0x72,0x69,0x61,0x2c,0x20,0x41,0x72,0x69, +0x61,0x6c,0x2c,0x20,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74, +0x3a,0x62,0x6f,0x6c,0x64,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d, +0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x33,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x6f, +0x72,0x64,0x65,0x72,0x3a,0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x09,0x2d,0x77, +0x65,0x62,0x6b,0x69,0x74,0x2d,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e, +0x3a,0x61,0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30, +0x73,0x3b,0x0d,0x0a,0x09,0x2d,0x6d,0x6f,0x7a,0x2d,0x74,0x72,0x61,0x6e,0x73,0x69, +0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20, +0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x74,0x72,0x61,0x6e, +0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61, +0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x63,0x75, +0x72,0x73,0x6f,0x72,0x3a,0x20,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x0d,0x0a, +0x7d,0x0d,0x0a,0x23,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20, +0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x7b,0x0d, +0x0a,0x20,0x20,0x20,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23, +0x33,0x38,0x35,0x66,0x39,0x65,0x3b,0x20,0x0d,0x0a,0x7d,0x0d,0x0a,0x23,0x73,0x61, +0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x2e,0x62,0x75,0x74,0x74,0x6f, +0x6e,0x5f,0x72,0x69,0x67,0x68,0x74,0x0d,0x0a,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a, +0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75, +0x6e,0x64,0x3a,0x23,0x32,0x66,0x34,0x33,0x35,0x65,0x3b,0x0d,0x0a,0x09,0x63,0x6f, +0x6c,0x6f,0x72,0x3a,0x23,0x66,0x32,0x66,0x32,0x66,0x32,0x3b,0x0d,0x0a,0x09,0x70, +0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x30,0x70,0x78,0x20,0x30,0x70,0x78, +0x20,0x31,0x30,0x70,0x78,0x20,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09, +0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x36,0x70,0x78,0x3b,0x0d, +0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x20,0x27, +0x52,0x61,0x6c,0x65,0x77,0x61,0x79,0x27,0x2c,0x43,0x61,0x6d,0x62,0x72,0x69,0x61, +0x2c,0x20,0x41,0x72,0x69,0x61,0x6c,0x2c,0x20,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65, +0x72,0x69,0x66,0x3b,0x0d,0x0a,0x09,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67, +0x68,0x74,0x3a,0x62,0x6f,0x6c,0x64,0x3b,0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65, +0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x33,0x70,0x78,0x3b,0x0d,0x0a,0x09, +0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x20,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20, +0x38,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d, +0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c,0x6c,0x20,0x6c, +0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d,0x0a,0x09,0x2d, +0x6d,0x6f,0x7a,0x2d,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61, +0x6c,0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b, +0x0d,0x0a,0x09,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x6c, +0x6c,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x30,0x2e,0x33,0x30,0x73,0x3b,0x0d, +0x0a,0x7d,0x0d,0x0a,0x23,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e, +0x20,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x5f,0x72,0x69,0x67,0x68,0x74,0x3a,0x68, +0x6f,0x76,0x65,0x72,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x62,0x61,0x63,0x6b,0x67, +0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x33,0x38,0x35,0x66,0x39,0x65,0x3b,0x20,0x0d, +0x0a,0x7d,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x23,0x54,0x61,0x62,0x20,0x7b,0x0d,0x0a, +0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x32,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69, +0x64,0x20,0x23,0x61,0x30,0x61,0x30,0x61,0x30,0x3b,0x0d,0x0a,0x09,0x70,0x61,0x64, +0x64,0x69,0x6e,0x67,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x20,0x35,0x30,0x70, +0x78,0x3b,0x0d,0x0a,0x09,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x20, +0x35,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x6d,0x69,0x6e,0x2d,0x68,0x65,0x69, +0x67,0x68,0x74,0x3a,0x20,0x34,0x30,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a, +0x2e,0x4d,0x65,0x6e,0x75,0x62,0x6f,0x78,0x20,0x7b,0x0d,0x0a,0x09,0x68,0x65,0x69, +0x67,0x68,0x74,0x3a,0x35,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x62,0x61,0x63,0x6b, +0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x23,0x65,0x36,0x65,0x36,0x65,0x36,0x3b, +0x0d,0x0a,0x09,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d, +0x3a,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x61,0x30,0x61,0x30, +0x61,0x30,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x4d,0x65,0x6e,0x75,0x62,0x6f,0x78, +0x20,0x75,0x6c,0x20,0x7b,0x0d,0x0a,0x09,0x6c,0x69,0x73,0x74,0x2d,0x73,0x74,0x79, +0x6c,0x65,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x4d,0x65, +0x6e,0x75,0x62,0x6f,0x78,0x20,0x75,0x6c,0x20,0x6c,0x69,0x20,0x7b,0x0d,0x0a,0x09, +0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x3b,0x0d,0x0a,0x09,0x62,0x61, +0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x62,0x30,0x62,0x30,0x62,0x30, +0x3b,0x0d,0x0a,0x09,0x6c,0x69,0x6e,0x65,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x3a, +0x35,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a, +0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x0d,0x0a,0x09,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a, +0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x0d,0x0a,0x09,0x77,0x69,0x64,0x74,0x68, +0x3a,0x31,0x35,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x74,0x65,0x78,0x74,0x2d,0x61, +0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x0d,0x0a,0x09,0x63, +0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x66,0x66,0x66,0x3b,0x0d,0x0a,0x09, +0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x62,0x6f,0x6c,0x64, +0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x4d,0x65,0x6e,0x75,0x62,0x6f,0x78,0x20,0x75, +0x6c,0x20,0x6c,0x69,0x2e,0x68,0x6f,0x76,0x65,0x72,0x20,0x7b,0x0d,0x0a,0x09,0x62, +0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x72,0x67,0x62,0x28,0x32,0x35, +0x32,0x2c,0x20,0x32,0x34,0x38,0x2c,0x20,0x32,0x34,0x38,0x29,0x3b,0x0d,0x0a,0x09, +0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d,0x0a, +0x7d,0x0d,0x0a,0x2e,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x62,0x6f,0x78,0x20,0x7b, +0x0d,0x0a,0x09,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x32,0x30,0x70,0x78, +0x20,0x31,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x09,0x68,0x65,0x69,0x67,0x68,0x74,0x3a, +0x31,0x30,0x30,0x25,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x0d,0x0a,0x2e,0x72,0x6f,0x77, +0x4d,0x65,0x6e,0x75,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x62,0x61,0x63,0x6b, +0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x72,0x67,0x62,0x28,0x32,0x35,0x32,0x2c,0x20, +0x32,0x34,0x38,0x2c,0x20,0x32,0x34,0x38,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x36,0x70,0x78,0x3b, +0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x72,0x6f,0x77,0x4d,0x65,0x6e,0x75,0x20,0x75,0x6c, +0x20,0x7b,0x0d,0x0a,0x09,0x6c,0x69,0x73,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a, +0x6e,0x6f,0x6e,0x65,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x72,0x6f,0x77,0x4d,0x65, +0x6e,0x75,0x20,0x75,0x6c,0x20,0x6c,0x69,0x20,0x20,0x7b,0x0d,0x0a,0x09,0x62,0x6f, +0x72,0x64,0x65,0x72,0x3a,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23, +0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x77,0x69,0x64, +0x74,0x68,0x3a,0x20,0x31,0x36,0x30,0x70,0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x31,0x33,0x30,0x70,0x78,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x20,0x31,0x30,0x70, +0x78,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23, +0x30,0x30,0x30,0x30,0x30,0x30,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x63,0x75,0x72, +0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x61,0x6c,0x69,0x67,0x6e,0x2d,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a, +0x20,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x0d,0x0a,0x7d,0x0d,0x0a,0x2e,0x72,0x6f, +0x77,0x4d,0x65,0x6e,0x75,0x20,0x75,0x6c,0x20,0x6c,0x69,0x2e,0x68,0x6f,0x76,0x65, +0x72,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f, +0x75,0x6e,0x64,0x3a,0x20,0x23,0x66,0x30,0x65,0x30,0x65,0x30,0x3b,0x0d,0x0a,0x7d, +0x0d,0x0a,}; + +static const unsigned int dummy_align__deviceInfo_shtml = 1; +static const unsigned char data__deviceInfo_shtml[] = { +/* /deviceInfo.shtml (18 chars) */ +0x2f,0x64,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d, +0x6c,0x00,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/html +Expires: Fri, 10 Apr 2008 14:00:00 GMT +Pragma: no-cache + +" (85 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x45,0x78,0x70,0x69,0x72,0x65,0x73, +0x3a,0x20,0x46,0x72,0x69,0x2c,0x20,0x31,0x30,0x20,0x41,0x70,0x72,0x20,0x32,0x30, +0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, +0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, +0x65,0x0d,0x0a,0x0d,0x0a, +/* raw file data (2036 bytes) */ +0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0a, +0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e,0x0a,0x09, +0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65,0x74,0x3d,0x22, +0x55,0x54,0x46,0x2d,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x74,0x69,0x74,0x6c,0x65,0x3e,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b, +0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c, +0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65, +0x78,0x74,0x2f,0x63,0x73,0x73,0x22,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x63,0x73, +0x73,0x2f,0x73,0x74,0x79,0x6c,0x65,0x2e,0x63,0x73,0x73,0x22,0x20,0x2f,0x3e,0x0a, +0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x3e,0x0a,0x0a,0x09,0x3c,0x62, +0x6f,0x64,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x65, +0x61,0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72, +0x6f,0x70,0x73,0x2d,0x74,0x6f,0x70,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61, +0x20,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74, +0x61,0x69,0x6e,0x65,0x72,0x22,0x3e,0x0a,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x22,0x3e,0x20,0x20,0x0a, +0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e, +0x20,0x20,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x31,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x74, +0x69,0x74,0x6c,0x65,0x22,0x3e,0x4d,0x45,0x4e,0x55,0x3c,0x2f,0x68,0x31,0x3e,0x0a, +0x09,0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x09,0x09, +0x09,0x09,0x3c,0x75,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x62,0x6f,0x64,0x79,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c, +0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74, +0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x72,0x75,0x6e, +0x53,0x74,0x61,0x74,0x75,0x73,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c, +0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x75, +0x6e,0x6e,0x69,0x6e,0x67,0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x3c,0x2f,0x61,0x3e, +0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e, +0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x77,0x6f,0x72,0x6b,0x43,0x66,0x67, +0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d, +0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x6f,0x72,0x6b,0x20,0x43,0x6f,0x6e, +0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f, +0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61, +0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x75,0x73,0x65,0x72,0x43,0x66,0x67,0x2e,0x73, +0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x73,0x65,0x72,0x20,0x43,0x6f,0x6e,0x66,0x69, +0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68, +0x72,0x65,0x66,0x3d,0x22,0x65,0x74,0x68,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d, +0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20,0x43,0x6f,0x6e,0x66, +0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c, +0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20, +0x68,0x72,0x65,0x66,0x3d,0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f, +0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d, +0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x69,0x73, +0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61, +0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c,0x3e, +0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70, +0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49, +0x6e,0x66,0x6f,0x3c,0x2f,0x68,0x31,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65, +0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74,0x79, +0x6c,0x65,0x3d,0x22,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b, +0x20,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x22,0x3e,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x50,0x72,0x6f,0x64, +0x75,0x63,0x74,0x20,0x4e,0x61,0x6d,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c, +0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x70,0x72,0x6f,0x64, +0x75,0x63,0x74,0x4e,0x61,0x6d,0x65,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74, +0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61, +0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c, +0x5f,0x31,0x22,0x3e,0x49,0x4d,0x55,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e, +0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x69,0x6d,0x75,0x2d,0x2d, +0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x50,0x4e,0x3a,0x3c,0x2f, +0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d, +0x23,0x70,0x6e,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e, +0x46,0x69,0x72,0x6d,0x77,0x61,0x72,0x65,0x20,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e, +0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c, +0x21,0x2d,0x2d,0x23,0x66,0x69,0x72,0x6d,0x77,0x61,0x72,0x65,0x56,0x65,0x72,0x73, +0x69,0x6f,0x6e,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e, +0x53,0x65,0x72,0x69,0x61,0x6c,0x20,0x4e,0x75,0x6d,0x62,0x65,0x72,0x3a,0x3c,0x2f, +0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d, +0x23,0x73,0x65,0x72,0x69,0x61,0x6c,0x4e,0x75,0x6d,0x77,0x65,0x72,0x2d,0x2d,0x3e, +0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x41,0x70,0x70,0x20,0x56,0x65, +0x72,0x73,0x69,0x6f,0x6e,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74, +0x65,0x78,0x74,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x61,0x70,0x70,0x56,0x65,0x72,0x73, +0x69,0x6f,0x6e,0x2d,0x2d,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69, +0x76,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69, +0x76,0x3e,0x0a,0x0a,0x09,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0a,0x3c,0x2f,0x68, +0x74,0x6d,0x6c,0x3e,}; + +static const unsigned int dummy_align__ethCfg_shtml = 2; +static const unsigned char data__ethCfg_shtml[] = { +/* /ethCfg.shtml (14 chars) */ +0x2f,0x65,0x74,0x68,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/html +Expires: Fri, 10 Apr 2008 14:00:00 GMT +Pragma: no-cache + +" (85 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x45,0x78,0x70,0x69,0x72,0x65,0x73, +0x3a,0x20,0x46,0x72,0x69,0x2c,0x20,0x31,0x30,0x20,0x41,0x70,0x72,0x20,0x32,0x30, +0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, +0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, +0x65,0x0d,0x0a,0x0d,0x0a, +/* raw file data (6364 bytes) */ +0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0a, +0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e,0x0a,0x09, +0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65,0x74,0x3d,0x22, +0x55,0x54,0x46,0x2d,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x74,0x69,0x74,0x6c,0x65,0x3e,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b, +0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c, +0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65, +0x78,0x74,0x2f,0x63,0x73,0x73,0x22,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x63,0x73, +0x73,0x2f,0x73,0x74,0x79,0x6c,0x65,0x2e,0x63,0x73,0x73,0x22,0x20,0x2f,0x3e,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x3e, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e, +0x63,0x74,0x69,0x6f,0x6e,0x20,0x24,0x28,0x69,0x64,0x29,0x20,0x7b,0x20,0x72,0x65, +0x74,0x75,0x72,0x6e,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65, +0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x69,0x64,0x29, +0x3b,0x20,0x7d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x65,0x74,0x68,0x43,0x6f,0x6e, +0x66,0x69,0x67,0x43,0x61,0x6c,0x6c,0x62,0x61,0x63,0x6b,0x28,0x6f,0x29,0x20,0x7b, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x64,0x68,0x63,0x70,0x20,0x3d,0x3d,0x20,0x30, +0x29,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x64,0x68,0x63,0x70,0x27, +0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4f, +0x4e,0x27,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x24,0x28,0x27,0x64,0x68,0x63,0x70,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72, +0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4f,0x46,0x46,0x27,0x3b,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x69,0x70,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x69,0x70,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d, +0x20,0x6f,0x2e,0x69,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x6e,0x65, +0x74,0x6d,0x61,0x73,0x6b,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x6e,0x65,0x74,0x6d, +0x61,0x73,0x6b,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x6f,0x2e,0x6e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x3b,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20, +0x28,0x24,0x28,0x27,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x27,0x29,0x29,0x20,0x24, +0x28,0x27,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65, +0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x67,0x61,0x74,0x65,0x77,0x61, +0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x6d,0x61,0x63,0x27,0x29,0x29, +0x20,0x24,0x28,0x27,0x6d,0x61,0x63,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54, +0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x6d,0x61,0x63,0x3b,0x0a,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x28,0x24,0x28,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x49,0x70,0x27,0x29,0x29, +0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x49,0x70,0x27,0x29,0x2e,0x76, +0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x73,0x49,0x70,0x3b,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x28,0x24,0x28,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x4e,0x65,0x74,0x6d,0x61, +0x73,0x6b,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x4e, +0x65,0x74,0x6d,0x61,0x73,0x6b,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d, +0x20,0x6f,0x2e,0x73,0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x3b,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20, +0x28,0x24,0x28,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x47,0x61,0x74,0x65,0x77,0x61, +0x79,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x47,0x61, +0x74,0x65,0x77,0x61,0x79,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20, +0x6f,0x2e,0x73,0x47,0x61,0x74,0x65,0x77,0x61,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, +0x6f,0x2e,0x64,0x68,0x63,0x70,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x24,0x28,0x27,0x65,0x74,0x68,0x6d,0x6f,0x64,0x65,0x27,0x29,0x2e, +0x6f,0x70,0x74,0x69,0x6f,0x6e,0x73,0x5b,0x30,0x5d,0x2e,0x73,0x65,0x6c,0x65,0x63, +0x74,0x65,0x64,0x20,0x3d,0x20,0x74,0x72,0x75,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x24,0x28,0x22,0x73,0x74,0x61,0x74,0x69,0x63,0x49,0x70,0x22,0x29,0x2e,0x64,0x69, +0x73,0x61,0x62,0x6c,0x65,0x64,0x20,0x3d,0x20,0x74,0x72,0x75,0x65,0x3b,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x24,0x28,0x22,0x73,0x74,0x61,0x74,0x69,0x63,0x4e,0x65,0x74,0x6d, +0x61,0x73,0x6b,0x22,0x29,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x20,0x3d, +0x20,0x74,0x72,0x75,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x22,0x73,0x74, +0x61,0x74,0x69,0x63,0x47,0x61,0x74,0x65,0x77,0x61,0x79,0x22,0x29,0x2e,0x64,0x69, +0x73,0x61,0x62,0x6c,0x65,0x64,0x20,0x3d,0x20,0x74,0x72,0x75,0x65,0x3b,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, +0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x65, +0x74,0x68,0x6d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x6f,0x70,0x74,0x69,0x6f,0x6e,0x73, +0x5b,0x31,0x5d,0x2e,0x73,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x20,0x3d,0x20,0x74, +0x72,0x75,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x22,0x73,0x74,0x61,0x74, +0x69,0x63,0x49,0x70,0x22,0x29,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x20, +0x3d,0x20,0x66,0x61,0x6c,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x22, +0x73,0x74,0x61,0x74,0x69,0x63,0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x22,0x29,0x2e, +0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x20,0x3d,0x20,0x66,0x61,0x6c,0x73,0x65, +0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x22,0x73,0x74,0x61,0x74,0x69,0x63,0x47, +0x61,0x74,0x65,0x77,0x61,0x79,0x22,0x29,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65, +0x64,0x20,0x3d,0x20,0x66,0x61,0x6c,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x3b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e, +0x20,0x65,0x74,0x68,0x53,0x75,0x6d,0x6d,0x61,0x72,0x79,0x43,0x61,0x6c,0x6c,0x62, +0x61,0x63,0x6b,0x28,0x6f,0x29,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x64, +0x68,0x63,0x70,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x24,0x28,0x27,0x64,0x68,0x63,0x70,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54, +0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4f,0x4e,0x27,0x3b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c, +0x73,0x65,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x64,0x68,0x63,0x70, +0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27, +0x4f,0x46,0x46,0x27,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x69, +0x70,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x69,0x70,0x27,0x29,0x2e,0x69,0x6e,0x6e, +0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x69,0x70,0x3b,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69, +0x66,0x20,0x28,0x24,0x28,0x27,0x6e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x27,0x29,0x29, +0x20,0x24,0x28,0x27,0x6e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x27,0x29,0x2e,0x69,0x6e, +0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x6e,0x65,0x74,0x6d, +0x61,0x73,0x6b,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x67,0x61,0x74,0x65, +0x77,0x61,0x79,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x67,0x61,0x74,0x65,0x77,0x61, +0x79,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20, +0x6f,0x2e,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x72,0x65, +0x66,0x4e,0x65,0x77,0x28,0x29,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x78,0x68,0x72,0x3b, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x28,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2e,0x58,0x4d,0x4c,0x48,0x74, +0x74,0x70,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x29,0x7b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x78,0x68,0x72,0x20,0x3d,0x20,0x6e,0x65,0x77,0x20,0x58,0x4d,0x4c,0x48,0x74,0x74, +0x70,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x28,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73, +0x65,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x68,0x72,0x20,0x3d,0x20,0x6e,0x65,0x77, +0x20,0x41,0x63,0x74,0x69,0x76,0x65,0x58,0x4f,0x62,0x6a,0x65,0x63,0x74,0x28,0x27, +0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x58,0x4d,0x4c,0x48,0x54,0x54, +0x50,0x27,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x68,0x72,0x2e,0x6f,0x6e,0x72,0x65,0x61, +0x64,0x79,0x73,0x74,0x61,0x74,0x65,0x63,0x68,0x61,0x6e,0x67,0x65,0x20,0x3d,0x20, +0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x29,0x7b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x69,0x66,0x28,0x78,0x68,0x72,0x2e,0x72,0x65,0x61,0x64,0x79,0x53,0x74,0x61,0x74, +0x65,0x20,0x3d,0x3d,0x3d,0x20,0x34,0x29,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x69,0x66,0x28,0x78,0x68,0x72,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x20, +0x3d,0x3d,0x20,0x32,0x30,0x30,0x29,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x65,0x76,0x61,0x6c,0x28,0x78,0x68,0x72,0x2e,0x72,0x65, +0x73,0x70,0x6f,0x6e,0x73,0x65,0x54,0x65,0x78,0x74,0x29,0x3b,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78, +0x68,0x72,0x2e,0x6f,0x70,0x65,0x6e,0x28,0x27,0x67,0x65,0x74,0x27,0x2c,0x20,0x27, +0x65,0x74,0x68,0x53,0x75,0x6d,0x6d,0x61,0x72,0x79,0x2e,0x6a,0x73,0x27,0x2c,0x20, +0x74,0x72,0x75,0x65,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x68,0x72,0x2e,0x73,0x65,0x6e,0x64,0x28, +0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70, +0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x3e,0x0a,0x20, +0x20,0x20,0x20,0x0a,0x20,0x20,0x20,0x20,0x3c,0x62,0x6f,0x64,0x79,0x20,0x6f,0x6e, +0x6c,0x6f,0x61,0x64,0x3d,0x22,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74, +0x3a,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x27,0x72,0x65, +0x66,0x4e,0x65,0x77,0x28,0x29,0x27,0x2c,0x20,0x31,0x30,0x30,0x30,0x30,0x29,0x22, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x65,0x61,0x64,0x65, +0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73, +0x2d,0x74,0x6f,0x70,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x61,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x4f,0x70, +0x65,0x6e,0x52,0x54,0x4b,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69, +0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e, +0x65,0x72,0x22,0x3e,0x0a,0x09,0x09,0x09,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x22,0x3e,0x20,0x20,0x0a,0x09,0x09,0x09, +0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x20,0x20,0x0a, +0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x31,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x74,0x69,0x74,0x6c, +0x65,0x22,0x3e,0x4d,0x45,0x4e,0x55,0x3c,0x2f,0x68,0x31,0x3e,0x0a,0x09,0x09,0x09, +0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c, +0x75,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x62, +0x6f,0x64,0x79,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22, +0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x72,0x75,0x6e,0x53,0x74,0x61, +0x74,0x75,0x73,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b, +0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x75,0x6e,0x6e,0x69, +0x6e,0x67,0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c, +0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20, +0x68,0x72,0x65,0x66,0x3d,0x22,0x77,0x6f,0x72,0x6b,0x43,0x66,0x67,0x2e,0x73,0x68, +0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75, +0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x57,0x6f,0x72,0x6b,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67, +0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72, +0x65,0x66,0x3d,0x22,0x75,0x73,0x65,0x72,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d, +0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x55,0x73,0x65,0x72,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72, +0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65, +0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66, +0x3d,0x22,0x65,0x74,0x68,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d, +0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x22, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x45,0x74,0x68,0x65,0x72,0x6e, +0x65,0x74,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e, +0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c, +0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74, +0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x64,0x65,0x76, +0x69,0x63,0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f, +0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44, +0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c,0x2f, +0x6c,0x69,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c,0x3e,0x0a,0x09,0x09, +0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0a, +0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x68,0x31,0x3e,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x3c,0x2f,0x68, +0x31,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x77,0x69, +0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x20,0x66,0x6c,0x6f,0x61,0x74, +0x3a,0x6c,0x65,0x66,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b, +0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x53, +0x75,0x6d,0x6d,0x61,0x72,0x79,0x3c,0x2f,0x68,0x31,0x3e,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c, +0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65, +0x6c,0x5f,0x31,0x22,0x3e,0x44,0x48,0x43,0x50,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, +0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x64,0x68,0x63,0x70, +0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x49,0x50,0x20,0x41, +0x64,0x64,0x72,0x65,0x73,0x73,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c, +0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x69,0x70,0x22,0x3e,0x3c,0x2f,0x74, +0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e, +0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61, +0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d, +0x22,0x6e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74, +0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61, +0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c, +0x5f,0x31,0x22,0x3e,0x47,0x61,0x74,0x65,0x77,0x61,0x79,0x3a,0x3c,0x2f,0x6c,0x61, +0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x67,0x61, +0x74,0x65,0x77,0x61,0x79,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f, +0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22, +0x3e,0x4d,0x41,0x43,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65, +0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x6d,0x61,0x63,0x22,0x3e,0x3c,0x2f,0x74,0x65, +0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72, +0x65,0x3c,0x2f,0x68,0x31,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x69,0x64,0x3d,0x27, +0x45,0x74,0x68,0x6e,0x65,0x74,0x43,0x6f,0x6e,0x66,0x69,0x67,0x27,0x20,0x6d,0x65, +0x74,0x68,0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27,0x20,0x61,0x63,0x74,0x69, +0x6f,0x6e,0x3d,0x27,0x65,0x74,0x68,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x63,0x67, +0x69,0x27,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c, +0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, +0x65,0x6c,0x5f,0x31,0x22,0x3e,0x4d,0x4f,0x44,0x45,0x3a,0x3c,0x2f,0x6c,0x61,0x62, +0x65,0x6c,0x3e,0x3c,0x73,0x65,0x6c,0x65,0x63,0x74,0x20,0x69,0x64,0x3d,0x22,0x65, +0x74,0x68,0x6d,0x6f,0x64,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x65,0x74, +0x68,0x6d,0x6f,0x64,0x65,0x22,0x20,0x6f,0x6e,0x63,0x68,0x61,0x6e,0x67,0x65,0x3d, +0x22,0x63,0x68,0x61,0x6e,0x67,0x65,0x5f,0x65,0x74,0x68,0x6d,0x6f,0x64,0x65,0x28, +0x29,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x6f,0x70,0x74,0x69,0x6f,0x6e,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x22, +0x30,0x22,0x3e,0x44,0x48,0x43,0x50,0x3c,0x2f,0x6f,0x70,0x74,0x69,0x6f,0x6e,0x3e, +0x3c,0x6f,0x70,0x74,0x69,0x6f,0x6e,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x22, +0x31,0x22,0x3e,0x53,0x54,0x41,0x54,0x49,0x43,0x3c,0x2f,0x6f,0x70,0x74,0x69,0x6f, +0x6e,0x3e,0x3c,0x2f,0x73,0x65,0x6c,0x65,0x63,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x53,0x54,0x41,0x54,0x49, +0x43,0x20,0x49,0x50,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e, +0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20, +0x69,0x64,0x3d,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x49,0x70,0x27,0x20,0x6e,0x61, +0x6d,0x65,0x3d,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x49,0x70,0x27,0x20,0x73,0x69, +0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64, +0x3d,0x74,0x72,0x75,0x65,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x53,0x54, +0x41,0x54,0x49,0x43,0x20,0x4e,0x45,0x54,0x4d,0x41,0x53,0x4b,0x3a,0x3c,0x2f,0x6c, +0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, +0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x73,0x74,0x61,0x74, +0x69,0x63,0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, +0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x27,0x20, +0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x64,0x69,0x73,0x61,0x62,0x6c, +0x65,0x64,0x3d,0x74,0x72,0x75,0x65,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e, +0x53,0x54,0x41,0x54,0x49,0x43,0x20,0x47,0x41,0x54,0x45,0x57,0x41,0x59,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79, +0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x73,0x74, +0x61,0x74,0x69,0x63,0x47,0x61,0x74,0x65,0x77,0x61,0x79,0x27,0x20,0x6e,0x61,0x6d, +0x65,0x3d,0x27,0x73,0x74,0x61,0x74,0x69,0x63,0x47,0x61,0x74,0x65,0x77,0x61,0x79, +0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x64,0x69,0x73,0x61, +0x62,0x6c,0x65,0x64,0x3d,0x74,0x72,0x75,0x65,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61, +0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x76, +0x61,0x6c,0x75,0x65,0x3d,0x27,0x53,0x41,0x56,0x45,0x27,0x2f,0x3e,0x3c,0x2f,0x70, +0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x0a,0x09,0x09,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20, +0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73, +0x63,0x72,0x69,0x70,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x63,0x68,0x61, +0x6e,0x67,0x65,0x5f,0x65,0x74,0x68,0x6d,0x6f,0x64,0x65,0x28,0x29,0x7b,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69, +0x66,0x20,0x28,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45, +0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x65,0x74,0x68,0x6d, +0x6f,0x64,0x65,0x22,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x3d,0x20,0x30, +0x29,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74, +0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28, +0x22,0x73,0x74,0x61,0x74,0x69,0x63,0x49,0x70,0x22,0x29,0x2e,0x64,0x69,0x73,0x61, +0x62,0x6c,0x65,0x64,0x20,0x3d,0x20,0x74,0x72,0x75,0x65,0x3b,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65, +0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x73,0x74,0x61,0x74,0x69,0x63, +0x4e,0x65,0x74,0x6d,0x61,0x73,0x6b,0x22,0x29,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c, +0x65,0x64,0x20,0x3d,0x20,0x74,0x72,0x75,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64, +0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65, +0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x73,0x74,0x61,0x74,0x69,0x63,0x47,0x61, +0x74,0x65,0x77,0x61,0x79,0x22,0x29,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64, +0x20,0x3d,0x20,0x74,0x72,0x75,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20, +0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67, +0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x73, +0x74,0x61,0x74,0x69,0x63,0x49,0x70,0x22,0x29,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c, +0x65,0x64,0x20,0x3d,0x20,0x66,0x61,0x6c,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d, +0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x73,0x74,0x61,0x74,0x69,0x63,0x4e, +0x65,0x74,0x6d,0x61,0x73,0x6b,0x22,0x29,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65, +0x64,0x20,0x3d,0x20,0x66,0x61,0x6c,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64, +0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65, +0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x73,0x74,0x61,0x74,0x69,0x63,0x47,0x61, +0x74,0x65,0x77,0x61,0x79,0x22,0x29,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64, +0x20,0x3d,0x20,0x66,0x61,0x6c,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x09,0x09,0x3c,0x2f,0x73,0x63, +0x72,0x69,0x70,0x74,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78, +0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x27,0x20,0x73,0x72, +0x63,0x3d,0x27,0x65,0x74,0x68,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x6a,0x73,0x27, +0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0a,0x09,0x3c,0x2f,0x62,0x6f, +0x64,0x79,0x3e,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0x0a,}; + +static const unsigned int dummy_align__runStatus_shtml = 3; +static const unsigned char data__runStatus_shtml[] = { +/* /runStatus.shtml (17 chars) */ +0x2f,0x72,0x75,0x6e,0x53,0x74,0x61,0x74,0x75,0x73,0x2e,0x73,0x68,0x74,0x6d,0x6c, +0x00,0x00,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/html +Expires: Fri, 10 Apr 2008 14:00:00 GMT +Pragma: no-cache + +" (85 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x45,0x78,0x70,0x69,0x72,0x65,0x73, +0x3a,0x20,0x46,0x72,0x69,0x2c,0x20,0x31,0x30,0x20,0x41,0x70,0x72,0x20,0x32,0x30, +0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, +0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, +0x65,0x0d,0x0a,0x0d,0x0a, +/* raw file data (13382 bytes) */ +0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0d, +0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e, +0x0d,0x0a,0x09,0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65, +0x74,0x3d,0x22,0x55,0x54,0x46,0x2d,0x38,0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x69,0x74,0x6c,0x65,0x3e,0x4f,0x70,0x65, +0x6e,0x52,0x54,0x4b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d, +0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x74,0x79,0x70, +0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x2f,0x63,0x73,0x73,0x22,0x20,0x68,0x72,0x65, +0x66,0x3d,0x22,0x63,0x73,0x73,0x2f,0x73,0x74,0x79,0x6c,0x65,0x2e,0x63,0x73,0x73, +0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73, +0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x24,0x28,0x69, +0x64,0x29,0x20,0x7b,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x64,0x6f,0x63,0x75, +0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42, +0x79,0x49,0x64,0x28,0x69,0x64,0x29,0x3b,0x20,0x7d,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f, +0x6e,0x20,0x70,0x6f,0x73,0x43,0x61,0x6c,0x6c,0x62,0x61,0x63,0x6b,0x28,0x6f,0x29, +0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x73,0x74,0x61,0x4d,0x20,0x3d, +0x3d,0x20,0x30,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x73, +0x74,0x61,0x4d,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x27,0x4e,0x54,0x52,0x49,0x50,0x2d,0x43,0x4c,0x49,0x45,0x4e,0x54,0x27, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x73, +0x74,0x61,0x4d,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x4d,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72, +0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4f,0x50,0x45,0x4e,0x41,0x52,0x4b,0x2d, +0x43,0x4c,0x49,0x45,0x4e,0x54,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20, +0x69,0x66,0x20,0x28,0x6f,0x2e,0x73,0x74,0x61,0x4d,0x20,0x3d,0x3d,0x20,0x32,0x29, +0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x4d,0x27, +0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e, +0x54,0x52,0x49,0x50,0x2d,0x53,0x45,0x52,0x56,0x45,0x52,0x27,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d, +0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x73,0x74,0x61,0x53,0x20,0x3d,0x3d, +0x20,0x30,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x73,0x74, +0x61,0x53,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d, +0x20,0x27,0x4e,0x54,0x52,0x49,0x50,0x2d,0x43,0x4c,0x49,0x45,0x4e,0x54,0x20,0x26, +0x20,0x44,0x49,0x53,0x43,0x4f,0x4e,0x4e,0x45,0x43,0x54,0x45,0x44,0x27,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x73,0x74,0x61, +0x53,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24, +0x28,0x27,0x73,0x74,0x61,0x53,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65, +0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x54,0x52,0x49,0x50,0x2d,0x43,0x4c,0x49,0x45, +0x4e,0x54,0x20,0x26,0x20,0x43,0x4f,0x4e,0x4e,0x45,0x43,0x54,0x45,0x44,0x27,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x73,0x74, +0x61,0x53,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x24,0x28,0x27,0x73,0x74,0x61,0x53,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54, +0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x54,0x52,0x49,0x50,0x2d,0x43,0x4c,0x49, +0x45,0x4e,0x54,0x20,0x26,0x20,0x52,0x54,0x43,0x4d,0x20,0x41,0x56,0x41,0x49,0x4c, +0x41,0x42,0x4c,0x45,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66, +0x20,0x28,0x6f,0x2e,0x73,0x74,0x61,0x53,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x53,0x27,0x29,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4f,0x50,0x45, +0x4e,0x41,0x52,0x43,0x2d,0x43,0x4c,0x49,0x45,0x4e,0x54,0x20,0x26,0x20,0x47,0x45, +0x54,0x20,0x53,0x45,0x53,0x53,0x49,0x4f,0x4e,0x2e,0x2e,0x2e,0x27,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, +0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x73,0x74,0x61,0x53, +0x20,0x3d,0x3d,0x20,0x34,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28, +0x27,0x73,0x74,0x61,0x53,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78, +0x74,0x20,0x3d,0x20,0x27,0x4f,0x50,0x45,0x4e,0x41,0x52,0x43,0x2d,0x43,0x4c,0x49, +0x45,0x4e,0x54,0x20,0x26,0x20,0x44,0x49,0x53,0x43,0x4f,0x4e,0x4e,0x45,0x43,0x54, +0x45,0x44,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28, +0x6f,0x2e,0x73,0x74,0x61,0x53,0x20,0x3d,0x3d,0x20,0x35,0x29,0x20,0x7b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x53,0x27,0x29,0x2e,0x69,0x6e, +0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4f,0x50,0x45,0x4e,0x41, +0x52,0x43,0x2d,0x43,0x4c,0x49,0x45,0x4e,0x54,0x20,0x26,0x20,0x43,0x4f,0x4e,0x4e, +0x45,0x43,0x54,0x45,0x44,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69, +0x66,0x20,0x28,0x6f,0x2e,0x73,0x74,0x61,0x53,0x20,0x3d,0x3d,0x20,0x36,0x29,0x20, +0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x53,0x27,0x29, +0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4f,0x50, +0x45,0x4e,0x41,0x52,0x43,0x2d,0x43,0x4c,0x49,0x45,0x4e,0x54,0x20,0x26,0x20,0x52, +0x54,0x43,0x4d,0x20,0x41,0x56,0x41,0x49,0x4c,0x41,0x42,0x4c,0x45,0x27,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x73,0x74,0x61, +0x53,0x20,0x3d,0x3d,0x20,0x37,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24, +0x28,0x27,0x73,0x74,0x61,0x53,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65, +0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x54,0x52,0x49,0x50,0x2d,0x53,0x45,0x52,0x56, +0x45,0x52,0x20,0x26,0x20,0x44,0x49,0x53,0x43,0x4f,0x4e,0x4e,0x45,0x43,0x54,0x45, +0x44,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f, +0x2e,0x73,0x74,0x61,0x53,0x20,0x3d,0x3d,0x20,0x38,0x29,0x20,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x53,0x27,0x29,0x2e,0x69,0x6e,0x6e, +0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x54,0x52,0x49,0x50,0x2d, +0x53,0x45,0x52,0x56,0x45,0x52,0x20,0x26,0x20,0x43,0x4f,0x4e,0x4e,0x45,0x43,0x54, +0x45,0x44,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28, +0x6f,0x2e,0x73,0x74,0x61,0x53,0x20,0x3d,0x3d,0x20,0x39,0x29,0x20,0x7b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x53,0x27,0x29,0x2e,0x69,0x6e, +0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x54,0x52,0x49,0x50, +0x2d,0x53,0x45,0x52,0x56,0x45,0x52,0x20,0x26,0x20,0x52,0x54,0x43,0x4d,0x20,0x4f, +0x55,0x54,0x50,0x55,0x54,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20, +0x28,0x24,0x28,0x27,0x67,0x70,0x73,0x57,0x65,0x65,0x6b,0x27,0x29,0x29,0x20,0x24, +0x28,0x27,0x67,0x70,0x73,0x57,0x65,0x65,0x6b,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65, +0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x77,0x65,0x65,0x6b,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x69,0x6d,0x65,0x4f,0x66,0x57,0x65, +0x65,0x6b,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x74,0x69,0x6d,0x65,0x4f,0x66,0x57, +0x65,0x65,0x6b,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x74, +0x6f,0x77,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x32,0x29,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x73,0x74,0x61,0x4d,0x20,0x21,0x3d, +0x20,0x32,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f, +0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64, +0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20, +0x27,0x49,0x4e,0x56,0x41,0x4c,0x49,0x44,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, +0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x72,0x74,0x6b,0x6d, +0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x69, +0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x53,0x50,0x50,0x27, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20, +0x28,0x6f,0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d,0x3d,0x20,0x34,0x29,0x20,0x7b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d, +0x6f,0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x27,0x52,0x54,0x4b,0x5f,0x46,0x49,0x58,0x45,0x44,0x27,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e, +0x72,0x74,0x6b,0x6d,0x20,0x3d,0x3d,0x20,0x35,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64,0x65, +0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27, +0x52,0x54,0x4b,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x69, +0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x72,0x74,0x6b, +0x6d,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x6c,0x61,0x74,0x69,0x74,0x75,0x64,0x65, +0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x6c,0x61,0x74,0x69,0x74,0x75,0x64,0x65,0x27, +0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70,0x61, +0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x6c,0x61,0x74,0x29,0x2e, +0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x38,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x6c,0x6f,0x6e,0x67,0x69,0x74,0x75,0x64, +0x65,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x6c,0x6f,0x6e,0x67,0x69,0x74,0x75,0x64, +0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20, +0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x6c,0x6f,0x6e, +0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x38,0x29,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x68,0x65,0x69,0x67,0x68,0x74, +0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x68,0x65,0x69,0x67,0x68,0x74,0x27,0x29,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70,0x61,0x72,0x73, +0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x61,0x6c,0x74,0x29,0x2e,0x74,0x6f, +0x46,0x69,0x78,0x65,0x64,0x28,0x33,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69, +0x66,0x20,0x28,0x24,0x28,0x27,0x73,0x76,0x73,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x73,0x76,0x73,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x6f,0x2e,0x73,0x76,0x73,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x28,0x24,0x28,0x27,0x68,0x64,0x6f,0x70,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x68,0x64,0x6f,0x70,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74, +0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e, +0x68,0x64,0x6f,0x70,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x31,0x29, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x61,0x67, +0x65,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x61,0x67,0x65,0x27,0x29,0x2e,0x69,0x6e, +0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46, +0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x61,0x67,0x65,0x29,0x2e,0x74,0x6f,0x46,0x69, +0x78,0x65,0x64,0x28,0x31,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x69,0x73,0x20,0x3d,0x3d,0x20,0x30, +0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27, +0x69,0x6e,0x73,0x53,0x74,0x61,0x74,0x75,0x73,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65, +0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x53,0x5f,0x49,0x4e,0x41, +0x43,0x54,0x49,0x56,0x45,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c, +0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x69,0x73,0x20,0x3d,0x3d,0x20,0x32, +0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27, +0x69,0x6e,0x73,0x53,0x74,0x61,0x74,0x75,0x73,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65, +0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x53,0x5f,0x49,0x4e,0x41, +0x43,0x54,0x49,0x56,0x45,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c, +0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x69,0x73,0x20,0x3d,0x3d,0x20,0x33, +0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27, +0x69,0x6e,0x73,0x53,0x74,0x61,0x74,0x75,0x73,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65, +0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x53,0x5f,0x53,0x4f,0x4c, +0x55,0x54,0x49,0x4f,0x4e,0x5f,0x47,0x4f,0x4f,0x44,0x27,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x69,0x73, +0x20,0x3d,0x3d,0x20,0x34,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x24,0x28,0x27,0x69,0x6e,0x73,0x53,0x74,0x61,0x74,0x75,0x73,0x27,0x29, +0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e, +0x53,0x5f,0x53,0x4f,0x4c,0x55,0x54,0x49,0x4f,0x4e,0x5f,0x46,0x52,0x45,0x45,0x27, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20, +0x28,0x6f,0x2e,0x69,0x73,0x20,0x3d,0x3d,0x20,0x35,0x29,0x20,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x69,0x6e,0x73,0x53,0x74,0x61, +0x74,0x75,0x73,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x27,0x49,0x4e,0x53,0x5f,0x41,0x4c,0x49,0x47,0x4e,0x4d,0x45,0x4e,0x54, +0x5f,0x43,0x4f,0x4d,0x50,0x4c,0x45,0x54,0x45,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x24,0x28,0x27,0x69,0x6e,0x73,0x53,0x74,0x61,0x74,0x75,0x73,0x27,0x29, +0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e, +0x53,0x5f,0x49,0x4e,0x41,0x43,0x54,0x49,0x56,0x45,0x27,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e, +0x69,0x70,0x74,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x69,0x6e,0x73,0x50,0x6f,0x73,0x69,0x74, +0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54, +0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x53,0x5f,0x49,0x4e,0x56,0x41,0x4c, +0x49,0x44,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20, +0x69,0x66,0x20,0x28,0x6f,0x2e,0x69,0x70,0x74,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20, +0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x69,0x6e, +0x73,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x27,0x29,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x53, +0x5f,0x53,0x50,0x50,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73, +0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x69,0x70,0x74,0x20,0x3d,0x3d,0x20,0x32, +0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27, +0x69,0x6e,0x73,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x27, +0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49, +0x4e,0x53,0x5f,0x49,0x4e,0x56,0x41,0x4c,0x49,0x44,0x27,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x69,0x70, +0x74,0x20,0x3d,0x3d,0x20,0x34,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x24,0x28,0x27,0x69,0x6e,0x73,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f, +0x6e,0x54,0x79,0x70,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78, +0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x53,0x5f,0x52,0x54,0x4b,0x46,0x49,0x58,0x45, +0x44,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69, +0x66,0x20,0x28,0x6f,0x2e,0x69,0x70,0x74,0x20,0x3d,0x3d,0x20,0x35,0x29,0x20,0x7b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x69,0x6e,0x73, +0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x27,0x29,0x2e,0x69, +0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x53,0x5f, +0x52,0x54,0x4b,0x46,0x4c,0x4f,0x41,0x54,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, +0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x24,0x28,0x27,0x69,0x6e,0x73,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x54, +0x79,0x70,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x6f,0x2e,0x69,0x70,0x74,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x76,0x6d,0x20,0x3d, +0x3d,0x20,0x30,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x24,0x28,0x27,0x76,0x65,0x6c,0x4d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e, +0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x56,0x41,0x4c,0x49, +0x44,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69, +0x66,0x20,0x28,0x6f,0x2e,0x76,0x6d,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x76,0x65,0x6c,0x4d, +0x6f,0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x27,0x44,0x4f,0x50,0x50,0x4c,0x45,0x52,0x27,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x76,0x6d, +0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x24,0x28,0x27,0x76,0x65,0x6c,0x4d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x69, +0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x49,0x4e,0x53,0x5f, +0x46,0x52,0x45,0x45,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73, +0x65,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27, +0x76,0x65,0x6c,0x4d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54, +0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x76,0x6d,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28, +0x27,0x6e,0x6f,0x72,0x74,0x68,0x56,0x65,0x6c,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x6e,0x6f,0x72,0x74,0x68,0x56,0x65,0x6c,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72, +0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61, +0x74,0x28,0x6f,0x2e,0x6e,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x33, +0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x65, +0x61,0x73,0x74,0x56,0x65,0x6c,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x65,0x61,0x73, +0x74,0x56,0x65,0x6c,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74, +0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e, +0x65,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x33,0x29,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x75,0x70,0x56,0x65,0x6c, +0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x75,0x70,0x56,0x65,0x6c,0x27,0x29,0x2e,0x69, +0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65, +0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x75,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78, +0x65,0x64,0x28,0x33,0x29,0x3b,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x28,0x24,0x28,0x27,0x72,0x6f,0x6c,0x6c,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x72,0x6f,0x6c,0x6c,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74, +0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e, +0x72,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x33,0x29,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x70,0x69,0x74,0x63,0x68, +0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x70,0x69,0x74,0x63,0x68,0x27,0x29,0x2e,0x69, +0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65, +0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x70,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78, +0x65,0x64,0x28,0x33,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, +0x24,0x28,0x27,0x68,0x65,0x61,0x64,0x69,0x6e,0x67,0x27,0x29,0x29,0x20,0x24,0x28, +0x27,0x68,0x65,0x61,0x64,0x69,0x6e,0x67,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72, +0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61, +0x74,0x28,0x6f,0x2e,0x68,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x33, +0x29,0x3b,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d, +0x3d,0x20,0x30,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e, +0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x52,0x45,0x46,0x27,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f, +0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64, +0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20, +0x27,0x53,0x50,0x50,0x20,0x26,0x20,0x57,0x41,0x49,0x54,0x49,0x4e,0x47,0x27,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28, +0x6f,0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f, +0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d, +0x20,0x27,0x53,0x50,0x50,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c, +0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d,0x3d, +0x20,0x33,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24, +0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65, +0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x52,0x54,0x4b,0x20,0x26,0x20,0x57, +0x41,0x49,0x54,0x49,0x4e,0x47,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65, +0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d, +0x3d,0x20,0x34,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e, +0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x52,0x54,0x4b,0x27,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f, +0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d,0x3d,0x20,0x35,0x29,0x20,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d,0x6f,0x64, +0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20, +0x27,0x41,0x55,0x54,0x4f,0x20,0x26,0x20,0x57,0x41,0x49,0x54,0x49,0x4e,0x47,0x27, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20, +0x28,0x6f,0x2e,0x72,0x74,0x6b,0x6d,0x20,0x3d,0x3d,0x20,0x36,0x29,0x20,0x7b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x74,0x6b,0x6d, +0x6f,0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x27,0x41,0x55,0x54,0x4f,0x27,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d, +0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x6c,0x61,0x74,0x69,0x74,0x75, +0x64,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d, +0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x6c,0x61, +0x74,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x38,0x29,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x6c,0x6f,0x6e,0x67,0x69,0x74,0x75,0x64,0x65, +0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70, +0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x6c,0x6f,0x6e,0x29, +0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x38,0x29,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x24,0x28,0x27,0x68,0x65,0x69,0x67,0x68,0x74,0x27,0x29,0x2e,0x69,0x6e, +0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46, +0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x61,0x6c,0x74,0x29,0x2e,0x74,0x6f,0x46,0x69, +0x78,0x65,0x64,0x28,0x33,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27, +0x73,0x76,0x73,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20, +0x3d,0x20,0x27,0x4e,0x2f,0x41,0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28, +0x27,0x68,0x64,0x6f,0x70,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78, +0x74,0x20,0x3d,0x20,0x27,0x4e,0x2f,0x41,0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x24,0x28,0x27,0x61,0x67,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65, +0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x2f,0x41,0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x24,0x28,0x27,0x69,0x6e,0x73,0x53,0x74,0x61,0x74,0x75,0x73,0x27,0x29,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x2f,0x41, +0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x69,0x6e,0x73,0x50,0x6f, +0x73,0x69,0x74,0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x27,0x29,0x2e,0x69,0x6e,0x6e, +0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x2f,0x41,0x27,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x76,0x65,0x6c,0x4d,0x6f,0x64,0x65,0x27, +0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e, +0x2f,0x41,0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x6e,0x6f,0x72, +0x74,0x68,0x56,0x65,0x6c,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78, +0x74,0x20,0x3d,0x20,0x27,0x4e,0x2f,0x41,0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x24,0x28,0x27,0x65,0x61,0x73,0x74,0x56,0x65,0x6c,0x27,0x29,0x2e,0x69,0x6e,0x6e, +0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x2f,0x41,0x27,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x75,0x70,0x56,0x65,0x6c,0x27,0x29,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x2f,0x41, +0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x6f,0x6c,0x6c,0x27, +0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e, +0x2f,0x41,0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x70,0x69,0x74, +0x63,0x68,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d, +0x20,0x27,0x4e,0x2f,0x41,0x27,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27, +0x68,0x65,0x61,0x64,0x69,0x6e,0x67,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54, +0x65,0x78,0x74,0x20,0x3d,0x20,0x27,0x4e,0x2f,0x41,0x27,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d, +0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x62,0x64,0x73,0x27,0x29,0x29, +0x20,0x24,0x28,0x27,0x62,0x64,0x73,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54, +0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x62,0x64,0x73,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x28,0x24,0x28,0x27,0x67,0x70,0x73,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x67, +0x70,0x73,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d, +0x20,0x6f,0x2e,0x67,0x70,0x73,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27, +0x67,0x6c,0x6f,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x67,0x6c,0x6f,0x27,0x29,0x2e, +0x69,0x6e,0x6e,0x65,0x72,0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x67,0x6c, +0x6f,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x67,0x61,0x6c,0x27,0x29, +0x29,0x20,0x24,0x28,0x27,0x67,0x61,0x6c,0x27,0x29,0x2e,0x69,0x6e,0x6e,0x65,0x72, +0x54,0x65,0x78,0x74,0x20,0x3d,0x20,0x6f,0x2e,0x67,0x61,0x6c,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74, +0x69,0x6f,0x6e,0x20,0x67,0x65,0x74,0x49,0x6e,0x66,0x6f,0x28,0x75,0x72,0x6c,0x29, +0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x78,0x68,0x72,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28, +0x77,0x69,0x6e,0x64,0x6f,0x77,0x2e,0x58,0x4d,0x4c,0x48,0x74,0x74,0x70,0x52,0x65, +0x71,0x75,0x65,0x73,0x74,0x29,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x68,0x72, +0x20,0x3d,0x20,0x6e,0x65,0x77,0x20,0x58,0x4d,0x4c,0x48,0x74,0x74,0x70,0x52,0x65, +0x71,0x75,0x65,0x73,0x74,0x28,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x68,0x72,0x20,0x3d,0x20,0x6e,0x65,0x77,0x20, +0x41,0x63,0x74,0x69,0x76,0x65,0x58,0x4f,0x62,0x6a,0x65,0x63,0x74,0x28,0x27,0x4d, +0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x58,0x4d,0x4c,0x48,0x54,0x54,0x50, +0x27,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x68,0x72,0x2e,0x6f,0x6e,0x72,0x65, +0x61,0x64,0x79,0x73,0x74,0x61,0x74,0x65,0x63,0x68,0x61,0x6e,0x67,0x65,0x20,0x3d, +0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x29,0x7b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x69,0x66,0x28,0x78,0x68,0x72,0x2e,0x72,0x65,0x61,0x64,0x79,0x53,0x74, +0x61,0x74,0x65,0x20,0x3d,0x3d,0x3d,0x20,0x34,0x29,0x7b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x68,0x72,0x2e,0x73,0x74,0x61,0x74, +0x75,0x73,0x20,0x3d,0x3d,0x20,0x32,0x30,0x30,0x29,0x7b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x76,0x61,0x6c,0x28,0x78,0x68, +0x72,0x2e,0x72,0x65,0x73,0x70,0x6f,0x6e,0x73,0x65,0x54,0x65,0x78,0x74,0x29,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x68,0x72,0x2e,0x6f,0x70,0x65,0x6e,0x28, +0x27,0x67,0x65,0x74,0x27,0x2c,0x20,0x75,0x72,0x6c,0x2c,0x20,0x74,0x72,0x75,0x65, +0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x78,0x68,0x72,0x2e,0x73,0x65,0x6e,0x64,0x28,0x29,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e, +0x63,0x74,0x69,0x6f,0x6e,0x20,0x72,0x65,0x66,0x4e,0x65,0x77,0x28,0x29,0x7b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x67,0x65,0x74,0x49,0x6e,0x66,0x6f,0x28,0x27,0x70,0x6f,0x73,0x69,0x74,0x69, +0x6f,0x6e,0x2e,0x6a,0x73,0x27,0x29,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c, +0x2f,0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x0d,0x0a,0x09,0x3c,0x62,0x6f,0x64,0x79, +0x20,0x6f,0x6e,0x6c,0x6f,0x61,0x64,0x3d,0x22,0x6a,0x61,0x76,0x61,0x73,0x63,0x72, +0x69,0x70,0x74,0x3a,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28, +0x27,0x72,0x65,0x66,0x4e,0x65,0x77,0x28,0x29,0x27,0x2c,0x31,0x30,0x30,0x30,0x29, +0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x65,0x61, +0x64,0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f, +0x70,0x73,0x2d,0x74,0x6f,0x70,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61, +0x20,0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63, +0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c, +0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x22, +0x3e,0x20,0x20,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61, +0x64,0x65,0x72,0x22,0x3e,0x20,0x20,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x68, +0x31,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65, +0x61,0x64,0x65,0x72,0x5f,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x4d,0x45,0x4e,0x55, +0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61, +0x64,0x65,0x72,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x75,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x6f,0x64,0x79,0x22,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20, +0x68,0x72,0x65,0x66,0x3d,0x22,0x72,0x75,0x6e,0x53,0x74,0x61,0x74,0x75,0x73,0x2e, +0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65, +0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x69,0x73,0x2d, +0x61,0x63,0x74,0x69,0x76,0x65,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x52,0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x53,0x74,0x61,0x74,0x75,0x73, +0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x77,0x6f, +0x72,0x6b,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, +0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x6f, +0x72,0x6b,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e, +0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x75,0x73, +0x65,0x72,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, +0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x73, +0x65,0x72,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e, +0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x65,0x74, +0x68,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e, +0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x45,0x74,0x68, +0x65,0x72,0x6e,0x65,0x74,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74, +0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d, +0x22,0x64,0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d, +0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c, +0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f, +0x75,0x6c,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64, +0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e, +0x74,0x2d,0x77,0x72,0x61,0x70,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68, +0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e, +0x52,0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x3c,0x2f, +0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74,0x79,0x6c,0x65, +0x3d,0x22,0x77,0x69,0x64,0x74,0x68,0x3a,0x20,0x31,0x31,0x31,0x30,0x70,0x78,0x3b, +0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x32,0x30,0x70,0x78,0x3b,0x22,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74,0x79,0x6c,0x65, +0x3d,0x22,0x77,0x69,0x64,0x74,0x68,0x3a,0x33,0x37,0x30,0x70,0x78,0x3b,0x20,0x66, +0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x3b,0x22,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x47,0x45, +0x4e,0x45,0x52,0x41,0x4c,0x3a,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x53, +0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x4d,0x6f,0x64,0x65,0x3a,0x3c,0x2f,0x6c,0x61, +0x62,0x65,0x6c,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x70,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x73, +0x74,0x61,0x4d,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x63,0x6f,0x6c,0x6f, +0x72,0x3a,0x63,0x6f,0x72,0x6e,0x66,0x6c,0x6f,0x77,0x65,0x72,0x62,0x6c,0x75,0x65, +0x3b,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65, +0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31, +0x22,0x3e,0x53,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x53,0x74,0x61,0x74,0x75,0x73, +0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20, +0x69,0x64,0x3d,0x22,0x73,0x74,0x61,0x53,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d, +0x22,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x63,0x6f,0x72,0x6e,0x66,0x6c,0x6f,0x77, +0x65,0x72,0x62,0x6c,0x75,0x65,0x3b,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62, +0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22, +0x77,0x69,0x64,0x74,0x68,0x3a,0x33,0x37,0x30,0x70,0x78,0x3b,0x20,0x66,0x6c,0x6f, +0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x3b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x47,0x50,0x53,0x20, +0x54,0x69,0x6d,0x65,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x47,0x50,0x53, +0x20,0x57,0x65,0x65,0x6b,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74, +0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x67,0x70,0x73,0x57,0x65,0x65,0x6b,0x22, +0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e, +0x54,0x69,0x6d,0x65,0x20,0x6f,0x66,0x20,0x57,0x65,0x65,0x6b,0x28,0x73,0x29,0x3a, +0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64, +0x3d,0x22,0x74,0x69,0x6d,0x65,0x4f,0x66,0x57,0x65,0x65,0x6b,0x22,0x3e,0x3c,0x2f, +0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x75,0x62, +0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f, +0x6e,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x4d,0x6f,0x64,0x65,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d, +0x22,0x72,0x74,0x6b,0x6d,0x6f,0x64,0x65,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74, +0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x4c,0x61,0x74,0x69,0x74,0x75,0x64, +0x65,0x28,0xc2,0xb0,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74, +0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x6c,0x61,0x74,0x69,0x74,0x75,0x64,0x65, +0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22, +0x3e,0x4c,0x6f,0x6e,0x67,0x69,0x74,0x75,0x64,0x65,0x28,0xc2,0xb0,0x29,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d, +0x22,0x6c,0x6f,0x6e,0x67,0x69,0x74,0x75,0x64,0x65,0x22,0x3e,0x3c,0x2f,0x74,0x65, +0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x48,0x65,0x69,0x67,0x68, +0x74,0x28,0x6d,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65, +0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x68,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x3c, +0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x4e,0x75, +0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x53,0x56,0x73,0x3a,0x3c,0x2f,0x6c,0x61, +0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x73,0x76, +0x73,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65, +0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31, +0x22,0x3e,0x48,0x44,0x4f,0x50,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c, +0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x68,0x64,0x6f,0x70,0x22,0x3e,0x3c, +0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x41,0x47, +0x45,0x28,0x73,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65, +0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x61,0x67,0x65,0x22,0x3e,0x3c,0x2f,0x74,0x65, +0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74, +0x79,0x6c,0x65,0x3d,0x22,0x77,0x69,0x64,0x74,0x68,0x3a,0x33,0x37,0x30,0x70,0x78, +0x3b,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x3b,0x22,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31, +0x3e,0x49,0x4e,0x53,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x49,0x4e,0x53, +0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e, +0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x69,0x6e,0x73,0x53,0x74,0x61, +0x74,0x75,0x73,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61, +0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c, +0x5f,0x31,0x22,0x3e,0x49,0x4e,0x53,0x20,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, +0x20,0x54,0x79,0x70,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74, +0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x69,0x6e,0x73,0x50,0x6f,0x73,0x69,0x74, +0x69,0x6f,0x6e,0x54,0x79,0x70,0x65,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62, +0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b, +0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x68,0x31,0x3e,0x56,0x65,0x6c,0x6f,0x63,0x69,0x74,0x79,0x3c,0x2f,0x68,0x31, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c, +0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65, +0x6c,0x5f,0x31,0x22,0x3e,0x56,0x65,0x6c,0x20,0x4d,0x6f,0x64,0x65,0x3a,0x3c,0x2f, +0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22, +0x76,0x65,0x6c,0x4d,0x6f,0x64,0x65,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70, +0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c, +0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x4e,0x6f,0x72,0x74,0x68,0x28,0x6d,0x2f, +0x73,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74, +0x20,0x69,0x64,0x3d,0x22,0x6e,0x6f,0x72,0x74,0x68,0x56,0x65,0x6c,0x22,0x3e,0x3c, +0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x45,0x61, +0x73,0x74,0x28,0x6d,0x2f,0x73,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e, +0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x65,0x61,0x73,0x74,0x56,0x65, +0x6c,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65, +0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31, +0x22,0x3e,0x55,0x70,0x28,0x6d,0x2f,0x73,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, +0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x75,0x70,0x56,0x65, +0x6c,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x41,0x74, +0x74,0x69,0x74,0x75,0x64,0x65,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x52, +0x6f,0x6c,0x6c,0x28,0xc2,0xb0,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e, +0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x72,0x6f,0x6c,0x6c,0x22,0x3e, +0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x50, +0x69,0x74,0x63,0x68,0x28,0xc2,0xb0,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c, +0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x70,0x69,0x74,0x63,0x68, +0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22, +0x3e,0x48,0x65,0x61,0x64,0x69,0x6e,0x67,0x28,0xc2,0xb0,0x29,0x3a,0x3c,0x2f,0x6c, +0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x68, +0x65,0x61,0x64,0x69,0x6e,0x67,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c, +0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x64,0x69,0x76,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x77,0x69,0x64,0x74,0x68, +0x3a,0x20,0x31,0x30,0x30,0x25,0x3b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x75,0x62,0x62,0x6c, +0x6f,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x68,0x31,0x3e,0x53,0x61,0x74,0x65,0x6c,0x6c,0x69,0x74,0x65,0x73,0x3c,0x2f,0x68, +0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x78,0x22,0x3e,0x42,0x44, +0x53,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69, +0x64,0x3d,0x22,0x62,0x64,0x73,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c, +0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62, +0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f, +0x78,0x22,0x3e,0x47,0x50,0x53,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74, +0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x67,0x70,0x73,0x22,0x3e,0x3c,0x2f,0x74, +0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70, +0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c, +0x61,0x62,0x65,0x6c,0x5f,0x78,0x22,0x3e,0x47,0x4c,0x4f,0x3c,0x2f,0x6c,0x61,0x62, +0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64,0x3d,0x22,0x67,0x6c,0x6f, +0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x78,0x22,0x3e,0x47,0x41,0x4c, +0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x74,0x65,0x78,0x74,0x20,0x69,0x64, +0x3d,0x22,0x67,0x61,0x6c,0x22,0x3e,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x3c,0x2f, +0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c, +0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x63,0x72,0x69,0x70,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61, +0x73,0x63,0x72,0x69,0x70,0x74,0x27,0x20,0x73,0x72,0x63,0x3d,0x27,0x70,0x6f,0x73, +0x69,0x74,0x69,0x6f,0x6e,0x2e,0x6a,0x73,0x27,0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69, +0x70,0x74,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c, +0x2f,0x68,0x74,0x6d,0x6c,0x3e,}; + +static const unsigned int dummy_align__userCfg_shtml = 4; +static const unsigned char data__userCfg_shtml[] = { +/* /userCfg.shtml (15 chars) */ +0x2f,0x75,0x73,0x65,0x72,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/html +Expires: Fri, 10 Apr 2008 14:00:00 GMT +Pragma: no-cache + +" (85 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x45,0x78,0x70,0x69,0x72,0x65,0x73, +0x3a,0x20,0x46,0x72,0x69,0x2c,0x20,0x31,0x30,0x20,0x41,0x70,0x72,0x20,0x32,0x30, +0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, +0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, +0x65,0x0d,0x0a,0x0d,0x0a, +/* raw file data (6943 bytes) */ +0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0d, +0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e, +0x0d,0x0a,0x09,0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65, +0x74,0x3d,0x22,0x55,0x54,0x46,0x2d,0x38,0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x69,0x74,0x6c,0x65,0x3e,0x4f,0x70,0x65, +0x6e,0x52,0x54,0x4b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d, +0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x74,0x79,0x70, +0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x2f,0x63,0x73,0x73,0x22,0x20,0x68,0x72,0x65, +0x66,0x3d,0x22,0x63,0x73,0x73,0x2f,0x73,0x74,0x79,0x6c,0x65,0x2e,0x63,0x73,0x73, +0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73, +0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x24,0x28,0x69, +0x64,0x29,0x20,0x7b,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x64,0x6f,0x63,0x75, +0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42, +0x79,0x49,0x64,0x28,0x69,0x64,0x29,0x3b,0x20,0x7d,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f, +0x6e,0x20,0x75,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x43,0x61,0x6c,0x6c, +0x62,0x61,0x63,0x6b,0x28,0x6f,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78, +0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27, +0x29,0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63, +0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20, +0x3d,0x20,0x6f,0x2e,0x75,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79, +0x70,0x65,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x50, +0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74, +0x65,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x75,0x73, +0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x3b,0x0d,0x0a,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20, +0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x45,0x63,0x75,0x41,0x64,0x64, +0x72,0x65,0x73,0x73,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61, +0x6e,0x45,0x63,0x75,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x27,0x29,0x2e,0x76,0x61, +0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x63,0x61,0x6e,0x45,0x63,0x75,0x41,0x64, +0x64,0x72,0x65,0x73,0x73,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61, +0x6e,0x42,0x61,0x75,0x64,0x72,0x61,0x74,0x65,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x74,0x78,0x74,0x43,0x61,0x6e,0x42,0x61,0x75,0x64,0x72,0x61,0x74,0x65,0x27,0x29, +0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x63,0x61,0x6e,0x42,0x61, +0x75,0x64,0x72,0x61,0x74,0x65,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x43, +0x61,0x6e,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27,0x29,0x29,0x20, +0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x50,0x61,0x63,0x6b,0x65,0x74,0x54, +0x79,0x70,0x65,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e, +0x63,0x61,0x6e,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, +0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x50,0x61,0x63,0x6b,0x65,0x74,0x52, +0x61,0x74,0x65,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61,0x6e, +0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x27,0x29,0x2e,0x76,0x61,0x6c, +0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x63,0x61,0x6e,0x50,0x61,0x63,0x6b,0x65,0x74, +0x52,0x61,0x74,0x65,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61,0x6e, +0x54,0x65,0x72,0x6d,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x72,0x27,0x29,0x29,0x20, +0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x54,0x65,0x72,0x6d,0x72,0x65,0x73, +0x69,0x73,0x74,0x6f,0x72,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20, +0x6f,0x2e,0x63,0x61,0x6e,0x54,0x65,0x72,0x6d,0x72,0x65,0x73,0x69,0x73,0x74,0x6f, +0x72,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x42,0x61,0x75, +0x64,0x72,0x61,0x74,0x65,0x44,0x65,0x74,0x65,0x63,0x74,0x27,0x29,0x29,0x20,0x24, +0x28,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x42,0x61,0x75,0x64,0x72,0x61,0x74,0x65, +0x44,0x65,0x74,0x65,0x63,0x74,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d, +0x20,0x6f,0x2e,0x63,0x61,0x6e,0x42,0x61,0x75,0x64,0x72,0x61,0x74,0x65,0x44,0x65, +0x74,0x65,0x63,0x74,0x3b,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x4c, +0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x29,0x2e, +0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f, +0x61,0x74,0x28,0x6f,0x2e,0x6c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x29, +0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x34,0x29,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28, +0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x79,0x27,0x29, +0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d, +0x42,0x79,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x70,0x61,0x72, +0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x6c,0x65,0x76,0x65,0x72,0x41, +0x72,0x6d,0x42,0x79,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x34,0x29, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69, +0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72, +0x6d,0x42,0x7a,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x4c,0x65,0x76, +0x65,0x72,0x41,0x72,0x6d,0x42,0x7a,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20, +0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x6c, +0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x7a,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78, +0x65,0x64,0x28,0x34,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x50,0x6f, +0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x78,0x27, +0x29,0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66, +0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x78,0x27,0x29,0x2e,0x76,0x61,0x6c, +0x75,0x65,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28, +0x6f,0x2e,0x70,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73, +0x74,0x42,0x78,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x34,0x29,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49, +0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x79,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65, +0x73,0x74,0x42,0x79,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x70, +0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x70,0x6f,0x69,0x6e, +0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x79,0x29,0x2e,0x74, +0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x34,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74, +0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73, +0x74,0x42,0x7a,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x50,0x6f,0x69, +0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x7a,0x27,0x29, +0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c, +0x6f,0x61,0x74,0x28,0x6f,0x2e,0x70,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74, +0x65,0x72,0x65,0x73,0x74,0x42,0x7a,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64, +0x28,0x34,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61, +0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x78,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x74, +0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x78,0x27,0x29, +0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c, +0x6f,0x61,0x74,0x28,0x6f,0x2e,0x72,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62, +0x76,0x78,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x34,0x29,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20, +0x28,0x24,0x28,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52, +0x62,0x76,0x79,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x52,0x6f,0x74, +0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x79,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75, +0x65,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f, +0x2e,0x72,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x79,0x29,0x2e,0x74, +0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x34,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x74, +0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x7a,0x27,0x29, +0x29,0x20,0x24,0x28,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e, +0x52,0x62,0x76,0x7a,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x70, +0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x72,0x6f,0x74,0x61, +0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x7a,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65, +0x64,0x28,0x34,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x7d,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f, +0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x0d,0x0a,0x09,0x3c,0x62,0x6f,0x64,0x79,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x65,0x61,0x64,0x65, +0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70,0x73, +0x2d,0x74,0x6f,0x70,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x61,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x4f, +0x70,0x65,0x6e,0x52,0x54,0x4b,0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e, +0x74,0x61,0x69,0x6e,0x65,0x72,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x64,0x69, +0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x22,0x3e,0x20, +0x20,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65, +0x72,0x22,0x3e,0x20,0x20,0x0d,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x68,0x31,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64, +0x65,0x72,0x5f,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x4d,0x45,0x4e,0x55,0x3c,0x2f, +0x68,0x31,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65, +0x72,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x75,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x6f,0x64,0x79,0x22,0x3e,0x0d,0x0a, +0x09,0x09,0x09,0x09,0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72, +0x65,0x66,0x3d,0x22,0x72,0x75,0x6e,0x53,0x74,0x61,0x74,0x75,0x73,0x2e,0x73,0x68, +0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75, +0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x53,0x74, +0x61,0x74,0x75,0x73,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65, +0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66, +0x3d,0x22,0x77,0x6f,0x72,0x6b,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, +0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x57,0x6f,0x72,0x6b,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61, +0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65, +0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66, +0x3d,0x22,0x75,0x73,0x65,0x72,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, +0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x20,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65, +0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x73,0x65,0x72, +0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f, +0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, +0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x65,0x74,0x68,0x43, +0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x45,0x74,0x68,0x65,0x72, +0x6e,0x65,0x74,0x20,0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f, +0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f, +0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x64, +0x65,0x76,0x69,0x63,0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, +0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x44,0x65,0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61, +0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c, +0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d, +0x77,0x72,0x61,0x70,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61, +0x64,0x65,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x55,0x73, +0x65,0x72,0x20,0x50,0x61,0x72,0x61,0x6d,0x65,0x74,0x65,0x72,0x73,0x3c,0x2f,0x68, +0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x69,0x64,0x3d,0x27,0x55, +0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x27,0x20,0x6d,0x65,0x74,0x68,0x6f, +0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d, +0x27,0x75,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x63,0x67,0x69,0x27, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74,0x79,0x6c, +0x65,0x3d,0x22,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x30,0x30,0x70,0x78,0x3b,0x20, +0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x3b,0x22,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x55, +0x53,0x45,0x52,0x20,0x43,0x4f,0x4d,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e, +0x50,0x61,0x63,0x6b,0x65,0x74,0x5f,0x54,0x79,0x70,0x65,0x3a,0x3c,0x2f,0x6c,0x61, +0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d, +0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x55,0x73, +0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27,0x20,0x6e,0x61, +0x6d,0x65,0x3d,0x27,0x75,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79, +0x70,0x65,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70, +0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c, +0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x50,0x61,0x63,0x6b,0x65,0x74,0x5f,0x52, +0x61,0x74,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, +0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, +0x64,0x3d,0x27,0x74,0x78,0x74,0x55,0x73,0x65,0x72,0x50,0x61,0x63,0x6b,0x65,0x74, +0x52,0x61,0x74,0x65,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x75,0x73,0x65,0x72, +0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x27,0x20,0x73,0x69,0x7a,0x65, +0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x43,0x41,0x4e,0x3c, +0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f, +0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70, +0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c, +0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x45,0x63,0x75,0x5f,0x41,0x64,0x64,0x72, +0x65,0x73,0x73,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, +0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, +0x64,0x3d,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x45,0x63,0x75,0x41,0x64,0x64,0x72, +0x65,0x73,0x73,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x63,0x61,0x6e,0x45,0x63, +0x75,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27, +0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x42,0x61, +0x75,0x64,0x72,0x61,0x74,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c, +0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74, +0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x42,0x61,0x75,0x64, +0x72,0x61,0x74,0x65,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x63,0x61,0x6e,0x42, +0x61,0x75,0x64,0x72,0x61,0x74,0x65,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31, +0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x50,0x61,0x63, +0x6b,0x65,0x74,0x5f,0x54,0x79,0x70,0x65,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c, +0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65, +0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x50,0x61, +0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27, +0x63,0x61,0x6e,0x50,0x61,0x63,0x6b,0x65,0x74,0x54,0x79,0x70,0x65,0x27,0x20,0x73, +0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62, +0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f, +0x31,0x22,0x3e,0x50,0x61,0x63,0x6b,0x65,0x74,0x5f,0x52,0x61,0x74,0x65,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79, +0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78, +0x74,0x43,0x61,0x6e,0x50,0x61,0x63,0x6b,0x65,0x74,0x52,0x61,0x74,0x65,0x27,0x20, +0x6e,0x61,0x6d,0x65,0x3d,0x27,0x63,0x61,0x6e,0x50,0x61,0x63,0x6b,0x65,0x74,0x52, +0x61,0x74,0x65,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f, +0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x54,0x65,0x72,0x6d,0x72,0x65,0x73, +0x69,0x73,0x74,0x6f,0x72,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69, +0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27, +0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x54,0x65,0x72,0x6d,0x72, +0x65,0x73,0x69,0x73,0x74,0x6f,0x72,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x63, +0x61,0x6e,0x54,0x65,0x72,0x6d,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x72,0x27,0x20, +0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61, +0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c, +0x5f,0x31,0x22,0x3e,0x42,0x61,0x75,0x64,0x72,0x61,0x74,0x65,0x5f,0x44,0x65,0x74, +0x65,0x63,0x74,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, +0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, +0x64,0x3d,0x27,0x74,0x78,0x74,0x43,0x61,0x6e,0x42,0x61,0x75,0x64,0x72,0x61,0x74, +0x65,0x44,0x65,0x74,0x65,0x63,0x74,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x63, +0x61,0x6e,0x42,0x61,0x75,0x64,0x72,0x61,0x74,0x65,0x44,0x65,0x74,0x65,0x63,0x74, +0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f, +0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x77,0x69, +0x64,0x74,0x68,0x3a,0x34,0x30,0x30,0x70,0x78,0x3b,0x20,0x6d,0x61,0x72,0x67,0x69, +0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20,0x34,0x30,0x30,0x70,0x78,0x3b,0x22,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68, +0x31,0x3e,0x49,0x4e,0x53,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x32,0x22,0x3e,0x4c,0x65, +0x76,0x65,0x6c,0x5f,0x41,0x72,0x6d,0x5f,0x42,0x78,0x28,0x6d,0x29,0x3a,0x3c,0x2f, +0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70, +0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74, +0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65, +0x3d,0x27,0x6c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x78,0x27,0x20,0x73,0x69, +0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65, +0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x32, +0x22,0x3e,0x4c,0x65,0x76,0x65,0x6c,0x5f,0x41,0x72,0x6d,0x5f,0x42,0x79,0x28,0x6d, +0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d, +0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x79,0x27,0x20, +0x6e,0x61,0x6d,0x65,0x3d,0x27,0x6c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d,0x42,0x79, +0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f, +0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c, +0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, +0x65,0x6c,0x5f,0x32,0x22,0x3e,0x4c,0x65,0x76,0x65,0x6c,0x5f,0x41,0x72,0x6d,0x5f, +0x42,0x7a,0x28,0x6d,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69, +0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27, +0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x4c,0x65,0x76,0x65,0x72,0x41,0x72,0x6d, +0x42,0x7a,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x6c,0x65,0x76,0x65,0x72,0x41, +0x72,0x6d,0x42,0x7a,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20, +0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x32,0x22,0x3e,0x50,0x6f,0x69,0x6e,0x74,0x5f, +0x4f,0x66,0x5f,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x5f,0x42,0x78,0x28,0x6d, +0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d, +0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72, +0x65,0x73,0x74,0x42,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x70,0x6f,0x69, +0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x78,0x27,0x20, +0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61, +0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c, +0x5f,0x32,0x22,0x3e,0x50,0x6f,0x69,0x6e,0x74,0x5f,0x4f,0x66,0x5f,0x49,0x6e,0x74, +0x65,0x72,0x65,0x73,0x74,0x5f,0x42,0x79,0x28,0x6d,0x29,0x3a,0x3c,0x2f,0x6c,0x61, +0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d, +0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f, +0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x79,0x27, +0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x70,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e, +0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x79,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27, +0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x32,0x22,0x3e,0x50,0x6f, +0x69,0x6e,0x74,0x5f,0x4f,0x66,0x5f,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x5f, +0x42,0x7a,0x28,0x6d,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69, +0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27, +0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x50,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49, +0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x42,0x7a,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, +0x27,0x70,0x6f,0x69,0x6e,0x74,0x4f,0x66,0x49,0x6e,0x74,0x65,0x72,0x65,0x73,0x74, +0x42,0x7a,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70, +0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c, +0x61,0x62,0x65,0x6c,0x5f,0x32,0x22,0x3e,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e, +0x5f,0x52,0x62,0x76,0x78,0x28,0xc2,0xb0,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, +0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, +0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61, +0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x78,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27, +0x72,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x78,0x27,0x20,0x73,0x69, +0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65, +0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x32, +0x22,0x3e,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x5f,0x52,0x62,0x76,0x79,0x28, +0xc2,0xb0,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70, +0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69, +0x64,0x3d,0x27,0x74,0x78,0x74,0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62, +0x76,0x79,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72,0x6f,0x74,0x61,0x74,0x69, +0x6f,0x6e,0x52,0x62,0x76,0x79,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36, +0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x32,0x22,0x3e,0x52,0x6f,0x74,0x61, +0x74,0x69,0x6f,0x6e,0x5f,0x52,0x62,0x76,0x7a,0x28,0xc2,0xb0,0x29,0x3a,0x3c,0x2f, +0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70, +0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x74,0x78,0x74, +0x52,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x7a,0x27,0x20,0x6e,0x61, +0x6d,0x65,0x3d,0x27,0x72,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x52,0x62,0x76,0x7a, +0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x36,0x27,0x20,0x2f,0x3e,0x3c,0x2f, +0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62, +0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65,0x5f, +0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x70,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70,0x65,0x3d, +0x27,0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27, +0x53,0x41,0x56,0x45,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d, +0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65, +0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x27,0x20,0x73, +0x72,0x63,0x3d,0x27,0x75,0x73,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x6a, +0x73,0x27,0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x09,0x3c, +0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,}; + +static const unsigned int dummy_align__workCfg_shtml = 5; +static const unsigned char data__workCfg_shtml[] = { +/* /workCfg.shtml (15 chars) */ +0x2f,0x77,0x6f,0x72,0x6b,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/html +Expires: Fri, 10 Apr 2008 14:00:00 GMT +Pragma: no-cache + +" (85 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x45,0x78,0x70,0x69,0x72,0x65,0x73, +0x3a,0x20,0x46,0x72,0x69,0x2c,0x20,0x31,0x30,0x20,0x41,0x70,0x72,0x20,0x32,0x30, +0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d, +0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68, +0x65,0x0d,0x0a,0x0d,0x0a, +/* raw file data (13236 bytes) */ +0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0d, +0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x09,0x3c,0x68,0x65,0x61,0x64,0x3e, +0x0d,0x0a,0x09,0x09,0x3c,0x6d,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65, +0x74,0x3d,0x22,0x55,0x54,0x46,0x2d,0x38,0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x69,0x74,0x6c,0x65,0x3e,0x4f,0x70,0x65, +0x6e,0x52,0x54,0x4b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d, +0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x74,0x79,0x70, +0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x2f,0x63,0x73,0x73,0x22,0x20,0x68,0x72,0x65, +0x66,0x3d,0x22,0x63,0x73,0x73,0x2f,0x73,0x74,0x79,0x6c,0x65,0x2e,0x63,0x73,0x73, +0x22,0x20,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73, +0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x24,0x28,0x69, +0x64,0x29,0x20,0x7b,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x64,0x6f,0x63,0x75, +0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42, +0x79,0x49,0x64,0x28,0x69,0x64,0x29,0x3b,0x20,0x7d,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f, +0x6e,0x20,0x77,0x6f,0x72,0x6b,0x43,0x6f,0x6e,0x66,0x69,0x67,0x43,0x61,0x6c,0x6c, +0x62,0x61,0x63,0x6b,0x28,0x6f,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f, +0x2e,0x64,0x69,0x73,0x70,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x73,0x65,0x74,0x54,0x61,0x62,0x28,0x27,0x62,0x6f,0x78,0x27,0x2c, +0x31,0x2c,0x32,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x74,0x54,0x61, +0x62,0x28,0x27,0x6d,0x65,0x6e,0x75,0x27,0x2c,0x31,0x2c,0x32,0x29,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, +0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x64,0x69,0x73,0x70, +0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65, +0x74,0x54,0x61,0x62,0x28,0x27,0x62,0x6f,0x78,0x27,0x2c,0x31,0x2c,0x32,0x29,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x74,0x54,0x61,0x62,0x28,0x27,0x6d,0x65, +0x6e,0x75,0x27,0x2c,0x32,0x2c,0x32,0x29,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65, +0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x64,0x69,0x73,0x70,0x20,0x3d,0x3d,0x20,0x32, +0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x74,0x54,0x61,0x62,0x28, +0x27,0x62,0x6f,0x78,0x27,0x2c,0x32,0x2c,0x32,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65, +0x6c,0x73,0x65,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x74,0x54,0x61, +0x62,0x28,0x27,0x62,0x6f,0x78,0x27,0x2c,0x31,0x2c,0x32,0x29,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x73,0x65,0x74,0x54,0x61,0x62,0x28,0x27,0x6d,0x65,0x6e,0x75,0x27, +0x2c,0x31,0x2c,0x32,0x29,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, +0x24,0x28,0x27,0x63,0x49,0x70,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x63,0x49,0x70, +0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x63,0x49,0x70, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x63,0x50,0x6f,0x72,0x74,0x27, +0x29,0x29,0x20,0x24,0x28,0x27,0x63,0x50,0x6f,0x72,0x74,0x27,0x29,0x2e,0x76,0x61, +0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x63,0x50,0x6f,0x72,0x74,0x3b,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x63,0x4d,0x6f,0x50,0x27,0x29,0x29,0x20,0x24, +0x28,0x27,0x63,0x4d,0x6f,0x50,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d, +0x20,0x6f,0x2e,0x63,0x4d,0x6f,0x50,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28, +0x27,0x63,0x55,0x73,0x65,0x72,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x63,0x55,0x73, +0x65,0x72,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x63, +0x55,0x73,0x65,0x72,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x63,0x50, +0x77,0x64,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x63,0x50,0x77,0x64,0x27,0x29,0x2e, +0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x63,0x50,0x77,0x64,0x3b,0x0d, +0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x61,0x49,0x70,0x27,0x29,0x29, +0x20,0x24,0x28,0x27,0x61,0x49,0x70,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20, +0x3d,0x20,0x6f,0x2e,0x61,0x49,0x70,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28, +0x27,0x61,0x50,0x6f,0x72,0x74,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x61,0x50,0x6f, +0x72,0x74,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x61, +0x50,0x6f,0x72,0x74,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x61,0x4d, +0x6f,0x50,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x61,0x4d,0x6f,0x50,0x27,0x29,0x2e, +0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x61,0x4d,0x6f,0x50,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x61,0x55,0x73,0x65,0x72,0x27,0x29,0x29, +0x20,0x24,0x28,0x27,0x61,0x55,0x73,0x65,0x72,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75, +0x65,0x20,0x3d,0x20,0x6f,0x2e,0x61,0x55,0x73,0x65,0x72,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x28,0x24,0x28,0x27,0x61,0x50,0x77,0x64,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x61,0x50,0x77,0x64,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f, +0x2e,0x61,0x50,0x77,0x64,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28, +0x27,0x73,0x49,0x70,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x73,0x49,0x70,0x27,0x29, +0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x73,0x49,0x70,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x73,0x50,0x6f,0x72,0x74,0x27,0x29,0x29, +0x20,0x24,0x28,0x27,0x73,0x50,0x6f,0x72,0x74,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75, +0x65,0x20,0x3d,0x20,0x6f,0x2e,0x73,0x50,0x6f,0x72,0x74,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x28,0x24,0x28,0x27,0x73,0x4d,0x6f,0x50,0x27,0x29,0x29,0x20,0x24,0x28,0x27, +0x73,0x4d,0x6f,0x50,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f, +0x2e,0x73,0x4d,0x6f,0x50,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x73, +0x50,0x77,0x64,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x73,0x50,0x77,0x64,0x27,0x29, +0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x73,0x50,0x77,0x64,0x3b, +0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x62,0x70,0x74,0x20,0x3d,0x3d, +0x20,0x30,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x61, +0x64,0x69,0x6f,0x52,0x65,0x66,0x27,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64, +0x20,0x3d,0x20,0x74,0x72,0x75,0x65,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65, +0x20,0x69,0x66,0x20,0x28,0x6f,0x2e,0x62,0x70,0x74,0x20,0x3d,0x3d,0x20,0x31,0x29, +0x20,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x61,0x64,0x69,0x6f, +0x53,0x50,0x50,0x27,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x20,0x3d,0x20, +0x74,0x72,0x75,0x65,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66, +0x20,0x28,0x6f,0x2e,0x62,0x70,0x74,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x27,0x72,0x61,0x64,0x69,0x6f,0x52,0x54,0x4b, +0x27,0x29,0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x20,0x3d,0x20,0x74,0x72,0x75, +0x65,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x24,0x28,0x27,0x72,0x61,0x64,0x69,0x6f,0x41,0x55,0x54,0x4f,0x27,0x29, +0x2e,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x20,0x3d,0x20,0x74,0x72,0x75,0x65,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x73,0x74,0x61,0x49, +0x44,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x73,0x74,0x61,0x49,0x44,0x27,0x29,0x2e, +0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x6f,0x2e,0x73,0x74,0x61,0x49,0x44,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x61,0x6e,0x74,0x68,0x27,0x29,0x29, +0x20,0x24,0x28,0x27,0x61,0x6e,0x74,0x68,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65, +0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e, +0x61,0x6e,0x74,0x68,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x34,0x29, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x72,0x65,0x66,0x4c,0x61,0x74, +0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x72,0x65,0x66,0x4c,0x61,0x74,0x27,0x29,0x2e, +0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f, +0x61,0x74,0x28,0x6f,0x2e,0x72,0x65,0x66,0x4c,0x61,0x74,0x29,0x2e,0x74,0x6f,0x46, +0x69,0x78,0x65,0x64,0x28,0x38,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x24,0x28, +0x27,0x72,0x65,0x66,0x4c,0x6f,0x6e,0x27,0x29,0x29,0x20,0x24,0x28,0x27,0x72,0x65, +0x66,0x4c,0x6f,0x6e,0x27,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x70, +0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x6f,0x2e,0x72,0x65,0x66,0x4c, +0x6f,0x6e,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x38,0x29,0x3b,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x69,0x66,0x20,0x28,0x24,0x28,0x27,0x72,0x65,0x66,0x48,0x65,0x69,0x27,0x29, +0x29,0x20,0x24,0x28,0x27,0x72,0x65,0x66,0x48,0x65,0x69,0x27,0x29,0x2e,0x76,0x61, +0x6c,0x75,0x65,0x20,0x3d,0x20,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74, +0x28,0x6f,0x2e,0x72,0x65,0x66,0x48,0x65,0x69,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78, +0x65,0x64,0x28,0x33,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x7d,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c, +0x2f,0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x0d,0x0a,0x09,0x3c,0x62,0x6f,0x64,0x79, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x65,0x61,0x64, +0x65,0x72,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f,0x64,0x72,0x6f,0x70, +0x73,0x2d,0x74,0x6f,0x70,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20, +0x4f,0x70,0x65,0x6e,0x52,0x54,0x4b,0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x6f, +0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x3c,0x64, +0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x22,0x3e, +0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72, +0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x74, +0x69,0x74,0x6c,0x65,0x22,0x3e,0x4d,0x45,0x4e,0x55,0x3c,0x2f,0x68,0x31,0x3e,0x0d, +0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x68,0x65,0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a, +0x09,0x09,0x09,0x09,0x3c,0x75,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d, +0x65,0x6e,0x75,0x5f,0x62,0x6f,0x64,0x79,0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09, +0x09,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75, +0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22, +0x72,0x75,0x6e,0x53,0x74,0x61,0x74,0x75,0x73,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65, +0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x52,0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x53,0x74,0x61,0x74,0x75,0x73, +0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x6c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69, +0x74,0x65,0x6d,0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x77,0x6f, +0x72,0x6b,0x43,0x66,0x67,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, +0x6e,0x6b,0x20,0x69,0x73,0x2d,0x61,0x63,0x74,0x69,0x76,0x65,0x22,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x6f,0x72,0x6b,0x20,0x43,0x6f,0x6e, +0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f, +0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c, +0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x75,0x73,0x65,0x72,0x43,0x66,0x67,0x2e, +0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65, +0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x73,0x65,0x72,0x20,0x43,0x6f,0x6e, +0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61,0x3e,0x3c,0x2f, +0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x22,0x3e,0x3c, +0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x65,0x74,0x68,0x43,0x66,0x67,0x2e,0x73, +0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e, +0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69,0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x45,0x74,0x68,0x65,0x72,0x6e,0x65,0x74,0x20, +0x43,0x6f,0x6e,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3c,0x2f,0x61, +0x3e,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d, +0x22,0x3e,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x64,0x65,0x76,0x69,0x63, +0x65,0x49,0x6e,0x66,0x6f,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x22,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6d,0x65,0x6e,0x75,0x5f,0x69,0x74,0x65,0x6d,0x5f,0x6c,0x69, +0x6e,0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x65, +0x76,0x69,0x63,0x65,0x20,0x49,0x6e,0x66,0x6f,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x6c, +0x69,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x2f,0x75,0x6c,0x3e,0x0d,0x0a,0x09, +0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x77,0x72,0x61,0x70, +0x22,0x3e,0x0d,0x0a,0x09,0x09,0x09,0x09,0x3c,0x68,0x65,0x61,0x64,0x65,0x72,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x57,0x6f,0x72,0x6b,0x20,0x43, +0x6f,0x6e,0x66,0x69,0x67,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65, +0x61,0x64,0x65,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69, +0x76,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x77,0x69,0x64,0x74,0x68,0x3a,0x32, +0x30,0x30,0x70,0x78,0x3b,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74, +0x3b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x72,0x6f,0x77,0x4d,0x65,0x6e,0x75,0x22,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x75,0x6c,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x69,0x64, +0x3d,0x22,0x62,0x6f,0x78,0x31,0x22,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d, +0x22,0x73,0x65,0x74,0x54,0x61,0x62,0x28,0x27,0x62,0x6f,0x78,0x27,0x2c,0x31,0x2c, +0x32,0x29,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72, +0x22,0x3e,0x52,0x4f,0x56,0x45,0x52,0x3a,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x6f, +0x72,0x6b,0x20,0x61,0x73,0x20,0x72,0x6f,0x76,0x65,0x72,0x20,0x73,0x74,0x61,0x74, +0x69,0x6f,0x6e,0x2e,0x20,0x55,0x73,0x65,0x72,0x20,0x63,0x61,0x6e,0x20,0x63,0x68, +0x6f,0x6f,0x73,0x65,0x20,0x4e,0x54,0x52,0x49,0x50,0x20,0x43,0x4c,0x49,0x45,0x4e, +0x54,0x20,0x6f,0x72,0x20,0x50,0x4f,0x49,0x4e,0x54,0x20,0x4f,0x4e,0x45,0x20,0x6d, +0x6f,0x64,0x65,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x69,0x64,0x3d,0x22, +0x62,0x6f,0x78,0x32,0x22,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d,0x22,0x73, +0x65,0x74,0x54,0x61,0x62,0x28,0x27,0x62,0x6f,0x78,0x27,0x2c,0x32,0x2c,0x32,0x29, +0x22,0x3e,0x42,0x41,0x53,0x45,0x3a,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x6f,0x72, +0x6b,0x20,0x61,0x73,0x20,0x62,0x61,0x73,0x65,0x20,0x73,0x74,0x61,0x74,0x69,0x6f, +0x6e,0x20,0x77,0x69,0x74,0x68,0x20,0x4e,0x54,0x52,0x49,0x50,0x20,0x53,0x45,0x52, +0x56,0x45,0x52,0x20,0x6d,0x6f,0x64,0x65,0x2e,0x20,0x50,0x6f,0x73,0x69,0x74,0x69, +0x6f,0x6e,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x72,0x65,0x66,0x65,0x72,0x65, +0x6e,0x63,0x65,0x20,0x70,0x6f,0x73,0x20,0x73,0x65,0x74,0x20,0x62,0x79,0x20,0x75, +0x73,0x65,0x72,0x20,0x6f,0x72,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x50,0x50,0x2f,0x52,0x54,0x4b,0x20, +0x61,0x76,0x65,0x72,0x61,0x67,0x65,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x2e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x6c, +0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x75,0x6c, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x73,0x74,0x79,0x6c, +0x65,0x3d,0x22,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20, +0x32,0x30,0x30,0x70,0x78,0x3b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64, +0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x63,0x6f,0x6e,0x5f,0x62,0x6f,0x78,0x5f,0x31, +0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69, +0x64,0x3d,0x22,0x54,0x61,0x62,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x4d,0x65,0x6e,0x75,0x62,0x6f,0x78,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x75,0x6c, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x69,0x64,0x3d,0x22,0x6d, +0x65,0x6e,0x75,0x31,0x22,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d,0x22,0x73, +0x65,0x74,0x54,0x61,0x62,0x28,0x27,0x6d,0x65,0x6e,0x75,0x27,0x2c,0x31,0x2c,0x32, +0x29,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22, +0x3e,0x4e,0x54,0x52,0x49,0x50,0x20,0x43,0x4c,0x49,0x45,0x4e,0x54,0x3c,0x2f,0x6c, +0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x69,0x64,0x3d,0x22, +0x6d,0x65,0x6e,0x75,0x32,0x22,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d,0x22, +0x73,0x65,0x74,0x54,0x61,0x62,0x28,0x27,0x6d,0x65,0x6e,0x75,0x27,0x2c,0x32,0x2c, +0x32,0x29,0x22,0x20,0x3e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x20,0x43,0x4c,0x49, +0x45,0x4e,0x54,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x75,0x6c,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x43,0x6f,0x6e, +0x74,0x65,0x6e,0x74,0x62,0x6f,0x78,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20, +0x69,0x64,0x3d,0x22,0x63,0x6f,0x6e,0x5f,0x6d,0x65,0x6e,0x75,0x5f,0x31,0x22,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27, +0x4e,0x74,0x72,0x69,0x70,0x43,0x6c,0x69,0x65,0x6e,0x74,0x43,0x6f,0x6e,0x66,0x69, +0x67,0x27,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53,0x54,0x27, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,0x69,0x64, +0x3d,0x22,0x6e,0x63,0x45,0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6e,0x63, +0x45,0x6e,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x64,0x69,0x73,0x70,0x6c, +0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x49,0x50,0x3a, +0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, +0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x63, +0x49,0x70,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x63,0x49,0x70,0x27,0x20,0x73, +0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62, +0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f, +0x31,0x22,0x3e,0x50,0x4f,0x52,0x54,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e, +0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78, +0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x63,0x50,0x6f,0x72,0x74,0x27,0x20,0x6e,0x61, +0x6d,0x65,0x3d,0x27,0x63,0x50,0x6f,0x72,0x74,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d, +0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x4d, +0x4f,0x55,0x4e,0x54,0x20,0x50,0x4f,0x49,0x4e,0x54,0x3a,0x3c,0x2f,0x6c,0x61,0x62, +0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27, +0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x63,0x4d,0x6f,0x50,0x27,0x20, +0x6e,0x61,0x6d,0x65,0x3d,0x27,0x63,0x4d,0x6f,0x50,0x27,0x20,0x73,0x69,0x7a,0x65, +0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e, +0x55,0x53,0x45,0x52,0x20,0x4e,0x41,0x4d,0x45,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, +0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, +0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x63,0x55,0x73,0x65,0x72,0x27,0x20, +0x6e,0x61,0x6d,0x65,0x3d,0x27,0x63,0x55,0x73,0x65,0x72,0x27,0x20,0x73,0x69,0x7a, +0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c, +0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22, +0x3e,0x50,0x41,0x53,0x53,0x57,0x4f,0x52,0x44,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65, +0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, +0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x63,0x50,0x77,0x64,0x27,0x20,0x6e, +0x61,0x6d,0x65,0x3d,0x27,0x63,0x50,0x77,0x64,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d, +0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65, +0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70, +0x65,0x3d,0x27,0x62,0x75,0x74,0x74,0x6f,0x6e,0x27,0x20,0x76,0x61,0x6c,0x75,0x65, +0x3d,0x27,0x53,0x41,0x56,0x45,0x27,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d, +0x22,0x6e,0x63,0x5f,0x65,0x6e,0x61,0x62,0x6c,0x65,0x28,0x30,0x29,0x22,0x2f,0x3e, +0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x69,0x6e,0x70,0x75,0x74,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x6d,0x61,0x72, +0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20,0x31,0x30,0x30,0x70,0x78,0x3b, +0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x62,0x75,0x74,0x74,0x6f,0x6e,0x27,0x20,0x76, +0x61,0x6c,0x75,0x65,0x3d,0x27,0x45,0x4e,0x41,0x42,0x4c,0x45,0x27,0x20,0x6f,0x6e, +0x63,0x6c,0x69,0x63,0x6b,0x3d,0x22,0x6e,0x63,0x5f,0x65,0x6e,0x61,0x62,0x6c,0x65, +0x28,0x31,0x29,0x22,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f, +0x72,0x6d,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69, +0x76,0x20,0x69,0x64,0x3d,0x22,0x63,0x6f,0x6e,0x5f,0x6d,0x65,0x6e,0x75,0x5f,0x32, +0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x64,0x69,0x73,0x70,0x6c,0x61,0x79, +0x3a,0x6e,0x6f,0x6e,0x65,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f, +0x72,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61, +0x43,0x6f,0x6e,0x66,0x69,0x67,0x27,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x27, +0x50,0x4f,0x53,0x54,0x27,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78, +0x74,0x22,0x20,0x69,0x64,0x3d,0x22,0x61,0x63,0x45,0x6e,0x22,0x20,0x6e,0x61,0x6d, +0x65,0x3d,0x22,0x61,0x63,0x45,0x6e,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22, +0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x22,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65, +0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31, +0x22,0x3e,0x49,0x50,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e, +0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20, +0x69,0x64,0x3d,0x27,0x61,0x49,0x70,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x61, +0x49,0x70,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70, +0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c, +0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x50,0x4f,0x52,0x54,0x3a,0x3c,0x2f,0x6c, +0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, +0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x61,0x50,0x6f,0x72, +0x74,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x61,0x50,0x6f,0x72,0x74,0x27,0x20, +0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61, +0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c, +0x5f,0x31,0x22,0x3e,0x4d,0x4f,0x55,0x4e,0x54,0x20,0x50,0x4f,0x49,0x4e,0x54,0x3a, +0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, +0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x61, +0x4d,0x6f,0x50,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x61,0x4d,0x6f,0x50,0x27, +0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c, +0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65, +0x6c,0x5f,0x31,0x22,0x3e,0x55,0x53,0x45,0x52,0x20,0x4e,0x41,0x4d,0x45,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79, +0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x61,0x55, +0x73,0x65,0x72,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x61,0x55,0x73,0x65,0x72, +0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f, +0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c, +0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62, +0x65,0x6c,0x5f,0x31,0x22,0x3e,0x50,0x41,0x53,0x53,0x57,0x4f,0x52,0x44,0x3a,0x3c, +0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79, +0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x61,0x50, +0x77,0x64,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x61,0x50,0x77,0x64,0x27,0x20, +0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d, +0x22,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70, +0x75,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e, +0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x62,0x75,0x74,0x74,0x6f,0x6e,0x27,0x20, +0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x53,0x41,0x56,0x45,0x27,0x20,0x6f,0x6e,0x63, +0x6c,0x69,0x63,0x6b,0x3d,0x22,0x61,0x63,0x5f,0x65,0x6e,0x61,0x62,0x6c,0x65,0x28, +0x30,0x29,0x22,0x2f,0x3e,0x20,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x73,0x74,0x79,0x6c,0x65, +0x3d,0x22,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x20,0x31, +0x30,0x30,0x70,0x78,0x3b,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75, +0x74,0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x62,0x75,0x74,0x74, +0x6f,0x6e,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x45,0x4e,0x41,0x42,0x4c, +0x45,0x27,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d,0x22,0x61,0x63,0x5f,0x65, +0x6e,0x61,0x62,0x6c,0x65,0x28,0x31,0x29,0x22,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f, +0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f, +0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e, +0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d, +0x22,0x63,0x6f,0x6e,0x5f,0x62,0x6f,0x78,0x5f,0x32,0x22,0x20,0x73,0x74,0x79,0x6c, +0x65,0x3d,0x22,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x22, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20, +0x69,0x64,0x3d,0x22,0x54,0x61,0x62,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x62,0x6f,0x78,0x22,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x75, +0x6c,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x69,0x20,0x69,0x64,0x3d,0x22, +0x62,0x61,0x6d,0x65,0x6e,0x75,0x31,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x4e,0x54,0x52,0x49,0x50,0x20,0x53,0x45,0x52, +0x56,0x45,0x52,0x3c,0x2f,0x6c,0x69,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x75,0x6c,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64, +0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x43,0x6f,0x6e, +0x74,0x65,0x6e,0x74,0x62,0x6f,0x78,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20, +0x69,0x64,0x3d,0x22,0x63,0x6f,0x6e,0x5f,0x62,0x61,0x6d,0x65,0x6e,0x75,0x5f,0x31, +0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x6e,0x61,0x6d,0x65, +0x3d,0x27,0x4e,0x74,0x72,0x69,0x70,0x53,0x65,0x72,0x76,0x65,0x72,0x43,0x6f,0x6e, +0x66,0x69,0x67,0x27,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x27,0x50,0x4f,0x53, +0x54,0x27,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69, +0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63, +0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x68,0x31,0x3e,0x42,0x61,0x73,0x65,0x20,0x53,0x74,0x61,0x74,0x69,0x6f, +0x6e,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78, +0x74,0x22,0x20,0x69,0x64,0x3d,0x22,0x6e,0x73,0x45,0x6e,0x22,0x20,0x6e,0x61,0x6d, +0x65,0x3d,0x22,0x6e,0x73,0x45,0x6e,0x22,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22, +0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x22,0x3e,0x0d,0x0a, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65, +0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x33, +0x22,0x3e,0x53,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x49,0x44,0x3a,0x3c,0x2f,0x6c, +0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, +0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x73,0x74,0x61,0x49, +0x44,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x73,0x74,0x61,0x49,0x44,0x27,0x20, +0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61, +0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c, +0x5f,0x33,0x22,0x3e,0x41,0x6e,0x74,0x65,0x6e,0x6e,0x61,0x20,0x48,0x65,0x69,0x67, +0x68,0x74,0x28,0x6d,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69, +0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27, +0x20,0x69,0x64,0x3d,0x27,0x61,0x6e,0x74,0x68,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, +0x27,0x61,0x6e,0x74,0x68,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27, +0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x33,0x22,0x3e,0x52,0x65,0x66,0x65,0x72, +0x65,0x6e,0x63,0x65,0x20,0x4c,0x61,0x74,0x69,0x74,0x75,0x64,0x65,0x28,0xc2,0xb0, +0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74, +0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d, +0x27,0x72,0x65,0x66,0x4c,0x61,0x74,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72, +0x65,0x66,0x4c,0x61,0x74,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27, +0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73, +0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x33,0x22,0x3e,0x52,0x65,0x66,0x65,0x72, +0x65,0x6e,0x63,0x65,0x20,0x4c,0x6f,0x6e,0x67,0x69,0x74,0x75,0x64,0x65,0x28,0xc2, +0xb0,0x29,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64, +0x3d,0x27,0x72,0x65,0x66,0x4c,0x6f,0x6e,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27, +0x72,0x65,0x66,0x4c,0x6f,0x6e,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38, +0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x33,0x22,0x3e,0x52,0x65,0x66,0x65, +0x72,0x65,0x6e,0x63,0x65,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x28,0x6d,0x29,0x3a, +0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, +0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x72, +0x65,0x66,0x48,0x65,0x69,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x72,0x65,0x66, +0x48,0x65,0x69,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27,0x20,0x2f, +0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61, +0x62,0x65,0x6c,0x5f,0x33,0x22,0x3e,0x50,0x4f,0x53,0x49,0x54,0x49,0x4f,0x4e,0x20, +0x54,0x59,0x50,0x45,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73, +0x74,0x79,0x6c,0x65,0x3d,0x27,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66, +0x74,0x3a,0x30,0x70,0x78,0x27,0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f, +0x52,0x65,0x66,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x62,0x70,0x74,0x22,0x20, +0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x65,0x78,0x74,0x20,0x63, +0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22,0x3e,0x52,0x45,0x46, +0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, +0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x27, +0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x35,0x70,0x78,0x27, +0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x53,0x50,0x50,0x27,0x20,0x6e, +0x61,0x6d,0x65,0x3d,0x22,0x62,0x70,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d, +0x22,0x31,0x22,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x74,0x65,0x78,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22, +0x63,0x66,0x67,0x63,0x62,0x22,0x3e,0x53,0x50,0x50,0x3c,0x2f,0x74,0x65,0x78,0x74, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x72,0x61,0x64,0x69, +0x6f,0x27,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x27,0x6d,0x61,0x72,0x67,0x69,0x6e, +0x2d,0x6c,0x65,0x66,0x74,0x3a,0x35,0x70,0x78,0x27,0x20,0x69,0x64,0x3d,0x27,0x72, +0x61,0x64,0x69,0x6f,0x52,0x54,0x4b,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x62, +0x70,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x32,0x22,0x2f,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x65, +0x78,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22, +0x3e,0x52,0x54,0x4b,0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20, +0x74,0x79,0x70,0x65,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x27,0x20,0x73,0x74,0x79, +0x6c,0x65,0x3d,0x27,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a, +0x35,0x70,0x78,0x27,0x20,0x69,0x64,0x3d,0x27,0x72,0x61,0x64,0x69,0x6f,0x41,0x55, +0x54,0x4f,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x62,0x70,0x74,0x22,0x20,0x76, +0x61,0x6c,0x75,0x65,0x3d,0x22,0x33,0x22,0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x65,0x78,0x74,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x63,0x66,0x67,0x63,0x62,0x22,0x3e,0x41,0x55,0x54,0x4f, +0x3c,0x2f,0x74,0x65,0x78,0x74,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69, +0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x75,0x62,0x62,0x6c,0x6f,0x63, +0x6b,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x68,0x31,0x3e,0x4e,0x54,0x52,0x49,0x50,0x20,0x53,0x65,0x72,0x76,0x65, +0x72,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x49,0x50,0x3a,0x3c,0x2f,0x6c, +0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65, +0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x73,0x49,0x70,0x27, +0x20,0x6e,0x61,0x6d,0x65,0x3d,0x27,0x73,0x49,0x70,0x27,0x20,0x73,0x69,0x7a,0x65, +0x3d,0x27,0x31,0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20, +0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e, +0x50,0x4f,0x52,0x54,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69,0x6e, +0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27,0x20, +0x69,0x64,0x3d,0x27,0x73,0x50,0x6f,0x72,0x74,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, +0x27,0x73,0x50,0x6f,0x72,0x74,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38, +0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61,0x73, +0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x4d,0x4f,0x55,0x4e, +0x54,0x20,0x50,0x4f,0x49,0x4e,0x54,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e, +0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78, +0x74,0x27,0x20,0x69,0x64,0x3d,0x27,0x73,0x4d,0x6f,0x50,0x27,0x20,0x6e,0x61,0x6d, +0x65,0x3d,0x27,0x73,0x4d,0x6f,0x50,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31, +0x38,0x27,0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x70,0x3e,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x63,0x6c,0x61, +0x73,0x73,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x31,0x22,0x3e,0x50,0x41,0x53, +0x53,0x57,0x4f,0x52,0x44,0x3a,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x69, +0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74,0x65,0x78,0x74,0x27, +0x20,0x69,0x64,0x3d,0x27,0x73,0x50,0x77,0x64,0x27,0x20,0x6e,0x61,0x6d,0x65,0x3d, +0x27,0x73,0x50,0x77,0x64,0x27,0x20,0x73,0x69,0x7a,0x65,0x3d,0x27,0x31,0x38,0x27, +0x20,0x2f,0x3e,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x62,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, +0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x73,0x61,0x76,0x65,0x5f,0x62,0x75,0x74, +0x74,0x6f,0x6e,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, +0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x62, +0x75,0x74,0x74,0x6f,0x6e,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x53,0x41, +0x56,0x45,0x27,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d,0x22,0x6e,0x73,0x5f, +0x65,0x6e,0x61,0x62,0x6c,0x65,0x28,0x30,0x29,0x22,0x2f,0x3e,0x20,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75, +0x74,0x20,0x73,0x74,0x79,0x6c,0x65,0x3d,0x22,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d, +0x6c,0x65,0x66,0x74,0x3a,0x20,0x31,0x30,0x30,0x70,0x78,0x3b,0x22,0x20,0x63,0x6c, +0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x74,0x79,0x70, +0x65,0x3d,0x27,0x62,0x75,0x74,0x74,0x6f,0x6e,0x27,0x20,0x76,0x61,0x6c,0x75,0x65, +0x3d,0x27,0x45,0x4e,0x41,0x42,0x4c,0x45,0x27,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63, +0x6b,0x3d,0x22,0x6e,0x73,0x5f,0x65,0x6e,0x61,0x62,0x6c,0x65,0x28,0x31,0x29,0x22, +0x2f,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69, +0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0d, +0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d, +0x0a,0x09,0x09,0x09,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x0d,0x0a,0x09,0x09,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20, +0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73, +0x63,0x72,0x69,0x70,0x74,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65, +0x74,0x54,0x61,0x62,0x28,0x6e,0x61,0x6d,0x65,0x2c,0x63,0x75,0x72,0x73,0x65,0x6c, +0x2c,0x6e,0x29,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x3d,0x31,0x3b,0x20, +0x69,0x3c,0x3d,0x6e,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x76,0x61,0x72,0x20,0x6d,0x65,0x6e,0x75,0x20,0x3d,0x20,0x64,0x6f,0x63, +0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74, +0x42,0x79,0x49,0x64,0x28,0x6e,0x61,0x6d,0x65,0x2b,0x69,0x29,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x63,0x6f,0x6e,0x3d,0x64,0x6f,0x63,0x75,0x6d, +0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79, +0x49,0x64,0x28,0x22,0x63,0x6f,0x6e,0x5f,0x22,0x2b,0x6e,0x61,0x6d,0x65,0x2b,0x22, +0x5f,0x22,0x2b,0x69,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x65,0x6e,0x75, +0x2e,0x63,0x6c,0x61,0x73,0x73,0x4e,0x61,0x6d,0x65,0x3d,0x69,0x3d,0x3d,0x63,0x75, +0x72,0x73,0x65,0x6c,0x3f,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3a,0x22,0x22,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x2e,0x73,0x74,0x79,0x6c,0x65,0x2e, +0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3d,0x69,0x3d,0x3d,0x63,0x75,0x72,0x73,0x65, +0x6c,0x3f,0x22,0x62,0x6c,0x6f,0x63,0x6b,0x22,0x3a,0x22,0x6e,0x6f,0x6e,0x65,0x22, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x63,0x5f,0x65, +0x6e,0x61,0x62,0x6c,0x65,0x28,0x65,0x6e,0x29,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x22,0x6e, +0x63,0x45,0x6e,0x22,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x6e, +0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x4e,0x74,0x72,0x69, +0x70,0x43,0x6c,0x69,0x65,0x6e,0x74,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x61,0x63, +0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x74,0x72,0x69,0x70,0x43,0x6c,0x69,0x65,0x6e, +0x74,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x63,0x67,0x69,0x22,0x3b,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64, +0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x4e,0x74,0x72,0x69,0x70,0x43,0x6c,0x69, +0x65,0x6e,0x74,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x73,0x75,0x62,0x6d,0x69,0x74, +0x28,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x61,0x63,0x5f,0x65,0x6e, +0x61,0x62,0x6c,0x65,0x28,0x65,0x6e,0x29,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x28,0x22,0x61,0x63, +0x45,0x6e,0x22,0x29,0x2e,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x6e,0x3b, +0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x41,0x63,0x65,0x69,0x6e, +0x6e,0x61,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d, +0x22,0x61,0x63,0x65,0x69,0x6e,0x6e,0x61,0x43,0x6c,0x69,0x65,0x6e,0x74,0x43,0x6f, +0x6e,0x66,0x69,0x67,0x2e,0x63,0x67,0x69,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75, +0x6d,0x65,0x6e,0x74,0x2e,0x41,0x63,0x65,0x69,0x6e,0x6e,0x61,0x43,0x6f,0x6e,0x66, +0x69,0x67,0x2e,0x73,0x75,0x62,0x6d,0x69,0x74,0x28,0x29,0x3b,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x0d,0x0a,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x75,0x6e,0x63,0x74, +0x69,0x6f,0x6e,0x20,0x6e,0x73,0x5f,0x65,0x6e,0x61,0x62,0x6c,0x65,0x28,0x65,0x6e, +0x29,0x7b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x24,0x28,0x22,0x6e,0x73,0x45,0x6e,0x22,0x29,0x2e,0x76,0x61, +0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x6e,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d, +0x65,0x6e,0x74,0x2e,0x4e,0x74,0x72,0x69,0x70,0x53,0x65,0x72,0x76,0x65,0x72,0x43, +0x6f,0x6e,0x66,0x69,0x67,0x2e,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x74, +0x72,0x69,0x70,0x53,0x65,0x72,0x76,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e, +0x63,0x67,0x69,0x22,0x3b,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e, +0x4e,0x74,0x72,0x69,0x70,0x53,0x65,0x72,0x76,0x65,0x72,0x43,0x6f,0x6e,0x66,0x69, +0x67,0x2e,0x73,0x75,0x62,0x6d,0x69,0x74,0x28,0x29,0x3b,0x0d,0x0a,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0d,0x0a,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x0a,0x09,0x09,0x3c,0x2f,0x73,0x63, +0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x74, +0x65,0x78,0x74,0x2f,0x6a,0x61,0x76,0x61,0x73,0x63,0x72,0x69,0x70,0x74,0x27,0x20, +0x73,0x72,0x63,0x3d,0x27,0x77,0x6f,0x72,0x6b,0x43,0x6f,0x6e,0x66,0x69,0x67,0x2e, +0x6a,0x73,0x27,0x3e,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0d,0x0a,0x09, +0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e, +0x0d,0x0a,0x0d,0x0a,}; + + + +const struct fsdata_file file__css_style_css[] = { { +file_NULL, +data__css_style_css, +data__css_style_css + 16, +sizeof(data__css_style_css) - 16, +1, +}}; + +const struct fsdata_file file__deviceInfo_shtml[] = { { +file__css_style_css, +data__deviceInfo_shtml, +data__deviceInfo_shtml + 20, +sizeof(data__deviceInfo_shtml) - 20, +1, +}}; + +const struct fsdata_file file__ethCfg_shtml[] = { { +file__deviceInfo_shtml, +data__ethCfg_shtml, +data__ethCfg_shtml + 16, +sizeof(data__ethCfg_shtml) - 16, +1, +}}; + +const struct fsdata_file file__runStatus_shtml[] = { { +file__ethCfg_shtml, +data__runStatus_shtml, +data__runStatus_shtml + 20, +sizeof(data__runStatus_shtml) - 20, +1, +}}; + +const struct fsdata_file file__userCfg_shtml[] = { { +file__runStatus_shtml, +data__userCfg_shtml, +data__userCfg_shtml + 16, +sizeof(data__userCfg_shtml) - 16, +1, +}}; + +const struct fsdata_file file__workCfg_shtml[] = { { +file__userCfg_shtml, +data__workCfg_shtml, +data__workCfg_shtml + 16, +sizeof(data__workCfg_shtml) - 16, +1, +}}; + +#define FS_ROOT file__workCfg_shtml +#define FS_NUMFILES 6 + + + +#endif #endif diff --git a/LWIP/lwip_app/webserver/inc/httpd.h b/LWIP/lwip_app/webserver/inc/httpd.h index b154d37..4e5667d 100644 --- a/LWIP/lwip_app/webserver/inc/httpd.h +++ b/LWIP/lwip_app/webserver/inc/httpd.h @@ -129,7 +129,7 @@ void http_set_js_handlers(const tJS *pJSs, int iNumHandlers); /* The maximum number of parameters that the CGI handler can be sent. */ #ifndef LWIP_HTTPD_MAX_CGI_PARAMETERS -#define LWIP_HTTPD_MAX_CGI_PARAMETERS 16 +#define LWIP_HTTPD_MAX_CGI_PARAMETERS 20 #endif #endif /* LWIP_HTTPD_CGI */ diff --git a/LWIP/lwip_app/webserver/src/httpd.c b/LWIP/lwip_app/webserver/src/httpd.c index f5a37cd..70b975b 100644 --- a/LWIP/lwip_app/webserver/src/httpd.c +++ b/LWIP/lwip_app/webserver/src/httpd.c @@ -235,6 +235,7 @@ typedef struct u8_t shtml; } default_filename; +#ifndef BASE_STATION const default_filename g_psDefaultFilenames[] = { {"/NtripCfg.shtml", true }, {"/NtripCfg.ssi", true }, @@ -242,6 +243,15 @@ const default_filename g_psDefaultFilenames[] = { {"/NtripCfg.html", false }, {"/NtripCfg.htm", false } }; +#else +const default_filename g_psDefaultFilenames[] = { + {"/runStatus.shtml", true }, + {"/runStatus.ssi", true }, + {"/runStatus.shtm", true }, + {"/runStatus.html", false }, + {"/runStatus.htm", false } +}; +#endif #define NUM_DEFAULT_FILENAMES (sizeof(g_psDefaultFilenames) / \ sizeof(default_filename)) @@ -2134,7 +2144,7 @@ err_t httpd_post_begin(void *connection, const char *uri, const char *http_reque return ERR_ARG; } -#define LWIP_HTTPD_POST_MAX_PAYLOAD_LEN 512 +#define LWIP_HTTPD_POST_MAX_PAYLOAD_LEN 1024 static char http_post_payload[LWIP_HTTPD_POST_MAX_PAYLOAD_LEN]; static u16_t http_post_payload_len = 0; err_t httpd_post_receive_data(void *connection, struct pbuf *p) diff --git a/LWIP/lwip_app/webserver/src/httpd_handler.c b/LWIP/lwip_app/webserver/src/httpd_handler.c index 64c1390..cc5585d 100644 --- a/LWIP/lwip_app/webserver/src/httpd_handler.c +++ b/LWIP/lwip_app/webserver/src/httpd_handler.c @@ -1,35 +1,49 @@ +#ifndef BASE_STATION + #include #include - #include "httpd.h" #include "lwip/tcp.h" #include "fs.h" #include "lwip_comm.h" #include "app_version.h" #include "stm32f4xx_hal.h" -#include "ntrip_client.h" +#include "m_ntrip_client.h" #include "calibrationAPI.h" #include "platformAPI.h" #include "user_config.h" +#include "cJSON.h" +#include "car_data.h" const char radioEthMode[2][15] = { "radioDhcp", "radioStatic", }; +const char radioWheelPinMode[2][15] = { + "radioWheel", + "radioSPI", +}; + +const char radioCanMode[2][15] = { + "radioCAR", + "radioJ1939", +}; + #define NUM_CONFIG_SSI_TAGS 8 -#define NUM_CONFIG_CGI_URIS 3 -#define NUM_CONFIG_JS_URIS 4 +#define NUM_CONFIG_CGI_URIS 4 +#define NUM_CONFIG_JS_URIS 5 const char *ntrip_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const char *user_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const char *ethnet_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); +const char *odo_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const char *ntrip_config_js_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const char *ntrip_state_js_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const char *user_config_js_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); const char *ethnet_config_js_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); - +const char *odo_config_js_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); static const char *ssiTAGs[] = { @@ -48,6 +62,7 @@ static const tCGI cgiURIs[] = {"/NtripConfig.cgi", ntrip_config_cgi_handler}, {"/UserConfig.cgi", user_config_cgi_handler}, {"/EthnetConfig.cgi", ethnet_config_cgi_handler}, + {"/OdoConfig.cgi", odo_config_cgi_handler}, }; static const tJS jsURIs[] = @@ -56,6 +71,7 @@ static const tJS jsURIs[] = {"/NtripState.js", ntrip_state_js_handler}, {"/UserConfig.js", user_config_js_handler}, {"/EthnetConfig.js", ethnet_config_js_handler}, + {"/OdoConfig.js", odo_config_js_handler}, }; // SSI Handler @@ -142,6 +158,136 @@ static int FindCGIParameter(const char *pcToFind, char *pcParam[], int iNumParam return (-1); } + +static void escape_symbol(const char* src, char* dest) +{ + uint16_t len = strlen(src); + uint16_t i; + uint8_t symbol[2]; + + for (i = 0; i < len; i++) { + if (src[i] == '%') { + if (i < len-2) { + symbol[0] = src[i+1]; + symbol[1] = src[i+2]; + i = i + 2; + if (symbol[0] == '5' && symbol[1] == 'B') { + *dest++ = '['; + } else if (symbol[0] == '5' && symbol[1] == 'D') { + *dest++ = ']'; + } else if (symbol[0] == '7' && symbol[1] == 'B') { + *dest++ = '{'; + } else if (symbol[0] == '2' && symbol[1] == '2') { + *dest++ = '"'; + } else if (symbol[0] == '3' && symbol[1] == 'A') { + *dest++ = ':'; + } else if (symbol[0] == '2' && symbol[1] == 'C') { + *dest++ = ','; + } else if (symbol[0] == '7' && symbol[1] == 'D') { + *dest++ = '}'; + } + } + } else { + *dest++ = src[i]; + } + } + *dest = 0; +} + +const char *odo_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) +{ + int index_wlmode, index_canMesg, index_gear, index_canmode; + char buf[512] = {0}; + cJSON *root = NULL, *data = NULL; + uint8_t index = 0; + + if (iNumParams == 4) { + index_wlmode = FindCGIParameter("wlmode", pcParam, iNumParams); + index_canMesg = FindCGIParameter("canMesg", pcParam, iNumParams); + index_gear = FindCGIParameter("gear", pcParam, iNumParams); + index_canmode = FindCGIParameter("canmode", pcParam, iNumParams); + + if (index_wlmode != -1 && index_canMesg != -1 && index_gear != -1 && index_canmode != -1) { + escape_symbol((const char*)pcValue[index_canMesg], buf); + + if (!strcmp(pcValue[index_wlmode], "WHEELTICK")) { + gOdoConfigurationStruct.wheeltick_pin_mode = 0; + } else if (!strcmp(pcValue[index_wlmode], "SPI_NSS")) { + gOdoConfigurationStruct.wheeltick_pin_mode = 1; + } + + if (!strcmp(pcValue[index_canmode], "CAR")) { + gOdoConfigurationStruct.can_mode = 0; + } else if (!strcmp(pcValue[index_canmode], "J1939")) { + gOdoConfigurationStruct.can_mode = 1; + } + + gOdoConfigurationStruct.odo_mesg[0].usage = 0; + gOdoConfigurationStruct.odo_mesg[1].usage = 0; + gOdoConfigurationStruct.odo_mesg[2].usage = 0; + root = cJSON_Parse((const char *)buf); + if (root != NULL) { + data = root->child; + while (data != NULL) { + cJSON *MesgID = cJSON_GetObjectItem(data, "MesgID"); + cJSON *StartBit = cJSON_GetObjectItem(data, "StartBit"); + cJSON *Length = cJSON_GetObjectItem(data, "Length"); + cJSON *Endian = cJSON_GetObjectItem(data, "Endian"); + cJSON *Sign = cJSON_GetObjectItem(data, "Sign"); + cJSON *Factor = cJSON_GetObjectItem(data, "Factor"); + cJSON *Offset = cJSON_GetObjectItem(data, "Offset"); + cJSON *Unit = cJSON_GetObjectItem(data, "Unit"); + cJSON *Source = cJSON_GetObjectItem(data, "Source"); + if (MesgID != NULL && StartBit != NULL && Length != NULL + && Endian != NULL && Sign != NULL && Factor != NULL + && Offset != NULL && Unit != NULL && Source != NULL) + { + gOdoConfigurationStruct.odo_mesg[index].mesgID = atoi(MesgID->valuestring); + gOdoConfigurationStruct.odo_mesg[index].startbit = atoi(StartBit->valuestring); + gOdoConfigurationStruct.odo_mesg[index].length = atoi(Length->valuestring); + gOdoConfigurationStruct.odo_mesg[index].endian = atoi(Endian->valuestring); + gOdoConfigurationStruct.odo_mesg[index].sign = atoi(Sign->valuestring); + gOdoConfigurationStruct.odo_mesg[index].factor = atof(Factor->valuestring); + gOdoConfigurationStruct.odo_mesg[index].offset = atof(Offset->valuestring); + gOdoConfigurationStruct.odo_mesg[index].unit = atoi(Unit->valuestring); + gOdoConfigurationStruct.odo_mesg[index].source = atoi(Source->valuestring); + gOdoConfigurationStruct.odo_mesg[index].usage = 0x55; + index++; + if (index >= 3) { + break; + } + } + data = data->next; + } + cJSON_Delete(root); + } + + escape_symbol((const char*)pcValue[index_gear], buf); + root = cJSON_Parse((const char *)buf); + if (root != NULL) { + cJSON *gear_p = cJSON_GetObjectItem(root, "P"); + cJSON *gear_r = cJSON_GetObjectItem(root, "R"); + cJSON *gear_n = cJSON_GetObjectItem(root, "N"); + cJSON *gear_d = cJSON_GetObjectItem(root, "D"); + + if (gear_p != NULL && gear_r != NULL && gear_n != NULL && gear_d != NULL) { + gOdoConfigurationStruct.gears[0] = atoi(gear_p->valuestring); + gOdoConfigurationStruct.gears[1] = atoi(gear_r->valuestring); + gOdoConfigurationStruct.gears[2] = atoi(gear_n->valuestring); + gOdoConfigurationStruct.gears[3] = atoi(gear_d->valuestring); + } + cJSON_Delete(root); + } + + car_can_initialize(); + gOdoConfigurationStruct.flag = 0xaa5555aa; + SaveUserConfig(); + } + } + + return "/OdoCfg.shtml"; +} + const char *ethnet_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) { int index_eth_mode, index_static_ip, index_static_netmask, index_static_gateway; @@ -163,24 +309,24 @@ const char *ethnet_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[ && ipaddr_aton((const char*)pcValue[index_static_netmask], &ip_addr_netmask) == 1 && ipaddr_aton((const char*)pcValue[index_static_gateway], &ip_addr_gateway) == 1) { - if ((!strcmp(pcValue[index_eth_mode], "dhcp") && gUserConfiguration.ethMode != ETHMODE_DHCP) || - (!strcmp(pcValue[index_eth_mode], "static") && gUserConfiguration.ethMode != ETHMODE_STATIC) || - memcmp(gUserConfiguration.staticIp, &ip_addr_ip, 4) != 0 || - memcmp(gUserConfiguration.netmask, &ip_addr_netmask, 4) != 0 || - memcmp(gUserConfiguration.gateway, &ip_addr_gateway, 4) != 0) + if ((!strcmp(pcValue[index_eth_mode], "dhcp") && get_eth_mode() != ETHMODE_DHCP) || + (!strcmp(pcValue[index_eth_mode], "static") && get_eth_mode() != ETHMODE_STATIC) || + memcmp(get_static_ip(), &ip_addr_ip, 4) != 0 || + memcmp(get_static_netmask(), &ip_addr_netmask, 4) != 0 || + memcmp(get_static_gateway(), &ip_addr_gateway, 4) != 0) { - if (!strcmp(pcValue[index_eth_mode], "dhcp") && gUserConfiguration.ethMode == ETHMODE_STATIC) + if (!strcmp(pcValue[index_eth_mode], "dhcp") && get_eth_mode() == ETHMODE_STATIC) { - gUserConfiguration.ethMode = ETHMODE_DHCP; + set_eth_mode(ETHMODE_DHCP); } - else if (!strcmp(pcValue[index_eth_mode], "static") && gUserConfiguration.ethMode == ETHMODE_DHCP) + else if (!strcmp(pcValue[index_eth_mode], "static") && get_eth_mode() == ETHMODE_DHCP) { - gUserConfiguration.ethMode = ETHMODE_STATIC; + set_eth_mode(ETHMODE_STATIC); } - memcpy(gUserConfiguration.staticIp, &ip_addr_ip, 4); - memcpy(gUserConfiguration.netmask, &ip_addr_netmask, 4); - memcpy(gUserConfiguration.gateway, &ip_addr_gateway, 4); + set_static_ip((uint8_t*)&ip_addr_ip); + set_static_netmask((uint8_t*)&ip_addr_netmask); + set_static_gateway((uint8_t*)&ip_addr_gateway); netif_ethernet_config_changed(); @@ -214,21 +360,17 @@ const char *ntrip_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[] { port = atoi(pcValue[index_port]); - if (strcmp((const char*)gUserConfiguration.ip, pcValue[index_ip]) != 0 - || gUserConfiguration.port != port - || strcmp((const char*)gUserConfiguration.mountPoint, pcValue[index_mountPoint]) != 0 - || strcmp((const char*)gUserConfiguration.username, pcValue[index_username]) != 0 - || strcmp((const char*)gUserConfiguration.password, pcValue[index_password]) != 0) + if (strcmp(get_ntrip_client_ip(), pcValue[index_ip]) != 0 + || get_ntrip_client_port() != port + || strcmp(get_ntrip_client_mount_point(), pcValue[index_mountPoint]) != 0 + || strcmp(get_ntrip_client_username(), pcValue[index_username]) != 0 + || strcmp(get_ntrip_client_password(), pcValue[index_password]) != 0) { - memset(gUserConfiguration.ip, 0, sizeof(gUserConfiguration.ip)); - strcpy((char *)gUserConfiguration.ip, (const char *)pcValue[index_ip]); - gUserConfiguration.port = port; - memset(gUserConfiguration.mountPoint, 0, sizeof(gUserConfiguration.mountPoint)); - strcpy((char *)gUserConfiguration.mountPoint, (const char *)pcValue[index_mountPoint]); - memset(gUserConfiguration.username, 0, sizeof(gUserConfiguration.username)); - strcpy((char *)gUserConfiguration.username, (const char *)pcValue[index_username]); - memset(gUserConfiguration.password, 0, sizeof(gUserConfiguration.password)); - strcpy((char *)gUserConfiguration.password, (const char *)pcValue[index_password]); + set_ntrip_client_ip((const char *)pcValue[index_ip]); + set_ntrip_client_port(port); + set_ntrip_client_mount_point((const char *)pcValue[index_mountPoint]); + set_ntrip_client_username((const char *)pcValue[index_username]); + set_ntrip_client_password((const char *)pcValue[index_password]); netif_ntrip_config_changed(); @@ -267,29 +409,29 @@ const char *user_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[], && index_pointOfInterestBx != -1 && index_pointOfInterestBy != -1 && index_pointOfInterestBz != -1 && index_rotationRbvx != -1 && index_rotationRbvy != -1 && index_rotationRbvz != -1) { - result = valid_user_config_parameter(USER_UART_PACKET_TYPE, (uint8_t*)pcValue[index_userPacketType]); + result = valid_user_config_parameter(USER_USER_PACKET_TYPE, (uint8_t*)pcValue[index_userPacketType]); if (result){ - memcpy(gUserConfiguration.userPacketType, pcValue[index_userPacketType], sizeof(gUserConfiguration.userPacketType)); + set_user_packet_type((uint8_t*)pcValue[index_userPacketType]); } uint16_t userPacketRate = atoi(pcValue[index_userPacketRate]); - result = valid_user_config_parameter(USER_UART_PACKET_RATE, (uint8_t*)&userPacketRate); + result = valid_user_config_parameter(USER_USER_PACKET_RATE, (uint8_t*)&userPacketRate); if (result){ - gUserConfiguration.userPacketRate = userPacketRate; + set_user_packet_rate(userPacketRate); } - gUserConfiguration.leverArmBx = atof(pcValue[index_leverArmBx]); - gUserConfiguration.leverArmBy = atof(pcValue[index_leverArmBy]); - gUserConfiguration.leverArmBz = atof(pcValue[index_leverArmBz]); - gUserConfiguration.pointOfInterestBx = atof(pcValue[index_pointOfInterestBx]); - gUserConfiguration.pointOfInterestBy = atof(pcValue[index_pointOfInterestBy]); - gUserConfiguration.pointOfInterestBz = atof(pcValue[index_pointOfInterestBz]); - gUserConfiguration.rotationRbvx = atof(pcValue[index_rotationRbvx]); - gUserConfiguration.rotationRbvy = atof(pcValue[index_rotationRbvy]); - gUserConfiguration.rotationRbvz = atof(pcValue[index_rotationRbvz]); - - update_system_para(); - update_user_para(); + set_lever_arm_bx(atof(pcValue[index_leverArmBx])); + set_lever_arm_by(atof(pcValue[index_leverArmBy])); + set_lever_arm_bz(atof(pcValue[index_leverArmBz])); + set_point_of_interest_bx(atof(pcValue[index_pointOfInterestBx])); + set_point_of_interest_by(atof(pcValue[index_pointOfInterestBy])); + set_point_of_interest_bz(atof(pcValue[index_pointOfInterestBz])); + set_rotation_rbvx(atof(pcValue[index_rotationRbvx])); + set_rotation_rbvy(atof(pcValue[index_rotationRbvy])); + set_rotation_rbvz(atof(pcValue[index_rotationRbvz])); + + ins_init(); + SaveUserConfig(); } } @@ -301,17 +443,80 @@ const char *user_config_cgi_handler(int iIndex, int iNumParams, char *pcParam[], CCMRAM uint8_t http_response[HTTP_JS_RESPONSE_SIZE]; CCMRAM uint8_t http_response_body[HTTP_JS_RESPONSE_SIZE]; // JS Handler +const char *odo_config_js_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) +{ + char* buf = NULL; + cJSON *data = NULL; + uint8_t i; + + memset(http_response, 0, HTTP_JS_RESPONSE_SIZE); + memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); + + sprintf((char *)http_response_body, "OdoConfigCallback({\"wlmode\":\"%s\",\"canmode\":\"%s\",\"canMesg\":[", + radioWheelPinMode[gOdoConfigurationStruct.wheeltick_pin_mode], + radioCanMode[gOdoConfigurationStruct.can_mode]); + + for (i = 0; i < 3; i++) { + if (gOdoConfigurationStruct.odo_mesg[i].usage == 0x55) { + data = cJSON_CreateObject(); + cJSON_AddItemToObject(data, "MesgID", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].mesgID)); + cJSON_AddItemToObject(data, "StartBit", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].startbit)); + cJSON_AddItemToObject(data, "Length", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].length)); + cJSON_AddItemToObject(data, "Endian", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].endian)); + cJSON_AddItemToObject(data, "Sign", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].sign)); + cJSON_AddItemToObject(data, "Factor", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].factor)); + cJSON_AddItemToObject(data, "Offset", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].offset)); + cJSON_AddItemToObject(data, "Unit", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].unit)); + cJSON_AddItemToObject(data, "Source", cJSON_CreateNumber(gOdoConfigurationStruct.odo_mesg[i].source)); + + buf = cJSON_PrintUnformatted(data); + if (buf != NULL) { + if (i != 0) { + strcat((char *)http_response_body, ","); + } + strcat((char *)http_response_body, buf); + free(buf); + } + cJSON_Delete(data); + } + } + strcat((char *)http_response_body, "],\"gear\":"); + + data = cJSON_CreateObject(); + cJSON_AddItemToObject(data, "P", cJSON_CreateNumber(gOdoConfigurationStruct.gears[0])); + cJSON_AddItemToObject(data, "R", cJSON_CreateNumber(gOdoConfigurationStruct.gears[1])); + cJSON_AddItemToObject(data, "N", cJSON_CreateNumber(gOdoConfigurationStruct.gears[2])); + cJSON_AddItemToObject(data, "D", cJSON_CreateNumber(gOdoConfigurationStruct.gears[3])); + buf = cJSON_PrintUnformatted(data); + if (buf != NULL) { + strcat((char *)http_response_body, buf); + free(buf); + } + cJSON_Delete(data); + + strcat((char *)http_response_body, "})"); + + sprintf((char *)http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:%d\r\n\r\n%s", strlen((const char*)http_response_body), http_response_body); + + return (char *)http_response; +} + const char *ethnet_config_js_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) { + uint8_t *mac = get_static_mac(); + uint8_t *staticIp = get_static_ip(); + uint8_t *gateway = get_static_gateway(); + uint8_t *netmask = get_static_netmask(); + memset(http_response, 0, HTTP_JS_RESPONSE_SIZE); memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); sprintf((char *)http_response_body, "EthnetConfigCallback({\"ethMode\":\"%s\",\"mac\":\"%02X:%02X:%02X:%02X:%02X:%02X\",\"defaultIp\":\"%d.%d.%d.%d\",\"defaultGateway\":\"%d.%d.%d.%d\",\"defaultNetmask\":\"%d.%d.%d.%d\"})", - radioEthMode[gUserConfiguration.ethMode], - gUserConfiguration.mac[0], gUserConfiguration.mac[1], gUserConfiguration.mac[2], gUserConfiguration.mac[3], gUserConfiguration.mac[4], gUserConfiguration.mac[5], - gUserConfiguration.staticIp[0], gUserConfiguration.staticIp[1], gUserConfiguration.staticIp[2], gUserConfiguration.staticIp[3], - gUserConfiguration.gateway[0], gUserConfiguration.gateway[1], gUserConfiguration.gateway[2], gUserConfiguration.gateway[3], - gUserConfiguration.netmask[0], gUserConfiguration.netmask[1], gUserConfiguration.netmask[2], gUserConfiguration.netmask[3]); + radioEthMode[get_eth_mode()], + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], + staticIp[0], staticIp[1], staticIp[2], staticIp[3], + gateway[0], gateway[1], gateway[2], gateway[3], + netmask[0], netmask[1], netmask[2], netmask[3]); sprintf((char *)http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:%d\r\n\r\n%s", strlen((const char*)http_response_body), http_response_body); @@ -324,11 +529,11 @@ const char *ntrip_config_js_handler(int iIndex, int iNumParams, char *pcParam[], memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); sprintf((char *)http_response_body, "NtripConfigCallback({\"ip\":\"%s\",\"port\":\"%d\",\"mountPoint\":\"%s\",\"username\":\"%s\",\"password\":\"%s\"})", - gUserConfiguration.ip, - gUserConfiguration.port, - gUserConfiguration.mountPoint, - gUserConfiguration.username, - gUserConfiguration.password + get_ntrip_client_ip(), + get_ntrip_client_port(), + get_ntrip_client_mount_point(), + get_ntrip_client_username(), + get_ntrip_client_password() ); sprintf((char *)http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:%d\r\n\r\n%s", strlen((const char*)http_response_body), http_response_body); @@ -343,20 +548,20 @@ const char *user_config_js_handler(int iIndex, int iNumParams, char *pcParam[], memset(http_response, 0, HTTP_JS_RESPONSE_SIZE); memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); - memcpy(userPacketType, gUserConfiguration.userPacketType, sizeof(gUserConfiguration.userPacketType)); - userPacketType[3] = 0; + memcpy(userPacketType, get_user_packet_type(), 2); + userPacketType[2] = 0; sprintf((char *)http_response_body, "UserConfigCallback({\"userPacketType\":\"%s\",\"userPacketRate\":\"%d\",\"leverArmBx\":\"%f\",\"leverArmBy\":\"%f\",\"leverArmBz\":\"%f\",\"pointOfInterestBx\":\"%f\",\"pointOfInterestBy\":\"%f\",\"pointOfInterestBz\":\"%f\",\"rotationRbvx\":\"%f\",\"rotationRbvy\":\"%f\",\"rotationRbvz\":\"%f\"})", userPacketType, - gUserConfiguration.userPacketRate, - gUserConfiguration.leverArmBx, - gUserConfiguration.leverArmBy, - gUserConfiguration.leverArmBz, - gUserConfiguration.pointOfInterestBx, - gUserConfiguration.pointOfInterestBy, - gUserConfiguration.pointOfInterestBz, - gUserConfiguration.rotationRbvx, - gUserConfiguration.rotationRbvy, - gUserConfiguration.rotationRbvz + get_user_packet_rate(), + get_lever_arm_bx(), + get_lever_arm_by(), + get_lever_arm_bz(), + get_point_of_interest_bx(), + get_point_of_interest_by(), + get_point_of_interest_bz(), + get_rotation_rbvx(), + get_rotation_rbvy(), + get_rotation_rbvz() ); sprintf((char *)http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:%d\r\n\r\n%s", strlen((const char*)http_response_body), http_response_body); @@ -391,4 +596,1340 @@ void httpd_cgi_init(void) void httpd_js_init(void) { http_set_js_handlers(jsURIs, NUM_CONFIG_JS_URIS); -} \ No newline at end of file +} + + +#else // BASE_STATION + + +#include +#include +#include "httpd.h" +#include "lwip/tcp.h" +#include "fs.h" +#include "lwip_comm.h" +#include "app_version.h" +#include "stm32f4xx_hal.h" +#include "calibrationAPI.h" +#include "platformAPI.h" +#include "user_config.h" +#include "ntrip_server.h" +#include "user_message.h" +#include "lcsystem.h" +#include "station_tcp.h" +#include "aceinna_client.h" + +#define NUM_CONFIG_SSI_TAGS 6 +#define NUM_CONFIG_CGI_URIS 5 +#define NUM_CONFIG_JS_URIS 5 + +const char *ntrip_client_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); +const char *aceinna_client_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); +const char *ntrip_server_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); +const char *user_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); +const char *ethnet_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); + +const char *position_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); +const char *work_config_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); +const char *user_config_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); +const char *ethnet_config_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); +const char *ethnet_summary_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]); + +static uint8_t tool_itoa(int32_t value, char *sp, uint8_t radix) +{ + char tmp[12]; // int32 + char *tp = tmp; + int32_t i; + uint32_t v; + int32_t sign = 0; + uint8_t len = 0; + + sign = (radix == 10 && value < 0); + if (sign) { + v = -value; + } else { + v = value; + } + + while (v || tp == tmp) + { + i = v % radix; + v /= radix; + if (i < 10) { + *tp++ = i + '0'; + } else { + *tp++ = i + 'A' - 10; + } + } + + if (radix != 10) { ///< zero fill non decimal values + while (tp < &(tmp[4])) { + *tp++ = '0'; + } + } + + if (sign) { + *sp++ = '-'; + len = 1; + } + /// reverse and put in output buffer + len += tp - tmp; + while (tp > tmp) { + tp--; + *sp++ = *tp; + } + *sp = '\0'; + return len; +} + +static void tool_itof(float f, char *sp, uint8_t sigDigits) +{ + char numberIntString[12] = {0}; + char numberSigString[12] = {0}; + uint8_t intStringLen, sigStringLen; + int32_t i, n; + uint8_t append_zero, sign = 0; + + i = (int32_t) f; ///< just get the number to the left of the decimal + n = i; + if (f < 0) { + n = -n; + sign = 1; + } else { + sign = 0; + } + + /// now get the number of significant digits to the right + f = f - i; + if (f < 0) { + f = -f; + } + if (sigDigits > 6) { /// max 6 sig digits + sigDigits = 6; + } + f = f * pow(10, sigDigits); + i = round(f); + if (i >= pow(10, sigDigits)) { + n++; + i = 0; + } + + intStringLen = tool_itoa(n, numberIntString, 10); + sigStringLen = tool_itoa(i, numberSigString, 10); + + if (sign) { + *sp++ = '-'; + } + for (i = 0; i < intStringLen; i++) { + *sp++ = numberIntString[i]; + } + *sp++ = '.'; + append_zero = sigDigits - sigStringLen; + while (append_zero) { + *sp++ = '0'; + append_zero--; + } + for (i = 0; i < sigStringLen; i++) { + *sp++ = numberSigString[i]; + } + *sp = '\0'; +} + +static void tool_itod(double d, char *sp, uint8_t sigDigits) +{ + char numberIntString[12] = {0}; + char numberSigString[12] = {0}; + uint8_t intStringLen, sigStringLen; + int32_t i, n; + uint8_t append_zero, sign = 0; + + i = (int32_t) d; ///< just get the number to the left of the decimal + n = i; + if (d < 0) { + n = -n; + sign = 1; + } else { + sign = 0; + } + + /// now get the number of significant digits to the right + d = d - i; + if (d < 0) { + d = -d; + } + if (sigDigits > 8) { /// max 8 sig digits + sigDigits = 8; + } + d = d * pow(10, sigDigits); + i = round(d); + if (i >= pow(10, sigDigits)) { + n++; + i = 0; + } + + intStringLen = tool_itoa(n, numberIntString, 10); + sigStringLen = tool_itoa(i, numberSigString, 10); + + if (sign) { + *sp++ = '-'; + } + for (i = 0; i < intStringLen; i++) { + *sp++ = numberIntString[i]; + } + *sp++ = '.'; + append_zero = sigDigits - sigStringLen; + while (append_zero) { + *sp++ = '0'; + append_zero--; + } + for (i = 0; i < sigStringLen; i++) { + *sp++ = numberSigString[i]; + } + *sp = '\0'; +} + +static uint32_t string_append(char *strDest, const char *strScr) +{ + uint32_t len = 0; + + if ((strDest != NULL) && (strScr != NULL)) { + while (*strScr) { + *strDest++ = *strScr++; + len++; + } + *strDest = '\0'; + } + return len; +} + +static char *string_copy(char *strDest, const char *strScr) +{ + char *address = strDest; + + if ((strDest != NULL) && (strScr != NULL)) { + while (*strScr) + *strDest++ = *strScr++; + *strDest = '\0'; + } + return address; +} + +static char *string_cat(char *strDest, const char *strScr) +{ + char *address = strDest; + + if ((strDest != NULL) && (strScr != NULL)) { + while (*strDest) + strDest++; + while (*strScr) + *strDest++ = *strScr++; + *strDest = '\0'; + } + return address; +} + +static uint32_t string_length(const char *str) +{ + uint32_t len = 0; + + if (str != NULL) { + while (*str++) + len++; + } + return len; +} + + +uint8_t workpage_disp = 0; + +static const char *ssiTAGs[] = + { + "productName", + "imu", + "pn", + "firmwareVersion", + "serialNumwer", + "appVersion" +}; + +static const tCGI cgiURIs[] = + { + {"/ntripClientConfig.cgi", ntrip_client_config_cgi_handler}, + {"/aceinnaClientConfig.cgi", aceinna_client_config_cgi_handler}, + {"/ntripServerConfig.cgi", ntrip_server_config_cgi_handler}, + {"/userConfig.cgi", user_config_cgi_handler}, + {"/ethConfig.cgi", ethnet_config_cgi_handler}, +}; + +static const tJS jsURIs[] = + { + {"/position.js", position_js_handler}, + {"/workConfig.js", work_config_js_handler}, + {"/userConfig.js", user_config_js_handler}, + {"/ethConfig.js", ethnet_config_js_handler}, + {"/ethSummary.js", ethnet_summary_js_handler}, +}; + +// SSI Handler +static u16_t ssi_handler(int index, char *pcInsert, int iInsertLen) +{ + char temp[25] = {0}; + uint8_t i; + + switch (index) + { + case 0: + string_copy(pcInsert, PRODUCT_NAME_STRING); + break; + case 1: + string_copy(pcInsert, (const char*)GetUnitVersion()); + break; + case 2: + string_copy(temp, (const char *)platformBuildInfo()); + for (i = 0; i < string_length((const char*)temp); i++) + { + if (temp[i] == ' ') + { + temp[i] = 0; + break; + } + } + string_copy(pcInsert, (const char*)temp); + break; + case 3: + string_copy(temp, (const char *)platformBuildInfo()); + for (i = 0; i < string_length((const char*)temp); i++) + { + if (temp[i] == ' ') + { + temp[i] = 0; + break; + } + } + string_copy(pcInsert, (const char*)&temp[i+1]); + break; + case 4: + tool_itoa(GetUnitSerialNum(), temp, 10); + string_copy(pcInsert, (const char*)temp); + break; + case 5: + string_copy(pcInsert, APP_VERSION_STRING); + break; + default: + break; + } + return string_length(pcInsert); +} + +// CGI Handler +static int FindCGIParameter(const char *pcToFind, char *pcParam[], int iNumParams) +{ + int iLoop; + for (iLoop = 0; iLoop < iNumParams; iLoop++) + { + if (strcmp(pcToFind, pcParam[iLoop]) == 0) + { + return (iLoop); + } + } + return (-1); +} + +const char *ethnet_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + int index_eth_mode, index_static_ip, index_static_netmask, index_static_gateway; + ip_addr_t ip_addr_ip; + ip_addr_t ip_addr_netmask; + ip_addr_t ip_addr_gateway; + int eth_mode_t; + uint8_t is_save = false; + + if (iNumParams == 1 || iNumParams == 4) { + index_eth_mode = FindCGIParameter("ethmode", pcParam, iNumParams); + if (index_eth_mode != -1) { + eth_mode_t = atoi(pcValue[index_eth_mode]); + if (eth_mode_t == ETHMODE_DHCP || eth_mode_t == ETHMODE_STATIC) { + set_eth_mode(eth_mode_t); + if (iNumParams == 1) { + is_save = true; + } + } + } + + if (iNumParams == 4) { + index_static_ip = FindCGIParameter("staticIp", pcParam, iNumParams); + index_static_netmask = FindCGIParameter("staticNetmask", pcParam, iNumParams); + index_static_gateway = FindCGIParameter("staticGateway", pcParam, iNumParams); + if (index_static_ip != -1 && index_static_netmask != -1 && index_static_gateway != -1) { + if (ipaddr_aton((const char*)pcValue[index_static_ip], &ip_addr_ip) == 1 + && ipaddr_aton((const char*)pcValue[index_static_netmask], &ip_addr_netmask) == 1 + && ipaddr_aton((const char*)pcValue[index_static_gateway], &ip_addr_gateway) == 1) { + set_static_ip((uint8_t*)&ip_addr_ip); + set_static_netmask((uint8_t*)&ip_addr_netmask); + set_static_gateway((uint8_t*)&ip_addr_gateway); + is_save = true; + } + } + } + if (is_save) { + netif_ethernet_config_changed(); + SaveUserConfig(); + } + } + + return "/ethCfg.shtml"; +} + +const char *user_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + int index_userPacketType, index_userPacketRate; + int index_canEcuAddress, index_canBaudrate, index_canPacketType; + int index_canPacketRate, index_canTermresistor, index_canBaudrateDetect; + int index_leverArmBx, index_leverArmBy, index_leverArmBz; + int index_pointOfInterestBx, index_pointOfInterestBy, index_pointOfInterestBz; + int index_rotationRbvx, index_rotationRbvy, index_rotationRbvz; + BOOL result; + + if (iNumParams == 17) + { + index_userPacketType = FindCGIParameter("userPacketType", pcParam, iNumParams); + index_userPacketRate = FindCGIParameter("userPacketRate", pcParam, iNumParams); + index_canEcuAddress = FindCGIParameter("canEcuAddress", pcParam, iNumParams); + index_canBaudrate = FindCGIParameter("canBaudrate", pcParam, iNumParams); + index_canPacketType = FindCGIParameter("canPacketType", pcParam, iNumParams); + index_canPacketRate = FindCGIParameter("canPacketRate", pcParam, iNumParams); + index_canTermresistor = FindCGIParameter("canTermresistor", pcParam, iNumParams); + index_canBaudrateDetect = FindCGIParameter("canBaudrateDetect", pcParam, iNumParams); + index_leverArmBx = FindCGIParameter("leverArmBx", pcParam, iNumParams); + index_leverArmBy = FindCGIParameter("leverArmBy", pcParam, iNumParams); + index_leverArmBz = FindCGIParameter("leverArmBz", pcParam, iNumParams); + index_pointOfInterestBx = FindCGIParameter("pointOfInterestBx", pcParam, iNumParams); + index_pointOfInterestBy = FindCGIParameter("pointOfInterestBy", pcParam, iNumParams); + index_pointOfInterestBz = FindCGIParameter("pointOfInterestBz", pcParam, iNumParams); + index_rotationRbvx = FindCGIParameter("rotationRbvx", pcParam, iNumParams); + index_rotationRbvy = FindCGIParameter("rotationRbvy", pcParam, iNumParams); + index_rotationRbvz = FindCGIParameter("rotationRbvz", pcParam, iNumParams); + + if (index_userPacketType != -1 && index_userPacketRate != -1 + && index_canEcuAddress != -1 && index_canBaudrate != -1 && index_canPacketType != -1 + && index_canPacketRate != -1 && index_canTermresistor != -1 && index_canBaudrateDetect != -1 + && index_leverArmBx != -1 && index_leverArmBy != -1 && index_leverArmBz != -1 + && index_pointOfInterestBx != -1 && index_pointOfInterestBy != -1 && index_pointOfInterestBz != -1 + && index_rotationRbvx != -1 && index_rotationRbvy != -1 && index_rotationRbvz != -1) + { + result = valid_user_config_parameter(USER_USER_PACKET_TYPE, (uint8_t*)pcValue[index_userPacketType]); + if (result){ + set_user_packet_type((uint8_t*)pcValue[index_userPacketType]); + } + + uint16_t userPacketRate = atoi(pcValue[index_userPacketRate]); + result = valid_user_config_parameter(USER_USER_PACKET_RATE, (uint8_t*)&userPacketRate); + if (result){ + set_user_packet_rate(userPacketRate); + } + + set_can_ecu_address(atoi(pcValue[index_canEcuAddress])); + set_can_baudrate(atoi(pcValue[index_canBaudrate])); + set_can_packet_type(atoi(pcValue[index_canPacketType])); + set_can_packet_rate(atoi(pcValue[index_canPacketRate])); + set_can_termresistor(atoi(pcValue[index_canTermresistor])); + set_can_baudrate_detect(atoi(pcValue[index_canBaudrateDetect])); + + set_lever_arm_bx(atof(pcValue[index_leverArmBx])); + set_lever_arm_by(atof(pcValue[index_leverArmBy])); + set_lever_arm_bz(atof(pcValue[index_leverArmBz])); + set_point_of_interest_bx(atof(pcValue[index_pointOfInterestBx])); + set_point_of_interest_by(atof(pcValue[index_pointOfInterestBy])); + set_point_of_interest_bz(atof(pcValue[index_pointOfInterestBz])); + set_rotation_rbvx(atof(pcValue[index_rotationRbvx])); + set_rotation_rbvy(atof(pcValue[index_rotationRbvy])); + set_rotation_rbvz(atof(pcValue[index_rotationRbvz])); + + ins_init(); + + SaveUserConfig(); + } + } + + return "/userCfg.shtml"; +} + +const char *ntrip_client_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + int index_enable, index_ip, index_port, index_mountPoint, index_username, index_password; + + if (iNumParams == 6) + { + index_enable = FindCGIParameter("ncEn", pcParam, iNumParams); + index_ip = FindCGIParameter("cIp", pcParam, iNumParams); + index_port = FindCGIParameter("cPort", pcParam, iNumParams); + index_mountPoint = FindCGIParameter("cMoP", pcParam, iNumParams); + index_username = FindCGIParameter("cUser", pcParam, iNumParams); + index_password = FindCGIParameter("cPwd", pcParam, iNumParams); + + if (index_enable != -1 &&index_ip != -1 && index_port != -1 && index_mountPoint != -1 && index_username != -1 && index_password != -1) + { + set_ntrip_client_ip((const char *)pcValue[index_ip]); + set_ntrip_client_port(atoi(pcValue[index_port])); + set_ntrip_client_mount_point((const char *)pcValue[index_mountPoint]); + set_ntrip_client_username((const char *)pcValue[index_username]); + set_ntrip_client_password((const char *)pcValue[index_password]); + + if (atoi(pcValue[index_enable]) == 1) { + set_station_mode(MODE_NTRIP_CLIENT); + netif_station_tcp_config_changed(); + } + + SaveUserConfig(); + } + } + + workpage_disp = 0; + + return "/workCfg.shtml"; +} + +const char *aceinna_client_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + int index_enable, index_ip, index_port, index_mountPoint, index_username, index_password; + + if (iNumParams == 6) + { + index_enable = FindCGIParameter("acEn", pcParam, iNumParams); + index_ip = FindCGIParameter("aIp", pcParam, iNumParams); + index_port = FindCGIParameter("aPort", pcParam, iNumParams); + index_mountPoint = FindCGIParameter("aMoP", pcParam, iNumParams); + index_username = FindCGIParameter("aUser", pcParam, iNumParams); + index_password = FindCGIParameter("aPwd", pcParam, iNumParams); + + if (index_enable != -1 &&index_ip != -1 && index_port != -1 && index_mountPoint != -1 && index_username != -1 && index_password != -1) + { + set_aceinna_client_ip((const char *)pcValue[index_ip]); + set_aceinna_client_port(atoi(pcValue[index_port])); + set_aceinna_client_mount_point((const char *)pcValue[index_mountPoint]); + set_aceinna_client_username((const char *)pcValue[index_username]); + set_aceinna_client_password((const char *)pcValue[index_password]); + + if (atoi(pcValue[index_enable]) == 1) { + set_station_mode(MODE_ACEINNA_CLIENT); + netif_station_tcp_config_changed(); + } + + SaveUserConfig(); + } + } + + workpage_disp = 1; + + return "/workCfg.shtml"; +} + +const char *ntrip_server_config_cgi_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + int index_enable, index_ip, index_port, index_mountPoint, index_password; + int index_station_id, index_antenna_height; + int index_reference_latitude, index_reference_longitude, index_reference_height, index_base_position_type; + + if (iNumParams == 11) + { + index_enable = FindCGIParameter("nsEn", pcParam, iNumParams); + index_ip = FindCGIParameter("sIp", pcParam, iNumParams); + index_port = FindCGIParameter("sPort", pcParam, iNumParams); + index_mountPoint = FindCGIParameter("sMoP", pcParam, iNumParams); + index_password = FindCGIParameter("sPwd", pcParam, iNumParams); + index_station_id = FindCGIParameter("staID", pcParam, iNumParams); + index_antenna_height = FindCGIParameter("anth", pcParam, iNumParams); + index_reference_latitude = FindCGIParameter("refLat", pcParam, iNumParams); + index_reference_longitude = FindCGIParameter("refLon", pcParam, iNumParams); + index_reference_height = FindCGIParameter("refHei", pcParam, iNumParams); + index_base_position_type = FindCGIParameter("bpt", pcParam, iNumParams); + + if (index_enable != -1 && index_ip != -1 && index_port != -1 && index_mountPoint != -1 + && index_password != -1 && index_station_id != -1 && index_antenna_height != -1 + && index_reference_latitude != -1 && index_reference_longitude != -1 && index_reference_height != -1 + && index_base_position_type != -1) + { + set_ntrip_server_ip(pcValue[index_ip]); + set_ntrip_server_port(atoi(pcValue[index_port])); + set_ntrip_server_mount_point(pcValue[index_mountPoint]); + set_ntrip_server_password(pcValue[index_password]); + + set_station_id(atoi(pcValue[index_station_id])); + set_antenna_height(atof(pcValue[index_antenna_height])); + set_reference_latitude(atof(pcValue[index_reference_latitude])); + set_reference_longitude(atof(pcValue[index_reference_longitude])); + set_reference_height(atof(pcValue[index_reference_height])); + set_base_position_type(atoi(pcValue[index_base_position_type])); + + if (atoi(pcValue[index_enable]) == 1) { + set_station_mode(MODE_NTRIP_SERVER); + netif_station_tcp_config_changed(); + base_station_run_update(); + } + + SaveUserConfig(); + } + } + + workpage_disp = 2; + + return "/workCfg.shtml"; +} + +// JS Handler +#define HTTP_JS_RESPONSE_SIZE 1024 +CCMRAM char http_response[HTTP_JS_RESPONSE_SIZE]; +CCMRAM char http_response_body[HTTP_JS_RESPONSE_SIZE]; +static char gps[80], bds[80], glo[60], gal[60]; +const char *position_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + uint32_t len = 0; + char temp[20] = {0}; + uint8_t vel_mode; + uint8_t stationMode = 0, stationStatus = 0, basePosStatus = 0, baseRun; + double basePosLatitude = 0.0, basePosLongitude = 0.0, basePosHeight = 0.0; + uint8_t i = 0; + uint8_t gps_n = 0, bds_n = 0, glo_n = 0, gal_n = 0; + uint8_t gps_len = 0, bds_len = 0, glo_len = 0, gal_len = 0; + uint32_t js_len = 0; + + memset(http_response, 0, HTTP_JS_RESPONSE_SIZE); + memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); + + stationMode = get_station_mode(); + basePosStatus = get_base_position_type(); + baseRun = base_station_get_run_status(); + + if (basePosStatus == BASE_POSITION_REFERENCE) { + basePosStatus = 0; + } else if (basePosStatus == BASE_POSITION_SPP) { + basePosStatus = 1; + } else if (basePosStatus == BASE_POSITION_RTK) { + basePosStatus = 3; + } else { + basePosStatus = 5; + } + + if (stationMode == MODE_NTRIP_CLIENT) { + if (station_tcp_is_interactive()) { + if (station_tcp_is_stream_timeout()) { + stationStatus = 2; + } else { + stationStatus = 1; + } + } else { + stationStatus = 0; + } + } else if (stationMode == MODE_ACEINNA_CLIENT) { + if (aceinna_client_info.mode == 1) { + if (station_tcp_is_interactive()) { + if (station_tcp_is_stream_timeout()) { + stationStatus = 6; + } else { + stationStatus = 5; + } + } else { + stationStatus = 4; + } + } else { + stationStatus = 3; + } + + } else if (stationMode == MODE_NTRIP_SERVER) { + if (baseRun == 1) { + if (station_tcp_is_interactive()) { + if (station_tcp_is_stream_timeout()) { + stationStatus = 9; + } else { + stationStatus = 8; + } + } else { + stationStatus = 7; + } + + if (basePosStatus == 0) { + basePosLatitude = get_reference_latitude(); + basePosLongitude = get_reference_longitude(); + basePosHeight = get_reference_height(); + } else { + basePosLatitude = get_station_pos_lat() * R2D; + basePosLongitude = get_station_pos_lon() * R2D; + basePosHeight = get_station_pos_height(); + basePosStatus++; + } + } else if (baseRun == 2) { // SPP calcing + stationStatus = 6; + } else if (baseRun == 3) { // rtk calcing + if (station_tcp_is_interactive()) { + if (station_tcp_is_stream_timeout()) { + stationStatus = 2; + } else { + stationStatus = 1; + } + } else { + stationStatus = 0; + } + } + } + + len = string_append(http_response_body, "posCallback({"); + + len += string_append(&http_response_body[len], "\"staM\":"); + tool_itoa(stationMode, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"staS\":"); + tool_itoa(stationStatus, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + if (mGnssInsSystem.mlc_STATUS == 4) { + if (inspvaxstr.pos_type != 1 && inspvaxstr.pos_type != 4 && inspvaxstr.pos_type != 5){ + vel_mode = 2; // INS_FREE + } else { + vel_mode = g_gnss_sol.vel_mode; + } + + len += string_append(&http_response_body[len], ",\"week\":"); + tool_itoa(inspvaxstr.header.gps_week, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"tow\":"); + tool_itod((double) inspvaxstr.header.gps_millisecs/1000, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"rtkm\":"); + tool_itoa(g_gnss_sol.gnss_fix_type, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"lat\":"); + tool_itod(inspvaxstr.latitude, temp, 8); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"lon\":"); + tool_itod(inspvaxstr.longitude, temp, 8); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"alt\":"); + tool_itod(inspvaxstr.height, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"svs\":"); + tool_itoa(g_gnss_sol.num_sats, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"hdop\":"); + tool_itof(g_gnss_sol.dops[2], temp, 1); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"age\":"); + tool_itof(g_gnss_sol.sol_age, temp, 1); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"is\":"); + tool_itoa(inspvaxstr.ins_status, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"ipt\":"); + tool_itoa(inspvaxstr.pos_type, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"vm\":"); + tool_itoa(vel_mode, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"n\":"); + tool_itod(inspvaxstr.north_velocity, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"e\":"); + tool_itod(inspvaxstr.east_velocity, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"u\":"); + tool_itod(inspvaxstr.up_velocity, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"r\":"); + tool_itod(inspvaxstr.roll, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"p\":"); + tool_itod(inspvaxstr.pitch, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"h\":"); + tool_itod(inspvaxstr.azimuth, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], ","); + + } else { + + len += string_append(&http_response_body[len], ",\"week\":"); + tool_itoa(g_gnss_sol.gps_week, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"tow\":"); + tool_itod((double) g_gnss_sol.gps_tow / 1000, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + if (stationMode == MODE_NTRIP_SERVER) { + len += string_append(&http_response_body[len], ",\"rtkm\":"); + tool_itoa(basePosStatus, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"lat\":"); + tool_itod(basePosLatitude, temp, 8); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"lon\":"); + tool_itod(basePosLongitude, temp, 8); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"alt\":"); + tool_itod(basePosHeight, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + } else { + len += string_append(&http_response_body[len], ",\"rtkm\":"); + tool_itoa(g_gnss_sol.gnss_fix_type, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"lat\":"); + tool_itod(g_gnss_sol.latitude * RAD_TO_DEG, temp, 8); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"lon\":"); + tool_itod(g_gnss_sol.longitude * RAD_TO_DEG, temp, 8); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"alt\":"); + tool_itod(g_gnss_sol.height, temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + } + + len += string_append(&http_response_body[len], ",\"svs\":"); + tool_itoa(g_gnss_sol.num_sats, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"hdop\":"); + tool_itof(g_gnss_sol.dops[2], temp, 1); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"age\":"); + tool_itof(g_gnss_sol.sol_age, temp, 1); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"is\":"); + tool_itoa(inspvaxstr.ins_status, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"ipt\":"); + tool_itoa(inspvaxstr.pos_type, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"vm\":"); + tool_itoa(g_gnss_sol.vel_mode, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"n\":"); + tool_itof(g_gnss_sol.vel_ned[0], temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"e\":"); + tool_itof(g_gnss_sol.vel_ned[1], temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"u\":"); + tool_itof(-g_gnss_sol.vel_ned[2], temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"r\":0.000,"); + len += string_append(&http_response_body[len], "\"p\":0.000,"); + len += string_append(&http_response_body[len], "\"h\":0.000,"); + } + + memset(gps, 0, 80); + memset(bds, 0, 80); + memset(glo, 0, 60); + memset(gal, 0, 60); + + for (i = 0; i < g_gnss_sol.rov_n; i++) { + tool_itoa(g_gnss_sol.rov_satellite[i].satelliteId, temp, 10); + switch (g_gnss_sol.rov_satellite[i].systemId) + { + case 0: + gps_n++; + if (gps_n > 1) { + gps_len += string_append(&gps[gps_len], ","); + } + gps_len += string_append(&gps[gps_len], temp); + break; + case 1: + glo_n++; + if (glo_n > 1) { + glo_len += string_append(&glo[glo_len], ","); + } + glo_len += string_append(&glo[glo_len], temp); + break; + case 2: + gal_n++; + if (gal_n > 1) { + gal_len += string_append(&gal[gal_len], ","); + } + gal_len += string_append(&gal[gal_len], temp); + break; + case 4: + bds_n++; + if (bds_n > 1) { + bds_len += string_append(&bds[bds_len], ","); + } + bds_len += string_append(&bds[bds_len], temp); + break; + default: + break; + } + } + + len += string_append(&http_response_body[len], "\"bds\":\"("); + tool_itoa(bds_n, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "):"); + len += string_append(&http_response_body[len], bds); + + len += string_append(&http_response_body[len], "\",\"gps\":\"("); + tool_itoa(gps_n, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "):"); + len += string_append(&http_response_body[len], gps); + + len += string_append(&http_response_body[len], "\",\"gps\":\"("); + tool_itoa(gps_n, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "):"); + len += string_append(&http_response_body[len], gps); + + len += string_append(&http_response_body[len], "\",\"glo\":\"("); + tool_itoa(glo_n, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "):"); + len += string_append(&http_response_body[len], glo); + + len += string_append(&http_response_body[len], "\",\"gal\":\"("); + tool_itoa(gal_n, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "):"); + len += string_append(&http_response_body[len], gal); + + len += string_append(&http_response_body[len], "\"})"); + + js_len = string_append(http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:"); + tool_itoa(len, temp, 10); + js_len += string_append(&http_response[js_len], (const char*)temp); + js_len += string_append(&http_response[js_len], "\r\n\r\n"); + js_len += string_append(&http_response[js_len], http_response_body); + + return http_response; +} + +const char *user_config_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + char userPacketType[3]; + char temp[20] = {0}; + uint32_t len = 0; + uint32_t js_len = 0; + + memset(http_response, 0, HTTP_JS_RESPONSE_SIZE); + memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); + + memcpy(userPacketType, get_user_packet_type(), 2); + userPacketType[2] = 0; + + len = string_append(http_response_body, "userConfigCallback({"); + + len += string_append(&http_response_body[len], "\"userPacketType\":\""); + len += string_append(&http_response_body[len], userPacketType); + + len += string_append(&http_response_body[len], "\",\"userPacketRate\":"); + tool_itoa(get_user_packet_rate(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"canEcuAddress\":"); + tool_itoa(get_can_ecu_address(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"canBaudrate\":"); + tool_itoa(get_can_baudrate(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"canPacketType\":"); + tool_itoa(get_can_packet_type(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"canPacketRate\":"); + tool_itoa(get_can_packet_rate(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"canTermresistor\":"); + tool_itoa(get_can_termresistor(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"canBaudrateDetect\":"); + tool_itoa(get_can_baudrate_detect(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"leverArmBx\":"); + tool_itof(get_lever_arm_bx(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"leverArmBy\":"); + tool_itof(get_lever_arm_by(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"leverArmBz\":"); + tool_itof(get_lever_arm_bz(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"pointOfInterestBx\":"); + tool_itof(get_point_of_interest_bx(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"pointOfInterestBy\":"); + tool_itof(get_point_of_interest_by(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"pointOfInterestBz\":"); + tool_itof(get_point_of_interest_bz(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"rotationRbvx\":"); + tool_itof(get_rotation_rbvx(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"rotationRbvy\":"); + tool_itof(get_rotation_rbvy(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"rotationRbvz\":"); + tool_itof(get_rotation_rbvz(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "})"); + + js_len = string_append(http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:"); + tool_itoa(len, temp, 10); + js_len += string_append(&http_response[js_len], (const char*)temp); + js_len += string_append(&http_response[js_len], "\r\n\r\n"); + js_len += string_append(&http_response[js_len], http_response_body); + + return http_response; +} + +const char *ethnet_config_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + char temp[20] = {0}; + uint32_t len = 0; + uint32_t js_len = 0; + uint8_t *ip = NULL; + + memset(http_response, 0, HTTP_JS_RESPONSE_SIZE); + memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); + + len = string_append(http_response_body, "ethConfigCallback({"); + len += string_append(&http_response_body[len], "\"dhcp\":"); + tool_itoa(get_eth_mode(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"ip\":\""); + ip = get_netif_ip(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\",\"netmask\":\""); + ip = get_netif_netmask(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\",\"gateway\":\""); + ip = get_netif_gateway(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\",\"mac\":\""); + ip = get_static_mac(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[4], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[5], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\",\"sIp\":\""); + ip = get_static_ip(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\",\"sNetmask\":\""); + ip = get_static_netmask(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\",\"sGateway\":\""); + ip = get_static_gateway(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\"})"); + + js_len = string_append(http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:"); + tool_itoa(len, temp, 10); + js_len += string_append(&http_response[js_len], (const char*)temp); + js_len += string_append(&http_response[js_len], "\r\n\r\n"); + js_len += string_append(&http_response[js_len], http_response_body); + + return http_response; +} + +const char *ethnet_summary_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + char temp[20] = {0}; + uint32_t len = 0; + uint32_t js_len = 0; + uint8_t *ip = NULL; + + memset(http_response, 0, HTTP_JS_RESPONSE_SIZE); + memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); + + len = string_append(http_response_body, "ethSummaryCallback({"); + len += string_append(&http_response_body[len], "\"dhcp\":"); + tool_itoa(get_eth_mode(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"ip\":\""); + ip = get_netif_ip(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\",\"netmask\":\""); + ip = get_netif_netmask(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\",\"gateway\":\""); + ip = get_netif_gateway(); + tool_itoa(ip[0], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[1], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[2], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + len += string_append(&http_response_body[len], "."); + tool_itoa(ip[3], temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "\"})"); + + js_len = string_append(http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:"); + tool_itoa(len, temp, 10); + js_len += string_append(&http_response[js_len], (const char*)temp); + js_len += string_append(&http_response[js_len], "\r\n\r\n"); + js_len += string_append(&http_response[js_len], http_response_body); + + return http_response; +} + +const char *work_config_js_handler(int index, int iNumParams, char *pcParam[], char *pcValue[]) +{ + char temp[20] = {0}; + uint32_t len = 0; + uint32_t js_len = 0; + + memset(http_response, 0, HTTP_JS_RESPONSE_SIZE); + memset(http_response_body, 0, HTTP_JS_RESPONSE_SIZE); + + len = string_append(http_response_body, "workConfigCallback({"); + len += string_append(&http_response_body[len], "\"disp\":"); + tool_itoa(workpage_disp, temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"cIp\":\""); + len += string_append(&http_response_body[len], get_ntrip_client_ip()); + + len += string_append(&http_response_body[len], "\",\"cPort\":"); + tool_itoa(get_ntrip_client_port(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"cMoP\":\""); + len += string_append(&http_response_body[len], get_ntrip_client_mount_point()); + + len += string_append(&http_response_body[len], "\",\"cUser\":\""); + len += string_append(&http_response_body[len], get_ntrip_client_username()); + + len += string_append(&http_response_body[len], "\",\"cPwd\":\""); + len += string_append(&http_response_body[len], get_ntrip_client_password()); + + len += string_append(&http_response_body[len], "\",\"aIp\":\""); + len += string_append(&http_response_body[len], get_aceinna_client_ip()); + + len += string_append(&http_response_body[len], "\",\"aPort\":"); + tool_itoa(get_aceinna_client_port(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"aMoP\":\""); + len += string_append(&http_response_body[len], get_aceinna_client_mount_point()); + + len += string_append(&http_response_body[len], "\",\"aUser\":\""); + len += string_append(&http_response_body[len], get_aceinna_client_username()); + + len += string_append(&http_response_body[len], "\",\"aPwd\":\""); + len += string_append(&http_response_body[len], get_aceinna_client_password()); + + len += string_append(&http_response_body[len], "\",\"sIp\":\""); + len += string_append(&http_response_body[len], get_ntrip_server_ip()); + + len += string_append(&http_response_body[len], "\",\"sPort\":"); + tool_itoa(get_ntrip_server_port(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"sMoP\":\""); + len += string_append(&http_response_body[len], get_ntrip_server_mount_point()); + + len += string_append(&http_response_body[len], "\",\"sPwd\":\""); + len += string_append(&http_response_body[len], get_ntrip_server_password()); + + len += string_append(&http_response_body[len], "\",\"bpt\":"); + tool_itoa(get_base_position_type(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"staID\":"); + tool_itoa(get_station_id(), temp, 10); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"anth\":"); + tool_itod(get_antenna_height(), temp, 4); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"refLat\":"); + tool_itod(get_reference_latitude(), temp, 8); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"refLon\":"); + tool_itod(get_reference_longitude(), temp, 8); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], ",\"refHei\":"); + tool_itod(get_reference_height(), temp, 3); + len += string_append(&http_response_body[len], (const char*)temp); + + len += string_append(&http_response_body[len], "})"); + + js_len = string_append(http_response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:"); + tool_itoa(len, temp, 10); + js_len += string_append(&http_response[js_len], (const char*)temp); + js_len += string_append(&http_response[js_len], "\r\n\r\n"); + js_len += string_append(&http_response[js_len], http_response_body); + + return http_response; +} + +void httpd_ssi_init(void) +{ + http_set_ssi_handler(ssi_handler, ssiTAGs, NUM_CONFIG_SSI_TAGS); +} + +void httpd_cgi_init(void) +{ + http_set_cgi_handlers(cgiURIs, NUM_CONFIG_CGI_URIS); +} + +void httpd_js_init(void) +{ + http_set_js_handlers(jsURIs, NUM_CONFIG_JS_URIS); +} + + +#endif diff --git a/Platform/BT/include/bt_packet.h b/Platform/BT/include/bt_packet.h new file mode 100644 index 0000000..6af0895 --- /dev/null +++ b/Platform/BT/include/bt_packet.h @@ -0,0 +1,62 @@ +#if 0 +#ifndef _BT_PACKET_H_ +#define _BT_PACKET_H_ + +#include + +#define BT_CMD_NUM 2 +#define CMD_MAX_LEN 20 + + +enum BT_CMD_TYPE +{ + RTK_MES_CMD = 0, + RTK_SN_CMD, + BT_CMD_MAX +}; + +int bt_uart_parse(uint8_t* bt_buff); + +#endif +#else +/******************************************************************************* +* File Name : bt_packet.h +* Author : daich +* Revision : 1.0 +* Date : +* Description : bt_packet.h +* +* HISTORY*********************************************************************** +* 24/04/2020 | | Daich +* Description: created +*******************************************************************************/ + +#ifndef _BT_INTERFACE_H_ +#define _BT_INTERFACE_H_ +#include "stdint.h" +#include "constants.h" +#include "stdio.h" + + +#define BT_CMD_NUM 2 +#define CMD_MAX_LEN 20 +enum BT_CMD_TYPE +{ + RTK_MES_CMD = 0, + RTK_SN_CMD, + BT_CMD_MAX +}; + +#define SHELL_ENABLE false +#define SHELL_TASK false +#define SHELL_RX_MAX (256+32) +#define SHELL_TX_MAX (512) + +bool is_cmd_right(void * buffer,void * cmd); +void shell_service(void); +void debug_uart_handle(void); +void ConsoleTask(void const *argument); +void parse_debug_cmd(); +int bt_uart_parse(uint8_t* bt_buff); +#endif +#endif \ No newline at end of file diff --git a/Platform/BT/include/json_parse.h b/Platform/BT/include/json_parse.h new file mode 100644 index 0000000..c25eee0 --- /dev/null +++ b/Platform/BT/include/json_parse.h @@ -0,0 +1,27 @@ +/******************************************************************************* +* File Name : json_parse.h +* Author : Daich +* Revision : 1.0 +* Date : 29/09/2019 +* Description : json_parse.h +* +* HISTORY*********************************************************************** +* 29/09/2019 | | Daich +* 06/01/2020 | | Daich +* Description: add send_rtk_json_message function to send openrtk board message +*******************************************************************************/ +#ifndef _JSON_PARSE_H_ +#define _JSON_PARSE_H_ +#include "cJSON.h" + +#define json_true 1 +#define json_false -1 + +int json_create(); +int change_item(char *text,char* json_to_write,char* key,char* value); +void create_json_object(cJSON** json); +void send_rtk_json_message(cJSON* root); +char* get_rtk_json_item_value(cJSON *json,char* key); +void send_rtk_json_to_esp32(); +#endif + diff --git a/Platform/BT/src/bt_packet.c b/Platform/BT/src/bt_packet.c new file mode 100644 index 0000000..d85a786 --- /dev/null +++ b/Platform/BT/src/bt_packet.c @@ -0,0 +1,195 @@ +#include "bt_packet.h" +#include +#include +#include "app_version.h" +#include "calibrationAPI.h" +#include "platformAPI.h" +#include "user_config.h" +#include "uart.h" +#include "cJSON.h" + +char esp_bt_cmd[BT_CMD_MAX][CMD_MAX_LEN] = +{ + "get rtk message", + "get rtk sn" +}; + +static char get_strtrim(char *pstr,char *dest,uint32_t len) +{ + char cmp[len + 1]; + int j = 0; + for(int i = 0;i < len;i++) + { + if((*(pstr + i) != ' ') && (*(pstr + i) != '\r') && (*(pstr + i) != '\n')) + { + cmp[j++] = *(pstr + i); + } + } + cmp[j] = '\0'; + strcpy((char *)dest,(const char *)cmp); + int len_now = strlen((const char*)dest); + int count = len - len_now; + return count; +} + +static int get_bt_cmd_index(void* cmd) +{ + static int is_get_rtk_mes_rev_flag = 0; + char cmd_trim[strlen(cmd) + 1]; + char bt_cmd_trim[CMD_MAX_LEN] = {0}; + get_strtrim(cmd,cmd_trim,strlen(cmd)); + for(int i = 0;i < BT_CMD_NUM;i++) + { + get_strtrim(esp_bt_cmd[i],bt_cmd_trim,strlen(esp_bt_cmd[i])); + //if(strcmp(bt_cmd_trim,cmd_trim) == 0) + if(((is_get_rtk_mes_rev_flag == 0)&&(strstr(cmd_trim,bt_cmd_trim) != NULL)) \ + || ((is_get_rtk_mes_rev_flag == 1)&&(strcmp(cmd_trim,bt_cmd_trim) == 0))) + { + if((i == RTK_MES_CMD)&&(is_get_rtk_mes_rev_flag == 0)) + { + is_get_rtk_mes_rev_flag = 1; + } + return i; + } + memset(bt_cmd_trim,0,sizeof(bt_cmd_trim)); + } + return -1; +} + +static void send_rtk_json_to_esp32(void) +{ + cJSON *root, *fmt; + char *out; + char compile_time[50] = __DATE__; + + root = cJSON_CreateObject(); + cJSON_AddItemToObject(root, "openrtk config", fmt = cJSON_CreateObject()); + cJSON_AddItemToObject(fmt, "Product Name", cJSON_CreateString(PRODUCT_NAME_STRING)); + cJSON_AddItemToObject(fmt, "Product PN", cJSON_CreateString((const char *)platformBuildInfo())); + cJSON_AddItemToObject(fmt, "Product SN", cJSON_CreateNumber(GetUnitSerialNum())); + cJSON_AddItemToObject(fmt, "Version", cJSON_CreateString(APP_VERSION_STRING)); + cJSON_AddItemToObject(fmt, "Compile Time", cJSON_CreateString(compile_time)); + + uint8_t *user_packet_type = get_user_packet_type(); + char packet_type_str[5] = {0}; + packet_type_str[0] = user_packet_type[0]; + packet_type_str[1] = user_packet_type[1]; + + uint16_t user_packet_rate = get_user_packet_rate(); + + cJSON_AddItemToObject(fmt, "userPacketType", cJSON_CreateString(packet_type_str)); + cJSON_AddItemToObject(fmt, "userPacketRate", cJSON_CreateNumber(user_packet_rate)); + + float *ins_para = get_user_ins_para(); + cJSON_AddItemToObject(fmt, "leverArmBx", cJSON_CreateNumber(*ins_para)); + cJSON_AddItemToObject(fmt, "leverArmBy", cJSON_CreateNumber(*(ins_para + 1))); + cJSON_AddItemToObject(fmt, "leverArmBz", cJSON_CreateNumber(*(ins_para + 2))); + cJSON_AddItemToObject(fmt, "pointOfInterestBx", cJSON_CreateNumber(*(ins_para + 3))); + cJSON_AddItemToObject(fmt, "pointOfInterestBy", cJSON_CreateNumber(*(ins_para + 4))); + cJSON_AddItemToObject(fmt, "pointOfInterestBz", cJSON_CreateNumber(*(ins_para + 5))); + cJSON_AddItemToObject(fmt, "rotationRbvx", cJSON_CreateNumber(*(ins_para + 6))); + cJSON_AddItemToObject(fmt, "rotationRbvy", cJSON_CreateNumber(*(ins_para + 7))); + cJSON_AddItemToObject(fmt, "rotationRbvz", cJSON_CreateNumber(*(ins_para + 8))); + + out = cJSON_Print(root); + cJSON_Delete(root); + + uart_write_bytes(UART_BT,out,strlen(out),1); + OS_Delay(10); + uart_write_bytes(UART_BT, out, strlen(out), 1); + free(out); +} + +static void bt_app_json_parse(cJSON* root) +{ + BOOL result; + cJSON *packetCode, *packetRate; + cJSON *leverArmBx, *leverArmBy, *leverArmBz; + cJSON *pointOfInterestBx, *pointOfInterestBy, *pointOfInterestBz; + cJSON *rotationRbvx, *rotationRbvy, *rotationRbvz; + + packetCode = cJSON_GetObjectItem(root,"userPacketType"); + packetRate = cJSON_GetObjectItem(root,"userPacketRate"); + leverArmBx = cJSON_GetObjectItem(root, "leverArmBx"); + leverArmBy = cJSON_GetObjectItem(root, "leverArmBy"); + leverArmBz = cJSON_GetObjectItem(root, "leverArmBz"); + pointOfInterestBx = cJSON_GetObjectItem(root, "pointOfInterestBx"); + pointOfInterestBy = cJSON_GetObjectItem(root, "pointOfInterestBy"); + pointOfInterestBz = cJSON_GetObjectItem(root, "pointOfInterestBz"); + rotationRbvx = cJSON_GetObjectItem(root, "rotationRbvx"); + rotationRbvy = cJSON_GetObjectItem(root, "rotationRbvy"); + rotationRbvz = cJSON_GetObjectItem(root, "rotationRbvz"); + + if (packetCode != NULL && packetRate != NULL + && leverArmBx != NULL && leverArmBy != NULL && leverArmBz != NULL + && pointOfInterestBx != NULL && pointOfInterestBy != NULL && pointOfInterestBz != NULL + && rotationRbvx != NULL && rotationRbvy != NULL && rotationRbvz != NULL){ + + result = valid_user_config_parameter(USER_USER_PACKET_TYPE, (uint8_t*)packetCode->valuestring); + if (result){ + set_user_packet_type((uint8_t*)packetCode->valuestring); + } + result = valid_user_config_parameter(USER_USER_PACKET_RATE, (uint8_t*)&packetRate->valueint); + if (result){ + set_user_packet_rate(packetRate->valueint); + } + + set_lever_arm_bx(leverArmBx->valuedouble); + set_lever_arm_by(leverArmBy->valuedouble); + set_lever_arm_bz(leverArmBz->valuedouble); + set_point_of_interest_bx(pointOfInterestBx->valuedouble); + set_point_of_interest_by(pointOfInterestBy->valuedouble); + set_point_of_interest_bz(pointOfInterestBz->valuedouble); + set_rotation_rbvx(rotationRbvx->valuedouble); + set_rotation_rbvy(rotationRbvy->valuedouble); + set_rotation_rbvz(rotationRbvz->valuedouble); + + ins_init(); + + SaveUserConfig(); + uart_write_bytes(UART_BT,"##para received!##",strlen("##para received!##"),1); + send_rtk_json_to_esp32(); + } +} + +int bt_uart_parse(uint8_t* bt_buff) //TODO: +{ + static int is_first_rev_bt_mes = 0; + if (bt_buff != NULL) + { + if(is_first_rev_bt_mes == 0) + { + uart_write_bytes(UART_BT,"openrtk start run\r\n",strlen("openrtk start run\r\n"),1); + is_first_rev_bt_mes = 1; + return BT_CMD; + } + cJSON *root; + root = cJSON_Parse((const char *)bt_buff); + if (root != NULL) + { + bt_app_json_parse(root); + cJSON_Delete(root); + return RTK_JSON; + } + else + { + int cmd_type = get_bt_cmd_index(bt_buff); + if(cmd_type == -1) + { + return BT_BASE; + } + switch(cmd_type) + { + case RTK_SN_CMD: + break; + case RTK_MES_CMD: + send_rtk_json_to_esp32(); + break; + default: + break; + } + return BT_CMD; + } + } + return BT_BASE; +} diff --git a/Platform/BT/src/json_parse.c b/Platform/BT/src/json_parse.c new file mode 100644 index 0000000..4a1e3e2 --- /dev/null +++ b/Platform/BT/src/json_parse.c @@ -0,0 +1,194 @@ +/******************************************************************************* +* File Name : json_parse.c +* Author : Daich +* Revision : 1.0 +* Date : 29/09/2019 +* Description : json_parse.c +* +* HISTORY*********************************************************************** +* 29/09/2019 | | Daich +* Description: add send_rtk_json_message +*******************************************************************************/ + +#include +#include +#include +#include "cJSON.h" +#include "json_parse.h" +// #include "log.h" +#include "app_version.h" +#include "configuration.h" +#include "ucb_packet.h" +#include "uart.h" +#include "platformAPI.h" +#ifndef SENSOR_UNUSED + #include "calibrationAPI.h" +#endif +#ifndef BAREMETAL_OS + #include "user_config.h" +#endif +int change_item(char *text,char* json_to_write,char* key,char* value) +{ + char *out; + cJSON *root; + root = cJSON_Parse(text); + if (!root) + { +#ifdef DEVICE_DEBUG + printf("not json format\r\n"); +#endif + return json_false; + } + else + { + cJSON* item_replace = cJSON_GetObjectItem(root,"openrtk config"); + cJSON_ReplaceItemInObject(item_replace,key,cJSON_CreateString(value)); +#if 0 + item = cJSON_GetObjectItem(root,"rtk config"); + memcpy(cJSON_GetObjectItem(item,key)->valuestring,value,strlen(value)); // how to modify value safety? +#endif + out = cJSON_Print(root); + { + memcpy(json_to_write,out,strlen(out) + 1); + } + cJSON_Delete(root); + free(out); + return json_true; + } +} + + +void create_json_object(cJSON** json) +{ + *json = cJSON_CreateObject(); +} + + +char* get_rtk_json_item_value(cJSON *json,char* key) //TODO: +{ + //int json_array_size = cJSON_GetArraySize(); +#if 1 + if(json == NULL) + { + return NULL; + } + int json_item_count = cJSON_GetArraySize(json); + for(int i=0; i < json_item_count; i++) + { + cJSON * item = cJSON_GetArrayItem(json, i); + if(item->type == cJSON_Object) + { + cJSON* item_sub = cJSON_GetObjectItem(item,key); + if(item_sub != NULL) + { + return item_sub->valuestring; + } +#if 0 + for(int j=0;j < cJSON_GetArraySize(item); j++) + { + if + } +#endif + } + } +#endif + return NULL; +} + +void send_rtk_json_message(cJSON* root) +{ + cJSON *fmt; + char *out; + //root=cJSON_CreateObject(); + if(root != NULL) + { +#ifdef DEVICE_DEBUG + printf("root = %p\n",root); +#endif + char compile_time[50] = __DATE__; + //root = cJSON_CreateObject(); + cJSON_AddItemToObject(root, "openrtk config", fmt=cJSON_CreateObject()); + cJSON_AddItemToObject(fmt, "Product Name", cJSON_CreateString(PRODUCT_NAME_STRING)); + cJSON_AddItemToObject(fmt, "Product PN", cJSON_CreateString((const char *)platformBuildInfo())); + cJSON_AddItemToObject(fmt, "Product SN", cJSON_CreateNumber(GetUnitSerialNum())); + cJSON_AddItemToObject(fmt, "Version", cJSON_CreateString(APP_VERSION_STRING)); + cJSON_AddItemToObject(fmt, "Compile Time", cJSON_CreateString(compile_time)); + + uint8_t* user_packet_type = get_user_packet_type(); + char packet_type_str[5] = {0}; + packet_type_str[0] = user_packet_type[0]; + packet_type_str[1] = user_packet_type[1]; + + uint16_t user_packet_rate = get_user_packet_rate(); + + cJSON_AddItemToObject(fmt, "userPacketType", cJSON_CreateString(packet_type_str)); + cJSON_AddItemToObject(fmt, "userPacketRate", cJSON_CreateNumber(user_packet_rate)); + +#ifndef BAREMETAL_OS + float* ins_para = get_user_ins_para(); + cJSON_AddItemToObject(fmt, "leverArmBx", cJSON_CreateNumber(*ins_para)); + cJSON_AddItemToObject(fmt, "leverArmBy", cJSON_CreateNumber(*(ins_para+1))); + cJSON_AddItemToObject(fmt, "leverArmBz", cJSON_CreateNumber(*(ins_para+2))); + cJSON_AddItemToObject(fmt, "pointOfInterestBx", cJSON_CreateNumber(*(ins_para+3))); + cJSON_AddItemToObject(fmt, "pointOfInterestBy", cJSON_CreateNumber(*(ins_para+4))); + cJSON_AddItemToObject(fmt, "pointOfInterestBz", cJSON_CreateNumber(*(ins_para+5))); + cJSON_AddItemToObject(fmt, "rotationRbvx", cJSON_CreateNumber(*(ins_para+6))); + cJSON_AddItemToObject(fmt, "rotationRbvy", cJSON_CreateNumber(*(ins_para+7))); + cJSON_AddItemToObject(fmt, "rotationRbvz", cJSON_CreateNumber(*(ins_para+8))); +#endif + out=cJSON_Print(root); + //cJSON_Delete(root); //not delete other code use +#ifdef DEVICE_DEBUG + printf("%s\n",out); +#endif + + uart_write_bytes(UART_BT,out,strlen(out),1); + OS_Delay(10); + uart_write_bytes(UART_BT,out,strlen(out),1); + free(out); + } +} +void send_rtk_json_to_esp32() +{ + cJSON *root,*fmt; + char *out; + root=cJSON_CreateObject(); + char compile_time[50] = __DATE__; + root = cJSON_CreateObject(); + cJSON_AddItemToObject(root, "openrtk config", fmt=cJSON_CreateObject()); + cJSON_AddItemToObject(fmt, "Product Name", cJSON_CreateString(PRODUCT_NAME_STRING)); + cJSON_AddItemToObject(fmt, "Product PN", cJSON_CreateString((const char *)platformBuildInfo())); + cJSON_AddItemToObject(fmt, "Product SN", cJSON_CreateNumber(GetUnitSerialNum())); + cJSON_AddItemToObject(fmt, "Version", cJSON_CreateString(APP_VERSION_STRING)); + cJSON_AddItemToObject(fmt, "Compile Time", cJSON_CreateString(compile_time)); + + uint8_t* user_packet_type = get_user_packet_type(); + char packet_type_str[5] = {0}; + packet_type_str[0] = user_packet_type[0]; + packet_type_str[1] = user_packet_type[1]; + + uint16_t user_packet_rate = get_user_packet_rate(); + + cJSON_AddItemToObject(fmt, "userPacketType", cJSON_CreateString(packet_type_str)); + cJSON_AddItemToObject(fmt, "userPacketRate", cJSON_CreateNumber(user_packet_rate)); + +#ifndef BAREMETAL_OS + float* ins_para = get_user_ins_para(); + cJSON_AddItemToObject(fmt, "leverArmBx", cJSON_CreateNumber(*ins_para)); + cJSON_AddItemToObject(fmt, "leverArmBy", cJSON_CreateNumber(*(ins_para+1))); + cJSON_AddItemToObject(fmt, "leverArmBz", cJSON_CreateNumber(*(ins_para+2))); + cJSON_AddItemToObject(fmt, "pointOfInterestBx", cJSON_CreateNumber(*(ins_para+3))); + cJSON_AddItemToObject(fmt, "pointOfInterestBy", cJSON_CreateNumber(*(ins_para+4))); + cJSON_AddItemToObject(fmt, "pointOfInterestBz", cJSON_CreateNumber(*(ins_para+5))); + cJSON_AddItemToObject(fmt, "rotationRbvx", cJSON_CreateNumber(*(ins_para+6))); + cJSON_AddItemToObject(fmt, "rotationRbvy", cJSON_CreateNumber(*(ins_para+7))); + cJSON_AddItemToObject(fmt, "rotationRbvz", cJSON_CreateNumber(*(ins_para+8))); +#endif + out=cJSON_Print(root); + cJSON_Delete(root); +#ifdef DEVICE_DEBUG + printf("%s\n",out); +#endif + uart_write_bytes(UART_BT,out,strlen(out),1); + free(out); +} diff --git a/Platform/Board/include/boardDefinition.h b/Platform/Board/include/boardDefinition.h index 9820ba3..2d58990 100644 --- a/Platform/Board/include/boardDefinition.h +++ b/Platform/Board/include/boardDefinition.h @@ -360,8 +360,10 @@ limitations under the License. #define USER_SPI_NSS_PIN GPIO_PIN_6 #define USER_SPI_NSS_PORT GPIOF #define USER_SPI_NSS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOF_CLK_ENABLE() + + #define USER_SPI_NSS_RX_IRQn EXTI9_5_IRQn -#define USER_SPI_NSS_RX_IRQ EXTI9_5_IRQHandler +// #define USER_SPI_NSS_RX_IRQ EXTI9_5_IRQHandler /// DRDY #define USER_SPI_DRDY_PIN GPIO_PIN_12 @@ -386,33 +388,41 @@ limitations under the License. * PC9 CAN_AB * PC8 CAN_120R_CTL */ -#define CAR_CAN CAN1 -#define CAR_CAN_CLK_ENABLE() __HAL_RCC_CAN1_CLK_ENABLE() +#define USER_CAN CAN1 +#define USER_CAN_CLK_ENABLE() __HAL_RCC_CAN1_CLK_ENABLE() /// CAN_TX -#define CAR_CAN_TX_PIN GPIO_PIN_12 -#define CAR_CAN_TX_PORT GPIOA -#define CAR_CAN_TX_AF GPIO_AF9_CAN1 -#define CAR_CAN_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define USER_CAN_TX_PIN GPIO_PIN_12 +#define USER_CAN_TX_PORT GPIOA +#define USER_CAN_TX_AF GPIO_AF9_CAN1 +#define USER_CAN_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() /// CAN_RX -#define CAR_CAN_RX_PIN GPIO_PIN_11 -#define CAR_CAN_RX_PORT GPIOA -#define CAR_CAN_RX_AF GPIO_AF9_CAN1 -#define CAR_CAN_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define USER_CAN_RX_PIN GPIO_PIN_11 +#define USER_CAN_RX_PORT GPIOA +#define USER_CAN_RX_AF GPIO_AF9_CAN1 +#define USER_CAN_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() /// CAN_AB -#define CAR_CAN_AB_PIN GPIO_PIN_9 -#define CAR_CAN_AB_PORT GPIOC -#define CAR_CAN_AB_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() +#define USER_CAN_AB_PIN GPIO_PIN_9 +#define USER_CAN_AB_PORT GPIOC +#define USER_CAN_AB_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() /// CAN_120R_CTL -#define CAR_CAN_120R_CTL_PIN GPIO_PIN_8 -#define CAR_CAN_120R_CTL_PORT GPIOC -#define CAR_CAN_120R_CTL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() +#define USER_CAN_120R_CTL_PIN GPIO_PIN_8 +#define USER_CAN_120R_CTL_PORT GPIOC +#define USER_CAN_120R_CTL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() + +#define USER_CAN_PORT_RCC_CLK_ENABLE() {__HAL_RCC_GPIOA_CLK_ENABLE(); \ + __HAL_RCC_GPIOC_CLK_ENABLE();} -#define CAR_CAN_RX_IRQn CAN1_RX0_IRQn -#define CAR_CAN_RX_IRQ CAN1_RX0_IRQHandler +#define USER_CAN_FORCE_RESET() __HAL_RCC_CAN1_FORCE_RESET() +#define USER_CAN_RELEASE_RESET() __HAL_RCC_CAN1_RELEASE_RESET() + +#define USER_CAN_RX_IRQn CAN1_RX0_IRQn +#define USER_CAN_RX_IRQHandler CAN1_RX0_IRQHandler +#define USER_CAN_TX_IRQn CAN1_TX_IRQn +#define USER_CAN_TX_IRQHandler CAN1_TX_IRQHandler //================== Sensors @@ -451,4 +461,17 @@ limitations under the License. #define LNA_EN_PORT GPIOA #define LNA_EN_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() + + +#define PLUSE_PIN GPIO_PIN_7 +#define PLUSE_PORT GPIOE +#define FWD_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE() +#define FWD_PIN GPIO_PIN_8 +#define FWD_PORT GPIOE +#define PLUSE_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE() + +#define PLUSE_IRQn EXTI9_5_IRQn +#define SPI_PLUSE_IRQ EXTI9_5_IRQHandler + + #endif diff --git a/Platform/Board/include/bsp.h b/Platform/Board/include/bsp.h index efb8151..182206b 100644 --- a/Platform/Board/include/bsp.h +++ b/Platform/Board/include/bsp.h @@ -34,7 +34,7 @@ limitations under the License. #define SPI_NSS_PIN_OFFSET 0x05 #define SPI_NSS_MASK (SPI_CHIPS_DEFAULT << SPI_NSS_PIN_OFFSET) //0x000000E0 - +extern ADC_HandleTypeDef hadc1; // need to modify void MX_DMA_Init(void); #if 0 @@ -92,7 +92,8 @@ void DelayMs(uint32_t msec); void BSP_Spi_Pins_For_Test(void); void DRDY_Toggle(void); void NSS_Toggle(void); - +void DRDY_ON(void); +void DRDY_OFF(void); #define SPI_MOSI_ON (HAL_GPIO_WritePin(SPI_MOSI_PORT, SPI_MOSI_PIN, GPIO_PIN_SET)) #define SPI_MOSI_OFF (HAL_GPIO_WritePin(SPI_MOSI_PORT, SPI_MOSI_PIN, GPIO_PIN_RESET)) @@ -105,9 +106,8 @@ void NSS_Toggle(void); #define SPI(x,y) ((y) ? (x ##_ON): (x ##_OFF)) -void HW_JumpToApp(void); void esp32_reset(); - +void pluse_detect_init(void); #endif /* CONF_GPIO_H */ diff --git a/Platform/Board/include/stm32f4xx_hal_conf.h b/Platform/Board/include/stm32f4xx_hal_conf.h index 158ed74..c2de1c3 100644 --- a/Platform/Board/include/stm32f4xx_hal_conf.h +++ b/Platform/Board/include/stm32f4xx_hal_conf.h @@ -50,9 +50,9 @@ */ #define HAL_MODULE_ENABLED -/* #define HAL_ADC_MODULE_ENABLED */ +#define HAL_ADC_MODULE_ENABLED /* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_CAN_MODULE_ENABLED */ +#define HAL_CAN_MODULE_ENABLED /* #define HAL_CRC_MODULE_ENABLED */ /* #define HAL_CRYP_MODULE_ENABLED */ /* #define HAL_DAC_MODULE_ENABLED */ @@ -69,12 +69,12 @@ /* #define HAL_I2S_MODULE_ENABLED */ /* #define HAL_IWDG_MODULE_ENABLED */ /* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_RNG_MODULE_ENABLED */ +#define HAL_RNG_MODULE_ENABLED /* #define HAL_RTC_MODULE_ENABLED */ /* #define HAL_SAI_MODULE_ENABLED */ /* #define HAL_SD_MODULE_ENABLED */ /* #define HAL_MMC_MODULE_ENABLED */ -/* #define HAL_SPI_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED /* #define HAL_USART_MODULE_ENABLED */ diff --git a/Platform/Board/src/bsp.c b/Platform/Board/src/bsp.c index da3580d..14f986e 100644 --- a/Platform/Board/src/bsp.c +++ b/Platform/Board/src/bsp.c @@ -24,6 +24,9 @@ #include "led.h" #include "rtcm.h" #include "exit.h" +#include "rng.h" + +ADC_HandleTypeDef hadc1; UART_HandleTypeDef huart_debug; UART_HandleTypeDef huart_user; @@ -144,9 +147,65 @@ void MX_DMA_Init(void) HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); + + //spi5 dma + /* DMA2_Stream3_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); + /* DMA2_Stream4_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA2_Stream4_IRQn, 3, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream4_IRQn); } +/** + * @brief ADC1 Initialization Function + * @param None + * @retval None + */ +static void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.ScanConvMode = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. + */ + sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; + sConfig.Rank = 1; + sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ +} /** **************************************************************************** * @name BSP_DEBUG_GPIOS_Gpio_Init @@ -427,7 +486,7 @@ void BSP_GPIO_Init(void) BSP_ESP32_Interface_Gpio_Init(); BSP_SENSOR_Interface_Gpio_Init(); BSP_Spi_Pins_For_Test(); - + MX_ADC1_Init(); } @@ -450,6 +509,9 @@ void BoardInit(void) /* Init gpio pins */ BSP_GPIO_Init(); + + /* RNG */ + RNG_Init(); } @@ -618,7 +680,7 @@ void ResetForEnterBootMode(void) ResetSTIForNormalMode(); - HAL_GPIO_WritePin(GPIOC,ST_PROG_BUF_CTL_PIN,GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOC,ST_PROG_BUF_CTL_PIN,GPIO_PIN_RESET); } @@ -655,12 +717,6 @@ void HW_BootJump(uint32_t addr) asm("LDR PC, [R0, #4]"); } -void HW_JumpToApp(void) -{ - HW_BootJump(APP_START_ADDR); -} - - void delay_ms(uint32_t time) { uint32_t i=0; @@ -770,3 +826,24 @@ void SCK_OFF(void) { HAL_GPIO_WritePin(USER_SPI_SCK_PORT, USER_SPI_SCK_PIN, GPIO_PIN_RESET); } + + +void pluse_detect_init(void) +{ + PLUSE_GPIO_CLK_ENABLE(); + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Pin = PLUSE_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(PLUSE_PORT, &GPIO_InitStruct); + + FWD_GPIO_CLK_ENABLE(); + GPIO_InitStruct.Pin = FWD_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; //GPIO_PULLUP + HAL_GPIO_Init(FWD_PORT, &GPIO_InitStruct); + + /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(PLUSE_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(PLUSE_IRQn); +} diff --git a/Platform/Board/src/stm32f4xx_hal_msp.c b/Platform/Board/src/stm32f4xx_hal_msp.c index a98169d..53a6ada 100644 --- a/Platform/Board/src/stm32f4xx_hal_msp.c +++ b/Platform/Board/src/stm32f4xx_hal_msp.c @@ -518,6 +518,119 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) } +void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + if (hcan->Instance == CAN1) + { + USER_CAN_CLK_ENABLE(); + USER_CAN_PORT_RCC_CLK_ENABLE(); + + GPIO_InitTypeDef GPIO_Initure; + GPIO_Initure.Pin = USER_CAN_AB_PIN; + GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_Initure.Pull = GPIO_PULLUP; + GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(USER_CAN_AB_PORT, &GPIO_Initure); + + GPIO_Initure.Pin = USER_CAN_120R_CTL_PIN; + HAL_GPIO_Init(USER_CAN_120R_CTL_PORT, &GPIO_Initure); + + HAL_GPIO_WritePin(USER_CAN_120R_CTL_PORT, USER_CAN_120R_CTL_PIN, GPIO_PIN_SET); + HAL_GPIO_WritePin(USER_CAN_AB_PORT, USER_CAN_AB_PIN, GPIO_PIN_RESET); + + GPIO_InitStruct.Pin = USER_CAN_TX_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Alternate = USER_CAN_TX_AF; + HAL_GPIO_Init(USER_CAN_TX_PORT, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = USER_CAN_RX_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Alternate = USER_CAN_RX_AF; + HAL_GPIO_Init(USER_CAN_RX_PORT, &GPIO_InitStruct); + + HAL_NVIC_SetPriority(USER_CAN_RX_IRQn, 1, 0); + HAL_NVIC_EnableIRQ(USER_CAN_RX_IRQn); + + HAL_NVIC_SetPriority(USER_CAN_TX_IRQn, 1, 0); + HAL_NVIC_EnableIRQ(USER_CAN_TX_IRQn); + } +} + +void HAL_CAN_MspDeInit(CAN_HandleTypeDef *hcan) +{ + if (hcan->Instance == CAN1) + { + USER_CAN_FORCE_RESET(); + USER_CAN_RELEASE_RESET(); + + HAL_GPIO_DeInit(USER_CAN_AB_PORT, USER_CAN_AB_PIN); + HAL_GPIO_DeInit(USER_CAN_120R_CTL_PORT, USER_CAN_120R_CTL_PIN); + HAL_GPIO_DeInit(USER_CAN_TX_PORT, USER_CAN_TX_PIN); + HAL_GPIO_DeInit(USER_CAN_RX_PORT, USER_CAN_RX_PIN); + + HAL_NVIC_DisableIRQ(USER_CAN_RX_IRQn); + HAL_NVIC_DisableIRQ(USER_CAN_TX_IRQn); + } +} + +void HAL_RNG_MspInit(RNG_HandleTypeDef *hrng) +{ + __HAL_RCC_RNG_CLK_ENABLE(); +} + +/** +* @brief ADC MSP Initialization +* This function configures the hardware resources used in this example +* @param hadc: ADC handle pointer +* @retval None +*/ +void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) +{ + + if(hadc->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_ADC1_CLK_ENABLE(); + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } + +} + +/** +* @brief ADC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hadc: ADC handle pointer +* @retval None +*/ + +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) +{ + + if(hadc->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC1_CLK_DISABLE(); + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } + +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/Platform/CAN/include/can.h b/Platform/CAN/include/can.h new file mode 100644 index 0000000..3eec1b5 --- /dev/null +++ b/Platform/CAN/include/can.h @@ -0,0 +1,81 @@ +/******************************************************************************* +* File Name : can.h +* Author : ymj +* Revision : 1.0 +* Date : 3/31/2020 +* Description : can.h +* +* HISTORY*********************************************************************** +* 3/31/2020 | | ymj +* Description: create +*******************************************************************************/ + +#ifndef _CAN_H_ +#define _CAN_H_ + +#include +#include "constants.h" +#include "stm32f4xx_hal.h" + +// supported baud rate +typedef enum { + _ECU_500K = 0, // 500kbps + _ECU_250K = 1, // 250kbps + _ECU_125K = 2, // 125kbps + _ECU_1000K = 3 // 1000kbps +} _ECU_BAUD_RATE; + +// MTLT's state machine +typedef enum { + DESC_IDLE = 0, // ready for being used + DESC_OCCUPIED = 1, // unavailable + DESC_PENDING = 2 // in queue +} DESC_STATE; + +// MTLT's ODR on CAN +enum { + CAN_PACKET_RATE_0 = 0, //quiet + CAN_PACKET_RATE_2 = 2, // 2Hz + CAN_PACKET_RATE_5 = 5, // 5Hz + CAN_PACKET_RATE_10 = 10, // 10Hz + CAN_PACKET_RATE_20 = 20, // 20Hz + CAN_PACKET_RATE_25 = 25, // 25Hz + CAN_PACKET_RATE_50 = 50, // 50Hz + CAN_PACKET_RATE_100 = 100, // 100Hz + CAN_PACKET_RATE_200 = 200 // 200Hz +}; + +typedef struct +{ + CAN_TxHeaderTypeDef tx_header; + uint8_t data[8]; +} CanTxMsg; + +typedef struct +{ + CAN_RxHeaderTypeDef rx_header; + uint8_t data[8]; +} CanRxMsg; + +#define CAN_ERROR -1 +#define CAN_NO_ERROR 1 + +#define USER_CAN_IDE 1 +#define USER_CAN_RTR 0 + +#define CAN_BAUD_RATE_RETRY 4 // retry times for baud rate auto detection +#define CAN_DETECT_TIME 3000 // ms, listening period at each of channels + +extern uint32_t canRxIntCounter, canStartDetectRxIntCounter; +extern uint32_t filterNum; + +void can_config(uint8_t mode, int baudRate); +void can_config_filter_mask_message(uint32_t baseID, uint32_t baseMask); +void can_config_filter_list_message(uint32_t ID1, uint32_t ID2); +void can_config_filter_clear(void); +void can_rtx_fun_config(void (*callback1)(void), void(*callback2)(void)); +BOOL can_transmit(CanTxMsg* canTxMsg); +BOOL can_detect_baudrate(_ECU_BAUD_RATE *rate); + + +#endif \ No newline at end of file diff --git a/Platform/CAN/include/car_data.h b/Platform/CAN/include/car_data.h new file mode 100644 index 0000000..aa08f3d --- /dev/null +++ b/Platform/CAN/include/car_data.h @@ -0,0 +1,29 @@ +#ifndef _CAR_DATA_H_ +#define _CAR_DATA_H_ + +#include +#include "constants.h" +#include "timer.h" + +#define CAR_CAN_ID_WHEEL_SPEED 0xAA + +typedef struct { + uint32_t update; + uint32_t week; + double timestamp; + float speed_FR; + float speed_FL; + float speed_RR; + float speed_RL; + float speed_combined; + uint8_t fwd; +} WHEEL_SPEED_STRUCT; + +void car_can_initialize(void); +void can_config_filter_car(void); +void car_can_data_process(uint32_t stdId, uint8_t* data); +uint8_t car_get_wheel_speed(double *car_speed, uint8_t *fwd, uint32_t *week, double *timestamp); + + + +#endif /* _CAR_DATA_H_ */ diff --git a/Platform/CAN/include/sae_j1939.h b/Platform/CAN/include/sae_j1939.h new file mode 100644 index 0000000..ff394ad --- /dev/null +++ b/Platform/CAN/include/sae_j1939.h @@ -0,0 +1,457 @@ +/** *************************************************************************** + * @file sae_j1939.h definitions of SAE J1939 standard + * @Author Feng + * @date Feb. 2017 + * @brief Copyright (c) 2017 All Rights Reserved. + * + * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + * PARTICULAR PURPOSE. + * + *****************************************************************************/ +#ifndef SAE_J1939_H +#define SAE_J1939_H +#include "can.h" + + +// J1939 Name definition +#define ACEINNA_SAE_J1939_VEHICLE_SYSTEM 0 +#define ACEINNA_SAE_J1939_VEHICLE_SYSTEM_INSTANCE 0 +#define ACEINNA_SAE_J1939_FUNCTION 131 +#define ACEINNA_SAE_J1939_FUNCTION_INSTANCE 0 +#define ACEINNA_SAE_J1939_ECU 0 +#define ACEINNA_SAE_J1939_MANUFACTURER_CODE 823 + + +// J1939 64-bit name structure +typedef union { + struct { + uint64_t arbitrary_address : 1; // arbit bits + uint64_t industry_group : 3; // group bits + uint64_t vehicle_system_instance : 4; // system instance bits + uint64_t vehicle_system : 7; // system bits + uint64_t reserved : 1; + uint64_t function : 8; // function bits + uint64_t function_instance : 5; // function instance bits + uint64_t ecu : 3; // ecu bits + uint64_t manufacture_code : 11; // manufacture code from SAE, 823 belongs to Aceinna + uint64_t identity_number : 21; // id bits + } bits; + + uint64_t words; +} SAE_J1939_NAME_FIELD; + +// J1939 29-bit identifier +typedef struct { + uint8_t source; // source address + uint8_t pdu_specific; // ps value + uint8_t pdu_format; // pf value + union { + struct { + uint8_t data_page : 1; // data page bit + uint8_t ext_page : 1; // extended tata page + uint8_t priority : 3; // priority bits + uint8_t reserved : 3; + } control_bits; + uint8_t r; + }; +} SAE_J1939_IDENTIFIER_FIELD; + + +// J1939 PF definition, see protocol spec +// Broadcast PFs - 240 to 255 +#define SAE_J1939_PDU_FORMAT_DATA 240 +#define SAE_J1939_PDU_FORMAT_ECU 253 +#define SAE_J1939_PDU_FORMAT_254 254 +#define SAE_J1939_PDU_FORMAT_GLOBAL 255 +#define SAE_J1939_PDU_FORMAT_241 241 +#define SAE_J1939_PDU_FORMAT_ACK 232 +#define SAE_J1939_PDU_FORMAT_REQUEST 234 +#define SAE_J1939_PDU_FORMAT_ADDRESS_CLAIM 238 + + + +// J1939 PS definition, see protocol spec +#define SAE_J1939_PDU_SPECIFIC_25 25 +#define SAE_J1939_PDU_SPECIFIC_243 243 // 65267 Vehicle Position 1 + + +// J1939 PS definition +#define SAE_J1939_GROUP_EXTENSION_ECU 197 +#define SAE_J1939_GROUP_EXTENSION_SOFTWARE_VERSION 218 +#define SAE_J1939_GROUP_EXTENSION_SAVE_CONFIGURATION 81 +#define SAE_J1939_GROUP_EXTENSION_TEST_STATUS 84 +#define SAE_J1939_GROUP_EXTENSION_PACKET_RATE 85 +#define SAE_J1939_GROUP_EXTENSION_PACKET_TYPE 86 +#define SAE_J1939_GROUP_EXTENSION_ADDR 254 +#define SAE_J1939_GROUP_EXTENSION_ACK 255 + +#define SAE_J1939_GROUP_EXTENSION_ANGULAR_RATE 42 +#define SAE_J1939_GROUP_EXTENSION_ACCELERATION 45 + +// J1939 message priority +#define SAE_J1939_CONTROL_PRIORITY 6 +#define SAE_J1939_REQUEST_PRIORITY 6 +#define SAE_J1939_ACCELERATION_PRIORITY 2 +#define SAE_J1939_ANGULAR_PRIORITY 3 +#define SAE_J1939_POSITION_PRIORITY 6 +#define SAE_J1939_ATTITUDE_PRIORITY 6 + + + +// MTLT message's length, see protocol spec +#define SAE_J1939_REQUEST_LEN 3 +#define SAE_J1939_PAYLOAD_MAX_LEN 8 +#define SAE_J1939_PAYLOAD_LEN_8_BYTES 8 +#define SAE_J1939_PAYLOAD_LEN_5_BYTES 5 +#define SAE_J1939_PAYLOAD_LEN_2_BYTES 2 + +#define ACEINNA_SAE_J1939_VERSION_PACKET_LEN 6 +#define ACEINNA_SAE_J1939_ECU_PACKET_LEN 8 + +#define ACEINNA_SAE_J1939_CFG_SAVE_LEN 3 +#define ACEINNA_SAE_J1939_PACKET_RATE_LEN 2 +#define ACEINNA_SAE_J1939_PACKET_TYPE_LEN 3 + +#define ACEINNA_SAE_J1939_ACCELERATION_LEN 8 +#define ACEINNA_SAE_J1939_ANGULAR_RATE_LEN 8 + + +// MTLT's operation +#define ACEINNA_SAE_J1939_REQUEST 0 +#define ACEINNA_SAE_J1939_RESPONSE 1 + +#define ACEINNA_SAE_J1939_SUCCESS 0 +#define ACEINNA_SAE_J1939_FAILURE 1 + + +enum { + ACEINNA_SAE_J1939_PACKET_ACCELERATION = 0x01, // acceleration + ACEINNA_SAE_J1939_PACKET_ANGULAR_RATE = 0x02, // angular rate + ACEINNA_SAE_J1939_PACKET_LATLONG = 0x04, // Lattitude, longitude + ACEINNA_SAE_J1939_PACKET_ATTITUDE = 0x08, // Attitude +}; + +typedef enum { + _ECU_IDLE = 0, // ready + _ECU_LOST_CONNECTION = 1, // connection lost + _ECU_NORMAL = 2, // normal state + _ECU_EMPTY_ADDRESS = 3, // no address assigned + _ECU_EXPIRED = 4 // address expires +} _ECU_STATUS; + +// MTLT's states +typedef enum { + _ECU_INVALID_NAME = -1, // invalid name + _ECU_TX_OVERFLOW = -2, // tx queue overflow + _ECU_RX_OVERFLOW = -3, // rx queue overflow + _ECU_BAUDRATE_DETECT = 1, // baud rate detection + _ECU_WAIT_ADDRESS = 2, // none of address + _ECU_CHECK_ADDRESS = 3, // check address conflicted + _ECU_ALGORITHM_RESET = 4, // algo reset + _ECU_READY = 64, // ready to be used + _ECU_WAIT_ID = 65, // wait for ecu id packets + _ECU_WAIT_SOFTWARE_VER = 66, // wait for software version packets + _ECU_WAIT_ALG_RESET = 68, // wait for algo reset packet + _ECU_WAIT_CONFIG_SAVE = 72, // wait config save packet + _ECU_WAIT_BUILTIN_TEST = 80 // wait for bit status packet +} _ECU_STATE; + + +typedef enum { + _ECU_MASTER = 0, // host device + _ECU_SLAVE = 1 // slave device +} _ECU_CATEGORY; + + +typedef enum { + SAE_J1939_REQUEST_PACKET = 1, // request packet + SAE_J1939_ACK_PACKET = 2, // ack packet + SAE_J1939_RESPONSE_PACKET = 3, // response packet + SAE_J1939_SET_PACKET = 4, // set packet + SAE_J1939_DATA_PACKET = 5 // data packet +} SAE_J1939_PACKET_TYPE; + + +struct sae_j1939_tx_desc { + SAE_J1939_PACKET_TYPE tx_pkt_type; // tx packet type + uint8_t tx_payload_len; // tx payload length + DESC_STATE tx_pkt_ready; // tx state + SAE_J1939_IDENTIFIER_FIELD tx_identifier; // idnetifier of tx packet + CanTxMsg tx_buffer; // tx buffer + + struct sae_j1939_tx_desc *next; +}; + + +#define SAE_J1939_MAX_TX_DESC 32 +#define SAE_J1939_MAX_RX_DESC 32 + + +struct sae_j1939_rx_desc { + uint8_t rx_pkt_len; // rx packet length + DESC_STATE rx_pkt_ready; // rx state + SAE_J1939_IDENTIFIER_FIELD rx_identifier; // indentifier of rx packet + CanRxMsg rx_buffer; // rx buffer + + struct sae_j1939_rx_desc * next; +}; + + +// address claim type +typedef struct { + SAE_J1939_IDENTIFIER_FIELD addr_claim_pg_pgn; // address claim PGN +} ADDR_CLAIM_PG_PACKET; + + +// accleration data payload format +typedef struct { + uint16_t acceleration_x; // x-axis acceleration + uint16_t acceleration_y; // y-axis acceleration + uint16_t acceleration_z; // z-axis acceleration + uint8_t lateral_merit : 2; // laterar acc merit + uint8_t longitudinal_merit : 2; // longitudinal merit + uint8_t vertical_merit : 2; // vertical merit + uint8_t transmit_rate : 2; // repetition rate + uint8_t rsvd; +} ACCELERATION_SENSOR; + +// angular rate data payload format +typedef struct { + uint16_t rate_x; // x-axis rate + uint16_t rate_y; // y-axis rate + uint16_t rate_z; // z-axis rate + uint8_t rate_x_merit : 2; // x-axis rate merit + uint8_t rate_y_merit : 2; // y-axis rate merit + uint8_t rate_z_merit : 2; // z-axis rate merit + uint8_t rsvd : 2; // rsvd + uint8_t measurement_latency; // latency +} AUGULAR_RATE; + +// gps position data payload format +// PGN 65267 +// PGN 129025 +typedef struct { + uint32_t latitude; // gps latitude 0.0000001 deg/bit + uint32_t longitude; // gps longitude 0.0000001 deg/bit +} GPS_DATA; + +// Wheel speed data +// PGN 65215 +#pragma pack (1) + +// Attitude +// PGN 127257 +typedef struct{ + uint8_t SID; + int16_t Yaw; // 0.0001 rad/bit + int16_t Pitch; // 0.0001 rad/bit + int16_t Roll; // 0.0001 rad/bit + uint8_t Rsvd; +}ATTITUDE_DATA; + +#pragma pack () + +#define SAE_J1939_MAX_TABLE_ENTRY 128 + +// address table +typedef struct { + SAE_J1939_NAME_FIELD ecu_name; // ecu's name + uint8_t address; // ecu's address + _ECU_STATUS status; // ecu's status + _ECU_CATEGORY category; // ecu's category + uint32_t last_scan_time; // ms // time of last message sent + uint32_t idle_time; // ms // idle time + uint32_t alive_time; // second // alive time +} ECU_ADDRESS_ENTRY; + + +// CAN's configuration parameters +typedef struct { + SAE_J1939_NAME_FIELD ecu_name; // ecu's name + uint8_t address; // ecu's address + uint8_t baud_rate_detect_enable; // auto detection enable/disable + uint16_t baudRate; // baud rate + uint8_t version[5]; // software version + uint16_t packet_rate; // packet rate + uint16_t packet_type; // packet type + uint8_t save_cfg_ps; // new ps value of config save + uint8_t status_ps; // new ps value of status message + uint8_t packet_rate_ps; // new ps value of packet rate + uint8_t packet_type_ps; // new ps value of packet type +} EcuConfigurationStruct; + + +// ECU structure +typedef struct { + SAE_J1939_NAME_FIELD *name; // ecu's name + uint8_t *addr; // ecu's address + _ECU_CATEGORY category; // ecu's category + _ECU_STATE state; // ecu's state + + ECU_ADDRESS_ENTRY * addrTbl; // address table + + struct sae_j1939_tx_desc * curr_tx_desc; // current tx desc + struct sae_j1939_rx_desc * curr_process_desc; // current desc processed by hardware + struct sae_j1939_rx_desc * curr_rx_desc; // current rx desc + + void (* init_table)(void); // initilize address table + void (* update_table)(ECU_ADDRESS_ENTRY *entry); // update adddress table + uint8_t (* add_entry)(uint8_t, SAE_J1939_NAME_FIELD); // add new entry + uint8_t (* del_entry)(ECU_ADDRESS_ENTRY *); // delete an entry + + uint8_t (* xmit)(struct sae_j1939_tx_desc *); // transmitting function + +} ECU_INSTANCE; + +extern ECU_INSTANCE *gEcu; + + +// packet type mask +enum { + _ECU_CONFIG_PACKET_RATE = 1, // set packet rate + _ECU_CONFIG_PACKET_TYPE = 2, // set packet type + _ECU_CONFIG_DIGITAL_FILTER = 4, // set lpf + _ECU_CONFIG_ORIENTATION = 8, // set orientation + _ECU_CONFIG_USER_BEHAVIOR = 16, // set user behavior + _ECU_CONFIG_ANGLE_ALARM = 32, // set angular alarm + _ECU_CONFIG_CONE_ALARM = 64, // set cone alarm + _ECU_CONFIG_ACCELERATION_PARAM = 128, // set acceleration parameters + _ECU_CONFIG_GROUP_EXTENSION_BANK = 256, // set new ps + _ECU_CONFIG_MASK = 511 // configuration mask +}; + +// command types +typedef enum { + ACEINNA_J1939_INVALID_IDENTIFIER = -1, // invalid indentifier + ACEINNA_J1939_IGNORE = 0, // ignore + ACEINNA_J1939_SOFTWARE_VERSION = 2, // sofware version packet + ACEINNA_J1939_ECU_ID = 3, // ecu id packet + ACEINNA_J1939_ALG_RST = 4, // alg reset packet + ACEINNA_J1939_CFG_SAVE = 5, // config save packet + ACEINNA_J1939_HARDWARE_TEST = 6, // hardware bit packet + ACEINNA_J1939_SOFTWARE_TEST = 7, // software bit packet + ACEINNA_J1939_STATUS_TEST = 8, // status packet + ACEINNA_J1939_BUILTIN_TEST = 9, // built-in test packet + ACEINNA_J1939_DATA = 10, // data packet + ACEINNA_J1939_ADDRESS_CLAIM = 11, // address claim packet + ACEINNA_J1939_REQUEST_PACKET = 12, // request packet + ACEINNA_J1939_CONFIG = 13 // config packet +} ACEINNA_J1939_PACKET_TYPE; + +// ECU address status +enum { + _ECU_ADDR_AVAILABLE = 0, // available address value + _ECU_ADDR_OCCUPIED = 1 // occupied address value +}; + +// ECU address structure +typedef struct { + uint8_t status; // status, available or occupied + uint8_t addr; // address +} ACEINNA_ECU_ADDR; + +// set command type +typedef struct { + uint8_t request; // request or response + uint8_t dest_address; // target's address + uint8_t success; // successful or failure +} COMMAND_SET_PAYLOAD; + +typedef struct{ + int pkt_type; + int priority; + uint8_t PF; + uint8_t PS; + uint8_t len; + uint8_t source; + uint8_t data_page; + uint8_t ext_page; +}msg_params_t; + + + +#define ACEINNA_ECU_ADDRESS_MAX 120 + +extern ECU_INSTANCE gEcuInst; +extern EcuConfigurationStruct gEcuConfig; +extern EcuConfigurationStruct *gEcuConfigPtr; + +extern void sae_j1939_initialize(uint16_t baudRate, uint8_t address); + +extern void initialize_mapping_table(); +extern void update_mapping_table(ECU_ADDRESS_ENTRY *); +extern uint8_t del_ecu_mapping_table(ECU_ADDRESS_ENTRY *); + +extern uint8_t is_valid_sae_j1939_identifier(SAE_J1939_IDENTIFIER_FIELD *); + +extern void ecu_process(void); +extern void ecu_transmit(void); + +extern uint8_t find_tx_desc(struct sae_j1939_tx_desc **); +extern ACEINNA_J1939_PACKET_TYPE is_valid_config_command(SAE_J1939_IDENTIFIER_FIELD *); +extern ACEINNA_J1939_PACKET_TYPE is_aceinna_data_packet(SAE_J1939_IDENTIFIER_FIELD *); +extern ACEINNA_J1939_PACKET_TYPE is_algorithm_data_packet(SAE_J1939_IDENTIFIER_FIELD *); +extern ACEINNA_J1939_PACKET_TYPE is_valid_address_claim(SAE_J1939_IDENTIFIER_FIELD *); + +extern uint8_t send_j1939_packet(struct sae_j1939_tx_desc *); +extern void send_address_claim(ECU_INSTANCE *); +extern void process_request_pg(struct sae_j1939_rx_desc *); +extern void build_request_pkt(struct sae_j1939_tx_desc *); +extern void process_address_claim(struct sae_j1939_rx_desc *desc); + +extern void aceinna_j1939_transmit_isr(void); +extern void aceinna_j1939_receive_isr(void); +extern uint8_t aceinna_j1939_send_status_packet(uint8_t built_in_type, void * bit_fields); +extern uint8_t aceinna_j1939_send_software_version(void); +extern uint8_t aceinna_j1939_send_ecu_id(void); +extern uint8_t aceinna_j1939_send_acceleration(ACCELERATION_SENSOR * data); +extern uint8_t aceinna_j1939_send_angular_rate(AUGULAR_RATE * data); +extern uint8_t aceinna_j1939_send_cfgsave(uint8_t address, uint8_t success); +extern uint8_t aceinna_j1939_send_packet_rate(uint8_t odr); +extern uint8_t aceinna_j1939_send_packet_type(uint16_t type); +extern uint8_t aceinna_j1939_send_GPS(GPS_DATA * data); +extern uint8_t aceinna_j1939_send_attitude(ATTITUDE_DATA * data); +extern uint8_t aceinna_j1939_build_msg(void *payload, msg_params_t *params); + + +// priority 6 +// PF 254 +// PS 0xA0 - 0xBF and 0xE0 - 0xFF +#define VEHICLE_DATA_ID_BASE 0x18FEA000 +#define VEHICLE_DATA_FILTER_BASE_MASK 0x18FEA000 + +// priority 6 +// PF 255 +// PS 240 and 241 +#define ACEINNA_BANK_ID_BASE 0x18FFF000 +#define ACEINNA_BANK_FILTER_BASE_MASK 0x18FFF000 + + +// priority 6 +// PF 238 +// PS 255 +#define SAE_J1939_ADDRESS_CLAIM_ID_BASE 0x18EEFF00 +#define SAE_J1939_ADDRESS_CLAIM_FILTER_BASE_MASK 0x18FFFF00 + +// priority 6 +// PF 234 +// PS 255 - global requests +#define SAE_J1939_REQUEST_ID_BASE 0x18EAFF00 +#define SAE_J1939_REQUEST_FILTER_BASE_MASK 0x18EAFF00 + +// priority 6 +// PF 255 +// PS 50 - 5F +#define SAE_J1939_CONTROL1_ID_BASE 0x18FFFF00 +#define SAE_J1939_CONTROL1_FILTER_BASE_MASK 0x18FF5000 + +// priority 6 +// PF 253 +// PS 197 +#define SAE_J1939_ECU_ID_BASE 0x18FDC500 +#define SAE_J1939_ECU_FILTER_BASE_MASK 0x18FDC500 + + +#endif // SAE_J1939_H \ No newline at end of file diff --git a/Platform/CAN/include/taskCanCommunicationJ1939.h b/Platform/CAN/include/taskCanCommunicationJ1939.h new file mode 100644 index 0000000..5b1d63c --- /dev/null +++ b/Platform/CAN/include/taskCanCommunicationJ1939.h @@ -0,0 +1,36 @@ +/** *************************************************************************** + * @file taskCANCommunicationDBC.h + * + * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + * PARTICULAR PURPOSE. + * + * sensor data acquisition task runs at 100Hz, gets the data for each sensor + * and applies available calibration + ******************************************************************************/ +/******************************************************************************* +Copyright 2018 ACEINNA, INC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*******************************************************************************/ + +#ifndef _TASK_CAN_H_ +#define _TASK_CAN_H_ + +#include "stdint.h" +#include "constants.h" + +void TaskCANCommunicationJ1939(void const *argument); + +#endif diff --git a/Platform/CAN/include/user_message_can.h b/Platform/CAN/include/user_message_can.h new file mode 100644 index 0000000..7e514a1 --- /dev/null +++ b/Platform/CAN/include/user_message_can.h @@ -0,0 +1,15 @@ +#ifndef USER_MESSAGING_CAN_H +#define USER_MESSAGING_CAN_H + +#include +#include "constants.h" + +void process_request_packet(void *dsc); +void process_data_packet(void *dsc); + +void enqeue_periodic_packets(void); +void process_ecu_commands(void * command, uint8_t ps, uint8_t addr); + +void can_config_filter_j1939(void); + +#endif /* USER_CONFIGURATION_H */ diff --git a/Platform/CAN/src/can.c b/Platform/CAN/src/can.c new file mode 100644 index 0000000..0b89a30 --- /dev/null +++ b/Platform/CAN/src/can.c @@ -0,0 +1,370 @@ +/******************************************************************************* +* File Name : can.c +* Author : ymj +* Revision : 1.0 +* Date : 3/31/2020 +* Description : can.c +* HISTORY*********************************************************************** +* 3/31/2020 | | ymj +* Description: create +*******************************************************************************/ +#include +#include + +#include "stm32f4xx_hal.h" +#include "can.h" +#include "sae_j1939.h" +#include "boardDefinition.h" +#include "osapi.h" +#include "user_message_can.h" +#include "user_config.h" +#include "car_data.h" + +CAN_HandleTypeDef canHandle; +CAN_FilterTypeDef canFilter; + +void (*gCANTxCompleteCallback)(void) = NULL; // callback function pointer of CAN transmit +void (*gCANRxCompleteCallback)(void) = NULL; // callback function pointer of CAN receive + +uint32_t canRxIntCounter = 0; // counter of CAN receiver +uint32_t canStartDetectRxIntCounter = 0; // counter of CAN receiver for auto detection + +/** *************************************************************************** + * @name _can_set_baudrate() Set up bit timing + * @brief Provides a function to set bit timing according to the expected baud rate + * + * @param [in] CAN_InitTypeDef CAN init structure definition + * br, baud rate + * @retval N/A + ******************************************************************************/ +static void _can_set_baudrate(_ECU_BAUD_RATE br, CAN_InitTypeDef *pCan_initTypeDef) +{ + switch (br) + { + case _ECU_500K: + pCan_initTypeDef->Prescaler = 10; + pCan_initTypeDef->SyncJumpWidth = CAN_SJW_1TQ; + pCan_initTypeDef->TimeSeg1 = CAN_BS1_6TQ; + pCan_initTypeDef->TimeSeg2 = CAN_BS2_2TQ; + break; + case _ECU_250K: + pCan_initTypeDef->Prescaler = 20; + pCan_initTypeDef->SyncJumpWidth = CAN_SJW_1TQ; + pCan_initTypeDef->TimeSeg1 = CAN_BS1_6TQ; + pCan_initTypeDef->TimeSeg2 = CAN_BS2_2TQ; + break; + case _ECU_125K: + pCan_initTypeDef->Prescaler = 40; + pCan_initTypeDef->SyncJumpWidth = CAN_SJW_1TQ; + pCan_initTypeDef->TimeSeg1 = CAN_BS1_6TQ; + pCan_initTypeDef->TimeSeg2 = CAN_BS2_2TQ; + break; + case _ECU_1000K: + pCan_initTypeDef->Prescaler = 5; + pCan_initTypeDef->SyncJumpWidth = CAN_SJW_1TQ; + pCan_initTypeDef->TimeSeg1 = CAN_BS1_6TQ; + pCan_initTypeDef->TimeSeg2 = CAN_BS2_2TQ; + break; + default: + break; + } + + return; +} + +/** *************************************************************************** + * @name _can_init() CAN interface initializes + * @brief Provides a function of CAN's initialization + * + * @param [in] mode: CAN_operating_mode + * [in] baudRate: ECU baudRate + * @retval + ******************************************************************************/ +static void _can_init(uint32_t mode, int baudRate) +{ + HAL_CAN_DeInit(&canHandle); + + canHandle.Instance = USER_CAN; + canHandle.Init.TimeTriggeredMode = DISABLE; + canHandle.Init.AutoBusOff = ENABLE; + canHandle.Init.AutoWakeUp = ENABLE; + canHandle.Init.AutoRetransmission = DISABLE; + canHandle.Init.ReceiveFifoLocked = DISABLE; + canHandle.Init.TransmitFifoPriority = ENABLE; + canHandle.Init.Mode = mode; + + if (baudRate > _ECU_1000K) + _can_set_baudrate(_ECU_250K, &canHandle.Init); + else + _can_set_baudrate(baudRate, &canHandle.Init); + + if (HAL_CAN_Init(&canHandle) != HAL_OK) + { + Error_Handler(); + } +} + +/** *************************************************************************** + * @name_CAN_Init_Filter_Engine () CAN's filter initialization + * @brief Performs the filter of CAN interface + * + * @param [in] + * @retval + ******************************************************************************/ +static void _can_filter_commom_init(uint32_t filterMode, uint32_t filterScale) +{ + // initialize common parameters + canFilter.FilterFIFOAssignment = CAN_RX_FIFO0; + canFilter.FilterMode = filterMode; + canFilter.FilterScale = filterScale; + canFilter.SlaveStartFilterBank = 14; + canFilter.FilterActivation = ENABLE; + + if (HAL_CAN_ConfigFilter(&canHandle, &canFilter) != HAL_OK) + { + Error_Handler(); + } +} + +uint32_t filterNum = 0; +void can_config_filter_mask_message(uint32_t baseID, uint32_t baseMask) +{ + uint32_t mask, filtr; + // initialize filter ECU ID + filtr = (baseID << 3) | (USER_CAN_IDE << 2) | (USER_CAN_RTR << 1); + mask = (baseMask << 3) | (USER_CAN_IDE << 2) | (USER_CAN_RTR << 1); + + canFilter.FilterIdHigh = filtr >> 16; + canFilter.FilterIdLow = filtr; + canFilter.FilterMaskIdHigh = mask >> 16; + canFilter.FilterMaskIdLow = mask; + canFilter.FilterBank = filterNum++; + + if (HAL_CAN_ConfigFilter(&canHandle, &canFilter) != HAL_OK) + { + Error_Handler(); + } +} + +void can_config_filter_list_message(uint32_t ID1, uint32_t ID2) +{ + canFilter.FilterIdHigh = ((ID1 >> 16) << 5) & 0xffff; + canFilter.FilterIdLow = (ID1 << 5) & 0xffff; + canFilter.FilterMaskIdHigh = ((ID2 >> 16) << 5) & 0xffff; + canFilter.FilterMaskIdLow = (ID2 << 5) & 0xffff; + canFilter.FilterBank = filterNum++; + + if (HAL_CAN_ConfigFilter(&canHandle, &canFilter) != HAL_OK) + { + Error_Handler(); + } +} + +void can_config_filter_clear(void) +{ + uint8_t filterNumTemp = filterNum; + + filterNum = 0; + if (filterNumTemp > 0 && filterNumTemp <= 16) { + while (filterNumTemp) { + can_config_filter_list_message(0x00, 0x00); + filterNumTemp--; + } + filterNum = 0; + } +} + +static void _can_start(void) +{ + if (HAL_CAN_Start(&canHandle) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_CAN_ActivateNotification(&canHandle, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) + { + Error_Handler(); + } +} + +void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) +{ + CanRxMsg can_rx_msg; + + if (hcan == &canHandle) + { + if (gOdoConfigurationStruct.can_mode == 0) { + if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &can_rx_msg.rx_header, can_rx_msg.data) == HAL_OK) + { + if (can_rx_msg.rx_header.IDE == CAN_ID_STD && can_rx_msg.rx_header.DLC == 8) + { + car_can_data_process(can_rx_msg.rx_header.StdId, can_rx_msg.data); + } + } + } else if (gOdoConfigurationStruct.can_mode == 1) { + if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &gEcuInst.curr_rx_desc->rx_buffer.rx_header, gEcuInst.curr_rx_desc->rx_buffer.data) == HAL_OK) + { + canRxIntCounter++; + if (gCANTxCompleteCallback != NULL) { + gCANRxCompleteCallback(); + } + } + } + } +} + +void USER_CAN_RX_IRQHandler(void) +{ + HAL_CAN_IRQHandler(&canHandle); +} + +void HAL_CAN_TxComplete(CAN_HandleTypeDef *hcan) +{ + if (gOdoConfigurationStruct.can_mode == 1) { + if (gCANTxCompleteCallback != NULL) { + gCANTxCompleteCallback(); + } + } +} + +void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) +{ + HAL_CAN_TxComplete(hcan); +} + +void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) +{ + HAL_CAN_TxComplete(hcan); +} + +void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) +{ + HAL_CAN_TxComplete(hcan); +} + +void USER_CAN_TX_IRQHandler(void) +{ + HAL_CAN_IRQHandler(&canHandle); +} + +BOOL can_transmit(CanTxMsg* canTxMsg) +{ + HAL_StatusTypeDef status; + uint32_t txMailbox; + + status = HAL_CAN_AddTxMessage(&canHandle, &canTxMsg->tx_header, canTxMsg->data, &txMailbox); + + if (status != HAL_OK) + { + return FALSE; + } + + return TRUE; +} + +/** *************************************************************************** + * @name can_rtx_fun_config() assign callback funtion's pointers + * @brief Performs tx/rx callback functions + * + * @param [in] callback1 -- transmit function + * callback2 -- receive function + * @retval N/A + ******************************************************************************/ +void can_rtx_fun_config(void (*callback1)(void), void (*callback2)(void)) +{ + gCANTxCompleteCallback = callback1; + gCANRxCompleteCallback = callback2; +} + +/** *************************************************************************** + * @name can_config() user interface, CAN, initialization + * @brief Provide an API of CAN initialization to system + * initialize CAN1 of version 3rd PCB + * @param [in] + * @retval N/A + ******************************************************************************/ +void can_config(uint8_t mode, int baudRate) +{ + if (mode == 0) { + _can_init(CAN_MODE_NORMAL, baudRate); // CAN_MODE_SILENT + _can_filter_commom_init(CAN_FILTERMODE_IDLIST, CAN_FILTERSCALE_16BIT); + can_config_filter_clear(); + + can_config_filter_car(); + + } else if (mode == 1) { + _can_init(CAN_MODE_NORMAL, baudRate); + _can_filter_commom_init(CAN_FILTERMODE_IDMASK, CAN_FILTERSCALE_32BIT); + can_config_filter_clear(); + + can_config_filter_j1939(); + } + + _can_start(); +} + +/** *************************************************************************** + * @name can_detect_baudrate() Baud rate auto detection + * @brief Traverse all of supported channels and find out the baud rate used + * by host CAN device + * @param [in] rate, 500kbps, 250kbps or 125kbps + * @retval _ECU_500K, _ECU_250K or _ECU_125K + ******************************************************************************/ +static _ECU_BAUD_RATE _detect_baudrate(_ECU_BAUD_RATE rate) +{ + _ECU_BAUD_RATE found_rate; + + if (rate == _ECU_1000K) + return rate; + + _can_init(CAN_MODE_NORMAL, rate); + + OS_Delay(CAN_DETECT_TIME); + + if (canRxIntCounter > canStartDetectRxIntCounter + 1) + { + found_rate = rate; + return found_rate; + } + + return _ECU_1000K; +} + +BOOL can_detect_baudrate(_ECU_BAUD_RATE *rate) +{ + static int8_t retry_time = CAN_BAUD_RATE_RETRY; + int result; + // Auto-detection + if (gEcuInst.state == _ECU_BAUDRATE_DETECT) + { + canStartDetectRxIntCounter = canRxIntCounter; + + result = _detect_baudrate(*rate); + + if (result != _ECU_1000K) + { + gEcuConfig.baudRate = result; + + _can_init(CAN_MODE_NORMAL, gEcuConfig.baudRate); + + set_can_baudrate(result); + } + else + { + if (retry_time-- > 0) + { + (*rate)++; + if (*rate >= _ECU_1000K) + { + *rate = _ECU_500K; + } + return FALSE; + } + + _can_init(CAN_MODE_NORMAL, gEcuConfig.baudRate); + } + + gEcuInst.state = _ECU_CHECK_ADDRESS; + } + return TRUE; +} diff --git a/Platform/CAN/src/car_data.c b/Platform/CAN/src/car_data.c new file mode 100644 index 0000000..b53723d --- /dev/null +++ b/Platform/CAN/src/car_data.c @@ -0,0 +1,178 @@ +#include "car_data.h" +#include "can.h" +#include "string.h" +#include "user_config.h" + +WHEEL_SPEED_STRUCT wheel_speed; + +extern int32_t gps_start_week; + +void car_can_initialize(void) +{ + memset(&wheel_speed, 0, sizeof(WHEEL_SPEED_STRUCT)); + wheel_speed.fwd = 1; + can_config(0, gUserConfiguration.can_baudrate); +} + +void can_config_filter_car(void) +{ + uint8_t i; + + // can_config_filter_list_message(CAR_CAN_ID_WHEEL_SPEED, 0x00); + + filterNum = 0; + for (i = 0; i < 3; i++) { + if (gOdoConfigurationStruct.odo_mesg[i].usage == 0x55) { + can_config_filter_list_message(gOdoConfigurationStruct.odo_mesg[i].mesgID, 0x00); + } + } +} + +/* +Now the default data is Toyota Corolla 2019. +If it is another vehicle, modify this function to fit the communication protocol +*/ +void car_can_data_process(uint32_t stdId, uint8_t* data) +{ + gtime_t time; + mcu_time_base_t start_time; + int week = 0; + double timestamp = 0.0; + int64_t value = 0; + uint8_t endian = 0, sign = 0, unit = 0, source = 0; + uint8_t index_byte = 0, index_bitofbyte = 0, bitlen = 0, bitlent = 0, lastbitofbyte = 0; + double factor = 0.0, offset = 0.0; + double svalue = 0.0; + uint8_t i; + + start_time = g_MCU_time; + time.time = start_time.time; + time.sec = (float)start_time.msec / 1000; + timestamp = time2gpst(time, &week); + if (gps_start_week == -1 || timestamp < 0.0) { + return; + } + + // if (stdId == CAR_CAN_ID_WHEEL_SPEED) { + // wheel_speed.week = gps_start_week; + // wheel_speed.timestamp = timestamp + (week - gps_start_week) * SECONDS_IN_WEEK; + // wheel_speed.speed_FR = (((data[0] << 8) + data[1]) - 6767) * 0.01; + // wheel_speed.speed_FL = (((data[2] << 8) + data[3]) - 6767) * 0.01; + // wheel_speed.speed_RR = (((data[4] << 8) + data[5]) - 6767) * 0.01; + // wheel_speed.speed_RL = (((data[6] << 8) + data[7]) - 6767) * 0.01; + // wheel_speed.update = 1; + // } + + for (i = 0; i < 3; i++) { + if (gOdoConfigurationStruct.odo_mesg[i].usage == 0x55) { + if (gOdoConfigurationStruct.odo_mesg[i].mesgID == stdId) { + + if (gOdoConfigurationStruct.odo_mesg[i].startbit >= 64 || + gOdoConfigurationStruct.odo_mesg[i].length > 64 || + gOdoConfigurationStruct.odo_mesg[i].length == 0 || + gOdoConfigurationStruct.odo_mesg[i].endian >= 2 || + gOdoConfigurationStruct.odo_mesg[i].sign >= 2 || + gOdoConfigurationStruct.odo_mesg[i].unit > 2 || + gOdoConfigurationStruct.odo_mesg[i].source > 3) { + continue; + } + if (gOdoConfigurationStruct.odo_mesg[i].endian == 0) { + if (gOdoConfigurationStruct.odo_mesg[i].startbit + gOdoConfigurationStruct.odo_mesg[i].length > 64) { + continue; + } + } else { + if ((((gOdoConfigurationStruct.odo_mesg[i].startbit / 8) + 1) * 8 - (gOdoConfigurationStruct.odo_mesg[i].startbit % 8)) < gOdoConfigurationStruct.odo_mesg[i].length) { + continue; + } + } + + value = 0; + unit = gOdoConfigurationStruct.odo_mesg[i].unit; + source = gOdoConfigurationStruct.odo_mesg[i].source; + factor = gOdoConfigurationStruct.odo_mesg[i].factor; + offset = gOdoConfigurationStruct.odo_mesg[i].offset; + endian = gOdoConfigurationStruct.odo_mesg[i].endian; + sign = gOdoConfigurationStruct.odo_mesg[i].sign; + index_byte = gOdoConfigurationStruct.odo_mesg[i].startbit / 8; + index_bitofbyte = gOdoConfigurationStruct.odo_mesg[i].startbit % 8; + bitlen = gOdoConfigurationStruct.odo_mesg[i].length; + bitlent = bitlen; + + while (bitlen > 0) { + lastbitofbyte = index_bitofbyte + bitlen >= 8 ? 0 : 8 - (index_bitofbyte + bitlen); + value |= ((data[index_byte] >> index_bitofbyte) & (0xff >> lastbitofbyte)) << (bitlent - bitlen); + bitlen = bitlen - (8 - index_bitofbyte - lastbitofbyte); + if (endian == 0) { + index_byte++; + } else { + index_byte--; + } + index_bitofbyte = 0; + } + + if (sign == 1) { + if ((value & (1 << (bitlent - 1))) != 0) { + value = -(value - (1 << (bitlent - 1))); + } + } + svalue = (value + offset) * factor; + + // printf("value = %lld, svalue = %lf\r\n", value, svalue); + + if (source == 0x03) { + if (svalue == gOdoConfigurationStruct.gears[0]) { + wheel_speed.fwd = 1; + } else if (svalue == gOdoConfigurationStruct.gears[1]) { + wheel_speed.fwd = 0; + } else if (svalue == gOdoConfigurationStruct.gears[2]) { + wheel_speed.fwd = 1; + } else if (svalue == gOdoConfigurationStruct.gears[3]) { + wheel_speed.fwd = 1; + } + + } else { + if (unit == 0) { + svalue = svalue / 3.6; + } else if (unit == 1) { + svalue = svalue * 0.44704; + } + + if (source == 0) { + wheel_speed.speed_RR = svalue; + } else if (source == 1) { + wheel_speed.speed_RL = svalue; + } else if (source == 2) { + wheel_speed.speed_combined = svalue; + } + wheel_speed.update |= 1 << source; + wheel_speed.week = week; + wheel_speed.timestamp = timestamp; + } + } + + } + } +} + +uint8_t car_get_wheel_speed(double *car_speed, uint8_t *fwd, uint32_t *week, double *timestamp) +{ + if (wheel_speed.update >= 3) + { + //printf("FR %f, FL %f, RR %f, RL %f\r\n", wheel_speed.speed_FR, wheel_speed.speed_FL, wheel_speed.speed_RR, wheel_speed.speed_RL); + // *car_speed = (wheel_speed.speed_RR + wheel_speed.speed_RL) * 0.5 / 3.6; + + *week = wheel_speed.week; + *timestamp = wheel_speed.timestamp; + *fwd = wheel_speed.fwd; + if ((wheel_speed.update & 3) == 3) { + *car_speed = (wheel_speed.speed_RR + wheel_speed.speed_RL) * 0.5; + } else if ((wheel_speed.update & (1 << 2)) != 0) { + *car_speed = wheel_speed.speed_combined; + } + + wheel_speed.update = 0; + return 1; + } + + return 0; +} diff --git a/Platform/CAN/src/sae_j1939.c b/Platform/CAN/src/sae_j1939.c new file mode 100644 index 0000000..aa43159 --- /dev/null +++ b/Platform/CAN/src/sae_j1939.c @@ -0,0 +1,650 @@ +/** *************************************************************************** + * @file sae_j1939.c the definitions of basic functions + * @Author Feng + * @date May 2017 + * @brief Copyright (c) 2017 All Rights Reserved. + * + * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + * PARTICULAR PURPOSE. + * + *****************************************************************************/ +#include +#include +#include +#include "platformAPI.h" +#include "osapi.h" +#include "can.h" +#include "sae_j1939.h" +#include "user_config.h" + + +ECU_INSTANCE gEcuInst; +EcuConfigurationStruct gEcuConfig; +ECU_ADDRESS_ENTRY addrMappingTable[SAE_J1939_MAX_TABLE_ENTRY]; + +ECU_ADDRESS_ENTRY *gAddrMapTblPtr = &addrMappingTable[0]; +EcuConfigurationStruct *gEcuConfigPtr = &gEcuConfig; + +struct sae_j1939_tx_desc ecu_tx_desc[SAE_J1939_MAX_TX_DESC]; +struct sae_j1939_rx_desc ecu_rx_desc[SAE_J1939_MAX_RX_DESC]; + +#define SAE_J1939_TX_THRESHOLD 16 +#define SAE_J1939_MAX_IDLE_TIME 1000000 //ms + +static ACEINNA_ECU_ADDR ecu_pool[ACEINNA_ECU_ADDRESS_MAX]; + + +/** *************************************************************************** + * @name add_ecu_mapping_table() add an entry in address pool + * @brief insert a new occupied address in table + * + * @param [in] addr, address value + * name, ecu's name + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t add_ecu_mapping_table(uint8_t addr, SAE_J1939_NAME_FIELD name) +{ + int i; + ECU_ADDRESS_ENTRY *addrTbl = gAddrMapTblPtr; + + for ( i = 0; i < SAE_J1939_MAX_TABLE_ENTRY; i++) { + if (addrTbl->status == _ECU_IDLE){ + break; + } + addrTbl++; + } + + if ( i == SAE_J1939_MAX_TABLE_ENTRY) + return 0; + + addrTbl->ecu_name.words = name.words; + addrTbl->address = addr; + addrTbl->status = _ECU_NORMAL; + addrTbl->category = _ECU_SLAVE; + addrTbl->last_scan_time = 0; + addrTbl->idle_time = 0; + addrTbl->alive_time = 0; + + return 1; +} + +/** *************************************************************************** + * @name send_j1939_packet() a general API of sending packet + * @brief perform transmitting function + * + * @param [in] desc, tx descriptor + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t send_j1939_packet(struct sae_j1939_tx_desc *desc) +{ + CanTxMsg* TxMsg; + uint8_t result = 0; + + // assign tx buffer + TxMsg = &(desc->tx_buffer); + + // call transmitting API + result = can_transmit(TxMsg); + + // check transmission +// result = CAN_TransmitStatus(CAN1, 0); + + return result; + +} + + +/** *************************************************************************** + * @name initialize_j1939_config() initialize basic CAN's global parameters + * @brief called in init routine to assign values to CAN's global parameters + * + * @param [in] + * @retval N/A + ******************************************************************************/ +void initialize_j1939_config(uint16_t baudRate, uint8_t address) +{ + // assign the global bau rate value, go to default value if invalid + gEcuConfigPtr->baudRate = baudRate; + + // set address and data packet type + gEcuConfigPtr->address = address; +// gEcuConfigPtr->packet_type = platformGetCANPacketType(); + + // init config save ps values + if (!gEcuConfigPtr->save_cfg_ps) + gEcuConfigPtr->save_cfg_ps = SAE_J1939_GROUP_EXTENSION_SAVE_CONFIGURATION; + + // init status ps values + if (!gEcuConfigPtr->status_ps) + gEcuConfigPtr->status_ps = SAE_J1939_GROUP_EXTENSION_TEST_STATUS; + + // init odr ps values + if (!gEcuConfigPtr->packet_rate_ps) + gEcuConfigPtr->packet_rate_ps = SAE_J1939_GROUP_EXTENSION_PACKET_RATE; + + // init packet type ps value + if (!gEcuConfigPtr->packet_type_ps) + gEcuConfigPtr->packet_type_ps = SAE_J1939_GROUP_EXTENSION_PACKET_TYPE; + + return; +} + +/** *************************************************************************** + * @name process_j1939_packet() call ecu_process() to decode the incoming message + * @brief a genetal API called by caller + * + * @param [in] rx_desc, current rx descriptor + * @retval N/A + ******************************************************************************/ +void process_j1939_packet(struct sae_j1939_rx_desc * rx_desc) +{ + if (rx_desc->rx_pkt_ready != DESC_OCCUPIED) + return; + + // process incoming packets + ecu_process(); + + return; +} + +/** *************************************************************************** + * @name sae_j1939_initialize() general initialization of all data structures + * @brief called in initial routine + * + * @param [in] + * @retval N/A + ******************************************************************************/ +void sae_j1939_initialize(uint16_t baudRate, uint8_t address) +{ + int i; + + initialize_j1939_config(baudRate, address); + + + memset(ecu_tx_desc, 0, sizeof(ecu_tx_desc)); + memset(ecu_rx_desc, 0, sizeof(ecu_rx_desc)); + + + for ( i = 0; i < SAE_J1939_MAX_TX_DESC; i++) { + if (i == SAE_J1939_MAX_TX_DESC - 1) + { + ecu_tx_desc[i].next = &ecu_tx_desc[0]; + } + else + { + ecu_tx_desc[i].next = &ecu_tx_desc[i+1]; + } + } + + for ( i = 0; i < SAE_J1939_MAX_RX_DESC; i++) { + if (i == SAE_J1939_MAX_RX_DESC - 1) + { + ecu_rx_desc[i].next = &ecu_rx_desc[0]; + } + else + { + ecu_rx_desc[i].next = &ecu_rx_desc[i+1]; + } + } + + for (i = 0; i < ACEINNA_ECU_ADDRESS_MAX; i++) { + ecu_pool[i].status = _ECU_ADDR_AVAILABLE; + ecu_pool[i].addr = i + 128; + } + + initialize_mapping_table(); + + + gEcuInst.name = (SAE_J1939_NAME_FIELD *)&gEcuConfigPtr->ecu_name; + gEcuInst.addr = &(gEcuConfig.address); + gEcuInst.category = _ECU_SLAVE; + if (gEcuConfig.baud_rate_detect_enable) { + gEcuInst.state = _ECU_BAUDRATE_DETECT; + } else { + if (*gEcuInst.addr) + gEcuInst.state = _ECU_CHECK_ADDRESS; + else + gEcuInst.state = _ECU_WAIT_ADDRESS; + } + + gEcuInst.addrTbl = gAddrMapTblPtr; + + // FL hardcode address here +#ifdef DEMO_PROTO + gEcuInst.state = _ECU_READY; +#endif + + gEcuInst.curr_tx_desc = &(ecu_tx_desc[0]); + gEcuInst.curr_rx_desc = &(ecu_rx_desc[0]); + gEcuInst.curr_process_desc = &(ecu_rx_desc[0]); + gEcuInst.init_table = initialize_mapping_table; + gEcuInst.update_table = update_mapping_table; + gEcuInst.add_entry = add_ecu_mapping_table; + gEcuInst.del_entry = del_ecu_mapping_table; + gEcuInst.xmit = send_j1939_packet; + + + can_rtx_fun_config(aceinna_j1939_transmit_isr, aceinna_j1939_receive_isr); + + return ; +} + + +/** *************************************************************************** + * @name initialize_mapping_table() initialize the mapping table + * @brief called in intial routine + * + * @param [in] + * @retval N/A + ******************************************************************************/ +void initialize_mapping_table(void) +{ + int i; + ECU_ADDRESS_ENTRY *addrTbl = gAddrMapTblPtr; + + for (i = 0; i < SAE_J1939_MAX_TABLE_ENTRY; i++) { + if (!addrTbl->ecu_name.words) + addrTbl->status = _ECU_IDLE; + else if (!addrTbl->address) + addrTbl->status = _ECU_EMPTY_ADDRESS; + else + addrTbl->status = _ECU_EXPIRED; + + addrTbl++; + } + + return; +} + +/** *************************************************************************** + * @name build_request_pkt() build up a general request packet + * @brief perform the header of request packet + * + * @param [in] req_desc, a tx descriptor + * @retval N/A + ******************************************************************************/ +void build_request_pkt(struct sae_j1939_tx_desc * req_desc) +{ + req_desc->tx_pkt_type = SAE_J1939_REQUEST_PACKET; + req_desc->tx_payload_len = SAE_J1939_REQUEST_LEN; + req_desc->tx_identifier.control_bits.priority = SAE_J1939_REQUEST_PRIORITY; + req_desc->tx_identifier.pdu_format = SAE_J1939_PDU_FORMAT_REQUEST; + req_desc->tx_identifier.pdu_specific = SAE_J1939_PDU_FORMAT_GLOBAL; + req_desc->tx_identifier.source = *(uint8_t *)gEcuInst.addr; + req_desc->tx_pkt_ready = DESC_OCCUPIED; + + return; +} + +/** *************************************************************************** + * @name send_address_claim() send out adress claim packet + * @brief perform the entire packet of address claim, header and payload + * + * @param [in] ecu, self ecu object + * @retval N/A + ******************************************************************************/ +void send_address_claim(ECU_INSTANCE *ecu) +{ + struct sae_j1939_tx_desc *addr_claim_desc; + ADDR_CLAIM_PG_PACKET addr_claim_pg; + uint8_t address = *ecu->addr; + + if (find_tx_desc(&addr_claim_desc) == 0) + return; + + if (!address) { + addr_claim_pg.addr_claim_pg_pgn.r = 0; + addr_claim_pg.addr_claim_pg_pgn.control_bits.priority = SAE_J1939_CONTROL_PRIORITY; + addr_claim_pg.addr_claim_pg_pgn.pdu_format = SAE_J1939_PDU_FORMAT_ADDRESS_CLAIM; + addr_claim_pg.addr_claim_pg_pgn.pdu_specific = SAE_J1939_GROUP_EXTENSION_ACK; + + build_request_pkt(addr_claim_desc); + + addr_claim_desc->tx_identifier.source = SAE_J1939_GROUP_EXTENSION_ADDR; + + addr_claim_desc->tx_buffer.data[0] = addr_claim_pg.addr_claim_pg_pgn.r; + addr_claim_desc->tx_buffer.data[1] = addr_claim_pg.addr_claim_pg_pgn.pdu_format; + addr_claim_desc->tx_buffer.data[2] = addr_claim_pg.addr_claim_pg_pgn.pdu_specific; + } else { + addr_claim_desc->tx_pkt_type = ACEINNA_J1939_ADDRESS_CLAIM; + addr_claim_desc->tx_payload_len = SAE_J1939_PAYLOAD_MAX_LEN; + addr_claim_desc->tx_identifier.r = 0; + addr_claim_desc->tx_identifier.control_bits.priority = SAE_J1939_REQUEST_PRIORITY; + addr_claim_desc->tx_identifier.pdu_format = SAE_J1939_PDU_FORMAT_ADDRESS_CLAIM; + addr_claim_desc->tx_identifier.pdu_specific = SAE_J1939_GROUP_EXTENSION_ACK; + addr_claim_desc->tx_identifier.source = *(uint8_t *)gEcuInst.addr; + + memcpy((void *)addr_claim_desc->tx_buffer.data, (void *)(&(ecu->name->words)), SAE_J1939_PAYLOAD_MAX_LEN); + } + + addr_claim_desc->tx_buffer.tx_header.ExtId = ((addr_claim_desc->tx_identifier.r << 24) | + (addr_claim_desc->tx_identifier.pdu_format << 16) | + (addr_claim_desc->tx_identifier.pdu_specific << 8) | + (addr_claim_desc->tx_identifier.source)); + addr_claim_desc->tx_buffer.tx_header.IDE = CAN_ID_EXT; + addr_claim_desc->tx_buffer.tx_header.RTR = CAN_RTR_DATA; + addr_claim_desc->tx_buffer.tx_header.DLC = addr_claim_desc->tx_payload_len; + addr_claim_desc->tx_pkt_ready = DESC_OCCUPIED; + + return; +} + +/** *************************************************************************** + * @name allocate_ecu_addr() find out the available address + * @brief search address in the pool and find out first available address + * otherwise, return max address + * @param [in] + * @retval address or max address + ******************************************************************************/ +uint8_t allocate_ecu_addr(void) +{ + int i; + + for (i = 0; i < ACEINNA_ECU_ADDRESS_MAX; i++) { + if (ecu_pool[i].status == _ECU_ADDR_AVAILABLE) { + ecu_pool[i].status = _ECU_ADDR_OCCUPIED; + return ecu_pool[i].addr; + } + } + + return 247; +} + + +/** *************************************************************************** + * @name del_ecu_mapping_table() an API of erasing an used address message + * @brief search address in the mapping table and delete the record + * otherwise, return 0 + * @param [in] input, ecu object + * @retval 0 + ******************************************************************************/ +uint8_t del_ecu_mapping_table(ECU_ADDRESS_ENTRY *input) +{ + int i; + ECU_ADDRESS_ENTRY *addrTbl = gAddrMapTblPtr; + + for ( i = 0; i < SAE_J1939_MAX_TABLE_ENTRY; i++) { + if (addrTbl->ecu_name.words == input->ecu_name.words) { + ecu_pool[addrTbl->address - 128].status = _ECU_ADDR_AVAILABLE; + memset((void *)addrTbl, '\0', sizeof(ECU_ADDRESS_ENTRY)); + addrTbl->status = _ECU_IDLE; + + break; + } + } + + return 0; +} + +/** *************************************************************************** + * @name update_mapping_table() an API of updating the table by the input message + * @brief search address in the mapping table and find out the record + * otherwise, add a new entry + * @param [in] entry, ecu object + * @retval + ******************************************************************************/ +void update_mapping_table(ECU_ADDRESS_ENTRY *entry) +{ + int i; + ECU_ADDRESS_ENTRY *addrTbl = gAddrMapTblPtr; + + for (i = 0; i < SAE_J1939_MAX_TABLE_ENTRY; i++) { + if (entry->ecu_name.words == addrTbl->ecu_name.words) { + addrTbl->address = entry->address; + addrTbl->status = entry->status; + addrTbl->category = entry->category; + if (entry->status == _ECU_NORMAL) + addrTbl->idle_time = 0; + + return; + } + + addrTbl++; + } + + add_ecu_mapping_table(entry->address, entry->ecu_name); + + return; +} + +/** *************************************************************************** + * @name find_remote_ecu() an API of finding out peer device + * @brief search address in the mapping table and find out peer device + * + * @param [in] address, ecu's address + * name, ecu's name + * @retval ecu object or NULL + ******************************************************************************/ +ECU_ADDRESS_ENTRY * find_remote_ecu(uint8_t addr, SAE_J1939_NAME_FIELD name) +{ + int i; + ECU_ADDRESS_ENTRY *addrTbl = gAddrMapTblPtr; + + for (i = 0; i < SAE_J1939_MAX_TABLE_ENTRY; i++) { + if (name.words == addrTbl->ecu_name.words) { + if (addr != addrTbl->address) + addrTbl->address = addr; + return addrTbl; + } + + addrTbl++; + } + + return NULL; +} + +/** *************************************************************************** + * @name find_tx_desc() get the available tx descriptor + * @brief perform an available tx descriptor for ready-to-go packet + * + * @param [in] input, tx descriptor pointer + * + * @retval 0 successful and 1 failure + ******************************************************************************/ +uint8_t find_tx_desc(struct sae_j1939_tx_desc **input) +{ + *input = gEcuInst.curr_tx_desc; + + while ((*input)->tx_pkt_ready != DESC_IDLE) + { + *input = (*input)->next; + if (*input == gEcuInst.curr_tx_desc) { +// gEcuInst.state = _ECU_TX_OVERFLOW; + return 0; + } + } + + return 1; +} + + +/** *************************************************************************** + * @name is_valid_pf() check pf is supported or not + * @brief a general API of pf value checking + * + * @param [in] pf_val, pf number + * + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t is_valid_pf(uint8_t pf_val) +{ + if ((pf_val == SAE_J1939_PDU_FORMAT_ACK) || + (pf_val == SAE_J1939_PDU_FORMAT_REQUEST) || + (pf_val == SAE_J1939_PDU_FORMAT_DATA) || + (pf_val == SAE_J1939_PDU_FORMAT_ADDRESS_CLAIM) || + (pf_val == SAE_J1939_PDU_FORMAT_ECU) || + (pf_val == SAE_J1939_PDU_FORMAT_254) || + (pf_val == SAE_J1939_PDU_FORMAT_GLOBAL)) + return 1; + + return 0; +} + +/** *************************************************************************** + * @name process_request_pg() process the incoming request packets + * @brief a general API of request message handler + * + * @param [in] rx_desc, rx descriptor + * + * @retval N/A + ******************************************************************************/ +void process_request_pg(struct sae_j1939_rx_desc *rx_desc) +{ + + if (rx_desc == NULL) + return; + + send_address_claim(&gEcuInst); + + return; +} + + +/** *************************************************************************** + * @name process_address_claim() process the incoming address claiming request + * @brief a general API of address claim handler + * + * @param [in] rx_desc, rx descriptor + * + * @retval N/A + ******************************************************************************/ +void process_address_claim(struct sae_j1939_rx_desc *desc) +{ + uint8_t source_addr; + uint8_t result; + SAE_J1939_NAME_FIELD ecu_name; + SAE_J1939_IDENTIFIER_FIELD * ident; + ECU_ADDRESS_ENTRY * remote_ecu; + + if (desc == NULL) + return; + + ident = &desc->rx_identifier; + if (ident == NULL) + return; + + source_addr = ident->source; + memcpy((void *)&ecu_name.words, (void *)desc->rx_buffer.data, 8); + remote_ecu = find_remote_ecu(source_addr, ecu_name); + if ((remote_ecu == NULL) && (source_addr != *gEcuInst.addr)) { + if (!(result = add_ecu_mapping_table(source_addr, ecu_name))) { +// ERROR_STRING("\r\naddress table full.\r\n"); + } + } else if (source_addr == *gEcuInst.addr) { + if (remote_ecu->ecu_name.words > gEcuInst.name->words) + send_address_claim(&gEcuInst); + else { + *gEcuInst.addr = allocate_ecu_addr(); + save_ecu_address((uint16_t)gEcuConfigPtr->address); + } + } + + gEcuInst.state = _ECU_READY; + + return; + +} + +/** *************************************************************************** + * @name is_valid_sae_j1939_identifier() check identifier is valid or invalid + * @brief a general API of identifier checking + * + * @param [in] identifier, identifier message + * + * @retval 1 valid or 0 invalid + ******************************************************************************/ +uint8_t is_valid_sae_j1939_identifier(SAE_J1939_IDENTIFIER_FIELD *identifier) +{ + if (identifier->control_bits.data_page) + return 0; + + if (!is_valid_pf(identifier->pdu_format)) + return 0; + + return 1; +} + +/** *************************************************************************** + * @name is_valid_address_claim() check incoming address claim valid or invalid + * @brief a general API of address claim message + * + * @param [in] ident, identifier message + * + * @retval ACEINNA_J1939_ADDRESS_CLAIM, ACEINNA_J1939_INVALID_IDENTIFIER, or ACEINNA_J1939_IGNORE + ******************************************************************************/ +ACEINNA_J1939_PACKET_TYPE is_valid_address_claim(SAE_J1939_IDENTIFIER_FIELD *ident) +{ + uint8_t pf_val, ps_val; + + if (ident == NULL) + return ACEINNA_J1939_INVALID_IDENTIFIER; + + pf_val = ident->pdu_format; + ps_val = ident->pdu_specific; + + if ((pf_val == SAE_J1939_PDU_FORMAT_ADDRESS_CLAIM) && + (ps_val == SAE_J1939_GROUP_EXTENSION_ACK)) { + return ACEINNA_J1939_ADDRESS_CLAIM; + } + + return ACEINNA_J1939_IGNORE; +} + +/** *************************************************************************** + * @name is_aceinna_data_packet() check incoming packet is data packet + * @brief a general API of checking the data packets belong to ss2, angular or accel + * + * @param [in] ident, identifier message + * + * @retval ACEINNA_J1939_DATA or ACEINNA_J1939_IGNORE + ******************************************************************************/ +ACEINNA_J1939_PACKET_TYPE is_aceinna_data_packet(SAE_J1939_IDENTIFIER_FIELD *ident) +{ + uint8_t pf_val, ps_val; + + pf_val = ident->pdu_format; + ps_val = ident->pdu_specific; + + if ((pf_val == SAE_J1939_PDU_FORMAT_DATA) && + ((ps_val == SAE_J1939_GROUP_EXTENSION_ANGULAR_RATE) || + (ps_val == SAE_J1939_GROUP_EXTENSION_ACCELERATION))) { + return ACEINNA_J1939_DATA; + } + if (pf_val == SAE_J1939_PDU_FORMAT_241 && + ps_val == SAE_J1939_PDU_SPECIFIC_25) { + + } + if (pf_val == SAE_J1939_PDU_FORMAT_254 && + ps_val == SAE_J1939_PDU_SPECIFIC_243) { + + } + + return ACEINNA_J1939_IGNORE; +} + +/** *************************************************************************** + * @name is_data_packet() check incoming packet is data packet + * @brief a general API of checking the data packets belong to ss2, angular or accel + * + * @param [in] ident, identifier message + * + * @retval ACEINNA_J1939_DATA or ACEINNA_J1939_IGNORE + ******************************************************************************/ +ACEINNA_J1939_PACKET_TYPE is_algorithm_data_packet(SAE_J1939_IDENTIFIER_FIELD *ident) +{ +// uint8_t pf_val, ps_val; + + +// pf_val = ident->pdu_format; +// ps_val = ident->pdu_specific; + +// if ((pf_val == SAE_J1939_PDU_FORMAT_254) && +// ((ps_val == SAE_J1939_PDU_SPECIFIC_243))) { +// return ACEINNA_J1939_DATA; +// } + + return ACEINNA_J1939_IGNORE; +} + diff --git a/Platform/CAN/src/sae_j1939_slave.c b/Platform/CAN/src/sae_j1939_slave.c new file mode 100644 index 0000000..f8ec6b0 --- /dev/null +++ b/Platform/CAN/src/sae_j1939_slave.c @@ -0,0 +1,560 @@ +/** *************************************************************************** + * @file sae_j1939_slave.c the definitions of basic functions + * @Author Feng + * @date May 2017 + * @brief Copyright (c) 2017 All Rights Reserved. + * + * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + * PARTICULAR PURPOSE. + * + *****************************************************************************/ +#include +#include +#include +#include "platformAPI.h" +#include "user_message_can.h" +#include "sae_j1939.h" + +#define CAN_OUTPUT_INTERVAL 15 + +uint32_t can_output_counter = 0; + +ECU_INSTANCE *gEcu = &gEcuInst; + + + +/** *************************************************************************** + * @name aceinna_j1939_send_software_version() builds up software version packet + * @brief perform sofware version feature in spec 5.1.1 + * + * @param [in] + * + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_software_version(void) +{ + msg_params_t params; + uint8_t data[8]; + + // build up the header of software version + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_RESPONSE_PACKET; + params.len = ACEINNA_SAE_J1939_VERSION_PACKET_LEN; + params.priority = SAE_J1939_CONTROL_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_254; + params.PS = SAE_J1939_GROUP_EXTENSION_SOFTWARE_VERSION; + + // build up software version payload + platformGetVersionBytes(data); + + return aceinna_j1939_build_msg((void *)data, ¶ms); + +} + +/** *************************************************************************** + * @name aceinna_j1939_send_ecu_id() builds up ecu id packet + * @brief perform ecu id feature in spec 5.1.2 + * + * @param [in] + * + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_ecu_id(void) +{ + msg_params_t params; + + // build up the header of ecu id + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_RESPONSE_PACKET; + params.len = ACEINNA_SAE_J1939_ECU_PACKET_LEN; + params.priority = SAE_J1939_CONTROL_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_ECU; + params.PS = SAE_J1939_GROUP_EXTENSION_ECU; + + return aceinna_j1939_build_msg((void *)&(gEcuConfigPtr->ecu_name.words), ¶ms); +} + +/** *************************************************************************** + * @name aceinna_j1939_send_cfgsave() builds up config save or alg reset response + * @brief perform ecu id feature in spec 5.1.3 and 5.1.4 + * + * @param [in] target, ecu object + * alg_rst, 0--config save or 1--alg reset + * success, 1 sucess or 0 fails + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_cfgsave(uint8_t address, uint8_t success) +{ + msg_params_t params; + uint8_t data[8]; + + // build up the header + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_RESPONSE_PACKET; + params.len = ACEINNA_SAE_J1939_CFG_SAVE_LEN; + params.priority = SAE_J1939_CONTROL_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_GLOBAL; + params.PS = gEcuConfigPtr->save_cfg_ps; + + // build up payload + data[0] = ACEINNA_SAE_J1939_RESPONSE; + data[1] = address; + data[2] = success; + + return aceinna_j1939_build_msg((void *)data, ¶ms); +} + +/** *************************************************************************** + * @name aceinna_j1939_send_status_packet() status packet + * bit packets + * @brief perform bit status feature in spec 5.2.1, 5.2.2 and 5.2.3 + * + * @param [in] built_in_type, ACEINNA_SAE_J1939_BUILTIN_HARDWARE, + * ACEINNA_SAE_J1939_BUILTIN_SOFTWARE, + * ACEINNA_SAE_J1939_BUILTIN_STATUS + * bit_fields, bit status message + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_status_packet(uint8_t built_in_type, void * statusWord) +{ + msg_params_t params; + + // build up the header of bit status + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_RESPONSE_PACKET; + params.priority = SAE_J1939_CONTROL_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_GLOBAL; + params.len = SAE_J1939_PAYLOAD_LEN_2_BYTES; + params.PS = gEcuConfigPtr->status_ps; + + return aceinna_j1939_build_msg((void *)statusWord, ¶ms); +} + +/** *************************************************************************** + * @name aceinna_j1939_send_packet_rate() repond SET odr request + * @brief perform ODR SET feature in spec 5.4.1 + * + * @param [in] target, host ecu object + * odr, requested by host + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_packet_rate(uint8_t odr) +{ + msg_params_t params; + uint8_t data[8]; + + // header message of response + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_RESPONSE_PACKET; + params.len = ACEINNA_SAE_J1939_PACKET_RATE_LEN; + params.priority = SAE_J1939_CONTROL_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_GLOBAL; + params.PS = gEcuConfigPtr->packet_rate_ps; + + // payload of response + data[0] = *(uint8_t *)gEcu->addr; + data[1] = odr; + + return aceinna_j1939_build_msg((void *)data, ¶ms); +} + + +/** *************************************************************************** + * @name aceinna_j1939_send_packet_type() repond SET packet type request + * @brief perform packet type SET feature in spec 5.4.2 + * + * @param [in] target, host ecu object + * type, ACEINNA_SAE_J1939_SLOPE_SENSOR_TYPE, + * ACEINNA_SAE_J1939_ANGULAR_RATE_TYPE, + * ACEINNA_SAE_J1939_ACCELERATOR_TYPE + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_packet_type(uint16_t type) +{ + msg_params_t params; + uint8_t data[8]; + + // header message of packet type response + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_RESPONSE_PACKET; + params.len = ACEINNA_SAE_J1939_PACKET_TYPE_LEN; + params.priority = SAE_J1939_CONTROL_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_GLOBAL; + params.PS = gEcuConfigPtr->packet_type_ps; + + // payload of packet type response + data[0] = *(uint8_t *)gEcu->addr; + data[1] = type & 0xff; + data[2] = (type >> 8) & 0xff; + + return aceinna_j1939_build_msg((void *)data, ¶ms); +} + + +/** *************************************************************************** + * @name aceinna_j1939_send_acceleration() acceleration data packet 61485 (0xF02D) +* @brief perform accelaration output in spec 5.6.3 + * + * @param [in] data, acceleration data type + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_acceleration(ACCELERATION_SENSOR * data) +{ + msg_params_t params; + + // header of acceleration packet + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_DATA_PACKET; + params.priority = SAE_J1939_ACCELERATION_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_DATA; + params.len = ACEINNA_SAE_J1939_ACCELERATION_LEN; + params.PS = SAE_J1939_GROUP_EXTENSION_ACCELERATION; + + return aceinna_j1939_build_msg((void *)data, ¶ms); +} + +/** *************************************************************************** + * @name aceinna_j1939_send_angular_rate() angular rate data packet 61482 (0xF02A) +* @brief perform angular rate output in spec 5.6.2 + * + * @param [in] data, angular rate data type + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_angular_rate(AUGULAR_RATE * data) +{ + msg_params_t params; + + // header of angular rate packet + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_DATA_PACKET; + params.priority = SAE_J1939_ANGULAR_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_DATA; + params.len = ACEINNA_SAE_J1939_ANGULAR_RATE_LEN; + params.PS = SAE_J1939_GROUP_EXTENSION_ANGULAR_RATE; + + return aceinna_j1939_build_msg((void *)data, ¶ms); +} + +/** *************************************************************************** + * @name aceinna_j1939_send_position() position data packet 65267 (0xfEf3) + * + * @param [in] data, position data type + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_GPS(GPS_DATA * data) +{ + msg_params_t params; + + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_DATA_PACKET; + params.priority = SAE_J1939_POSITION_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_254; + params.PS = SAE_J1939_PDU_SPECIFIC_243; + params.len = SAE_J1939_PAYLOAD_LEN_8_BYTES; + + return aceinna_j1939_build_msg((void *)data, ¶ms); +} + +/** *************************************************************************** + * @name aceinna_j1939_send_attitude() data packet + * @brief perform attitude output PGN 127257 (1 0xF119) + * + * @param [in] data, attitude data type + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_send_attitude(ATTITUDE_DATA * data) +{ + msg_params_t params; + + params.data_page = 1; + params.ext_page = 0; + params.pkt_type = SAE_J1939_DATA_PACKET; + params.priority = SAE_J1939_ATTITUDE_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_241; + params.PS = SAE_J1939_PDU_SPECIFIC_25; + params.len = SAE_J1939_PAYLOAD_LEN_8_BYTES; + + return aceinna_j1939_build_msg((void *)data, ¶ms); +} + +/** *************************************************************************** + * @name aceinna_j1939_build_msg() data packet + * + * @param [in] data, attitude data type + * @retval 1 successful or 0 failure + ******************************************************************************/ +uint8_t aceinna_j1939_build_msg(void *payload, msg_params_t *params) +{ + struct sae_j1939_tx_desc * desc; + + // check state machine + if (gEcu->state < _ECU_READY) + return 0; + + // get tx desc + if (find_tx_desc(&desc) == 0) + return 0; + + // header of acceleration packet + desc->tx_pkt_type = params->pkt_type; + desc->tx_identifier.control_bits.priority = params->priority; + desc->tx_identifier.control_bits.data_page = params->data_page; + desc->tx_identifier.control_bits.ext_page = params->ext_page; + desc->tx_identifier.pdu_format = params->PF; + desc->tx_identifier.pdu_specific = params->PS; + desc->tx_payload_len = params->len; + desc->tx_identifier.source = *(uint8_t *)gEcu->addr; + + desc->tx_buffer.tx_header.ExtId = ((desc->tx_identifier.r << 24) | + (desc->tx_identifier.pdu_format << 16) | + (desc->tx_identifier.pdu_specific << 8) | + (desc->tx_identifier.source)); + desc->tx_buffer.tx_header.IDE = CAN_ID_EXT; + desc->tx_buffer.tx_header.RTR = CAN_RTR_DATA; + desc->tx_buffer.tx_header.DLC = desc->tx_payload_len; + + // payload of position packet + memcpy((void *)desc->tx_buffer.data, (void *)payload, desc->tx_payload_len); + desc->tx_pkt_ready = DESC_OCCUPIED; + + return 1; +} + + + + + +/** *************************************************************************** + * @name is_valid_j1939_rcv() check incoming packets valid or not +* @brief a general API of received packets check + * + * @param [in] rx_desc, rx descriptor + * @retval ACEINNA_J1939_INVALID_IDENTIFIER, ACEINNA_J1939_IGNORE, ACEINNA_J1939_DATA, + * ACEINNA_J1939_ADDRESS_CLAIM, ACEINNA_J1939_CONFIG + ******************************************************************************/ +ACEINNA_J1939_PACKET_TYPE is_valid_j1939_rcv(struct sae_j1939_rx_desc *rx_desc) +{ + SAE_J1939_IDENTIFIER_FIELD *ident; + ACEINNA_J1939_PACKET_TYPE result; + + // check rx desc is NULL + if (rx_desc == NULL) + return ACEINNA_J1939_INVALID_IDENTIFIER; + + ident = &(rx_desc->rx_identifier); + + // valid identifier + if (!is_valid_sae_j1939_identifier(ident)) + return ACEINNA_J1939_INVALID_IDENTIFIER; + + // is aceinna data packet + result = is_aceinna_data_packet(ident); + if (result == ACEINNA_J1939_DATA) + return ACEINNA_J1939_IGNORE; + + // is data packet + result = is_algorithm_data_packet(ident); + if (result == ACEINNA_J1939_DATA) + goto end_j1939_rcv; + + // is address claim packet + result = is_valid_address_claim(ident); + if (result == ACEINNA_J1939_ADDRESS_CLAIM) + goto end_j1939_rcv; + + // is SET commands + result = is_valid_config_command(ident); + if (result == ACEINNA_J1939_CONFIG) + goto end_j1939_rcv; + + result = ACEINNA_J1939_REQUEST_PACKET; + +end_j1939_rcv: + + return result; +} + + +/** *************************************************************************** + * @name process_config_set() an API of processing SET commands + * @brief decode identifier of incoming SET commands + * + * @param [in] desc, rx descriptor + * @retval N/A + ******************************************************************************/ +void process_config_set(struct sae_j1939_rx_desc *desc) +{ + SAE_J1939_IDENTIFIER_FIELD *ident; + uint8_t pf_val, ps_val; + uint8_t *command; + + // check desc + if (desc == NULL) + return; + + // check identifier + ident = &(desc->rx_identifier); + if (ident == NULL) + return; + + // check commands + command = desc->rx_buffer.data; + if (command == NULL) + return; + + pf_val = ident->pdu_format; + ps_val = ident->pdu_specific; + + if (pf_val != SAE_J1939_PDU_FORMAT_GLOBAL) + return; + + process_ecu_commands(command, ps_val, ident->source); +} + +void ecu_transmit() +{ + struct sae_j1939_tx_desc *tx_desc; + uint8_t result; + + // place outgoing message into queue + tx_desc = gEcu->curr_tx_desc; + + while (tx_desc->next != gEcu->curr_tx_desc) + { + if (tx_desc->tx_pkt_ready == DESC_IDLE) { + tx_desc = tx_desc->next; + continue; + } + result = gEcu->xmit(tx_desc); + if (result != FALSE) { + tx_desc->tx_pkt_ready = DESC_IDLE; + tx_desc = tx_desc->next; + continue; + } + // always end up on busy unsent descriptor + gEcu->curr_tx_desc = tx_desc; + return; + } + +} + +/** *************************************************************************** + * @name ecu_process() an API of handler processing all the incoming J1939's message + * @brief decode the indentifier and ensure message valid + * + * @param [in] + * @retval N/A + ******************************************************************************/ +void ecu_process(void) +{ + struct sae_j1939_rx_desc *rx_desc = gEcu->curr_process_desc; + ACEINNA_J1939_PACKET_TYPE incoming_type; + ECU_ADDRESS_ENTRY ecu_entry; + + memcpy((void *)&ecu_entry.ecu_name, (void *)gEcu->name, 8); + ecu_entry.address = *gEcu->addr; + ecu_entry.status = _ECU_NORMAL; + ecu_entry.category = _ECU_MASTER; + + // check rx desc + if (rx_desc == NULL) + return; + + // decode and analyze identifier + while (rx_desc->rx_pkt_ready == DESC_OCCUPIED) { + rx_desc->rx_identifier.control_bits.priority = (rx_desc->rx_buffer.rx_header.ExtId >> 26) & 0x7; + rx_desc->rx_identifier.control_bits.data_page = (rx_desc->rx_buffer.rx_header.ExtId >> 24) & 0x1; + rx_desc->rx_identifier.pdu_format = (rx_desc->rx_buffer.rx_header.ExtId >> 16) & 0xff; + rx_desc->rx_identifier.pdu_specific = (rx_desc->rx_buffer.rx_header.ExtId >> 8) & 0xff; + rx_desc->rx_identifier.source = rx_desc->rx_buffer.rx_header.ExtId & 0xff; + + incoming_type = is_valid_j1939_rcv(rx_desc); + if ((incoming_type == ACEINNA_J1939_IGNORE) || + (incoming_type == ACEINNA_J1939_INVALID_IDENTIFIER)) { + rx_desc->rx_pkt_ready = DESC_IDLE; + rx_desc = rx_desc->next; + continue; + } + + // dispatch to message handler + switch (incoming_type) { + // address claim handler + case ACEINNA_J1939_ADDRESS_CLAIM: + process_address_claim(rx_desc); + break; + // request handler + case ACEINNA_J1939_REQUEST_PACKET: + process_request_packet(rx_desc); + break; + case ACEINNA_J1939_DATA: + process_data_packet(rx_desc); + break; + default: + // SET commands handler + process_config_set(rx_desc); + break; + } + + rx_desc->rx_pkt_ready = DESC_IDLE; + rx_desc = rx_desc->next; + } + + gEcu->curr_process_desc = rx_desc; + + return; +} + +/** *************************************************************************** + * @name aceinna_j1939_transmit_isr() an API of transmitting handler + * @brief manage transmitting queue + * + * @param [in] + * @retval N/A + ******************************************************************************/ +void aceinna_j1939_transmit_isr(void) +{ + ecu_transmit(); +} + +extern BOOL canStarted; +/** *************************************************************************** + * @name aceinna_j1939_receive_isr() an API of receiving handler + * @brief manage receiving queue + * + * @param [in] + * @retval N/A + ******************************************************************************/ +void aceinna_j1939_receive_isr(void) +{ + struct sae_j1939_rx_desc *desc; + + if(!canStarted){ + return; + } + + desc = gEcu->curr_rx_desc; + + // check current rx desc + if ((desc == NULL) || (desc->next == NULL) || (desc->rx_pkt_ready == DESC_OCCUPIED)){ + return; + } + + desc->rx_pkt_ready = DESC_OCCUPIED; + + if (desc->next->rx_pkt_ready == DESC_IDLE){ + gEcu->curr_rx_desc = gEcu->curr_rx_desc->next; + } + + return; +} diff --git a/Platform/CAN/src/taskCANcommunicationJ1939.c b/Platform/CAN/src/taskCANcommunicationJ1939.c new file mode 100644 index 0000000..1e231b2 --- /dev/null +++ b/Platform/CAN/src/taskCANcommunicationJ1939.c @@ -0,0 +1,127 @@ +/** *************************************************************************** + * @file taskCANCommunication.c + * @Author + * @date Aug, 2017 + * @brief Copyright (c) 2017 All Rights Reserved. + * + * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + * PARTICULAR PURPOSE. + * + ******************************************************************************/ + +#include "main.h" +#include "indices.h" +#include "platformAPI.h" +#include "calibrationAPI.h" +#include "osapi.h" + +// for can interface +#include "can.h" +#include "sae_j1939.h" +#include "user_message_can.h" +#include "user_config.h" + +#include "car_data.h" + +#define ADDRESS_CLAIM_RETRY 5 + +uint32_t packetRateCounter = 0; +uint32_t canLoopCounter = 0; +BOOL canStarted = FALSE; + + +/** *************************************************************************** + * @name TaskCANCommunication() CAN communication task + * @brief perform a thread of CAN transmission and receiving + * + * @param [in] + * @retval + ******************************************************************************/ +void TaskCANCommunicationJ1939(void const *argument) +{ + int res; + _ECU_BAUD_RATE baudRate = (_ECU_BAUD_RATE)gEcuConfig.baudRate; + int address = gEcuConfig.address; + BOOL finished; + + for (;;) { + if (gOdoConfigurationStruct.can_mode == 0) { + car_can_initialize(); + + while (1) + { + OS_Delay(1000); + if (gOdoConfigurationStruct.can_mode != 0) { + break; + } + } + + } else if (gOdoConfigurationStruct.can_mode == 1) { + can_config(1, baudRate); + + // initialize J1939 protocol stack + if (!(gEcuConfigPtr->ecu_name.words)) { + gEcuConfigPtr->ecu_name.bits.function = ACEINNA_SAE_J1939_FUNCTION; + gEcuConfigPtr->ecu_name.bits.manufacture_code = ACEINNA_SAE_J1939_MANUFACTURER_CODE; + gEcuConfigPtr->ecu_name.bits.identity_number = GetUnitSerialNum() & 0x1fffff; + } + + sae_j1939_initialize(baudRate, address); + + // deactivate semaphore if active + res = osSemaphoreWait(g_sem_can_data, 0); + // Main loop for the task + while( 1 ) + { + // wait for events from DACQ task + // Semaphore given at 100Hz + res = osSemaphoreWait(g_sem_can_data, 1000); + if(res != osOK){ + continue; + } + + canLoopCounter++; + + // Auto-detection + if (gEcuInst.state == _ECU_BAUDRATE_DETECT) { + canStartDetectRxIntCounter = canRxIntCounter; + finished = can_detect_baudrate(&baudRate); + if(!finished){ + continue; + } + gEcuInst.state = _ECU_CHECK_ADDRESS; + } + + canStarted = TRUE; + + // address claiming state + if ((gEcuInst.state == _ECU_CHECK_ADDRESS) || (gEcuInst.state == _ECU_WAIT_ADDRESS)|| !(canLoopCounter % 100)) { + if (canLoopCounter > ADDRESS_CLAIM_RETRY){ + gEcuInst.state = _ECU_READY; + } + send_address_claim(&gEcuInst); + } + // process incoming messages + ecu_process(); + + packetRateCounter++; + + if(packetRateCounter >= gEcuConfig.packet_rate){ + packetRateCounter = 0; + // prepare and send outgoing periodic data packets + // send periodic packets + enqeue_periodic_packets(); + } + + ecu_transmit(); + + if (gOdoConfigurationStruct.can_mode != 1) { + break; + } + } + } + } + +} diff --git a/Platform/CAN/src/user_message_can.c b/Platform/CAN/src/user_message_can.c new file mode 100644 index 0000000..31047c7 --- /dev/null +++ b/Platform/CAN/src/user_message_can.c @@ -0,0 +1,280 @@ + +#include "user_message_can.h" +#include "can.h" +#include "sae_j1939.h" +#include "sensorsAPI.h" +#include "user_config.h" +#include "app_version.h" +#include "gnss_data_api.h" +#include "ins_interface_API.h" + +/** *************************************************************************** + * @name process_request_packet() an API of processing request message + * @brief decode identifier of incoming request message + * + * @param [in] desc, rx descriptor + * @retval N/A + ******************************************************************************/ +void process_request_packet(void *dsc) +{ + struct sae_j1939_rx_desc *desc = (struct sae_j1939_rx_desc *)dsc; + SAE_J1939_IDENTIFIER_FIELD *ident; + uint8_t pf_val, req_pf_val, req_ps_val; + uint8_t *command; + uint8_t data[8]; + + // check desc + if (desc == NULL) + return; + + // check identifier + ident = &(desc->rx_identifier); + if (ident == NULL) + return; + + // check receiving buffer + if (desc->rx_buffer.rx_header.RTR || !desc->rx_buffer.rx_header.IDE || (desc->rx_buffer.rx_header.DLC != 3)) + return; + + // check commands + command = desc->rx_buffer.data; + if (command == NULL) + return; + + pf_val = ident->pdu_format; + req_pf_val = command[1]; + req_ps_val = command[2]; + + if (pf_val != SAE_J1939_PDU_FORMAT_REQUEST) + return; + + // dispatch the requests to the corresponding handlers + switch(req_pf_val) { + case SAE_J1939_PDU_FORMAT_254: + { + if (req_ps_val == SAE_J1939_GROUP_EXTENSION_SOFTWARE_VERSION){ + aceinna_j1939_send_software_version(); + } + } + break; + case SAE_J1939_PDU_FORMAT_ECU: + { + if (req_ps_val == SAE_J1939_GROUP_EXTENSION_ECU){ + aceinna_j1939_send_ecu_id(); + } + } + break; + case SAE_J1939_PDU_FORMAT_GLOBAL: + { + // pasket rate request + if ((req_ps_val == gEcuConfigPtr->packet_rate_ps)) { + aceinna_j1939_send_packet_rate(gEcuConfigPtr->packet_rate); + } + // pasket type request + else if ((req_ps_val == gEcuConfigPtr->packet_type_ps)) { + aceinna_j1939_send_packet_type(gEcuConfigPtr->packet_type); + } + } + break; + // address claim request + case SAE_J1939_PDU_FORMAT_ADDRESS_CLAIM: + process_request_pg(desc); + break; + default: + break; + } + + msg_params_t params; + struct sae_j1939_rx_desc *rx_desc = dsc; + + + + //Get version number + if (rx_desc->rx_identifier.pdu_format == SAE_J1939_PDU_FORMAT_254 && rx_desc->rx_identifier.pdu_specific == SAE_J1939_GROUP_EXTENSION_SOFTWARE_VERSION) + { + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_REQUEST_PACKET; + params.priority = SAE_J1939_REQUEST_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_254; + params.PS = SAE_J1939_GROUP_EXTENSION_SOFTWARE_VERSION; + params.len = SAE_J1939_PAYLOAD_LEN_5_BYTES; + data[0] = 1; + } + //get ECU ID + else if (rx_desc->rx_identifier.pdu_format == SAE_J1939_PDU_FORMAT_ECU && rx_desc->rx_identifier.pdu_specific == SAE_J1939_GROUP_EXTENSION_ECU) + { + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_REQUEST_PACKET; + params.priority = SAE_J1939_REQUEST_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_ECU; + params.PS = SAE_J1939_GROUP_EXTENSION_ECU; + params.len = SAE_J1939_PAYLOAD_LEN_8_BYTES; + data[0] = 1; + } + //get packet type + else if (rx_desc->rx_identifier.pdu_format == SAE_J1939_PDU_FORMAT_GLOBAL && rx_desc->rx_identifier.pdu_specific == SAE_J1939_GROUP_EXTENSION_PACKET_TYPE) + { + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_REQUEST_PACKET; + params.priority = SAE_J1939_REQUEST_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_GLOBAL; + params.PS = SAE_J1939_GROUP_EXTENSION_PACKET_TYPE; + params.len = SAE_J1939_REQUEST_LEN; + data[0] = 1; + } + //get packet rate + else if (rx_desc->rx_identifier.pdu_format == SAE_J1939_PDU_FORMAT_GLOBAL && rx_desc->rx_identifier.pdu_specific == SAE_J1939_GROUP_EXTENSION_PACKET_RATE) + { + params.data_page = 0; + params.ext_page = 0; + params.pkt_type = SAE_J1939_REQUEST_PACKET; + params.priority = SAE_J1939_REQUEST_PRIORITY; + params.PF = SAE_J1939_PDU_FORMAT_GLOBAL; + params.PS = SAE_J1939_GROUP_EXTENSION_PACKET_RATE; + params.len = SAE_J1939_PAYLOAD_LEN_2_BYTES; + data[0] = 1; + } + aceinna_j1939_build_msg((void *)data, ¶ms); +} + +/** *************************************************************************** + * @name process_data_packet() an API of processing data message + * @brief decode identifier of incoming data message + * + * @param [in] desc, rx descriptor + * @retval N/A + ******************************************************************************/ +void process_data_packet(void *dsc) +{ + +} + + +/** *************************************************************************** + * @name enqeue_periodic_packets() an API of data packet generation + * @brief build up MTLT's data packets and send out + * + * @param [in] + * @retval N/A + ******************************************************************************/ +void enqeue_periodic_packets(void) +{ + uint16_t packet_type = gEcuConfigPtr->packet_type; + + if (packet_type & ACEINNA_SAE_J1939_PACKET_ACCELERATION) { + ACCELERATION_SENSOR accel_sensor; + double accel[3]; + GetAccelData_mPerSecSq(accel); + accel_sensor.acceleration_x = (uint16_t)(accel[0] * 100 + 320); + accel_sensor.acceleration_y = (uint16_t)(accel[1] * 100 + 320); + accel_sensor.acceleration_z = (uint16_t)(accel[2] * 100 + 320); + aceinna_j1939_send_acceleration(&accel_sensor); + } + + if (packet_type & ACEINNA_SAE_J1939_PACKET_ANGULAR_RATE) { + AUGULAR_RATE rate_sensor; + float rate[3]; + GetRateData_degPerSec(rate); + rate_sensor.rate_x = (uint16_t)(rate[0] * 128 + 250); + rate_sensor.rate_y = (uint16_t)(rate[1] * 128 + 250); + rate_sensor.rate_z = (uint16_t)(rate[2] * 128 + 250); + aceinna_j1939_send_angular_rate(&rate_sensor); + } + + if (packet_type & ACEINNA_SAE_J1939_PACKET_LATLONG) { + GPS_DATA gps_data; +#ifdef INS_APP + if (get_mGnssInsSystem_mlc_STATUS() == 4){ + gps_data.latitude = get_ins_latitude() * 10000000; + gps_data.longitude = get_ins_longitude() * 10000000; + } else { + gps_data.latitude = get_ins_latitude() * RAD_TO_DEG * 10000000; + gps_data.longitude = get_ins_longitude() * RAD_TO_DEG * 10000000; + } +#else + gps_data.latitude = g_gnss_sol.latitude * RAD_TO_DEG * 10000000; + gps_data.longitude = g_gnss_sol.longitude * RAD_TO_DEG * 10000000; +#endif + aceinna_j1939_send_GPS(&gps_data); + } + +#ifdef INS_APP + if (packet_type & ACEINNA_SAE_J1939_PACKET_ATTITUDE) { + ATTITUDE_DATA attitude_data; + attitude_data.SID = 0; + attitude_data.Yaw = get_ins_azimuth() * DEG_TO_RAD * 10000; + attitude_data.Pitch = get_ins_pitch() * DEG_TO_RAD * 10000; + attitude_data.Roll = get_ins_roll() * DEG_TO_RAD * 10000; + aceinna_j1939_send_attitude(&attitude_data); + } +#endif +} + +/** *************************************************************************** + * @name process_ecu_commands +* @brief decode incoming SET packets and put the request into the corresponding + * handlers + * @param [in] command, SET request + * ps, pdu specific value + * addr, host address + * @retval 1 successfuk or 0 failure + ******************************************************************************/ +void process_ecu_commands(void * command, uint8_t ps, uint8_t addr) +{ + uint8_t* data = (uint8_t*)command; + BOOL ret; + + if (command == NULL) + return; + + switch (ps) + { + case SAE_J1939_GROUP_EXTENSION_SAVE_CONFIGURATION: + if (data[0] == ACEINNA_SAE_J1939_REQUEST && data[1] == gEcuConfigPtr->address) { + ret = SaveUserConfig(); + aceinna_j1939_send_cfgsave(addr, ret); + } + break; + case SAE_J1939_GROUP_EXTENSION_TEST_STATUS: + + break; + case SAE_J1939_GROUP_EXTENSION_PACKET_RATE: + if (data[0] == gEcuConfigPtr->address) { + gEcuConfigPtr->packet_rate = data[1] | (data[2] << 8); + set_can_packet_rate(gEcuConfigPtr->packet_rate); + } + break; + case SAE_J1939_GROUP_EXTENSION_PACKET_TYPE: + if (data[0] == gEcuConfigPtr->address) { + gEcuConfigPtr->packet_type = data[1]; + set_can_packet_type(gEcuConfigPtr->packet_type); + } + break; + default: + break; + } + +} + +/** *************************************************************************** + * @name can_config_filter_j1939 +* @brief configure CAN controller for selective reception of CAN messages +******************************************************************************/ +void can_config_filter_j1939(void) +{ + // initialize filter for ECU ID + can_config_filter_mask_message(SAE_J1939_ECU_ID_BASE, SAE_J1939_ECU_FILTER_BASE_MASK); + // initialize filter for control messages + can_config_filter_mask_message(SAE_J1939_CONTROL1_ID_BASE, SAE_J1939_CONTROL1_FILTER_BASE_MASK); + // initialize filter for requests + can_config_filter_mask_message(SAE_J1939_REQUEST_ID_BASE, SAE_J1939_REQUEST_FILTER_BASE_MASK); + // initialize filter for address claim + can_config_filter_mask_message(SAE_J1939_ADDRESS_CLAIM_ID_BASE, SAE_J1939_ADDRESS_CLAIM_FILTER_BASE_MASK); + // initialize filter for Bank 1 and Bank 0 commands + can_config_filter_mask_message(ACEINNA_BANK_ID_BASE, ACEINNA_BANK_FILTER_BASE_MASK); + // initialize Filter for incoming data messages + can_config_filter_mask_message(VEHICLE_DATA_ID_BASE, VEHICLE_DATA_FILTER_BASE_MASK); +} diff --git a/Platform/Core/include/parameters.h b/Platform/Core/include/parameters.h index 31db07b..a495416 100644 --- a/Platform/Core/include/parameters.h +++ b/Platform/Core/include/parameters.h @@ -18,7 +18,6 @@ #include "ucb_packet.h" #include -extern BOOL CheckPortUsage (ConfigurationStruct *proposedConfiguration) ; extern BOOL CheckPortBaudRate (uint16_t portBaudRate) ; extern BOOL CheckPacketRateDivider (uint16_t packetRateDivider) ; extern BOOL CheckContPacketRate (UcbPacketType outputPacket, uint16_t baudRate, uint16_t packetRateDivider) ; @@ -69,16 +68,10 @@ extern void SetFieldData (void) ; extern BOOL CheckOrientation (uint16_t orientation) ; extern void DefaultPortConfiguration (void); -extern BOOL CheckBaroCorrection(int32_t baroCorrection) ; extern BOOL WriteFieldData (void); -extern uint16_t appendAttitudeTrue (uint8_t *response, uint16_t index); -extern uint16_t appendCorrectedRates (uint8_t *response, uint16_t index) ; extern uint16_t appendAccels (uint8_t *response, uint16_t index); extern uint16_t appendChipAccels (uint8_t *response, uint16_t index, int chipId); -extern uint16_t appendCorrectedAccels (uint8_t *response, uint16_t index); -extern uint16_t appendTangentRates (uint8_t *response, uint16_t index); -extern uint16_t appendTangentAccels (uint8_t *response, uint16_t index); extern uint16_t appendRates (uint8_t *response, uint16_t index); extern uint16_t appendChipRates (uint8_t *response, uint16_t index, int chipId); extern uint16_t appendMagReadings (uint8_t *response, uint16_t index); @@ -88,10 +81,6 @@ extern uint16_t appendInertialCounts (uint8_t *response, uint16_t index); extern uint16_t appendMagnetometerCounts (uint8_t *response, uint16_t index); extern uint16_t appendAllTempCounts (uint8_t *response, uint16_t index); extern uint16_t appendRateTemp (uint8_t *response, uint16_t index); -extern uint16_t appendGpsVel (uint8_t *response, uint16_t index); -extern uint16_t appendGpsPos (uint8_t *response, uint16_t index); -uint16_t appendKalmanVel (uint8_t *response, uint16_t index); -uint16_t appendKalmanPos (uint8_t *response, uint16_t index); uint16_t appendTemp (uint8_t *response, uint16_t index); diff --git a/Platform/Core/include/ucb_packet.h b/Platform/Core/include/ucb_packet.h index 831ea3d..5db474f 100644 --- a/Platform/Core/include/ucb_packet.h +++ b/Platform/Core/include/ucb_packet.h @@ -76,6 +76,7 @@ typedef enum UCB_SOFTWARE_RESET, // 11 SR 0x5352 UCB_WRITE_CAL, // 12 WC 0x5743 UCB_READ_CAL, // 13 RC 0x5243 + UCB_WRITE_APP, // 14 WA 0x5743 UCB_J2BOOT, // 15 JB 0x4A42 UCB_J2IAP, // 16 JI 0x4A49 UCB_J2APP, // 17 JA 0x4A41 @@ -103,7 +104,7 @@ typedef enum #define UCB_VERSION_ALL_DATA_LENGTH 15 #define UCB_SCALED_0_LENGTH 30 #define UCB_SCALED_1_LENGTH 24 -#define UCB_SCALED_M_LENGTH 60 +#define UCB_SCALED_M_LENGTH 62 #define UCB_TEST_0_LENGTH 28 #define UCB_FACTORY_1_LENGTH 54 #define UCB_FACTORY_2_LENGTH 66 @@ -112,7 +113,7 @@ typedef enum /// UCB packet-specific utility functions ucb_packet.c extern UcbPacketType UcbPacketBytesToPacketType (const uint8_t bytes []); -extern void UcbPacketPacketTypeToBytes (UcbPacketType type, uint8_t bytes []); +extern BOOL UcbPacketPacketTypeToBytes (UcbPacketType type, uint8_t bytes []); extern BOOL UcbPacketIsAnInputPacket(UcbPacketType type); extern BOOL UcbPacketIsAnOutputPacket(UcbPacketType type); diff --git a/Platform/Core/src/configuration.c b/Platform/Core/src/configuration.c index 9b9f2e6..c6b4a5a 100644 --- a/Platform/Core/src/configuration.c +++ b/Platform/Core/src/configuration.c @@ -40,6 +40,7 @@ BOOL ValidPortConfiguration(ConfigurationStruct *proposedConfiguration); uint16_t configGetUsedChips(void) { return gConfiguration.usedChips;} uint16_t configGetActiveChips(void) { return gConfiguration.activeChips;} uint16_t configGetUsedSensors(int chipIdx) { return gConfiguration.usedSensors[chipIdx];} +void configSetUsedChips(uint8_t mask) { gConfiguration.usedChips = mask;} // placholders for Nav_view compatibility softwareVersionStruct dupFMversion; /// 525 digital processor DUP code base @@ -98,7 +99,7 @@ int32_t baudEnumToBaudRate(int baudEnum) ******************************************************************************/ static void _readConfigIntoMem () { - readEEPROMConfiguration(&gConfiguration); // s_eeprom.c + EEPROM_ReadFactoryConfiguration(&gConfiguration); // s_eeprom.c } /** **************************************************************************** @@ -133,9 +134,6 @@ void ApplyFactoryConfiguration(void) _readConfigIntoMem(); - - gBitStatus.swDataBIT.bit.calibrationCRCError = FALSE; - /// check user orientation field for validity and set defaults based on com // type if not valid xbow_fields.c // if (CheckOrientation(gConfiguration.orientation.all) == FALSE) { @@ -149,7 +147,6 @@ void ApplyFactoryConfiguration(void) /// check port configuration fields against rules // xbow_fields.c if (ValidPortConfiguration(&gConfiguration) == FALSE) { - memset(&gConfiguration, 0, sizeof(ConfigurationStruct)); DefaultPortConfiguration(); } @@ -173,6 +170,11 @@ void ApplyFactoryConfiguration(void) gConfiguration.activeChips = 7; } + for (uint16_t i = 0; i < 3; i++) { + if (gConfiguration.usedSensors[i] == 0) { + gConfiguration.usedSensors[i] = 0xffff; + } + } } diff --git a/Platform/Core/src/debug.c b/Platform/Core/src/debug.c index 41dbb0e..378661b 100644 --- a/Platform/Core/src/debug.c +++ b/Platform/Core/src/debug.c @@ -394,17 +394,17 @@ void itoa_64bit( int64_t value, char *sp, int radix ) } -static char buffer[500]; +// static char buffer[500]; -int tprintf(char *format, ...) -{ - int len; - va_list args; - va_start (args, format); - len = vsprintf (buffer,format, args); - va_end (args); - DebugPrintString(buffer); - - return len; -} +// int tprintf(char *format, ...) +// { +// int len; +// va_list args; +// va_start (args, format); +// len = vsprintf (buffer,format, args); +// va_end (args); +// DebugPrintString(buffer); + +// return len; +// } diff --git a/Platform/Core/src/handle_packet.c b/Platform/Core/src/handle_packet.c index e8e649b..71a3484 100644 --- a/Platform/Core/src/handle_packet.c +++ b/Platform/Core/src/handle_packet.c @@ -22,9 +22,7 @@ #include "eepromAPI.h" #include "crc16.h" #include "BITStatus.h" -#ifndef SENSOR_UNUSED - #include "calibrationAPI.h" -#endif +#include "calibrationAPI.h" #include "configurationAPI.h" #include "hwAPI.h" #include "platformAPI.h" @@ -33,7 +31,7 @@ #include "bsp.h" #include "commAPI.h" #include "uart.h" -//#include "s_eeprom.h" + static UcbPacketStruct primaryUcbPacket; /// all other data BOOL fReset = FALSE; @@ -307,14 +305,14 @@ void _UcbReadFields (uint16_t port, ptrUcbPacket->payload[(fieldCount * 4) + 1] = (uint8_t)((fieldId[fieldCount] >> 8) & 0xff); ptrUcbPacket->payload[(fieldCount * 4) + 2] = (uint8_t)( fieldId[fieldCount] & 0xff); - readEEPROMProdConfig( &fieldData); + EEPROM_ReadProdConfig( &fieldData); ptrUcbPacket->payload[(fieldCount * 4) + 3] = (uint8_t)((fieldData >> 8) & 0xff); ptrUcbPacket->payload[(fieldCount * 4) + 4] = (uint8_t)( fieldData & 0xff); } else { /// normal field, exists in configuration structure ptrUcbPacket->payload[(fieldCount * 4) + 1] = (uint8_t)((fieldId[fieldCount] >> 8) & 0xff); ptrUcbPacket->payload[(fieldCount * 4) + 2] = (uint8_t)( fieldId[fieldCount] & 0xff); /// read field from EEPROM - readEEPROMByte(fieldId[fieldCount], sizeof(fieldData), &fieldData); + EEPROM_ReadByte(fieldId[fieldCount], sizeof(fieldData), &fieldData); ptrUcbPacket->payload[(fieldCount * 4) + 3] = (uint8_t)((fieldData >> 8) & 0xff); ptrUcbPacket->payload[(fieldCount * 4) + 4] = (uint8_t)( fieldData & 0xff); } @@ -486,7 +484,7 @@ void _UcbReadEeprom (uint16_t port, UcbPacketStruct *ptrUcbPacket) /// verify that the packet length matches packet specification if (ptrUcbPacket->payloadLength == 3) { ptrUcbPacket->payloadLength = (uint8_t)(ptrUcbPacket->payloadLength + bytesToRead); - readEEPROMByte(startAddress, bytesToRead, &(ptrUcbPacket->payload[3])); + EEPROM_ReadByte(startAddress, bytesToRead, &(ptrUcbPacket->payload[3])); } else { _SetNak(port, ptrUcbPacket); } @@ -523,7 +521,7 @@ static void _UcbReadCal (uint16_t port, UcbPacketStruct *ptrUcbPacket) /// verify that the packet length matches packet specification if (ptrUcbPacket->payloadLength == 3) { ptrUcbPacket->payloadLength = (uint8_t)(ptrUcbPacket->payloadLength + bytesToRead); - readFromEEPROMCalPartition(startAddress, bytesToRead, &(ptrUcbPacket->payload[3])); + EEPROM_ReadFromCalPartition(startAddress, bytesToRead, &(ptrUcbPacket->payload[3])); } else { _SetNak(port, ptrUcbPacket); } @@ -564,7 +562,7 @@ void _UcbWriteEeprom (uint16_t port, gBitStatus.swDataBIT.bit.calibrationCRCError = TRUE; /// 0 means no errors - if (writeEEPROMWords(startAddress, + if (EEPROM_WriteWords(startAddress, wordsToWrite, &(ptrUcbPacket->payload[3])) == 0) { ptrUcbPacket->payloadLength = 3; @@ -604,7 +602,7 @@ void _UcbWriteCal (uint16_t port, /// verify that the packet length matches packet specification if (ptrUcbPacket->payloadLength == (bytesToWrite + 3)) { /// 0 means no errors - if (writeToEEPROMCalPartition(startAddress, bytesToWrite, + if (EEPROM_WriteToCalPartition(startAddress, bytesToWrite, &(ptrUcbPacket->payload[3])) != 0) { ptrUcbPacket->payloadLength = 3; } else { @@ -618,6 +616,47 @@ void _UcbWriteCal (uint16_t port, // RestoreDelay_Watchdog(); } +/** **************************************************************************** + * @name _UcbWriteApp + * @brief Write data as 16 bit cells into an unlocked EEPROM. + * + * @param [in] port - number request came in on, the reply will go out this port + * @param [out] packetPtr - data part of packet + * @retval N/A + ******************************************************************************/ +static void _UcbWriteApp (uint16_t port, UcbPacketStruct *ptrUcbPacket) +{ + uint32_t startAddress; + uint8_t wordsToWrite; + uint16_t bytesToWrite; +// packet structure +// header code payload len start addr numbytes crc +// 5555 5747 [x] [yyyy] [z] [payload] [cc] + startAddress = (uint32_t)((ptrUcbPacket->payload[0] << 24) | + ptrUcbPacket->payload[1] << 16 | + ptrUcbPacket->payload[2] << 8 | + ptrUcbPacket->payload[3]); + wordsToWrite = ptrUcbPacket->payload[4]; + bytesToWrite = (uint16_t)wordsToWrite; + +// SetMaxDelay_Watchdog(); + + /// verify that the packet length matches packet specification + if ((ptrUcbPacket->payloadLength == (bytesToWrite + 5))) { + + //if(!EEPROM_WriteApp(startAddress,&ptrUcbPacket->payload[5],bytesToWrite)){ //TODO: + if(EEPROM_WriteApp(startAddress,&ptrUcbPacket->payload[5],bytesToWrite)){ //TODO: + ptrUcbPacket->payloadLength = 5; + } else { + _SetNak(port, ptrUcbPacket); + } + } else { + _SetNak(port, ptrUcbPacket); + } + HandleUcbTx(port, ptrUcbPacket); +// RestoreDelay_Watchdog(); +} + /** **************************************************************************** * @name _UcbJump2BOOT * @brief @@ -630,8 +669,6 @@ void _UcbWriteCal (uint16_t port, ******************************************************************************/ static void _UcbJump2BOOT (uint16_t port, UcbPacketStruct *ptrUcbPacket) { - - forcedBootMode = TRUE; HandleUcbTx(port, ptrUcbPacket); DelayMs(10); if(platformIsInBootMode()){ @@ -654,27 +691,11 @@ static void _UcbJump2BOOT (uint16_t port, UcbPacketStruct *ptrUcbPacket) ******************************************************************************/ static void _UcbJump2APP (uint16_t port, UcbPacketStruct *ptrUcbPacket) { - - //BOOL sigValid = FALSE; -#if 0 -#ifndef BOOT_MODE - HandleUcbTx(port, ptrUcbPacket); - // nothing to do - already there - return; -#endif -#endif -#if 0 - sigValid = ApplyAppSignature(TRUE); - if(!sigValid){ - _SetNak(port, ptrUcbPacket); - } -#endif HandleUcbTx(port, ptrUcbPacket); DelayMs(10); //return; // if(sigValid) { - SaveAppFlag(); HW_EnforceAppMode(); HW_SystemReset(); } @@ -694,7 +715,6 @@ static void _Ucb_HARDWARE_TEST (uint16_t port, UcbPacketStruct *ptrUcbPacket) ResetForEnterBootMode(); DelayMs(10); { - // SaveAppFlag(); HW_HDTestMode(); HW_SystemReset(); } @@ -739,8 +759,6 @@ static void _SetNak (uint16_t port, UcbPacketStruct *ptrUcbPacket) /// return NAK, requested packet type placed in data field by external port ptrUcbPacket->packetType = UCB_NAK; - ptrUcbPacket->code_MSB = 0x15; - ptrUcbPacket->code_LSB = 0x15; ptrUcbPacket->payloadLength = UCB_PACKET_TYPE_LENGTH; } @@ -799,6 +817,8 @@ void HandleUcbPacket (UcbPacketStruct *ptrUcbPacket) _UcbReadCal(port, ptrUcbPacket); break; case UCB_SOFTWARE_RESET: _UcbSoftwareReset(port, ptrUcbPacket); break; + case UCB_WRITE_APP: + _UcbWriteApp(port, ptrUcbPacket); break; #ifndef BOOT_MODE case UCB_SET_FIELDS: _UcbSetFields(port, ptrUcbPacket); break; @@ -853,6 +873,13 @@ void HandleUcbPacket (UcbPacketStruct *ptrUcbPacket) * @param [Out] N/A * @retval N/A ******************************************************************************/ + +void handle_tcp_commands(void) +{ + HandleUcbRx (&primaryUcbPacket); +} + + void ProcessUserCommands (void) { /// check received packets and handle appropriately diff --git a/Platform/Core/src/parameters.c b/Platform/Core/src/parameters.c index 41a85fc..7179b87 100644 --- a/Platform/Core/src/parameters.c +++ b/Platform/Core/src/parameters.c @@ -22,24 +22,13 @@ #include "eepromAPI.h" #include "constants.h" #include "Indices.h" -#ifndef SENSOR_UNUSED - // #include "sensors_data.h" - #include "sensorsAPI.h" -#endif -#ifdef SENSOR_UNUSED - #include "bare_osapi.h" -#endif +#include "sensorsAPI.h" #include "stm32f4xx_hal.h" -#ifdef USE_ALGORITHM -#include "EKF_Algorithm.h" -#endif -UART_HandleTypeDef huart5; /// proposed configurations static ConfigurationStruct proposedRamConfiguration; static ConfigurationStruct proposedEepromConfiguration; ConfigurationStruct *proposedEepromConfigurationPtr = &proposedEepromConfiguration; -float GetUnitTemp(); static BOOL portConfigurationChanged; // port settings are to be changed @@ -133,18 +122,6 @@ BOOL CheckContPacketRate (UcbPacketType outputPacket, case UCB_IDENTIFICATION: bytesPerPacket += UCB_IDENTIFICATION_LENGTH; break; - case UCB_TEST_0: - bytesPerPacket += UCB_TEST_0_LENGTH; - break; - case UCB_FACTORY_1: - bytesPerPacket += UCB_FACTORY_1_LENGTH; - break; - case UCB_FACTORY_2: - bytesPerPacket += UCB_FACTORY_2_LENGTH; - break; - case UCB_FACTORY_M: - bytesPerPacket += UCB_FACTORY_M_LENGTH; - break; case UCB_VERSION_DATA: bytesPerPacket += UCB_VERSION_DATA_LENGTH; break; @@ -160,6 +137,19 @@ BOOL CheckContPacketRate (UcbPacketType outputPacket, case UCB_SCALED_M: bytesPerPacket += UCB_SCALED_M_LENGTH; break; + case UCB_TEST_0: + bytesPerPacket += UCB_TEST_0_LENGTH; + break; + case UCB_FACTORY_1: + bytesPerPacket += UCB_FACTORY_1_LENGTH; + break; + case UCB_FACTORY_2: + bytesPerPacket += UCB_FACTORY_2_LENGTH; + break; + case UCB_FACTORY_M: + bytesPerPacket += UCB_FACTORY_M_LENGTH; + break; + default: valid = FALSE; } @@ -483,7 +473,7 @@ uint8_t CheckEepromFieldData (uint8_t numFields, uint16_t fieldData [], uint16_t validFields []) { /// copy current EEPROM configuration - readEEPROMConfiguration(&proposedEepromConfiguration); + EEPROM_ReadFactoryConfiguration(&proposedEepromConfiguration); return CheckFieldData(&proposedEepromConfiguration, numFields, @@ -521,7 +511,7 @@ BOOL WriteFieldData (void) ptr++; ///< get past CRC at top /// write entire proposed configuration back to EEPROM - if (writeEEPROMByte(LOWER_CONFIG_ADDR_BOUND, // 0x1 + if (EEPROM_WriteByte(LOWER_CONFIG_ADDR_BOUND, // 0x1 NUM_CONFIG_FIELDS * // 0x2b - 1 - 2 = 0x28 = 40 byts SIZEOF_WORD, // 2 bytes (void *)ptr) == 0) { @@ -534,45 +524,6 @@ BOOL WriteFieldData (void) } /* end WriteFieldData */ -#ifdef USE_ALGORITHM -/** **************************************************************************** - * @name appendCorrectedRates - * @brief calculates the algorithm corrected angular rates and formats them for - * output. - * @author Darren Liccardo, Aug. 2005 - * @author Dong An, 2007,2008 - * Trace: [SDD_APPEND_CORRECTED_RATES <-- SRC_APPEND_CORRECTED_RATES] - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ - -uint16_t appendCorrectedRates (uint8_t *response, - uint16_t index) -{ - int16_t tmp; - - /// i = 0 - tmp = (int16_t) SCALE_BY_2POW16_OVER_7PI(gKalmanFilter.correctedRate_B[X_AXIS]); - index = uint16ToBuffer(response, - index, - tmp); - /// i = 1 - tmp = (int16_t) SCALE_BY_2POW16_OVER_7PI(gKalmanFilter.correctedRate_B[Y_AXIS]); - index = uint16ToBuffer(response, - index, - tmp); - /// i = 2 - tmp = (int16_t) SCALE_BY_2POW16_OVER_7PI(gKalmanFilter.correctedRate_B[Z_AXIS]); - index = uint16ToBuffer(response, - index, - tmp); - return index; -} -#endif // USE_ALGORITHM - -/* end appendCorrectedRates */ - /** **************************************************************************** * @name appendRates * @brief calculates the algorithm corrected angular @@ -590,7 +541,7 @@ uint16_t appendRates (uint8_t *response, int tmp; double rates[3]; - GetRateData_radPerSec_AsDouble(rates); + GetRateData_degPerSec_AsDouble(rates); /// X-Axis tmp = rates[0]*32768/630; @@ -665,40 +616,6 @@ uint16_t appendMagReadings( uint8_t *response, /* end appendMagReadings */ -/** **************************************************************************** - * @name appendTangentRates - * @brief formats the local level frame angular rates for output. - * Trace: [SDD_APPEND_TANGENT_RATES <-- SRC_APPEND_TANGENT_RATES] - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ -/* -uint16_t appendTangentRates (uint8_t *response, - uint16_t index) -{ - int tmp; - - /// X-axis - tmp = (int)(SCALE_BY_2POW16_OVER_7PI(gSensorsData.tangentRates[X_AXIS])); - index = uint16ToBuffer(response, - index, - tmp); - /// Y-axis - tmp = (int)(SCALE_BY_2POW16_OVER_7PI(gSensorsData.tangentRates[Y_AXIS])); - index = uint16ToBuffer(response, - index, - tmp); - /// Z-axis - tmp = (int)(SCALE_BY_2POW16_OVER_7PI(gSensorsData.tangentRates[Z_AXIS])); - index = uint16ToBuffer(response, - index, - tmp); - return index; -}*/ - /* end appendTangentRates */ - - /** **************************************************************************** * @name appendAccels @@ -761,90 +678,6 @@ uint16_t appendChipAccels (uint8_t *response, return index; } /* end appendAccels */ - -/** **************************************************************************** - * @name appendCorrectedAccels - * @brief calculates the algorithm corrected accelerations and formats them for - * output. - * @author Darren Liccardo, Aug. 2005 - * @author Dong An, 2007,2008 - * Trace: [SDD_APPEND_ACCELS <-- SRC_APPEND_ACCELS] - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ -/* -uint16_t appendCorrectedAccels (uint8_t *response, - uint16_t index) -{ - uint16_t tmp; - - /// X-Axis - tmp = _qmul( TWO_POW16_OVER_20_q19, - (int32_t)(gKalmanFilter.correctedAccel_B[XACCEL]*13681725.58613659), - 19, 27, 16 ) >> 16; - index = uint16ToBuffer(response, - index, - tmp); - /// Y-Axis - tmp = _qmul( TWO_POW16_OVER_20_q19, - (int32_t)(gKalmanFilter.correctedAccel_B[YACCEL]*13681725.58613659), - 19, 27, 16 ) >> 16; - index = uint16ToBuffer(response, - index, - tmp); - /// Z-Axis - tmp = _qmul( TWO_POW16_OVER_20_q19, - (int32_t)(gKalmanFilter.correctedAccel_B[ZACCEL]*13681725.58613659), - 19, 27, 16 ) >> 16; - index = uint16ToBuffer(response, - index, - tmp); - return index; -}*/ -/* end appendAccels */ - -/** **************************************************************************** - * @name appendTangentAccels - * @brief calculates Along Heading Acceleration, Cross Heading Acceleration and - * Vertical Acceleration for ARINC705, and formats them for output. - * Trace: [SDD_APPEND_ACCELS <-- SRC_APPEND_ACCELS] - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ -/* -uint16_t appendTangentAccels (uint8_t *response, - uint16_t index) -{ - int tmp; - double aHcHvAccel[3]; - - aHcHvAccel[X_AXIS] = gSensorsData.tangentAccels[X_AXIS]; - aHcHvAccel[Y_AXIS] = gSensorsData.tangentAccels[Y_AXIS]; - aHcHvAccel[Z_AXIS] = -(gSensorsData.tangentAccels[Z_AXIS] + 1.0); - - /// X-Axis - tmp = (int)( SCALE_BY_2POW16_OVER_20( aHcHvAccel[X_AXIS] ) ); - index = uint16ToBuffer(response, - index, - tmp); - /// Y-Axis - tmp = (int)( SCALE_BY_2POW16_OVER_20( aHcHvAccel[Y_AXIS] ) ); - index = uint16ToBuffer(response, - index, - tmp); - /// Z-Axis - tmp = (int)( SCALE_BY_2POW16_OVER_20( aHcHvAccel[Z_AXIS] ) ); - index = uint16ToBuffer(response, - index, - tmp); - return index; -}*/ - -/* end appendTangentAccels */ - - /** **************************************************************************** * @name appendRateTemp * @brief formats rate and board temperature data for output. @@ -882,7 +715,7 @@ uint16_t appendRateTemp (uint8_t *response, /** **************************************************************************** - * @name appendRateTemp + * @name appendChipTemps * @brief formats rate and board temperature data for output. * @author Darren Liccardo, Dec. 2005 * @author Dong An, 2007,2008 @@ -899,7 +732,7 @@ uint16_t appendChipTemps (uint8_t *response, float ftmp; ftmp = GetChipTemp(chipId); - ftmp *= 327.68; + ftmp *= 300.0; // ftmp *= 327.68; tmp = (int16_t)ftmp; index = uint16ToBuffer(response, index, tmp); @@ -935,8 +768,8 @@ uint16_t appendTemps (uint8_t *response, // } // Convert to scaled output T { degC ] * ( 2^16/200 ) - ftmp = GetUnitTemp(); - ftmp *= 327.68; + ftmp = GetUnitTemp(); + ftmp *= 300.0; // ftmp *= 327.68; tmp = (int16_t)ftmp; for(int i = 0; i < 4; i++){ @@ -963,50 +796,12 @@ uint16_t appendTemp (uint8_t *response, uint16_t index) // Convert to scaled output T { degC ] * ( 2^16/200 ) ftmp = GetUnitTemp(); - ftmp *= 327.68; + ftmp *= 300.0; // ftmp *= 327.68; tmp = (int16_t)ftmp; index = uint16ToBuffer(response, index, tmp); return index; } /*end appendTemps */ -/** **************************************************************************** - * @name appendAttitudeTrue - * @brief calculates roll, pitch, and true heading and formats them for output. - * @author Darren Liccardo, Dec. 2005 - * @author Dong An, 2007,2008 - * Trace: [SDD_APPEND_ATTITUDE_TRUE <-- SRC_APPEND_ATTITUDE_TRUE] - * [SDD_APPEND_TEMPS_02 <-- SRC_APPEND_TEMPS] - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ -#ifdef USE_ALGORITHM - -uint16_t appendAttitudeTrue (uint8_t *response, - uint16_t index) -{ - int16_t tmp; - - // X-Axis (angle in radians - tmp = (int16_t) SCALE_BY_2POW16_OVER_2PI(gKalmanFilter.eulerAngles[ROLL]); - index = uint16ToBuffer(response, - index, - tmp); - /// Y-Axis - tmp = (int16_t) SCALE_BY_2POW16_OVER_2PI(gKalmanFilter.eulerAngles[PITCH]); - index = uint16ToBuffer(response, - index, - tmp); - /// Z-Axis - tmp = (int16_t) SCALE_BY_2POW16_OVER_2PI(gKalmanFilter.eulerAngles[YAW]); - index = uint16ToBuffer(response, - index, - tmp); - return index; -} -#endif // USE_ALGORITHM - -/* end appendAttitudeTrue */ /** **************************************************************************** * @name appendInertialCounts @@ -1146,146 +941,6 @@ uint16_t appendAllTempCounts (uint8_t *response, return index; } /* end appendAllTempCounts */ -/** **************************************************************************** - * @name appendGpsVel - * @brief Add GPS North East and Down velocities to message - * @author Doug Hiranaka, 2014 - * Trace: - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ -/* -uint16_t appendGpsVel (uint8_t *response, - uint16_t index) -{ - uint16_t temp = 0; - - /// North - temp = (uint16_t)SCALE_BY_2POW16_OVER_512(gGpsDataPtr->vNed[GPS_NORTH]); - index = uint16ToBuffer(response, - index, - temp); - /// East - temp = (uint16_t)SCALE_BY_2POW16_OVER_512(gGpsDataPtr->vNed[GPS_EAST]); - index = uint16ToBuffer(response, - index, - temp); - /// Down - temp = (uint16_t)SCALE_BY_2POW16_OVER_512(gGpsDataPtr->vNed[GPS_DOWN]); - index = uint16ToBuffer(response, - index, - temp); - return index; -} -*/ -/* end appendGpsVel */ - - -/** **************************************************************************** - * @name appendKalmanVel - * @brief Add North East and Down velocities from the EKF to message - * @author t. malerich - * Trace: - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ -/* -uint16_t appendKalmanVel(uint8_t *response, - uint16_t index) -{ - /// North - uint16_t temp = (uint16_t)SCALE_BY_2POW16_OVER_512(gKalmanFilter.Velocity_N[GPS_NORTH]); - index = uint16ToBuffer(response, - index, - temp); - /// East - temp = (uint16_t)SCALE_BY_2POW16_OVER_512(gKalmanFilter.Velocity_N[GPS_EAST]); - index = uint16ToBuffer(response, - index, - temp); - /// Down - temp = (uint16_t)SCALE_BY_2POW16_OVER_512(gKalmanFilter.Velocity_N[GPS_DOWN]); - index = uint16ToBuffer(response, - index, - temp); - return index; -} -*/ -/* end appendKalmanVel */ - - -/** **************************************************************************** - * @name appendGpsPos - * @brief Add GPS Latitude, longitude and Altitude (elevation) to message - * @author Doug Hiranaka, 2014 - * Trace: - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ -/* -uint16_t appendGpsPos (uint8_t *response, - uint16_t index) -{ - int16_t temp16 = 0; - int32_t temp32 = 0; - - /// Longitude - temp32 = (int32_t) SCALE_BY_2POW32_OVER_2PI(gGpsDataPtr->lonSign * gGpsDataPtr->lon * D2R); - index = uint32ToBuffer(response, - index, - temp32); - /// Latitude - temp32 = (int32_t) SCALE_BY_2POW32_OVER_2PI(gGpsDataPtr->latSign * gGpsDataPtr->lat * D2R) ; - index = uint32ToBuffer(response, - index, - temp32); - /// Down - temp16 = (int16_t) SCALE_BY_2POW16_OVER_2POW14(gGpsDataPtr->alt); - index = uint16ToBuffer(response, - index, - temp16); - return index; -} -*/ -/* end appendGpsPos */ - - -/** **************************************************************************** - * @name appendKalmanPos - * @brief Add EKF Latitude, longitude and Altitude (elevation) to message - * @author t. malerich - * Trace: - * @param [in] response - points to the beginning of the packet array. - * @param [in] index - response[index] is where data is added. - * @retval modified index to next avaliable response buffer location. - ******************************************************************************/ -/* -uint16_t appendKalmanPos(uint8_t *response, - uint16_t index) -{ - /// Longitude - int32_t temp32 = (int32_t) SCALE_BY_2POW32_OVER_2PI(gKalmanFilter.llaDeg[LON_IDX] * D2R); - index = uint32ToBuffer(response, - index, - temp32); - /// Latitude - temp32 = (int32_t) SCALE_BY_2POW32_OVER_2PI(gKalmanFilter.llaDeg[LAT_IDX] * D2R) ; - index = uint32ToBuffer(response, - index, - temp32); - /// altitude - int16_t temp16 = (int16_t) SCALE_BY_2POW16_OVER_2POW14(gKalmanFilter.llaDeg[ALT_IDX]); - index = uint16ToBuffer(response, - index, - temp16); - return index; -} -*/ - /* end appendKalmanPos */ - /** **************************************************************************** * @name uint32ToBuffer diff --git a/Platform/Core/src/platform.c b/Platform/Core/src/platform.c index 469d358..b9a03c7 100644 --- a/Platform/Core/src/platform.c +++ b/Platform/Core/src/platform.c @@ -98,4 +98,13 @@ void platformSetMode(BOOL isBoot) bootMode = isBoot; } +void platformGetVersionBytes(uint8_t *bytes) +{ + bytes[0] = (uint8_t)VERSION_MAJOR_NUM; + bytes[1] = (uint8_t)VERSION_MINOR_NUM; + bytes[2] = (uint8_t)VERSION_PATCH_NUM; + bytes[3] = (uint8_t)VERSION_STAGE_NUM; + bytes[4] = (uint8_t)VERSION_BUILD_NUM; +} + /*end void initConfigureUnit(void) */ diff --git a/Platform/Core/src/send_packet.c b/Platform/Core/src/send_packet.c index c4766b3..ae1dce7 100644 --- a/Platform/Core/src/send_packet.c +++ b/Platform/Core/src/send_packet.c @@ -42,6 +42,20 @@ #include "sensorsAPI.h" #include "user_message.h" #include "Indices.h" +#include "app_version.h" +#include "cJSON.h" +#include "user_config.h" +#include "uart.h" +#include "spi.h" +#include +#include "tcp_driver.h" + + +#ifdef INS_APP +#include "ins_interface_API.h" +// #include "insoutmsg.h" +// extern GnssInsSystem mGnssInsSystem; +#endif void _UcbIdentification(uint16_t port, UcbPacketStruct *ptrUcbPacket); void _UcbVersionData(uint16_t port, UcbPacketStruct *ptrUcbPacket); @@ -57,6 +71,12 @@ uint8_t divideCount = 200; /// continuous packet rate divider - set initial dela static UcbPacketStruct continuousUcbPacket; +uint8_t debug_com_log_on = 0; +uint32_t debug_p1_log_delay = 0; + +extern void sendP1Packet(uint8_t gps_update); + + /** **************************************************************************** * @name _UcbIdentification send ID packet * @brief @@ -295,6 +315,10 @@ void _UcbScaledM(uint16_t port, packetIndex = uint16ToBuffer(ptrUcbPacket->payload, /// sampleIdx packetIndex, sampleIdx++); + + packetIndex = uint16ToBuffer(ptrUcbPacket->payload, /// BIT status + packetIndex, + gBitStatus.BITStatus.all ); if (platformGetUnitCommunicationType() == UART_COMM) { @@ -508,11 +532,95 @@ void SendUcbPacket(uint16_t port, } } + +void debug_com_rx_data_handle(void) +{ + uint8_t dataBuffer[512]; + int bytes_in_buffer = 0; + cJSON *root, *fmt; + char *out; + + bytes_in_buffer = uart_read_bytes(UART_DEBUG, dataBuffer, sizeof(dataBuffer), 0); + if (bytes_in_buffer > 0){ + if (strstr((const char*)dataBuffer, "get configuration\r\n") != NULL) + { + root = cJSON_CreateObject(); + cJSON_AddItemToObject(root, "openrtk configuration", fmt = cJSON_CreateObject()); + cJSON_AddItemToObject(fmt, "Product Name", cJSON_CreateString(PRODUCT_NAME_STRING)); + cJSON_AddItemToObject(fmt, "Product PN", cJSON_CreateString((const char *)platformBuildInfo())); + cJSON_AddItemToObject(fmt, "Product SN", cJSON_CreateNumber(GetUnitSerialNum())); + cJSON_AddItemToObject(fmt, "Version", cJSON_CreateString(APP_VERSION_STRING)); + + uint8_t *user_packet_type = get_user_packet_type(); + char packet_type_str[5] = {0}; + packet_type_str[0] = user_packet_type[0]; + packet_type_str[1] = user_packet_type[1]; + + uint16_t user_packet_rate = get_user_packet_rate(); + + cJSON_AddItemToObject(fmt, "userPacketType", cJSON_CreateString(packet_type_str)); + cJSON_AddItemToObject(fmt, "userPacketRate", cJSON_CreateNumber(user_packet_rate)); + + float *ins_para = get_user_ins_para(); + cJSON_AddItemToObject(fmt, "leverArmBx", cJSON_CreateNumber(*ins_para)); + cJSON_AddItemToObject(fmt, "leverArmBy", cJSON_CreateNumber(*(ins_para + 1))); + cJSON_AddItemToObject(fmt, "leverArmBz", cJSON_CreateNumber(*(ins_para + 2))); + cJSON_AddItemToObject(fmt, "pointOfInterestBx", cJSON_CreateNumber(*(ins_para + 3))); + cJSON_AddItemToObject(fmt, "pointOfInterestBy", cJSON_CreateNumber(*(ins_para + 4))); + cJSON_AddItemToObject(fmt, "pointOfInterestBz", cJSON_CreateNumber(*(ins_para + 5))); + cJSON_AddItemToObject(fmt, "rotationRbvx", cJSON_CreateNumber(*(ins_para + 6))); + cJSON_AddItemToObject(fmt, "rotationRbvy", cJSON_CreateNumber(*(ins_para + 7))); + cJSON_AddItemToObject(fmt, "rotationRbvz", cJSON_CreateNumber(*(ins_para + 8))); + + out = cJSON_Print(root); + cJSON_Delete(root); + + uart_write_bytes(UART_DEBUG, out, strlen(out), 1); + free(out); + debug_com_log_on = 0; + } + if (strstr((const char*)dataBuffer, "log debug on\r\n") != NULL) + { + debug_com_log_on = 1; + debug_p1_log_delay = 100; + } + } +} + void send_gnss_data(void) { uint8_t type [UCB_PACKET_TYPE_LENGTH]; - obs_t* ptr_rover_obs = &g_ptr_gnss_data->rov; +#ifdef INS_APP + if (checkUserOutPacketType(gConfiguration.packetCode) == UCB_USER_OUT){ + if (get_mGnssInsSystem_mlc_STATUS() == 4 || g_gnss_sol.gnss_update == 1){ + // pS 0x7053 + type[0] = 0x70; + type[1] = 0x53; + continuousUcbPacket.packetType = UcbPacketBytesToPacketType(type); + SendUcbPacket(UART_USER, &continuousUcbPacket); + } + + if (g_gnss_sol.gnss_update == 1){ + //sK 0x734B + type[0] = 0x73; + type[1] = 0x4B; + continuousUcbPacket.packetType = UcbPacketBytesToPacketType(type); + + uint8_t snum; + // skyview data may more than one packet + snum = g_ptr_gnss_sol->rov_n / 10; + if (g_ptr_gnss_sol->rov_n % 10 != 0){ + snum++; + } + + for (uint8_t i = 0; i < snum; i++){ + SendUcbPacket(UART_USER, &continuousUcbPacket); + } + } + } + g_gnss_sol.gnss_update = 0; +#else if (g_gnss_sol.gnss_update == 1){ if (checkUserOutPacketType(gConfiguration.packetCode) == UCB_USER_OUT){ // pS 0x7053 @@ -525,17 +633,28 @@ void send_gnss_data(void) type[0] = 0x73; type[1] = 0x4B; continuousUcbPacket.packetType = UcbPacketBytesToPacketType(type); + + uint8_t snum; // skyview data may more than one packet - uint8_t snum = ptr_rover_obs->n / 10; - if (ptr_rover_obs->n % 10 != 0){ - snum++; + if (strstr(APP_VERSION_STRING, "RAWDATA")){ + snum = g_ptr_gnss_data->rov.n / 10; + if (g_ptr_gnss_data->rov.n % 10 != 0){ + snum++; + } + } else{ + snum = g_ptr_gnss_sol->rov_n / 10; + if (g_ptr_gnss_sol->rov_n % 10 != 0){ + snum++; + } } + for (uint8_t i = 0; i < snum; i++){ SendUcbPacket(UART_USER, &continuousUcbPacket); } } g_gnss_sol.gnss_update = 0; } +#endif } /** **************************************************************************** @@ -553,15 +672,180 @@ void send_gnss_data(void) * @param [Out] N/A * @retval N/A ******************************************************************************/ +extern client_s driver_data_client; +static void fill_imu_data() +{ + double accel_g[3]; + float rate_dps[3]; + char sum = 0; + uint8_t imu_data_buf[500] = {0}; + GetAccelData_mPerSecSq(accel_g); + GetRateData_degPerSec(rate_dps); + double gga_time = get_gnss_time(); + int data_len = sprintf((char*)imu_data_buf,"$GPIMU,%6.2f,%14.4f,%14.4f,%14.4f,%14.4f,%14.4f,%14.4f,", \ + gga_time,accel_g[0], accel_g[1],accel_g[2], \ + rate_dps[0],rate_dps[1],rate_dps[2]); + for(int i = 0;i < data_len;i++) + { + sum ^= imu_data_buf[i]; + } + int end_len = sprintf((char*)imu_data_buf + strlen((char*)imu_data_buf),"%02x\r\n",sum); + if (debug_com_log_on) { + uart_write_bytes(UART_DEBUG,(const char*)imu_data_buf,data_len + end_len,1); + } + if(get_tcp_data_driver_state() == CLIENT_STATE_INTERACTIVE) + { + //driver_data_push((const char*)imu_data_buf,data_len + end_len); + client_write_data(&driver_data_client,(const char*)imu_data_buf,data_len + end_len,0x01); + } +} + + +#ifdef INCEPTIO +static UcbPacketStruct inceptioUcbPacket; +uint8_t rawimuPacketDivide = 0; +uint8_t inspvaPacketDivide = 0; +uint8_t insstdPacketDivide = 0; +uint8_t bestgnssPacketDivide = 0; +uint8_t rawimuPacketRate = 0; +uint8_t inspvaPacketRate = 0; +uint8_t insstdPacketRate = 0; +uint8_t bestgnssPacketRate = 0; + +#endif +uint8_t spi_buff[SPI_BUF_SIZE]; + void SendContinuousPacket(void) { - uint8_t type [UCB_PACKET_TYPE_LENGTH]; + uint8_t type[UCB_PACKET_TYPE_LENGTH]; + +#ifdef INCEPTIO + // come here 100Hz + static char s1_buff[50] = {0}; + static char iN_buff[50] = {0}; + static char d1_buff[50] = {0}; + static char gN_buff[50] = {0}; + static char sT_buff[20] = {0}; + static char s1_len = 43,iN_len = 45,d1_len = 37,gN_len = 45,sT_len = 19; + + // RAWIMU s1 + if (rawimuPacketRate != PACKET_RATE_QUIET && mGnssInsSystem.mlc_STATUS == INS_FUSING) { + if (rawimuPacketDivide >= rawimuPacketRate) { + gConfiguration.packetCode = 0x7331; + type[0] = 0x73; + type[1] = 0x31; + inceptioUcbPacket.packetType = UcbPacketBytesToPacketType(type); + SendUcbPacket(UART_USER, &inceptioUcbPacket); + rawimuPacketDivide = 1; + + memset(s1_buff,0,50); + memcpy((char *)s1_buff,(const char *)&inceptioUcbPacket.sync_MSB, inceptioUcbPacket.payloadLength + 7); + s1_len = inceptioUcbPacket.payloadLength + 7; + } else { + rawimuPacketDivide++; + } + } + + // INSPVA iN + if (inspvaPacketRate != PACKET_RATE_QUIET) { + if (inspvaPacketDivide >= inspvaPacketRate) { + gConfiguration.packetCode = 0x694E; + type[0] = 0x69; + type[1] = 0x4E; + inceptioUcbPacket.packetType = UcbPacketBytesToPacketType(type); + SendUcbPacket(UART_USER, &inceptioUcbPacket); + inspvaPacketDivide = 1; + + memset(iN_buff,0,50); + memcpy((char *)iN_buff,(const char *)&inceptioUcbPacket.sync_MSB, inceptioUcbPacket.payloadLength + 7); + iN_len = inceptioUcbPacket.payloadLength + 7; + } else { + inspvaPacketDivide++; + } + } + + // INSSTD d1 + if (insstdPacketRate != PACKET_RATE_QUIET) { + if (insstdPacketDivide >= insstdPacketRate) { + gConfiguration.packetCode = 0x6431; + type[0] = 0x64; + type[1] = 0x31; + inceptioUcbPacket.packetType = UcbPacketBytesToPacketType(type); + SendUcbPacket(UART_USER, &inceptioUcbPacket); + insstdPacketDivide = 1; + + memset(d1_buff,0,50); + memcpy((char *)d1_buff,(const char *)&inceptioUcbPacket.sync_MSB, inceptioUcbPacket.payloadLength + 7); + d1_len = inceptioUcbPacket.payloadLength + 7; + } else { + insstdPacketDivide++; + } + } + + // BESTGNSS gN + // if (bestgnssPacketRate != PACKET_RATE_QUIET) { + // if (bestgnssPacketDivide >= bestgnssPacketRate) { + // 1Hz + if (g_gnss_sol.gnss_update == 1) { + gConfiguration.packetCode = 0x674E; + type[0] = 0x67; + type[1] = 0x4E; + inceptioUcbPacket.packetType = UcbPacketBytesToPacketType(type); + SendUcbPacket(UART_USER, &inceptioUcbPacket); + + g_gnss_sol.gnss_update = 0; + memset(gN_buff,0,50); + memcpy((char *)gN_buff,(const char *)&inceptioUcbPacket.sync_MSB, inceptioUcbPacket.payloadLength + 7); + gN_len = inceptioUcbPacket.payloadLength + 7; + } + // bestgnssPacketDivide = 1; + // } else { + // bestgnssPacketDivide++; + // } + // } +//STATUS sT + gConfiguration.packetCode = 0x7354; + type[0] = 0x73; + type[1] = 0x54; + inceptioUcbPacket.packetType = UcbPacketBytesToPacketType(type); + SendUcbPacket(UART_USER, &inceptioUcbPacket); + + memset(sT_buff,0,20); + memcpy((char *)sT_buff,(const char *)&inceptioUcbPacket.sync_MSB, inceptioUcbPacket.payloadLength + 7); + sT_len = inceptioUcbPacket.payloadLength + 7; + + memset(spi_buff,0,SPI_BUF_SIZE); + memcpy((char *)spi_buff,s1_buff,s1_len); + memcpy((char *)spi_buff+s1_len,iN_buff,iN_len); + memcpy((char *)spi_buff+s1_len+iN_len,d1_buff,d1_len); + memcpy((char *)spi_buff+s1_len+iN_len+d1_len,gN_buff,gN_len); + memcpy((char *)spi_buff+s1_len+iN_len+d1_len+gN_len,sT_buff,sT_len); + // uart_write_bytes(UART_DEBUG,(char *)spi_buff,170+19,1); + spi_ready_flag ++; + if (spi_ready_flag >= 2) + { + spi_ready_flag = 1; + MX_SPI5_Init(); + } + + DRDY_ON(); + +#else + +#ifdef INS_APP + // 100Hz + uint16_t divider = configGetPacketRateDivider(gConfiguration.packetRateDivider); + if (divider != 0 && divider < 2) { + divider = 2; + } + divider = divider / 2; +#else uint16_t divider = 1; - //uint16_t divider = configGetPacketRateDivider(gConfiguration.packetRateDivider); +#endif if (divider != 0) { ///< check for quiet mode if (divideCount == 1) { - gConfiguration.packetCode = 0x7331; //s1 + // gConfiguration.packetCode = 0x5331; //s1 7331 /// get enum for requested continuous packet type type[0] = (uint8_t)((gConfiguration.packetCode >> 8) & 0xff); type[1] = (uint8_t)(gConfiguration.packetCode & 0xff); @@ -569,14 +853,83 @@ void SendContinuousPacket(void) /// set continuous output packet type based on configuration continuousUcbPacket.packetType = UcbPacketBytesToPacketType(type); SendUcbPacket(UART_USER, &continuousUcbPacket); - +#ifdef DEBUG_ALL + fill_imu_data(); +#endif divideCount = divider; } else { --divideCount; } } - // send 'pS' packet and 'sK' packet, will display in the web GUI through python driver // need to fill the data in 'Fill_posPacketPayload' and 'Fill_skyviewPacketPayload' send_gnss_data(); -} + +#ifndef RAW_APP + if(nema_update_flag) + { +#ifdef INS_APP + +#ifdef USER_INS_NMEA + if (strlen(ggaBuff) == 0) { + uart_write_bytes(UART_USER, (char *)gga_buff, strlen(gga_buff), 1); + uart_write_bytes(UART_USER, (char *)rmc_buff, strlen(rmc_buff), 1); + } +#else + if (strlen(ggaBuff) == 0) { + uart_write_bytes(UART_USER, (char *)gga_buff, strlen(gga_buff), 1); + } else { + uart_write_bytes(UART_USER, (char *)ggaBuff, strlen(ggaBuff), 1); + } + uart_write_bytes(UART_USER, (char *)rmc_buff, strlen(rmc_buff), 1); +#endif + +#else + uart_write_bytes(UART_USER, (char *)gga_buff, strlen(gga_buff), 1); + uart_write_bytes(UART_USER, (char *)rmc_buff, strlen(rmc_buff), 1); +#endif + + uart_write_bytes(UART_USER, (char *)gsa_buff, strlen(gsa_buff), 1); + uart_write_bytes(UART_USER, (char *)zda_buff, strlen(zda_buff), 1); + nema_update_flag = 0; + } +#else + if(nema_update_flag) + { + double ecef[3]; + ecef[0] = g_gnss_sol.pos_ecef[0]; + ecef[1] = g_gnss_sol.pos_ecef[1]; + ecef[2] = g_gnss_sol.pos_ecef[2]; + + gtime_t time = gpst2time(g_gnss_sol.gps_week, g_gnss_sol.gps_tow*0.001); + print_rmc(time, ecef,1, rmc_buff); + print_gsv((unsigned char *)gsv_buff,1,sky_view_ptr); + + uart_write_bytes(UART_USER, (char *)gga_buff, strlen(gga_buff), 1); + uart_write_bytes(UART_USER, (char *)rmc_buff, strlen(rmc_buff), 1); + uart_write_bytes(UART_USER, (char *)gsv_buff, strlen(gsv_buff), 1); + nema_update_flag = 0; + } +#endif + +#endif +} + +void debug_com_process(void) +{ + if (uart_sem_wait(UART_DEBUG, 0) == RTK_SEM_OK){ + debug_com_rx_data_handle(); + } +#ifdef INS_APP + if (debug_com_log_on) + { + if (!debug_p1_log_delay){ +#ifndef DEBUG_ALL + sendP1Packet(g_ptr_gnss_sol->gnss_update); +#endif + } else{ + debug_p1_log_delay--; + } + } +#endif +} \ No newline at end of file diff --git a/Platform/Core/src/serial_port.c b/Platform/Core/src/serial_port.c index 00785ce..19aa7f2 100644 --- a/Platform/Core/src/serial_port.c +++ b/Platform/Core/src/serial_port.c @@ -33,6 +33,8 @@ limitations under the License. #include "platformAPI.h" #include "configuration.h" #include "user_message.h" +#include "main.h" +#include "tcp_driver.h" typedef struct{ int type; @@ -54,6 +56,7 @@ ucbInputSyncTableEntry_t ucbInputSyncTable[] = { {UCB_SOFTWARE_RESET, 0x5352}, // "SR" {UCB_WRITE_CAL, 0x5743}, // "WC" {UCB_READ_CAL, 0x5243}, // "RC" + {UCB_WRITE_APP, 0x5741}, // "WA" {UCB_J2BOOT, 0x4A42}, // "JB" {UCB_J2IAP, 0x4A49}, // "JI" {UCB_J2APP, 0x4A41}, // "JA" @@ -80,6 +83,8 @@ uint8_t dataBuffer[512]; * @retval TRUE if a full packet has been seen (can fail CRC) * FALSE if needing more to fill in a packet ******************************************************************************/ +extern client_s driver_client; + BOOL HandleUcbRx (UcbPacketStruct *ucbPacket) { static int bytesInBuffer = 0, state = 0, crcError = 0, len = 0; @@ -94,7 +99,15 @@ BOOL HandleUcbRx (UcbPacketStruct *ucbPacket) while(1){ if(!bytesInBuffer){ - bytesInBuffer = uart_read_bytes(UART_USER,dataBuffer, sizeof(dataBuffer),0); + if(get_tcp_driver_state() == CLIENT_STATE_INTERACTIVE) + { + client_read_data(&driver_client, dataBuffer, &bytesInBuffer); + } + if(bytesInBuffer == 0) + { + bytesInBuffer = uart_read_bytes(UART_USER,dataBuffer, sizeof(dataBuffer),0); + fifo_push(&fifo_user_uart,dataBuffer,bytesInBuffer); + } if(!bytesInBuffer){ return 0; // nothing to do } @@ -201,20 +214,32 @@ void HandleUcbTx (int port, UcbPacketStruct *ptrUcbPacket) { uint16_t crc; uint8_t data[2]; + bool ret; /// get byte representation of packet type, index adjust required since sync /// isn't placed in data array - UcbPacketPacketTypeToBytes(ptrUcbPacket->packetType, data); - - ptrUcbPacket->sync_MSB = 0x55; + ptrUcbPacket->sync_MSB = 0x55; ptrUcbPacket->sync_LSB = 0x55; - ptrUcbPacket->code_MSB = data[0]; - ptrUcbPacket->code_LSB = data[1]; + + ret = UcbPacketPacketTypeToBytes(ptrUcbPacket->packetType, data); + if (ret) { + ptrUcbPacket->code_MSB = data[0]; + ptrUcbPacket->code_LSB = data[1]; + } else { + ptrUcbPacket->payloadLength = 2; + ptrUcbPacket->payload[0] = ptrUcbPacket->code_MSB; + ptrUcbPacket->payload[1] = ptrUcbPacket->code_LSB; + ptrUcbPacket->code_MSB = 0x15; // NAK + ptrUcbPacket->code_LSB = 0x15; + } crc = CalculateCRC((uint8_t *)&ptrUcbPacket->code_MSB, ptrUcbPacket->payloadLength + 3); ptrUcbPacket->payload[ptrUcbPacket->payloadLength+1] = (crc >> 8) & 0xff; ptrUcbPacket->payload[ptrUcbPacket->payloadLength] = crc & 0xff; - + if(get_tcp_driver_state() == CLIENT_STATE_INTERACTIVE) + { + client_write_data(&driver_client,(const char *)&ptrUcbPacket->sync_MSB, ptrUcbPacket->payloadLength + 7, 0x01); + } uart_write_bytes(port, (const char *)&ptrUcbPacket->sync_MSB, ptrUcbPacket->payloadLength + 7,1); } /* end HandleUcbTx */ diff --git a/Platform/Core/src/ucb_packet.c b/Platform/Core/src/ucb_packet.c index cecfee2..29a4be8 100644 --- a/Platform/Core/src/ucb_packet.c +++ b/Platform/Core/src/ucb_packet.c @@ -44,7 +44,8 @@ ucb_packet_t ucbPackets[] = { // {UCB_UNLOCK_EEPROM, 0x5545}, // "UE" {UCB_READ_EEPROM, 0x5245}, // "RE" {UCB_WRITE_EEPROM, 0x5745}, // "WE" - {UCB_SOFTWARE_RESET, 0x5352}, // "SR" + {UCB_SOFTWARE_RESET, 0x5352}, // "SR" + {UCB_WRITE_APP, 0x5741}, // "WA" {UCB_WRITE_CAL, 0x5743}, // "WC" {UCB_IDENTIFICATION, 0x4944}, // "ID" {UCB_VERSION_DATA, 0x5652}, // "VR" @@ -108,7 +109,7 @@ UcbPacketType UcbPacketBytesToPacketType (const uint8_t bytes []) * @param [in] byte array, containing one byte * @Retval length ******************************************************************************/ -void UcbPacketPacketTypeToBytes (UcbPacketType type, +BOOL UcbPacketPacketTypeToBytes (UcbPacketType type, uint8_t bytes []) { ucb_packet_t *ptr = ucbPackets; @@ -117,7 +118,7 @@ void UcbPacketPacketTypeToBytes (UcbPacketType type, #ifndef USER_PACKETS_NOT_SUPPORTED if(type == UCB_USER_OUT){ userPacketTypeToBytes(bytes); - return; + return TRUE; } #endif @@ -125,13 +126,15 @@ void UcbPacketPacketTypeToBytes (UcbPacketType type, if(ptr->packetType == type){ bytes[0] = (uint8_t)((ptr->packetCode >> 8) & 0xff); bytes[1] = (uint8_t)(ptr->packetCode & 0xff); - return; + return TRUE; } ptr++; } - bytes[0] = 0; - bytes[1] = 0; + bytes[0] = 0; + bytes[1] = 0; + + return FALSE; } /* end UcbPacketPacketTypeToBytes */ @@ -162,6 +165,7 @@ BOOL UcbPacketIsAnInputPacket (UcbPacketType type) case UCB_READ_EEPROM: case UCB_WRITE_EEPROM: case UCB_SOFTWARE_RESET: + case UCB_WRITE_APP: case UCB_WRITE_CAL: isAnInputPacket = TRUE; break; diff --git a/Platform/Driver/include/exit.h b/Platform/Driver/include/exit.h index f78fa72..c691754 100644 --- a/Platform/Driver/include/exit.h +++ b/Platform/Driver/include/exit.h @@ -14,4 +14,6 @@ //#pragma once void pps_exit_init(void); extern uint8_t get_gnss_signal_flag(); +void PLUSE_IRQ(); + #endif diff --git a/Platform/Driver/include/rng.h b/Platform/Driver/include/rng.h new file mode 100644 index 0000000..16be997 --- /dev/null +++ b/Platform/Driver/include/rng.h @@ -0,0 +1,8 @@ +#ifndef _RNG_H_ +#define _RNG_H_ + +#include + +void RNG_Init(void); + +#endif diff --git a/Platform/Driver/include/spi.h b/Platform/Driver/include/spi.h new file mode 100644 index 0000000..c8dfdfc --- /dev/null +++ b/Platform/Driver/include/spi.h @@ -0,0 +1,23 @@ +/******************************************************************************* +* File Name : spi.h +* Author : yundong +* Revision : 1.0 +* Date : 2020/03/23 +* Description : spi drive head file +*******************************************************************************/ +#ifndef _SPI_H_ +#define _SPI_H_ + +#include "stm32f4xx_hal.h" +#ifdef INCEPTIO +#define SPI_BUF_SIZE 170+19 +#else +#define SPI_BUF_SIZE 434 +#endif + +extern SPI_HandleTypeDef hspi5; +void MX_SPI5_Init(void); + +extern uint8_t spi_buff[SPI_BUF_SIZE]; +extern uint8_t spi_ready_flag; +#endif \ No newline at end of file diff --git a/Platform/Driver/include/timer.h b/Platform/Driver/include/timer.h index 224c19a..1589c9a 100644 --- a/Platform/Driver/include/timer.h +++ b/Platform/Driver/include/timer.h @@ -34,5 +34,5 @@ time_t get_time_of_msec(); volatile mcu_time_base_t *get_mcu_time(); void release_sem(osSemaphoreId sem); - +double get_gnss_time(); #endif diff --git a/Platform/Driver/include/uart.h b/Platform/Driver/include/uart.h index 9d4a059..9ccbbc7 100644 --- a/Platform/Driver/include/uart.h +++ b/Platform/Driver/include/uart.h @@ -52,11 +52,13 @@ extern fifo_type uart_bt_rx_fifo; extern fifo_type uart_user_rx_fifo; #define USER_UART_DMA_FIFO +#define DEBUG_UART_DMA_FIFO + #ifdef USER_UART_DMA_FIFO #define UART_TX_FIFO_MANAGE_NUM 1 #define DMA_TX_FIFO_BUF_SIZE 2048 - +#define DEBUG_DMA_TX_FIFO_BUF_SIZE (1024*4) typedef struct _uart_tx_fifo { fifo_type uart_tx_fifo; diff --git a/Platform/Driver/src/exit.c b/Platform/Driver/src/exit.c index abc71c9..b1c7b0a 100644 --- a/Platform/Driver/src/exit.c +++ b/Platform/Driver/src/exit.c @@ -18,6 +18,9 @@ #include "bsp.h" #include "uart.h" #include "osapi.h" +#include "string.h" +#include "app_version.h" +#include "ins_interface_API.h" volatile mcu_time_base_t g_obs_rcv_time; @@ -54,7 +57,6 @@ void ST_PPS_IRQ(void) { OSEnterISR(); LED_PPS_TOOGLE(); - DRDY_Toggle(); g_pps_flag = 1; uint8_t PPSstate = HAL_GPIO_ReadPin(ST_PPS_PORT,ST_PPS_PIN); @@ -68,14 +70,26 @@ void ST_PPS_IRQ(void) else if(g_MCU_time.msec > 500) { g_MCU_time.msec = 500; - htim_sensor.Instance->CNT = 1; + htim_sensor.Instance->CNT = 1; } - if(get_gnss_signal_flag() && (g_MCU_time.msec - g_obs_rcv_time.msec) >= 0 && (g_MCU_time.time == g_obs_rcv_time.time)) - g_MCU_time.time = get_obs_time(); + if (strstr((char *)APP_VERSION_STRING, "RAWDATA")) + { + if(get_gnss_signal_flag() && (g_MCU_time.msec - g_obs_rcv_time.msec) >= 0 && (g_MCU_time.time == g_obs_rcv_time.time)) + g_MCU_time.time = get_obs_time(); + } + } HAL_GPIO_EXTI_IRQHandler(ST_PPS_PIN); OSExitISR(); } + +void PLUSE_IRQ() +{ + add_wheel_tick_count(); + set_wheel_tick_fwd(HAL_GPIO_ReadPin(FWD_PORT,FWD_PIN)); + HAL_GPIO_EXTI_IRQHandler(PLUSE_PIN); +} + diff --git a/Platform/Driver/src/rng.c b/Platform/Driver/src/rng.c new file mode 100644 index 0000000..b03f91c --- /dev/null +++ b/Platform/Driver/src/rng.c @@ -0,0 +1,19 @@ +#include "rng.h" +#include "stm32f4xx_hal.h" + +RNG_HandleTypeDef RngHandle; +/** *************************************************************************** + * @name RNG_Init + * @brief N/A + * @retval N/A + ******************************************************************************/ +void RNG_Init(void) +{ + RngHandle.Instance = RNG; + if (HAL_RNG_Init(&RngHandle) != HAL_OK) + { + Error_Handler(); + } +} + + diff --git a/Platform/Driver/src/spi.c b/Platform/Driver/src/spi.c new file mode 100644 index 0000000..4c06f5e --- /dev/null +++ b/Platform/Driver/src/spi.c @@ -0,0 +1,242 @@ +/******************************************************************************* +* File Name : uart.c +* Author : yundong +* Revision : 1.0 +* Date : 2019/03/23 +* Description : spi drive source file +* +********************************************************************************/ +#include "stm32f4xx_hal.h" +#include "boardDefinition.h" +#include "uart.h" +#include "spi.h" +#include "string.h" +#include "user_config.h" +#include "exit.h" +// #include "insoutmsg.h" + +SPI_HandleTypeDef hspi5; +DMA_HandleTypeDef hdma_spi5_rx; +DMA_HandleTypeDef hdma_spi5_tx; + +uint8_t spi_rx[SPI_BUF_SIZE] = {0}; +uint8_t spi_tx[SPI_BUF_SIZE] = {0}; +uint8_t spi_ready_flag = 0; +void MX_SPI5_Init(void) +{ + + // for (int i = 0; i < SPI_BUF_SIZE; i++) + // spi_tx[i] = i+1; + /* USER CODE BEGIN SPI5_Init 0 */ + + /* USER CODE END SPI5_Init 0 */ + + /* USER CODE BEGIN SPI5_Init 1 */ + + /* USER CODE END SPI5_Init 1 */ + /* SPI5 parameter configuration*/ + hspi5.Instance = USER_SPI; + hspi5.Init.Mode = SPI_MODE_SLAVE; + hspi5.Init.Direction = SPI_DIRECTION_2LINES; + hspi5.Init.DataSize = SPI_DATASIZE_8BIT; + hspi5.Init.CLKPolarity = SPI_POLARITY_HIGH; + hspi5.Init.CLKPhase = SPI_PHASE_2EDGE; + hspi5.Init.NSS = SPI_NSS_SOFT; + hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi5.Init.TIMode = SPI_TIMODE_DISABLE; + hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi5.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi5) != HAL_OK) + { + Error_Handler(); + } + // if (HAL_SPI_TransmitReceive_DMA(&hspi5, spi_tx, spi_rx, SPI_BUF_SIZE) != HAL_OK) + // { + // /* Transfer error in transmission process */ + // Error_Handler(); + // } +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ + + +void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (hspi->Instance == USER_SPI) + { + /* USER CODE BEGIN SPI5_MspInit 0 */ + + /* USER CODE END SPI5_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI5_CLK_ENABLE(); + + __HAL_RCC_GPIOF_CLK_ENABLE(); + + /*Configure GPIO pin : PF6 */ + GPIO_InitStruct.Pin = USER_SPI_NSS_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(USER_SPI_NSS_PORT, &GPIO_InitStruct); + + /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(USER_SPI_NSS_RX_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USER_SPI_NSS_RX_IRQn); + + /**SPI5 GPIO Configuration + PF7 ------> SPI5_SCK + PF9 ------> SPI5_MOSI + PF8 ------> SPI5_MISO + */ + GPIO_InitStruct.Pin = USER_SPI_MOSI_PIN | USER_SPI_MISO_PIN | USER_SPI_SCK_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI5; + HAL_GPIO_Init(USER_SPI_MOSI_PORT, &GPIO_InitStruct); + + /* SPI5 DMA Init */ + /* SPI5_RX Init */ + hdma_spi5_rx.Instance = DMA2_Stream3; + hdma_spi5_rx.Init.Channel = DMA_CHANNEL_2; + hdma_spi5_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_spi5_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_spi5_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_spi5_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_spi5_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi5_rx.Init.Mode = DMA_NORMAL; + hdma_spi5_rx.Init.Priority = DMA_PRIORITY_LOW; + hdma_spi5_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_spi5_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(hspi, hdmarx, hdma_spi5_rx); + + /* SPI5_TX Init */ + hdma_spi5_tx.Instance = DMA2_Stream4; + hdma_spi5_tx.Init.Channel = DMA_CHANNEL_2; + hdma_spi5_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_spi5_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_spi5_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_spi5_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_spi5_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi5_tx.Init.Mode = DMA_NORMAL; + hdma_spi5_tx.Init.Priority = DMA_PRIORITY_LOW; + hdma_spi5_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_spi5_tx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(hspi, hdmatx, hdma_spi5_tx); + + /* USER CODE BEGIN SPI5_MspInit 1 */ + + /* USER CODE END SPI5_MspInit 1 */ + } +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) +{ + + if (hspi->Instance == USER_SPI) + { + /* USER CODE BEGIN SPI5_MspDeInit 0 */ + + /* USER CODE END SPI5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI5_CLK_DISABLE(); + + /**SPI5 GPIO Configuration + PF7 ------> SPI5_SCK + PF9 ------> SPI5_MOSI + PF8 ------> SPI5_MISO + */ + HAL_GPIO_DeInit(USER_SPI_MOSI_PORT, USER_SPI_MOSI_PIN | USER_SPI_MISO_PIN | USER_SPI_SCK_PIN); + + /* SPI5 DMA DeInit */ + HAL_DMA_DeInit(hspi->hdmarx); + HAL_DMA_DeInit(hspi->hdmatx); + /* USER CODE BEGIN SPI5_MspDeInit 1 */ + + /* USER CODE END SPI5_MspDeInit 1 */ + } +} + +/** + * @brief This function handles DMA2 stream3 global interrupt. + */ +void DMA2_Stream3_IRQHandler(void) +{ + /* USER CODE BEGIN DMA2_Stream3_IRQn 0 */ + + /* USER CODE END DMA2_Stream3_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_spi5_rx); + /* USER CODE BEGIN DMA2_Stream3_IRQn 1 */ + + /* USER CODE END DMA2_Stream3_IRQn 1 */ +} + +/** + * @brief This function handles DMA2 stream4 global interrupt. + */ +void DMA2_Stream4_IRQHandler(void) +{ + /* USER CODE BEGIN DMA2_Stream4_IRQn 0 */ + + /* USER CODE END DMA2_Stream4_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_spi5_tx); + /* USER CODE BEGIN DMA2_Stream4_IRQn 1 */ + + /* USER CODE END DMA2_Stream4_IRQn 1 */ +} + +void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) +{ +} +/** + * @brief EXTI line detection callbacks. + * @param GPIO_Pin Specifies the pins connected EXTI line + * @retval None + */ + +void SPI_IRQ() +{ + memcpy(spi_tx,spi_buff,SPI_BUF_SIZE); + + if (spi_ready_flag) + { + spi_ready_flag = 0; + HAL_SPI_TransmitReceive_DMA(&hspi5, spi_tx, spi_rx, SPI_BUF_SIZE); + } + HAL_GPIO_EXTI_IRQHandler(USER_SPI_NSS_PIN); +} + +void SPI_PLUSE_IRQ() +{ + int wheeltick_pin_mode = get_wheeltick_pin_mode(); + if(wheeltick_pin_mode == 0) + { + PLUSE_IRQ(); + } + else if(wheeltick_pin_mode == 1) + { + SPI_IRQ(); + } +} + diff --git a/Platform/Driver/src/timer.c b/Platform/Driver/src/timer.c index 4286e78..1dedc0e 100644 --- a/Platform/Driver/src/timer.c +++ b/Platform/Driver/src/timer.c @@ -21,6 +21,7 @@ #include "stm32f4xx_hal.h" #include "main.h" #include "user_config.h" +#include "app_version.h" #define SENSOR_TIMER_IRQ TIM2_IRQHandler @@ -127,13 +128,19 @@ static void timer_isr_if(TIM_HandleTypeDef* timer) g_MCU_time.msec = 0; g_MCU_time.time ++; } - switch (gUserConfiguration.userPacketRate) +#ifdef INS_APP + if(g_MCU_time.msec % 10 == 0) // 100Hz + { + release_sem(g_sem_imu_data_acq); + } +#else + switch (get_user_packet_rate()) { case 200: if(g_MCU_time.msec % 5 == 0) // 200Hz { release_sem(g_sem_imu_data_acq); - } + } break; case 100: if(g_MCU_time.msec % 10 == 0) // 100Hz @@ -148,6 +155,12 @@ static void timer_isr_if(TIM_HandleTypeDef* timer) } break; } +#endif + if (gOdoConfigurationStruct.can_mode == 1) { + if(g_MCU_time.msec % 10 == 0) { // 100Hz + release_sem(g_sem_can_data); + } + } } } @@ -159,4 +172,28 @@ void SENSOR_TIMER_IRQ(void) OSEnterISR(); timer_isr_if(&htim_sensor); OSExitISR(); -} \ No newline at end of file +} + +double get_gnss_time() +{ + gtime_t time; + int week; + double ep[6]; + time.time = g_MCU_time.time; + time.sec = (double)g_MCU_time.msec/1000; + double timeOfWeek = 0; + timeOfWeek = time2gpst(time,&week); + if (timeOfWeek < 0){ + week = 0; + timeOfWeek = g_MCU_time.time + (double)g_MCU_time.msec/1000; + } + + gtime_t gpstime = gpst2time(week, timeOfWeek); + gtime_t utctime = gpst2utc(gpstime); + time2epoch(utctime, ep); + double gga_time = ep[3] * 10000 + ep[4] * 100 + ep[5] + 0.001; + return gga_time; +} + + + diff --git a/Platform/Driver/src/uart.c b/Platform/Driver/src/uart.c index e4623c7..6105d2a 100644 --- a/Platform/Driver/src/uart.c +++ b/Platform/Driver/src/uart.c @@ -59,8 +59,12 @@ fifo_type uart_user_rx_fifo; #ifdef USER_UART_DMA_FIFO static uint8_t user_uart_dma_tx_buff[DMA_TX_FIFO_BUF_SIZE]; uart_tx_dma_fifo_s user_uart_dma_tx_fifo; -#endif +#endif +#ifdef DEBUG_UART_DMA_FIFO +static uint8_t debug_uart_dma_tx_buff[DEBUG_DMA_TX_FIFO_BUF_SIZE]; +uart_tx_dma_fifo_s debug_uart_dma_tx_fifo; +#endif static const struct uart_config_t uart_config[UART_MAX] = { { @@ -152,6 +156,7 @@ int uart_read_bytes(uart_port_e uart_num, uint8_t* buf, uint32_t len, TickType_t } static uint8_t data_to_write[DMA_TX_FIFO_BUF_SIZE]; +static uint8_t data_to_debug[DEBUG_DMA_TX_FIFO_BUF_SIZE]; int uart_write_bytes(uart_port_e uart_num, const char* src, size_t size, bool is_wait) //TODO: { #ifdef USER_UART_DMA_FIFO @@ -172,7 +177,26 @@ int uart_write_bytes(uart_port_e uart_num, const char* src, size_t size, bool is } return RTK_OK; } +#ifdef DEBUG_UART_DMA_FIFO + else if(uart_num == UART_DEBUG) + { + fifo_push(&debug_uart_dma_tx_fifo.uart_tx_fifo,(uint8_t*)src,size); + debug_uart_dma_tx_fifo.frame_num+= 1; + debug_uart_dma_tx_fifo.data_total_num+= size; + if(debug_uart_dma_tx_fifo.data_total_num > DEBUG_DMA_TX_FIFO_BUF_SIZE) + { + } + if(p_uart_obj[UART_DEBUG]->huart->gState == HAL_UART_STATE_READY) + { + int data_len = fifo_get(&debug_uart_dma_tx_fifo.uart_tx_fifo,data_to_debug,DEBUG_DMA_TX_FIFO_BUF_SIZE); + debug_uart_dma_tx_fifo.frame_num = 0; + debug_uart_dma_tx_fifo.data_total_num = 0; + HAL_UART_Transmit_DMA(p_uart_obj[UART_DEBUG]->huart, data_to_debug, data_len); + } + return RTK_OK; + } else +#endif #endif { while(HAL_UART_Transmit_DMA(p_uart_obj[uart_num]->huart, (uint8_t *)src, size) == HAL_BUSY) @@ -259,7 +283,17 @@ int uart_driver_install(uart_port_e uart_num, fifo_type* uart_rx_fifo,UART_Handl user_uart_dma_tx_fifo.is_data_available = 0; fifo_init(&user_uart_dma_tx_fifo.uart_tx_fifo, user_uart_dma_tx_buff, DMA_TX_FIFO_BUF_SIZE); } -#endif +#endif +#ifdef DEBUG_UART_DMA_FIFO + if(uart_num == UART_DEBUG) // TODO: + { + debug_uart_dma_tx_fifo.data_total_num = 0; + debug_uart_dma_tx_fifo.is_dma_busy = 0; + debug_uart_dma_tx_fifo.frame_num = 0; + debug_uart_dma_tx_fifo.is_data_available = 0; + fifo_init(&debug_uart_dma_tx_fifo.uart_tx_fifo, debug_uart_dma_tx_buff, DEBUG_DMA_TX_FIFO_BUF_SIZE); + } +#endif return ret; } @@ -291,6 +325,13 @@ static void uart_isr_if(uart_port_e uart_num) uart_rx_dma_enable(uart_num); uart_dma_enanle_it(uart_num,UART_IT_IDLE); } +#if 1 + if (RESET != __HAL_UART_GET_FLAG(p_uart_obj[uart_num]->huart, UART_FLAG_ORE)) + { + __HAL_UART_CLEAR_OREFLAG(p_uart_obj[uart_num]->huart); + } +#endif + HAL_UART_IRQHandler(p_uart_obj[uart_num]->huart); if((uart_num == UART_BT) || (uart_num == UART_DEBUG)) { diff --git a/Platform/commAPI.h b/Platform/commAPI.h index b25d003..16dd498 100644 --- a/Platform/commAPI.h +++ b/Platform/commAPI.h @@ -29,5 +29,8 @@ limitations under the License. extern void ProcessUserCommands(void); extern void SendContinuousPacket(void); - +extern void debug_com_process(void); +extern void send_ins_nmea(void); +extern void send_ins_to_bt(void); +extern void handle_tcp_commands(void); #endif diff --git a/Platform/common/include/constants.h b/Platform/common/include/constants.h index 88128f0..4719c18 100644 --- a/Platform/common/include/constants.h +++ b/Platform/common/include/constants.h @@ -55,7 +55,7 @@ typedef unsigned char BOOL; #define RE_WGS84 6378137.0 /* earth semimajor axis (WGS84) (m) */ #define FE_WGS84 (1.0/298.257223563) /* earth flattening (WGS84) */ -#define SIGMA 1.0e-8 +// #define SIGMA 1.0e-8 #define KNOT2MPSEC 5.144444444e-1 #define SQUARE(x) ((x)*(x)) diff --git a/Platform/common/include/nav_math.h b/Platform/common/include/nav_math.h index edda22b..5bd185d 100644 --- a/Platform/common/include/nav_math.h +++ b/Platform/common/include/nav_math.h @@ -11,5 +11,6 @@ void ecef2pos(const double *r, double *pos); void deg2dms(double deg, double *dms, int ndec); void blh2C_en(const double *blh, double C_en[3][3]); void ecef2ned(const double *xyz, double *ned); +void pos2ecef(const double *pos, double *r); #endif /* _NAV_MATH_H */ \ No newline at end of file diff --git a/Platform/common/include/scaling.h b/Platform/common/include/scaling.h new file mode 100644 index 0000000..169123f --- /dev/null +++ b/Platform/common/include/scaling.h @@ -0,0 +1,78 @@ +/** *************************************************************************** + * @file scaling.h + * @Author + * @date September, 2008 + * @brief Copyright (c) 2013, 2014 All Rights Reserved. + * + * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + * PARTICULAR PURPOSE. + * + * macros to define various power of 2, fixed point and constant scalsing + ******************************************************************************/ +#ifndef SCALING_H +#define SCALING_H + + +/// pre-computed values +#define SCALE_BY_8(value) ( (value) * 8.0 ) +#define SCALE_BY_2POW16_OVER_2PI(value) ( (value) * 10430.37835047045 ) // 65536 / (2.0 * PI) +#define SCALE_BY_2POW16_OVER_7PI(value) ( (value) * 2980.108100134415 ) // 65536 / (7.0 * PI) +#define SCALE_BY_2POW16_OVER_2(value) ( (value) * 32768.0 ) // 65536 / 2 +#define SCALE_BY_2POW16_OVER_16(value) ( (value) * 4096.0 ) // 5536 / 16 +#define SCALE_BY_2POW16_OVER_20(value) ( (value) * 3276.8 ) // 65536 / 20 +#define SCALE_BY_2POW16_OVER_64(value) ( (value) * 1024.0 ) // 65536 / 64 +#define SCALE_BY_2POW16_OVER_128(value) ( (value) * 512.0 ) // 65536 / 128 +#define SCALE_BY_2POW16_OVER_200(value) ( (value) * 327.68 ) // 65536 / 200 +#define SCALE_BY_2POW16_OVER_512(value) ( (value) * 128.0 ) // 65536 / 512 + +#define SCALE_BY_2POW32_OVER_2PI(value) ( (value) * 683565287.23678304) // 4294967296 / 2 * PI +#define SCALE_BY_2POW16_OVER_2POW14(value) ( (value) * 4.0 ) // 65536 / 16384 + +#define TWO_OVER_TWO_POW16_q30 32768 +#define TWENTY_OVER_TWO_POW16_q30 327680 +#define TWOPI_OVER_MAXINT16_q30 205894 + +#define TWO_POW16_OVER_7PI_q19 1562434916 // floor( 2^16/( 7*pi ) * 2^19 ) +#define TWO_POW16_OVER_20_q19 1717986918 // floor( 2^16/20 * 2^19 ) +#define TWO_POW16_OVER_2_q15 1073741824 // floor( 2^16/2 * 2^15 ) +#define TWO_POW16_OVER_200_q22 1374389534 // floor( 2^16/200 * 2^22 ) +//#define TWO_POW16_OVER_20_q19 1717986918 // floor( 2^16/20 * 2^19 ) +#define TWO_POW16_TIMES_100_OVER_7PI_q12 298011 // floor( 2^16/( 7*pi ) * 2^12 ) + +#define TWO_POW16_OVER_128_q21 1073741824 // floor( 2^16/200 * 2^22 ) +#define TWO_POW16_OVER_512_q23 128 + +#define TWO_POW16_OVER_2PI_q17 1367130551 +#define TWO_POW19_OVER_7PI_q16 23841 + +#define MAXUINT16_OVER_2PI 10430.21919552736 +#define DEGREES_TO_RADS 0.017453292519943 +#define RADS_TO_DEGREES 57.29577951308232 +#define ITAR_RATE_LIMIT 7.15585 // 410 dps * DEGREES_TO_RADS + +#define MAXINT16_OVER_2PI 5215.030020292134 //( MAXINT16 / TWOPI) +#define MAXUINT16_OVER_512 127.9980468750000 // ( MAXUINT16 / 512.0) +#define MAXUINT16_OVER_2 32768.0 //( MAXUINT16 / 2.0) + +// For magCal() +#define MAXINT16_OVER_2PI_q18 1367088830 + +#define MAXINT32_20BIT_OVER131072M 8 // 2^20/(2^17) + +/// INT32_TO_MISALIGN_SCALING = 1/2^( 32 - 5 ) as per the definition of misalign +/// in DMU Serial Interface Spec +#define INT32_TO_MISALIGN_SCALING 7.450580596923828e-09 + +/// BOARD_TEMP_SCALE_FACTOR = 1/256 = 0.00390625 from the TMP102 datasheet +/// ( shift 4-bits due to buffer and 4-bits for scaling) +#define BOARD_TEMP_SCALE_FACTOR 0.00390625 +#define BOARD_TEMP_SCALE_FACTOR_q30 419430 + +/// GYRO_TEMP_SCALE_FACTOR = 1/256 = 0.00390625 from the Maxim21000 datasheet +#define MAXIM21000_TEMP_SCALE_FACTOR 0.00390625 +#define BMI160_TEMP_SCALE_FACTOR 0.001953125 +#define BMI160_TEMP_OFFSET 23.0 +#endif + diff --git a/Platform/common/include/utils.h b/Platform/common/include/utils.h index 7ab92e3..a6ba2ff 100644 --- a/Platform/common/include/utils.h +++ b/Platform/common/include/utils.h @@ -26,8 +26,8 @@ limitations under the License. #include "gnss_data_api.h" #define GPS_BUFF_SIZE (2000) -#define IMU_BUFF_SIZE (512) -#define DEBUG_BUFF_SIZE (128) +#define IMU_BUFF_SIZE (2000) +#define DEBUG_BUFF_SIZE (2000) typedef struct diff --git a/Platform/common/src/nav_math.c b/Platform/common/src/nav_math.c index e51d8f4..04bf1f8 100644 --- a/Platform/common/src/nav_math.c +++ b/Platform/common/src/nav_math.c @@ -89,3 +89,22 @@ void ecef2ned(const double *xyz, double *ned) ned[1] = C_en[0][1] * xyz[0] + C_en[1][1] * xyz[1] + C_en[2][1] * xyz[2]; ned[2] = C_en[0][2] * xyz[0] + C_en[1][2] * xyz[1] + C_en[2][2] * xyz[2]; } + +/* transform geodetic to ecef position ----------------------------------------- +* transform geodetic position to ecef position +* args : double *pos I geodetic position {lat,lon,h} (rad,m) +* double *r O ecef position {x,y,z} (m) +* return : none +* notes : WGS84, ellipsoidal height +*-----------------------------------------------------------------------------*/ +void pos2ecef(const double *pos, double *r) +{ + double sinp = sin(pos[0]), cosp = cos(pos[0]), sinl = sin(pos[1]); + double cosl = cos(pos[1]); + double e2 = FE_WGS84 * (2.0 - FE_WGS84); + double v = RE_WGS84 / sqrt(1.0 - e2 * sinp * sinp); + + r[0] = (v + pos[2]) * cosp * cosl; + r[1] = (v + pos[2]) * cosp * sinl; + r[2] = (v * (1.0 - e2) + pos[2]) * sinp; +} \ No newline at end of file diff --git a/Platform/common/src/utils.c b/Platform/common/src/utils.c index 6daf35a..32b28b8 100644 --- a/Platform/common/src/utils.c +++ b/Platform/common/src/utils.c @@ -4,7 +4,12 @@ #include "utils.h" #include "nav_math.h" +#include "main.h" +extern void ecef2enu(const double *pos, const double *r, double *e); +extern double norm(const double* a, int n); +extern int print_rmc(gtime_t time, double *ecef,int fixID,char *buff); +extern int print_gsv(unsigned char *buff, int fixID, sky_view_t *rov); void fifo_init(fifo_type* fifo, uint8_t* buffer, uint16_t size) { @@ -250,16 +255,182 @@ int print_pos_gga(gtime_t time, double *pos, int num_of_sat, int fixID, { double ep[6] = { 0.0 }; gtime_t ut; - + uint8_t ret = 0; if (gga != NULL) { if (fixID) { ut = gpst2utc(time); time2epoch(ut, ep); - return print_nmea_gga(ep, pos, num_of_sat, fixID, hdop, age, gga); + ret = print_nmea_gga(ep, pos, num_of_sat, fixID, hdop, age, gga); } } + // print_rmc(time, pos,fixID, rmc_buff); + // print_gsa(buff_gsa,fixID,gRov.vec,&gGpsDataPtr->rov); + // print_gsv((unsigned char *)gsv_buff,fixID,sky_view_ptr); + nema_update_flag = 1; + return ret; +} +#define KNOT2M 0.514444444 /* m/knot */ - return 0; -} \ No newline at end of file +extern int print_rmc(gtime_t time, double *ecef,int fixID,char *buff) +{ + static double dirp = 0.0; + gtime_t ut; + double ep[6],pos[3],enuv[3],dms1[3],dms2[3],vel,dir,amag=0.0; + char *p = buff,*q,sum,*emag = "E"; + + if (fixID<=0) { + p+=sprintf(p,"$GPRMC,,,,,,,,,,,,"); + for (q=(char *)buff+1,sum=0;*q;q++) sum^=*q; + p+=sprintf(p,"*%02X%c%c",sum,0x0D,0x0A); + return p-(char *)buff; + } + ut=gpst2utc(time); + if (ut.sec>=0.995) {ut.time++; ut.sec=0.0;} + time2epoch(ut,ep); + ecef2pos(ecef,pos); + ecef2enu(pos,ecef+3,enuv); + vel=norm(enuv,3); + if (vel>=1.0) { + dir=atan2(enuv[0],enuv[1])*R2D; + if (dir<0.0) dir+=360.0; + dirp=dir; + } + else dir=dirp; + deg2dms(fabs(pos[0])*R2D,dms1,7); + deg2dms(fabs(pos[1])*R2D,dms2,7); + p+=sprintf(p,"$GPRMC,%02.0f%02.0f%05.2f,A,%02.0f%010.7f,%s,%03.0f%010.7f,%s,%4.2f,%4.2f,%02.0f%02.0f%02d,%.1f,%s,%s", + ep[3],ep[4],ep[5],dms1[0],dms1[1]+dms1[2]/60.0,pos[0]>=0?"N":"S", + dms2[0],dms2[1]+dms2[2]/60.0,pos[1]>=0?"E":"W",vel/KNOT2M,dir, + ep[2],ep[1],(int)ep[0]%100,amag,emag, + fixID == 4 || fixID == 5?"D":"A"); + // sol->stat==SOLQ_DGPS||sol->stat==SOLQ_FLOAT||sol->stat==SOLQ_FIX?"D":"A"); + for (q=(char *)buff+1,sum=0;*q;q++) sum^=*q; /* check-sum */ + p+=sprintf(p,"*%02X%c%c",sum,0x0D,0x0A); + return p-(char *)buff; +} +/* output solution in the form of nmea GSV sentence --------------------------*/ +extern int print_gsv(unsigned char *buff, int fixID, sky_view_t *rov) +{ + double az,el,snr; + int i,j,k,n,sat,prn,sys,nmsg,sats[MAXSAT]; + char *p=(char *)buff,*q,*s,sum; + + if (fixID<=0) { + p+=sprintf(p,"$GPGSV,1,1,0,,,,,,,,,,,,,,,,"); + for (q=(char *)buff+1,sum=0;*q;q++) sum^=*q; + p+=sprintf(p,"*%02X%c%c",sum,0x0D,0x0A); + return p-(char *)buff; + } + /* GPGSV: gps/sbas */ + for (i=0,n=0;irov_n&&n<12;i++) { + sat = rov->rov_satellite[i].satelliteId; + sys=satsys(sat,&prn); + if (sys!=_SYS_GPS_&&sys!=_SYS_SBS_) continue; + if (rov->rov_satellite[i].elevation > 0.0) sats[n++]=i; + } + nmsg=n<=0?0:(n-1)/4+1; + + for (i=k=0;irov_satellite[sats[k]].azimuth; if (az<0.0) az+=360.0; + el =rov->rov_satellite[sats[k]].elevation; + snr = rov->rov_satellite[sats[k]].snr; + p+=sprintf(p,",%02d,%02.0f,%03.0f,%02.0f",prn,el,az,snr); + } + else p+=sprintf(p,",,,,"); + } + p+=sprintf(p,",1"); /* L1C/A */ + for (q=s+1,sum=0;*q;q++) sum^=*q; /* check-sum */ + p+=sprintf(p,"*%02X%c%c",sum,0x0D,0x0A); + } + /* GLGSV: glonass */ + for (i=0,n=0;irov_n&&n<12;i++) { + sat = rov->rov_satellite[i].satelliteId; + sys=satsys(sat,&prn); + if (sys!=_SYS_GLO_) continue; + if (rov->rov_satellite[i].elevation > 0.0) sats[n++]=i; + } + nmsg=n<=0?0:(n-1)/4+1; + + for (i=k=0;irov_satellite[sats[k]].azimuth; if (az<0.0) az+=360.0; + el =rov->rov_satellite[sats[k]].elevation; + snr = rov->rov_satellite[sats[k]].snr; + p+=sprintf(p,",%02d,%02.0f,%03.0f,%02.0f",prn,el,az,snr); + } + else p+=sprintf(p,",,,,"); + } + p+=sprintf(p,",1"); /* L1C/A */ + for (q=s+1,sum=0;*q;q++) sum^=*q; /* check-sum */ + p+=sprintf(p,"*%02X%c%c",sum,0x0D,0x0A); + } + /* GAGSV: galileo */ + for (i=0,n=0;irov_n&&n<12;i++) { + sat = rov->rov_satellite[i].satelliteId; + sys=satsys(sat,&prn); + if (sys!=_SYS_GAL_) continue; + if (rov->rov_satellite[i].elevation > 0.0) sats[n++]=i; + } + nmsg=n<=0?0:(n-1)/4+1; + + for (i=k=0;irov_satellite[sats[k]].azimuth; if (az<0.0) az+=360.0; + el =rov->rov_satellite[sats[k]].elevation; + snr = rov->rov_satellite[sats[k]].snr; + p+=sprintf(p,",%02d,%02.0f,%03.0f,%02.0f",prn,el,az,snr); + } + else p+=sprintf(p,",,,,"); + } + p+=sprintf(p,",7"); /* L1BC */ + for (q=s+1,sum=0;*q;q++) sum^=*q; /* check-sum */ + p+=sprintf(p,"*%02X%c%c",sum,0x0D,0x0A); + } + /* BDGSV: Beidou */ + for (i=0,n=0;irov_n&&n<12;i++) { + sat = rov->rov_satellite[i].satelliteId; + sys=satsys(sat,&prn); + if (sys!=_SYS_BDS_) continue; + if (rov->rov_satellite[i].elevation > 0.0) sats[n++]=i; + } + nmsg=n<=0?0:(n-1)/4+1; + + for (i=k=0;irov_satellite[sats[k]].azimuth; if (az<0.0) az+=360.0; + el =rov->rov_satellite[sats[k]].elevation; + snr = rov->rov_satellite[sats[k]].snr; + p+=sprintf(p,",%02d,%02.0f,%03.0f,%02.0f",prn,el,az,snr); + } + else p+=sprintf(p,",,,,"); + } + p+=sprintf(p,",7"); /* L1BC */ + for (q=s+1,sum=0;*q;q++) sum^=*q; /* check-sum */ + p+=sprintf(p,"*%02X%c%c",sum,0x0D,0x0A); + } + + return p-(char *)buff; +} diff --git a/Platform/configurationAPI.h b/Platform/configurationAPI.h index 9fc2b92..32775a8 100644 --- a/Platform/configurationAPI.h +++ b/Platform/configurationAPI.h @@ -46,7 +46,6 @@ int configGetRateLfpFreq(); uint16_t configGetPrefilterFreq(); BOOL configSelectUserLPFilter(int sensor, int cutoffFreq, BOOL fApply); int configApplyOrientation(uint16_t orientation); -void configSetUsedSensors(int idx, uint8_t mask); uint16_t configGetUsedChips(void); uint16_t configGetActiveChips(void); uint16_t configGetUsedSensors(int chipIdx); @@ -75,5 +74,6 @@ BOOL configIsCanTermResistorEnabled(); void configSetPacketRateDividorForSPI(uint16_t dvd); uint16_t configGetPacketRateDividorForSPI(); void ApplyFactoryConfiguration(); -extern BOOL SaveAppFlag(void); +void configSetUsedChips(uint8_t mask); + #endif diff --git a/Platform/gnss_data/include/rtcm.h b/Platform/gnss_data/include/rtcm.h index d1a4e6f..c76530b 100644 --- a/Platform/gnss_data/include/rtcm.h +++ b/Platform/gnss_data/include/rtcm.h @@ -290,6 +290,39 @@ typedef struct int8_t flag_gnss_update; } st_pvt_type999_t; +typedef struct +{ + int32_t massage_number; + int32_t sbu_type_id; + int32_t reference_station_id; + int32_t reserved_itrf; + int32_t GPS_quality_indicator; + int32_t number_satellites_use; + int32_t number_satellites_view; + float hdop; + float vdop; + float pdop; + float geoidal_separation; + int32_t age_differentials; + int32_t differential_reference_station_id; + int32_t gnss_id; + int32_t gnss_epoch_time; + int32_t extended_week_number; + int32_t leap_seconds; + double latitude; + double longitude; + double height; + double velocity_horizontal; + double velocity_vertical; + int course_angle; + double protection_level_horizontal; + double protection_level_vertical; + double protection_level_angle; + int64_t receiver_clock_bias; + int64_t receiver_clock_drift; + + int8_t flag_gnss_update; +} st_epvt_type999_t; #ifdef _USE_PPP_ typedef struct /* Iono Layers */ @@ -376,6 +409,7 @@ typedef struct { /* RTCM control struct type */ unsigned char buff[1200]; /* message buffer */ unsigned char key; st_pvt_type999_t st_pvt; + st_epvt_type999_t st_epvt; } rtcm_t; typedef struct @@ -472,6 +506,9 @@ static const int codes_sbs[] = { extern void trace (int level, const char *format, ...); extern unsigned int rtcm_getbitu(const unsigned char *buff, int pos, int len); +extern void setbitu(unsigned char *buff, int pos, int len, unsigned int data); +extern void rtcm_setbits_38(unsigned char *buff, int pos, double data); +extern unsigned int rtk_crc24q(const unsigned char *buff, int len); /* glo frquent number function */ extern void set_glo_frq(unsigned char prn, int frq); diff --git a/Platform/gnss_data/include/rtklib_core.h b/Platform/gnss_data/include/rtklib_core.h index 246d449..a2c8e7d 100644 --- a/Platform/gnss_data/include/rtklib_core.h +++ b/Platform/gnss_data/include/rtklib_core.h @@ -75,6 +75,7 @@ typedef struct { /* observation data record */ double L[NFREQ + NEXOBS]; /* observation data carrier-phase (cycle) */ double P[NFREQ + NEXOBS]; /* observation data pseudorange (m) */ float D[NFREQ + NEXOBS]; /* observation data doppler frequency (Hz) */ + float azel[2]; } obsd_t; typedef struct { /* GPS/QZS/GAL broadcast ephemeris type */ diff --git a/Platform/gnss_data/src/rtcm.c b/Platform/gnss_data/src/rtcm.c index e58d0c0..d640893 100644 --- a/Platform/gnss_data/src/rtcm.c +++ b/Platform/gnss_data/src/rtcm.c @@ -10,6 +10,9 @@ #include "rtcm.h" #include "gnss_data_api.h" +#include "nav_math.h" +#include "uart.h" +#include "tcp_driver.h" #define SC2RAD 3.1415926535898 /* semi-circle to radian (IS-GPS) */ #define AU 149597870691.0 /* 1 AU (m) */ @@ -637,6 +640,15 @@ static double rtcm_getbits_38(const unsigned char *buff, int pos) { return (double)rtcm_getbits(buff, pos, 32) * 64.0 + rtcm_getbitu(buff, pos + 32, 6); } +/* set signed 38bit field ----------------------------------------------------*/ +void rtcm_setbits_38(unsigned char *buff, int pos, double data) +{ + int word_h = (int)floor(data / 64.0); + unsigned int word_l = (unsigned int)(data - word_h * 64.0); + + setbits(buff, pos, 32, word_h); + setbitu(buff, pos + 32, 6, word_l); +} /* get observation data index ------------------------------------------------*/ static int obsindex(obs_t *obs, gtime_t time, int sat) @@ -1456,6 +1468,73 @@ static void decode_type999_subtype4(rtcm_t *rtcm, obs_t *obs) rtcm->st_pvt.flag_gnss_update = 1; } +void decode_type999_subtype21(rtcm_t *rtcm, obs_t *obs) +{ + int i = 44; + rtcm->st_epvt.reference_station_id = rtcm_getbitu(rtcm->buff, i, 12); + i += 12; + rtcm->st_epvt.reserved_itrf = rtcm_getbitu(rtcm->buff, i, 6); + i += 6; + rtcm->st_epvt.GPS_quality_indicator = rtcm_getbitu(rtcm->buff, i, 4); + i += 4; + rtcm->st_epvt.number_satellites_use = rtcm_getbitu(rtcm->buff, i, 8); + i += 8; + rtcm->st_epvt.number_satellites_view = rtcm_getbitu(rtcm->buff, i, 8); + i += 8; + rtcm->st_epvt.hdop = (float)rtcm_getbitu(rtcm->buff, i, 8) * 0.1; + i += 8; + rtcm->st_epvt.vdop = (float)rtcm_getbitu(rtcm->buff, i, 8) * 0.1; + i += 8; + rtcm->st_epvt.pdop = (float)rtcm_getbitu(rtcm->buff, i, 8) * 0.1; + i += 8; + rtcm->st_epvt.geoidal_separation = (float)rtcm_getbitu(rtcm->buff, i, 15) * 0.01; + i += 15; + rtcm->st_epvt.age_differentials = rtcm_getbitu(rtcm->buff, i, 24); + i += 24; + rtcm->st_epvt.differential_reference_station_id = rtcm_getbitu(rtcm->buff, i, 12); + i += 12; + rtcm->st_epvt.gnss_id = rtcm_getbitu(rtcm->buff, i, 4); + i += 4; + rtcm->st_epvt.gnss_epoch_time = rtcm_getbitu(rtcm->buff, i, 30); + i += 30; + rtcm->st_epvt.extended_week_number = rtcm_getbitu(rtcm->buff, i, 16); + i += 16; + rtcm->st_epvt.leap_seconds = rtcm_getbitu(rtcm->buff, i, 8); + i += 8; + rtcm->st_epvt.latitude = (double)rtcm_getbits(rtcm->buff, i, 32) * 0.001 / 3600; + i += 32; + rtcm->st_epvt.longitude = (double)rtcm_getbits(rtcm->buff, i, 32) * 0.001 / 3600; + i += 32; + rtcm->st_epvt. height= (double)rtcm_getbits(rtcm->buff, i, 16) * 0.1; + i += 16; + rtcm->st_epvt.velocity_horizontal = (double)rtcm_getbitu(rtcm->buff, i, 16) * 0.1; + i += 16; + rtcm->st_epvt.velocity_vertical = (double)rtcm_getbits(rtcm->buff, i, 16) * 0.1; + i += 16; + rtcm->st_epvt.course_angle = rtcm_getbitu(rtcm->buff, i, 16); + i += 16; + rtcm->st_epvt.protection_level_horizontal = (double)rtcm_getbits(rtcm->buff, i, 16) * 0.1; + i += 16; + rtcm->st_epvt.protection_level_vertical = (double)rtcm_getbits(rtcm->buff, i, 16) * 0.1; + i += 16; + rtcm->st_epvt.protection_level_angle = (double)rtcm_getbits(rtcm->buff, i, 16) * 0.1; + i += 16; + rtcm->st_epvt.receiver_clock_bias = rtcm_getbits(rtcm->buff, i, 32); + i += 32; + rtcm->st_epvt.receiver_clock_drift = rtcm_getbits(rtcm->buff, i, 32); + i += 32; + + + double r[3]; + r[0] = rtcm->st_epvt.latitude * D2R; + r[1] = rtcm->st_epvt.longitude * D2R; + r[2] = rtcm->st_epvt.height; + pos2ecef(r,obs->pos); + + rtcm->st_epvt.flag_gnss_update = 1; + +} + static int decode_type999(rtcm_t *rtcm, obs_t *obs) { @@ -1468,6 +1547,10 @@ static int decode_type999(rtcm_t *rtcm, obs_t *obs) { decode_type999_subtype4(rtcm, obs); } + else if (rtcm->st_pvt.sub_type_id == 21) + { + decode_type999_subtype21(rtcm, obs); + } return 0; } @@ -1725,10 +1808,10 @@ static int decode_type1006(rtcm_t *rtcm, obs_t *obs) if (!test_staid(obs, staid)) return -1; - // for (j = 0; j < 3; j++) - // { - // obs->pos[j] = rr[j] * 0.0001; - // } + for (j = 0; j < 3; j++) + { + obs->pos[j] = rr[j] * 0.0001; + } return 5; } @@ -4824,6 +4907,37 @@ int decode_rtcm3(rtcm_t *rtcm, obs_t *obs, nav_t *nav) * *-----------------------------------------------------------------------------*/ +extern uint8_t stnID; +extern uint8_t debug_com_log_on; +extern client_s driver_data_client; +void fill_base_data(rtcm_t *rtcm,int rtcm_len) +{ + uint8_t base_data_buf[2000] = {0}; + double gga_time = get_gnss_time(); + // sizeof(",%02x\r\n") 5 sizeof(',') 1 + uint32_t data_len = rtcm_len + 5*sizeof(char) + 1*sizeof(char); + int head_len = sprintf(( char*)base_data_buf,"$GPREF,%6.2f,%04u,",gga_time,data_len); + memcpy(base_data_buf + strlen(( char*)base_data_buf),rtcm->buff,rtcm_len); + int all_bytes_to_sum = head_len + rtcm_len; + char sum = 0; + for(int i = 0;i < all_bytes_to_sum;i++) + { + sum ^= base_data_buf[i]; + } + int end_len = sprintf((char*)base_data_buf + head_len + rtcm_len,",%02x\r\n",sum); + if (debug_com_log_on) { + uart_write_bytes(UART_DEBUG,( char*)base_data_buf,head_len + rtcm_len + end_len,1); + } + if(get_tcp_data_driver_state() == CLIENT_STATE_INTERACTIVE) + { + //driver_data_push((char*)base_data_buf,head_len + rtcm_len + end_len); + client_write_data(&driver_data_client,(char*)base_data_buf,head_len + rtcm_len + end_len,0x01); + } +} + +uint8_t rtcm_decode_completion = 0; +uint32_t rtcm_decode_length = 0; + extern int input_rtcm3_data(rtcm_t *rtcm, unsigned char data, obs_t *obs, nav_t *nav) { /* synchronize frame */ @@ -4851,6 +4965,13 @@ extern int input_rtcm3_data(rtcm_t *rtcm, unsigned char data, obs_t *obs, nav_t } if (rtcm->nbyte < 3 || rtcm->nbyte < rtcm->len + 3) return 0; +#ifdef DEBUG_ALL + if((rtcm->nbyte > 0) && (stnID == BASE)) + { + fill_base_data(rtcm,rtcm->nbyte); + } +#endif + rtcm_decode_length = rtcm->nbyte; rtcm->nbyte = 0; rtcm->type = rtcm_getbitu(rtcm->buff, 24, 12); @@ -4861,6 +4982,10 @@ extern int input_rtcm3_data(rtcm_t *rtcm, unsigned char data, obs_t *obs, nav_t return 0; } + rtcm_decode_completion = 1; + + // printf("rtcm type: %d\r\n", rtcm->type); + /* decode rtcm3 message */ return decode_rtcm3(rtcm, obs, nav); } diff --git a/Platform/gnss_data_api.h b/Platform/gnss_data_api.h index 76d5cee..bd0c0c7 100644 --- a/Platform/gnss_data_api.h +++ b/Platform/gnss_data_api.h @@ -31,6 +31,19 @@ limitations under the License. #include "rtcm.h" #include "timer.h" +#pragma pack(1) + +typedef struct { + uint8_t satelliteId; + uint8_t systemId; + uint8_t antennaId; + uint8_t l1cn0; + uint8_t l2cn0; + float azimuth; + float elevation; + float snr; +} satellite_struct; + typedef struct { uint16_t gps_week; uint32_t gps_tow; // gps Time Of Week, miliseconds @@ -57,9 +70,19 @@ typedef struct { float std_ve; float std_vd; + uint8_t rov_n; + satellite_struct rov_satellite[MAXOBS]; } gnss_solution_t; +typedef struct { + uint8_t rov_n; + satellite_struct rov_satellite[MAXOBS]; +} sky_view_t; +#pragma pack() + extern gnss_solution_t g_gnss_sol; +extern gnss_solution_t* g_ptr_gnss_sol; + typedef struct { /* rtcm data struct */ gnss_rtcm_t rtcm; /* store RTCM data struct for RTK and PPP */ @@ -71,6 +94,9 @@ typedef struct { /* rtcm data struct */ } gnss_raw_data_t; extern gnss_raw_data_t *g_ptr_gnss_data; +extern uint8_t rtcm_decode_completion; +extern uint32_t rtcm_decode_length; + extern int input_rtcm3_data(rtcm_t *rtcm, unsigned char data, obs_t *obs, nav_t *nav); extern int input_rtcm3(unsigned char data, unsigned int stnID, gnss_rtcm_t *gnss); diff --git a/Platform/hwAPI.h b/Platform/hwAPI.h index 03a8993..d4e5aa1 100644 --- a/Platform/hwAPI.h +++ b/Platform/hwAPI.h @@ -16,8 +16,14 @@ BOOL HW_IsTestOK(); // system related functions void HW_SystemReset(void); -void HW_JumpToApp(); +BOOL HW_IsBootModeEnforced(); void HW_EnforceBootMode(); +BOOL HW_IsAppModeEnforced(); +void HW_EnforceAppMode(); +void HW_HDTestMode(); +void HW_ClearBootSignature(); +bool IsNeedToHardwareTest(); +BOOL IsNeedToUpdateApp(); extern BOOL fSPI; extern BOOL fUART; diff --git a/Platform/library.json b/Platform/library.json index bed5bc8..f4847a1 100644 --- a/Platform/library.json +++ b/Platform/library.json @@ -7,7 +7,8 @@ "-I .", "-I Core/include", "-I Board/include", - "-I Filter/include", + "-I Filter/include", + "-I BT/include", "-I Driver/inc" ], "libArchive": true, diff --git a/Platform/platform_version.h b/Platform/platform_version.h index 19cef24..e6704ed 100644 --- a/Platform/platform_version.h +++ b/Platform/platform_version.h @@ -30,15 +30,13 @@ // 1 2 // 12345678901234567890 -#ifdef IMU383 - #define SOFTWARE_PART "5020-1398-01 0.0.20" // IMU383 -#else - #define SOFTWARE_PART "8350-3021-01 0.1.1" // openrtk330 -#endif + +#define SOFTWARE_PART "5020-3021-01 2.0.0" // openrtk330 + #ifdef BOOT_MODE - #define BOOT_SOFTWARE_PART "0.0.1" // Bootloader version - #define VERSION_STRING "IMU383_Bootloader" // Bootloader version + #define BOOT_SOFTWARE_PART "1.1.1" // Bootloader version + #define VERSION_STRING "OpenRTK330L_Bootloader" // Bootloader version #endif diff --git a/README.md b/README.md index 2a1b630..b24642d 100644 --- a/README.md +++ b/README.md @@ -1 +1,21 @@ # Aceinna OpenRTK330L Module Open Source Firmware Library + + + +## Introduction + +Aceinna's OpenRTK330L is a GNSS/IMU integrated high-precision positioning module that is targeted for vehicular applications, for example autonomous-driving. The module's base firmware library is open-sourced for user to play with raw IMU data generation, data I/O customization and so on. Note the Aceinna's proprietary GNSS/INS algorithm library is NOT open-sourced but provided in the form of static library. + +## Usage + +This library repo is designed to work with the open-sourced IMU platform, i.e. the Github repo "platform_aceinna-imu" under the same organization. Please clone the "platform_aceinna-imu" repo and go to "example" subfolder to build the various "Apps" inside. These Apps automatically clones this base library repo for a complete project. + +### Release notes + +**v1.0.7**, Oct. 19, 2020 + +- Updated for "RTK_INS" App v2.0.0 +- Added CAN interface for data I/O + - Speed measurement input from car CAN bus, for GNSS/INS/Odometer integrated positioning + - Standard J1939 CAN message output +- Added wheel-tick speed interface for GNSS/INS/Odometer integrated positioning \ No newline at end of file diff --git a/STM32F469/HAL/Src/stm32f4xx_hal_spi.c b/STM32F469/HAL/Src/stm32f4xx_hal_spi.c index bcac467..04d5b4e 100644 --- a/STM32F469/HAL/Src/stm32f4xx_hal_spi.c +++ b/STM32F469/HAL/Src/stm32f4xx_hal_spi.c @@ -167,7 +167,7 @@ /** @defgroup SPI_Private_Constants SPI Private Constants * @{ */ -#define SPI_DEFAULT_TIMEOUT 100U +#define SPI_DEFAULT_TIMEOUT 0U /** * @} */ diff --git a/Sensors/calibrationAPI.h b/Sensors/calibrationAPI.h index 2742cd6..197e670 100644 --- a/Sensors/calibrationAPI.h +++ b/Sensors/calibrationAPI.h @@ -11,10 +11,11 @@ #define __CALIBRATION_API_H #include +void compare_sensors_result(); void InitFactoryCalibration(void); void ApplyFactoryCalibration(void); uint32_t GetUnitSerialNum(); -uint8_t *GetUnitVersion(); +uint8_t* GetUnitVersion(); int CalibrationTableValid(int idx) ; uint16_t GetProductConfiguration(); diff --git a/Sensors/eepromAPI.h b/Sensors/eepromAPI.h index f0d9e40..95ee29a 100644 --- a/Sensors/eepromAPI.h +++ b/Sensors/eepromAPI.h @@ -1,8 +1,6 @@ /** *************************************************************************** - * @file s_eeprom.h legacy functions from older systems that used eeprom + * @file eepromAPI.h * @Author - * @date September, 2008 - * @brief Copyright (c) 2013, 2014 All Rights Reserved. * * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE @@ -13,100 +11,34 @@ #ifndef _EEPROM_API_H #define _EEPROM_API_H -#include "constants.h" +#include +#include "constants.h" -#define APP_STACK_START 0x2000FF00 -#define EEPROM_APP_UPDATE_ADDR 0x0801FFF8 -#define ENTER_BOOTLOADER_FLAG 0x12345678 -#define APP_SIGNATURE 0x55AA1234 - - -#define ENTER_APP_ADDR 0x080A0004 -#define ENTER_APP_FLAG 0X55AA1234 -#define UPDATE_APP_FLAG 0X50A01030 - -#define EEPROM_APP_PAGE1 16 // -#define EEPROM_USER_PAGE 56 // 2K -#define EEPROM_CONFIG_PAGE 57 // 2K -#define EEPROM_CAL_PAGE1 58 // and 59 4K -#define EEPROM_CAL_PAGE2 60 // and 61 4K -#define EEPROM_CAL_PAGE3 62 // and 63 4K -// #define EEPROM_CAL_ADDR1 0x0801d000 -// #define EEPROM_CAL_ADDR2 0x0801e000 -// #define EEPROM_CAL_ADDR3 0x0801f000 -// #define EEPROM_CONFIG_ADDR 0x0801c800 #define EEPROM_CAL_ADDR1 0x080Ed000 #define EEPROM_CAL_ADDR2 0x080Ee000 #define EEPROM_CAL_ADDR3 0x080Ef000 #define EEPROM_CONFIG_ADDR 0x080Ec800 #define CAL_PARTITION_SIZE 4096 // 4K #define CAL_CRC_OFFSET 4092 -#define EEPROM_USER_ADDR 0x0801c000 +#define EEPROM_USER_ADDR 0x080C0000 #define EEPROM_PAGE_SIZE 0x800 #define BOOT_SIGNATURE_ADDR 0x2004ff10 -#define APP_START_ADDR 0x08010000 -#define APP_LAST_ADDR 0x0801C7FF -#define APP_MAX_SIZE 0x00014800 - -#define APP_SIGNATURE_ADDR 0x080A0000 -#define APP_SIGNATURE_ADDR1 0x08008190 -#define APP_SIGNATURE_ADDR2 0x08008198 -#define APP_SIGNATURE_ADDR3 0x080081A0 -#define APP_SIGNATURE_ADDR4 0x080081A4 -#define APP_SIGNATURE_ADDR5 0x080081A8 -#define APP_SIGNATURE_ADDR6 0x080081AC - -#define APP_SIGNATURE_OFFSET3 0x01A0 -#define APP_SIGNATURE_OFFSET4 0x01A4 -#define APP_SIGNATURE_OFFSET5 0x01A8 -#define APP_SIGNATURE_OFFSET6 0x01AC - - -#define APP_SIGNATURE3 0x01234567 -#define APP_SIGNATURE4 0x89ABCDEF -#define APP_SIGNATURE5 0xAA55AA55 -#define APP_SIGNATURE6 0x55AA55AA - - - - -//#define EEPROM_APP_UPDATE_PAGE 63 - -extern BOOL needUpdate, forcedBootMode, spiBootMode; - - - -extern void readEEPROMWords(uint16_t addr, uint16_t num, void *destination) ; -extern BOOL writeEEPROMWords(uint16_t addr, uint16_t num, void *source) ; -extern void readEEPROMByte(uint16_t addr, uint16_t num, void *destination) ; -extern BOOL writeEEPROMByte(uint16_t addr, uint16_t num, void *source) ; - -extern void readEEPROMSerialNumber(void *destination) ; -extern void readEEPROMProdConfig(void *destination) ; -extern void readEEPROMCalAddrAndLength(int idx, uint32_t *addr, int *length); -void readEEPROMCalOffsetAndLength(int idx, uint16_t *offset, uint16_t *length); +#define APP_START_ADDR 0x08010000 +#define APP_SIGNATURE_ADDR 0x080A0000 + +extern void EEPROM_ReadWords(uint16_t addr, uint16_t num, void *destination) ; +extern BOOL EEPROM_WriteWords(uint16_t addr, uint16_t num, void *source) ; +extern void EEPROM_ReadByte(uint16_t addr, uint16_t num, void *destination) ; +extern BOOL EEPROM_WriteByte(uint16_t addr, uint16_t num, void *source) ; +extern void EEPROM_ReadSerialNumber(void *destination) ; +extern void EEPROM_ReadProdConfig(void *destination) ; +extern void EEPROM_ReadCalibration(int idx, void* destination); +extern void EEPROM_ReadFactoryConfiguration(void* destination); +extern BOOL EEPROM_ReadFromCalPartition( uint16_t offset, uint16_t num, void *destination); +extern BOOL EEPROM_WriteToCalPartition(uint16_t offset, uint16_t num, void *source); +extern uint8_t *EEPROM_GetCalTabPtr(int idx); +extern BOOL EEPROM_WriteApp(uint32_t addr,uint8_t *buf, uint16_t len); -extern void readEEPROMCalibration(int idx, void* destination); -extern void readEEPROMConfiguration(void* destination); -extern void setBORLevel(float voltage); -extern bool programDefaultConfig(); -extern uint8_t *getEEPROMCalPartitionData(int idx, uint16_t *length); -extern BOOL readFromEEPROMCalPartition( uint16_t offset, uint16_t num, void *destination); -extern BOOL writeToEEPROMCalPartition(uint16_t offset, uint16_t num, void *source); -extern BOOL writeToEEPROMAppPartition(uint32_t offset, uint16_t num, void *source); -extern uint8_t *getEEPROMCalTabPtr(int idx); -extern BOOL calSectorsLocked(); -extern BOOL lockCalSectors(void); -extern BOOL unlockCalSectors(void); -extern BOOL ApplyAppSignature(BOOL bootMode); -extern BOOL appStartedFirstTime(void); -extern BOOL IsNeedToUpdateApp(); -extern BOOL HW_IsBootModeEnforced(); -extern BOOL HW_IsAppModeEnforced(); -extern void HW_EnforceAppMode(); -extern void HW_HDTestMode(); -extern void HW_ClearBootSignature(); -extern bool IsNeedToHardwareTest(); #endif /* S_EEPROM_H */ diff --git a/Sensors/libSensors.a b/Sensors/libSensors.a index daa45c55033679e1acae481189542bfa00a606fd..bd0c720d5e131fcfddfe6856626ff559e9c44c07 100644 GIT binary patch literal 55732 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 KO_rx);QkMp*$JHh literal 53318 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 - - -typedef struct { - // Timer output counter - uint32_t timerCntr, dTimerCntr; - - // Algorithm states - double accel_g[3]; - double rate_radPerSec[3]; - double rate_degPerSec[3]; -// double mag_G[3]; - double temp_C; -} IMUDataStruct; /** **************************************************************************** * @name GetAccelData_g * @brief Get scaled accelerometer data in G @@ -48,8 +35,8 @@ typedef struct { * @retval N/A ******************************************************************************/ void GetAccelData_g(float *data); -void GetAccelData_g_AsDouble(double *data); void GetChipAccelData_g(int idx, float *data); +void GetAccelData_g_AsDouble(double *data); /** **************************************************************************** * @name GetAccelData_mPerSecSq @@ -57,7 +44,8 @@ void GetChipAccelData_g(int idx, float *data); * @param [in] data - pointer to external data structure * @retval N/A ******************************************************************************/ -void GetAccelData_mPerSecSq(float *data); +void GetAccelData_mPerSecSq(double *data); +void GetChipAccelData_mPerSecSq(int idx, float *data); /** **************************************************************************** * @name GetRateData_radPerSec @@ -75,6 +63,7 @@ void GetRateData_radPerSec_AsDouble(double *data); * @retval N/A ******************************************************************************/ void GetRateData_degPerSec(float *data); +void GetChipRateData_degPerSec(int idx, float *data); void GetRateData_degPerSec_AsDouble(double *data); /** **************************************************************************** @@ -83,9 +72,8 @@ void GetRateData_degPerSec_AsDouble(double *data); * @param [in] data - pointer to external data structure * @retval N/A ******************************************************************************/ -void GetMagData_G(float *data); -void GetMagData_G_AsDouble(double *data); - +void GetMagData_G(float *data); +void GetMagData_G_AsDouble(double *data); /** **************************************************************************** * @name GetBoardTempData @@ -93,7 +81,7 @@ void GetMagData_G_AsDouble(double *data); * @param [in] temp - pointer to external data structure * @retval N/A ******************************************************************************/ -void GetBoardTempData(float *temp); +void GetBoardTempData(double *temp); void GetBoardTempData_AsDouble(double *data); /** **************************************************************************** @@ -151,13 +139,24 @@ uint8_t ActivateSensors(); uint8_t InitSensors(); +/** **************************************************************************** + * @name GetRawTempCounts + * @brief Returns raw temperature counts (factory use) + * @retval N/A + ******************************************************************************/ +int GetRawTempCounts(); + /** **************************************************************************** * @name GetRawChipSensorsDataPtr * @brief Returns pointer to raw sensors data structure (factory use) * @retval N/A ******************************************************************************/ -int *GetRawChipSensorsDataPtr(int chipId); -int *GetRawSensorsDataPtr(); +int *GetRawChipSensorsDataPtr(int chipId); +int *GetRawSensorsDataPtr(); + + + +uint32_t GetSensorsSamplingTstamp(void); /** **************************************************************************** * @name FillRawSensorsPayload @@ -166,21 +165,5 @@ int *GetRawSensorsDataPtr(); ******************************************************************************/ int FillRawSensorsPayload(void *ptr); -/** **************************************************************************** - * @name GetRateData_degPerSec - * @brief Get scaled rate sesnors data in deg/ses - * @param [in] data - pointer to external data structure - * @retval N/A - ******************************************************************************/ -// void GetRateData_degPerSec(double *data); -void GetChipRateData_degPerSec(int idx, float *data); - -/** **************************************************************************** - * @name GetRawTempCounts - * @brief Returns raw temperature counts (factory use) - * @retval N/A - ******************************************************************************/ -int GetRawTempCounts(); -uint32_t GetSensorsSamplingTstamp(); #endif diff --git a/library.json b/library.json index 070c103..37d26e3 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "OpenRTK-base-library", - "version": "1.0.6", + "version": "1.0.7", "description": "OpenRTK Base Library", "keywords": "sensors, RTK, INS, AI, automotive, navigation", "repository": @@ -26,25 +26,37 @@ "-I LWIP/lwip_app/user/inc", "-I LWIP/lwip_app/webserver/inc", "-I LWIP/lwip_app/ntrip/inc" , + "-I LWIP/lwip_app/station/inc" , + "-I LWIP/lwip_app/driver_tcp/inc" , + "-I LWIP/lwip_app/driver_tcp" , "-I LWIP/", + "-I mbedTLS/lib/include", + "-I mbedTLS/lib/include/mbedtls", + "-I mbedTLS/app/inc", + "-I mbedTLS/", + "-I Platform/", - "-I Platform/Core/include", - "-I Platform/Board/include", - "-I Platform/Filter/include", - "-I Platform/Driver/include", - "-I Platform/cJSON/inc", + "-I Platform/core/include", + "-I Platform/board/include", + "-I Platform/filter/include", + "-I Platform/driver/include", + "-I Platform/cjson/inc", "-I Platform/gnss_data/include", - "-I Platform/common/include", + "-I Platform/common/include", + "-I Platform/can/include", + "-I Platform/bt/include", + "-I free_rtos/include", + "-I free_rtos/", + "-I free_rtos/include", + + "-I Sensors", + "-L Sensors/", + "-l libSensors.a", - "-I FreeRTOS/include", - "-I FreeRTOS/", - - "-I Sensors/Core", - "-I Sensors/Core/include", - "-I Sensors/", - "-L Sensors/", - "-l libSensors.a" + "-I INS", + "-L INS/", + "-l libINS.a" ], "libArchive": false, "platforms": "aceinna_imu"