From 4df718310c70edf1771454954db35c9127459027 Mon Sep 17 00:00:00 2001 From: Marcos Chaparro Date: Sat, 19 Nov 2022 18:39:03 -0300 Subject: [PATCH] luna_m600: Add hardware support files Reorganizes luna directory and includes torque sensor and display communication for all produced motor drives. Also include minor updates to bbhsd drives. Signed-off-by: Marcos Chaparro --- hwconf/hwconf.mk | 3 +- hwconf/luna/{ => bbshd}/appconf_luna_bbshd.h | 0 hwconf/luna/{ => bbshd}/hw_luna_bbshd.c | 37 +- hwconf/luna/{ => bbshd}/hw_luna_bbshd.h | 13 +- hwconf/luna/{ => bbshd}/luna_display_serial.c | 2 +- hwconf/luna/{ => bbshd}/luna_display_serial.h | 0 .../mcconf_luna_bbshd.h} | 2 +- hwconf/luna/bbshd/qmlui_luna_bbshd.c | 379 +++++++++ hwconf/luna/bbshd/qmlui_luna_bbshd.h | 17 + hwconf/luna/m600/appconf_luna_m600.h | 491 ++++++++++++ hwconf/luna/m600/hw_luna_m600.h | 347 +++++++++ hwconf/luna/m600/hw_luna_m600_Rev5.h | 27 + hwconf/luna/m600/hw_luna_m600_core.c | 488 ++++++++++++ hwconf/luna/m600/luna_m600_display.c | 720 ++++++++++++++++++ hwconf/luna/m600/luna_m600_display.h | 28 + hwconf/luna/m600/mcconf_luna_m600.h | 515 +++++++++++++ hwconf/luna/m600/qmlui_luna_m600.c | 422 ++++++++++ .../qmlui_luna_m600.h} | 8 +- hwconf/luna/qmlui_luna_v1.c | 461 ----------- package_firmware.py | 3 + 20 files changed, 3488 insertions(+), 475 deletions(-) rename hwconf/luna/{ => bbshd}/appconf_luna_bbshd.h (100%) rename hwconf/luna/{ => bbshd}/hw_luna_bbshd.c (94%) rename hwconf/luna/{ => bbshd}/hw_luna_bbshd.h (95%) rename hwconf/luna/{ => bbshd}/luna_display_serial.c (99%) rename hwconf/luna/{ => bbshd}/luna_display_serial.h (100%) rename hwconf/luna/{mcconf_luna_bbshd_52v.h => bbshd/mcconf_luna_bbshd.h} (99%) create mode 100644 hwconf/luna/bbshd/qmlui_luna_bbshd.c create mode 100644 hwconf/luna/bbshd/qmlui_luna_bbshd.h create mode 100644 hwconf/luna/m600/appconf_luna_m600.h create mode 100644 hwconf/luna/m600/hw_luna_m600.h create mode 100644 hwconf/luna/m600/hw_luna_m600_Rev5.h create mode 100644 hwconf/luna/m600/hw_luna_m600_core.c create mode 100644 hwconf/luna/m600/luna_m600_display.c create mode 100644 hwconf/luna/m600/luna_m600_display.h create mode 100644 hwconf/luna/m600/mcconf_luna_m600.h create mode 100644 hwconf/luna/m600/qmlui_luna_m600.c rename hwconf/luna/{qmlui_luna_v1.h => m600/qmlui_luna_m600.h} (62%) delete mode 100644 hwconf/luna/qmlui_luna_v1.c diff --git a/hwconf/hwconf.mk b/hwconf/hwconf.mk index c310a319..7097664b 100644 --- a/hwconf/hwconf.mk +++ b/hwconf/hwconf.mk @@ -5,7 +5,8 @@ HWSRC = \ hwconf/drv8305.c \ hwconf/drv8320s.c \ hwconf/drv8323s.c \ - hwconf/luna/luna_display_serial.c \ + hwconf/luna/bbshd/luna_display_serial.c \ + hwconf/luna/m600/luna_m600_display.c \ hwconf/si8900.c \ hwconf/shutdown.c \ diff --git a/hwconf/luna/appconf_luna_bbshd.h b/hwconf/luna/bbshd/appconf_luna_bbshd.h similarity index 100% rename from hwconf/luna/appconf_luna_bbshd.h rename to hwconf/luna/bbshd/appconf_luna_bbshd.h diff --git a/hwconf/luna/hw_luna_bbshd.c b/hwconf/luna/bbshd/hw_luna_bbshd.c similarity index 94% rename from hwconf/luna/hw_luna_bbshd.c rename to hwconf/luna/bbshd/hw_luna_bbshd.c index 26062221..fe6c8af1 100644 --- a/hwconf/luna/hw_luna_bbshd.c +++ b/hwconf/luna/bbshd/hw_luna_bbshd.c @@ -21,12 +21,14 @@ #include "ch.h" #include "hal.h" #include "stm32f4xx_conf.h" -#include "utils_math.h" +#include "utils.h" #include #include "mc_interface.h" #include "terminal.h" #include "commands.h" #include "stdio.h" +#include "app.h" +#include "mempools.h" #define EEPROM_ADDR_INITIAL_ASSIST_LEVEL 0 #define EEPROM_ADDR_MOTOR_HAS_PTC_SENSOR 1 @@ -42,6 +44,7 @@ static void terminal_cmd_set_initial_assist_level(int argc, const char **argv); static void terminal_cmd_read_initial_assist_level(int argc, const char **argv); static void terminal_cmd_set_bbshd_has_PTC_sensor(int argc, const char **argv); static void terminal_cmd_set_bbshd_use_fixed_throttle_level(int argc, const char **argv); +static void hw_override_pairing_done(void); int8_t hw_read_initial_assist_level(void); bool hw_bbshd_has_PTC_sensor(void); @@ -139,6 +142,7 @@ void hw_init_gpio(void) { int8_t initial_assist_level = hw_read_initial_assist_level(); motor_has_PTC_sensor = true;// hw_bbshd_has_PTC_sensor(); + hw_override_pairing_done(); luna_display_serial_start(initial_assist_level); } @@ -275,6 +279,7 @@ void hw_try_restore_i2c(void) { } static float wheel_rpm_filtered = 0; +static float trip_odometer = 0; void hw_update_speed_sensor(void) { static float wheel_rpm = 0; @@ -289,12 +294,14 @@ void hw_update_speed_sensor(void) { float revolution_duration = current_time - last_sensor_event_time; if (revolution_duration > 0.05) { //ignore periods <50ms - last_sensor_event_time = current_time; - wheel_rpm = 60.0 / revolution_duration; - // Apply averaging filter UTILS_LP_FAST(wheel_rpm_filtered, (float)wheel_rpm, 0.5); + + + const volatile mc_configuration *conf = mc_interface_get_configuration(); + trip_odometer += conf->si_wheel_diameter * M_PI; + //trip_odometer += mc_interface_get_configuration()->si_wheel_diameter * M_PI; test this } } else { // After 3 seconds without sensor signal, set RPM as zero @@ -312,6 +319,14 @@ float hw_get_speed(void) { return speed; } +/* Get trip distance in meters */ +float hw_get_distance(void) { + return trip_odometer; +} + +float hw_get_distance_abs(void) { + return trip_odometer; +} /* Gear Shift sensor support * Read the gear sensor and use it to override the brake adc signal to reduce motor * power during shifting to extend gearing life. @@ -548,3 +563,17 @@ bool hw_bbshd_has_fixed_throttle_level(void) { return true; } } + +// Users are getting locked out because they don't know what pairing means. Lets disable the pairing +static void hw_override_pairing_done(void) { + if( app_get_configuration()->pairing_done == true) { + app_configuration *appconf = mempools_alloc_appconf(); + *appconf = *app_get_configuration(); + appconf->pairing_done = false; + + conf_general_store_app_configuration(appconf); + app_set_configuration(appconf); + + mempools_free_appconf(appconf); + } +} diff --git a/hwconf/luna/hw_luna_bbshd.h b/hwconf/luna/bbshd/hw_luna_bbshd.h similarity index 95% rename from hwconf/luna/hw_luna_bbshd.h rename to hwconf/luna/bbshd/hw_luna_bbshd.h index 9086dead..42df4218 100644 --- a/hwconf/luna/hw_luna_bbshd.h +++ b/hwconf/luna/bbshd/hw_luna_bbshd.h @@ -22,11 +22,11 @@ #define HW_LUNA_BBSHD_H_ #define HW_NAME "LUNA_BBSHD" -#include "mcconf_luna_bbshd_52v.h" +#include "mcconf_luna_bbshd.h" #include "appconf_luna_bbshd.h" -#define QMLUI_SOURCE_HW "hwconf/luna/qmlui_luna_v1.c" -#define QMLUI_HEADER_HW "hwconf/luna/qmlui_luna_v1.h" +#define QMLUI_SOURCE_HW "hwconf/luna/bbshd/qmlui_luna_bbshd.c" +#define QMLUI_HEADER_HW "hwconf/luna/bbshd/qmlui_luna_bbshd.h" #define QMLUI_HW_FULLSCREEN // HW properties @@ -120,6 +120,11 @@ // Voltage on ADC channel #define ADC_VOLTS(ch) ((float)ADC_Value[ch] / 4096.0 * V_REG) +//log throttle data +#define NTC_TEMP_MOS2() ((float)ADC_VOLTS(ADC_IND_EXT)) +// log gate driver supply voltage +#define NTC_TEMP_MOS3() GET_GATE_DRIVER_SUPPLY_VOLTAGE() + // Double samples in beginning and end for positive current measurement. // Useful when the shunt sense traces have noise that causes offset. #ifndef CURR1_DOUBLE_SAMPLE @@ -255,6 +260,8 @@ // HW-specific functions void hw_update_speed_sensor(void); float hw_get_speed(void); +float hw_get_distance(void); +float hw_get_distance_abs(void); void hw_brake_override(float *brake); float hw_read_motor_temp(float beta); bool hw_bbshd_has_fixed_throttle_level(void); diff --git a/hwconf/luna/luna_display_serial.c b/hwconf/luna/bbshd/luna_display_serial.c similarity index 99% rename from hwconf/luna/luna_display_serial.c rename to hwconf/luna/bbshd/luna_display_serial.c index d53a1b9b..b7f51030 100644 --- a/hwconf/luna/luna_display_serial.c +++ b/hwconf/luna/bbshd/luna_display_serial.c @@ -26,7 +26,7 @@ #include "packet.h" #include "commands.h" #include "mc_interface.h" -#include "utils_math.h" +#include "utils.h" #include #include #include "comm_can.h" diff --git a/hwconf/luna/luna_display_serial.h b/hwconf/luna/bbshd/luna_display_serial.h similarity index 100% rename from hwconf/luna/luna_display_serial.h rename to hwconf/luna/bbshd/luna_display_serial.h diff --git a/hwconf/luna/mcconf_luna_bbshd_52v.h b/hwconf/luna/bbshd/mcconf_luna_bbshd.h similarity index 99% rename from hwconf/luna/mcconf_luna_bbshd_52v.h rename to hwconf/luna/bbshd/mcconf_luna_bbshd.h index bded135c..3104e77f 100644 --- a/hwconf/luna/mcconf_luna_bbshd_52v.h +++ b/hwconf/luna/bbshd/mcconf_luna_bbshd.h @@ -478,7 +478,7 @@ #define MCCONF_SI_GEAR_RATIO 7 // Wheel Diameter -#define MCCONF_SI_WHEEL_DIAMETER 0.66 +#define MCCONF_SI_WHEEL_DIAMETER 0.572 //banana bike wheel outer diameter // Battery Type #define MCCONF_SI_BATTERY_TYPE 0 diff --git a/hwconf/luna/bbshd/qmlui_luna_bbshd.c b/hwconf/luna/bbshd/qmlui_luna_bbshd.c new file mode 100644 index 00000000..e1d323c7 --- /dev/null +++ b/hwconf/luna/bbshd/qmlui_luna_bbshd.c @@ -0,0 +1,379 @@ +// This file is autogenerated by VESC Tool + +#include "qmlui_luna_bbshd.h" + +uint8_t data_qml_hw[5953] = { + 0x00, 0x01, 0x73, 0xa7, 0x78, 0xda, 0xed, 0x3d, 0xdb, 0x72, 0xdb, 0xb8, 0x92, 0xef, 0xfe, 0x0a, + 0x8c, 0xb6, 0x76, 0x56, 0x3e, 0xeb, 0x43, 0x49, 0xbe, 0x65, 0x46, 0x5b, 0xd9, 0x54, 0xe2, 0xc4, + 0x89, 0xab, 0xe2, 0x73, 0x3c, 0x96, 0xe3, 0xbc, 0xa4, 0xca, 0x05, 0x4b, 0x90, 0x8c, 0x0a, 0x6f, + 0x03, 0x40, 0xb6, 0x73, 0xa6, 0x5c, 0xb5, 0x1f, 0xb0, 0x5f, 0xb9, 0x5f, 0xb2, 0x00, 0x6f, 0x22, + 0x25, 0x5e, 0x00, 0x12, 0xb4, 0x24, 0x07, 0x9c, 0x19, 0x8f, 0x4d, 0x02, 0xdd, 0xb8, 0xf4, 0x0d, + 0x0d, 0x74, 0x03, 0x3b, 0xbe, 0x47, 0x18, 0xb8, 0x46, 0x93, 0x09, 0x22, 0xd6, 0x3d, 0xa2, 0xe3, + 0xe0, 0x07, 0x76, 0x19, 0x22, 0x53, 0x38, 0x46, 0x60, 0x60, 0xf5, 0xff, 0x0b, 0x87, 0x85, 0x3a, + 0x7f, 0x92, 0xf1, 0xb0, 0xe7, 0x78, 0xb7, 0xd8, 0x46, 0x9d, 0xf8, 0xe5, 0x1f, 0xec, 0x8f, 0x39, + 0x1e, 0x7f, 0x07, 0xfb, 0xd6, 0xab, 0x9d, 0xec, 0x2b, 0xeb, 0xc4, 0x73, 0x19, 0xf1, 0x6c, 0xca, + 0xbf, 0xed, 0x2f, 0x7f, 0xfb, 0x0c, 0x7f, 0x78, 0x73, 0x46, 0x39, 0xf8, 0x83, 0xc5, 0x27, 0xcb, + 0x86, 0xb7, 0xd4, 0xa2, 0x88, 0x31, 0xec, 0xce, 0xc4, 0xb7, 0x3e, 0x80, 0x14, 0xfc, 0x31, 0x8a, + 0x5e, 0xc4, 0x05, 0x4b, 0x1b, 0x9b, 0x57, 0xe8, 0xd6, 0x46, 0x73, 0xc8, 0xdf, 0x15, 0x7c, 0x1e, + 0x7b, 0x8e, 0x03, 0xdd, 0x09, 0x2d, 0xfe, 0xee, 0x4e, 0xf1, 0xcc, 0x87, 0x04, 0x3a, 0x85, 0x65, + 0xe6, 0x0c, 0xdb, 0x98, 0xfd, 0x08, 0x3e, 0xef, 0x9c, 0x31, 0xe4, 0x80, 0xbf, 0x76, 0x00, 0x7f, + 0xf0, 0x64, 0x08, 0x1c, 0x88, 0x5d, 0xf1, 0x2a, 0x78, 0x01, 0xdd, 0xf1, 0x9d, 0x47, 0xa8, 0x35, + 0xc5, 0xb6, 0x3d, 0x04, 0x1c, 0x28, 0x72, 0x59, 0xf0, 0xa1, 0xd7, 0x8b, 0x3f, 0x39, 0x90, 0xcc, + 0xb0, 0x4b, 0x87, 0x60, 0xd0, 0x0f, 0x3f, 0x4c, 0xf1, 0x23, 0x60, 0x77, 0x98, 0xee, 0x04, 0x05, + 0x7d, 0xe2, 0xf9, 0x88, 0x70, 0x5c, 0xef, 0x6c, 0xf4, 0x45, 0x74, 0xcb, 0xe1, 0xbf, 0x0c, 0x79, + 0x6b, 0xe8, 0xf8, 0x6c, 0x2a, 0xfa, 0xfa, 0x1e, 0xdd, 0xe3, 0x31, 0xea, 0xee, 0x66, 0x4b, 0x9f, + 0xc4, 0xbd, 0x74, 0xe2, 0xdf, 0x92, 0x3a, 0xf1, 0x00, 0x2c, 0x57, 0xb9, 0x87, 0x04, 0x4c, 0x1f, + 0xae, 0x11, 0xa1, 0xd8, 0x73, 0x87, 0x8b, 0x8a, 0xd6, 0x0c, 0xb1, 0xd3, 0xf8, 0xfd, 0x2a, 0x1e, + 0x31, 0x5a, 0x17, 0xe1, 0x68, 0x39, 0xe7, 0x63, 0xf1, 0x77, 0x82, 0xc9, 0x19, 0x87, 0x9f, 0xcb, + 0x2b, 0xbd, 0xf5, 0xfd, 0x4c, 0x2d, 0x18, 0xfe, 0x5d, 0x55, 0xed, 0xcc, 0x9d, 0x7a, 0x99, 0x7a, + 0x38, 0x7a, 0xb1, 0x5a, 0xf1, 0xd6, 0xf3, 0x6c, 0x80, 0xe9, 0x27, 0x8f, 0xe0, 0x7f, 0x71, 0x2a, + 0x85, 0x7c, 0x2a, 0x1e, 0xf0, 0x84, 0xdd, 0x81, 0xff, 0x06, 0x77, 0x08, 0xcf, 0xee, 0xd8, 0x4e, + 0x4e, 0x79, 0x3a, 0xbe, 0x43, 0x93, 0xb9, 0x8d, 0x04, 0xc8, 0xaf, 0x04, 0x33, 0x3e, 0xe8, 0x53, + 0x68, 0x53, 0x94, 0x53, 0x94, 0xcf, 0x18, 0x9a, 0x5c, 0xdd, 0x11, 0x8f, 0x31, 0x3b, 0x29, 0xb6, + 0x3a, 0xb8, 0xe1, 0xf4, 0x5f, 0xc1, 0xdb, 0x77, 0x90, 0xc4, 0xc4, 0x60, 0xb1, 0xe0, 0xcf, 0x84, + 0x60, 0x82, 0x1f, 0x7c, 0xe4, 0x7d, 0xcf, 0x15, 0x5f, 0x3d, 0x57, 0xfc, 0x6e, 0x23, 0x86, 0x38, + 0x65, 0x85, 0x34, 0x16, 0x80, 0x4d, 0x41, 0xb2, 0xee, 0x31, 0xc5, 0x9c, 0x0e, 0xc0, 0x6b, 0xc0, + 0xc8, 0x1c, 0xe5, 0x97, 0x41, 0x2e, 0xe4, 0x45, 0x26, 0xe9, 0x32, 0x4f, 0x3b, 0x11, 0x2e, 0x7b, + 0xee, 0xb8, 0x21, 0x83, 0xa6, 0x30, 0xe4, 0x12, 0x6e, 0xf2, 0x35, 0x84, 0x9a, 0x2a, 0x1e, 0x13, + 0x7f, 0xd8, 0x9b, 0xcc, 0xeb, 0xb0, 0xee, 0x30, 0xd3, 0x9e, 0x4c, 0x81, 0x3c, 0x54, 0x62, 0x24, + 0x32, 0x85, 0xc6, 0x73, 0x22, 0xde, 0x9f, 0xb9, 0x13, 0xf4, 0x38, 0x04, 0xf4, 0x01, 0xfb, 0xe8, + 0x1a, 0xa3, 0x07, 0x2b, 0xfd, 0x3e, 0x53, 0x21, 0xec, 0x51, 0x00, 0xf4, 0xab, 0x98, 0xeb, 0x61, + 0x76, 0x74, 0x82, 0x06, 0xf3, 0x91, 0xc5, 0x63, 0xcc, 0xa2, 0xef, 0xfd, 0x2c, 0x42, 0x1b, 0xfb, + 0x51, 0x9d, 0x6c, 0x77, 0xe2, 0x19, 0xe5, 0x72, 0x08, 0xdc, 0xce, 0x19, 0xf3, 0x04, 0xef, 0x1e, + 0x56, 0x95, 0x89, 0x70, 0x0c, 0xfa, 0xfd, 0x2c, 0x38, 0x31, 0x1e, 0x41, 0x81, 0xa5, 0xc1, 0x14, + 0x0f, 0x43, 0x8f, 0x7c, 0xdc, 0xfe, 0xa4, 0x57, 0xa4, 0xdb, 0xb9, 0xc4, 0x13, 0xd4, 0xd9, 0x5d, + 0x29, 0xf2, 0x10, 0x82, 0x3d, 0x87, 0xec, 0x8e, 0x0b, 0x92, 0xc7, 0x6e, 0x38, 0xfe, 0x56, 0x0a, + 0xe7, 0xde, 0x4a, 0x9d, 0x15, 0x34, 0x61, 0x9d, 0x90, 0x23, 0x7a, 0x20, 0x03, 0x82, 0x66, 0x51, + 0x3e, 0xd5, 0x6a, 0xfb, 0xd5, 0xdc, 0xdd, 0xda, 0xb6, 0xbf, 0xc3, 0xdf, 0x11, 0x38, 0x39, 0xfd, + 0xb8, 0xad, 0xed, 0x3f, 0xc5, 0xc4, 0x79, 0xe0, 0x2c, 0xb5, 0x49, 0xed, 0x7f, 0x5a, 0xb0, 0xc0, + 0x28, 0x66, 0xe4, 0x1c, 0x59, 0x92, 0x30, 0x79, 0x89, 0x20, 0x88, 0x10, 0xca, 0x48, 0x81, 0x4f, + 0x81, 0xa4, 0xcf, 0x11, 0x03, 0x05, 0x92, 0x42, 0x4a, 0x1a, 0x5c, 0xc0, 0x19, 0xca, 0x99, 0x81, + 0x4b, 0xf6, 0x1e, 0x32, 0xc8, 0x2d, 0x99, 0xb9, 0x9f, 0xf3, 0xb5, 0xd0, 0x28, 0x28, 0x9e, 0xee, + 0x27, 0x29, 0xb4, 0xb7, 0x70, 0xfc, 0x7d, 0x46, 0xbc, 0xb9, 0xcb, 0x47, 0xef, 0x12, 0x8d, 0x19, + 0x74, 0x67, 0x76, 0x5e, 0x39, 0xf1, 0x78, 0x3e, 0xe4, 0xa2, 0xef, 0x07, 0x17, 0x7b, 0x56, 0x3f, + 0x07, 0xf9, 0xca, 0xab, 0x02, 0x3d, 0x91, 0xd7, 0x2f, 0xe6, 0xf9, 0xe7, 0x81, 0x51, 0x33, 0x04, + 0x47, 0xa5, 0x05, 0x6f, 0xb9, 0xc2, 0xf4, 0x9c, 0xb8, 0xec, 0x80, 0xdb, 0x3e, 0x36, 0x82, 0xf7, + 0x08, 0x50, 0x5f, 0x98, 0x77, 0x53, 0x8f, 0x00, 0xca, 0x20, 0x9b, 0xd3, 0x5b, 0x48, 0xde, 0x94, + 0x02, 0xca, 0xd7, 0x52, 0xab, 0x13, 0xb8, 0x50, 0xe0, 0xcb, 0x4f, 0xa4, 0x44, 0x73, 0xc8, 0x23, + 0x7e, 0x44, 0xa3, 0xb8, 0x5d, 0x2a, 0xfa, 0x94, 0xfb, 0x3d, 0x57, 0x27, 0x2e, 0xd3, 0x34, 0xd7, + 0x0c, 0xbc, 0xad, 0x88, 0x2e, 0xeb, 0xc0, 0x62, 0x0a, 0x8f, 0x6a, 0x8c, 0xf2, 0x35, 0x5e, 0x21, + 0x90, 0x8c, 0xe1, 0x61, 0x43, 0xca, 0x2e, 0x42, 0x38, 0x11, 0x54, 0x39, 0x20, 0x12, 0x3a, 0x54, + 0x5a, 0x9f, 0xca, 0x70, 0x53, 0xb5, 0x9e, 0x3d, 0x50, 0x29, 0x5f, 0xa4, 0x73, 0x65, 0xe5, 0x68, + 0x91, 0x4c, 0x1d, 0x31, 0x82, 0x10, 0xfb, 0xe6, 0xda, 0x68, 0x06, 0xed, 0x1c, 0xc1, 0x5a, 0x26, + 0x64, 0x2b, 0x25, 0xea, 0xa2, 0x3b, 0x31, 0xa1, 0xa8, 0x49, 0xe4, 0x9c, 0xfa, 0xb1, 0x74, 0x5e, + 0x85, 0x49, 0x8b, 0x1b, 0xff, 0xa4, 0x75, 0xc8, 0xae, 0x08, 0xc4, 0x66, 0xa8, 0xa4, 0x86, 0xea, + 0xf3, 0x7c, 0x82, 0xc7, 0x5c, 0x88, 0xd3, 0x9f, 0x6b, 0xb8, 0x9e, 0xf2, 0x79, 0xb4, 0xc8, 0x40, + 0x28, 0x10, 0xac, 0xa3, 0x5c, 0x9b, 0xa1, 0x52, 0xba, 0xd2, 0x52, 0x23, 0x42, 0xd5, 0xa0, 0x50, + 0x35, 0x2e, 0x8a, 0x44, 0x63, 0x61, 0xa1, 0x5e, 0x0f, 0x84, 0x32, 0x08, 0x7c, 0x16, 0x22, 0xa8, + 0xb0, 0x5c, 0x60, 0x26, 0x14, 0x7e, 0x2d, 0x27, 0x49, 0x09, 0x7d, 0x5f, 0x4b, 0xf7, 0xb7, 0x62, + 0x07, 0xd4, 0xb3, 0x09, 0x54, 0xec, 0x03, 0x35, 0x5b, 0x41, 0xc5, 0x6e, 0xc8, 0x50, 0x3b, 0x67, + 0x7c, 0xdb, 0xae, 0x20, 0xf7, 0x2c, 0x25, 0x48, 0x19, 0x93, 0x15, 0x94, 0x26, 0x55, 0xdc, 0x73, + 0x19, 0x07, 0x1d, 0x11, 0x71, 0xe4, 0xbc, 0x08, 0xf8, 0x5f, 0xaa, 0x7a, 0x11, 0xdf, 0x48, 0x55, + 0x56, 0xa4, 0xc5, 0x46, 0x34, 0x59, 0x41, 0x9b, 0xca, 0xf5, 0xd5, 0xc8, 0xb0, 0x0e, 0x39, 0xd6, + 0x23, 0xcb, 0x3a, 0xe4, 0x19, 0x3f, 0x29, 0x8f, 0xa7, 0xec, 0x23, 0x44, 0x96, 0xe0, 0x66, 0xa2, + 0x54, 0x4b, 0xd1, 0x00, 0xd5, 0x21, 0xb0, 0x25, 0xf5, 0x52, 0xde, 0xf3, 0x91, 0x6b, 0x6d, 0xff, + 0x9d, 0xf7, 0xa8, 0x38, 0x34, 0xc1, 0x5a, 0x37, 0x10, 0xe7, 0x57, 0x1e, 0xf9, 0x73, 0x8e, 0x38, + 0x04, 0xc5, 0xa1, 0x65, 0x38, 0xf0, 0x3b, 0x46, 0xa6, 0x56, 0xe4, 0x87, 0x04, 0x21, 0xb4, 0x0a, + 0x2b, 0xa2, 0xa9, 0xbe, 0xca, 0x7b, 0x2e, 0xbd, 0x07, 0x65, 0x5e, 0x4d, 0xd1, 0x49, 0x23, 0xb6, + 0x5d, 0x15, 0x8c, 0x75, 0x19, 0x58, 0x0f, 0x23, 0x37, 0x61, 0xe8, 0x66, 0x8c, 0x9d, 0xc3, 0xe0, + 0xaa, 0x55, 0xaf, 0xb8, 0x59, 0x5a, 0x63, 0x0e, 0x17, 0x16, 0x6d, 0x42, 0x8c, 0xdf, 0xdc, 0xb7, + 0x8e, 0x4f, 0x3b, 0xb5, 0x40, 0x8d, 0x3d, 0xdb, 0x23, 0xc3, 0xbf, 0x82, 0xff, 0xbd, 0xfe, 0x12, + 0xee, 0xbc, 0x88, 0x3d, 0x89, 0xb7, 0xbe, 0xff, 0x09, 0x3d, 0x9e, 0x88, 0xd7, 0xdd, 0x8e, 0x2d, + 0x58, 0x5b, 0xb4, 0xb7, 0xb3, 0xfb, 0x54, 0x0b, 0xcb, 0x5d, 0xb2, 0x39, 0xf0, 0x96, 0xc3, 0x72, + 0x9d, 0xc0, 0x67, 0x2d, 0x00, 0x5a, 0xc1, 0xdf, 0x9f, 0x4e, 0x90, 0xd8, 0x77, 0xaa, 0x05, 0x3a, + 0xe2, 0x29, 0x07, 0xbb, 0xd8, 0x99, 0x3b, 0xa9, 0x55, 0xa9, 0x2a, 0x20, 0xf5, 0x9e, 0x8d, 0x6c, + 0x3c, 0x41, 0xa4, 0xe6, 0x1c, 0x2e, 0x0b, 0xa6, 0x10, 0x58, 0x2d, 0x50, 0x94, 0x21, 0x7f, 0x84, + 0xff, 0x85, 0x44, 0xbf, 0x6b, 0x01, 0x98, 0x12, 0xcf, 0x19, 0x82, 0xfd, 0x7a, 0x95, 0xef, 0xa1, + 0x3d, 0xe7, 0xa8, 0x0f, 0xeb, 0xd5, 0x66, 0x1e, 0x6f, 0xf5, 0x51, 0x9f, 0x8b, 0x14, 0xbe, 0xcc, + 0x02, 0xfe, 0x1d, 0xa4, 0x08, 0x40, 0x4e, 0xcd, 0x4d, 0x68, 0xa1, 0x91, 0x7c, 0x4d, 0xd8, 0xd3, + 0xf3, 0xec, 0x2b, 0xec, 0xd7, 0x9c, 0xdd, 0xf4, 0xde, 0xcc, 0xea, 0x2c, 0x5b, 0x77, 0xd0, 0x9d, + 0xd8, 0xa8, 0x36, 0xe4, 0x44, 0x66, 0xe5, 0x80, 0xf6, 0x09, 0xa2, 0x14, 0x4d, 0x6a, 0xc3, 0x0e, + 0x65, 0x4b, 0x0e, 0xe0, 0x60, 0x9e, 0xb9, 0xde, 0x38, 0x15, 0xfb, 0x71, 0xdd, 0xda, 0xf0, 0x17, + 0xcf, 0x60, 0xb7, 0x16, 0x90, 0xa7, 0x96, 0x39, 0xfb, 0x69, 0x23, 0xad, 0x97, 0x0b, 0x48, 0x55, + 0x4d, 0x97, 0x75, 0x5b, 0x1b, 0x46, 0xb7, 0x37, 0xd0, 0xed, 0x17, 0x6f, 0x47, 0x46, 0xad, 0x6f, + 0xb5, 0x5a, 0xe7, 0x1c, 0xab, 0x47, 0xa7, 0x37, 0x50, 0xe9, 0x8d, 0x34, 0xfa, 0x7e, 0x7d, 0x8d, + 0xde, 0xae, 0xfa, 0x18, 0xec, 0x72, 0x73, 0xe1, 0xdf, 0x81, 0x37, 0x7d, 0xc9, 0xf6, 0x42, 0x42, + 0x3e, 0x9a, 0x8d, 0x85, 0x05, 0x5c, 0x9d, 0x96, 0xc2, 0x02, 0xaa, 0x31, 0x13, 0xd6, 0x6a, 0x26, + 0x78, 0x0f, 0x88, 0x18, 0x43, 0xe1, 0x67, 0x32, 0x14, 0xc4, 0x8c, 0x1b, 0x23, 0x61, 0x5b, 0x8d, + 0x04, 0x31, 0x7b, 0x5a, 0xcc, 0x84, 0xfd, 0xa3, 0xfe, 0xba, 0x0c, 0x85, 0x57, 0x47, 0xf5, 0x2d, + 0x05, 0x5e, 0x57, 0x2c, 0xfe, 0xc7, 0xde, 0xdc, 0x9e, 0x80, 0x5b, 0x04, 0xe6, 0xfe, 0x04, 0x32, + 0x34, 0x09, 0x9a, 0x05, 0x6e, 0x21, 0x63, 0xf1, 0x9e, 0x22, 0xb0, 0xb1, 0x83, 0x19, 0xf8, 0x4f, + 0x20, 0xfc, 0x04, 0xf7, 0x9e, 0xcd, 0xe0, 0x0c, 0xbd, 0x3c, 0xa5, 0xbf, 0x20, 0x07, 0xdd, 0x6a, + 0x3f, 0x05, 0x59, 0xab, 0xe2, 0x4f, 0xc1, 0x35, 0xaa, 0x7f, 0x9d, 0xaa, 0xff, 0xd2, 0x77, 0x8c, + 0xe2, 0xff, 0x89, 0x14, 0xff, 0xe5, 0xc5, 0xb9, 0x51, 0xfb, 0x5b, 0xaa, 0xf6, 0x39, 0xaf, 0x6e, + 0x80, 0xd2, 0x3f, 0xea, 0x37, 0x52, 0xfb, 0x07, 0xfd, 0x7e, 0x7d, 0xbd, 0x7f, 0x5c, 0x17, 0xf9, + 0x26, 0xab, 0xef, 0x64, 0x5a, 0x35, 0x2b, 0xef, 0x05, 0x5c, 0x9d, 0xaa, 0x7b, 0x01, 0xd5, 0x28, + 0xee, 0x75, 0x2a, 0xee, 0x78, 0x1b, 0xf7, 0x12, 0x51, 0xdf, 0x73, 0x29, 0x32, 0x5a, 0xfc, 0x27, + 0xd2, 0xe2, 0x8b, 0x3d, 0xfc, 0x78, 0xfa, 0x8d, 0x52, 0xdf, 0xd6, 0x7d, 0xfc, 0x25, 0x3e, 0xd6, + 0xa2, 0xe1, 0xfb, 0x56, 0x13, 0xff, 0xff, 0x41, 0x13, 0xfd, 0xde, 0xb7, 0x7e, 0xaf, 0xad, 0xde, + 0xfb, 0xd6, 0xc1, 0xcb, 0xdb, 0xc1, 0xcf, 0x9d, 0x5f, 0xdd, 0x7b, 0xf9, 0xf9, 0x48, 0xb4, 0xee, + 0xea, 0xe7, 0xa3, 0x30, 0x46, 0xc0, 0x26, 0x18, 0x01, 0x1f, 0x1e, 0x7d, 0xcf, 0x18, 0x00, 0x3f, + 0xa5, 0x01, 0xf0, 0x19, 0xbb, 0x08, 0x12, 0xae, 0xb7, 0x8d, 0x05, 0xb0, 0xe5, 0x16, 0x80, 0x60, + 0xe2, 0xed, 0xde, 0xfb, 0xff, 0xbd, 0xc1, 0x69, 0xbe, 0x17, 0xb8, 0xb0, 0x5f, 0x9d, 0xd8, 0x96, + 0xd4, 0x7e, 0x0a, 0x41, 0x1b, 0x2a, 0x3f, 0x05, 0x3e, 0xab, 0xee, 0x5f, 0x80, 0xae, 0x7e, 0x36, + 0x55, 0x7d, 0x9a, 0x4e, 0x48, 0xa2, 0x49, 0x57, 0xaf, 0x55, 0x55, 0x1b, 0x4d, 0x2d, 0xa5, 0xa9, + 0x83, 0x79, 0x07, 0xe6, 0xd0, 0xfd, 0x7a, 0x55, 0xf5, 0xc9, 0x1d, 0x1a, 0x7f, 0x57, 0x67, 0xdf, + 0x0a, 0x36, 0x0e, 0xa0, 0xde, 0x2a, 0xf2, 0x72, 0x32, 0x9d, 0xa2, 0xb2, 0xc8, 0x21, 0x54, 0x8f, + 0x25, 0x34, 0x89, 0x85, 0xf5, 0x4b, 0xd7, 0xea, 0x52, 0xe5, 0x25, 0x9e, 0x8a, 0x3e, 0xec, 0xd4, + 0x58, 0xa1, 0xf5, 0x7a, 0x20, 0x88, 0x8b, 0x2f, 0x8f, 0xdf, 0x35, 0x61, 0xba, 0x35, 0xe5, 0xba, + 0x09, 0xd3, 0x35, 0x61, 0xba, 0x2d, 0x3b, 0x06, 0x4c, 0x98, 0xae, 0x2e, 0xd5, 0xb0, 0x1d, 0x61, + 0xba, 0x4c, 0x88, 0x6b, 0x13, 0xa5, 0x6b, 0xa2, 0x74, 0x5f, 0xaa, 0x83, 0xcf, 0x2c, 0x18, 0xb6, + 0xd2, 0xb7, 0x97, 0x92, 0x4b, 0xdb, 0x1e, 0xa4, 0x3b, 0xe8, 0x9b, 0x28, 0xdd, 0x02, 0x47, 0xdf, + 0xca, 0x2c, 0x6b, 0xf3, 0xf0, 0xad, 0x42, 0xd6, 0xe3, 0xda, 0x5b, 0x85, 0x6b, 0xb6, 0xf0, 0xd6, + 0x68, 0xb9, 0x98, 0x08, 0x5d, 0x13, 0xa1, 0x6b, 0x54, 0xfa, 0x16, 0xa9, 0xf4, 0xed, 0x0f, 0xd0, + 0x3d, 0xaa, 0xad, 0xcc, 0x5b, 0xd5, 0x1d, 0x2f, 0x3c, 0x3e, 0x37, 0x4b, 0x3c, 0x7a, 0xcd, 0x04, + 0xdd, 0xd1, 0xb9, 0x4b, 0x40, 0x8d, 0x81, 0xb0, 0x4e, 0x03, 0xc1, 0xc4, 0xe6, 0x9a, 0xd8, 0x5c, + 0x63, 0x1e, 0x6c, 0x8d, 0x79, 0xf0, 0x12, 0x42, 0x73, 0xf7, 0x8f, 0xfa, 0x26, 0x36, 0x57, 0x8f, + 0xc2, 0x6f, 0x21, 0x34, 0x77, 0x05, 0xb0, 0x4e, 0xa5, 0x6f, 0x02, 0x73, 0x37, 0x43, 0xed, 0x9b, + 0xb8, 0x5c, 0x13, 0x97, 0x6b, 0x54, 0xfe, 0x56, 0xa8, 0xfc, 0x17, 0x11, 0x96, 0x7b, 0x64, 0xc2, + 0x72, 0xb3, 0x9a, 0x5b, 0x7f, 0x54, 0xee, 0x12, 0x58, 0x8d, 0x5a, 0xdb, 0xc4, 0xe4, 0x6e, 0x84, + 0xce, 0x36, 0x21, 0xb9, 0x3f, 0xb1, 0x02, 0x37, 0x21, 0xb9, 0x2f, 0x45, 0x9f, 0xbf, 0xbc, 0x88, + 0xdc, 0x43, 0x13, 0x91, 0x9b, 0xda, 0xad, 0x6f, 0x37, 0x20, 0xb7, 0x0c, 0x87, 0xce, 0x1d, 0x7c, + 0x13, 0x8e, 0xbb, 0xb1, 0xfa, 0xdf, 0x44, 0xe3, 0x9a, 0x68, 0x5c, 0xa3, 0xfc, 0xb7, 0x5b, 0xf9, + 0x9b, 0x60, 0xdc, 0x97, 0xa9, 0xf5, 0x5b, 0x88, 0xc5, 0x2d, 0x82, 0xdf, 0x82, 0xb6, 0x2f, 0x8c, + 0xc4, 0x35, 0x9a, 0xfe, 0x99, 0x82, 0x79, 0x83, 0xe9, 0x30, 0xb1, 0xbc, 0x26, 0x96, 0xd7, 0x1c, + 0xcd, 0xdf, 0xe2, 0x58, 0xde, 0x55, 0x2e, 0x36, 0xa1, 0xbc, 0xe5, 0x25, 0x65, 0x0b, 0x6a, 0x0b, + 0xf9, 0x2d, 0xb7, 0x1a, 0x9e, 0x6a, 0x06, 0xf7, 0x26, 0x37, 0x39, 0x6f, 0x69, 0x80, 0xaf, 0x89, + 0xe1, 0xcd, 0x4e, 0xa8, 0x89, 0xe1, 0xd5, 0x4b, 0x76, 0x4d, 0xc9, 0x4f, 0x8f, 0x3b, 0xc1, 0xc4, + 0xf0, 0xea, 0xd2, 0x09, 0x5b, 0x12, 0xc3, 0x6b, 0xc2, 0x77, 0x4d, 0xf8, 0xee, 0x0b, 0xf5, 0x08, + 0x9a, 0x35, 0xc2, 0x76, 0x3a, 0x03, 0x5f, 0x46, 0xe4, 0xee, 0x91, 0x89, 0xdc, 0x2d, 0xf2, 0x0a, + 0xb6, 0x12, 0xb4, 0xdb, 0x42, 0xbc, 0xae, 0x09, 0xd5, 0x5d, 0xbf, 0x81, 0xe2, 0x9b, 0x28, 0x5d, + 0x13, 0xa5, 0x6b, 0x34, 0xf7, 0x56, 0x68, 0x6e, 0x7f, 0xdb, 0x03, 0x74, 0x0f, 0x1a, 0x04, 0xe8, + 0x9a, 0xd8, 0xdc, 0x3a, 0xb6, 0x80, 0xaf, 0x3d, 0x2c, 0xd7, 0xd7, 0x1c, 0x91, 0xeb, 0x9b, 0x60, + 0xdc, 0x75, 0x9b, 0x00, 0x26, 0x0e, 0xd7, 0xc4, 0xe1, 0x1a, 0x03, 0x60, 0x1b, 0x0c, 0x80, 0x17, + 0x72, 0x3b, 0xae, 0x09, 0xc1, 0x6d, 0xac, 0xd7, 0x5b, 0x88, 0xbe, 0xf5, 0xb5, 0x07, 0xde, 0xfa, + 0x26, 0xe6, 0x76, 0xed, 0xda, 0x9d, 0x98, 0x70, 0x5b, 0x13, 0x6e, 0x6b, 0x34, 0xfb, 0x86, 0x6b, + 0x76, 0xf2, 0x12, 0x22, 0x6d, 0x8f, 0x8f, 0x4c, 0xa4, 0x6d, 0xac, 0xa0, 0x89, 0xf6, 0x20, 0x5b, + 0xa2, 0x39, 0xbe, 0x96, 0x98, 0xd0, 0xda, 0x35, 0xab, 0x66, 0x66, 0xa2, 0x6a, 0x81, 0xd9, 0x47, + 0x37, 0x51, 0xb5, 0x5b, 0xbc, 0x97, 0xfe, 0xe2, 0x02, 0x6a, 0x0f, 0x4c, 0x40, 0x6d, 0xb8, 0x89, + 0xde, 0x72, 0x2c, 0x6d, 0xab, 0x61, 0xb4, 0x26, 0x82, 0x76, 0x13, 0xd5, 0xbc, 0x09, 0x9e, 0x35, + 0xc1, 0xb3, 0x46, 0xc7, 0x6f, 0xad, 0x8e, 0x37, 0x71, 0xb3, 0x2f, 0x4e, 0xb9, 0xb7, 0x11, 0x32, + 0xdb, 0x5a, 0xb4, 0xac, 0x09, 0x94, 0xd5, 0x59, 0xb2, 0x81, 0x3e, 0x9f, 0x9a, 0x18, 0x59, 0x13, + 0x23, 0x6b, 0xce, 0xbf, 0x6f, 0x6f, 0x8c, 0xec, 0xd4, 0x84, 0xc7, 0x6e, 0x70, 0x78, 0x6c, 0xbd, + 0xaf, 0xf9, 0x5f, 0xf2, 0xdf, 0xca, 0x08, 0xd0, 0xe0, 0xb8, 0x05, 0xf1, 0xf8, 0xb4, 0x20, 0xca, + 0xcb, 0xef, 0x34, 0x91, 0x85, 0x72, 0x32, 0x4f, 0x26, 0x60, 0xef, 0xdd, 0x9c, 0x31, 0xcf, 0xad, + 0x20, 0xfd, 0x78, 0x23, 0x10, 0xc1, 0xc9, 0x37, 0x77, 0x84, 0x18, 0xe3, 0x50, 0x2b, 0x04, 0x55, + 0x44, 0x84, 0xe3, 0x20, 0x1e, 0x73, 0xe4, 0x43, 0x77, 0x08, 0xf6, 0x65, 0x2a, 0x70, 0xd3, 0x66, + 0x8a, 0x08, 0x41, 0x93, 0x88, 0x74, 0xf7, 0x2b, 0x44, 0xc0, 0x72, 0xb5, 0x38, 0x72, 0xef, 0x37, + 0xa9, 0x6a, 0x2a, 0x3c, 0xe2, 0xb9, 0x27, 0x36, 0x0e, 0x79, 0xb3, 0x5a, 0x50, 0xb0, 0xb9, 0x8b, + 0xbe, 0xf2, 0xe5, 0x19, 0x8a, 0x47, 0x2b, 0x1c, 0x67, 0x0b, 0xb9, 0x90, 0xcf, 0xdb, 0x04, 0xbc, + 0x96, 0xe3, 0xc9, 0x5b, 0xfc, 0x5d, 0x06, 0x4c, 0x25, 0x1c, 0xe7, 0xc4, 0x73, 0x1c, 0x6e, 0x8f, + 0x52, 0xa1, 0x13, 0xce, 0xc7, 0x63, 0xcf, 0x9d, 0x76, 0x77, 0xd5, 0x6a, 0x71, 0x4d, 0x72, 0x12, + 0x56, 0xab, 0xac, 0xd7, 0xeb, 0x85, 0x62, 0x2c, 0xb8, 0x53, 0x19, 0x02, 0x07, 0xb2, 0xf1, 0x1d, + 0xc0, 0x6e, 0x78, 0x78, 0x83, 0x1b, 0x0c, 0x93, 0xe8, 0x64, 0x6c, 0x7c, 0xb0, 0x86, 0x79, 0x80, + 0x22, 0x1b, 0x8d, 0xf9, 0x6f, 0x77, 0x28, 0xe6, 0x91, 0xea, 0xd8, 0x6a, 0x48, 0xc0, 0x9c, 0xa2, + 0x33, 0xc7, 0x47, 0x04, 0x43, 0x9b, 0x8f, 0xc5, 0x35, 0xa2, 0xe3, 0xb3, 0xa9, 0x95, 0x7a, 0xf9, + 0xc5, 0xc5, 0x8c, 0x4a, 0xf4, 0x54, 0xc0, 0xc2, 0x8e, 0x7f, 0x0a, 0x79, 0x1b, 0x5e, 0x67, 0xa0, + 0xbe, 0x01, 0x07, 0xbf, 0x5b, 0x07, 0xaf, 0xfa, 0x03, 0x10, 0xa8, 0xa3, 0xbe, 0xd5, 0xdf, 0x91, + 0x82, 0x16, 0xf6, 0xf5, 0x35, 0x70, 0xce, 0xc7, 0x62, 0xd8, 0xc4, 0x08, 0x5e, 0x40, 0x02, 0x9d, + 0xf7, 0xde, 0x9c, 0xcf, 0x1c, 0xd7, 0xc5, 0x37, 0x0f, 0x90, 0xb1, 0x1b, 0x07, 0x3e, 0x76, 0xe4, + 0x9a, 0x17, 0x1e, 0x57, 0x2e, 0x85, 0x18, 0x8d, 0x67, 0x08, 0x54, 0x45, 0x90, 0x0a, 0xf8, 0xc4, + 0x77, 0x4a, 0x81, 0x73, 0xa0, 0x37, 0x88, 0x17, 0xe2, 0x90, 0x7b, 0xe0, 0xd0, 0x12, 0x67, 0xa6, + 0xba, 0x87, 0xbc, 0x9b, 0x36, 0x9f, 0x31, 0x88, 0x09, 0x95, 0xeb, 0x85, 0x0f, 0xa9, 0xc0, 0x12, + 0x11, 0xd3, 0x0a, 0x1a, 0xe8, 0xfb, 0x37, 0xbc, 0xc8, 0x8d, 0x20, 0x50, 0x2b, 0xee, 0x0e, 0x1d, + 0x43, 0x9b, 0xd3, 0x3e, 0x47, 0xfc, 0xb7, 0x68, 0x14, 0xe4, 0x06, 0x6c, 0xc9, 0x67, 0x59, 0x85, + 0x17, 0x4e, 0xc6, 0x21, 0x5e, 0xfe, 0xde, 0xbf, 0x61, 0xd8, 0x41, 0x37, 0xbe, 0x47, 0x65, 0x67, + 0x27, 0xb5, 0x96, 0xe2, 0x88, 0x06, 0x82, 0x50, 0xc0, 0xdf, 0x41, 0x57, 0x0e, 0x63, 0x5c, 0xfb, + 0x06, 0x3d, 0xfa, 0x9d, 0x5d, 0xd1, 0xcf, 0xbf, 0xef, 0x0b, 0x4a, 0x93, 0xc1, 0x2c, 0x8e, 0xa8, + 0x9d, 0xf0, 0x91, 0x2a, 0x9d, 0x3c, 0xec, 0x66, 0x89, 0x43, 0x1e, 0x32, 0xb2, 0x6d, 0x9a, 0x03, + 0xfa, 0xcc, 0x65, 0xdd, 0x0e, 0xc5, 0x37, 0xa2, 0x0c, 0x22, 0x3f, 0x6e, 0xc6, 0xa2, 0x5c, 0x86, + 0xe8, 0xea, 0xa9, 0xf4, 0x18, 0xef, 0x3f, 0xef, 0x11, 0x89, 0xce, 0xd8, 0x55, 0x52, 0xe5, 0x3d, + 0x76, 0x15, 0x7a, 0xf4, 0xc5, 0x9d, 0x24, 0xa0, 0x47, 0x0c, 0x12, 0x56, 0x0a, 0x3f, 0xe9, 0xdf, + 0x9c, 0xd3, 0xa1, 0x28, 0x5d, 0x13, 0xd3, 0x07, 0x77, 0x22, 0x8d, 0x07, 0xb9, 0x13, 0x49, 0x2c, + 0x0f, 0x77, 0x08, 0xd9, 0xef, 0x31, 0x74, 0x10, 0x2b, 0x15, 0x36, 0x7c, 0xa2, 0x82, 0xa2, 0x37, + 0x93, 0xa8, 0x6c, 0xc0, 0x4b, 0x91, 0xc0, 0xab, 0x96, 0x67, 0x78, 0x0a, 0xba, 0xdd, 0x48, 0xa0, + 0xbd, 0x06, 0x94, 0x11, 0xc4, 0xe1, 0x2f, 0x1f, 0xc4, 0xdb, 0x05, 0xbf, 0xfe, 0x0a, 0xba, 0xb1, + 0x94, 0x8a, 0x8b, 0xad, 0x5e, 0x80, 0xc6, 0xc9, 0x5b, 0xce, 0xce, 0x8e, 0x6d, 0xa5, 0x77, 0x90, + 0x58, 0x14, 0x05, 0x34, 0xce, 0xe9, 0xf7, 0x8c, 0x0f, 0xea, 0x63, 0xb7, 0xbf, 0x2b, 0xe7, 0xf0, + 0x29, 0x6a, 0x84, 0x50, 0x9c, 0x72, 0x92, 0x64, 0x01, 0x65, 0xa5, 0xc7, 0x1c, 0x48, 0x38, 0x28, + 0x0d, 0x1f, 0x85, 0x36, 0x2c, 0x25, 0x2f, 0xe7, 0x2d, 0xe0, 0x12, 0x59, 0xa5, 0x0f, 0xd9, 0xd0, + 0x08, 0xd1, 0x03, 0x48, 0x55, 0x46, 0xb2, 0x64, 0x1f, 0x48, 0x8c, 0xe9, 0xd2, 0xe7, 0x1a, 0x90, + 0x97, 0x9d, 0x51, 0x29, 0xa8, 0xe2, 0x53, 0x43, 0x6b, 0x7f, 0x95, 0x9a, 0xf3, 0x6f, 0x72, 0x59, + 0x26, 0xe6, 0x82, 0xcb, 0xfc, 0xb4, 0xd0, 0xf2, 0x40, 0x92, 0x96, 0x0b, 0xda, 0xa0, 0x46, 0xca, + 0xf9, 0xdd, 0x7d, 0x56, 0x4a, 0xce, 0xcb, 0xc2, 0xaf, 0x40, 0xc8, 0x79, 0xf7, 0xed, 0x29, 0xd0, + 0x71, 0x65, 0x42, 0xe0, 0xba, 0x64, 0x5c, 0x9a, 0x7b, 0xb0, 0x6d, 0x2a, 0xf6, 0x2b, 0x09, 0xb8, + 0x1d, 0xda, 0xdd, 0x97, 0x73, 0xef, 0xb2, 0x86, 0x54, 0xeb, 0xb7, 0x44, 0xb0, 0x52, 0xc8, 0x49, + 0x6d, 0x52, 0xf5, 0xeb, 0x53, 0x69, 0x1b, 0x04, 0xaa, 0x8b, 0x36, 0x65, 0x06, 0x2e, 0xb6, 0x4a, + 0xdf, 0x79, 0x8f, 0x16, 0x41, 0xd0, 0xbe, 0x8e, 0x30, 0x69, 0x34, 0x51, 0x13, 0xf3, 0xb4, 0x0a, + 0x47, 0x81, 0xad, 0x2a, 0x85, 0x20, 0x65, 0x87, 0xca, 0x77, 0x45, 0xde, 0x28, 0xcd, 0x35, 0x48, + 0xe5, 0x11, 0xd5, 0xb1, 0x4e, 0x73, 0x2c, 0xd3, 0x7a, 0x08, 0xe5, 0xcc, 0xd4, 0x8c, 0x89, 0x2a, + 0x8b, 0xa8, 0xdc, 0x5e, 0xd5, 0xe9, 0xce, 0x93, 0x76, 0x81, 0x05, 0xfb, 0xb6, 0xf9, 0x4e, 0x9d, + 0xda, 0x12, 0x26, 0x72, 0xab, 0x05, 0x20, 0x65, 0xfd, 0x6a, 0x91, 0xe7, 0x47, 0xc6, 0x3f, 0xfc, + 0x93, 0xbb, 0xe0, 0x36, 0xd7, 0x3f, 0x84, 0xa7, 0xdd, 0xb4, 0x52, 0x1d, 0xa7, 0x34, 0xaa, 0xd0, + 0xd5, 0x7d, 0x59, 0xcd, 0x1c, 0xb3, 0x4f, 0x18, 0xb2, 0x56, 0xe2, 0x0c, 0xda, 0x2b, 0x5e, 0x8d, + 0x35, 0x47, 0x94, 0xf8, 0xb1, 0xf6, 0x0a, 0x97, 0x86, 0xcd, 0x91, 0x24, 0xde, 0xa7, 0xbd, 0x82, + 0x95, 0xd0, 0xdf, 0x84, 0x4f, 0x4a, 0x12, 0x51, 0xec, 0x93, 0xc9, 0xc1, 0x54, 0xea, 0x80, 0xda, + 0x2b, 0x58, 0x45, 0xf5, 0x9a, 0x0e, 0x6f, 0x45, 0x83, 0x0a, 0x3c, 0x53, 0x7b, 0x12, 0x8b, 0xb2, + 0x5d, 0xa0, 0xe9, 0xd1, 0xdb, 0x91, 0x8c, 0xc3, 0x6b, 0x0f, 0x74, 0x63, 0x7f, 0x59, 0xf9, 0x5a, + 0x50, 0x78, 0x1e, 0x03, 0xc7, 0x98, 0xdc, 0xb0, 0x66, 0x36, 0xe5, 0x40, 0xec, 0x91, 0xc8, 0xcd, + 0x64, 0x6b, 0x45, 0xdb, 0x6e, 0x5a, 0x0c, 0xf3, 0x52, 0xe6, 0x1e, 0xb4, 0xc0, 0xdc, 0x45, 0xab, + 0x53, 0xad, 0xbc, 0x5d, 0xb0, 0x50, 0xd6, 0xca, 0xda, 0xb9, 0x4b, 0xc3, 0xe7, 0xe1, 0xec, 0xdc, + 0x65, 0x65, 0xaf, 0xe1, 0xd0, 0xd6, 0xe5, 0xeb, 0xca, 0x45, 0xea, 0x96, 0xb1, 0x75, 0xe9, 0xda, + 0xb8, 0x21, 0x57, 0x17, 0xa7, 0xa7, 0x7e, 0x3e, 0xa6, 0xde, 0x6f, 0x83, 0xa9, 0x5b, 0xe6, 0x67, + 0xbf, 0x5d, 0x56, 0x26, 0x6b, 0xe1, 0x62, 0x7f, 0x95, 0x81, 0x9f, 0x9d, 0x77, 0x5f, 0x10, 0xdb, + 0xb6, 0xc3, 0xb1, 0xd3, 0x96, 0x99, 0xb5, 0x94, 0x44, 0x97, 0xdc, 0x0c, 0x7b, 0xf9, 0x9e, 0x8a, + 0xdd, 0x3a, 0x48, 0xf2, 0xfd, 0x0c, 0x7b, 0x05, 0x8e, 0x8a, 0xdd, 0x66, 0x13, 0x5c, 0xc9, 0x87, + 0xc2, 0x01, 0xb1, 0x57, 0xe6, 0xc2, 0xd8, 0x6d, 0x86, 0x63, 0xd5, 0xf7, 0xb0, 0x57, 0xed, 0xcd, + 0xd0, 0x88, 0x53, 0xb8, 0x1f, 0xf6, 0xaa, 0x9c, 0x19, 0x8d, 0xf0, 0xad, 0x7a, 0x21, 0xf6, 0x4a, + 0xbc, 0x19, 0xbd, 0x78, 0x81, 0x58, 0x8d, 0x93, 0x72, 0x5a, 0x9f, 0xcc, 0x39, 0xed, 0x73, 0xc4, + 0xc1, 0xe2, 0x5f, 0xf6, 0x38, 0x48, 0xf3, 0xc3, 0x4a, 0xd9, 0x37, 0x4b, 0xd1, 0x2a, 0x05, 0xe9, + 0xfc, 0x6f, 0xe1, 0xf8, 0xfb, 0x8c, 0x78, 0x73, 0x97, 0x2f, 0xbb, 0x2f, 0xd1, 0x98, 0x41, 0x77, + 0x66, 0x17, 0xa5, 0xfd, 0xf7, 0xc4, 0x91, 0x23, 0xf6, 0x43, 0xc4, 0x6e, 0xf5, 0x73, 0x90, 0xaf, + 0xbc, 0x92, 0xc8, 0xd7, 0x2e, 0x9d, 0xea, 0xb9, 0x20, 0x99, 0x33, 0xe8, 0xf5, 0x6c, 0x04, 0xef, + 0x51, 0x70, 0x1c, 0x0a, 0x05, 0x67, 0x52, 0x38, 0xbd, 0xb2, 0x39, 0xbd, 0x85, 0xe4, 0x4d, 0x29, + 0xa0, 0xea, 0x10, 0x15, 0xa9, 0x2c, 0xfc, 0x8a, 0x99, 0xf7, 0x25, 0xb2, 0xed, 0xd7, 0xc8, 0xb0, + 0xaf, 0x9a, 0xdc, 0xbc, 0xd7, 0xbb, 0x15, 0x33, 0x4e, 0xdf, 0xa1, 0x3b, 0x78, 0x8f, 0x3d, 0x32, + 0x04, 0x23, 0x3e, 0x01, 0x6f, 0x39, 0x3b, 0x8b, 0xb7, 0x85, 0xd5, 0x3e, 0x12, 0x3c, 0x91, 0x3a, + 0x4a, 0x2c, 0xfc, 0x69, 0x33, 0x5e, 0xb8, 0xdc, 0x23, 0xa5, 0x7c, 0xb8, 0x38, 0x74, 0x76, 0xd1, + 0x70, 0xda, 0x31, 0xfd, 0x94, 0x1c, 0x58, 0x05, 0x6f, 0x40, 0xe0, 0xa2, 0x91, 0xa8, 0x3d, 0x92, + 0x3b, 0x12, 0x4c, 0xbc, 0x87, 0xa4, 0xe4, 0xa0, 0xc2, 0xeb, 0xa3, 0x70, 0x36, 0x5c, 0x0c, 0x8c, + 0x10, 0x6b, 0xa3, 0xe0, 0x44, 0x94, 0x27, 0x95, 0x46, 0x2d, 0x93, 0xdb, 0xfd, 0x5d, 0x28, 0x24, + 0xc1, 0x05, 0x41, 0x14, 0x31, 0x19, 0x47, 0x77, 0xcd, 0x03, 0xa3, 0x39, 0xfe, 0xc5, 0x41, 0xb5, + 0xf3, 0x4b, 0xf5, 0xac, 0x79, 0xed, 0xf3, 0xe5, 0xc9, 0xe9, 0xc7, 0x03, 0xb9, 0xfd, 0x55, 0x29, + 0x37, 0xf0, 0xf2, 0x4c, 0x3d, 0x78, 0xf6, 0x34, 0xac, 0x28, 0x5d, 0x2d, 0xf6, 0xfa, 0xf2, 0x9a, + 0xdf, 0xdc, 0xa3, 0xfd, 0x6b, 0xf9, 0x03, 0xdf, 0xca, 0x0e, 0x5d, 0x0d, 0xce, 0x5d, 0x19, 0x47, + 0xef, 0x2b, 0x65, 0x10, 0xb5, 0xa3, 0x77, 0x94, 0x3c, 0xc0, 0x32, 0x1b, 0x52, 0xaf, 0x64, 0xce, + 0x59, 0x49, 0x6d, 0x3b, 0x0d, 0x0e, 0x95, 0xe1, 0x94, 0xec, 0x2e, 0x1d, 0xd7, 0x69, 0x57, 0xe5, + 0x56, 0xd2, 0xe1, 0xa1, 0xb5, 0xdf, 0x08, 0x6a, 0xce, 0x6e, 0xd1, 0xa1, 0x6a, 0x98, 0x76, 0xaf, + 0x57, 0xef, 0x38, 0x6a, 0x09, 0x8c, 0xc5, 0xe1, 0x54, 0x59, 0x00, 0x4f, 0x92, 0xa7, 0xcb, 0xdb, + 0x11, 0x1d, 0x91, 0x0c, 0x78, 0x8f, 0x09, 0x02, 0x46, 0x10, 0xd4, 0x08, 0x52, 0xd0, 0x2e, 0x07, + 0x06, 0xfd, 0x23, 0x7d, 0x82, 0x40, 0xfb, 0x52, 0xde, 0x08, 0x8d, 0xad, 0x12, 0x1a, 0x6d, 0xca, + 0x8c, 0xc0, 0x05, 0x1f, 0x09, 0x8d, 0x57, 0x46, 0x68, 0xac, 0x55, 0x68, 0x1c, 0x6b, 0x33, 0x1e, + 0xf6, 0xfb, 0xfa, 0xa5, 0xc1, 0x6f, 0xc7, 0x6d, 0x48, 0x83, 0xe3, 0x03, 0xc5, 0x64, 0x32, 0x12, + 0xd2, 0xe0, 0xe8, 0x95, 0x75, 0xfc, 0xf3, 0x4a, 0x83, 0xaa, 0x00, 0x35, 0xdd, 0x2b, 0xcb, 0xe8, + 0x04, 0x9f, 0xcc, 0xc2, 0xb2, 0xd7, 0xcb, 0x5d, 0x5b, 0x9a, 0x35, 0x65, 0x5f, 0xce, 0x30, 0x54, + 0x0c, 0x11, 0x8e, 0x44, 0x7c, 0x34, 0x41, 0xdf, 0xdc, 0x73, 0xf8, 0x28, 0x2f, 0xdf, 0xdb, 0x0b, + 0x01, 0xd6, 0x1c, 0xf6, 0xdb, 0x28, 0xd4, 0x57, 0xd2, 0x22, 0x0f, 0x7d, 0xb8, 0x23, 0x1f, 0xbb, + 0x6a, 0x81, 0xbd, 0x69, 0x1e, 0x51, 0x09, 0xc4, 0x6f, 0xa8, 0x99, 0x26, 0x68, 0x8c, 0x1d, 0x68, + 0x53, 0x15, 0x95, 0x9c, 0x08, 0xd0, 0xa1, 0xa2, 0xf1, 0x2a, 0x2a, 0x9e, 0x86, 0xb9, 0x3f, 0x14, + 0x6b, 0x5d, 0x79, 0xaa, 0xb8, 0x84, 0xb6, 0xc7, 0x8f, 0x9c, 0xa6, 0xcf, 0xf8, 0x7f, 0xf2, 0x37, + 0x4d, 0xce, 0xa7, 0x61, 0x2d, 0xf0, 0xb6, 0xb3, 0xe6, 0x28, 0xe0, 0x9a, 0x32, 0xf6, 0x37, 0x19, + 0xe2, 0xd1, 0x29, 0x23, 0x37, 0x51, 0x44, 0xb6, 0x28, 0x21, 0x83, 0xad, 0x35, 0x23, 0x1a, 0x6b, + 0xd8, 0x23, 0x8d, 0x25, 0x63, 0x64, 0xbe, 0x3e, 0xbf, 0x68, 0xec, 0xd7, 0x12, 0x8d, 0x87, 0xb5, + 0x24, 0xe3, 0xe0, 0xa0, 0x86, 0x68, 0xdc, 0x57, 0x91, 0xa7, 0x89, 0x8c, 0xa3, 0x5b, 0x2a, 0xe2, + 0x8c, 0x84, 0x6b, 0xd5, 0x08, 0x4c, 0x2d, 0xec, 0x8c, 0xa0, 0x5b, 0x8b, 0x0d, 0x98, 0x5d, 0x5a, + 0x6f, 0x89, 0x29, 0x78, 0xdc, 0x7f, 0x36, 0x4b, 0x50, 0xc9, 0xbf, 0x90, 0x18, 0x82, 0xd7, 0xf5, + 0x0c, 0xc1, 0xeb, 0x2d, 0x95, 0x92, 0xfb, 0x46, 0x4c, 0xb6, 0x2a, 0x26, 0xd3, 0x9e, 0xa5, 0x6f, + 0xee, 0xc9, 0x9c, 0x79, 0xd3, 0x29, 0x08, 0x1c, 0x57, 0x46, 0x6a, 0xae, 0x45, 0x6a, 0xe6, 0x39, + 0x10, 0xb7, 0x44, 0x76, 0x2a, 0x6d, 0x74, 0x18, 0xd9, 0xd9, 0xba, 0xec, 0x3c, 0x30, 0xb2, 0xf3, + 0xf9, 0x65, 0xe7, 0x07, 0x77, 0x62, 0x24, 0xe7, 0xda, 0x25, 0x67, 0xb8, 0x49, 0xb2, 0x2d, 0x72, + 0x53, 0x65, 0x33, 0xd7, 0xc8, 0x4d, 0x45, 0xf2, 0xaa, 0x21, 0x38, 0x0f, 0x95, 0x0f, 0x0d, 0x8e, + 0x7c, 0x84, 0x26, 0xde, 0x33, 0xef, 0xeb, 0xfc, 0x64, 0xe2, 0xf6, 0xab, 0x38, 0x3c, 0xfe, 0xcd, + 0x8d, 0x8f, 0x8f, 0x1b, 0x29, 0xfb, 0xec, 0x52, 0x76, 0xf9, 0xf8, 0xfe, 0xf3, 0xcb, 0xd7, 0xa2, + 0x10, 0xf4, 0x9a, 0xa9, 0xb6, 0x77, 0xc1, 0x1b, 0xb0, 0x0f, 0x6a, 0xba, 0x46, 0x35, 0xb7, 0x25, + 0x6c, 0x0c, 0x97, 0xcf, 0xbc, 0x3d, 0xc7, 0xcf, 0xe8, 0x86, 0x18, 0x1c, 0xf5, 0xfb, 0x75, 0x94, + 0xc2, 0xff, 0xfd, 0xef, 0xff, 0xd4, 0x51, 0x0b, 0x5a, 0x47, 0x4d, 0x0c, 0x59, 0x07, 0x73, 0xb1, + 0xd5, 0xe1, 0x83, 0xd6, 0x71, 0x9c, 0x4d, 0x30, 0xd4, 0x75, 0x2b, 0xa3, 0x23, 0x65, 0x65, 0x74, + 0x8e, 0xe9, 0xd8, 0xa8, 0xa2, 0x36, 0x55, 0xd1, 0x7b, 0x34, 0x85, 0x73, 0x9b, 0x7d, 0x73, 0xc3, + 0xd3, 0x64, 0x9f, 0xd1, 0x3d, 0xb2, 0x8d, 0x3e, 0x5a, 0x8b, 0xd5, 0x2f, 0x4e, 0x1a, 0x1c, 0x6d, + 0xd1, 0x7e, 0xda, 0xb3, 0xc9, 0xf5, 0xdf, 0xad, 0xfe, 0x76, 0xba, 0x2d, 0x8e, 0x15, 0x04, 0x5e, + 0xe7, 0x3d, 0x64, 0x10, 0x7c, 0xf6, 0x66, 0x33, 0x11, 0xc0, 0xbc, 0x39, 0xa7, 0xaa, 0x46, 0x0f, + 0x58, 0x24, 0x6d, 0xae, 0x8e, 0xe1, 0x22, 0x8c, 0x37, 0xfe, 0x83, 0x5b, 0xd5, 0xe5, 0x48, 0xee, + 0x7c, 0x08, 0xb2, 0x17, 0x81, 0xcb, 0x2b, 0x20, 0xdf, 0xef, 0x58, 0x94, 0x8e, 0x03, 0xde, 0x3f, + 0x73, 0xa5, 0xc4, 0x69, 0x8d, 0x81, 0xca, 0x3d, 0x1f, 0xab, 0x2f, 0x1d, 0x91, 0x48, 0xd8, 0x17, + 0xc5, 0x38, 0xcb, 0x66, 0x0b, 0x10, 0x55, 0x22, 0x73, 0xc3, 0xf3, 0x91, 0x7b, 0x29, 0x86, 0xfa, + 0x14, 0xdb, 0x48, 0xdd, 0xd6, 0x20, 0x71, 0xd5, 0x40, 0x96, 0x8a, 0xc9, 0x90, 0x4e, 0xff, 0x27, + 0x9e, 0x58, 0xc6, 0x07, 0x71, 0xbe, 0x1f, 0x5d, 0x4a, 0x4f, 0x3d, 0x82, 0xc2, 0x90, 0xd0, 0x11, + 0x22, 0xf7, 0x78, 0x8c, 0x14, 0x8e, 0x4d, 0x46, 0x3d, 0xa2, 0x88, 0x7d, 0x85, 0xdf, 0xd1, 0x67, + 0x6f, 0xfc, 0xbd, 0x2b, 0xe6, 0x66, 0x57, 0x17, 0xb3, 0x03, 0x64, 0x53, 0x24, 0xd9, 0xb9, 0xa8, + 0x2d, 0x63, 0xdb, 0xa3, 0x68, 0x31, 0xbc, 0x72, 0x4d, 0x59, 0x0c, 0x8a, 0xe7, 0x17, 0x8d, 0x89, + 0xf4, 0x34, 0xff, 0xb2, 0x30, 0x2b, 0x93, 0x51, 0x51, 0x9a, 0xa2, 0x9c, 0x51, 0x0d, 0x32, 0x84, + 0xed, 0x6e, 0x82, 0x0b, 0xe3, 0x0a, 0x3b, 0x52, 0x17, 0x66, 0x11, 0xe4, 0x23, 0xc8, 0x24, 0x85, + 0x1a, 0x99, 0xbb, 0x6e, 0x60, 0x29, 0x49, 0x95, 0xc6, 0x42, 0x78, 0xdc, 0x43, 0x3b, 0xbc, 0x92, + 0xba, 0xb2, 0xb8, 0xe7, 0x5e, 0x11, 0x3c, 0x9b, 0x21, 0x22, 0x7f, 0x58, 0x5c, 0x4c, 0xe3, 0x42, + 0x1a, 0x4a, 0xe7, 0x33, 0x48, 0x3f, 0xbf, 0xfe, 0x0a, 0x62, 0x42, 0xc0, 0x34, 0xa0, 0xc7, 0x7f, + 0x72, 0xbe, 0xef, 0xd6, 0xe4, 0xd5, 0x86, 0x64, 0xa9, 0x8d, 0x34, 0x9b, 0x93, 0xa7, 0x1c, 0x89, + 0x2a, 0x18, 0x6d, 0xab, 0xf3, 0xb4, 0x48, 0x0f, 0x97, 0x19, 0xf9, 0x67, 0xbc, 0x5d, 0x44, 0x97, + 0x1d, 0xd2, 0xeb, 0x29, 0x59, 0x22, 0x8b, 0x23, 0xde, 0x9b, 0x6a, 0x8b, 0xac, 0x67, 0xfd, 0x75, + 0xd4, 0x6e, 0xe8, 0xdf, 0xc9, 0x9d, 0xc7, 0x75, 0x8e, 0x18, 0x6d, 0xe1, 0x11, 0x24, 0x41, 0xa8, + 0xf7, 0x0f, 0xcb, 0xb2, 0x3a, 0x3a, 0xe2, 0x69, 0x9a, 0x86, 0xf5, 0x0c, 0xf6, 0xfb, 0xed, 0x07, + 0xd5, 0x08, 0xd9, 0x12, 0x0b, 0x2b, 0x82, 0xfe, 0x9c, 0x23, 0xca, 0x84, 0xf6, 0xbd, 0x40, 0xc4, + 0xc1, 0x94, 0x62, 0xcf, 0xad, 0x7f, 0xff, 0x9c, 0xb2, 0x78, 0x12, 0x8f, 0x1d, 0x6a, 0xff, 0x0b, + 0xd1, 0x19, 0xa2, 0x7a, 0x51, 0x4b, 0x39, 0xb0, 0xe8, 0xba, 0x9e, 0x3a, 0xc0, 0x94, 0xcc, 0x99, + 0x1c, 0x89, 0x8b, 0x1c, 0xcc, 0xce, 0x11, 0xa5, 0x70, 0x86, 0xde, 0x63, 0xc8, 0x9b, 0xd5, 0xec, + 0x56, 0xbf, 0x8e, 0xe8, 0x15, 0x58, 0xcc, 0x11, 0xed, 0xec, 0x35, 0x83, 0xf7, 0x25, 0x5c, 0x11, + 0x30, 0x0f, 0x44, 0x34, 0x00, 0x44, 0x96, 0x2d, 0x40, 0x7f, 0x50, 0x86, 0x1c, 0xe0, 0x27, 0x88, + 0xac, 0x86, 0x88, 0x02, 0x6d, 0xb3, 0x07, 0x14, 0x95, 0x8e, 0xbc, 0xe2, 0xd1, 0xae, 0xa2, 0x84, + 0xa5, 0x7e, 0xe6, 0xfa, 0x4a, 0x77, 0xf2, 0xb5, 0xe7, 0x98, 0x49, 0x96, 0x7a, 0xf1, 0x22, 0x42, + 0xba, 0xa6, 0x62, 0xf6, 0x93, 0xe2, 0xea, 0x4e, 0x90, 0xd0, 0x85, 0x72, 0x01, 0x27, 0x5d, 0x79, + 0xea, 0xb9, 0x5c, 0xb8, 0x79, 0xdc, 0xf6, 0x8b, 0xee, 0x49, 0xdd, 0x57, 0x15, 0xd3, 0x56, 0x8f, + 0xb3, 0x4c, 0x47, 0x5e, 0xa0, 0xfe, 0x11, 0x67, 0xf1, 0xb5, 0xe2, 0x5f, 0x14, 0x59, 0xd7, 0x27, + 0x7c, 0xa9, 0x47, 0xd8, 0x0f, 0x00, 0x6d, 0x0c, 0x69, 0x38, 0xe6, 0xc3, 0x9c, 0xf5, 0x5b, 0x63, + 0xa0, 0xe1, 0x52, 0x7c, 0x08, 0x1a, 0x9a, 0xac, 0x4b, 0xa0, 0xa3, 0x2c, 0x79, 0x41, 0x66, 0xbc, + 0x21, 0x28, 0xca, 0x99, 0xa7, 0x84, 0xa1, 0x49, 0x73, 0xd2, 0x79, 0x59, 0x87, 0x85, 0x59, 0x5a, + 0x9b, 0x63, 0xb8, 0x80, 0x74, 0x98, 0x9f, 0x1c, 0x56, 0x03, 0x6c, 0xe1, 0xa2, 0x1d, 0x16, 0xe5, + 0xd6, 0x6d, 0x0e, 0xff, 0xd2, 0x77, 0x86, 0xf9, 0x49, 0x75, 0x35, 0x8c, 0xfc, 0x52, 0x32, 0xbc, + 0xa1, 0x44, 0xca, 0x5a, 0x7d, 0x58, 0x45, 0xde, 0xba, 0x61, 0x45, 0x4e, 0xd9, 0xe6, 0xd8, 0x32, + 0xb9, 0x27, 0x87, 0x5a, 0xb2, 0xcc, 0xea, 0x22, 0xff, 0x54, 0xf6, 0xd2, 0x61, 0x51, 0x2a, 0xd3, + 0xc6, 0xf0, 0x03, 0xda, 0xcf, 0x4b, 0x9f, 0xda, 0x1c, 0x72, 0x48, 0xf9, 0xf9, 0x99, 0x67, 0x1b, + 0x43, 0x0f, 0xe8, 0x3e, 0x2f, 0xe3, 0x6c, 0xf3, 0x11, 0x5f, 0xa1, 0xfa, 0xca, 0x84, 0xae, 0xda, + 0x70, 0x86, 0x34, 0x5f, 0x7e, 0x19, 0x49, 0x63, 0x64, 0x4b, 0x24, 0xaf, 0x21, 0x05, 0xab, 0x46, + 0xa2, 0xb7, 0xe7, 0x13, 0x9c, 0xd0, 0xbc, 0x56, 0x72, 0x17, 0x90, 0x03, 0x6a, 0xf7, 0xf5, 0x11, + 0x7a, 0x00, 0x33, 0xa4, 0x73, 0x5f, 0x27, 0x89, 0x0b, 0xb8, 0x01, 0x85, 0x13, 0x7d, 0xc4, 0x1d, + 0x8c, 0xec, 0x2a, 0x6d, 0xb7, 0x44, 0xd6, 0x69, 0x6c, 0x11, 0x55, 0xb7, 0x20, 0xc3, 0x05, 0x96, + 0x25, 0x72, 0x9e, 0x6e, 0x84, 0xec, 0x4e, 0x45, 0xea, 0x9f, 0xc3, 0xc7, 0xc8, 0x9a, 0x1c, 0xe6, + 0xa7, 0xa2, 0x68, 0x8c, 0x47, 0xc4, 0xf4, 0xa1, 0x2c, 0x8e, 0x95, 0x2c, 0x15, 0x4d, 0x90, 0x78, + 0xf7, 0x88, 0x5c, 0x47, 0x67, 0xc2, 0xd3, 0x58, 0x8a, 0xb2, 0x57, 0x34, 0xc1, 0x35, 0x17, 0xc7, + 0x28, 0xaf, 0x53, 0x07, 0xd0, 0x33, 0x18, 0xcb, 0xf3, 0x5b, 0xe8, 0xc2, 0xfb, 0x41, 0x78, 0x5b, + 0x0b, 0xb0, 0x2e, 0xe7, 0xbf, 0x68, 0x82, 0x33, 0x73, 0xa0, 0x29, 0xc1, 0x58, 0x9c, 0xa5, 0x74, + 0xbb, 0x72, 0x5b, 0x9c, 0x09, 0x17, 0xc0, 0x5f, 0x32, 0x49, 0x2a, 0x44, 0x22, 0x46, 0x89, 0x73, + 0x01, 0xcd, 0x5c, 0x96, 0xd2, 0xb9, 0x33, 0x55, 0x3d, 0xbf, 0x25, 0x43, 0x21, 0x7b, 0xb1, 0xb4, + 0xb8, 0x28, 0xf8, 0x64, 0x3a, 0x33, 0xf7, 0x4a, 0xcb, 0xba, 0x38, 0xcd, 0xbd, 0xd2, 0x1a, 0xc0, + 0x98, 0x7b, 0xa7, 0xcd, 0xbd, 0xd3, 0xe6, 0xde, 0xe9, 0xe5, 0x01, 0x33, 0xf7, 0x4e, 0x37, 0xbf, + 0x77, 0xda, 0xdc, 0xff, 0x2c, 0x3d, 0x07, 0x6a, 0x37, 0x74, 0x3f, 0xe3, 0xbd, 0xd2, 0x32, 0x98, + 0x32, 0x6b, 0x2d, 0x73, 0x13, 0xb5, 0x1c, 0x14, 0x73, 0x13, 0xb5, 0xb9, 0x89, 0xda, 0xdc, 0x44, + 0xdd, 0x9c, 0x92, 0xcd, 0x4d, 0xd4, 0xe6, 0x26, 0x6a, 0x73, 0x13, 0x75, 0xc5, 0x80, 0x6d, 0xf2, + 0x4d, 0xd4, 0xe6, 0x1a, 0x6a, 0x73, 0x0d, 0xf5, 0xcf, 0x77, 0x0d, 0x75, 0x81, 0xf3, 0xa6, 0xe5, + 0xab, 0xa6, 0x6b, 0x4b, 0x2f, 0x73, 0x0d, 0xb5, 0xb9, 0x86, 0xda, 0x5c, 0x43, 0x9d, 0x83, 0xc8, + 0x5c, 0x43, 0xdd, 0x92, 0x9d, 0x64, 0xae, 0xa1, 0x36, 0xd7, 0x50, 0x37, 0x61, 0x6d, 0x73, 0x0d, + 0xb5, 0xce, 0x6b, 0xa8, 0xcd, 0x15, 0xd3, 0xc0, 0x5c, 0x31, 0x6d, 0xae, 0x98, 0xd6, 0xc9, 0x97, + 0x65, 0x2c, 0x69, 0xae, 0x86, 0xae, 0x4b, 0x5a, 0x9b, 0x73, 0x35, 0xb4, 0xb9, 0xfd, 0xd9, 0xdc, + 0xfe, 0xdc, 0xf4, 0x38, 0x51, 0xf5, 0x9b, 0x24, 0xec, 0x30, 0x8c, 0x52, 0x2b, 0xd0, 0x2f, 0xc2, + 0xe3, 0x90, 0x89, 0x66, 0x93, 0xbf, 0x32, 0x39, 0xb7, 0xf7, 0x77, 0xde, 0xc3, 0x7b, 0x8f, 0xbd, + 0x75, 0x27, 0xfc, 0x27, 0xff, 0xb7, 0x64, 0xb9, 0x9d, 0x1c, 0x46, 0x2a, 0x3e, 0xb3, 0x94, 0x75, + 0x51, 0xe4, 0x2f, 0x79, 0x3d, 0x11, 0x5f, 0x19, 0xde, 0xa6, 0x5b, 0xbe, 0x62, 0x5f, 0x0d, 0xb2, + 0x09, 0x24, 0x92, 0x8d, 0xfe, 0xc1, 0x67, 0x7c, 0x4b, 0xef, 0xd7, 0x3e, 0x7d, 0xf8, 0x12, 0x90, + 0x76, 0xc5, 0xdd, 0xda, 0xa5, 0xd3, 0xb6, 0xdc, 0xa7, 0xec, 0x6f, 0x11, 0x52, 0x4e, 0xcd, 0x2e, + 0x6f, 0xbb, 0x08, 0x09, 0x4c, 0xe1, 0xe2, 0x22, 0x60, 0x86, 0xf8, 0x1c, 0x47, 0x7c, 0xb6, 0x68, + 0x9f, 0xe7, 0x86, 0xed, 0x5a, 0x99, 0x10, 0xa1, 0x75, 0x82, 0x74, 0x01, 0x96, 0x13, 0x54, 0xb9, + 0x7c, 0x5c, 0x66, 0x0f, 0x15, 0xb4, 0x91, 0x9a, 0x53, 0xc2, 0x0b, 0xc3, 0x3a, 0xc5, 0x88, 0x13, + 0xa3, 0x76, 0x39, 0xad, 0x81, 0x60, 0x95, 0xf0, 0x6a, 0xf1, 0xe0, 0xcb, 0xe2, 0x7d, 0x92, 0x7b, + 0x60, 0x70, 0x9c, 0x72, 0x62, 0x25, 0x09, 0x0c, 0xb2, 0xf4, 0x1d, 0x27, 0x41, 0xc8, 0xbe, 0x2d, + 0x49, 0x48, 0x30, 0x0e, 0xc7, 0x80, 0x2b, 0xce, 0x14, 0xdd, 0x46, 0x4e, 0x26, 0x3e, 0x0c, 0x27, + 0xf1, 0xe7, 0x0b, 0x8f, 0x30, 0x41, 0xca, 0x4b, 0x8e, 0xa6, 0xa4, 0xba, 0xa0, 0x3d, 0x2b, 0x88, + 0x1d, 0xe4, 0xf5, 0x3b, 0xff, 0x76, 0x38, 0x15, 0xff, 0x74, 0xf2, 0xc7, 0x3d, 0xaf, 0xeb, 0x73, + 0x5c, 0xd8, 0xed, 0x7e, 0x5e, 0xb7, 0x33, 0x83, 0x9b, 0x9b, 0xfa, 0xa1, 0xb8, 0xd3, 0x22, 0xc8, + 0x5d, 0xe4, 0x26, 0x48, 0x0d, 0xb7, 0x15, 0x01, 0x16, 0xfb, 0x4d, 0x39, 0x43, 0xf2, 0xcb, 0xeb, + 0x8a, 0x41, 0x59, 0x31, 0xb0, 0x39, 0x8e, 0xc6, 0x83, 0xdb, 0xeb, 0x3d, 0xc9, 0x0f, 0x60, 0x42, + 0x83, 0x1a, 0x86, 0x70, 0x27, 0xb5, 0x69, 0x16, 0x9e, 0x18, 0xbe, 0xf5, 0x3c, 0x1b, 0xc4, 0x4c, + 0xb5, 0x4c, 0x5e, 0xd9, 0x52, 0x09, 0x0b, 0x14, 0x16, 0xe3, 0x0d, 0x03, 0x0f, 0x5c, 0x79, 0xf1, + 0x56, 0x8c, 0x84, 0xea, 0xcd, 0xe4, 0x2b, 0x2b, 0xa1, 0xd5, 0x45, 0x1e, 0x88, 0x20, 0xe3, 0xe8, + 0x47, 0x38, 0x9f, 0xa1, 0x2f, 0x14, 0xfd, 0x03, 0xcd, 0x20, 0xc3, 0xf7, 0x28, 0x50, 0xa6, 0x34, + 0x2f, 0x35, 0x04, 0x5f, 0x1e, 0x31, 0x78, 0xbb, 0xb2, 0x32, 0x12, 0xb3, 0x7a, 0xc0, 0x67, 0x8e, + 0xcf, 0xd5, 0xc4, 0x73, 0xff, 0x83, 0x89, 0x83, 0x61, 0xb6, 0x38, 0xf3, 0x27, 0x4e, 0xf4, 0x4d, + 0x31, 0x71, 0x1e, 0xb8, 0x4c, 0x03, 0xa1, 0x7a, 0xe7, 0xf2, 0x6d, 0xb6, 0x2a, 0xc7, 0x53, 0x49, + 0x76, 0x30, 0x15, 0xb3, 0x98, 0x4c, 0x69, 0x37, 0xd8, 0xba, 0x5c, 0xcc, 0xf5, 0x67, 0x48, 0xd9, + 0xe9, 0xc3, 0xe5, 0x63, 0x60, 0x26, 0xd0, 0xee, 0xae, 0x75, 0xf7, 0x70, 0xf5, 0xc3, 0xe7, 0x76, + 0x0e, 0xe1, 0x25, 0x5f, 0xf3, 0x86, 0x74, 0xae, 0x3f, 0x8c, 0x4e, 0x3a, 0x45, 0x0b, 0x35, 0xde, + 0x83, 0x15, 0xd5, 0x5f, 0xb6, 0xa8, 0xe3, 0xe5, 0xd3, 0x23, 0x1c, 0x60, 0xa8, 0xf4, 0xc9, 0x2e, + 0x8e, 0x4e, 0xd2, 0xe4, 0xc0, 0x65, 0x75, 0x76, 0x9d, 0x2c, 0x9e, 0x92, 0x74, 0x78, 0x52, 0xd1, + 0xe8, 0x79, 0x0d, 0x97, 0xf2, 0x37, 0xe5, 0x9e, 0x16, 0xed, 0xf5, 0xa2, 0xd9, 0x4b, 0x2f, 0xc5, + 0x10, 0x70, 0x4b, 0x4e, 0x3a, 0x17, 0x74, 0xab, 0x7c, 0xd7, 0x41, 0x3a, 0xd0, 0x3e, 0xaf, 0x7b, + 0xf2, 0xab, 0xf3, 0xf4, 0xfc, 0xc4, 0x47, 0x5b, 0x83, 0x09, 0xd2, 0xe6, 0x4a, 0x59, 0xea, 0xf5, + 0x81, 0xde, 0x8c, 0x49, 0xbc, 0xf7, 0x99, 0x45, 0x9a, 0x4a, 0xa6, 0x85, 0x74, 0xe7, 0x5d, 0x2e, + 0x50, 0x89, 0x83, 0x5d, 0x68, 0x9f, 0x38, 0x93, 0x6e, 0x87, 0xc3, 0xbc, 0x89, 0xd7, 0x94, 0x60, + 0xd0, 0x91, 0xcc, 0x5a, 0xa4, 0x9a, 0x1b, 0x41, 0xb6, 0x01, 0xfd, 0xce, 0xae, 0xc6, 0x1b, 0xb7, + 0x96, 0x26, 0x44, 0x2e, 0xb5, 0x46, 0xde, 0x2a, 0xa1, 0xfc, 0xec, 0xbe, 0x5c, 0xa3, 0x4a, 0x16, + 0x12, 0x4a, 0x54, 0xf7, 0xb4, 0x53, 0x74, 0x16, 0xe4, 0x97, 0x58, 0xc7, 0x94, 0x91, 0x86, 0xfc, + 0xc1, 0xf0, 0x12, 0x44, 0x89, 0x9a, 0x92, 0xc6, 0x54, 0x7e, 0xc9, 0xeb, 0x93, 0xb2, 0xe9, 0x5b, + 0xa4, 0xc9, 0x09, 0x2b, 0xd2, 0xe3, 0x47, 0x9a, 0x0d, 0xa1, 0x52, 0xfd, 0x95, 0x37, 0x2e, 0x22, + 0x5a, 0x06, 0x3a, 0x7e, 0x98, 0x85, 0x6f, 0x22, 0x32, 0xfe, 0xf0, 0x65, 0x6d, 0xa8, 0x2f, 0xc7, + 0x1e, 0x97, 0xb0, 0xc2, 0xa5, 0x34, 0x11, 0x66, 0x94, 0xd0, 0x96, 0x00, 0xd3, 0xe8, 0x88, 0x3c, + 0x9a, 0xec, 0x01, 0x2f, 0x38, 0x19, 0xea, 0xe6, 0x81, 0xe4, 0xb0, 0xec, 0x30, 0x71, 0x90, 0xa8, + 0xc2, 0xd7, 0xc1, 0x5c, 0x99, 0x5b, 0xe5, 0xba, 0x56, 0x22, 0xbf, 0x55, 0x3c, 0x6c, 0xe2, 0x8a, + 0xe0, 0x7c, 0xb6, 0xc9, 0xcc, 0x6e, 0x64, 0x3d, 0xec, 0xca, 0x96, 0x1c, 0x21, 0x36, 0xf7, 0x0b, + 0x8a, 0x2f, 0xdd, 0x0e, 0x7c, 0xe6, 0xcc, 0x45, 0x76, 0xa4, 0x6e, 0xff, 0xf1, 0x94, 0x3f, 0xd5, + 0x55, 0x6e, 0x1d, 0xfa, 0xb1, 0xa4, 0x41, 0xa5, 0x92, 0x4b, 0x8c, 0x52, 0x9e, 0xad, 0x53, 0xa5, + 0xff, 0xab, 0x47, 0xab, 0xc6, 0x38, 0xa8, 0xf3, 0xc4, 0xd3, 0xce, 0xff, 0x03, 0x34, 0x47, 0xf2, + 0x86, +}; diff --git a/hwconf/luna/bbshd/qmlui_luna_bbshd.h b/hwconf/luna/bbshd/qmlui_luna_bbshd.h new file mode 100644 index 00000000..25f7d13f --- /dev/null +++ b/hwconf/luna/bbshd/qmlui_luna_bbshd.h @@ -0,0 +1,17 @@ +// This file is autogenerated by VESC Tool + +#ifndef QMLUI_LUNA_BBSHD_H_ +#define QMLUI_LUNA_BBSHD_H_ + +#include "datatypes.h" +#include +#include + +// Constants +#define DATA_QML_HW_SIZE 5953 + +// Variables +extern uint8_t data_qml_hw[]; + +// QMLUI_LUNA_BBSHD_H_ +#endif diff --git a/hwconf/luna/m600/appconf_luna_m600.h b/hwconf/luna/m600/appconf_luna_m600.h new file mode 100644 index 00000000..d63a0036 --- /dev/null +++ b/hwconf/luna/m600/appconf_luna_m600.h @@ -0,0 +1,491 @@ +// This file is autogenerated by VESC Tool + +#ifndef APPCONF_LUNA_M600_H_ +#define APPCONF_LUNA_M600_H_ + +// VESC ID +#define APPCONF_CONTROLLER_ID 100 + +// Timeout +#define APPCONF_TIMEOUT_MSEC 1000 + +// Timeout Brake Current +#define APPCONF_TIMEOUT_BRAKE_CURRENT 0 + +// Can Status Message Mode +#define APPCONF_SEND_CAN_STATUS 0 + +// Can Status Rate +#define APPCONF_SEND_CAN_STATUS_RATE_HZ 50 + +// CAN Baud Rate +#define APPCONF_CAN_BAUD_RATE 1 + +// Pairing Done +#define APPCONF_PAIRING_DONE 0 + +// Enable Permanent UART +#define APPCONF_PERMANENT_UART_ENABLED 1 + +// Shutdown Mode +#define APPCONF_SHUTDOWN_MODE 6 + +// CAN Mode +#define APPCONF_CAN_MODE 0 + +// UAVCAN ESC Index +#define APPCONF_UAVCAN_ESC_INDEX 0 + +// UAVCAN Raw Throttle Mode +#define APPCONF_UAVCAN_RAW_MODE 0 + +// Enable Servo Output +#define APPCONF_SERVO_OUT_ENABLE 0 + +// APP to Use +#define APPCONF_APP_TO_USE 11 + +// Control Type +#define APPCONF_PPM_CTRL_TYPE 0 + +// PID Max ERPM +#define APPCONF_PPM_PID_MAX_ERPM 15000 + +// Input Deadband +#define APPCONF_PPM_HYST 0.15 + +// Pulselength Start +#define APPCONF_PPM_PULSE_START 1 + +// Pulselength End +#define APPCONF_PPM_PULSE_END 2 + +// Pulselength Center +#define APPCONF_PPM_PULSE_CENTER 1.5 + +// Median Filter +#define APPCONF_PPM_MEDIAN_FILTER 1 + +// Safe Start +#define APPCONF_PPM_SAFE_START 1 + +// Throttle Expo +#define APPCONF_PPM_THROTTLE_EXP 0 + +// Throttle Expo Brake +#define APPCONF_PPM_THROTTLE_EXP_BRAKE 0 + +// Throttle Expo Mode +#define APPCONF_PPM_THROTTLE_EXP_MODE 2 + +// Positive Ramping Time +#define APPCONF_PPM_RAMP_TIME_POS 0.4 + +// Negative Ramping Time +#define APPCONF_PPM_RAMP_TIME_NEG 0.2 + +// Multiple VESCs Over CAN +#define APPCONF_PPM_MULTI_ESC 1 + +// Traction Control +#define APPCONF_PPM_TC 0 + +// TC Max ERPM Difference +#define APPCONF_PPM_TC_MAX_DIFF 3000 + +// Max ERPM for direction switch +#define APPCONF_PPM_MAX_ERPM_FOR_DIR 4000 + +// Smart Reverse Max Duty Cycle +#define APPCONF_PPM_SMART_REV_MAX_DUTY 0.07 + +// Smart Reverse Ramp Time +#define APPCONF_PPM_SMART_REV_RAMP_TIME 3 + +// Control Type +#define APPCONF_ADC_CTRL_TYPE 8 + +// Input Deadband +#define APPCONF_ADC_HYST 0.02 + +// ADC1 Min Voltage +#define APPCONF_ADC_VOLTAGE_START 0.55 + +// ADC1 Max Voltage +#define APPCONF_ADC_VOLTAGE_END 2.76 + +// ADC1 Center Voltage +#define APPCONF_ADC_VOLTAGE_CENTER 1.64 + +// ADC2 Min Voltage +#define APPCONF_ADC_VOLTAGE2_START 0 + +// ADC2 Max Voltage +#define APPCONF_ADC_VOLTAGE2_END 2 + +// Use Filter +#define APPCONF_ADC_USE_FILTER 1 + +// Safe Start +#define APPCONF_ADC_SAFE_START 1 + +// Invert Cruise Control Button +#define APPCONF_ADC_CC_BUTTON_INVERTED 1 + +// Invert Reverse Button +#define APPCONF_ADC_REV_BUTTON_INVERTED 0 + +// Invert ADC1 Voltage +#define APPCONF_ADC_VOLTAGE_INVERTED 0 + +// Invert ADC2 Voltage +#define APPCONF_ADC_VOLTAGE2_INVERTED 1 + +// Throttle Expo +#define APPCONF_ADC_THROTTLE_EXP 0 + +// Throttle Expo Brake +#define APPCONF_ADC_THROTTLE_EXP_BRAKE 0 + +// Throttle Expo Mode +#define APPCONF_ADC_THROTTLE_EXP_MODE 2 + +// Positive Ramping Time +#define APPCONF_ADC_RAMP_TIME_POS 0.3 + +// Negative Ramping Time +#define APPCONF_ADC_RAMP_TIME_NEG 0.1 + +// Multiple VESCs Over CAN +#define APPCONF_ADC_MULTI_ESC 1 + +// Traction Control +#define APPCONF_ADC_TC 0 + +// TC Max ERPM Difference +#define APPCONF_ADC_TC_MAX_DIFF 3000 + +// Update Rate +#define APPCONF_ADC_UPDATE_RATE_HZ 500 + +// Baudrate +#define APPCONF_UART_BAUDRATE 115200 + +// Control Type +#define APPCONF_CHUK_CTRL_TYPE 1 + +// Input Deadband +#define APPCONF_CHUK_HYST 0.15 + +// Positive Ramping Time +#define APPCONF_CHUK_RAMP_TIME_POS 0.4 + +// Negative Ramping Time +#define APPCONF_CHUK_RAMP_TIME_NEG 0.2 + +// ERPM Per Second Cruise Control +#define APPCONF_STICK_ERPM_PER_S_IN_CC 3000 + +// Throttle Expo +#define APPCONF_CHUK_THROTTLE_EXP 0 + +// Throttle Expo Brake +#define APPCONF_CHUK_THROTTLE_EXP_BRAKE 0 + +// Throttle Expo Mode +#define APPCONF_CHUK_THROTTLE_EXP_MODE 2 + +// Multiple VESCs Over CAN +#define APPCONF_CHUK_MULTI_ESC 1 + +// Traction Control +#define APPCONF_CHUK_TC 0 + +// TC Max ERPM Difference +#define APPCONF_CHUK_TC_MAX_DIFF 3000 + +// Use Smart Reverse +#define APPCONF_CHUK_USE_SMART_REV 1 + +// Smart Reverse Max Duty Cycle +#define APPCONF_CHUK_SMART_REV_MAX_DUTY 0.07 + +// Smart Reverse Ramp Time +#define APPCONF_CHUK_SMART_REV_RAMP_TIME 3 + +// Speed +#define APPCONF_NRF_SPEED 1 + +// TX Power +#define APPCONF_NRF_POWER 3 + +// CRC +#define APPCONF_NRF_CRC 1 + +// Retry Delay +#define APPCONF_NRF_RETR_DELAY 0 + +// Retries +#define APPCONF_NRF_RETRIES 3 + +// Radio Channel +#define APPCONF_NRF_CHANNEL 76 + +// Address 0 +#define APPCONF_NRF_ADDR_B0 198 + +// Address 1 +#define APPCONF_NRF_ADDR_B1 199 + +// Address 2 +#define APPCONF_NRF_ADDR_B2 0 + +// Send ACK +#define APPCONF_NRF_SEND_CRC_ACK 1 + +// P +#define APPCONF_BALANCE_KP 0 + +// I +#define APPCONF_BALANCE_KI 0 + +// D +#define APPCONF_BALANCE_KD 0 + +// Loop Hertz +#define APPCONF_BALANCE_HERTZ 1000 + +// Pitch Axis Fault Cutoff +#define APPCONF_BALANCE_FAULT_PITCH 20 + +// Roll Axis Fault Cutoff +#define APPCONF_BALANCE_FAULT_ROLL 45 + +// Duty Cycle Fault Cutoff +#define APPCONF_BALANCE_FAULT_DUTY 0.9 + +// ADC1 Switch Voltage +#define APPCONF_BALANCE_FAULT_ADC1 0 + +// ADC2 Switch Voltage +#define APPCONF_BALANCE_FAULT_ADC2 0 + +// Pitch Fault Delay +#define APPCONF_BALANCE_FAULT_DELAY_PITCH 0 + +// Roll Fault Delay +#define APPCONF_BALANCE_FAULT_DELAY_ROLL 0 + +// Duty Fault Delay +#define APPCONF_BALANCE_FAULT_DELAY_DUTY 0 + +// Half Switch Fault Delay +#define APPCONF_BALANCE_FAULT_DELAY_SWITCH_HALF 0 + +// Full Switch Fault Delay +#define APPCONF_BALANCE_FAULT_DELAY_SWITCH_FULL 0 + +// ADC Half State Fault ERPM +#define APPCONF_BALANCE_FAULT_ADC_HALF_ERPM 1000 + +// Tiltback Angle +#define APPCONF_BALANCE_TILTBACK_ANGLE 15 + +// Tiltback Speed +#define APPCONF_BALANCE_TILTBACK_SPEED 5 + +// Duty Cycle Tiltback +#define APPCONF_BALANCE_TILTBACK_DUTY 0.75 + +// High Voltage Tiltback +#define APPCONF_BALANCE_TILTBACK_HIGH_V 200 + +// Low Voltage Tiltback +#define APPCONF_BALANCE_TILTBACK_LOW_V 0 + +// Constant Tiltback +#define APPCONF_BALANCE_TILTBACK_CONSTANT 0 + +// Constant Tiltback ERPM +#define APPCONF_BALANCE_TILTBACK_CONSTANT_ERPM 500 + +// Startup Pitch Axis Angle Tolerance +#define APPCONF_BALANCE_STARTUP_PITCH_TOLERANCE 20 + +// Startup Roll Axis Angle Tolerance +#define APPCONF_BALANCE_STARTUP_ROLL_TOLERANCE 8 + +// Startup Centering Speed +#define APPCONF_BALANCE_STARTUP_SPEED 30 + +// Deadzone +#define APPCONF_BALANCE_DEADZONE 0 + +// Multiple VESCs Over CAN +#define APPCONF_BALANCE_MULTI_ESC 0 + +// Yaw P +#define APPCONF_BALANCE_YAW_KP 0 + +// Yaw I +#define APPCONF_BALANCE_YAW_KI 0 + +// Yaw D +#define APPCONF_BALANCE_YAW_KD 0 + +// Roll Steer KP +#define APPCONF_BALANCE_ROLL_STEER_KP 0 + +// Roll Steer ERPM KP +#define APPCONF_BALANCE_ROLL_STEER_ERPM_KP 0 + +// Brake Current +#define APPCONF_BALANCE_BRAKE_CURRENT 0 + +// Yaw Current Clamp +#define APPCONF_BALANCE_YAW_CURRENT_CLAMP 0 + +// D term PT1 Filter +#define APPCONF_BALANCE_KD_PT1_FREQUENCY 0 + +// Start Angle +#define APPCONF_BALANCE_BOOSTER_ANGLE 8 + +// Ramp Up +#define APPCONF_BALANCE_BOOSTER_RAMP 1 + +// Current Boost +#define APPCONF_BALANCE_BOOSTER_CURRENT 0 + +// Start Current Threshold +#define APPCONF_BALANCE_TORQUETILT_START_CURRENT 10 + +// Tilitback Angle Limit +#define APPCONF_BALANCE_TORQUETILT_ANGLE_LIMIT 5 + +// Max Tiltback Speed +#define APPCONF_BALANCE_TORQUETILT_SPEED 5 + +// Strength +#define APPCONF_BALANCE_TORQUETILT_STRENGTH 0 + +// Current Filter +#define APPCONF_BALANCE_TORQUETILT_FILTER 0.95 + +// Strength +#define APPCONF_BALANCE_TURNTILT_STRENGTH 0 + +// Tilitback Angle Limit +#define APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT 5 + +// Roll Angle Threshold +#define APPCONF_BALANCE_TURNTILT_START_ANGLE 1 + +// ERPM Threshold +#define APPCONF_BALANCE_TURNTILT_START_ERPM 100 + +// Max Tiltback Speed +#define APPCONF_BALANCE_TURNTILT_SPEED 5 + +// Speed Boost % +#define APPCONF_BALANCE_TURNTILT_ERPM_BOOST 20 + +// Speed Boost Max ERPM +#define APPCONF_BALANCE_TURNTILT_ERPM_BOOST_END 20000 + +// Control Type +#define APPCONF_PAS_CTRL_TYPE 2 + +// Sensor Type +#define APPCONF_PAS_SENSOR_TYPE 0 + +// PAS Max Current +#define APPCONF_PAS_CURRENT_SCALING 0.9 + +// Pedal RPM Start +#define APPCONF_PAS_PEDAL_RPM_START 10 + +// Pedal RPM End +#define APPCONF_PAS_PEDAL_RPM_END 120 + +// Invert Pedal Direction +#define APPCONF_PAS_INVERT_PEDAL_DIRECTION 0 + +// Sensor Magnets +#define APPCONF_PAS_MAGNETS 12 + +// Use Filter +#define APPCONF_PAS_USE_FILTER 1 + +// Positive Ramping Time +#define APPCONF_PAS_RAMP_TIME_POS 0.3 + +// Negative Ramping Time +#define APPCONF_PAS_RAMP_TIME_NEG 0.2 + +// Update Rate +#define APPCONF_PAS_UPDATE_RATE_HZ 500 + +// IMU Type +#define APPCONF_IMU_TYPE 1 + +// IMU AHRS Mode +#define APPCONF_IMU_AHRS_MODE 0 + +// Sample Rate +#define APPCONF_IMU_SAMPLE_RATE_HZ 200 + +// Accelerometer Confidence Decay +#define APPCONF_IMU_ACCEL_CONFIDENCE_DECAY 1 + +// Mahony KP +#define APPCONF_IMU_MAHONY_KP 0.3 + +// Mahony KI +#define APPCONF_IMU_MAHONY_KI 0 + +// Madgwick Beta +#define APPCONF_IMU_MADGWICK_BETA 0.1 + +// Imu Rotation Roll +#define APPCONF_IMU_ROT_ROLL 0 + +// Imu Rotation Pitch +#define APPCONF_IMU_ROT_PITCH 0 + +// Imu Rotation Yaw +#define APPCONF_IMU_ROT_YAW 0 + +// Accel Offset X +#define APPCONF_IMU_A_OFFSET_0 0 + +// Accel Offset Y +#define APPCONF_IMU_A_OFFSET_1 0 + +// Accel Offset Z +#define APPCONF_IMU_A_OFFSET_2 0 + +// Gyro Offset X +#define APPCONF_IMU_G_OFFSET_0 0 + +// Gyro Offset Y +#define APPCONF_IMU_G_OFFSET_1 0 + +// Gyro Offset Z +#define APPCONF_IMU_G_OFFSET_2 0 + +// Gyro Offset Comp X +#define APPCONF_IMU_G_OFFSET_COMP_FACT_0 0 + +// Gyro Offset Comp Y +#define APPCONF_IMU_G_OFFSET_COMP_FACT_1 0 + +// Gyro Offset Comp Z +#define APPCONF_IMU_G_OFFSET_COMP_FACT_2 0 + +// Gyro Offset Comp Clamp +#define APPCONF_IMU_G_OFFSET_COMP_CLAMP 5 + +// APPCONF_LUNA_M600_H_ +#endif + diff --git a/hwconf/luna/m600/hw_luna_m600.h b/hwconf/luna/m600/hw_luna_m600.h new file mode 100644 index 00000000..2aff7f87 --- /dev/null +++ b/hwconf/luna/m600/hw_luna_m600.h @@ -0,0 +1,347 @@ +/* + Copyright 2020 Marcos Chaparro mchaparro@powerdesigns.ca + Copyright 2018 Benjamin Vedder benjamin@vedder.se + + This file is part of the VESC firmware. + + The VESC firmware is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + The VESC firmware is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef HW_LUNA_M600_H_ +#define HW_LUNA_M600_H_ + +#define FW_NAME "2022.11.18" + +#include "mcconf_luna_m600.h" +#include "appconf_luna_m600.h" + +#define QMLUI_SOURCE_HW "hwconf/luna/m600/qmlui_luna_m600.c" +#define QMLUI_HEADER_HW "hwconf/luna/m600/qmlui_luna_m600.h" +#define QMLUI_HW_FULLSCREEN + +// HW properties +#define HW_HAS_GATE_DRIVER_SUPPLY_MONITOR +#define HW_HAS_WHEEL_SPEED_SENSOR +#define HW_HAS_PAS_TORQUE_SENSOR +#define HW_HAS_LUNA_CANBUS_DISPLAY +#define HW_USE_BRK + +#ifdef M600_Rev5 +#define HW_NAME "LUNA_M600_V2_Rev5" +#define HW_HAS_3_SHUNTS +#define HW_HAS_PHASE_FILTERS +#define HW_PHASE_A_FILTER_GPIO GPIOB +#define HW_PHASE_A_FILTER_PIN 5 +#define HW_PHASE_B_FILTER_GPIO GPIOB +#define HW_PHASE_B_FILTER_PIN 4 +#define HW_PHASE_C_FILTER_GPIO GPIOD +#define HW_PHASE_C_FILTER_PIN 2 +#define PHASE_FILTER_ON() palClearPad(HW_PHASE_A_FILTER_GPIO, HW_PHASE_A_FILTER_PIN); \ + palClearPad(HW_PHASE_B_FILTER_GPIO, HW_PHASE_B_FILTER_PIN); \ + palClearPad(HW_PHASE_C_FILTER_GPIO, HW_PHASE_C_FILTER_PIN) +#define PHASE_FILTER_OFF() palSetPad(HW_PHASE_A_FILTER_GPIO, HW_PHASE_A_FILTER_PIN); \ + palSetPad(HW_PHASE_B_FILTER_GPIO, HW_PHASE_B_FILTER_PIN); \ + palSetPad(HW_PHASE_C_FILTER_GPIO, HW_PHASE_C_FILTER_PIN) + +#else +#define HW_NAME "LUNA_M600_V2" +#define HW_HAS_PHASE_SHUNTS +// Some batches had the phase C shunt amplifier DNP, so this fills the gap +// Ia + Ib + Ic = 0 so Ic = -Ia - Ib +#define HW_HAS_3_SHUNTS +#define GET_CURRENT3() (-(GET_CURRENT1() - 2048.0 + GET_CURRENT2() -2048.0) + 2048.0) +#endif + +// Macros +#define LED_GREEN_GPIO GPIOB +#define LED_GREEN_PIN 2 +#define LED_RED_GPIO GPIOB +#define LED_RED_PIN 11 + +#define LED_GREEN_ON() palSetPad(LED_GREEN_GPIO, LED_GREEN_PIN) +#define LED_GREEN_OFF() palClearPad(LED_GREEN_GPIO, LED_GREEN_PIN) +#define LED_RED_ON() palSetPad(LED_RED_GPIO, LED_RED_PIN) +#define LED_RED_OFF() palClearPad(LED_RED_GPIO, LED_RED_PIN) + +#define AUX_GPIO GPIOC +#define AUX_PIN 14 +#define AUX_ON() palSetPad(AUX_GPIO, AUX_PIN) +#define AUX_OFF() palClearPad(AUX_GPIO, AUX_PIN) + +#define MT6816_PROG_EN_GPIO GPIOD +#define MT6816_PROG_EN_PIN 2 +#define MT6816_PROG_EN() palSetPad(MT6816_PROG_EN_GPIO, MT6816_PROG_EN_PIN) +#define MT6816_PROG_DISABLE() palClearPad(MT6816_PROG_EN_GPIO, MT6816_PROG_EN_PIN) + +#define CURRENT_FILTER_ON() +#define CURRENT_FILTER_OFF() + +#define BRK_GPIO GPIOB +#define BRK_PIN 12 + +// Shutdown pin +#define HW_SHUTDOWN_GPIO GPIOC +#define HW_SHUTDOWN_PIN 15 +#define HW_SHUTDOWN_HOLD_ON() palSetPad(HW_SHUTDOWN_GPIO, HW_SHUTDOWN_PIN) +#define HW_SHUTDOWN_HOLD_OFF() palClearPad(HW_SHUTDOWN_GPIO, HW_SHUTDOWN_PIN) +#define HW_SAMPLE_SHUTDOWN() !hw_luna_m600_shutdown_button_down() + +// Hold shutdown pin early to wake up on short pulses +#define HW_EARLY_INIT() palSetPadMode(HW_SHUTDOWN_GPIO, HW_SHUTDOWN_PIN, PAL_MODE_OUTPUT_PUSHPULL); \ + HW_SHUTDOWN_HOLD_ON(); + +#define HW_ADC_CHANNELS 18 +#define HW_ADC_INJ_CHANNELS 3 +#define HW_ADC_NBR_CONV 6 + +// ADC Indexes +#define ADC_IND_SENS1 0 +#define ADC_IND_SENS2 1 +#define ADC_IND_SENS3 2 +#define ADC_IND_CURR1 3 +#define ADC_IND_CURR2 4 +#define ADC_IND_CURR3 5 +#define ADC_IND_VIN_SENS 11 +#define ADC_IND_VOUT_GATE_DRV 12 +#define ADC_IND_EXT 10 +#define ADC_IND_EXT2 6 +#define ADC_IND_EXT3 13 +#define ADC_IND_TEMP_MOS 15 +#define ADC_IND_ON_OFF_BUTTON 8 +#define ADC_IND_TEMP_MOS_3 16 +#define ADC_IND_TEMP_MOTOR 9 +#define ADC_IND_VREFINT 16 + +// ADC macros and settings + +// Component parameters (can be overridden) +#ifndef V_REG +#define V_REG 3.3 +#endif +#ifndef VIN_R1 +#define VIN_R1 66500.0 +#endif +#ifndef VIN_R2 +#define VIN_R2 2000.0 +#endif +#ifndef CURRENT_AMP_GAIN +#define CURRENT_AMP_GAIN 20.0 +#endif +#ifndef CURRENT_SHUNT_RES +#define CURRENT_SHUNT_RES (0.0005 / 2.0) +#endif + +// Input voltage +#define GET_INPUT_VOLTAGE() ((V_REG / 4095.0) * (float)ADC_Value[ADC_IND_VIN_SENS] * ((VIN_R1 + VIN_R2) / VIN_R2)) + +// 12V supply voltage +#define GET_GATE_DRIVER_SUPPLY_VOLTAGE() ((float)ADC_VOLTS(ADC_IND_VOUT_GATE_DRV) * 11.0) + +// ON-OFF button sense +#define GET_ON_OFF_BUTTON_VOLTAGE() ((float)ADC_VOLTS(ADC_IND_ON_OFF_BUTTON) * 4.57) + +// NTC Termistors +#define NTC_RES(adc_val) (10000.0 * adc_val / ( 4095.0 - adc_val)) +#define NTC_TEMP(adc_ind) hw_get_mosfet_temp_filtered() +#define NTC_TEMP_MOTOR(beta) (1.0 / ((logf(NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR]) / 10000.0) / beta) + (1.0 / 298.15)) - 273.15) +#define PTC_TEMP_MOTOR(res, con, tbase) (((NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR]) - res) / NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR])) * 100.0 / con - 10.0) +#define PTC_TEMP_MOTOR_2(res, con, tbase) 0.0 +#define MOTOR_TEMP_LPF 0.001 + +#define NTC_RES_MOTOR(adc_val) (1000.0 / ((4095.0 / (float)adc_val) - 1.0)) + +// Voltage on ADC channel +#define ADC_VOLTS(ch) ((float)ADC_Value[ch] / 4096.0 * V_REG) + +// Use these temperature channels for extra logging insight +//log torque sensor data +#define NTC_TEMP_MOS1() hw_get_PAS_torque() +//log throttle data +#define NTC_TEMP_MOS2() ((float)ADC_VOLTS(ADC_IND_EXT)) +// log gate driver supply voltage +//#define NTC_TEMP_MOS3() GET_GATE_DRIVER_SUPPLY_VOLTAGE() +#define NTC_TEMP_MOS3() hw_get_encoder_error() + +// Double samples in beginning and end for positive current measurement. +// Useful when the shunt sense traces have noise that causes offset. +#ifndef CURR1_DOUBLE_SAMPLE +#define CURR1_DOUBLE_SAMPLE 0 +#endif +#ifndef CURR2_DOUBLE_SAMPLE +#define CURR2_DOUBLE_SAMPLE 0 +#endif +#ifndef CURR3_DOUBLE_SAMPLE +#define CURR3_DOUBLE_SAMPLE 0 +#endif + +// COMM-port ADC GPIOs +#define HW_ADC_EXT_GPIO GPIOC +#define HW_ADC_EXT_PIN 5 +#define HW_ADC_EXT2_GPIO GPIOB +#define HW_ADC_EXT2_PIN 0 + +// UART Peripheral +#define HW_UART_DEV SD3 +#define HW_UART_GPIO_AF GPIO_AF_USART3 +#define HW_UART_TX_PORT GPIOD +#define HW_UART_TX_PIN 8 +#define HW_UART_RX_PORT GPIOD +#define HW_UART_RX_PIN 9 + +// Permanent UART Peripheral (for NRF51) +#define HW_UART_P_BAUD 115200 +#define HW_UART_P_DEV SD1 +#define HW_UART_P_GPIO_AF GPIO_AF_USART1 +#define HW_UART_P_TX_PORT GPIOB +#define HW_UART_P_TX_PIN 6 +#define HW_UART_P_RX_PORT GPIOB +#define HW_UART_P_RX_PIN 7 + +// NRF SWD +#ifdef M600_Rev5 +#define NRF5x_SWDIO_GPIO GPIOB +#define NRF5x_SWDIO_PIN 3 +#define NRF5x_SWCLK_GPIO GPIOA +#define NRF5x_SWCLK_PIN 15 +#else +#define NRF5x_SWDIO_GPIO GPIOA +#define NRF5x_SWDIO_PIN 15 +#define NRF5x_SWCLK_GPIO GPIOB +#define NRF5x_SWCLK_PIN 3 +#endif + +// ICU Peripheral for servo decoding. Not used, routed to a pin not present in 64 pin +// package to free USART1 TX pad +#define HW_USE_SERVO_TIM4 +#define HW_ICU_TIMER TIM4 +#define HW_ICU_TIM_CLK_EN() RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE) +#define HW_ICU_DEV ICUD4 +#define HW_ICU_CHANNEL ICU_CHANNEL_1 +#define HW_ICU_GPIO_AF GPIO_AF_TIM4 +#define HW_ICU_GPIO GPIOD +#define HW_ICU_PIN 12 + +// I2C Peripheral +#define HW_I2C_DEV I2CD2 +#define HW_I2C_GPIO_AF GPIO_AF_I2C2 +#define HW_I2C_SCL_PORT GPIOB +#define HW_I2C_SCL_PIN 10 +#define HW_I2C_SDA_PORT GPIOB +#define HW_I2C_SDA_PIN 11 + +// Hall/encoder pins +#define HW_HALL_ENC_GPIO1 GPIOC +#define HW_HALL_ENC_PIN1 6 +#define HW_HALL_ENC_GPIO2 GPIOC +#define HW_HALL_ENC_PIN2 7 +#define HW_HALL_ENC_GPIO3 GPIOC +#define HW_HALL_ENC_PIN3 8 +#define HW_ENC_TIM TIM3 +#define HW_ENC_TIM_AF GPIO_AF_TIM3 +#define HW_ENC_TIM_CLK_EN() RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE) +#define HW_ENC_EXTI_PORTSRC EXTI_PortSourceGPIOC +#define HW_ENC_EXTI_PINSRC EXTI_PinSource8 +#define HW_ENC_EXTI_CH EXTI9_5_IRQn +#define HW_ENC_EXTI_LINE EXTI_Line8 +#define HW_ENC_EXTI_ISR_VEC EXTI9_5_IRQHandler +#define HW_ENC_TIM_ISR_CH TIM3_IRQn +#define HW_ENC_TIM_ISR_VEC TIM3_IRQHandler + +// SPI pins +#define HW_SPI_DEV SPID3 +#define HW_SPI_GPIO_AF GPIO_AF_SPI3 +#define HW_SPI_PORT_NSS GPIOA +#define HW_SPI_PIN_NSS 4 +#define HW_SPI_PORT_SCK GPIOC +#define HW_SPI_PIN_SCK 10 +#define HW_SPI_PORT_MOSI GPIOC +#define HW_SPI_PIN_MOSI 12 +#define HW_SPI_PORT_MISO GPIOC +#define HW_SPI_PIN_MISO 11 + +// Pedal Assist pins +#define HW_PAS1_PORT GPIOA +#define HW_PAS1_PIN 6 +#define HW_PAS2_PORT GPIOA +#define HW_PAS2_PIN 7 + +#ifdef HW_HAS_WHEEL_SPEED_SENSOR +#define HW_SPEED_SENSOR_PORT GPIOC +#define HW_SPEED_SENSOR_PIN 9 +#endif + +// Measurement macros +#define ADC_V_L1 ADC_Value[ADC_IND_SENS1] +#define ADC_V_L2 ADC_Value[ADC_IND_SENS2] +#define ADC_V_L3 ADC_Value[ADC_IND_SENS3] +#define ADC_V_ZERO (ADC_Value[ADC_IND_VIN_SENS] / 2) + +// Macros +#define READ_HALL1() palReadPad(HW_HALL_ENC_GPIO1, HW_HALL_ENC_PIN1) +#define READ_HALL2() palReadPad(HW_HALL_ENC_GPIO2, HW_HALL_ENC_PIN2) +#define READ_HALL3() palReadPad(HW_HALL_ENC_GPIO3, HW_HALL_ENC_PIN3) + +// Override dead time. +#define HW_DEAD_TIME_NSEC 460.0 + +// Default setting overrides +#ifndef MCCONF_L_MAX_VOLTAGE +#define MCCONF_L_MAX_VOLTAGE 85.0 // Maximum input voltage +#endif +#ifndef MCCONF_DEFAULT_MOTOR_TYPE +#define MCCONF_DEFAULT_MOTOR_TYPE MOTOR_TYPE_FOC +#endif +#ifndef MCCONF_FOC_F_SW +#define MCCONF_FOC_F_SW 30000.0 +#endif +#ifndef MCCONF_L_MAX_ABS_CURRENT +#define MCCONF_L_MAX_ABS_CURRENT 250.0 // The maximum absolute current above which a fault is generated +#endif +#ifndef MCCONF_FOC_SAMPLE_V0_V7 +#define MCCONF_FOC_SAMPLE_V0_V7 false // Run control loop in both v0 and v7 (requires phase shunts) +#endif +#ifndef MCCONF_L_IN_CURRENT_MAX +#define MCCONF_L_IN_CURRENT_MAX 150.0 // Input current limit in Amperes (Upper) +#endif +#ifndef MCCONF_L_IN_CURRENT_MIN +#define MCCONF_L_IN_CURRENT_MIN -150.0 // Input current limit in Amperes (Lower) +#endif + +// Setting limits +#define HW_LIM_CURRENT -100.0, 100.0 +#define HW_LIM_CURRENT_IN -60.0, 60.0 +#define HW_LIM_CURRENT_ABS 0.0, 200.0 +#define HW_LIM_VIN 6.0, 86.0 +#define HW_LIM_ERPM -200e3, 200e3 +#define HW_LIM_DUTY_MIN 0.0, 0.1 +#define HW_LIM_DUTY_MAX 0.0, 0.99 +#define HW_LIM_TEMP_FET -40.0, 95.0 + +#define HW_GATE_DRIVER_SUPPLY_MIN_VOLTAGE 11.0 +#define HW_GATE_DRIVER_SUPPLY_MAX_VOLTAGE 13.6 + +// HW-specific functions +void hw_update_speed_sensor(void); +float hw_get_speed(void); +float hw_get_distance(void); +float hw_get_distance_abs(void); +float hw_get_mosfet_temp_filtered(void); +bool hw_luna_m600_shutdown_button_down(void); +bool hw_luna_m600_minus_button_down(void); +float hw_get_PAS_torque(void); +bool hw_m600_has_fixed_throttle_level(void); +void hw_recover_encoder_offset(void); +float hw_get_encoder_error(void); + +#endif /* HW_LUNA_M600_H_ */ diff --git a/hwconf/luna/m600/hw_luna_m600_Rev5.h b/hwconf/luna/m600/hw_luna_m600_Rev5.h new file mode 100644 index 00000000..6c31f977 --- /dev/null +++ b/hwconf/luna/m600/hw_luna_m600_Rev5.h @@ -0,0 +1,27 @@ +/* + Copyright 2016 - 2022 Benjamin Vedder benjamin@vedder.se + + This file is part of the VESC firmware. + + The VESC firmware is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + The VESC firmware is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef HW_LUNA_M600_REV5_H_ +#define HW_LUNA_M600_REV5_H_ + +#define M600_Rev5 + +#include "hw_luna_m600.h" + +#endif /* HW_LUNA_M600_REV5_H_ */ diff --git a/hwconf/luna/m600/hw_luna_m600_core.c b/hwconf/luna/m600/hw_luna_m600_core.c new file mode 100644 index 00000000..918702fd --- /dev/null +++ b/hwconf/luna/m600/hw_luna_m600_core.c @@ -0,0 +1,488 @@ +/* + Copyright 2020 Marcos Chaparro mchaparro@powerdesigns.ca + Copyright 2018 Benjamin Vedder benjamin@vedder.se + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "hw.h" +#include "luna_m600_display.h" +#include "ch.h" +#include "hal.h" +#include "stm32f4xx_conf.h" +#include "utils.h" +#include +#include "mc_interface.h" +#include "mempools.h" +#include "mcpwm_foc.h" +#include "app.h" + +// for double pulse test: +#include "stdio.h" +#include "string.h" +#include "commands.h" +#include "terminal.h" + +#define EEPROM_ADDR_FIXED_THROTTLE_LEVEL 2 + +// Variables +static volatile bool i2c_running = false; + +// Private functions +static void terminal_cmd_set_m600_use_fixed_throttle_level(int argc, const char **argv); +static void terminal_cmd_m600_correct_encoder_offset(int argc, const char **argv); +static void hw_override_pairing_done(void); + +// I2C configuration +static const I2CConfig i2cfg = { + OPMODE_I2C, + 100000, + STD_DUTY_CYCLE +}; + +// Backup data that we want to preserve across firmware updates +typedef struct __attribute__((packed)) { + uint8_t encoder_offset_calibration_done; + float encoder_offset; + char fw_version[16]; +}m600_backup_t; + +// The config is stored in the backup struct so that it is stored while sleeping. +static volatile m600_backup_t *m600_backup = (m600_backup_t*)g_backup.hw_config; + +void hw_init_gpio(void) { + + //we can use __TIMESTAMP__ if we redefine it in the makefile gcc ... -Wno-builtin-macro-redefined -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') ... + // https://stackoverflow.com/questions/17498556/c-preprocessor-timestamp-in-iso-86012004/ + + // GPIO clock enable + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + + // LEDs + palSetPadMode(LED_GREEN_GPIO, LED_GREEN_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(LED_RED_GPIO, LED_RED_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + + // GPIOA Configuration: Channel 1 to 3 as alternate function push-pull + palSetPadMode(GPIOA, 8, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING); + palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING); + palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING); + + palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING); + palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING); + palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING); + + // Hall sensors + palSetPadMode(HW_HALL_ENC_GPIO1, HW_HALL_ENC_PIN1, PAL_MODE_INPUT_PULLUP); + palSetPadMode(HW_HALL_ENC_GPIO2, HW_HALL_ENC_PIN2, PAL_MODE_INPUT_PULLUP); + palSetPadMode(HW_HALL_ENC_GPIO3, HW_HALL_ENC_PIN3, PAL_MODE_INPUT_PULLUP); + +#ifdef HW_USE_BRK + // BRK Fault pin + palSetPadMode(BRK_GPIO, BRK_PIN, PAL_MODE_ALTERNATE(GPIO_AF_TIM1)); +#endif + +#ifdef HW_HAS_WHEEL_SPEED_SENSOR + palSetPadMode(HW_SPEED_SENSOR_PORT, HW_SPEED_SENSOR_PIN, PAL_MODE_INPUT_PULLUP); +#endif + // Current filter + palSetPadMode(GPIOC, 13, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + CURRENT_FILTER_OFF(); + +#ifdef M600_Rev5 + // Phase voltage filter. Disabled by default + palSetPadMode(HW_PHASE_A_FILTER_GPIO, HW_PHASE_A_FILTER_PIN, PAL_MODE_OUTPUT_OPENDRAIN | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(HW_PHASE_B_FILTER_GPIO, HW_PHASE_B_FILTER_PIN, PAL_MODE_OUTPUT_OPENDRAIN | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(HW_PHASE_C_FILTER_GPIO, HW_PHASE_C_FILTER_PIN, PAL_MODE_OUTPUT_OPENDRAIN | PAL_STM32_OSPEED_HIGHEST); + PHASE_FILTER_OFF(); +#else + //MT6816 program enable + palSetPadMode(MT6816_PROG_EN_GPIO, MT6816_PROG_EN_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + MT6816_PROG_DISABLE(); +#endif + + // AUX pin + AUX_OFF(); + palSetPadMode(AUX_GPIO, AUX_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + + // Shutdown latch + palSetPadMode(HW_SHUTDOWN_GPIO, HW_SHUTDOWN_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + HW_SHUTDOWN_HOLD_ON(); + + // ADC Pins + palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOA, 1, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOA, 3, PAL_MODE_INPUT_ANALOG); // ON-OFF button sense + palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG); + + palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_ANALOG); + + palSetPadMode(GPIOC, 0, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOC, 1, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOC, 2, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOC, 3, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOC, 4, PAL_MODE_INPUT_ANALOG); + palSetPadMode(GPIOC, 5, PAL_MODE_INPUT_ANALOG); + + terminal_register_command_callback( + "fix_throttle", + "Usage: fix_throttle [1 or 0]", + 0, + terminal_cmd_set_m600_use_fixed_throttle_level); + + terminal_register_command_callback( + "correct_encoder", + "Detect and apply encoder offset", + 0, + terminal_cmd_m600_correct_encoder_offset); + + hw_override_pairing_done(); + + luna_canbus_start(); +} + +void hw_setup_adc_channels(void) { + // ADC1 regular channels + ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles); // 0 SENS1 + ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_15Cycles); // 3 CURR1 + ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 3, ADC_SampleTime_15Cycles); // 6 ADC_IND_EXT2 + ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 4, ADC_SampleTime_15Cycles); // 9 TEMP_MOTOR + ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 5, ADC_SampleTime_15Cycles); // 12 V_GATE_DRIVER + ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_15Cycles); // 15 TEMP_FET + + // ADC2 regular channels + ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_15Cycles); // 1 SENS2 + ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 2, ADC_SampleTime_15Cycles); // 4 CURR2 + ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 3, ADC_SampleTime_15Cycles); // 7 UNUSED + ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 4, ADC_SampleTime_15Cycles); // 10 ADC_IND_EXT + ADC_RegularChannelConfig(ADC2, ADC_Channel_7, 5, ADC_SampleTime_15Cycles); // 13 ADC_IND_EXT3 + ADC_RegularChannelConfig(ADC2, ADC_Channel_Vrefint, 6, ADC_SampleTime_15Cycles);// 16 ADC_IND_VREFINT + + // ADC3 regular channels + ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 1, ADC_SampleTime_15Cycles); // 2 SENS3 + ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 2, ADC_SampleTime_15Cycles); // 5 CURR3 + ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 3, ADC_SampleTime_15Cycles); // 8 ON-OFF button + ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 4, ADC_SampleTime_15Cycles); // 11 VBUS + ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 5, ADC_SampleTime_15Cycles); // 14 UNUSED + ADC_RegularChannelConfig(ADC3, ADC_Channel_Vrefint, 6, ADC_SampleTime_15Cycles);// 18 UNUSED + + // Injected channels + ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_15Cycles); + ADC_InjectedChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_15Cycles); + ADC_InjectedChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_15Cycles); + ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_15Cycles); + ADC_InjectedChannelConfig(ADC2, ADC_Channel_11, 2, ADC_SampleTime_15Cycles); + ADC_InjectedChannelConfig(ADC3, ADC_Channel_12, 2, ADC_SampleTime_15Cycles); + ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_15Cycles); + ADC_InjectedChannelConfig(ADC2, ADC_Channel_11, 3, ADC_SampleTime_15Cycles); + ADC_InjectedChannelConfig(ADC3, ADC_Channel_12, 3, ADC_SampleTime_15Cycles); +} + +void hw_start_i2c(void) { + i2cAcquireBus(&HW_I2C_DEV); + + if (!i2c_running) { + palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN, + PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); + palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN, + PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); + + i2cStart(&HW_I2C_DEV, &i2cfg); + i2c_running = true; + } + + i2cReleaseBus(&HW_I2C_DEV); +} + +void hw_stop_i2c(void) { + i2cAcquireBus(&HW_I2C_DEV); + + if (i2c_running) { + palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN, PAL_MODE_INPUT); + palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN, PAL_MODE_INPUT); + + i2cStop(&HW_I2C_DEV); + i2c_running = false; + + } + + i2cReleaseBus(&HW_I2C_DEV); +} + +/** + * Try to restore the i2c bus + */ +void hw_try_restore_i2c(void) { + if (i2c_running) { + i2cAcquireBus(&HW_I2C_DEV); + + palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN, + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); + + palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN, + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); + + palSetPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN); + palSetPad(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN); + + chThdSleep(1); + + for(int i = 0;i < 16;i++) { + palClearPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN); + chThdSleep(1); + palSetPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN); + chThdSleep(1); + } + + // Generate start then stop condition + palClearPad(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN); + chThdSleep(1); + palClearPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN); + chThdSleep(1); + palSetPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN); + chThdSleep(1); + palSetPad(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN); + + palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN, + PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); + + palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN, + PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); + + HW_I2C_DEV.state = I2C_STOP; + i2cStart(&HW_I2C_DEV, &i2cfg); + + i2cReleaseBus(&HW_I2C_DEV); + } +} + +volatile float wheel_rpm_filtered = 0; +volatile float trip_odometer = 1.0; //avoids huge consumption numbers in the gauges + +void hw_update_speed_sensor(void) { + static float wheel_rpm = 0; + static uint8_t sensor_state = 0; + static uint8_t sensor_state_old = 0; + static float last_sensor_event_time = 0; + float current_time = (float)chVTGetSystemTimeX() / (float)CH_CFG_ST_FREQUENCY; + + sensor_state = palReadPad(HW_SPEED_SENSOR_PORT, HW_SPEED_SENSOR_PIN); + + if(sensor_state == 0 && sensor_state_old == 1 ) { + float revolution_duration = current_time - last_sensor_event_time; + + if (revolution_duration > 0.11) { //ignore periods <110ms, which is about 68km/h + last_sensor_event_time = current_time; + wheel_rpm = 60.0 / revolution_duration; + UTILS_LP_FAST(wheel_rpm_filtered, (float)wheel_rpm, 0.5); + + // For some reason a race condition on startup crashes the OS if this is executed too soon. + // So don't track odometer for the first 4 seconds + if(current_time > 4.0) { + trip_odometer += mc_interface_get_configuration()->si_wheel_diameter * M_PI; + } + } + } else { + // After 3 seconds without sensor signal, set RPM as zero + if ( (current_time - last_sensor_event_time) > 3.0) { + wheel_rpm_filtered = 0.0; + } + } + sensor_state_old = sensor_state; +} + +/* Get speed in m/s */ +float hw_get_speed(void) { + const volatile mc_configuration *conf = mc_interface_get_configuration(); + float speed = wheel_rpm_filtered * conf->si_wheel_diameter * M_PI / 60.0; + return speed; +} + +/* Get trip distance in meters */ +float hw_get_distance(void) { + return trip_odometer; +} + +float hw_get_distance_abs(void) { + return trip_odometer; +} + +float hw_get_mosfet_temp_filtered(void) { + static float mosfet_temp_filtered = 25.0; + float mosfet_temp = (1.0 / ((logf(NTC_RES(ADC_Value[ADC_IND_TEMP_MOS]) / 10000.0) / 3455.0) + (1.0 / 298.15)) - 273.15); + + UTILS_LP_FAST(mosfet_temp_filtered, (float)mosfet_temp, 0.1); + return mosfet_temp_filtered; +} + +bool hw_luna_m600_shutdown_button_down(void) { + static float button_filtered = 0.0; + UTILS_LP_FAST(button_filtered, GET_ON_OFF_BUTTON_VOLTAGE(), 0.01); + return (button_filtered < 1.35); +} + +bool hw_luna_m600_minus_button_down(void) { + static float button_filtered = 0.0; + UTILS_LP_FAST(button_filtered, GET_ON_OFF_BUTTON_VOLTAGE(), 0.05); + return (button_filtered >= 1.35 && button_filtered < 2.0); +} + +static void terminal_cmd_set_m600_use_fixed_throttle_level(int argc, const char **argv) { + (void)argc; + (void)argv; + + eeprom_var use_fixed_throttle; + if( argc == 2 ) { + char throttle_type[32]; + + sscanf(argv[1], "%s", throttle_type); + + use_fixed_throttle.as_i32 = (throttle_type[0] == '1') ? 1 : 0; + + // Store data in eeprom + conf_general_store_eeprom_var_hw(&use_fixed_throttle, EEPROM_ADDR_FIXED_THROTTLE_LEVEL); + } + else { + commands_printf("1 argument required: 1 (fixed) or 0 (follow display level)"); + } + return; +} + +bool hw_m600_has_fixed_throttle_level(void) { + eeprom_var use_fixed_throttle; + bool var_not_found = !conf_general_read_eeprom_var_hw(&use_fixed_throttle, EEPROM_ADDR_FIXED_THROTTLE_LEVEL); + + if( (use_fixed_throttle.as_i32 != 1) || var_not_found) { + return false; + } else { + return true; + } +} + +float hw_get_PAS_torque(void) { + return luna_canbus_get_PAS_torque(); +} + +float hw_get_encoder_error(void) { + static float angle_diff_filtered = 0.0; + float angle_diff = 0.0; + + // some batches have only 2 current sensors, so better rely only in + // the phase voltage tracker which runs with no modulation and is + // accurate at mid-high rpm + if(mc_interface_get_state() != MC_STATE_OFF && mc_interface_get_duty_cycle_now() > 0.4) { + angle_diff = utils_angle_difference(mcpwm_foc_get_phase_encoder(), mcpwm_foc_get_phase_observer()); + } + + UTILS_LP_FAST(angle_diff_filtered, angle_diff, 0.005); + return angle_diff_filtered; +} + +void hw_recover_encoder_offset(void) { + if (mc_interface_get_configuration()->foc_encoder_offset > 360.0 ) { + //invalid encoder offset found in flash, probably its the first boot after a fw update + if (m600_backup->encoder_offset_calibration_done && m600_backup->encoder_offset <= 360.0) { + //invalid offset found in flash, but there is a valid offset backed up. Use it. + mc_configuration *mcconf = mempools_alloc_mcconf(); + *mcconf = *mc_interface_get_configuration(); + + mcconf->foc_encoder_offset = m600_backup->encoder_offset; + mc_interface_set_configuration(mcconf); + conf_general_store_mc_configuration(mcconf, false); + + mempools_free_mcconf(mcconf); + } + } + + else { + // encoder offset is valid, lets check that the backed up value is the same + float mc_conf_encoder_offset = mc_interface_get_configuration()->foc_encoder_offset; + + if(mc_conf_encoder_offset <= 360.0) { + //user could have written a new offset angle. Update the backup. + if(m600_backup->encoder_offset_calibration_done == false || mc_conf_encoder_offset != m600_backup->encoder_offset) { + m600_backup->encoder_offset = mc_conf_encoder_offset; + m600_backup->encoder_offset_calibration_done = true; + conf_general_store_backup_data(); + } + } + } +} + +static void terminal_cmd_m600_correct_encoder_offset(int argc, const char **argv) { + (void)argc; + (void)argv; + + mc_configuration *mcconf = mempools_alloc_mcconf(); + *mcconf = *mc_interface_get_configuration(); + mc_configuration *mcconf_old = mempools_alloc_mcconf(); + *mcconf_old = *mcconf; + + float current = 15.0; + + mcconf->motor_type = MOTOR_TYPE_FOC; + mcconf->foc_f_zv = 10000.0; + mcconf->foc_current_kp = 0.01; + mcconf->foc_current_ki = 10.0; + mc_interface_set_configuration(mcconf); + + float offset = 0.0; + float ratio = 0.0; + bool inverted = false; + mcpwm_foc_encoder_detect(current, false, &offset, &ratio, &inverted); + + mcconf_old->foc_encoder_offset = offset; + mcconf->foc_encoder_offset = offset; + mc_interface_set_configuration(mcconf_old); + mc_interface_set_configuration(mcconf); + + mempools_free_mcconf(mcconf); + mempools_free_mcconf(mcconf_old); + + return; +} + +// Users are getting locked out because they don't know what pairing means. Lets disable the pairing +static void hw_override_pairing_done(void) { + if( app_get_configuration()->pairing_done == true) { + app_configuration *appconf = mempools_alloc_appconf(); + *appconf = *app_get_configuration(); + appconf->pairing_done = false; + + conf_general_store_app_configuration(appconf); + app_set_configuration(appconf); + + mempools_free_appconf(appconf); + } +} diff --git a/hwconf/luna/m600/luna_m600_display.c b/hwconf/luna/m600/luna_m600_display.c new file mode 100644 index 00000000..03057fcf --- /dev/null +++ b/hwconf/luna/m600/luna_m600_display.c @@ -0,0 +1,720 @@ +/* + Copyright 2020 Marcos Chaparro mchaparro@powerdesigns.ca + Copyright 2021 Maximiliano Cordoba mcordoba@powerdesigns.ca + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "conf_general.h" +#ifdef HW_HAS_LUNA_CANBUS_DISPLAY +#include "hw.h" +#include "luna_m600_display.h" +#include "app.h" +#include "ch.h" +#include "hal.h" +#include "packet.h" +#include "commands.h" +#include "mc_interface.h" +#include "utils.h" +#include +#include +#include "comm_can.h" +#include "shutdown.h" +#include "datatypes.h" +#include "timeout.h" + +#include "mcpwm_foc.h" // for encoder angle error + +#define LUNA_TORQUE_SENSOR_DEFAULT_TORQUE 0x02EE +#define LUNA_TORQUE_SENSOR_MINIMUM_TORQUE 0x0300 +#define LUNA_TORQUE_SENSOR_MAXIMUM_TORQUE 0x0600 + +typedef enum { + PAS_LEVEL_0 = 0x00, + PAS_LEVEL_1 = 0x01, + PAS_LEVEL_2 = 0x0B, + PAS_LEVEL_3 = 0x0C, + PAS_LEVEL_4 = 0x0D, + PAS_LEVEL_5 = 0x02, + PAS_LEVEL_6 = 0x15, + PAS_LEVEL_7 = 0x16, + PAS_LEVEL_8 = 0x17, + PAS_LEVEL_9 = 0x03, + PAS_LEVEL_WALK = 0x06, +} LUNA_PAS_LEVEL; + +typedef enum { + WRITE_LOW_BATTERY_ERROR = 0x00, + WRITE_MAX_CURRENT_ERROR = 0x01, + WRITE_ASSIST_LEVEL_ERROR = 0x02, + WRITE_ASSIST_SPEED_ERROR = 0x0C, + WRITE_SPEEDOMETER_ERROR = 0x16, + WRITE_SPEEDOMETER_SIGNAL_ERROR = 0x17, + WRITE_BASIC_SUCCESS = 0x18 +} CMD_WRITE_BASIC_RESPONSE; + +typedef enum { + LUNA_DISPLAY_ID1 = 0x03106300, + LUNA_TORQUE_SENSOR_ID = 0x01F83100, +} LUNA_CAN_IDs; + +typedef enum { + LUNA_DISPLAY_ID1_LENGTH_BYTES = 4, + LUNA_TORQUE_SENSOR_ID_LENGTH_BYTES = 4, +} LUNA_CAN_IDs_LENGTH_BYTES; + +typedef enum { + LUNA_LIGHT_MODE_OFF = 0, + LUNA_LIGHT_MODE_ON = 1, + LUNA_LIGHT_MODE_TURNING_OFF = 2, + LUNA_LIGHT_MODE_TURNING_ON = 3, +} LUNA_LIGHT_CONTROL_MODE; + +typedef enum { + LUNA_ERROR_NONE = 0x00, + LUNA_ERROR_BRAKES = 0x03, + LUNA_ERROR_THROTTLE = 0x05, + LUNA_ERROR_UNDER_VOLTAGE = 0x06, + LUNA_ERROR_HIGH_VOLTAGE = 0x07, + LUNA_ERROR_ENCODER = 0x08, + LUNA_ERROR_MOTOR_OVERTEMP = 0x10, + LUNA_ERROR_MOSFET_OVERTEMP = 0x11, + LUNA_ERROR_CURRENT_SENSOR = 0x12, + LUNA_ERROR_BATTERY_TEMPERATURE = 0x13, + LUNA_ERROR_WHEEL_SPEED_DETECTION = 0x21, + LUNA_ERROR_BMS_COMMUNICATION = 0x22, + LUNA_ERROR_TORQUE_SENSOR = 0x25, + LUNA_ERROR_SPEED_SENSOR = 0x26, + LUNA_ERROR_COMMUNICATION = 0x30, +} LUNA_ERROR_CODES; + +typedef enum{ + SEND_BATTERY_RANGE_STATE, + SEND_SPEED_CURRENT_VOLTAGE_STATE, + SEND_SPEED_LIMIT_WHEEL_SIZE_STATE, + SEND_CALORIES_STATE, + SEND_ERROR_STATE, + SEND_SHUTDOWN_STATE, +}can_display_process_states_t; + +typedef struct{ + LUNA_LIGHT_CONTROL_MODE light_mode; + LUNA_PAS_LEVEL pas_level; + LUNA_ERROR_CODES error_code; + bool torque_sensor_is_active; + float pas_torque; + uint8_t assist_code; +}luna_settings_t; + +static volatile luna_settings_t luna_settings = { .light_mode = LUNA_LIGHT_MODE_OFF, + .pas_level = PAS_LEVEL_0, + .error_code = LUNA_ERROR_NONE, + .torque_sensor_is_active = false, + .pas_torque = 0.0 + }; +static volatile bool display_thread_is_running = false; +static volatile bool display_uart_is_running = false; + +// Threads +static THD_WORKING_AREA(display_process_thread_wa, 1024); +static THD_FUNCTION(display_process_thread, arg); + +static bool check_light_mode(uint8_t light_mode); +static bool check_assist_level(uint8_t assist_code); +static void set_assist_level(uint8_t assist_code); +static void can_bus_display_process(uint32_t dt_ms); +static bool can_bus_rx_callback(uint32_t id, uint8_t *data, uint8_t len); + +/** + * Initialize the display and torque sensor for M600 drive units + */ +void luna_canbus_start(void) { + + if (!display_thread_is_running) { + chThdCreateStatic(display_process_thread_wa, sizeof(display_process_thread_wa), + NORMALPRIO, display_process_thread, NULL); + display_thread_is_running = true; + } +} + +/** + * Get torque applied to the crank arms + * + * @return + * 0.0 for no torque applied, 1.0 for maximum torque applied + */ +float luna_canbus_get_PAS_torque(void){ + return luna_settings.pas_torque / (LUNA_TORQUE_SENSOR_MAXIMUM_TORQUE - LUNA_TORQUE_SENSOR_MINIMUM_TORQUE); +} + +uint16_t luna_canbus_get_max_torque_level(void){ + return (LUNA_TORQUE_SENSOR_MAXIMUM_TORQUE - LUNA_TORQUE_SENSOR_MINIMUM_TORQUE); +} + +/** + * Get the current Pedal Assist level + * + * @return + * Assist level from 0 (min) to 9 (max power). + */ +LUNA_PAS_LEVEL luna_canbus_get_pas_level(void){ + return luna_settings.pas_level; +} + +/** + * checks if the light mode is valid + * + * @param light_mode + * Parameter to check + * + * @return + * true if valid, false if not. + */ +static bool check_light_mode(uint8_t light_mode) { + bool ret = false; + + switch (light_mode) { + case LUNA_LIGHT_MODE_OFF: + case LUNA_LIGHT_MODE_ON: + case LUNA_LIGHT_MODE_TURNING_OFF: + case LUNA_LIGHT_MODE_TURNING_ON: + ret = true; + break; + default: + break; + } + return ret; +} + +/** + * Check if the assist code corresponds to a current level + * + * @param assist_code + * Parameter to check + * + * @return + * true if valid, false if not. + */ +static bool check_assist_level(uint8_t assist_code) { + bool ret = false; + + switch (assist_code) { + case PAS_LEVEL_0: + case PAS_LEVEL_1: + case PAS_LEVEL_2: + case PAS_LEVEL_3: + case PAS_LEVEL_4: + case PAS_LEVEL_5: + case PAS_LEVEL_6: + case PAS_LEVEL_7: + case PAS_LEVEL_8: + case PAS_LEVEL_9: + case PAS_LEVEL_WALK: + ret = true; + break; + default: + break; + } + + return ret; +} + +/** + * Set the PAS level according to the assist code + * + * @param assist_code + * Assist level to apply + */ +static void set_assist_level(uint8_t assist_code) { + float current_scale; + volatile mc_configuration *mcconf = (volatile mc_configuration*) mc_interface_get_configuration(); + + luna_settings.assist_code = assist_code; + + switch (assist_code) { + case PAS_LEVEL_0: current_scale = 0.0; break; + case PAS_LEVEL_1: current_scale = 1.0 / 9.0; break; + case PAS_LEVEL_2: current_scale = 2.0 / 9.0; break; + case PAS_LEVEL_3: current_scale = 3.0 / 9.0; break; + case PAS_LEVEL_4: current_scale = 4.0 / 9.0; break; + case PAS_LEVEL_5: current_scale = 5.0 / 9.0; break; + case PAS_LEVEL_6: current_scale = 6.0 / 9.0; break; + case PAS_LEVEL_7: current_scale = 7.0 / 9.0; break; + case PAS_LEVEL_8: current_scale = 8.0 / 9.0; break; + case PAS_LEVEL_9: current_scale = 1.0; break; + case PAS_LEVEL_WALK: current_scale = 1.0; break; + default: return; + } + + if( hw_m600_has_fixed_throttle_level() ) { + mcconf->l_current_max_scale = 1.0; + app_pas_set_current_sub_scaling(current_scale); + } else { + mcconf->l_current_max_scale = current_scale; + } + + // In level 0, both PAS and throttle should be disabled + if(current_scale == 0.0) { + mcconf->l_current_max_scale = current_scale; + } +} + + + float distance; + float time_since_display_change=0; + uint16_t distance_display; + +/** + * State machine for display functions and error handling + * + * @param dt_ms + * Time since last call to this function + */ +static void can_bus_display_process(uint32_t dt_ms){ + static uint8_t can_tx_buffer[8]; + volatile mc_configuration *mcconf = (volatile mc_configuration*) mc_interface_get_configuration(); + static can_display_process_states_t can_display_process_state = SEND_BATTERY_RANGE_STATE; + static uint32_t delay_between_states = 0; + static uint32_t delay_between_torque_sensor_message = 0; + +//check if torque sensor is active or not + if(luna_settings.torque_sensor_is_active){ + luna_settings.torque_sensor_is_active = false; + delay_between_torque_sensor_message = 0; + if( luna_settings.error_code == LUNA_ERROR_TORQUE_SENSOR){ + luna_settings.error_code = LUNA_ERROR_NONE; + } + }else{ + //fault if sensor data stops for >500ms, but also allow 3sec for sensor to boot + delay_between_torque_sensor_message += dt_ms; + float uptime = (float)chVTGetSystemTimeX() / (float)CH_CFG_ST_FREQUENCY; + if(delay_between_torque_sensor_message > 500 && uptime > 3.0){ + delay_between_torque_sensor_message = 0; + //luna_settings.error_code = LUNA_ERROR_TORQUE_SENSOR; + } + } + + if(luna_settings.error_code == LUNA_ERROR_NONE){ + //check if vesc has got any faults + mc_fault_code vesc_fault = mc_interface_get_fault(); + switch(vesc_fault){ + case FAULT_CODE_NONE:{ + break; + } + case FAULT_CODE_ABS_OVER_CURRENT: + case FAULT_CODE_HIGH_OFFSET_CURRENT_SENSOR_1: + case FAULT_CODE_HIGH_OFFSET_CURRENT_SENSOR_2: + case FAULT_CODE_HIGH_OFFSET_CURRENT_SENSOR_3: + case FAULT_CODE_UNBALANCED_CURRENTS:{ + luna_settings.error_code = LUNA_ERROR_CURRENT_SENSOR; + break; + } + case FAULT_CODE_OVER_TEMP_FET: + luna_settings.error_code = LUNA_ERROR_MOSFET_OVERTEMP; + break; + case FAULT_CODE_OVER_TEMP_MOTOR:{ + luna_settings.error_code = LUNA_ERROR_MOTOR_OVERTEMP; + break; + } + case FAULT_CODE_OVER_VOLTAGE:{ + luna_settings.error_code = LUNA_ERROR_HIGH_VOLTAGE; + break; + } + case FAULT_CODE_UNDER_VOLTAGE:{ + luna_settings.error_code = LUNA_ERROR_UNDER_VOLTAGE; + break; + } + case FAULT_CODE_ENCODER_SPI: + case FAULT_CODE_ENCODER_NO_MAGNET:{ + luna_settings.error_code = LUNA_ERROR_ENCODER; + break; + } + default: + ;//luna_settings.error_code = LUNA_ERROR_COMMUNICATION; + } + } + + if(mc_interface_get_configuration()->foc_encoder_offset == 400.0) { + luna_settings.error_code = LUNA_ERROR_ENCODER; + } + + if(hw_luna_m600_shutdown_button_down()) { + can_display_process_state = SEND_SHUTDOWN_STATE; + } + + delay_between_states += dt_ms; + + //packets are typically sent every 11 msec + + if(delay_between_states > 50){ + delay_between_states = 0; + switch(can_display_process_state){ + case SEND_BATTERY_RANGE_STATE:{ + // This packet is sent every 250ms + float wh_left; + float battery_level = mc_interface_get_battery_level(&wh_left) * 100.0; + utils_truncate_number((float*)&battery_level, 0.0, 100.0); + + static float last_distance = 0.0; + float distance_abs = mc_interface_get_distance_abs(); + distance = distance_abs - last_distance; + + // what is sent is 1 / 10 of the value in meters + distance_display = (uint16_t) (distance / 10.0); + + static uint16_t time_at_last_distance_change = 0; + static uint16_t last_display_distance = 0; + + // if distance_display doesn't change for 5 seconds, we have to reset it to zero + if (distance_display != last_display_distance) { + time_at_last_distance_change = (float)chVTGetSystemTimeX() / (float)CH_CFG_ST_FREQUENCY; + } else { + float current_time = (float)chVTGetSystemTimeX() / (float)CH_CFG_ST_FREQUENCY; + + time_since_display_change = current_time - time_at_last_distance_change;//for debug + if(current_time - time_at_last_distance_change > 5.0){ + time_at_last_distance_change = (float)chVTGetSystemTimeX() / (float)CH_CFG_ST_FREQUENCY; + last_distance = distance_abs; + distance = 0; + distance_display = 0; + } + } + + last_display_distance = distance_display; + + if(distance_display < 5) { + //make sure the first zero is not skipped. Apparently it's important and needs 4 consecutive zeroes + //(or maybe its 1 full second of zeroes) + distance_display = 0; + } + + static float distance_old = 0; + if(distance_abs != distance_old) { + // commands_printf("time_since_display_change: %.2f",(double)time_since_display_change); + // commands_printf("display_distance: %d",distance_display); + // commands_printf("distance: %.2f",(double)distance); + // commands_printf("odometer: %.2f\n", (double)distance_abs); + distance_old = distance_abs; + } + + + memset(can_tx_buffer, 0, 8); + can_tx_buffer[0] = (uint8_t) battery_level; + can_tx_buffer[1] = (uint8_t)(distance_display & 0x00ff); + can_tx_buffer[2] = (uint8_t) 0; + can_tx_buffer[3] = (uint8_t) 0; + can_tx_buffer[4] = (uint8_t) 0; + can_tx_buffer[5] = (uint8_t) 0; + can_tx_buffer[6] = (uint8_t) 0; + can_tx_buffer[7] = (uint8_t) 0; + + // If the distance value exceeds 1000 meters, it overflows back to 0 meter + if(distance > 1020) { + last_distance += distance; + } + + //TODO: support RANGE parameter. 0x1FF = 511 sets RANGE as 5.11 km or 3 miles. + + //can_tx_buffer[6] = RANGE LSB + //can_tx_buffer[7] = RANGE MSB + + comm_can_transmit_eid(0x02F83200, can_tx_buffer, 8); + can_display_process_state = SEND_SPEED_CURRENT_VOLTAGE_STATE; + break; + } + case SEND_SPEED_CURRENT_VOLTAGE_STATE:{ + //this packet is sent every 280ms + + memset(can_tx_buffer, 0, 8); +#ifdef HW_HAS_WHEEL_SPEED_SENSOR + //float wheel_rpm = hw_get_wheel_rpm(); + //float wheelsize_in_meters = mcconf->si_wheel_diameter / 1000.0; + //float speed_km_h = (uint16_t)(wheel_rpm * wheelsize_in_meters * 60.0 / 1000.0); + + //uint16_t speed_display = (uint16_t)(speed_km_h * 100.0);//the display needs [km_h * 100] + uint16_t speed_display = (uint16_t)(mc_interface_get_speed() * 3600.0 / 1000.0 * 100.0 ); //the display needs [km_h * 100] + + can_tx_buffer[0] = (uint8_t)(speed_display & 0x00ff); + can_tx_buffer[1] = (uint8_t)((speed_display >> 8 ) & 0x00ff); +#endif + float current = mc_interface_get_tot_current_in_filtered(); + + uint16_t current_display = (uint16_t)(current * 100.0); + + can_tx_buffer[2] = (uint8_t)(current_display & 0x00ff); + can_tx_buffer[3] = (uint8_t)((current_display >> 8 ) & 0x00ff); + + float voltage = mc_interface_get_input_voltage_filtered(); + uint16_t voltage_display = voltage * 100; + + can_tx_buffer[4] = (uint8_t)(voltage_display & 0x00ff); + can_tx_buffer[5] = (uint8_t)((voltage_display >> 8 ) & 0x00ff); + + can_tx_buffer[6] = (uint8_t) (mc_interface_temp_fet_filtered() - 40.0); // 10°C = 10+40=50(32Hex) = 32 + can_tx_buffer[7] = (uint8_t) (mc_interface_temp_motor_filtered() - 40.0); // 20°C = 20+40=60(3CHex) = 3C + + comm_can_transmit_eid(0x02F83201, can_tx_buffer, 8); + can_display_process_state = SEND_SPEED_LIMIT_WHEEL_SIZE_STATE; + break; + } + case SEND_SPEED_LIMIT_WHEEL_SIZE_STATE:{ + memset(can_tx_buffer, 0, 8); + + //"speed limit" parameter [kmh *100] + float speed_limit = 32.2;// dummy 32.2km/h (20mph) + uint16_t speed_limit_display = speed_limit * 100; + can_tx_buffer[0] = (uint8_t)(speed_limit_display & 0x00ff); + can_tx_buffer[1] = (uint8_t)((speed_limit_display >> 8 ) & 0x00ff); + + // Arbitrary wheel size definitions from the display + uint16_t wheelsize_display; + if(mcconf->si_wheel_diameter <= 0.7){ + wheelsize_display = 416; //26" + } + if(mcconf->si_wheel_diameter >= 0.7){ + wheelsize_display = 437; //27.5" + } + if(mcconf->si_wheel_diameter >= 0.75){ + wheelsize_display = 464; //29" + } + + can_tx_buffer[2] = (uint8_t)(wheelsize_display & 0x00ff); + can_tx_buffer[3] = (uint8_t)((wheelsize_display >> 8 ) & 0x00ff); + + //these values are fixed + can_tx_buffer[4] = 182; + can_tx_buffer[5] = 8; + + comm_can_transmit_eid(0x02F83203, can_tx_buffer, 6); + can_display_process_state = SEND_CALORIES_STATE; + break; + } + case SEND_CALORIES_STATE:{ + // this packet is sent every 300msec + memset(can_tx_buffer, 0, 8); + //TODO: support "KCAL" parameter in [kmh *100] + //conversion rate: KCAL = value * 0.621368. + //For example: 0xFFFF = 65535 sets KCAL as 40722 + comm_can_transmit_eid(0x02F83205, can_tx_buffer, 2); + can_display_process_state = SEND_ERROR_STATE; + break; + } + case SEND_ERROR_STATE:{ + // this packet is sent every 500msec + static uint8_t send_error_counter = 0; + + memset(can_tx_buffer, 0, 8); + + if(luna_settings.error_code != LUNA_ERROR_NONE){ + can_tx_buffer[0] = luna_settings.error_code ; + comm_can_transmit_eid(0x02FF1200, can_tx_buffer, 1); + send_error_counter++; + + if(send_error_counter > 3){ + send_error_counter = 0; + can_display_process_state = SEND_BATTERY_RANGE_STATE; + } + }else{ + send_error_counter = 0; + can_display_process_state = SEND_BATTERY_RANGE_STATE; + } + + comm_can_transmit_eid(0x02FF1200, can_tx_buffer, 1); + break; + } + case SEND_SHUTDOWN_STATE:{ + memset(can_tx_buffer, 0, 8); + can_tx_buffer[0] = 0; + comm_can_transmit_eid(0x02FF1204, can_tx_buffer, 1); + can_display_process_state = SEND_BATTERY_RANGE_STATE; + + break; + } + } + } +} + +static bool can_bus_rx_callback(uint32_t id, uint8_t *data, uint8_t len) { + bool used_data = false; + LUNA_CAN_IDs cmd_id = id; + + switch(cmd_id){ + case LUNA_DISPLAY_ID1:{ + if(len == LUNA_DISPLAY_ID1_LENGTH_BYTES){ + if(data != NULL){ + used_data = true; + + if(check_assist_level(data[1])){ + luna_settings.pas_level = data[1]; + set_assist_level(luna_settings.pas_level); + } + + if(check_light_mode(data[2])){ + luna_settings.light_mode = data[2]; + } + } + } + break; + } + case LUNA_TORQUE_SENSOR_ID:{ + if(len == LUNA_TORQUE_SENSOR_ID_LENGTH_BYTES){ + if(data != NULL){ + used_data = true; + luna_settings.torque_sensor_is_active = true; + uint16_t torque_raw_level = (((uint16_t)data[1] << 8 ) & 0xff00) | ((uint16_t)data[0]&0x00ff); + + if(torque_raw_level > LUNA_TORQUE_SENSOR_MAXIMUM_TORQUE){ + torque_raw_level = LUNA_TORQUE_SENSOR_MAXIMUM_TORQUE; + } + + if(torque_raw_level > LUNA_TORQUE_SENSOR_MINIMUM_TORQUE){ + torque_raw_level = torque_raw_level - LUNA_TORQUE_SENSOR_MINIMUM_TORQUE; + }else{ + torque_raw_level = 0; + } + UTILS_LP_FAST(luna_settings.pas_torque, (float)torque_raw_level, 0.1); + } + } + break; + } + } + return used_data; +} + +bool luna_display_shutdown_request(void) { + static uint16_t counter = 0; + + bool button_down = hw_luna_m600_shutdown_button_down(); + bool button_released = false; + static bool first_press = true; + + // With the bike off, if you press the power button and never release it + // the bike shouldn't turn on and then power off, so ignore the first release + if (button_down && first_press) { + return false; + } else { + first_press = false; + } + + // while button is pressed, increment a counter. If released, after 500ms reset the counter to 0 + if(button_down) { + counter++; + } else { + button_released = true; + if (counter > 0) { + counter--; + + if (counter < 50 ) { + counter = 0; + } + } + } + return (counter > 100 && button_released); +} + +// If user long-presses the (-) button, walk mode is engaged. +// Controller will target a specific RPM and hold it until the button is released +// The speed control must have a slow ramp, the allowed current is TBD. +bool luna_display_walk_mode_long_pressed(void) { + static systime_t time_last_button_down = 0; + const float long_press_time_seconds = 0.5; // bafang uses 2 sec, lets make it more responsive + + if( time_last_button_down == 0) { + time_last_button_down = chVTGetSystemTimeX(); + } + + if(hw_luna_m600_minus_button_down() == false) { + time_last_button_down = chVTGetSystemTimeX(); + } + + return (UTILS_AGE_S(time_last_button_down) > long_press_time_seconds); +} + +// lets try using the sensorless observer to check if the encoder +// offset has been set correctly. +float encoder_error(void) { + static float angle_diff_filtered = 0.0; + float angle_diff = 0.0; + + // some batches have only 2 current sensors, so better rely only in + // the phase voltage tracker which runs with no modulation and is + // accurate at mid-high rpm + if(/*mc_interface_get_state() != MC_STATE_OFF &&*/ mc_interface_get_duty_cycle_now() > 0.4) { + angle_diff = utils_angle_difference(mcpwm_foc_get_phase_encoder(), mcpwm_foc_get_phase_observer()); + } + + UTILS_LP_FAST(angle_diff_filtered, angle_diff, 0.01); + return angle_diff_filtered; +} + +static THD_FUNCTION(display_process_thread, arg) { + (void)arg; + chRegSetThreadName("Luna CANbus display"); + + event_listener_t el; + chEvtRegisterMaskWithFlags(&HW_UART_DEV.event, &el, EVENT_MASK(0), CHN_INPUT_AVAILABLE); + + // Set default power level + set_assist_level(PAS_LEVEL_1); + + comm_can_set_eid_rx_callback( can_bus_rx_callback ); + + for(;;) { + float uptime = (float)chVTGetSystemTimeX() / (float)CH_CFG_ST_FREQUENCY; + chThdSleep(MS2ST(5)); + can_bus_display_process(5); + + static bool encoder_recovery_done = false; + if(encoder_recovery_done) { + // default motor config is set to an invalid 400° encoder offset. Make clear + // to the users that they need to run the encoder offset detection + if(mc_interface_get_configuration()->foc_encoder_offset == 400.0 /*|| fabsf(hw_get_encoder_error()) > 10.0*/) { + ;//mc_interface_fault_stop(FAULT_CODE_ENCODER_SPI, false, false); + } + } else { + if (uptime > 1.0 && !encoder_recovery_done) { + // recover encoder offset across fw updates + hw_recover_encoder_offset(); + encoder_recovery_done = true; + } + } + // when PAS level set to 0, the system would shut down after 10 minutes of non-assisted pedaling + // so we force it to stay ON if there is pedal activity + if(luna_canbus_get_PAS_torque() > 0.25) { + shutdown_reset_timer(); + } + + // consider shutting down in case of battery undervoltage. Power button can turn it on only if Vin>25V + // BMS typically trips at 2.8V/cell + if(luna_display_shutdown_request()) { + conf_general_store_backup_data(); + HW_SHUTDOWN_HOLD_OFF(); // night night + } + + if (luna_settings.assist_code == PAS_LEVEL_WALK) { + //disable ADC & PAS apps for 50 millisec + app_disable_output(50); + + if(luna_display_walk_mode_long_pressed()) { + //send speed command. Sloow 500rpm/sec ramp + mc_interface_set_pid_speed(2500.0); + timeout_reset(); + } else { + //quickly release the motor + mc_interface_release_motor(); + } + } + } +} +#endif diff --git a/hwconf/luna/m600/luna_m600_display.h b/hwconf/luna/m600/luna_m600_display.h new file mode 100644 index 00000000..e7f3fcbc --- /dev/null +++ b/hwconf/luna/m600/luna_m600_display.h @@ -0,0 +1,28 @@ +/* + Copyright 2020 Marcos Chaparro mchaparro@powerdesigns.ca + + This file is part of the VESC firmware. + + The VESC firmware is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + The VESC firmware is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef APP_LUNA_DISPLAY_CANBUS_H_ +#define APP_LUNA_DISPLAY_CANBUS_H_ + +#include "stdint.h" + +void luna_canbus_start(void); +float luna_canbus_get_PAS_torque(void); +float get_encoder_error(void); +#endif /* APP_LUNA_DISPLAY_CANBUS_H_ */ diff --git a/hwconf/luna/m600/mcconf_luna_m600.h b/hwconf/luna/m600/mcconf_luna_m600.h new file mode 100644 index 00000000..22d88461 --- /dev/null +++ b/hwconf/luna/m600/mcconf_luna_m600.h @@ -0,0 +1,515 @@ +// This file is autogenerated by VESC Tool + +#ifndef MCCONF_LUNA_M600_H_ +#define MCCONF_LUNA_M600_H_ + +// PWM Mode +#define MCCONF_PWM_MODE 1 + +// Commutation Mode +#define MCCONF_COMM_MODE 0 + +// Motor Type +#define MCCONF_DEFAULT_MOTOR_TYPE 2 + +// Sensor Mode +#define MCCONF_SENSOR_MODE 0 + +// Motor Current Max +#define MCCONF_L_CURRENT_MAX 100 + +// Motor Current Max Brake +#define MCCONF_L_CURRENT_MIN -20 + +// Battery Current Max +#define MCCONF_L_IN_CURRENT_MAX 60 + +// Battery Current Max Regen +#define MCCONF_L_IN_CURRENT_MIN -20 + +// Absolute Maximum Current +#define MCCONF_L_MAX_ABS_CURRENT 200 + +// Max ERPM Reverse +#define MCCONF_L_RPM_MIN -100000 + +// Max ERPM +#define MCCONF_L_RPM_MAX 100000 + +// ERPM Limit Start +#define MCCONF_L_RPM_START 0.8 + +// Max ERPM Full Brake +#define MCCONF_L_CURR_MAX_RPM_FBRAKE 300 + +// Max ERPM Full Brake Current Control +#define MCCONF_L_CURR_MAX_RPM_FBRAKE_CC 1500 + +// Minimum Input Voltage +#define MCCONF_L_MIN_VOLTAGE 30 + +// Maximum Input Voltage +#define MCCONF_L_MAX_VOLTAGE 60.0 + +// Battery Voltage Cutoff Start +#define MCCONF_L_BATTERY_CUT_START 40.0 + +// Battery Voltage Cutoff End +#define MCCONF_L_BATTERY_CUT_END 39.0 + +// Slow ABS Current Limit +#define MCCONF_L_SLOW_ABS_OVERCURRENT 0 + +// MOSFET Temp Cutoff Start +#define MCCONF_L_LIM_TEMP_FET_START 85 + +// MOSFET Temp Cutoff End +#define MCCONF_L_LIM_TEMP_FET_END 95 + +// Motor Temp Cutoff Start +#define MCCONF_L_LIM_TEMP_MOTOR_START 105 + +// Motor Temp Cutoff End +#define MCCONF_L_LIM_TEMP_MOTOR_END 120 + +// Acceleration Temperature Decrease +#define MCCONF_L_LIM_TEMP_ACCEL_DEC 0 + +// Minimum Duty Cycle +#define MCCONF_L_MIN_DUTY 0.005 + +// Maximum Duty Cycle +#define MCCONF_L_MAX_DUTY 0.95 + +// Maximum Wattage +#define MCCONF_L_WATT_MAX 2500 + +// Maximum Braking Wattage +#define MCCONF_L_WATT_MIN -2500 + +// Max Current Scale +#define MCCONF_L_CURRENT_MAX_SCALE 1.0 + +// Min Current Scale +#define MCCONF_L_CURRENT_MIN_SCALE 1 + +// Duty Cycle Current Limit Start +#define MCCONF_L_DUTY_START 1 + +// Minimum ERPM +#define MCCONF_SL_MIN_RPM 150 + +// Minimum ERPM Integrator +#define MCCONF_SL_MIN_ERPM_CYCLE_INT_LIMIT 1100 + +// Max Brake Current at Direction Change +#define MCCONF_SL_MAX_FB_CURR_DIR_CHANGE 10 + +// Cycle Integrator Limit +#define MCCONF_SL_CYCLE_INT_LIMIT 62 + +// Phase Advance at BR ERPM +#define MCCONF_SL_PHASE_ADVANCE_AT_BR 0.8 + +// BR ERPM +#define MCCONF_SL_CYCLE_INT_BR 80000 + +// BEMF Coupling +#define MCCONF_SL_BEMF_COUPLING_K 600 + +// Hall Table [0] +#define MCCONF_HALL_TAB_0 -1 + +// Hall Table [1] +#define MCCONF_HALL_TAB_1 1 + +// Hall Table [2] +#define MCCONF_HALL_TAB_2 3 + +// Hall Table [3] +#define MCCONF_HALL_TAB_3 2 + +// Hall Table [4] +#define MCCONF_HALL_TAB_4 5 + +// Hall Table [5] +#define MCCONF_HALL_TAB_5 6 + +// Hall Table [6] +#define MCCONF_HALL_TAB_6 4 + +// Hall Table [7] +#define MCCONF_HALL_TAB_7 -1 + +// Sensorless ERPM Hybrid +#define MCCONF_HALL_ERPM 2000 + +// Current KP +#define MCCONF_FOC_CURRENT_KP 0.106 + +// Current KI +#define MCCONF_FOC_CURRENT_KI 47.69 + +// Switching Frequency +#define MCCONF_FOC_F_ZV 30000 + +// Dead Time Compensation +#define MCCONF_FOC_DT_US 0.23 + +// Encoder Inverted +#define MCCONF_FOC_ENCODER_INVERTED 1 + +// Encoder Offset +#define MCCONF_FOC_ENCODER_OFFSET 400.0 + +// Encoder Ratio +#define MCCONF_FOC_ENCODER_RATIO 4 + +// Sin/Cos Sine Gain Compensation +#define MCCONF_FOC_ENCODER_SIN_GAIN 1 + +// Sin/Cos Cosine Gain Compensation +#define MCCONF_FOC_ENCODER_COS_GAIN 1 + +// Sin/Cos Sine Offset +#define MCCONF_FOC_ENCODER_SIN_OFFSET 1.65 + +// Sin/Cos Cosine Offset +#define MCCONF_FOC_ENCODER_COS_OFFSET 1.65 + +// Sin/Cos Filter Constant +#define MCCONF_FOC_ENCODER_SINCOS_FILTER 0.5 + +// Sensor Mode +#define MCCONF_FOC_SENSOR_MODE 1 + +// Speed Tracker Kp +#define MCCONF_FOC_PLL_KP 2000 + +// Speed Tracker Ki +#define MCCONF_FOC_PLL_KI 30000 + +// Motor Inductance (L) +#define MCCONF_FOC_MOTOR_L 0.00010601 + +// Motor Inductance Difference (Ld - Lq) +#define MCCONF_FOC_MOTOR_LD_LQ_DIFF 0.0 + +// Motor Resistance (R) +#define MCCONF_FOC_MOTOR_R 0.0477 + +// Motor Flux Linkage (λ) +#define MCCONF_FOC_MOTOR_FLUX_LINKAGE 0.013687 + +// Observer Gain (x1M) +#define MCCONF_FOC_OBSERVER_GAIN 5.34e+06 + +// Observer Gain At Minimum Duty +#define MCCONF_FOC_OBSERVER_GAIN_SLOW 0.05 + +// Duty Downramp Kp +#define MCCONF_FOC_DUTY_DOWNRAMP_KP 10 + +// Duty Downramp Ki +#define MCCONF_FOC_DUTY_DOWNRAMP_KI 200 + +// Openloop ERPM +#define MCCONF_FOC_OPENLOOP_RPM 1500 + +// Openloop ERPM at Min Current +#define MCCONF_FOC_OPENLOOP_RPM_LOW 0 + +// D Axis Gain Scaling Start +#define MCCONF_FOC_D_GAIN_SCALE_START 1 + +// D Axis Gain Scaling at Max Mod +#define MCCONF_FOC_D_GAIN_SCALE_MAX_MOD 0.2 + +// Openloop Hysteresis +#define MCCONF_FOC_SL_OPENLOOP_HYST 0.1 + +// Openloop Lock Time +#define MCCONF_FOC_SL_OPENLOOP_T_LOCK 0 + +// Openloop Ramp Time +#define MCCONF_FOC_SL_OPENLOOP_T_RAMP 0.1 + +// Openloop Time +#define MCCONF_FOC_SL_OPENLOOP_TIME 0.05 + +// Hall Table [0] +#define MCCONF_FOC_HALL_TAB_0 255 + +// Hall Table [1] +#define MCCONF_FOC_HALL_TAB_1 255 + +// Hall Table [2] +#define MCCONF_FOC_HALL_TAB_2 255 + +// Hall Table [3] +#define MCCONF_FOC_HALL_TAB_3 255 + +// Hall Table [4] +#define MCCONF_FOC_HALL_TAB_4 255 + +// Hall Table [5] +#define MCCONF_FOC_HALL_TAB_5 255 + +// Hall Table [6] +#define MCCONF_FOC_HALL_TAB_6 255 + +// Hall Table [7] +#define MCCONF_FOC_HALL_TAB_7 255 + +// Hall Interpolation ERPM +#define MCCONF_FOC_HALL_INTERP_ERPM 500 + +// Sensorless ERPM +#define MCCONF_FOC_SL_ERPM 30000 + +// Sample in V0 and V7 +#define MCCONF_FOC_SAMPLE_V0_V7 0 + +// High Current Sampling Mode +#define MCCONF_FOC_SAMPLE_HIGH_CURRENT 0 + +// Stator Saturation Compensation +#define MCCONF_FOC_SAT_COMP 0 + +// Temp Comp +#define MCCONF_FOC_TEMP_COMP 0 + +// Temp Comp Base Temp +#define MCCONF_FOC_TEMP_COMP_BASE_TEMP 25 + +// Current Filter Constant +#define MCCONF_FOC_CURRENT_FILTER_CONST 0.1 + +// Current Controller Decoupling +#define MCCONF_FOC_CC_DECOUPLING 0 + +// Observer Type +#define MCCONF_FOC_OBSERVER_TYPE 0 + +// HFI Start Voltage +#define MCCONF_FOC_HFI_VOLTAGE_START 20 + +// HFI Run Voltage +#define MCCONF_FOC_HFI_VOLTAGE_RUN 4 + +// HFI Max Voltage +#define MCCONF_FOC_HFI_VOLTAGE_MAX 10 + +// Sensorless ERPM HFI +#define MCCONF_FOC_SL_ERPM_HFI 2000 + +// HFI Start Samples +#define MCCONF_FOC_HFI_START_SAMPLES 65 + +// HFI Observer Override Time +#define MCCONF_FOC_HFI_OBS_OVR_SEC 0.001 + +// HFI Samples +#define MCCONF_FOC_HFI_SAMPLES 1 + +// Run calibration at boot +#define MCCONF_FOC_OFFSETS_CAL_ON_BOOT 1 + +// Current Offset 0 +#define MCCONF_FOC_OFFSETS_CURRENT_0 2048.0 + +// Current Offset 1 +#define MCCONF_FOC_OFFSETS_CURRENT_1 2048.0 + +// Current Offset 2 +#define MCCONF_FOC_OFFSETS_CURRENT_2 2048.0 + +// Voltage Offset 0 +#define MCCONF_FOC_OFFSETS_VOLTAGE_0 0.0 + +// Voltage Offset 1 +#define MCCONF_FOC_OFFSETS_VOLTAGE_1 0.0 + +// Voltage Offset 2 +#define MCCONF_FOC_OFFSETS_VOLTAGE_2 0.0 + +// Voltage Offset Undriven 0 +#define MCCONF_FOC_OFFSETS_VOLTAGE_UNDRIVEN_0 0 + +// Voltage Offset Undriven 1 +#define MCCONF_FOC_OFFSETS_VOLTAGE_UNDRIVEN_1 0 + +// Voltage Offset Undriven 2 +#define MCCONF_FOC_OFFSETS_VOLTAGE_UNDRIVEN_2 0 + +// Enable Phase Filters +#define MCCONF_FOC_PHASE_FILTER_ENABLE 1 + +// Maximum ERPM for phase filters +#define MCCONF_FOC_PHASE_FILTER_MAX_ERPM 2500 + +// Field Weakening Current Max +#define MCCONF_FOC_FW_CURRENT_MAX 7 + +// Field Weakening Duty Start +#define MCCONF_FOC_FW_DUTY_START 0.9 + +// Field Weakening Ramp Time +#define MCCONF_FOC_FW_RAMP_TIME 0.2 + +// Q Axis Current Factor +#define MCCONF_FOC_FW_Q_CURRENT_FACTOR 0.02 + +// Buffer Notification Length +#define MCCONF_GPD_BUFFER_NOTIFY_LEFT 200 + +// Buffer Sampling Interpolation +#define MCCONF_GPD_BUFFER_INTERPOL 0 + +// Current Filter Constant +#define MCCONF_GPD_CURRENT_FILTER_CONST 0.1 + +// Current KP +#define MCCONF_GPD_CURRENT_KP 0.03 + +// Current KI +#define MCCONF_GPD_CURRENT_KI 50 + +// Speed PID Kp +#define MCCONF_S_PID_KP 0.004 + +// Speed PID Ki +#define MCCONF_S_PID_KI 0.004 + +// Speed PID Kd +#define MCCONF_S_PID_KD 0.0001 + +// Speed PID Kd Filer +#define MCCONF_S_PID_KD_FILTER 0.2 + +// Minimum ERPM +#define MCCONF_S_PID_MIN_RPM 100 + +// Allow Braking +#define MCCONF_S_PID_ALLOW_BRAKING 1 + +// Ramp eRPMs per second +#define MCCONF_S_PID_RAMP_ERPMS_S 1500 + +// Position PID Kp +#define MCCONF_P_PID_KP 0.03 + +// Position PID Ki +#define MCCONF_P_PID_KI 0 + +// Position PID Kd +#define MCCONF_P_PID_KD 0.0004 + +// Position PID Kd Filer +#define MCCONF_P_PID_KD_FILTER 0.2 + +// Position Angle Division +#define MCCONF_P_PID_ANG_DIV 1 + +// Gain Decrease Angle +#define MCCONF_P_PID_GAIN_DEC_ANGLE 0 + +// Startup boost +#define MCCONF_CC_STARTUP_BOOST_DUTY 0.01 + +// Minimum Current +#define MCCONF_CC_MIN_CURRENT 0.05 + +// Current Controller Gain +#define MCCONF_CC_GAIN 0.0046 + +// Current Control Ramp Step Max +#define MCCONF_CC_RAMP_STEP 0.04 + +// Fault Stop Time +#define MCCONF_M_FAULT_STOP_TIME 500 + +// Duty Ramp Step Max +#define MCCONF_M_RAMP_STEP 0.02 + +// Current Backoff Gain +#define MCCONF_M_CURRENT_BACKOFF_GAIN 0.5 + +// ABI Encoder Counts +#define MCCONF_M_ENCODER_COUNTS 8192 + +// Sensor Port Mode +#define MCCONF_M_SENSOR_PORT_MODE 7 + +// Invert Motor Direction +#define MCCONF_M_INVERT_DIRECTION 0 + +// DRV8301 OC Mode +#define MCCONF_M_DRV8301_OC_MODE 0 + +// DRV8301 OC Adjustment +#define MCCONF_M_DRV8301_OC_ADJ 16 + +// Minimum Switching Frequency +#define MCCONF_M_BLDC_F_SW_MIN 3000 + +// Maximum Switching Frequency +#define MCCONF_M_BLDC_F_SW_MAX 35000 + +// Switching Frequency +#define MCCONF_M_DC_F_SW 25000 + +// Beta Value for Motor Thermistor +#define MCCONF_M_NTC_MOTOR_BETA 3380 + +// Auxiliary Output Mode +#define MCCONF_M_OUT_AUX_MODE 0 + +// Motor Temperature Sensor Type +#define MCCONF_M_MOTOR_TEMP_SENS_TYPE 1 + +// Coefficient for PTC Motor Thermistor +#define MCCONF_M_PTC_MOTOR_COEFF 0.25 + +// Hall Sensor Extra Samples +#define MCCONF_M_HALL_EXTRA_SAMPLES 1 + +// Motor Poles +#define MCCONF_SI_MOTOR_POLES 8 + +// Gear Ratio +#define MCCONF_SI_GEAR_RATIO 7 + +// Wheel Diameter +#define MCCONF_SI_WHEEL_DIAMETER 0.714 + +// Battery Type +#define MCCONF_SI_BATTERY_TYPE 0 + +// Battery Cells Series +#define MCCONF_SI_BATTERY_CELLS 13 + +// Battery Capacity +#define MCCONF_SI_BATTERY_AH 14.5 + +// BMS Type +#define MCCONF_BMS_TYPE 1 + +// Temperature Limit Start +#define MCCONF_BMS_T_LIMIT_START 45 + +// Temperature Limit End +#define MCCONF_BMS_T_LIMIT_END 65 + +// SOC Limit Start +#define MCCONF_BMS_SOC_LIMIT_START 0.05 + +// SOC Limit End +#define MCCONF_BMS_SOC_LIMIT_END 0 + +// Forward CAN to Local +#define MCCONF_BMS_FWD_CAN_MODE 0 + +// MCCONF_LUNA_M600_H_ +#endif + diff --git a/hwconf/luna/m600/qmlui_luna_m600.c b/hwconf/luna/m600/qmlui_luna_m600.c new file mode 100644 index 00000000..181408b7 --- /dev/null +++ b/hwconf/luna/m600/qmlui_luna_m600.c @@ -0,0 +1,422 @@ +// This file is autogenerated by VESC Tool + +#include "qmlui_luna_m600.h" + +uint8_t data_qml_hw[6655] = { + 0x00, 0x01, 0x70, 0x84, 0x78, 0xda, 0xed, 0x5d, 0x6d, 0x53, 0xe3, 0x38, 0xb6, 0xfe, 0xce, 0xaf, + 0xd0, 0xe4, 0xd6, 0x6e, 0x25, 0x3b, 0x19, 0x93, 0x84, 0x86, 0x9e, 0x66, 0x2e, 0xbb, 0xd5, 0x4d, + 0x37, 0x3d, 0xd4, 0x85, 0x6d, 0x06, 0xe8, 0xe6, 0x0b, 0x55, 0x94, 0xb0, 0x95, 0xc4, 0x85, 0xdf, + 0xda, 0x56, 0x08, 0xec, 0x2c, 0xff, 0x69, 0x7f, 0xc3, 0xfe, 0xb2, 0x2b, 0xc9, 0xef, 0xef, 0xb2, + 0x23, 0x07, 0x42, 0x2b, 0x3b, 0x33, 0x1b, 0x6c, 0xe9, 0x48, 0x96, 0xce, 0x39, 0x8f, 0xce, 0x91, + 0xfc, 0x44, 0x37, 0x1d, 0xdb, 0xc5, 0xe0, 0x1b, 0xd2, 0x34, 0xe4, 0x2a, 0xf7, 0xc8, 0x53, 0xd9, + 0x7f, 0x74, 0x0b, 0x23, 0x77, 0x0a, 0x55, 0x04, 0xc6, 0xca, 0xe8, 0x37, 0xdd, 0x2f, 0xd4, 0xfb, + 0xee, 0xaa, 0xfb, 0xdb, 0xa6, 0x7d, 0xab, 0x1b, 0xa8, 0x17, 0x5e, 0xfc, 0x03, 0xff, 0xb1, 0xd0, + 0xd5, 0x3b, 0x30, 0x51, 0xde, 0x6e, 0xa5, 0x2f, 0x29, 0x87, 0xb6, 0x85, 0x5d, 0xdb, 0xf0, 0xc8, + 0xbd, 0x49, 0xf6, 0xde, 0x09, 0x7c, 0xb4, 0x17, 0xd8, 0x23, 0xe2, 0x77, 0xe2, 0x5b, 0x8a, 0x01, + 0x6f, 0x3d, 0xc5, 0x43, 0x18, 0xeb, 0xd6, 0x8c, 0xde, 0x1b, 0x01, 0xe8, 0x81, 0x3f, 0x2e, 0x82, + 0x0b, 0x61, 0xc1, 0xca, 0xce, 0x16, 0x15, 0xba, 0x35, 0xd0, 0x02, 0x92, 0x6b, 0x25, 0xb7, 0x55, + 0xdb, 0x34, 0xa1, 0xa5, 0x79, 0xe5, 0xf7, 0xad, 0xa9, 0x3e, 0x73, 0xa0, 0x0b, 0xcd, 0xd2, 0x32, + 0x0b, 0xac, 0x1b, 0x3a, 0x7e, 0x64, 0xb7, 0x8f, 0x31, 0x32, 0xc1, 0x9f, 0x5b, 0x80, 0x7c, 0x74, + 0x6d, 0x1f, 0x98, 0x50, 0xb7, 0xe8, 0x25, 0x76, 0x01, 0x5a, 0xea, 0xdc, 0x76, 0x3d, 0x65, 0xaa, + 0x1b, 0xc6, 0x3e, 0x20, 0x32, 0x91, 0x85, 0xd9, 0x8d, 0xed, 0xed, 0xf0, 0x96, 0x09, 0xdd, 0x99, + 0x6e, 0x79, 0xfb, 0x60, 0x3c, 0xf2, 0x6f, 0x4c, 0xf5, 0x07, 0x80, 0xe7, 0xba, 0xc7, 0xca, 0x39, + 0xae, 0xed, 0x20, 0x97, 0xb4, 0xf4, 0xc1, 0x40, 0x5f, 0xe9, 0x43, 0x99, 0xe4, 0xcb, 0x3e, 0xe9, + 0x8b, 0xa7, 0x1e, 0x4f, 0xe9, 0x93, 0x7e, 0x44, 0xf7, 0xba, 0x8a, 0xfa, 0x83, 0x74, 0xe9, 0xc3, + 0xf0, 0x19, 0xcd, 0xf0, 0x5b, 0x54, 0x27, 0x7c, 0xfc, 0x6c, 0x95, 0x7b, 0xe8, 0x82, 0xe9, 0xf2, + 0x1b, 0x72, 0x3d, 0xdd, 0xb6, 0xf6, 0xe3, 0x8a, 0xca, 0x0c, 0xe1, 0xa3, 0xf0, 0x7a, 0xbe, 0x1d, + 0x3a, 0x56, 0x67, 0xfe, 0x58, 0x99, 0xa7, 0x2a, 0xfd, 0x3b, 0x6a, 0xc9, 0x54, 0xfd, 0xdb, 0xd5, + 0x95, 0xde, 0x3b, 0x4e, 0xaa, 0x16, 0xf4, 0xff, 0xae, 0xab, 0x76, 0x6c, 0x4d, 0xed, 0x54, 0x3d, + 0x3d, 0xb8, 0x90, 0xaf, 0x78, 0x6b, 0xdb, 0x06, 0xd0, 0xbd, 0xdf, 0x6d, 0x57, 0xff, 0x17, 0xd1, + 0x51, 0x48, 0x66, 0x62, 0xa9, 0x6b, 0x78, 0x0e, 0xfe, 0x0e, 0xe6, 0x48, 0x9f, 0xcd, 0x71, 0x41, + 0x71, 0x4f, 0x9d, 0x23, 0x6d, 0x61, 0x20, 0x2a, 0xf1, 0xca, 0xd5, 0x31, 0x19, 0xf3, 0x29, 0x34, + 0x3c, 0x54, 0x50, 0x94, 0xcc, 0x17, 0xd2, 0x2e, 0xe7, 0xae, 0x8d, 0xb1, 0x51, 0x5c, 0x8c, 0x0e, + 0xad, 0x3f, 0xf7, 0x97, 0xf0, 0xf6, 0x03, 0x74, 0x43, 0x4d, 0x50, 0x30, 0xfb, 0x33, 0xd2, 0x16, + 0xfa, 0x61, 0x5f, 0xc8, 0xd8, 0x3b, 0xb6, 0x45, 0x4b, 0xd8, 0x16, 0xfd, 0x6e, 0x20, 0x8c, 0x88, + 0x6a, 0xfd, 0x19, 0x95, 0x4a, 0x4a, 0x53, 0xee, 0x75, 0x4f, 0x27, 0x9a, 0x00, 0x0e, 0x00, 0x76, + 0x17, 0xa8, 0xb8, 0x0c, 0xb2, 0x20, 0x29, 0xa2, 0x65, 0xcb, 0xb8, 0x08, 0x6a, 0xa1, 0xbd, 0x05, + 0xc3, 0xf6, 0xb4, 0x15, 0x74, 0xc1, 0x58, 0x98, 0x96, 0x6f, 0xb7, 0x89, 0x86, 0x0b, 0x15, 0x3a, + 0xba, 0xeb, 0x37, 0x96, 0x28, 0x1e, 0x1a, 0x85, 0xff, 0xa0, 0xa9, 0xcb, 0x7e, 0xdd, 0xfd, 0x54, + 0x37, 0x53, 0x05, 0x8a, 0x9a, 0x0a, 0x07, 0x28, 0xfc, 0xa8, 0x0b, 0x97, 0x5e, 0x3e, 0xb6, 0x34, + 0xf4, 0xb0, 0x0f, 0xbc, 0xa5, 0xee, 0xa0, 0x6f, 0x3a, 0x5a, 0x2a, 0xc9, 0xeb, 0xa9, 0x0a, 0xfe, + 0x03, 0x31, 0x99, 0x57, 0x54, 0x07, 0xf6, 0xd3, 0xe3, 0xc1, 0xfa, 0x4b, 0xc6, 0x5b, 0x57, 0x75, + 0x1c, 0xdc, 0x1f, 0xa5, 0x1b, 0x34, 0x74, 0x27, 0xa8, 0x93, 0x7e, 0x9a, 0x70, 0xae, 0x89, 0x77, + 0x02, 0xb7, 0x0b, 0x8c, 0x6d, 0x6a, 0xd2, 0x6f, 0xea, 0xca, 0x04, 0x6d, 0x8c, 0x47, 0xa3, 0xb4, + 0x38, 0x3a, 0x1c, 0xac, 0x40, 0x66, 0x2c, 0xe9, 0x07, 0xa3, 0x07, 0x32, 0x6c, 0xdf, 0xbd, 0x4b, + 0xb7, 0xdf, 0x3b, 0xd7, 0x35, 0xd4, 0x1b, 0xe4, 0x8a, 0x2c, 0x7d, 0xb1, 0xa7, 0x10, 0xcf, 0x89, + 0x7f, 0x79, 0xe8, 0xfb, 0xc3, 0xaf, 0x24, 0xda, 0x1c, 0x06, 0x97, 0x7c, 0x43, 0xd8, 0x06, 0xa9, + 0x12, 0x5e, 0x5a, 0xe2, 0x53, 0xab, 0xae, 0x5d, 0x2e, 0xac, 0x97, 0xda, 0xb5, 0x0f, 0xfa, 0x1d, + 0x02, 0x87, 0x47, 0x9f, 0x5f, 0x68, 0xf7, 0x8e, 0x74, 0xd7, 0x5c, 0x12, 0x75, 0x5f, 0x63, 0xf7, + 0x9e, 0x62, 0xf5, 0xbb, 0x08, 0x8d, 0xa8, 0xc0, 0x8c, 0x23, 0x03, 0xab, 0x30, 0xc2, 0xa0, 0x41, + 0x1e, 0x0b, 0xfc, 0x9d, 0x79, 0xdf, 0x02, 0x13, 0xe4, 0xb0, 0xd2, 0x84, 0x21, 0x82, 0x82, 0xcf, + 0x19, 0x9c, 0xa1, 0x82, 0x61, 0x0e, 0x3f, 0xe7, 0xf8, 0x23, 0xc4, 0x90, 0x78, 0xbe, 0x85, 0x53, + 0x51, 0xaa, 0x12, 0xc1, 0xcb, 0x3e, 0x0b, 0x47, 0x83, 0x18, 0x51, 0xf1, 0x65, 0x0e, 0x09, 0x1c, + 0x1c, 0x64, 0xbc, 0x4a, 0xb9, 0xce, 0x14, 0x5f, 0x2d, 0x79, 0xba, 0x5b, 0xa8, 0xde, 0xcd, 0x5c, + 0x7b, 0x61, 0x91, 0xa9, 0x3a, 0x47, 0x2a, 0x86, 0xd6, 0xcc, 0x28, 0x1b, 0x05, 0xdb, 0x81, 0xc4, + 0xc7, 0x3d, 0x12, 0xff, 0xa6, 0xe4, 0xfb, 0xf2, 0xb4, 0x95, 0xbb, 0x54, 0x82, 0x07, 0x45, 0x43, + 0x85, 0x6d, 0xe7, 0x94, 0x2d, 0x6a, 0xf6, 0xc1, 0x6e, 0x65, 0xc1, 0x5b, 0x02, 0x99, 0xb6, 0x19, + 0x96, 0x1d, 0x6f, 0x71, 0x8f, 0x7f, 0x61, 0x49, 0x5f, 0x23, 0x62, 0xf8, 0xcd, 0x7e, 0x3c, 0xfa, + 0xc4, 0xd6, 0x8c, 0x76, 0xaa, 0xf0, 0x7e, 0x21, 0x78, 0x65, 0x2d, 0x80, 0xf8, 0x70, 0xd2, 0x13, + 0xe4, 0x65, 0xc1, 0xaa, 0xdc, 0x1e, 0x82, 0x1a, 0x17, 0xf5, 0xd8, 0x54, 0x88, 0x15, 0x74, 0xed, + 0x60, 0x40, 0x0f, 0x9f, 0xf9, 0x62, 0x02, 0xa1, 0x5c, 0x32, 0x38, 0xac, 0x88, 0x1b, 0xf7, 0x1a, + 0x98, 0x5e, 0x39, 0x1c, 0xee, 0x34, 0x29, 0x5f, 0x06, 0x8d, 0xbc, 0x1e, 0xb5, 0xcc, 0xbb, 0x5e, + 0x60, 0x17, 0x21, 0x7c, 0x6d, 0x19, 0x68, 0x06, 0x8d, 0x02, 0x17, 0x5b, 0xe5, 0x6e, 0x2b, 0x0b, + 0xa7, 0x1f, 0x27, 0xd4, 0x92, 0x94, 0x6f, 0x6e, 0x53, 0x3f, 0x74, 0xe4, 0x79, 0x99, 0xde, 0xa0, + 0xa1, 0x13, 0x69, 0x3b, 0x64, 0x97, 0x2e, 0xd4, 0xe5, 0x50, 0x71, 0x0d, 0xd5, 0xc9, 0x42, 0xd3, + 0x55, 0xe2, 0x82, 0xbd, 0x1f, 0x6b, 0xb8, 0x8a, 0xaf, 0x96, 0x2d, 0x25, 0x4a, 0x9c, 0xea, 0x45, + 0xe1, 0xea, 0xa2, 0xd6, 0xb3, 0x7a, 0x95, 0xcb, 0x8d, 0xa6, 0x4b, 0x8f, 0x15, 0x1c, 0x28, 0x87, + 0x5f, 0xdc, 0xde, 0x06, 0xbe, 0xff, 0x01, 0x27, 0xd4, 0xfd, 0x94, 0x96, 0x63, 0x00, 0x5f, 0x7a, + 0xb7, 0x5a, 0x1d, 0x39, 0x90, 0xba, 0x15, 0x6a, 0xb7, 0x45, 0xf0, 0x76, 0x68, 0xde, 0x04, 0xd9, + 0x9b, 0xa0, 0x7c, 0x4a, 0x3f, 0x89, 0xa5, 0x1a, 0x46, 0x8d, 0x82, 0xa6, 0xa7, 0xaf, 0xf1, 0x72, + 0xb0, 0x81, 0x72, 0xa4, 0x8a, 0xdb, 0x16, 0x26, 0xa2, 0x03, 0xb5, 0x0b, 0xd2, 0x05, 0xcc, 0x60, + 0xb9, 0xaa, 0x97, 0x69, 0x3a, 0x57, 0xe5, 0x86, 0x0a, 0xb4, 0x92, 0x22, 0xad, 0xaa, 0x50, 0xab, + 0x29, 0x56, 0x1b, 0x05, 0x0b, 0x3f, 0x41, 0xd6, 0xa5, 0xc1, 0x9c, 0x36, 0x55, 0xcf, 0xf0, 0x93, + 0x48, 0x30, 0xf2, 0x7e, 0xa8, 0x9f, 0x21, 0x2d, 0x21, 0xb7, 0x51, 0xad, 0x86, 0xfe, 0x4e, 0x84, + 0x8b, 0xe5, 0x88, 0x3c, 0xca, 0x3e, 0x9f, 0x09, 0xcc, 0x3a, 0x1f, 0xec, 0x87, 0x86, 0x43, 0xc3, + 0xe2, 0x58, 0xe6, 0x83, 0x2f, 0x6d, 0xf7, 0xfb, 0x02, 0x11, 0x09, 0x22, 0x06, 0xa9, 0x91, 0x8c, + 0x73, 0x7b, 0xd9, 0xd8, 0xbc, 0x12, 0x53, 0xbb, 0x92, 0xa5, 0xe5, 0x7d, 0x59, 0x5b, 0x9b, 0x13, + 0x63, 0x7b, 0xab, 0xd8, 0x60, 0x81, 0x55, 0x35, 0xad, 0x7a, 0x49, 0x16, 0x6f, 0x2d, 0x66, 0x21, + 0x5e, 0xf7, 0xf5, 0xc2, 0xd4, 0xef, 0xb5, 0xf5, 0xde, 0x74, 0xbc, 0x5e, 0x2b, 0x51, 0xaa, 0x6d, + 0xd8, 0xee, 0xfe, 0x9f, 0xec, 0xff, 0x0e, 0xbe, 0xfa, 0x9b, 0x0b, 0x34, 0xf1, 0xfe, 0xde, 0x71, + 0x7e, 0x47, 0x0f, 0x87, 0xf4, 0x72, 0xbf, 0x67, 0x50, 0x7b, 0xa2, 0xfd, 0xed, 0x0d, 0x9e, 0x5a, + 0xb5, 0x32, 0x8f, 0x32, 0xe0, 0xef, 0x89, 0x2c, 0xcb, 0x64, 0xf9, 0x57, 0x2a, 0x50, 0x61, 0x7f, + 0xff, 0x7e, 0x88, 0xe8, 0xd6, 0x4a, 0x2b, 0xd1, 0x81, 0x55, 0x98, 0xba, 0xa5, 0x9b, 0x0b, 0x33, + 0x11, 0xbb, 0x35, 0x15, 0xd4, 0xfc, 0xc9, 0x2e, 0x0c, 0x5d, 0x43, 0x6e, 0xcb, 0x39, 0xcc, 0x7a, + 0x03, 0x5f, 0x58, 0x2b, 0x51, 0x1e, 0x46, 0xce, 0x85, 0xfe, 0x2f, 0x44, 0x9f, 0xbb, 0x95, 0x80, + 0xa9, 0x6b, 0x9b, 0xfb, 0x60, 0xd2, 0xae, 0xf2, 0x3d, 0x34, 0x16, 0xa4, 0xe9, 0x9d, 0x76, 0xb5, + 0xb1, 0xcd, 0x66, 0x8b, 0x38, 0x05, 0x12, 0x8c, 0x00, 0x67, 0x0e, 0x3d, 0x04, 0x20, 0xd1, 0xe6, + 0x55, 0x74, 0x61, 0x25, 0x0f, 0x19, 0x99, 0xa7, 0x6d, 0x1b, 0x97, 0xba, 0xd3, 0x72, 0x76, 0x93, + 0xfb, 0x0c, 0xf9, 0x59, 0x56, 0xe6, 0xd0, 0xd2, 0x0c, 0xd4, 0x5a, 0x72, 0xb4, 0x02, 0x28, 0x10, + 0xed, 0xb8, 0xc8, 0xf3, 0x90, 0xd6, 0x5a, 0xb6, 0xef, 0x5b, 0x0a, 0x04, 0xb3, 0x79, 0x26, 0x9e, + 0xff, 0x88, 0xee, 0x3a, 0xf5, 0xc7, 0x83, 0x9f, 0x7b, 0xe0, 0x7d, 0x3b, 0x9f, 0xf3, 0xd4, 0xb1, + 0x6d, 0x3e, 0xbd, 0x48, 0xd0, 0x3f, 0x83, 0xde, 0xa6, 0x21, 0xfe, 0x0f, 0x8e, 0xaf, 0x67, 0xef, + 0x2f, 0x24, 0xb4, 0x6e, 0x34, 0xb4, 0x12, 0x9b, 0x13, 0x83, 0xab, 0x2b, 0xc0, 0xea, 0x4a, 0xa8, + 0x3a, 0x69, 0x8f, 0xaa, 0xb5, 0x2e, 0xbc, 0x35, 0x44, 0xd0, 0xcf, 0x78, 0x40, 0x20, 0xfb, 0x2f, + 0xc0, 0x9e, 0xbe, 0x66, 0xcc, 0x8e, 0xd4, 0x47, 0x30, 0x60, 0xc7, 0x72, 0x45, 0xa2, 0x75, 0x2c, + 0x55, 0x42, 0xf5, 0x8a, 0x50, 0x6d, 0x2f, 0x91, 0x2b, 0xc1, 0x7a, 0xb3, 0xc0, 0x9a, 0xce, 0x99, + 0x04, 0xea, 0x4d, 0x05, 0x6a, 0x3a, 0x7b, 0x42, 0xa0, 0x7a, 0xb2, 0x3b, 0x7a, 0x2e, 0xb0, 0xde, + 0x1d, 0xb5, 0x47, 0xeb, 0x49, 0xdb, 0xca, 0x2f, 0x1a, 0x3f, 0xe3, 0x59, 0x15, 0x8d, 0xa0, 0x09, + 0xc9, 0x42, 0x31, 0x34, 0x21, 0xb7, 0x00, 0x45, 0xaf, 0x24, 0x8a, 0xf2, 0xdb, 0xf4, 0x85, 0x83, + 0x90, 0x26, 0x08, 0x45, 0x5b, 0xa8, 0x0a, 0x68, 0x03, 0x63, 0x12, 0x80, 0x5b, 0x03, 0x30, 0x9b, + 0xee, 0x6b, 0xeb, 0x44, 0x37, 0x75, 0x2c, 0x71, 0x78, 0x43, 0x71, 0x98, 0x4d, 0xe2, 0xb3, 0x87, + 0xcc, 0x93, 0xe7, 0x8a, 0x99, 0xf7, 0x5e, 0x1f, 0x06, 0x27, 0x66, 0x54, 0x30, 0x06, 0x27, 0x25, + 0x8b, 0xc4, 0xe0, 0xa4, 0xdc, 0x2c, 0x06, 0x83, 0x9f, 0x41, 0x3f, 0x78, 0xed, 0x62, 0xe1, 0xa1, + 0x63, 0xd3, 0x41, 0xae, 0x0e, 0x8d, 0xaf, 0x96, 0x8e, 0xbd, 0xfe, 0x00, 0xfc, 0x03, 0xf4, 0x80, + 0xe9, 0xcc, 0x7b, 0xfb, 0x3d, 0x70, 0x67, 0x6e, 0xcf, 0x6b, 0x4e, 0x42, 0x49, 0xb4, 0x4e, 0xed, + 0x42, 0x05, 0x9b, 0x89, 0xe7, 0xc8, 0x73, 0x6c, 0xcb, 0x43, 0x32, 0xfc, 0xdd, 0x28, 0xf4, 0x8d, + 0xf7, 0x82, 0xc3, 0x09, 0x94, 0x18, 0xbc, 0xa9, 0xfb, 0xc1, 0x19, 0x4b, 0x14, 0x02, 0xc7, 0x23, + 0x65, 0x15, 0x40, 0xde, 0x59, 0x05, 0x8f, 0x47, 0xca, 0xbb, 0xd6, 0x80, 0x3c, 0x52, 0x76, 0x5e, + 0xdf, 0x4e, 0x70, 0xe1, 0xfc, 0x8a, 0xde, 0x13, 0x2e, 0x6e, 0x44, 0xe8, 0xee, 0x70, 0x71, 0x13, + 0x05, 0x61, 0xb3, 0x87, 0x54, 0x19, 0x38, 0x37, 0x77, 0x00, 0x9f, 0x1e, 0x1c, 0x5b, 0xc2, 0xf0, + 0x86, 0xc2, 0xf0, 0x89, 0x6e, 0x21, 0xe8, 0x12, 0xf4, 0x94, 0x38, 0xbc, 0xe1, 0x38, 0x4c, 0xcd, + 0x70, 0xb3, 0x77, 0x91, 0xc7, 0xa3, 0x95, 0x0e, 0x67, 0xbd, 0x5a, 0x04, 0x8e, 0x67, 0xb6, 0x23, + 0xf4, 0x4d, 0x34, 0xd0, 0x05, 0xf2, 0x26, 0xc4, 0xe7, 0x51, 0xf7, 0x2f, 0x9b, 0x0f, 0xb9, 0x6b, + 0x43, 0xdc, 0x33, 0xe8, 0xc9, 0xb8, 0x77, 0x73, 0xcf, 0x68, 0xc9, 0x90, 0x77, 0xf3, 0xcf, 0x69, + 0xbd, 0xa0, 0x68, 0x77, 0xac, 0xec, 0xae, 0x16, 0xef, 0xfe, 0x2a, 0xe3, 0xdd, 0xf4, 0x29, 0xaa, + 0x4e, 0x43, 0xdd, 0xbc, 0x7c, 0xc1, 0xa7, 0xaa, 0x7e, 0x90, 0x00, 0x77, 0x6d, 0x68, 0x7b, 0x74, + 0x25, 0x30, 0xb2, 0x7d, 0x56, 0x9c, 0xfd, 0x61, 0x60, 0xf6, 0x48, 0x47, 0x86, 0x76, 0x6d, 0x5d, + 0x21, 0x78, 0x87, 0x2c, 0xd2, 0x0b, 0x89, 0xb4, 0x1b, 0x8a, 0xb4, 0x47, 0x57, 0x1b, 0x7e, 0x20, + 0xba, 0x35, 0xb4, 0xbe, 0x15, 0x09, 0xac, 0x2f, 0x01, 0x57, 0xc3, 0xa9, 0x14, 0x0c, 0xa7, 0x91, + 0x58, 0x91, 0x28, 0x1a, 0x09, 0x7d, 0x9d, 0x47, 0x93, 0xd7, 0x07, 0x9d, 0x49, 0xca, 0x3f, 0x89, + 0xa0, 0x1b, 0x85, 0xa0, 0x64, 0xe6, 0x80, 0x7c, 0x65, 0xf7, 0x79, 0x51, 0xf4, 0x70, 0x8e, 0xd4, + 0xbb, 0xe6, 0x06, 0x58, 0x63, 0x88, 0x4c, 0xea, 0x6d, 0x43, 0x6b, 0x8c, 0xa6, 0x93, 0x56, 0xa6, + 0x24, 0x9b, 0xed, 0x94, 0x5a, 0x20, 0x48, 0x3d, 0xaf, 0x7f, 0xac, 0x2f, 0x55, 0x5d, 0xe2, 0xa9, + 0xec, 0x46, 0x05, 0xa3, 0x50, 0x15, 0x5d, 0x0e, 0xe3, 0x9e, 0xaa, 0xe6, 0xc9, 0x91, 0x74, 0x38, + 0x5c, 0xce, 0x56, 0xd2, 0xe1, 0x48, 0x3a, 0x9c, 0xee, 0xd0, 0x5d, 0x12, 0xdb, 0xd4, 0x79, 0xcd, + 0x75, 0x2c, 0x4f, 0x31, 0xf5, 0x96, 0x92, 0xd7, 0x46, 0xf2, 0xda, 0x48, 0x5e, 0x1b, 0x99, 0x6a, + 0x4a, 0x38, 0x83, 0x4d, 0xa7, 0xb5, 0x79, 0x2b, 0x69, 0x6d, 0x4a, 0x92, 0x50, 0xb9, 0x49, 0x16, + 0x96, 0x87, 0xca, 0x4b, 0x16, 0x93, 0x8a, 0xca, 0xcb, 0x95, 0x2f, 0xca, 0xaf, 0x84, 0xf7, 0x92, + 0xd2, 0x46, 0x52, 0xda, 0x48, 0x54, 0x5d, 0x2b, 0xaa, 0x6e, 0x3c, 0xa3, 0xcd, 0x5e, 0x7b, 0x40, + 0xad, 0xf3, 0xdf, 0x92, 0xd0, 0xa6, 0x06, 0xad, 0xc5, 0xf3, 0xd9, 0x64, 0xc4, 0x0a, 0xc4, 0x69, + 0xc9, 0x66, 0x23, 0x0a, 0xa4, 0x25, 0x99, 0x8d, 0x24, 0xb3, 0x91, 0x10, 0xbd, 0x46, 0x88, 0x7e, + 0x0d, 0x5c, 0x36, 0x93, 0x91, 0x24, 0xb3, 0x49, 0x63, 0x67, 0x07, 0x5c, 0x36, 0x39, 0xc1, 0x22, + 0xf1, 0x53, 0x32, 0xd9, 0x88, 0x42, 0x50, 0x49, 0x64, 0x23, 0x89, 0x6c, 0x24, 0x06, 0x6f, 0x14, + 0x06, 0xbf, 0x06, 0x1e, 0x9b, 0x3d, 0xc9, 0x63, 0x13, 0xc3, 0x6f, 0x17, 0x34, 0x36, 0x39, 0xc1, + 0x02, 0xe1, 0x57, 0x92, 0xd8, 0x3c, 0x03, 0x50, 0x4b, 0x0e, 0x9b, 0x8d, 0x06, 0x5e, 0xc9, 0x61, + 0xf3, 0x5a, 0xe0, 0xf7, 0xf5, 0x51, 0xd8, 0xbc, 0x91, 0xaf, 0xf4, 0x25, 0x76, 0x7d, 0xbb, 0x65, + 0xb0, 0xa9, 0x6a, 0x43, 0xe4, 0x4e, 0xb0, 0xe4, 0xaf, 0xe9, 0x14, 0x85, 0x25, 0x7d, 0x8d, 0xa4, + 0xaf, 0x91, 0x10, 0xfc, 0xdc, 0x10, 0x2c, 0xd9, 0x6b, 0x5e, 0x29, 0xf8, 0x76, 0x40, 0x5e, 0x53, + 0x26, 0xbf, 0x03, 0xd0, 0x95, 0xd4, 0x35, 0x62, 0xc0, 0x56, 0x32, 0xd7, 0x48, 0xe6, 0x1a, 0x89, + 0xb2, 0xcf, 0x79, 0x1c, 0xeb, 0x35, 0x11, 0xd7, 0xec, 0xc9, 0x28, 0x37, 0x75, 0x5a, 0xaa, 0xcb, + 0x00, 0xb7, 0x2b, 0xda, 0x9a, 0x12, 0xe1, 0x92, 0xb5, 0x66, 0x35, 0xa0, 0x95, 0xa4, 0x35, 0x92, + 0xb4, 0x46, 0x82, 0xec, 0xb3, 0x80, 0xec, 0xa6, 0x73, 0xd6, 0xbc, 0x95, 0x9c, 0x35, 0x99, 0x99, + 0x14, 0x8b, 0xa4, 0x82, 0x19, 0x6b, 0xd2, 0x32, 0x25, 0x61, 0xcd, 0x4a, 0xa8, 0x29, 0xf9, 0x6a, + 0x24, 0x5f, 0x8d, 0x04, 0xd0, 0xd6, 0x1e, 0x40, 0x00, 0x5f, 0x4d, 0xde, 0x0e, 0x25, 0x5d, 0x4d, + 0x75, 0x49, 0xde, 0x82, 0xeb, 0xa1, 0xb5, 0x69, 0x49, 0x5f, 0x73, 0xb2, 0xd0, 0x74, 0x95, 0x78, + 0x6f, 0x4f, 0x52, 0xd8, 0xb4, 0xf5, 0xc7, 0x92, 0xc2, 0x26, 0x63, 0xad, 0x92, 0xc2, 0xa6, 0x1b, + 0xc0, 0x97, 0x14, 0x36, 0x75, 0x1e, 0x72, 0x2d, 0x0b, 0x56, 0xc9, 0x5e, 0x23, 0xd9, 0x6b, 0x24, + 0x7b, 0x8d, 0xcc, 0x39, 0xbd, 0x0a, 0xe2, 0x9a, 0x15, 0x4f, 0x4d, 0xbc, 0x6a, 0xe6, 0x9a, 0x4e, + 0x48, 0x6b, 0x3a, 0xe0, 0xab, 0x91, 0x54, 0x35, 0x22, 0x70, 0xdd, 0x91, 0x2c, 0x35, 0x92, 0xa5, + 0x46, 0xa2, 0xe7, 0x9a, 0xd0, 0xd3, 0xd9, 0x74, 0x82, 0x9a, 0x77, 0x2b, 0x10, 0xd4, 0x48, 0x6e, + 0x9a, 0x36, 0x78, 0xec, 0x08, 0xa7, 0xa5, 0x71, 0x04, 0x33, 0xd2, 0x38, 0x92, 0x8c, 0x66, 0x75, + 0x18, 0x96, 0x3c, 0x34, 0x92, 0x87, 0x46, 0x82, 0xf0, 0x7a, 0x40, 0xf8, 0x55, 0x50, 0xd0, 0xec, + 0x4a, 0x0a, 0x9a, 0x08, 0x22, 0x3b, 0x60, 0x9f, 0x71, 0x84, 0x13, 0xcf, 0x38, 0x92, 0x73, 0x46, + 0x00, 0x50, 0x7a, 0x92, 0x6e, 0x46, 0xd2, 0xcd, 0x48, 0xa8, 0xdd, 0x94, 0x9f, 0xd5, 0x93, 0x4c, + 0x33, 0xaf, 0x06, 0x65, 0xbd, 0x0e, 0x48, 0x66, 0x3c, 0xe1, 0xfc, 0x32, 0x9e, 0xa4, 0x96, 0x59, + 0x2b, 0x1e, 0x63, 0xc9, 0x2a, 0x03, 0x24, 0xab, 0x8c, 0x44, 0xd9, 0xe7, 0x44, 0x59, 0xfc, 0xea, + 0x08, 0x65, 0x76, 0xe4, 0xab, 0x76, 0xfe, 0x66, 0x6c, 0xc7, 0x5c, 0x32, 0x9d, 0xd2, 0xc8, 0x48, + 0x06, 0x99, 0xae, 0xc0, 0x56, 0x92, 0xc7, 0x48, 0xf2, 0x18, 0x89, 0xb4, 0xcf, 0x88, 0xb4, 0x9b, + 0xcf, 0x1b, 0xf3, 0x6e, 0x57, 0xd2, 0xc6, 0xa4, 0x20, 0xb6, 0x0b, 0xc6, 0x98, 0xce, 0xc8, 0x62, + 0x24, 0x4f, 0x8c, 0x28, 0x48, 0x75, 0x24, 0x45, 0x8c, 0xa4, 0x88, 0x91, 0x58, 0xfa, 0x3c, 0x67, + 0xa1, 0x5e, 0x13, 0x3b, 0x8c, 0x0c, 0x59, 0xa3, 0xf3, 0x4a, 0x1d, 0x45, 0xab, 0x4e, 0x47, 0x9c, + 0x30, 0xce, 0x8f, 0x42, 0x07, 0xc3, 0x5b, 0x70, 0x1d, 0xb8, 0x3b, 0x95, 0x8c, 0x31, 0x92, 0x31, + 0x46, 0x62, 0xee, 0x9a, 0x31, 0x77, 0x2a, 0xc9, 0x62, 0xc0, 0x9a, 0xfd, 0x8d, 0x78, 0x84, 0x9d, + 0x8a, 0xe6, 0x89, 0x99, 0x8a, 0xa5, 0x88, 0x99, 0x4a, 0x76, 0x98, 0x55, 0xc1, 0x51, 0x12, 0xc3, + 0x48, 0x62, 0x18, 0x89, 0x93, 0xad, 0x8d, 0x5f, 0x00, 0x31, 0xcc, 0x54, 0x72, 0xc2, 0xbc, 0x42, + 0x4e, 0x18, 0xfe, 0xab, 0x3c, 0x2e, 0x90, 0x65, 0x31, 0x5c, 0x9b, 0x4c, 0x0b, 0xf2, 0x48, 0xf9, + 0xad, 0x55, 0xbc, 0x59, 0x82, 0xb4, 0xad, 0x62, 0x66, 0x79, 0xb8, 0x30, 0x3e, 0x2c, 0x30, 0xb6, + 0xad, 0x1a, 0xd5, 0x0f, 0xdc, 0xd5, 0x39, 0x82, 0x64, 0x45, 0x7f, 0x81, 0x30, 0x26, 0x52, 0x6b, + 0x1c, 0x55, 0xa0, 0x84, 0x2a, 0x23, 0x2d, 0xb9, 0x70, 0xa0, 0xb5, 0x0f, 0x26, 0x3c, 0x15, 0xc8, + 0xa2, 0x62, 0x8a, 0x5c, 0x17, 0x69, 0x81, 0xea, 0x4e, 0x6a, 0x5c, 0x40, 0xb6, 0x5a, 0x48, 0x8a, + 0xf1, 0x2b, 0x57, 0xb5, 0x26, 0x36, 0x62, 0x5b, 0x87, 0x86, 0xee, 0xdb, 0x66, 0xbd, 0xa3, 0x70, + 0xc9, 0x50, 0x85, 0x03, 0xd5, 0x1f, 0xac, 0xa0, 0xe7, 0x4d, 0xf5, 0x93, 0x7b, 0x4e, 0xd9, 0x06, + 0xd5, 0xc2, 0x42, 0x57, 0xae, 0x8e, 0x51, 0xd8, 0xd5, 0xa0, 0x66, 0xdb, 0xce, 0x06, 0x7a, 0xc2, + 0x44, 0x4a, 0x45, 0xe1, 0x52, 0x94, 0x65, 0x72, 0xf8, 0xfb, 0x83, 0x8e, 0x7d, 0x55, 0xfa, 0x4a, + 0xe6, 0x18, 0x42, 0x09, 0x89, 0xd5, 0x2d, 0x54, 0xef, 0x66, 0x64, 0x75, 0x6a, 0x91, 0xe7, 0x39, + 0x47, 0x2a, 0x86, 0xd6, 0xcc, 0x28, 0x23, 0xbb, 0xb2, 0xa9, 0xc7, 0xc1, 0x8f, 0x34, 0x4b, 0x39, + 0x2a, 0x68, 0x3c, 0x77, 0x89, 0x83, 0xd3, 0x88, 0x9b, 0x91, 0xa5, 0x09, 0xe7, 0x0a, 0xff, 0x66, + 0x08, 0x17, 0x19, 0x55, 0x43, 0x02, 0x2a, 0x0e, 0xd2, 0xa9, 0x16, 0x44, 0x53, 0x4d, 0x99, 0x81, + 0x3e, 0xbb, 0xba, 0xc6, 0xb5, 0x6e, 0xa7, 0x9e, 0x62, 0x46, 0x0a, 0x57, 0x9b, 0x65, 0xe3, 0x95, + 0xbc, 0x6f, 0xf1, 0x5e, 0x5d, 0x7e, 0x20, 0x72, 0x0c, 0x3c, 0xcb, 0x74, 0xd7, 0x5e, 0x46, 0x25, + 0xc7, 0xa3, 0xea, 0xe4, 0x76, 0x83, 0x88, 0x8b, 0x8e, 0xc0, 0x2d, 0xc4, 0xf8, 0x70, 0xe1, 0xd2, + 0xc7, 0xe2, 0x89, 0xb1, 0xb0, 0x8e, 0x29, 0x3e, 0x7f, 0xf7, 0x2e, 0xc9, 0xc2, 0xfb, 0x03, 0xa9, + 0x8b, 0xdc, 0x47, 0x8e, 0x43, 0xc2, 0x2d, 0xd7, 0x6e, 0x05, 0x4e, 0x74, 0x5c, 0x9f, 0xda, 0x6f, + 0x1a, 0xb8, 0xb5, 0x0e, 0xd6, 0xa2, 0x85, 0xc8, 0x88, 0x6f, 0xbf, 0xa1, 0x61, 0x64, 0x15, 0xc0, + 0x4e, 0x30, 0x3b, 0xd7, 0xd6, 0x29, 0x7c, 0xe0, 0x8f, 0xa2, 0xba, 0x8b, 0x9c, 0x04, 0x47, 0x4b, + 0x2b, 0x45, 0x48, 0x9c, 0x27, 0xce, 0x3e, 0xda, 0x0b, 0xb2, 0xac, 0xbc, 0x70, 0x74, 0xab, 0x59, + 0x3c, 0x94, 0x34, 0x90, 0x26, 0x19, 0x88, 0x15, 0x43, 0x15, 0x0d, 0xa9, 0xba, 0x49, 0x16, 0xca, + 0x75, 0x4b, 0x86, 0xcc, 0xca, 0xcc, 0xf8, 0x16, 0xbe, 0xab, 0xa1, 0x8c, 0x1a, 0xd5, 0x3b, 0xf2, + 0x73, 0x92, 0x0d, 0x6b, 0x5d, 0xda, 0x0d, 0x9b, 0xa2, 0x6b, 0x14, 0xfd, 0x81, 0x68, 0xf4, 0x31, + 0xf9, 0x97, 0x9f, 0xf9, 0x6e, 0x31, 0xf5, 0x6b, 0xf1, 0xa6, 0xcd, 0xba, 0x0b, 0x9d, 0x5a, 0xba, + 0xd7, 0x5f, 0x79, 0x54, 0x47, 0xa4, 0x87, 0x7c, 0x89, 0x0e, 0xb2, 0x43, 0xff, 0x88, 0x0c, 0xc3, + 0x93, 0x8e, 0xb1, 0x4d, 0xde, 0x62, 0x65, 0xbf, 0x48, 0x87, 0xfe, 0x59, 0x1c, 0xe3, 0xa8, 0x8d, + 0x63, 0x1c, 0xef, 0xb4, 0x72, 0x8c, 0x8d, 0xab, 0x51, 0xcf, 0x38, 0x69, 0xe2, 0x19, 0x23, 0x1f, + 0xe7, 0x6d, 0xa8, 0x8b, 0x93, 0x1e, 0xae, 0xd3, 0x25, 0xe0, 0x97, 0x7b, 0xe4, 0xde, 0xdb, 0x06, + 0x26, 0x91, 0xac, 0x74, 0x74, 0xcf, 0xb2, 0x02, 0x4c, 0xcc, 0xc0, 0xe6, 0x2c, 0x04, 0x77, 0x77, + 0xd7, 0xb6, 0x10, 0xfc, 0x75, 0xaf, 0xcd, 0x42, 0xf0, 0x5b, 0xbb, 0x85, 0xe0, 0xb7, 0x0d, 0xf5, + 0x92, 0x13, 0xe9, 0x26, 0x3b, 0x75, 0x93, 0x5f, 0x2d, 0x2d, 0xb2, 0xd2, 0x6b, 0xeb, 0x70, 0x81, + 0xed, 0xe9, 0x14, 0x5c, 0x60, 0xe8, 0x62, 0xe9, 0x35, 0x9f, 0xc5, 0x6b, 0x26, 0x27, 0x84, 0xcd, + 0xc3, 0xe6, 0xf8, 0xce, 0x37, 0x23, 0xe9, 0x3b, 0x5f, 0x92, 0xef, 0xdc, 0x91, 0xbe, 0x73, 0xfd, + 0xbe, 0xf3, 0x93, 0xa5, 0x49, 0xcf, 0xf9, 0xec, 0x9e, 0x93, 0xcc, 0xc2, 0xe6, 0xf8, 0xcd, 0x9d, + 0x77, 0xd2, 0x6f, 0xae, 0xe4, 0x37, 0x45, 0x3b, 0xce, 0x37, 0x8d, 0xb7, 0x75, 0x18, 0xdd, 0x94, + 0xbd, 0xe6, 0x5d, 0x9d, 0x1f, 0xcc, 0xdd, 0x5e, 0xcd, 0x11, 0x32, 0xae, 0x2d, 0x7a, 0x92, 0x58, + 0x7a, 0xd8, 0x9c, 0x09, 0x1c, 0xda, 0xe6, 0xad, 0x1d, 0xab, 0x39, 0x55, 0xe5, 0x25, 0x1d, 0xb0, + 0x8f, 0x3a, 0x34, 0x11, 0x8e, 0x39, 0x62, 0xe9, 0x60, 0x9e, 0xdb, 0x54, 0x73, 0x7b, 0xf4, 0xab, + 0x3f, 0x92, 0xaa, 0xbf, 0x5f, 0x76, 0x4c, 0x3c, 0xe8, 0x43, 0xa8, 0x59, 0xa6, 0xad, 0x21, 0xa2, + 0x06, 0x27, 0xba, 0x87, 0x4f, 0xe9, 0xd7, 0xc4, 0x84, 0xe5, 0x84, 0xb3, 0x02, 0xd1, 0x6d, 0x5a, + 0xe5, 0x93, 0x81, 0xe8, 0x88, 0xfc, 0xc9, 0xe6, 0xae, 0x37, 0xd9, 0xbb, 0xee, 0xf5, 0x7e, 0x4b, + 0xfc, 0x22, 0xf6, 0xdb, 0x3d, 0xf0, 0xb4, 0xbd, 0xed, 0xea, 0xa6, 0x47, 0x66, 0xf3, 0xe7, 0xf1, + 0x9e, 0x69, 0x56, 0xd5, 0x7e, 0xab, 0xec, 0xa6, 0xeb, 0xbf, 0x1d, 0xbf, 0x49, 0x38, 0x85, 0x82, + 0x1a, 0xef, 0x32, 0xe5, 0x77, 0x27, 0x41, 0xf9, 0xa7, 0xad, 0x97, 0xe5, 0x6e, 0x90, 0xa5, 0x92, + 0xb1, 0x73, 0x1b, 0x3b, 0x9c, 0x4f, 0x7e, 0x3d, 0xe9, 0x71, 0xf8, 0x3c, 0x0e, 0xd7, 0x39, 0xa8, + 0x92, 0xb9, 0xf9, 0x32, 0x9d, 0x7a, 0x08, 0xfb, 0x12, 0x1a, 0x67, 0x21, 0x59, 0xdd, 0x6b, 0x22, + 0x88, 0x18, 0x98, 0x8a, 0x75, 0xdb, 0xea, 0x35, 0xf5, 0x08, 0xb9, 0x63, 0x4a, 0x6f, 0x47, 0xad, + 0x45, 0x84, 0x6e, 0xa5, 0x01, 0xb1, 0x5d, 0xa3, 0x23, 0x4c, 0xc9, 0x8f, 0xb9, 0x37, 0x1a, 0x69, + 0xc4, 0x39, 0xa8, 0x98, 0x78, 0x09, 0xc3, 0x9e, 0x29, 0xb6, 0x83, 0xac, 0xfe, 0x40, 0xf0, 0x81, + 0xf9, 0x35, 0xac, 0x2d, 0xd3, 0x6a, 0xf0, 0x1c, 0xab, 0xca, 0x71, 0x9b, 0x55, 0xe5, 0xfa, 0x82, + 0xf1, 0x37, 0x7b, 0xad, 0x36, 0x6e, 0xfe, 0xfb, 0x9f, 0x0d, 0x8b, 0xab, 0xa5, 0x27, 0x6d, 0xbd, + 0x76, 0x3b, 0xb6, 0xee, 0x91, 0x8b, 0xc1, 0xa9, 0x8d, 0x6d, 0xf7, 0xda, 0xfa, 0xa8, 0x37, 0x76, + 0x86, 0x32, 0x52, 0x4e, 0x7c, 0x2e, 0x96, 0x3a, 0x56, 0xe7, 0x0d, 0xdd, 0x98, 0x49, 0xc7, 0x3e, + 0x1a, 0xf9, 0x35, 0xf9, 0xb1, 0x17, 0x97, 0x13, 0xdb, 0x6b, 0xb0, 0xd2, 0xea, 0x7d, 0x84, 0x18, + 0x82, 0x13, 0x7b, 0x36, 0xe3, 0x7a, 0x69, 0x75, 0x9d, 0xee, 0x61, 0x6b, 0x65, 0xf5, 0xa0, 0x03, + 0xe2, 0x62, 0xf2, 0x70, 0x9f, 0x6a, 0x75, 0x21, 0xb0, 0xe1, 0x4f, 0x16, 0xa4, 0x44, 0xd6, 0xe7, + 0x97, 0x80, 0x7f, 0x5c, 0x42, 0xb7, 0xa4, 0x32, 0x23, 0x3a, 0xb6, 0xb8, 0x5c, 0x53, 0x8b, 0x81, + 0x2c, 0x3c, 0x3a, 0x2e, 0xee, 0x68, 0xb6, 0x3e, 0x05, 0xfd, 0xe0, 0x75, 0x9c, 0x01, 0xa7, 0xd9, + 0xd1, 0x2a, 0x01, 0x67, 0x2c, 0x5d, 0xf8, 0x9c, 0xd3, 0xa1, 0x3e, 0xd2, 0x0d, 0xd4, 0xfc, 0x37, + 0x6b, 0xdc, 0xb0, 0x2a, 0x73, 0x4a, 0x74, 0x32, 0x06, 0x83, 0x06, 0xb6, 0x1f, 0x3a, 0x4b, 0x8f, + 0x6e, 0x26, 0x7c, 0xb6, 0x3c, 0xef, 0xc8, 0x76, 0x91, 0x7f, 0x8a, 0xfb, 0x02, 0xb9, 0xf7, 0xba, + 0x8a, 0x1a, 0x2c, 0xca, 0x82, 0x27, 0x22, 0x0b, 0xa1, 0x2b, 0x78, 0x87, 0x4e, 0x6c, 0xf5, 0xae, + 0x4f, 0xe7, 0x66, 0x20, 0xca, 0x19, 0x00, 0x64, 0x78, 0x88, 0xf3, 0xe1, 0x82, 0xbe, 0xa8, 0x86, + 0xed, 0xa1, 0x78, 0x78, 0xf9, 0xba, 0x12, 0x0f, 0x8a, 0xed, 0x94, 0x8d, 0x09, 0xf7, 0x34, 0xff, + 0x14, 0x73, 0x03, 0x47, 0xa3, 0xd2, 0x68, 0x8a, 0x0a, 0x46, 0x95, 0xbd, 0xf4, 0x33, 0x78, 0x09, + 0xf9, 0xb3, 0x4b, 0xdd, 0xe4, 0x7a, 0x75, 0xdc, 0x45, 0x0e, 0x82, 0xbc, 0xbf, 0x41, 0xeb, 0x2e, + 0x2c, 0x8b, 0xad, 0x3a, 0xb8, 0x4a, 0xeb, 0xd4, 0x79, 0x90, 0x60, 0x7e, 0x1f, 0xd0, 0xdf, 0x9f, + 0xa8, 0x2d, 0x6e, 0x5b, 0x97, 0xae, 0x3e, 0x9b, 0x21, 0x97, 0x3f, 0x68, 0xa1, 0xd3, 0x18, 0x7b, + 0x43, 0x25, 0xb0, 0xf5, 0x46, 0xa6, 0xfa, 0xd7, 0xbf, 0x82, 0x50, 0x11, 0x74, 0x8f, 0xe9, 0xe3, + 0x17, 0x16, 0xf0, 0xb4, 0xb3, 0xd5, 0x15, 0xd5, 0x52, 0x98, 0x6a, 0xae, 0xae, 0x9e, 0xc2, 0x63, + 0xb9, 0xfc, 0x3c, 0x81, 0x03, 0x50, 0x34, 0xf2, 0x1d, 0xbe, 0x0f, 0xb8, 0x91, 0x31, 0xc5, 0x0b, + 0x0c, 0x3a, 0x76, 0x3b, 0x4a, 0xdf, 0x84, 0xe7, 0x5c, 0xe7, 0x36, 0x01, 0x07, 0xba, 0x54, 0x09, + 0x83, 0x0e, 0xdb, 0x7d, 0x54, 0x14, 0x45, 0x48, 0x12, 0x66, 0x23, 0xb2, 0x30, 0xd4, 0x09, 0x84, + 0x5e, 0xc5, 0x45, 0xdf, 0x17, 0xc8, 0xc3, 0x14, 0x26, 0xcf, 0x90, 0x6b, 0xea, 0x9e, 0x47, 0x02, + 0x81, 0xe6, 0xee, 0x80, 0x7e, 0x0c, 0x1f, 0x6d, 0xcf, 0x68, 0x9f, 0x5c, 0x05, 0xb1, 0x95, 0x21, + 0x35, 0xc3, 0x56, 0xaf, 0x17, 0xa7, 0x85, 0x85, 0x3f, 0x98, 0xd2, 0x42, 0x58, 0xa3, 0xe5, 0x43, + 0x81, 0x87, 0x43, 0xa6, 0x8e, 0x4f, 0x91, 0xe7, 0xc1, 0x19, 0xf2, 0x73, 0x56, 0xab, 0xfd, 0xc0, + 0x60, 0x8f, 0x3e, 0x15, 0x88, 0x87, 0xda, 0xeb, 0x0d, 0x57, 0x93, 0xf7, 0xd5, 0x5f, 0x81, 0x63, + 0x1b, 0x04, 0x53, 0x09, 0xe8, 0x2b, 0xc4, 0xc0, 0x7b, 0xf4, 0xe8, 0xcf, 0xd6, 0x3b, 0x51, 0x43, + 0xca, 0x8a, 0x0d, 0x31, 0xef, 0x3e, 0x04, 0x0d, 0x9d, 0x3c, 0xbf, 0xa3, 0x17, 0x0e, 0x09, 0x74, + 0x65, 0x7c, 0x6c, 0x39, 0x8d, 0x78, 0x27, 0xba, 0xcb, 0x28, 0x44, 0xa1, 0x55, 0xb8, 0x68, 0xe7, + 0xae, 0xd9, 0xf0, 0xed, 0xc1, 0xf2, 0xea, 0x26, 0x7b, 0xe7, 0xd1, 0x6b, 0x42, 0x5f, 0x33, 0xb5, + 0x2d, 0xe2, 0xa3, 0x6c, 0xb2, 0xd6, 0x0a, 0xb8, 0x7a, 0x26, 0x4d, 0xbd, 0xad, 0xb2, 0x4d, 0x4c, + 0xa6, 0xc7, 0xef, 0x17, 0xff, 0x08, 0x5f, 0x76, 0x55, 0xc2, 0x2f, 0x0d, 0x4d, 0xd7, 0x71, 0x49, + 0x68, 0xe5, 0xe2, 0x47, 0x00, 0x0d, 0x1d, 0x7a, 0xfe, 0x98, 0xef, 0x17, 0xc4, 0x4b, 0x2b, 0x0b, + 0xf5, 0x43, 0xdf, 0x7d, 0xb0, 0xe2, 0x12, 0x31, 0x23, 0x9a, 0x66, 0xc8, 0x03, 0x1a, 0x80, 0x60, + 0xe7, 0x2d, 0x24, 0x05, 0xf8, 0x00, 0x5d, 0x25, 0xb9, 0x27, 0xb7, 0xb5, 0x6a, 0x33, 0x1e, 0x76, + 0x11, 0xc2, 0x97, 0xec, 0x97, 0x54, 0xf7, 0x41, 0xf2, 0xaf, 0x24, 0xe5, 0x8e, 0x98, 0x56, 0xce, + 0xa0, 0x17, 0x36, 0x71, 0x96, 0xfe, 0x85, 0x4f, 0x41, 0xf2, 0xe9, 0xef, 0xa1, 0x45, 0x2d, 0x64, + 0x7f, 0x1c, 0x4d, 0x4c, 0x1b, 0x6c, 0x3f, 0x3f, 0x6c, 0xe3, 0x22, 0xfb, 0xd3, 0x30, 0x82, 0x66, + 0x23, 0xc3, 0x73, 0x1f, 0xcd, 0x4b, 0x05, 0xff, 0xbd, 0xd8, 0x96, 0x29, 0x93, 0x5e, 0xb6, 0xd5, + 0x2c, 0x35, 0xb0, 0x30, 0x9d, 0x48, 0x3f, 0x4e, 0x42, 0x43, 0xba, 0x7b, 0xce, 0xa3, 0xab, 0xb0, + 0x99, 0xa3, 0xab, 0x0e, 0xa4, 0x27, 0x99, 0x5e, 0xa2, 0x86, 0x8a, 0xe8, 0x5f, 0x22, 0x67, 0xb1, + 0x6a, 0xc3, 0xd8, 0x85, 0xba, 0x11, 0x5a, 0x71, 0xe2, 0x0f, 0x91, 0x0f, 0xc7, 0xc4, 0x32, 0x1b, + 0x0e, 0xbf, 0x89, 0x97, 0xee, 0x5b, 0x70, 0xfc, 0x5d, 0x78, 0x0b, 0x81, 0xfd, 0xc6, 0xdf, 0x85, + 0xb7, 0x90, 0xb7, 0xde, 0xc2, 0xcb, 0x9d, 0xb5, 0xeb, 0xdb, 0x6e, 0xee, 0x52, 0xb2, 0x3d, 0x20, + 0x4a, 0x15, 0xd6, 0x6a, 0xba, 0xac, 0x51, 0x6a, 0xb9, 0xc1, 0x17, 0xf1, 0xb2, 0xd3, 0x76, 0x9b, + 0xbf, 0x26, 0xdc, 0x6c, 0x8d, 0x85, 0xa6, 0x47, 0x56, 0x2b, 0xdc, 0x60, 0xa9, 0x74, 0x66, 0xaf, + 0x8e, 0x58, 0x53, 0x65, 0x72, 0x7d, 0x4b, 0x75, 0x44, 0x1b, 0x29, 0x95, 0x1d, 0x62, 0xac, 0x68, + 0xf3, 0x64, 0xa3, 0x9d, 0xb7, 0xce, 0x0e, 0x0d, 0x33, 0xd9, 0x62, 0x60, 0x97, 0x1d, 0xa1, 0x69, + 0x30, 0xd7, 0x59, 0x83, 0x74, 0xba, 0x31, 0x45, 0xda, 0x1a, 0xb5, 0xc4, 0xe9, 0x95, 0x70, 0xa9, + 0x69, 0x1b, 0x9c, 0x76, 0x6a, 0x7e, 0x09, 0xbe, 0x8e, 0x53, 0xf8, 0x10, 0xc4, 0x1a, 0x29, 0x96, + 0x02, 0x25, 0x3a, 0x37, 0x21, 0xa4, 0x2d, 0xfa, 0x8a, 0x2f, 0x4a, 0xb7, 0x13, 0xbc, 0xf5, 0x2b, + 0xae, 0x21, 0xfb, 0x1e, 0xb9, 0xdf, 0x82, 0xd7, 0x44, 0x92, 0x2d, 0xa5, 0xdf, 0xba, 0x13, 0xd7, + 0xde, 0x82, 0x9e, 0xae, 0xfe, 0x96, 0x78, 0x2f, 0x25, 0xd5, 0x6a, 0xd1, 0x5b, 0x2b, 0xdd, 0xb4, + 0xfd, 0xc9, 0xd2, 0x4a, 0x5b, 0xf6, 0x4f, 0x7d, 0x8b, 0x6b, 0x37, 0x75, 0xc6, 0x31, 0x6a, 0x35, + 0x7b, 0xac, 0x32, 0x1d, 0xa9, 0xad, 0xd8, 0x64, 0xea, 0xb0, 0x51, 0xd4, 0x64, 0xf6, 0x08, 0x92, + 0xb8, 0x47, 0x4c, 0x9f, 0x0a, 0x88, 0x1a, 0xcc, 0x1d, 0x16, 0x50, 0x1c, 0xdb, 0xd3, 0xe9, 0x77, + 0xce, 0x54, 0x72, 0xd3, 0x34, 0x4f, 0xa7, 0x5b, 0x58, 0xc7, 0x34, 0x3d, 0x56, 0x9f, 0x5a, 0xd8, + 0xde, 0x06, 0x94, 0x32, 0x88, 0xe3, 0xb0, 0xc7, 0x6a, 0x59, 0x7b, 0x6e, 0x5e, 0xa6, 0xba, 0x5d, + 0x88, 0x06, 0x43, 0xc1, 0x4b, 0x4b, 0x78, 0xab, 0xdf, 0xa1, 0xc3, 0xe9, 0x4c, 0xb2, 0x12, 0xf2, + 0x66, 0xf1, 0x5f, 0x05, 0x2b, 0xe1, 0xf3, 0xf1, 0x0e, 0x52, 0x7d, 0x2b, 0xe0, 0x1d, 0x94, 0xdc, + 0x82, 0xcf, 0xc7, 0x2d, 0x48, 0x3f, 0x25, 0xd3, 0xa2, 0xc4, 0x0c, 0x80, 0x0a, 0x4b, 0x9c, 0x83, + 0x03, 0x50, 0x99, 0x3a, 0xff, 0x10, 0x95, 0xef, 0x0d, 0x7e, 0x5b, 0x2b, 0xa3, 0x21, 0xfd, 0x44, + 0x5b, 0x7e, 0xfe, 0xd6, 0x52, 0xc9, 0x38, 0x51, 0x35, 0x4c, 0x6d, 0x41, 0xf1, 0xf3, 0x04, 0x16, + 0x3a, 0xb5, 0xb9, 0xbd, 0xfc, 0x68, 0xe3, 0xf7, 0x96, 0x46, 0xfe, 0x4b, 0xfe, 0xa9, 0x98, 0xca, + 0x98, 0x48, 0xbd, 0xd4, 0x99, 0x06, 0x5b, 0x6b, 0x61, 0x91, 0x62, 0xaa, 0x45, 0xba, 0xb7, 0x79, + 0x81, 0x0c, 0xf2, 0xac, 0xd5, 0xda, 0x90, 0xcf, 0x8c, 0x93, 0xf9, 0xa3, 0x09, 0xe7, 0x7f, 0x92, + 0xc5, 0xcc, 0x86, 0xf2, 0x46, 0x1e, 0x2d, 0xbf, 0x3a, 0x1a, 0xc4, 0xa8, 0x86, 0x33, 0xb2, 0x76, + 0xda, 0xb6, 0xb7, 0xe9, 0xc4, 0x7d, 0x75, 0x0c, 0x1b, 0x6a, 0xef, 0x0d, 0xc3, 0xd7, 0xf7, 0xb2, + 0x99, 0xc9, 0x0e, 0x42, 0xfa, 0x1b, 0xe9, 0xe5, 0x74, 0x61, 0xb1, 0x95, 0x53, 0x96, 0xfd, 0xd5, + 0xef, 0xa4, 0x79, 0x68, 0x9b, 0x26, 0xb4, 0x34, 0x8f, 0x1a, 0xcd, 0xa9, 0xaa, 0xda, 0xd6, 0x34, + 0xb0, 0xc9, 0xd4, 0x1d, 0x62, 0x4e, 0x87, 0xfe, 0x2d, 0x76, 0xef, 0x1e, 0xba, 0x20, 0xf1, 0xf3, + 0xe3, 0xf1, 0xa1, 0x87, 0xfc, 0x6f, 0x92, 0x47, 0xe5, 0x75, 0xd3, 0x39, 0x82, 0x2a, 0x9d, 0xe6, + 0x64, 0xcd, 0x7f, 0x80, 0xb1, 0xb2, 0x37, 0x7a, 0xb7, 0xf3, 0x06, 0xd0, 0xdf, 0x2f, 0x1a, 0xc5, + 0xe2, 0x59, 0x9c, 0x4f, 0x0a, 0x9b, 0xa7, 0x2a, 0x6d, 0x99, 0x76, 0xe2, 0x0c, 0xba, 0xd0, 0xf4, + 0x8f, 0xcf, 0x13, 0x9b, 0xbe, 0x59, 0x92, 0x25, 0xf7, 0x8d, 0x09, 0x1f, 0x7a, 0x71, 0x1b, 0x7e, + 0x46, 0xa3, 0xb2, 0x56, 0xb0, 0x42, 0xf6, 0x2b, 0x66, 0x4f, 0x24, 0x50, 0x19, 0x2c, 0x09, 0x40, + 0x44, 0xfc, 0x52, 0x2e, 0xc3, 0xd4, 0xad, 0x1b, 0xe4, 0x3a, 0x26, 0x11, 0xb0, 0x1d, 0x3e, 0x57, + 0xdc, 0x71, 0xb2, 0x9c, 0x25, 0x1d, 0x08, 0x46, 0x2c, 0x57, 0x1b, 0x3a, 0xce, 0x0d, 0x29, 0x72, + 0x43, 0x47, 0x3a, 0x5c, 0xae, 0xdf, 0x78, 0x2a, 0x59, 0x06, 0x5b, 0x33, 0x22, 0xef, 0x6f, 0xc1, + 0x33, 0xc4, 0x8f, 0x94, 0x49, 0x16, 0xd4, 0xc9, 0x86, 0x9a, 0xea, 0xcb, 0x26, 0xd7, 0x9d, 0x1b, + 0xac, 0x9b, 0xe8, 0x86, 0xac, 0x97, 0x13, 0x63, 0x94, 0x08, 0xd0, 0xb9, 0xfb, 0x59, 0x26, 0x2b, + 0x99, 0x5b, 0x20, 0xc2, 0xc6, 0x23, 0x62, 0x29, 0xe0, 0x17, 0xd0, 0xe7, 0xeb, 0x61, 0x58, 0xfb, + 0x06, 0x3d, 0x38, 0xbd, 0x01, 0x7d, 0xf6, 0x5f, 0x22, 0xde, 0x25, 0x2a, 0x3d, 0x8c, 0x8a, 0x2b, + 0xe7, 0x93, 0x4c, 0x45, 0x6a, 0x4a, 0x53, 0xb5, 0x13, 0x11, 0x68, 0xa5, 0x10, 0x52, 0xf3, 0xe6, + 0x5e, 0xb7, 0x32, 0xb5, 0x73, 0x91, 0x64, 0xa5, 0x8c, 0x5b, 0x9f, 0x4e, 0x93, 0xf4, 0x86, 0xcc, + 0x27, 0x63, 0xad, 0x28, 0x97, 0x46, 0xa2, 0x43, 0x6e, 0x59, 0x88, 0x02, 0x56, 0x7a, 0x4c, 0x68, + 0x04, 0x5f, 0x50, 0xff, 0xd8, 0xc2, 0xfd, 0x9e, 0xa7, 0xc7, 0xb5, 0x19, 0xb5, 0x5a, 0x5c, 0x37, + 0x15, 0xba, 0x55, 0xb4, 0x3f, 0xb5, 0xd5, 0x9b, 0xa0, 0xec, 0x8d, 0xcd, 0x0a, 0x27, 0x84, 0x4c, + 0xe9, 0x2f, 0xe8, 0xd0, 0xdf, 0xcf, 0xa9, 0x11, 0x30, 0x5d, 0x96, 0xcc, 0x4b, 0x2a, 0xc1, 0x12, + 0x5d, 0x4d, 0x47, 0x79, 0x05, 0xb2, 0x3f, 0xd8, 0xb6, 0xd1, 0xef, 0x99, 0x64, 0xbe, 0xe9, 0xf1, + 0xfd, 0x1b, 0x2d, 0x3a, 0xb7, 0x1f, 0xb8, 0x24, 0x7a, 0xba, 0xa4, 0x1f, 0x38, 0x8d, 0x83, 0xb2, + 0x1d, 0xb9, 0x01, 0x3d, 0x1a, 0xd7, 0x0f, 0xbd, 0xc4, 0x41, 0xe9, 0xee, 0x63, 0xea, 0x20, 0x4a, + 0x72, 0x27, 0x94, 0x8c, 0xc5, 0x61, 0x22, 0xc4, 0xee, 0x8f, 0xe2, 0xf5, 0x4b, 0x99, 0x2c, 0x7a, + 0x7a, 0x24, 0x36, 0xe9, 0xb8, 0x64, 0xae, 0x73, 0xa4, 0xa0, 0xdf, 0xff, 0x15, 0x3f, 0x99, 0x76, + 0x72, 0x7b, 0x0e, 0xa4, 0x1d, 0xe6, 0xe3, 0xb2, 0xfd, 0x49, 0xa7, 0x6c, 0x69, 0x6f, 0xa0, 0x97, + 0x7d, 0xba, 0x8a, 0xcc, 0x25, 0x7d, 0xce, 0xcc, 0xed, 0x7c, 0x0b, 0x25, 0x15, 0x13, 0x3e, 0x29, + 0x53, 0x27, 0x9d, 0x74, 0x67, 0x6b, 0x84, 0x40, 0xff, 0x4a, 0xba, 0x96, 0xdb, 0x79, 0x38, 0x48, + 0x79, 0xa9, 0x0c, 0x3e, 0xa6, 0xb5, 0xa6, 0x78, 0x17, 0x28, 0xab, 0x34, 0x25, 0x9b, 0x5d, 0xdc, + 0x3a, 0x33, 0x8e, 0x75, 0xa6, 0x44, 0x54, 0x5e, 0x65, 0x8a, 0x7b, 0x26, 0x5c, 0x63, 0x8a, 0x37, + 0xa9, 0x72, 0x0a, 0x53, 0xb4, 0x1b, 0x97, 0xd1, 0x97, 0xda, 0x1d, 0xa8, 0x2a, 0x75, 0x29, 0xde, + 0xec, 0xa9, 0xd4, 0x96, 0x82, 0x1d, 0x9a, 0x42, 0x65, 0xa9, 0xde, 0xa5, 0x6a, 0xa0, 0x2b, 0x4e, + 0xad, 0x9a, 0x14, 0x6a, 0x48, 0x6a, 0xb8, 0xab, 0xb4, 0x64, 0x92, 0xd0, 0x12, 0x0e, 0x05, 0x71, + 0x3a, 0xd2, 0x8d, 0xd8, 0xca, 0x6a, 0xb5, 0xc2, 0xa9, 0x56, 0x88, 0x96, 0xba, 0xe0, 0x34, 0x52, + 0x83, 0x29, 0x87, 0x06, 0xb4, 0x9a, 0xfc, 0xc2, 0x0c, 0x7d, 0xf3, 0x85, 0x49, 0x71, 0x02, 0xbe, + 0x21, 0x96, 0x57, 0xe5, 0xd6, 0x1b, 0x2c, 0x73, 0xea, 0x93, 0xe5, 0xad, 0xd6, 0x3b, 0x75, 0x99, + 0xf0, 0x16, 0x0b, 0x9f, 0x8a, 0x14, 0x70, 0x93, 0x85, 0x42, 0xa4, 0xcf, 0xfa, 0xb4, 0x5f, 0xd6, + 0x05, 0x32, 0xe4, 0x2c, 0xa9, 0x4e, 0xea, 0xf9, 0x59, 0x75, 0x52, 0xed, 0x7f, 0x0f, 0xe8, 0x7b, + 0xfb, 0x83, 0x3f, 0x2b, 0xb3, 0xed, 0x07, 0xa3, 0xa7, 0x3a, 0x33, 0x6a, 0xd8, 0xec, 0xdf, 0xb9, + 0x9a, 0x1d, 0x77, 0xd3, 0xec, 0x6e, 0x5d, 0xbb, 0x93, 0xa7, 0x58, 0x7c, 0x7a, 0x61, 0x49, 0x04, + 0xec, 0xec, 0x8d, 0x94, 0x71, 0x12, 0x0f, 0xcb, 0x77, 0x0d, 0xc0, 0x41, 0x2a, 0xbc, 0xce, 0x15, + 0xf4, 0x99, 0x5f, 0xc0, 0x41, 0xef, 0xd3, 0xf9, 0xf9, 0x97, 0x73, 0xd0, 0xef, 0x95, 0x17, 0xf5, + 0x5f, 0xe7, 0x25, 0x45, 0xff, 0xfb, 0x9f, 0x41, 0x5c, 0x0c, 0xc3, 0xdb, 0xec, 0x19, 0x36, 0xd2, + 0xe6, 0xa4, 0x44, 0x4c, 0x69, 0x6e, 0xa9, 0xf7, 0x3f, 0xd3, 0xe9, 0xbb, 0xdd, 0x77, 0xbb, 0xbd, + 0x38, 0x77, 0x54, 0x7a, 0x54, 0x37, 0x78, 0xd7, 0x1e, 0x1c, 0x92, 0xa8, 0xee, 0xd6, 0x85, 0x4c, + 0x51, 0xcf, 0xd1, 0xf7, 0x05, 0x51, 0x45, 0xad, 0x37, 0xec, 0x7d, 0xb6, 0xe9, 0xb9, 0xd9, 0x0f, + 0xc7, 0xff, 0xf7, 0x09, 0x1c, 0x1e, 0x7d, 0xa6, 0x1d, 0x1c, 0xd2, 0xb7, 0x50, 0x40, 0x41, 0x2d, + 0x12, 0x7f, 0x13, 0xaf, 0x84, 0x2c, 0xc0, 0x32, 0x60, 0x20, 0x3a, 0xa5, 0x78, 0x6d, 0x5d, 0x5b, + 0x27, 0xa4, 0x2c, 0xb9, 0x47, 0xe3, 0x7a, 0xd7, 0xdf, 0x09, 0x02, 0xc4, 0x7d, 0xd1, 0xfc, 0xc3, + 0x94, 0x2c, 0x88, 0x8c, 0x47, 0xa0, 0x2d, 0x5c, 0x52, 0x18, 0xa8, 0xb1, 0x3c, 0xa5, 0x37, 0xcc, + 0x1f, 0xa8, 0xcd, 0x1d, 0x55, 0xae, 0x9c, 0xac, 0xf4, 0x5c, 0xa7, 0x31, 0xa2, 0x7c, 0xf2, 0xf8, + 0x66, 0xad, 0x57, 0x2a, 0x4b, 0x54, 0xca, 0x8f, 0xbe, 0x2e, 0x11, 0x67, 0x44, 0x32, 0xa9, 0xc8, + 0x60, 0x08, 0x3a, 0x4e, 0x6e, 0x10, 0x7b, 0x29, 0x3b, 0x5b, 0x49, 0x97, 0x0d, 0xa3, 0xa4, 0xd9, + 0x84, 0x76, 0xbb, 0x60, 0x79, 0xa5, 0x8a, 0x4c, 0xc6, 0xb0, 0x3c, 0x94, 0xe1, 0x13, 0x16, 0x25, + 0x53, 0x86, 0xa5, 0xb1, 0x13, 0x9f, 0xa0, 0x28, 0x37, 0x32, 0x04, 0xbf, 0x94, 0x05, 0x20, 0x7f, + 0x0b, 0xc7, 0x8b, 0x4b, 0x66, 0x41, 0x34, 0x39, 0x2c, 0x8c, 0x0e, 0x12, 0xd2, 0xc2, 0xfc, 0x43, + 0x81, 0xb8, 0xca, 0x04, 0xcc, 0xb0, 0x24, 0x18, 0xda, 0xe6, 0x19, 0xdf, 0x9a, 0x46, 0x4b, 0x32, + 0x33, 0x43, 0x8e, 0xd8, 0x6a, 0x00, 0x04, 0x7d, 0x9a, 0x8f, 0x50, 0x71, 0x67, 0x4b, 0x16, 0xe7, + 0x2f, 0xa2, 0x9f, 0x16, 0x9a, 0xd5, 0xf5, 0x93, 0xcc, 0xe7, 0x64, 0xfd, 0x7d, 0x2d, 0x4e, 0x7c, + 0x0d, 0x41, 0x3f, 0xcc, 0x9b, 0x55, 0x47, 0xb2, 0x34, 0xd9, 0xc8, 0x12, 0x64, 0xb1, 0xca, 0xa5, + 0x72, 0x29, 0xe0, 0x80, 0xeb, 0xe0, 0x67, 0x32, 0xa0, 0xa9, 0xf4, 0x44, 0xe3, 0x96, 0x9e, 0xa8, + 0x2c, 0x3e, 0x6e, 0xec, 0x88, 0x4a, 0xc2, 0xf1, 0xe6, 0x7e, 0xa8, 0x24, 0xac, 0x15, 0xe0, 0x86, + 0x0a, 0xc2, 0x4e, 0x21, 0x5e, 0xa8, 0x30, 0xc2, 0xde, 0xe6, 0x18, 0xda, 0xb6, 0x3e, 0xa8, 0x36, + 0x5e, 0x1f, 0xac, 0xee, 0x3a, 0xaa, 0xc2, 0xfa, 0x17, 0xe4, 0x39, 0x2a, 0xb3, 0x0f, 0xbc, 0x8e, + 0x43, 0x9c, 0x53, 0xa8, 0xcc, 0x58, 0x70, 0xf8, 0x04, 0x8e, 0x43, 0xa5, 0xd9, 0x3c, 0x47, 0xa5, + 0x5b, 0x98, 0xb4, 0x75, 0x0b, 0x02, 0x3c, 0x82, 0x23, 0x62, 0x51, 0xd2, 0x85, 0x1f, 0x98, 0x8a, + 0x77, 0x01, 0x4e, 0xde, 0xfa, 0x3b, 0x31, 0xfc, 0x6e, 0x6d, 0xde, 0x79, 0xf1, 0xe6, 0xee, 0x94, + 0x5a, 0xfa, 0xaf, 0xe0, 0x67, 0x12, 0x9b, 0x8e, 0x77, 0x07, 0x02, 0x8d, 0xb9, 0xbd, 0x1d, 0x4f, + 0x39, 0x51, 0xbd, 0xd2, 0x10, 0x32, 0x49, 0xa9, 0x61, 0x71, 0x5e, 0x6b, 0x50, 0x26, 0xa8, 0x38, + 0x2b, 0x35, 0x2c, 0x49, 0x6b, 0x0d, 0xea, 0xfb, 0x13, 0x66, 0xa4, 0x86, 0x55, 0x39, 0x2d, 0x0e, + 0x39, 0xf9, 0x64, 0xd4, 0xb0, 0x3e, 0xbd, 0xd5, 0x50, 0x2e, 0xcd, 0x47, 0x0d, 0xeb, 0xb2, 0x5b, + 0xb5, 0x32, 0xf3, 0x29, 0x97, 0x61, 0x9e, 0xbf, 0x92, 0x86, 0xb3, 0xfd, 0xca, 0xfc, 0xcb, 0x20, + 0x69, 0xa1, 0x35, 0xde, 0x2a, 0xb3, 0x97, 0x37, 0x2c, 0x8f, 0xef, 0x4b, 0xc5, 0x95, 0x26, 0xd5, + 0x86, 0x15, 0xc9, 0xb9, 0x01, 0x97, 0xf1, 0x7a, 0x44, 0x85, 0xb5, 0x05, 0x51, 0x69, 0xd2, 0xa4, + 0x9f, 0xe5, 0x08, 0x5e, 0xb7, 0x0e, 0x4e, 0x58, 0x90, 0xeb, 0x96, 0x2f, 0x3b, 0xf9, 0x4e, 0x26, + 0x99, 0x4c, 0x32, 0x46, 0xfb, 0x61, 0x5f, 0x63, 0xab, 0x09, 0x63, 0x7b, 0xdb, 0xf2, 0x0f, 0x63, + 0x68, 0xfd, 0xec, 0x4b, 0xe5, 0xd4, 0x40, 0x19, 0x93, 0x88, 0x62, 0xb2, 0xba, 0xe7, 0x0f, 0xd9, + 0x17, 0xbc, 0xa3, 0xb3, 0x13, 0x1c, 0xed, 0x07, 0x1e, 0xa1, 0x5d, 0x07, 0xa0, 0x5f, 0x39, 0xee, + 0x41, 0x71, 0x17, 0xb2, 0xbc, 0x27, 0x3a, 0x7b, 0x1f, 0x10, 0xe2, 0x85, 0xc7, 0xee, 0xc4, 0xd7, + 0x23, 0x72, 0x92, 0xf1, 0x5e, 0xe2, 0x70, 0x58, 0xc4, 0x70, 0x92, 0x3e, 0x41, 0x12, 0xb2, 0xa4, + 0xa4, 0xaf, 0x56, 0x30, 0x96, 0xa8, 0xfe, 0x48, 0x10, 0x2f, 0x94, 0x38, 0xb3, 0x13, 0xe4, 0x46, + 0xc8, 0x60, 0x1c, 0x86, 0xb7, 0xcf, 0x6c, 0x17, 0xd3, 0x63, 0x3c, 0x99, 0xc3, 0x5d, 0x51, 0x75, + 0x7a, 0xee, 0x26, 0x91, 0x57, 0x7b, 0x33, 0xa5, 0xff, 0xeb, 0xf1, 0x3f, 0xfa, 0x42, 0x2f, 0x7d, + 0xec, 0x51, 0xd1, 0x63, 0xa7, 0xe6, 0xb6, 0x90, 0x1b, 0xa6, 0xe4, 0xa1, 0x6b, 0x7b, 0x12, 0xcd, + 0xa4, 0x80, 0xbe, 0x6c, 0xe5, 0x8e, 0x46, 0xdf, 0x12, 0xa3, 0x03, 0xa1, 0x8e, 0x66, 0xe7, 0x29, + 0x5d, 0x2a, 0x52, 0xa4, 0xd2, 0x62, 0xa4, 0x63, 0x2c, 0xdf, 0x45, 0x7a, 0x71, 0x41, 0x1d, 0x57, + 0x8a, 0x65, 0xaf, 0x62, 0xd2, 0x63, 0xc6, 0x15, 0x16, 0x40, 0x7d, 0x86, 0x8b, 0x19, 0xfa, 0xea, + 0xa1, 0x7f, 0xa2, 0x19, 0xc4, 0xfa, 0x3d, 0x62, 0x6e, 0xc3, 0x2b, 0x22, 0x61, 0x21, 0xcb, 0xc8, + 0xa2, 0xd4, 0xeb, 0x4f, 0x64, 0x09, 0xb9, 0x53, 0xc4, 0xf3, 0x90, 0x60, 0xa9, 0xd2, 0x3d, 0xaa, + 0x42, 0x91, 0x3e, 0xf5, 0xd9, 0xd6, 0x5a, 0xac, 0x68, 0x27, 0xd0, 0xc3, 0x47, 0xcb, 0xf3, 0x07, + 0xe6, 0x99, 0xbc, 0xfe, 0x40, 0x99, 0x2f, 0x2f, 0x1f, 0x1d, 0xe2, 0xe0, 0x5d, 0x52, 0xf2, 0x80, + 0xc8, 0xef, 0x7d, 0xfb, 0x74, 0x71, 0xd8, 0x2b, 0x23, 0x93, 0x20, 0x1d, 0xcb, 0xf9, 0x9c, 0x2a, + 0xe2, 0x09, 0x52, 0x3e, 0x39, 0x70, 0xac, 0x85, 0x51, 0x1d, 0x53, 0x45, 0x7c, 0x7a, 0xca, 0x8b, + 0xce, 0x55, 0xd5, 0xd3, 0x53, 0xa5, 0xdb, 0xa9, 0xe0, 0x51, 0xe1, 0xa2, 0x97, 0x28, 0xea, 0xf8, + 0x98, 0x87, 0x62, 0xa3, 0xfc, 0x50, 0x58, 0x83, 0xce, 0x57, 0x9f, 0x69, 0xe5, 0xe6, 0xc7, 0x28, + 0x7a, 0x88, 0x09, 0x2f, 0x4f, 0x48, 0x6a, 0x16, 0xc2, 0x33, 0x6c, 0x6c, 0x1a, 0x1a, 0xad, 0x2d, + 0x1b, 0x3c, 0xf5, 0x8e, 0x58, 0x62, 0x31, 0xf2, 0xf4, 0xa9, 0x75, 0x5f, 0x13, 0x82, 0x94, 0xe4, + 0xc3, 0x5b, 0xc4, 0x67, 0xbb, 0x24, 0x0a, 0x82, 0xc6, 0xa1, 0xa9, 0x91, 0x55, 0x81, 0xfe, 0x70, + 0x13, 0x2e, 0x45, 0xc1, 0xb8, 0xc7, 0x49, 0xee, 0xd5, 0x94, 0xd2, 0x84, 0xb7, 0x03, 0xa3, 0xde, + 0x40, 0xe0, 0xaf, 0x22, 0x66, 0x26, 0x84, 0x8f, 0xd8, 0xa6, 0x68, 0x11, 0x52, 0xfd, 0x5a, 0x01, + 0xef, 0xdb, 0x20, 0xe5, 0xa3, 0xd9, 0x44, 0xeb, 0x9e, 0x4a, 0x3c, 0x19, 0xe8, 0xff, 0x14, 0x02, + 0x44, 0x95, 0x6a, 0xf0, 0x1b, 0x74, 0x45, 0x43, 0x11, 0xc6, 0x70, 0xb7, 0x14, 0x9f, 0x1a, 0x6d, + 0x77, 0xa0, 0x37, 0x8b, 0xc3, 0x65, 0x30, 0xec, 0xe2, 0x32, 0x10, 0xde, 0x15, 0xb9, 0x1c, 0xa8, + 0x43, 0xa9, 0x5a, 0x54, 0xe3, 0xa0, 0x62, 0x0b, 0xbb, 0x4e, 0xf4, 0x6f, 0xb7, 0x58, 0x75, 0x53, + 0x23, 0x1c, 0xc0, 0xef, 0x80, 0xb7, 0xe4, 0x05, 0xc2, 0x0b, 0xa7, 0xa0, 0x78, 0xa5, 0x6d, 0xd3, + 0x67, 0x28, 0xdc, 0x45, 0xad, 0xc1, 0xc1, 0xfa, 0x67, 0x69, 0xd8, 0xcb, 0xf6, 0x5a, 0xb3, 0x15, + 0x9f, 0xc3, 0xa7, 0x3b, 0xb4, 0x19, 0xfd, 0xc9, 0xf2, 0x83, 0x27, 0x8e, 0x96, 0x91, 0x8e, 0x41, + 0x57, 0xf3, 0xf7, 0x1f, 0xbd, 0xfd, 0xa0, 0xba, 0xf2, 0xe5, 0x0e, 0xfc, 0x3b, 0xfc, 0x7e, 0x08, + 0x2d, 0x35, 0xf1, 0x8b, 0x03, 0xa6, 0xad, 0x51, 0xc5, 0x4b, 0xe9, 0x13, 0x09, 0xc2, 0x16, 0x5e, + 0xe6, 0x1a, 0xe3, 0x8a, 0x3c, 0xb3, 0x0d, 0x5d, 0x7d, 0xdc, 0x07, 0x67, 0xb6, 0xb3, 0x70, 0x94, + 0x43, 0x7a, 0xe9, 0x8b, 0xf5, 0xc9, 0x53, 0xa1, 0x93, 0x38, 0xd9, 0x14, 0x32, 0xc0, 0xb2, 0x0e, + 0x82, 0x53, 0x38, 0xb3, 0x10, 0xd6, 0x55, 0x10, 0xd0, 0xee, 0x07, 0xbb, 0xc6, 0xf1, 0xf2, 0xf9, + 0x81, 0xfd, 0xc8, 0x7c, 0xf8, 0x17, 0x11, 0x7e, 0x0a, 0xf1, 0x5c, 0x21, 0x81, 0x76, 0xbf, 0xef, + 0x9f, 0x39, 0x57, 0xe6, 0xec, 0x45, 0x10, 0xf0, 0x0b, 0xf0, 0xbf, 0xd0, 0xdc, 0xc3, 0x64, 0x48, + 0x2a, 0x0d, 0x12, 0x87, 0x6e, 0x5c, 0xc6, 0x3d, 0x4c, 0x0c, 0x98, 0x74, 0x90, 0x6d, 0x1d, 0x5f, + 0xe9, 0x96, 0x66, 0x2f, 0x15, 0xfa, 0xae, 0xa7, 0x01, 0x1f, 0xa3, 0x92, 0x4b, 0xff, 0x15, 0x91, + 0x40, 0x32, 0xfb, 0x8b, 0x08, 0x9e, 0x24, 0xd6, 0x96, 0x05, 0x2c, 0xcd, 0x74, 0xcc, 0xfd, 0xf1, + 0x3e, 0x81, 0xe6, 0xad, 0x06, 0x4f, 0xe0, 0x6d, 0x62, 0x04, 0xfd, 0x58, 0x61, 0x15, 0x46, 0x24, + 0x1a, 0xa3, 0x92, 0x6e, 0x17, 0xb3, 0x28, 0x7f, 0x2b, 0x60, 0x51, 0xae, 0x3d, 0x9a, 0xbf, 0x74, + 0xa1, 0x43, 0x23, 0xf3, 0x40, 0xd0, 0x95, 0xed, 0x6a, 0x57, 0xe4, 0xd2, 0x56, 0xee, 0x5d, 0xa0, + 0x9c, 0x76, 0xf6, 0x2e, 0xe7, 0xba, 0x07, 0xc8, 0x3f, 0x33, 0x9b, 0x6e, 0xc6, 0x63, 0x1b, 0xe0, + 0x85, 0x6b, 0xb1, 0x8d, 0x7b, 0x16, 0x39, 0x03, 0xcf, 0xb0, 0x97, 0xc6, 0xa3, 0x02, 0x4e, 0xf4, + 0x69, 0x6e, 0x3f, 0x9f, 0x6e, 0xff, 0x9b, 0xf0, 0x0e, 0x81, 0x1e, 0xf8, 0x39, 0x2f, 0xd9, 0x5b, + 0xb8, 0x88, 0xd4, 0x80, 0x18, 0x58, 0x36, 0x9e, 0x53, 0xe9, 0xb4, 0x25, 0x5f, 0xf6, 0x12, 0x3e, + 0x2a, 0xd7, 0xd6, 0xfb, 0x29, 0x79, 0xd2, 0x60, 0xa8, 0xc9, 0x1c, 0x0e, 0xfd, 0x1d, 0x6f, 0x56, + 0xc0, 0x0b, 0x79, 0x8e, 0x68, 0x1b, 0x2c, 0xaf, 0xaa, 0x3e, 0xaa, 0x86, 0x7f, 0x8f, 0xe0, 0x03, + 0x76, 0x6d, 0xc3, 0x40, 0x6e, 0x32, 0x2a, 0x4b, 0xb8, 0xc7, 0xf7, 0xaa, 0x8a, 0x9c, 0x82, 0x37, + 0x3c, 0xb6, 0xb7, 0x2b, 0x30, 0x3f, 0xf8, 0xe1, 0x81, 0x30, 0x1d, 0x91, 0x01, 0xfd, 0xb8, 0xa2, + 0x89, 0x20, 0x7d, 0xb2, 0x40, 0xbf, 0xfb, 0xe3, 0xdd, 0x64, 0x56, 0xac, 0xd0, 0xa8, 0x6b, 0x42, + 0xf4, 0x50, 0xf2, 0x56, 0x51, 0x90, 0x1e, 0x34, 0xc3, 0x62, 0x09, 0x12, 0x98, 0x22, 0x12, 0xd3, + 0x68, 0x7d, 0x17, 0x79, 0x83, 0xe2, 0x38, 0x88, 0x1e, 0xf6, 0xb8, 0x60, 0xa1, 0x77, 0x70, 0xe4, + 0x23, 0xfa, 0xfd, 0x0b, 0x70, 0x8e, 0xbc, 0x85, 0x81, 0x41, 0x28, 0x84, 0xed, 0x24, 0x64, 0x17, + 0xfc, 0x95, 0x47, 0x2b, 0x48, 0xab, 0x8a, 0x9f, 0xa3, 0xa9, 0xae, 0x53, 0x70, 0xaa, 0x82, 0xe3, + 0x64, 0x45, 0xc1, 0xea, 0x22, 0x57, 0x23, 0xe4, 0xf9, 0xcf, 0xc5, 0x1e, 0xdd, 0x9c, 0xc6, 0x68, + 0xf1, 0x8a, 0x57, 0xc1, 0x31, 0x9c, 0xf8, 0xd7, 0x54, 0xfe, 0x1f, 0x5d, 0xdf, 0xbf, 0xf4, +}; diff --git a/hwconf/luna/qmlui_luna_v1.h b/hwconf/luna/m600/qmlui_luna_m600.h similarity index 62% rename from hwconf/luna/qmlui_luna_v1.h rename to hwconf/luna/m600/qmlui_luna_m600.h index 74ae05ad..5ab50985 100644 --- a/hwconf/luna/qmlui_luna_v1.h +++ b/hwconf/luna/m600/qmlui_luna_m600.h @@ -1,17 +1,17 @@ // This file is autogenerated by VESC Tool -#ifndef QMLUI_LUNA_V1_H_ -#define QMLUI_LUNA_V1_H_ +#ifndef QMLUI_LUNA_M600_H_ +#define QMLUI_LUNA_M600_H_ #include "datatypes.h" #include #include // Constants -#define DATA_QML_HW_SIZE 7270 +#define DATA_QML_HW_SIZE 6655 // Variables extern uint8_t data_qml_hw[]; -// QMLUI_LUNA_V1_H_ +// QMLUI_LUNA_M600_H_ #endif diff --git a/hwconf/luna/qmlui_luna_v1.c b/hwconf/luna/qmlui_luna_v1.c deleted file mode 100644 index f1660019..00000000 --- a/hwconf/luna/qmlui_luna_v1.c +++ /dev/null @@ -1,461 +0,0 @@ -// This file is autogenerated by VESC Tool - -#include "qmlui_luna_v1.h" - -uint8_t data_qml_hw[7270] = { - 0x00, 0x01, 0x92, 0x40, 0x78, 0xda, 0xed, 0x3d, 0xdb, 0x72, 0xdb, 0xb8, 0x92, 0xef, 0xfe, 0x0a, - 0x44, 0x5b, 0x9b, 0x23, 0x4d, 0x1c, 0x4a, 0xb6, 0x63, 0x67, 0x46, 0x67, 0x73, 0x52, 0xb1, 0x13, - 0x67, 0x5c, 0xe5, 0xcc, 0x78, 0x2c, 0x27, 0x79, 0x38, 0x39, 0xe5, 0xa2, 0x45, 0x48, 0x42, 0x85, - 0xb7, 0x01, 0x21, 0x5f, 0xce, 0xac, 0xab, 0xf6, 0x03, 0xf6, 0x2b, 0xf7, 0x4b, 0xb6, 0x01, 0x92, - 0x12, 0x49, 0xf1, 0x02, 0xde, 0x6c, 0xc9, 0x01, 0x33, 0x93, 0xd8, 0x24, 0xd0, 0x0d, 0x34, 0x1a, - 0xdd, 0x8d, 0x46, 0x37, 0x40, 0x2c, 0xd7, 0xa1, 0x0c, 0x7d, 0xc1, 0x86, 0x81, 0xa9, 0x76, 0x8d, - 0xbd, 0xb1, 0xf8, 0x8b, 0xd8, 0x0c, 0xd3, 0x89, 0x3e, 0xc6, 0x68, 0x47, 0x1b, 0xfc, 0x9d, 0xf8, - 0x85, 0x3a, 0x7f, 0xd2, 0xf1, 0xb0, 0x6f, 0x39, 0x57, 0xc4, 0xc4, 0x9d, 0xf0, 0xe5, 0x1f, 0xec, - 0x8f, 0x39, 0x19, 0x7f, 0x47, 0xbb, 0xda, 0xeb, 0xad, 0xf8, 0x2b, 0xed, 0xc8, 0xb1, 0x19, 0x75, - 0x4c, 0x0f, 0xbe, 0xed, 0x26, 0xbf, 0x9d, 0xea, 0x77, 0xce, 0x9c, 0x79, 0x00, 0x7e, 0x6f, 0xf9, - 0x49, 0x33, 0xf5, 0x2b, 0x4f, 0xf3, 0x30, 0x63, 0xc4, 0x9e, 0xf2, 0x6f, 0x03, 0xa4, 0x7b, 0xe8, - 0x8f, 0x51, 0xf0, 0x22, 0x2c, 0x98, 0xdb, 0xd8, 0xb4, 0x42, 0x57, 0x26, 0x9e, 0xeb, 0xf0, 0x2e, - 0xe3, 0xf3, 0xd8, 0xb1, 0x2c, 0xdd, 0x36, 0xbc, 0xec, 0xef, 0xf6, 0x84, 0x4c, 0x5d, 0x9d, 0xea, - 0x56, 0x66, 0x99, 0x39, 0x23, 0x26, 0x61, 0x77, 0xe2, 0xf3, 0xd6, 0x09, 0xc3, 0x16, 0xfa, 0x6b, - 0x0b, 0xc1, 0x43, 0x8c, 0x21, 0xb2, 0x74, 0x62, 0xf3, 0x57, 0xe2, 0x85, 0x6e, 0x8f, 0x67, 0x0e, - 0xf5, 0xb4, 0x09, 0x31, 0xcd, 0x21, 0x02, 0xa0, 0xd8, 0x66, 0xe2, 0x43, 0xbf, 0x1f, 0x7e, 0xb2, - 0x74, 0x3a, 0x25, 0xb6, 0x37, 0x44, 0x3b, 0x03, 0xff, 0xc3, 0x84, 0xdc, 0x22, 0x36, 0x23, 0xde, - 0x96, 0x28, 0xe8, 0x52, 0xc7, 0xc5, 0x14, 0x70, 0x1d, 0x9a, 0xf8, 0x33, 0xef, 0x96, 0x05, 0x3f, - 0x0c, 0xa1, 0x35, 0xde, 0xf8, 0x64, 0xc2, 0xfb, 0xfa, 0x1e, 0x5f, 0x93, 0x31, 0xee, 0xf6, 0xe2, - 0xa5, 0x8f, 0xc2, 0x5e, 0x5a, 0xe1, 0x4f, 0x8b, 0x3a, 0x21, 0x01, 0x92, 0x55, 0xae, 0x75, 0x8a, - 0x26, 0x37, 0x5f, 0x30, 0xf5, 0x88, 0x63, 0x0f, 0x97, 0x15, 0xb5, 0x29, 0x66, 0xc7, 0xe1, 0xfb, - 0x55, 0x3c, 0x9c, 0x5a, 0x67, 0x3e, 0xb5, 0xac, 0x4f, 0x63, 0xfe, 0xfb, 0x02, 0x93, 0x35, 0xf6, - 0x3f, 0xe7, 0x57, 0x7a, 0xe7, 0xba, 0xb1, 0x5a, 0xba, 0xff, 0x7b, 0x51, 0xb5, 0x13, 0x7b, 0xe2, - 0xc4, 0xea, 0x91, 0xe0, 0xc5, 0x6a, 0xc5, 0x2b, 0xc7, 0x31, 0x11, 0xf1, 0x7e, 0x75, 0x28, 0xf9, - 0x37, 0x70, 0xa9, 0x0e, 0x43, 0x71, 0x43, 0x0c, 0x36, 0x43, 0xff, 0x40, 0x33, 0x4c, 0xa6, 0x33, - 0xb6, 0x95, 0x52, 0xde, 0x1b, 0xcf, 0xb0, 0x31, 0x37, 0x31, 0x07, 0xf9, 0x95, 0x12, 0x06, 0x44, - 0x9f, 0xe8, 0xa6, 0x87, 0x53, 0x8a, 0xc2, 0x88, 0x61, 0xe3, 0x62, 0x46, 0x1d, 0xc6, 0xcc, 0x45, - 0xb1, 0x55, 0xe2, 0xfa, 0xc3, 0x7f, 0xa1, 0x5f, 0x1d, 0xea, 0x34, 0x64, 0x06, 0x8d, 0x89, 0x5f, - 0x17, 0x0c, 0x23, 0xfe, 0x02, 0xca, 0xbb, 0x8e, 0xcd, 0xbf, 0x3a, 0x36, 0xff, 0xd9, 0xc4, 0x0c, - 0x03, 0x67, 0xf9, 0x3c, 0x26, 0xc0, 0x46, 0x20, 0x69, 0xd7, 0xc4, 0x23, 0xc0, 0x07, 0xe8, 0x0d, - 0x62, 0x74, 0x8e, 0xd3, 0xcb, 0x60, 0x5b, 0x87, 0x22, 0x46, 0xb4, 0xcc, 0xfd, 0x56, 0x80, 0xcb, - 0x9c, 0x5b, 0xb6, 0x3f, 0x41, 0x23, 0x18, 0x52, 0x19, 0x77, 0xf1, 0xd5, 0x87, 0x1a, 0x29, 0x1e, - 0x32, 0xbf, 0xdf, 0x9b, 0xd8, 0x6b, 0xbf, 0xee, 0x30, 0xd6, 0x9e, 0x58, 0x81, 0x34, 0x54, 0x9c, - 0x12, 0xb1, 0x42, 0xe3, 0x39, 0xe5, 0xef, 0x4f, 0x6c, 0x03, 0xdf, 0x0e, 0x91, 0x77, 0x43, 0x5c, - 0xfc, 0x85, 0xe0, 0x1b, 0x2d, 0xfa, 0x3e, 0x56, 0xc1, 0xef, 0x91, 0x00, 0xfa, 0x95, 0x8f, 0xf5, - 0x30, 0x4e, 0x1d, 0xd1, 0x60, 0xa0, 0x2c, 0x19, 0x13, 0x16, 0x7c, 0x1f, 0xc4, 0x11, 0x9a, 0xc4, - 0x0d, 0xea, 0xc4, 0xbb, 0x13, 0x8e, 0x28, 0xc8, 0x21, 0x74, 0x35, 0x67, 0xcc, 0xe1, 0x73, 0x77, - 0xbf, 0xa8, 0x4c, 0x80, 0x63, 0x67, 0x30, 0x88, 0x83, 0xe3, 0xf4, 0x10, 0x05, 0x12, 0xc4, 0xe4, - 0x0f, 0xc3, 0xb7, 0x40, 0xb7, 0x3f, 0xbd, 0x0b, 0xda, 0xed, 0x00, 0x17, 0xda, 0x78, 0xcc, 0x3a, - 0xbd, 0x95, 0x52, 0x37, 0x3e, 0xe4, 0x4f, 0x3a, 0x9b, 0x81, 0x2c, 0xb9, 0xed, 0xfa, 0x43, 0xa0, - 0x45, 0xd0, 0x6e, 0xaf, 0xd4, 0x59, 0xc1, 0xe4, 0xd7, 0xf1, 0x27, 0x45, 0x1f, 0xc5, 0x40, 0x78, - 0x71, 0x94, 0xf7, 0x95, 0x9a, 0x7f, 0x4e, 0x0c, 0xbc, 0xa9, 0x6d, 0xbf, 0x98, 0xdb, 0x1b, 0xdb, - 0xf6, 0x43, 0xf2, 0x1d, 0xa3, 0xa3, 0xe3, 0x8f, 0x9b, 0xda, 0xfe, 0x63, 0x42, 0xad, 0x1b, 0x90, - 0x08, 0xeb, 0xd4, 0xfe, 0xfb, 0xe5, 0x0c, 0x1e, 0x85, 0x72, 0x28, 0x45, 0x14, 0x2e, 0x64, 0x54, - 0x8e, 0x1c, 0x0b, 0x10, 0xca, 0x08, 0xb1, 0x5f, 0x85, 0xa2, 0x4a, 0x91, 0x62, 0x19, 0x82, 0x4e, - 0x4a, 0x98, 0x9d, 0xe9, 0x53, 0x0c, 0x4d, 0x5f, 0xa1, 0xd3, 0x47, 0x4a, 0x8c, 0x15, 0x95, 0x90, - 0xec, 0xe0, 0x14, 0x0a, 0xa5, 0x7e, 0xcc, 0x34, 0x7a, 0x92, 0x4f, 0xea, 0xcb, 0xb1, 0x50, 0x48, - 0x20, 0x53, 0xa3, 0x0a, 0x1b, 0xbd, 0x45, 0xbb, 0x08, 0xc4, 0x67, 0x4e, 0x8d, 0x91, 0xab, 0x83, - 0x6d, 0x38, 0x4d, 0xca, 0xe2, 0xf0, 0xa1, 0xce, 0xcd, 0xa2, 0xc4, 0xce, 0x60, 0x2b, 0xb5, 0xcc, - 0x89, 0xe5, 0xd3, 0x23, 0x8b, 0x5d, 0x78, 0xaf, 0x09, 0x2f, 0x93, 0x59, 0x22, 0x18, 0x8c, 0x45, - 0x8b, 0xec, 0x12, 0xdd, 0x88, 0xd4, 0x77, 0x29, 0x9e, 0x60, 0xe0, 0x09, 0x23, 0x1c, 0xd1, 0x08, - 0x9f, 0x4a, 0xd7, 0x0d, 0x39, 0xa6, 0xeb, 0x39, 0x73, 0x3a, 0xc6, 0x23, 0xf2, 0x6f, 0xac, 0xf9, - 0xe6, 0x0e, 0xfa, 0x29, 0x1d, 0x51, 0xaf, 0x70, 0xc2, 0x24, 0x9f, 0x3e, 0x8a, 0x00, 0x97, 0x6a, - 0x9e, 0x6e, 0x92, 0xa9, 0x6d, 0x09, 0x8b, 0x00, 0x96, 0x00, 0xef, 0xf8, 0x6f, 0xbf, 0x1e, 0x61, - 0x6e, 0xd3, 0xa3, 0xff, 0x5e, 0xbc, 0x39, 0x04, 0x4b, 0xca, 0xb1, 0x32, 0x41, 0x35, 0x31, 0xf5, - 0x2b, 0x88, 0x80, 0xe8, 0xe3, 0x77, 0x7b, 0x28, 0x56, 0x49, 0x1d, 0xf4, 0x02, 0x7d, 0xf6, 0x57, - 0x04, 0xdc, 0x56, 0xbe, 0x98, 0x61, 0x0b, 0x9f, 0x41, 0xdb, 0xba, 0x3d, 0xf8, 0xd0, 0xe9, 0x9b, - 0xce, 0xd4, 0xd1, 0x5c, 0x7b, 0xda, 0x49, 0x05, 0x76, 0x9f, 0xce, 0x8a, 0x1f, 0xa9, 0x33, 0x77, - 0x0f, 0x9d, 0xdb, 0x02, 0x6e, 0xbc, 0x12, 0xf6, 0x29, 0xd0, 0xeb, 0x36, 0xb3, 0x18, 0x23, 0xc2, - 0x28, 0x0d, 0xf4, 0xc1, 0xe9, 0x07, 0x14, 0x98, 0x12, 0x60, 0xcc, 0x77, 0x7a, 0x45, 0xa3, 0x95, - 0x67, 0x3e, 0x15, 0xf0, 0xfd, 0xce, 0x56, 0x66, 0xe9, 0x42, 0xf1, 0x92, 0x94, 0x24, 0xcc, 0x71, - 0x3f, 0x89, 0x65, 0xd2, 0x10, 0xbd, 0xdc, 0x97, 0xaa, 0x71, 0x25, 0x38, 0xa8, 0x64, 0xa5, 0x74, - 0x63, 0x37, 0x55, 0xe4, 0x08, 0x81, 0xba, 0x5c, 0x0f, 0x64, 0x3d, 0x81, 0x6d, 0x5e, 0x40, 0xbd, - 0xa4, 0x7c, 0x7a, 0xb9, 0x33, 0xc8, 0xc7, 0x2e, 0x23, 0xf0, 0x22, 0x80, 0xbd, 0xa2, 0x32, 0x0b, - 0x99, 0x7b, 0x90, 0xdf, 0xed, 0x4c, 0x9d, 0x9d, 0xc6, 0x9b, 0xb0, 0xb2, 0xff, 0x4d, 0xb7, 0xb0, - 0x5f, 0xa7, 0x58, 0x15, 0x47, 0xb4, 0x3e, 0xaf, 0xd6, 0x29, 0x16, 0x46, 0x29, 0x4c, 0xb7, 0x2b, - 0x5b, 0x29, 0x29, 0x61, 0x77, 0x07, 0x03, 0xd9, 0xaa, 0xb2, 0x73, 0x22, 0x7c, 0x82, 0xb5, 0x97, - 0x98, 0xac, 0x30, 0x51, 0xa1, 0xbd, 0x73, 0x58, 0x16, 0xfc, 0x03, 0x0d, 0xb6, 0x0a, 0xab, 0xc2, - 0xf2, 0x0f, 0x56, 0x28, 0xdf, 0xe3, 0x8b, 0xbf, 0x5c, 0xba, 0x4f, 0x50, 0x17, 0xd0, 0xf0, 0xe5, - 0xa4, 0xa7, 0xc1, 0xc8, 0x1f, 0x71, 0x5c, 0x20, 0x87, 0x00, 0x5b, 0x4f, 0x12, 0x04, 0x7f, 0x00, - 0x04, 0x1f, 0x83, 0xf7, 0x44, 0x07, 0xe1, 0xa5, 0xc1, 0x62, 0x26, 0x5c, 0xf7, 0x17, 0x3d, 0xf7, - 0x08, 0xc3, 0x94, 0x28, 0x81, 0x29, 0x58, 0xbb, 0x63, 0x8b, 0xb0, 0x4f, 0xd8, 0xf3, 0x40, 0xb7, - 0xfa, 0x48, 0xbb, 0xa5, 0x55, 0x11, 0x7f, 0x3a, 0x23, 0xcc, 0x10, 0x97, 0x71, 0xbe, 0x53, 0x04, - 0x09, 0x46, 0xda, 0xae, 0x06, 0xea, 0x37, 0x07, 0x19, 0x3e, 0x14, 0x0f, 0x9b, 0x20, 0x2f, 0xb1, - 0xa1, 0x55, 0x04, 0x25, 0xc4, 0xc4, 0xb6, 0xff, 0x8f, 0x24, 0x19, 0xb7, 0xea, 0x95, 0xb8, 0x6f, - 0x68, 0x1a, 0xfb, 0x93, 0xb2, 0x73, 0xa6, 0x13, 0xda, 0x69, 0x6b, 0x7a, 0xd4, 0x9f, 0x90, 0x71, - 0x01, 0xd0, 0xfc, 0xa4, 0x72, 0xa1, 0xfb, 0x91, 0xa9, 0x10, 0x30, 0x68, 0x6f, 0x4d, 0xc6, 0x48, - 0x88, 0xda, 0xb1, 0x6e, 0x57, 0x90, 0xb3, 0x23, 0xa8, 0xb6, 0x39, 0x72, 0xb6, 0xf9, 0x81, 0x5d, - 0x92, 0x2d, 0xe2, 0x20, 0x2b, 0x56, 0xea, 0xe1, 0xc3, 0x3d, 0xb1, 0x9a, 0xc7, 0x74, 0xca, 0x38, - 0x21, 0xdb, 0x66, 0x88, 0x23, 0xc7, 0xba, 0x72, 0xf2, 0x2d, 0xc2, 0x84, 0x65, 0x98, 0x67, 0x15, - 0xe6, 0x8c, 0xed, 0x41, 0xcb, 0x33, 0x5d, 0x6a, 0x05, 0xf0, 0xc5, 0x7f, 0x53, 0xcc, 0xce, 0x54, - 0xb7, 0xbd, 0x89, 0x43, 0xad, 0xdf, 0x29, 0x11, 0xa6, 0x1e, 0x57, 0x7d, 0x5a, 0x50, 0x59, 0x6a, - 0x32, 0x9c, 0x3b, 0xdc, 0x3e, 0xeb, 0x7c, 0xc7, 0x77, 0xc5, 0x22, 0xce, 0x72, 0x0c, 0x0c, 0x16, - 0xe2, 0x29, 0xf1, 0xd8, 0x27, 0xfe, 0xa3, 0xac, 0x56, 0xf6, 0xc7, 0x43, 0x68, 0xe5, 0x35, 0x92, - 0x1a, 0x06, 0xf1, 0xc6, 0xfe, 0x5a, 0xa0, 0x82, 0xec, 0x78, 0xbf, 0xa8, 0x2c, 0x21, 0x41, 0x16, - 0x26, 0x90, 0xdc, 0xe4, 0x7a, 0x78, 0x1b, 0x2d, 0x65, 0x1a, 0xec, 0xb5, 0x20, 0x70, 0x02, 0x6b, - 0x67, 0x49, 0xf8, 0x33, 0x87, 0xb2, 0xb5, 0xd2, 0x24, 0xd5, 0x19, 0xe2, 0x48, 0x71, 0xc3, 0xe3, - 0x18, 0xeb, 0xb1, 0x21, 0xab, 0xa4, 0xc8, 0x22, 0xac, 0x19, 0x02, 0x33, 0x71, 0x35, 0x0b, 0x7c, - 0xd1, 0x9f, 0x29, 0x66, 0xd5, 0x20, 0x04, 0x50, 0xc4, 0x4a, 0x29, 0xe2, 0x17, 0xed, 0x69, 0xd7, - 0xba, 0x39, 0x7f, 0x30, 0xfb, 0xb9, 0xdc, 0x97, 0x7a, 0x4e, 0x1c, 0xb0, 0x26, 0x41, 0x75, 0x4d, - 0xa5, 0x9d, 0x38, 0xef, 0x75, 0xa6, 0xa3, 0x53, 0xbf, 0x52, 0x79, 0x17, 0x4e, 0x66, 0xf9, 0x7e, - 0x3f, 0xd5, 0x8b, 0x93, 0x5d, 0x7c, 0x74, 0x43, 0xd8, 0x78, 0x96, 0xd3, 0xb9, 0x7e, 0x3f, 0xd2, - 0x3d, 0xbf, 0x74, 0x4e, 0xd9, 0xa8, 0x30, 0xf9, 0x20, 0xb8, 0x38, 0xac, 0x9a, 0xd3, 0xc9, 0x7e, - 0x7f, 0xe9, 0xbe, 0x19, 0x0b, 0xad, 0x7f, 0x62, 0xe7, 0xfa, 0x9c, 0xfd, 0x4a, 0xd9, 0x03, 0x5c, - 0xd8, 0xa9, 0x70, 0xd4, 0x28, 0x83, 0x21, 0xf8, 0x60, 0x17, 0x19, 0x59, 0xc1, 0x12, 0x2a, 0xe8, - 0xd0, 0xf9, 0x05, 0x8a, 0x8d, 0x9e, 0x94, 0x5b, 0x4a, 0xba, 0x5f, 0x15, 0x45, 0x5e, 0xf9, 0x65, - 0x54, 0x29, 0x51, 0xc7, 0xc5, 0xdc, 0x78, 0x86, 0x79, 0xf1, 0x5e, 0x09, 0xc9, 0x18, 0x08, 0x24, - 0xbe, 0xe2, 0x3a, 0xe7, 0xa4, 0x3e, 0x26, 0x55, 0x64, 0x12, 0x0d, 0xab, 0x5e, 0xc0, 0x38, 0x68, - 0x7c, 0x30, 0x7a, 0x65, 0x64, 0x6b, 0xe8, 0xd6, 0x15, 0x56, 0xfe, 0x47, 0xdb, 0xf3, 0x8e, 0x1d, - 0x8a, 0xa7, 0x30, 0xad, 0x6d, 0x63, 0x84, 0x69, 0x24, 0xf0, 0xa2, 0x84, 0x88, 0xf5, 0x30, 0xfb, - 0xaa, 0x7f, 0xc7, 0xa7, 0xce, 0xf8, 0x7b, 0x97, 0x8f, 0x4d, 0x63, 0x22, 0xad, 0x8c, 0xef, 0x25, - 0x14, 0xf7, 0xa6, 0xe3, 0xe1, 0x25, 0x79, 0xe5, 0x9a, 0xb2, 0x24, 0x8a, 0xe3, 0x66, 0xd1, 0x44, - 0x7a, 0x98, 0x9f, 0x05, 0x2d, 0x99, 0x7b, 0x78, 0x41, 0x95, 0x52, 0x43, 0x94, 0x42, 0xd5, 0xf5, - 0xf1, 0xb4, 0x5c, 0x10, 0x0b, 0x53, 0x89, 0xce, 0x50, 0xec, 0x62, 0x9d, 0x49, 0x9a, 0x27, 0x74, - 0x6e, 0xdb, 0xc2, 0xf1, 0x2b, 0x55, 0x5a, 0xc4, 0x4b, 0x5d, 0xf3, 0x98, 0x97, 0xfd, 0x81, 0x94, - 0xcb, 0xf1, 0x02, 0x56, 0x52, 0x53, 0x4c, 0xcb, 0xd9, 0x31, 0x4b, 0x69, 0xa8, 0x05, 0x73, 0xbd, - 0xd4, 0x54, 0x7d, 0xfe, 0x1c, 0x85, 0x8c, 0x40, 0x3c, 0xc1, 0x8f, 0xbf, 0x0b, 0xa7, 0x63, 0xb5, - 0xb9, 0x5a, 0x93, 0x2d, 0x1b, 0x63, 0xcd, 0xfa, 0xec, 0x29, 0xc7, 0xa2, 0x12, 0x8c, 0x18, 0x93, - 0x87, 0xb1, 0x71, 0x02, 0x4b, 0x31, 0x8d, 0xf2, 0x0f, 0x6e, 0x41, 0xe5, 0xbf, 0xb9, 0x4f, 0xdd, - 0xb8, 0x5e, 0xb1, 0x1b, 0xf5, 0xf1, 0x77, 0x7f, 0xc8, 0x87, 0xe8, 0x1c, 0xcc, 0x58, 0xdd, 0x9e, - 0x9a, 0x59, 0x12, 0xd1, 0xe1, 0xdb, 0x27, 0xec, 0x6e, 0x88, 0x06, 0xda, 0x60, 0x4b, 0x82, 0x9a, - 0xe7, 0x8c, 0x6b, 0xee, 0x11, 0x66, 0x73, 0x37, 0x05, 0x62, 0xbf, 0xef, 0x7f, 0xff, 0x4a, 0xd8, - 0xec, 0x02, 0x5b, 0x2e, 0xa6, 0x3a, 0x9b, 0xd3, 0x2c, 0xdc, 0x52, 0x3b, 0xe4, 0xeb, 0x46, 0x80, - 0x8c, 0x48, 0xb1, 0xb4, 0x7e, 0x45, 0xf6, 0xeb, 0xf6, 0x73, 0x0b, 0xc6, 0xb7, 0xe9, 0x76, 0x80, - 0x8c, 0x26, 0xd6, 0xaf, 0x31, 0xf2, 0x5c, 0x1e, 0xe0, 0x39, 0x71, 0x28, 0x02, 0xcd, 0xcb, 0xe6, - 0xde, 0x95, 0x4e, 0xdf, 0xca, 0x53, 0x32, 0x3d, 0x4a, 0xa0, 0x60, 0xcb, 0xae, 0x78, 0xab, 0xce, - 0x5b, 0x6e, 0xb8, 0xa5, 0x7e, 0x4f, 0x8d, 0x8a, 0x4b, 0x9a, 0x8d, 0x2e, 0x75, 0xa0, 0xad, 0xd8, - 0x4b, 0x46, 0xc1, 0xc5, 0x9a, 0x1a, 0x0b, 0x12, 0x09, 0x6a, 0x8c, 0xd2, 0x63, 0xde, 0x32, 0x81, - 0xc4, 0x42, 0x0f, 0x4d, 0xdd, 0x63, 0x67, 0x3e, 0x9c, 0x00, 0xaa, 0x1c, 0x90, 0x92, 0xd6, 0x64, - 0x6e, 0x44, 0xdd, 0xea, 0x60, 0xe4, 0xaf, 0x47, 0xd2, 0x23, 0xed, 0xf6, 0xca, 0x94, 0xcf, 0x8a, - 0xba, 0x4b, 0x8e, 0x9a, 0x8c, 0x87, 0x24, 0xe6, 0x38, 0x67, 0x14, 0x63, 0xf6, 0xcd, 0x36, 0xf1, - 0x54, 0x37, 0x0b, 0x3c, 0x1e, 0xc9, 0x60, 0x05, 0x59, 0xb9, 0x1f, 0x61, 0x94, 0x4a, 0x91, 0x0d, - 0xd1, 0xfa, 0x61, 0x74, 0xc3, 0x2a, 0xcc, 0x9c, 0x10, 0x87, 0xfb, 0x46, 0x49, 0x76, 0x41, 0x75, - 0xa2, 0x48, 0x25, 0x45, 0xaa, 0x6f, 0x36, 0xff, 0x73, 0x3a, 0x37, 0xc8, 0x18, 0x44, 0xb9, 0xf7, - 0x54, 0x89, 0x86, 0xfa, 0x3f, 0xc1, 0x5f, 0xef, 0x6c, 0x62, 0xe9, 0x0c, 0x1b, 0x45, 0xb1, 0x57, - 0x51, 0x19, 0xaa, 0x07, 0x75, 0x0a, 0x0b, 0x47, 0xf4, 0xd1, 0x32, 0xe0, 0xda, 0x71, 0xcb, 0xd4, - 0x0b, 0x75, 0xd3, 0x40, 0xba, 0x92, 0x89, 0x27, 0x8b, 0x70, 0x67, 0xf1, 0x8b, 0x74, 0x4d, 0xea, - 0x07, 0x6c, 0x05, 0x55, 0xc5, 0x6f, 0x85, 0x75, 0x67, 0x41, 0x94, 0xd7, 0x41, 0x71, 0x03, 0xb9, - 0x14, 0xe7, 0xdb, 0x16, 0xc3, 0x38, 0xd1, 0xb5, 0x33, 0x8a, 0x3d, 0xb0, 0x90, 0xf1, 0x3b, 0xcf, - 0x05, 0x93, 0xe1, 0x98, 0x14, 0x23, 0x8d, 0x46, 0x3f, 0x0d, 0xfb, 0x50, 0xbd, 0x0f, 0xfa, 0x85, - 0x3a, 0xb6, 0x3e, 0x67, 0x97, 0xae, 0x03, 0xf2, 0x17, 0xd4, 0xe4, 0xa5, 0xe1, 0xdc, 0xd8, 0xda, - 0x94, 0x4c, 0xf2, 0x9d, 0x1c, 0xf7, 0x3f, 0xf5, 0x9b, 0x71, 0xb6, 0x65, 0xc5, 0x62, 0x66, 0x28, - 0xe0, 0x51, 0x6a, 0x78, 0x66, 0xa1, 0x16, 0xf6, 0x72, 0xe3, 0x35, 0x33, 0x54, 0x67, 0x66, 0xec, - 0x66, 0x1d, 0x77, 0x5d, 0x54, 0x85, 0xe6, 0xb9, 0xc7, 0x7c, 0x5d, 0x85, 0x4e, 0xb9, 0xaa, 0xca, - 0x2c, 0x27, 0xcc, 0xc9, 0xcc, 0xaf, 0x7f, 0x15, 0x6c, 0x4c, 0x16, 0xda, 0x85, 0x95, 0x6c, 0xc4, - 0x56, 0xec, 0xc5, 0x6a, 0xb6, 0x63, 0x19, 0x3b, 0xb2, 0x9c, 0x4d, 0x59, 0xc6, 0xbe, 0x8c, 0x71, - 0x3b, 0xa8, 0x06, 0xd3, 0x2c, 0x60, 0xf7, 0x38, 0x27, 0x48, 0x87, 0xe5, 0xe6, 0x70, 0x9a, 0xe4, - 0x7e, 0x04, 0x03, 0xd0, 0x01, 0x13, 0x07, 0xc2, 0x2c, 0x3f, 0x36, 0x54, 0x66, 0xde, 0x48, 0x55, - 0x2e, 0xc9, 0x8b, 0xb5, 0x78, 0xb2, 0x80, 0x37, 0x4b, 0xd7, 0x2f, 0xc7, 0x86, 0x55, 0xd8, 0xb1, - 0x1a, 0x5b, 0x56, 0x61, 0xcf, 0xf0, 0x89, 0xe4, 0xc6, 0xc9, 0x3e, 0x5c, 0x64, 0xf1, 0xd9, 0x4c, - 0x4b, 0xd5, 0xaa, 0xb8, 0xd3, 0x57, 0x47, 0x60, 0x57, 0xf4, 0xc0, 0x48, 0x6e, 0x0c, 0x65, 0xa9, - 0x2f, 0x4f, 0x88, 0xf3, 0x0b, 0x87, 0xfe, 0x39, 0x97, 0x0a, 0xf0, 0x48, 0xec, 0xb1, 0x44, 0xf7, - 0x91, 0xc2, 0x8c, 0x35, 0xe4, 0x43, 0xeb, 0xf4, 0x9a, 0xa0, 0x78, 0x29, 0x18, 0xe7, 0xce, 0x4d, - 0xe9, 0xb9, 0x1a, 0xe1, 0x93, 0x5a, 0xd3, 0x76, 0x55, 0x30, 0x56, 0x9d, 0xc0, 0xcd, 0x4c, 0xe4, - 0x3a, 0x13, 0xba, 0xde, 0xc4, 0x4e, 0x99, 0xe0, 0x65, 0xab, 0xf2, 0xdd, 0x95, 0x0a, 0x63, 0x18, - 0xd9, 0x20, 0x0b, 0x99, 0xf1, 0x9b, 0xfd, 0xce, 0x72, 0xbd, 0x4e, 0x25, 0x50, 0x63, 0xc7, 0x74, - 0x28, 0xc0, 0xba, 0x99, 0x11, 0x86, 0xab, 0x81, 0x98, 0x2d, 0x72, 0x35, 0xde, 0x2d, 0xc3, 0x94, - 0xc4, 0xde, 0x51, 0x34, 0x50, 0xa9, 0x12, 0xe8, 0x60, 0xc2, 0x58, 0x04, 0x8c, 0xef, 0xb9, 0x15, - 0x71, 0x4d, 0x94, 0x05, 0x74, 0x5f, 0xba, 0xc6, 0xc8, 0x24, 0x86, 0xd4, 0x3e, 0x84, 0x8c, 0xd4, - 0xf1, 0x81, 0x55, 0x02, 0xe5, 0x31, 0xec, 0xf2, 0x54, 0x11, 0x91, 0x82, 0x53, 0x05, 0xc0, 0x84, - 0x3a, 0x16, 0x0f, 0xfd, 0xa8, 0x54, 0x59, 0x04, 0x10, 0x0c, 0xd1, 0xab, 0x6a, 0xb5, 0x99, 0x03, - 0xad, 0x3e, 0x18, 0x80, 0xbc, 0x80, 0x55, 0x36, 0x72, 0x67, 0xba, 0x87, 0x91, 0x0e, 0xac, 0x5a, - 0x87, 0x17, 0x6a, 0x09, 0xcf, 0xc5, 0xdc, 0x73, 0x1c, 0xf3, 0x82, 0xb8, 0x15, 0x47, 0x57, 0x2c, - 0xe5, 0x83, 0x14, 0xdd, 0xd5, 0x51, 0xd6, 0x66, 0xba, 0x6d, 0x98, 0xb8, 0x32, 0xe4, 0x85, 0x40, - 0x4a, 0x01, 0xed, 0xc2, 0xba, 0xd1, 0x2b, 0xb9, 0x4f, 0xb4, 0x2a, 0x38, 0x52, 0x00, 0x8b, 0x71, - 0x06, 0xa5, 0x70, 0xcc, 0xd3, 0xb2, 0xab, 0x07, 0xa1, 0x2c, 0x9f, 0x9d, 0x5e, 0x25, 0x20, 0xf7, - 0x2d, 0xcf, 0xec, 0xfb, 0xb5, 0x34, 0x4d, 0xce, 0x74, 0xaf, 0xac, 0x5d, 0xf2, 0xd8, 0xa6, 0x84, - 0x52, 0xdc, 0x35, 0x14, 0xf7, 0xd9, 0xbb, 0x91, 0xd2, 0xd9, 0xeb, 0xab, 0xb3, 0x61, 0x3a, 0x36, - 0xa3, 0xb0, 0x6b, 0xe8, 0xeb, 0x5a, 0xea, 0x7a, 0xb7, 0xba, 0xba, 0x6e, 0x57, 0x37, 0xec, 0xf4, - 0xc0, 0x16, 0xf8, 0x4f, 0xe4, 0x4c, 0x9e, 0xb2, 0x31, 0xb0, 0x60, 0x9f, 0x86, 0x2d, 0x81, 0x25, - 0xdc, 0x26, 0xcd, 0x80, 0x25, 0x54, 0x65, 0x03, 0x3c, 0xaa, 0x0d, 0xe0, 0xdc, 0x60, 0xaa, 0xac, - 0x80, 0x1f, 0xc9, 0x0a, 0xe0, 0x23, 0xae, 0x2c, 0x80, 0xb5, 0xb4, 0x00, 0xf8, 0xd0, 0x34, 0x62, - 0x03, 0xec, 0xee, 0x0f, 0x1e, 0xcb, 0x0a, 0x78, 0xbd, 0x5f, 0xdd, 0x0c, 0x80, 0xba, 0x7c, 0xd9, - 0x3e, 0x76, 0xe6, 0xa6, 0x81, 0xae, 0x30, 0x9a, 0xbb, 0x06, 0xdf, 0xfc, 0x14, 0xcd, 0x42, 0x57, - 0x3a, 0x63, 0xe1, 0x56, 0x1f, 0x32, 0x89, 0x45, 0x18, 0x7a, 0x81, 0xf8, 0x0a, 0xff, 0xda, 0x31, - 0x59, 0xde, 0x51, 0x1f, 0x1b, 0xab, 0xd1, 0x97, 0xec, 0xd0, 0xb4, 0x4e, 0x8f, 0x40, 0x6e, 0x54, - 0xab, 0x47, 0xe0, 0x2a, 0xbd, 0xfe, 0x98, 0x7a, 0xfd, 0xdc, 0xb5, 0x94, 0x56, 0xff, 0x81, 0xb4, - 0xfa, 0xf9, 0xd9, 0x27, 0xa5, 0xd3, 0xd7, 0x51, 0xa7, 0xc3, 0x44, 0x5c, 0x03, 0x8d, 0xbe, 0x3f, - 0xa8, 0xa5, 0xd3, 0xf7, 0x06, 0x83, 0xea, 0x4a, 0xfd, 0xa0, 0x2a, 0xf2, 0x75, 0xd6, 0xcd, 0x8b, - 0x61, 0x6d, 0x58, 0x33, 0x2f, 0xe1, 0x36, 0xa9, 0x97, 0x97, 0x50, 0x95, 0x56, 0x7e, 0x4c, 0xad, - 0x1c, 0x6e, 0x9d, 0x9e, 0x63, 0xcf, 0x75, 0x6c, 0x0f, 0x2b, 0x15, 0xfd, 0x03, 0xa9, 0xe8, 0xe5, - 0xbe, 0x79, 0x38, 0xfc, 0x4a, 0x63, 0xaf, 0xa3, 0xc6, 0x4e, 0x4e, 0xd2, 0x46, 0xd4, 0xf7, 0x40, - 0xab, 0xe3, 0x96, 0xdf, 0xab, 0xa3, 0xbc, 0x07, 0xda, 0x2f, 0x95, 0x75, 0xf7, 0x40, 0xdb, 0x7b, - 0x7a, 0xbb, 0xe6, 0xa9, 0xe3, 0xdb, 0xf4, 0xfe, 0x79, 0x3a, 0x92, 0x46, 0x77, 0xd2, 0xd3, 0x51, - 0x28, 0x0d, 0xbf, 0x0e, 0x1a, 0xfe, 0xc3, 0xad, 0xeb, 0x28, 0xed, 0xfe, 0x43, 0x6a, 0xf7, 0x53, - 0x62, 0x63, 0x9d, 0x12, 0x76, 0xa7, 0xd4, 0xfb, 0x3a, 0xab, 0x77, 0x3e, 0x43, 0x37, 0x7b, 0xbf, - 0xfd, 0x97, 0x1a, 0xe1, 0x71, 0x4f, 0x70, 0x49, 0xbe, 0x3a, 0xb0, 0x2d, 0xe9, 0xf4, 0x08, 0x82, - 0x36, 0xf4, 0x79, 0x04, 0xbc, 0xd2, 0xe5, 0xd5, 0x4b, 0xd6, 0x56, 0xe5, 0xc7, 0xd1, 0xbb, 0x62, - 0x1a, 0xd2, 0xe5, 0x8f, 0xaa, 0xca, 0x95, 0x26, 0x97, 0xd2, 0xe4, 0x62, 0xdc, 0x91, 0x8a, 0x72, - 0x6f, 0x51, 0x3a, 0x1c, 0xf1, 0x03, 0x4d, 0xca, 0xcf, 0xcd, 0x82, 0x39, 0x2a, 0xa0, 0x5e, 0x95, - 0x9c, 0xa8, 0x8b, 0xb1, 0xf2, 0xcf, 0x58, 0xa9, 0xca, 0xef, 0x0d, 0xcd, 0xf9, 0xc7, 0x17, 0x9d, - 0xb5, 0x8f, 0x59, 0xca, 0xfa, 0xb0, 0x55, 0x61, 0x79, 0xd6, 0xef, 0x23, 0x71, 0x1a, 0x41, 0x7e, - 0x36, 0xac, 0x4a, 0x7a, 0xad, 0x28, 0xb4, 0x55, 0xd2, 0xab, 0x4a, 0x7a, 0x6d, 0xd9, 0x2b, 0xa0, - 0x92, 0x5e, 0x9b, 0x52, 0x0d, 0x9b, 0x91, 0xf4, 0xca, 0xb8, 0xb8, 0x56, 0x39, 0xaf, 0x2a, 0xe7, - 0xf5, 0xa9, 0x7a, 0xf7, 0xd4, 0x6a, 0x60, 0xfd, 0x1c, 0x7b, 0x11, 0xa1, 0xb3, 0xe9, 0x29, 0xaf, - 0x3b, 0x03, 0x95, 0xf3, 0x9a, 0xe1, 0xe5, 0x5b, 0x19, 0xe5, 0xc6, 0xdc, 0x7b, 0xab, 0x90, 0x9b, - 0xf1, 0xeb, 0xad, 0xc2, 0x55, 0x0e, 0xbd, 0x47, 0x34, 0x4b, 0x54, 0xbe, 0xab, 0xca, 0x77, 0x55, - 0xfa, 0x7a, 0x5d, 0xf4, 0xf5, 0xe6, 0xa7, 0xbb, 0xee, 0x57, 0xd6, 0xd4, 0xad, 0x2a, 0x86, 0x27, - 0x9e, 0xed, 0x1a, 0x67, 0x9e, 0x66, 0x6d, 0x80, 0xa6, 0x73, 0x5d, 0x13, 0x40, 0x95, 0xf6, 0x7f, - 0x4c, 0xed, 0xaf, 0x32, 0x5d, 0x55, 0xa6, 0xab, 0xd2, 0xfd, 0xeb, 0xa1, 0xfb, 0x9f, 0x42, 0xa2, - 0xeb, 0xee, 0xfe, 0x40, 0x65, 0xba, 0x36, 0xa3, 0xcd, 0x5b, 0x48, 0x74, 0x5d, 0x01, 0xdc, 0xa4, - 0x46, 0x57, 0x69, 0xae, 0xeb, 0xa1, 0xd3, 0x55, 0x96, 0xab, 0xca, 0x72, 0x55, 0xfa, 0xfc, 0xf1, - 0xf5, 0xf9, 0x93, 0x48, 0x72, 0xdd, 0x57, 0x49, 0xae, 0x71, 0xb5, 0xdc, 0x7c, 0x8e, 0x6b, 0x02, - 0x6c, 0x83, 0x2a, 0x59, 0x65, 0xb8, 0xae, 0x85, 0x42, 0x56, 0x09, 0xae, 0x3f, 0xb0, 0x76, 0x56, - 0x09, 0xae, 0x1b, 0xa1, 0xac, 0x9f, 0x5e, 0x7e, 0xeb, 0x2b, 0x95, 0xdf, 0x1a, 0xd9, 0x21, 0x6f, - 0x37, 0xbd, 0x35, 0x0f, 0x47, 0x93, 0xbb, 0xe6, 0x2a, 0xb9, 0x75, 0x6d, 0x95, 0xbb, 0xca, 0x6d, - 0x55, 0xb9, 0xad, 0x4a, 0xb3, 0xaf, 0xb1, 0x66, 0x57, 0xa9, 0xad, 0x4f, 0x53, 0xa5, 0xb7, 0x90, - 0xd9, 0x9a, 0x05, 0xbf, 0x05, 0x55, 0xae, 0xf2, 0x5a, 0x1b, 0x29, 0x59, 0x57, 0x8b, 0xab, 0xb4, - 0x56, 0x95, 0xd6, 0xaa, 0x02, 0xd9, 0x5b, 0x11, 0x0e, 0x0d, 0xa4, 0xb5, 0xae, 0x4e, 0x51, 0x95, - 0xd5, 0x9a, 0x5f, 0x52, 0xb6, 0x60, 0x63, 0xd9, 0xaf, 0xf9, 0x26, 0xc1, 0x7d, 0xc5, 0x3c, 0xd7, - 0xc5, 0x25, 0xd2, 0x1b, 0x9a, 0xeb, 0xaa, 0xd2, 0x59, 0xe3, 0x03, 0xaa, 0xd2, 0x59, 0x9b, 0x65, - 0xbb, 0xba, 0xec, 0xd7, 0x8c, 0x23, 0x40, 0xa5, 0xb3, 0x36, 0xa5, 0x13, 0x36, 0x24, 0x9d, 0x55, - 0x65, 0xb2, 0xaa, 0x4c, 0xd6, 0x27, 0xea, 0xcb, 0x53, 0x0b, 0x80, 0x35, 0x74, 0xe3, 0x3d, 0x8d, - 0x24, 0xd6, 0x03, 0x95, 0xc4, 0x9a, 0xe5, 0xcf, 0x6b, 0x25, 0x7f, 0xb5, 0x85, 0xd4, 0x55, 0x95, - 0xb5, 0xfa, 0xf8, 0xd6, 0x87, 0xab, 0x12, 0x56, 0x55, 0xc2, 0xaa, 0x52, 0xcb, 0x8f, 0xaf, 0x96, - 0xdd, 0x4d, 0xcf, 0x55, 0xdd, 0xab, 0x91, 0xab, 0xaa, 0xd2, 0x54, 0xab, 0x28, 0x7a, 0xb7, 0xf1, - 0x0c, 0x55, 0xb7, 0xe1, 0xe4, 0x54, 0x57, 0xe5, 0xa5, 0x3e, 0xb6, 0x7e, 0x57, 0x29, 0xa9, 0x2a, - 0x25, 0x55, 0x69, 0xf7, 0x47, 0xd7, 0xee, 0x4f, 0xe4, 0xda, 0x55, 0x95, 0x8d, 0x5a, 0x5b, 0x69, - 0xb7, 0x90, 0x88, 0xea, 0x36, 0x9e, 0x83, 0xea, 0xaa, 0xf4, 0xd3, 0x47, 0x57, 0xdd, 0x54, 0x65, - 0x9e, 0xaa, 0xcc, 0x53, 0xa5, 0xb6, 0x1f, 0x53, 0x6d, 0xd3, 0xa7, 0x90, 0x74, 0x7a, 0xb0, 0xaf, - 0x92, 0x4e, 0x43, 0xed, 0x4b, 0x1b, 0xcf, 0x37, 0xa5, 0x0d, 0xa7, 0x9a, 0x52, 0x95, 0x65, 0xfa, - 0xc8, 0x7a, 0x97, 0xa9, 0x04, 0x53, 0xa4, 0xf6, 0xae, 0x55, 0x82, 0xe9, 0x9a, 0xea, 0x64, 0xf6, - 0xe4, 0x72, 0x4b, 0xf7, 0x54, 0x6e, 0xa9, 0xbf, 0x71, 0xdd, 0x72, 0x5a, 0x69, 0xab, 0x19, 0xa5, - 0x2a, 0x99, 0x74, 0x1d, 0x75, 0xb8, 0xca, 0x23, 0x55, 0x79, 0xa4, 0x4a, 0x81, 0xaf, 0xa7, 0x02, - 0x57, 0x29, 0xa4, 0x4f, 0x4e, 0x73, 0xb7, 0x91, 0x3d, 0xda, 0x5a, 0xe2, 0xa8, 0xca, 0x19, 0x6d, - 0xb2, 0x64, 0x0d, 0x65, 0x3d, 0x51, 0xe9, 0xa2, 0x2a, 0x5d, 0x54, 0x45, 0x8b, 0xb7, 0x21, 0x17, - 0x1a, 0x48, 0x17, 0x9d, 0xa8, 0x4c, 0xd1, 0x35, 0xce, 0x14, 0xad, 0xf6, 0x35, 0xfd, 0x4b, 0xfa, - 0x5b, 0x19, 0xe9, 0x28, 0x42, 0x1c, 0xa8, 0x03, 0xc3, 0x82, 0x3d, 0x28, 0xbf, 0x55, 0x47, 0xd0, - 0xc9, 0x09, 0x34, 0x99, 0xdc, 0xb5, 0xc3, 0x39, 0x63, 0x8e, 0x5d, 0xc0, 0xfa, 0xe1, 0xe6, 0x1b, - 0xd6, 0x8d, 0x6f, 0xf6, 0x08, 0x33, 0x06, 0x50, 0x0b, 0xa4, 0x50, 0xc0, 0x84, 0x63, 0x91, 0x9a, - 0x38, 0x72, 0x75, 0x7b, 0x88, 0x76, 0x65, 0x2a, 0x80, 0xdd, 0x32, 0xc1, 0x94, 0x62, 0x23, 0x60, - 0xdd, 0xdd, 0x02, 0x11, 0x90, 0xac, 0x16, 0x26, 0xb1, 0xfd, 0x2c, 0x55, 0xad, 0xcc, 0x1c, 0x71, - 0xec, 0x23, 0x93, 0xf8, 0x73, 0xb3, 0x58, 0x50, 0xb0, 0xb9, 0x8d, 0xbf, 0xc2, 0xc2, 0x0a, 0x87, - 0xd4, 0xf2, 0xe9, 0xac, 0x61, 0x5b, 0x87, 0x71, 0x33, 0xd0, 0x1b, 0xb9, 0x39, 0x79, 0x45, 0xbe, - 0xcb, 0x80, 0x29, 0x84, 0x63, 0x1d, 0x39, 0x96, 0x05, 0xc6, 0xa6, 0xa7, 0x4d, 0x31, 0xfb, 0x34, - 0x1e, 0x3b, 0xf6, 0xa4, 0xdb, 0x2b, 0x57, 0xeb, 0x9d, 0xeb, 0x1e, 0xf9, 0xd5, 0x0a, 0xeb, 0xf5, - 0xfb, 0xbe, 0x18, 0x13, 0x37, 0xed, 0xea, 0xc8, 0xd2, 0xd9, 0x78, 0x86, 0x88, 0xed, 0x07, 0x4c, - 0x80, 0x35, 0x60, 0x04, 0xa1, 0xa6, 0x61, 0x30, 0x0b, 0x73, 0x90, 0x87, 0x4d, 0x3c, 0x86, 0x9f, - 0x66, 0x38, 0x9c, 0x23, 0xc5, 0x69, 0xc6, 0x3a, 0x45, 0x73, 0x0f, 0x9f, 0x58, 0x2e, 0xa6, 0x44, - 0x37, 0x81, 0x16, 0x5f, 0xb0, 0x37, 0x3e, 0x99, 0x68, 0x91, 0x97, 0x9f, 0x6d, 0xc2, 0x3c, 0x89, - 0x9e, 0x72, 0x58, 0xc4, 0x72, 0x8f, 0x75, 0x68, 0xc3, 0x9b, 0x18, 0xd4, 0xb7, 0x68, 0xef, 0x17, - 0x6d, 0xef, 0xf5, 0x60, 0x07, 0x09, 0x75, 0x34, 0xd0, 0x06, 0x5b, 0x52, 0xd0, 0xfc, 0xbe, 0xbe, - 0x41, 0xd6, 0xa7, 0x31, 0x27, 0x1b, 0xa7, 0xe0, 0x99, 0x4e, 0x75, 0xeb, 0xbd, 0x33, 0x87, 0x91, - 0xeb, 0x76, 0xcc, 0xcb, 0x1b, 0x9d, 0xb1, 0x4b, 0x4b, 0xbf, 0xed, 0xc8, 0x35, 0xcf, 0x8f, 0xff, - 0xcd, 0x85, 0x18, 0xd0, 0xd3, 0x07, 0x5a, 0x46, 0x90, 0x72, 0xf8, 0xd4, 0xb5, 0x72, 0x81, 0x03, - 0xd0, 0x4b, 0x0c, 0x85, 0x00, 0x72, 0x1f, 0xbd, 0xd2, 0x78, 0x9c, 0x52, 0xf7, 0x15, 0x74, 0xd3, - 0x84, 0x11, 0xd3, 0x09, 0xf5, 0xe4, 0x7a, 0xe1, 0xea, 0x1e, 0xc7, 0x12, 0x30, 0xd3, 0x0a, 0x1a, - 0xdd, 0x75, 0x2f, 0xa1, 0xc8, 0x25, 0x67, 0x50, 0x2d, 0xec, 0x8e, 0x37, 0xd6, 0x4d, 0xe0, 0x7d, - 0x40, 0xfc, 0x53, 0x40, 0x05, 0x39, 0x82, 0x25, 0xbc, 0x8d, 0x45, 0x78, 0x75, 0x63, 0xec, 0xe3, - 0x85, 0xf7, 0xee, 0x25, 0x23, 0x16, 0xbe, 0x74, 0x1d, 0x4f, 0x76, 0x74, 0x22, 0x0b, 0x25, 0x40, - 0xb4, 0xc3, 0x19, 0x05, 0xbd, 0x44, 0x5d, 0x39, 0x8c, 0x61, 0xed, 0x4b, 0x7c, 0xeb, 0x76, 0x7a, - 0xbc, 0x9f, 0x2f, 0x77, 0x39, 0xa7, 0xc9, 0x60, 0xe6, 0x61, 0x61, 0x47, 0x40, 0xa9, 0xdc, 0xc1, - 0x23, 0x76, 0x9c, 0x39, 0xe4, 0x21, 0x63, 0xd3, 0xf4, 0x52, 0x40, 0x9f, 0xd8, 0xac, 0xdb, 0xf1, - 0xc8, 0x25, 0x2f, 0x83, 0xe9, 0xdd, 0xe5, 0x98, 0x97, 0x8b, 0x31, 0x5d, 0x35, 0x95, 0x1e, 0xe2, - 0xfd, 0xfd, 0x1a, 0xd3, 0x20, 0xae, 0xad, 0x90, 0x2b, 0xaf, 0x89, 0x5d, 0xa2, 0x47, 0x9f, 0x6d, - 0x63, 0x01, 0x7a, 0xc4, 0x74, 0xca, 0x72, 0xe1, 0x2f, 0xfa, 0x37, 0x07, 0x3e, 0xe4, 0xa5, 0x2b, - 0x62, 0xfa, 0x60, 0x1b, 0xd2, 0x78, 0xb0, 0x6d, 0x48, 0x62, 0xb9, 0x99, 0x61, 0x6c, 0xbe, 0x27, - 0xba, 0x85, 0x59, 0xae, 0xb0, 0x81, 0x81, 0x12, 0x45, 0x2f, 0x8d, 0xa0, 0xac, 0x98, 0x4b, 0x81, - 0xc0, 0x2b, 0x96, 0x67, 0x64, 0x82, 0xba, 0xdd, 0x40, 0xa0, 0xbd, 0x41, 0x1e, 0xa3, 0x18, 0xe0, - 0x27, 0x83, 0xdf, 0x7a, 0xe8, 0xf9, 0x73, 0xd4, 0x0d, 0xa5, 0x54, 0x58, 0x6c, 0xf5, 0x72, 0x2d, - 0x60, 0x6f, 0x39, 0x3b, 0x3b, 0xb4, 0x95, 0x0e, 0x75, 0xaa, 0x79, 0x58, 0xf0, 0x38, 0xf0, 0xef, - 0x09, 0x10, 0xf5, 0xb6, 0x3b, 0xe8, 0xc9, 0x79, 0x73, 0xb2, 0x1a, 0xc1, 0x15, 0xa7, 0x9c, 0x24, - 0x59, 0x42, 0x59, 0xe9, 0x31, 0x00, 0xf1, 0x89, 0x52, 0xf3, 0x29, 0xd1, 0x86, 0xc4, 0xf1, 0xda, - 0xd0, 0x02, 0x90, 0xc8, 0x65, 0xfa, 0x10, 0xcf, 0x35, 0xe0, 0x3d, 0xd0, 0xbd, 0x32, 0x94, 0xcc, - 0xd9, 0xc1, 0xe1, 0x34, 0x4d, 0x7c, 0xae, 0x00, 0x39, 0xe9, 0x69, 0x8a, 0x40, 0xe5, 0x9f, 0x6a, - 0x5a, 0xfb, 0xab, 0xdc, 0x9c, 0x7e, 0x91, 0x48, 0x92, 0x99, 0x33, 0x2e, 0x8a, 0x6b, 0x84, 0x97, - 0x77, 0x24, 0x79, 0x39, 0xa3, 0x0d, 0xe5, 0x58, 0x39, 0xbd, 0xbb, 0x0f, 0xca, 0xc9, 0x69, 0xe7, - 0xc4, 0x97, 0x60, 0xe4, 0xb4, 0xbb, 0xdc, 0x4a, 0xf0, 0x71, 0xe1, 0xa9, 0xb6, 0x55, 0xd9, 0x38, - 0xf7, 0x8c, 0xbd, 0xb6, 0xb9, 0xd8, 0x2d, 0x64, 0xe0, 0x76, 0x78, 0x77, 0x57, 0xce, 0x77, 0xcb, - 0x6a, 0x72, 0xad, 0xdb, 0x12, 0xc3, 0x4a, 0x21, 0xa7, 0x95, 0x59, 0xd5, 0xad, 0xce, 0xa5, 0x6d, - 0x30, 0x68, 0x53, 0xbc, 0x29, 0x43, 0xb8, 0xd0, 0x2a, 0x3d, 0x74, 0x6e, 0x35, 0x8a, 0x75, 0xf3, - 0x4b, 0x80, 0xa9, 0x41, 0x13, 0x75, 0x61, 0x9e, 0x16, 0xe1, 0xc8, 0xb0, 0x55, 0xa5, 0x10, 0x44, - 0xec, 0x50, 0xf9, 0xae, 0xc8, 0x1b, 0xa5, 0xa9, 0x06, 0xa9, 0x3c, 0xa2, 0x2a, 0xd6, 0x69, 0x8a, - 0x65, 0x5a, 0x0d, 0xa1, 0x9c, 0x99, 0x1a, 0x33, 0x51, 0x65, 0x11, 0xe5, 0xdb, 0xab, 0x4d, 0xba, - 0xf3, 0xa4, 0x5d, 0x60, 0x62, 0x53, 0x36, 0xdd, 0xa9, 0x53, 0x59, 0xc2, 0x04, 0x6e, 0x35, 0x01, - 0x52, 0xd6, 0xaf, 0x16, 0x78, 0x7e, 0x64, 0xfc, 0xc3, 0x3f, 0xb8, 0x0b, 0x6e, 0x7d, 0xfd, 0x43, - 0x64, 0xd2, 0x8d, 0x2a, 0xd5, 0x71, 0x44, 0xa3, 0x72, 0x5d, 0x3d, 0x90, 0xd5, 0xcc, 0xe1, 0xf4, - 0xf1, 0xd3, 0xc4, 0x72, 0x9c, 0x41, 0xdb, 0xd9, 0xab, 0xb1, 0xfa, 0x88, 0x16, 0x7e, 0xac, 0xed, - 0xcc, 0xa5, 0x61, 0x7d, 0x24, 0x0b, 0xef, 0xd3, 0x76, 0xc6, 0x4a, 0xe8, 0x27, 0xee, 0x93, 0x92, - 0x44, 0x14, 0xfa, 0x64, 0x52, 0x30, 0xe5, 0x3a, 0xa0, 0xb6, 0x33, 0x56, 0x51, 0xfd, 0xba, 0xe4, - 0x2d, 0x68, 0x50, 0x86, 0x67, 0x6a, 0x5b, 0x62, 0x51, 0xd6, 0x43, 0x0d, 0x3d, 0xcd, 0x76, 0x24, - 0xe6, 0xf0, 0xda, 0x46, 0xdd, 0xd0, 0x5f, 0x96, 0xbf, 0x16, 0xe4, 0x9e, 0x47, 0xe1, 0x18, 0x93, - 0x23, 0x6b, 0x6c, 0x53, 0x0e, 0x85, 0x1e, 0x89, 0xd4, 0x43, 0x5d, 0xb5, 0x60, 0xdb, 0xad, 0x11, - 0xc3, 0x3c, 0x77, 0x72, 0xef, 0xb4, 0x30, 0xb9, 0xb3, 0x56, 0xa7, 0x8d, 0xce, 0xed, 0x8c, 0x85, - 0x72, 0xa3, 0x53, 0x3b, 0x75, 0x69, 0xf8, 0x30, 0x33, 0x3b, 0x75, 0x59, 0xd9, 0xaf, 0x49, 0xda, - 0xaa, 0xf3, 0xba, 0x70, 0x91, 0xba, 0x61, 0xd3, 0x3a, 0x77, 0x6d, 0x5c, 0x73, 0x56, 0x67, 0x9f, - 0xd4, 0xfc, 0x70, 0x93, 0x7a, 0xb7, 0x8d, 0x49, 0xdd, 0xf2, 0x7c, 0x76, 0xdb, 0x9d, 0xca, 0xf4, - 0x51, 0x66, 0xb1, 0xbb, 0x3a, 0x81, 0x1f, 0x7c, 0xee, 0x3e, 0xa1, 0x69, 0xdb, 0xce, 0x8c, 0x9d, - 0xb4, 0x3c, 0x59, 0x73, 0x59, 0x34, 0xe1, 0x66, 0xd8, 0x4e, 0xf7, 0x54, 0xf4, 0xaa, 0x20, 0x49, - 0xf7, 0x33, 0x6c, 0x67, 0x38, 0x2a, 0x7a, 0xf5, 0x06, 0xb8, 0x70, 0x1e, 0x72, 0x07, 0xc4, 0x76, - 0x9e, 0x0b, 0xa3, 0x57, 0x0f, 0xc7, 0xaa, 0xef, 0x61, 0xbb, 0xd8, 0x9b, 0xd1, 0x20, 0x4e, 0xee, - 0x7e, 0xd8, 0x2e, 0x72, 0x66, 0xd4, 0xc2, 0xb7, 0xea, 0x85, 0xd8, 0xce, 0xf1, 0x66, 0xf4, 0xc3, - 0x05, 0x62, 0x31, 0x4e, 0x0f, 0x78, 0xdd, 0x98, 0x03, 0xef, 0x03, 0x62, 0xb1, 0xf8, 0x97, 0x0d, - 0x07, 0xa9, 0x1f, 0xac, 0x14, 0x7f, 0x93, 0xc8, 0x33, 0xc9, 0x38, 0xd9, 0xfe, 0x4a, 0x1f, 0x7f, - 0x9f, 0x52, 0x67, 0x6e, 0xc3, 0xb2, 0xfb, 0x1c, 0x8f, 0x99, 0x6e, 0x4f, 0xcd, 0xac, 0x13, 0xf0, - 0x1d, 0x1e, 0x72, 0xc4, 0xee, 0x78, 0xd6, 0xd5, 0x20, 0x05, 0xf9, 0xca, 0x2b, 0x89, 0xa3, 0xcb, - 0xa5, 0x4f, 0x3d, 0xce, 0x38, 0xd7, 0x18, 0xf5, 0xfb, 0x26, 0xd6, 0xaf, 0xb1, 0x08, 0x87, 0xc2, - 0x22, 0x26, 0x05, 0xf8, 0x95, 0xcd, 0xbd, 0x2b, 0x9d, 0xbe, 0xcd, 0x05, 0x54, 0x9c, 0x5c, 0x22, - 0x75, 0x20, 0x7d, 0xc9, 0x43, 0xe8, 0x25, 0x0e, 0x9e, 0xaf, 0x70, 0xd8, 0x7c, 0xd9, 0x73, 0xbe, - 0xfb, 0xfd, 0x2b, 0x3e, 0xe2, 0xde, 0x21, 0x9e, 0xe9, 0xd7, 0x84, 0x07, 0x8e, 0x8e, 0x60, 0x00, - 0xde, 0xc1, 0x74, 0xe6, 0x6f, 0x33, 0xab, 0x7d, 0xa4, 0xc4, 0x90, 0x8a, 0x13, 0xe6, 0xfe, 0xb4, - 0x29, 0x14, 0xce, 0xf7, 0x48, 0x95, 0x8e, 0x1c, 0xf6, 0x9d, 0x5d, 0x9e, 0x3f, 0xec, 0xc4, 0xfb, - 0x75, 0x11, 0xb0, 0x8a, 0xde, 0x22, 0xe1, 0xa2, 0x91, 0xa8, 0x3d, 0x92, 0x8b, 0xf7, 0xa5, 0xce, - 0xcd, 0xa2, 0xe4, 0x4e, 0x81, 0xd7, 0xa7, 0x44, 0xe0, 0x37, 0x27, 0x0c, 0x17, 0x6b, 0x23, 0x11, - 0x11, 0xe5, 0x48, 0x9d, 0x4b, 0x16, 0x3b, 0xe6, 0xfc, 0xd0, 0x17, 0x92, 0xe8, 0x8c, 0x62, 0x0f, - 0x33, 0x19, 0x47, 0x77, 0xc5, 0x80, 0xd1, 0x14, 0xff, 0xe2, 0x4e, 0xb1, 0xf3, 0xab, 0x6c, 0x20, - 0x79, 0xe5, 0xe0, 0xf1, 0x45, 0xf4, 0xe3, 0x9e, 0xdc, 0xfe, 0xaa, 0x94, 0x1b, 0x38, 0x39, 0x52, - 0x37, 0x8e, 0x39, 0xf1, 0x2b, 0x4a, 0x57, 0x0b, 0xbd, 0xbe, 0x50, 0xf3, 0x9b, 0xbd, 0xbf, 0xfb, - 0x45, 0x3e, 0x14, 0xbb, 0xb4, 0x43, 0xb7, 0x01, 0xe7, 0xae, 0x8c, 0xa3, 0xf7, 0x75, 0x69, 0x10, - 0x95, 0x53, 0x73, 0x4a, 0x79, 0x80, 0x65, 0x36, 0xa4, 0x5e, 0xcb, 0xc4, 0x59, 0x49, 0x6d, 0x3b, - 0xed, 0xbc, 0x2a, 0x0d, 0x27, 0x67, 0x77, 0xe9, 0xa0, 0x4a, 0xbb, 0x0a, 0xb7, 0x92, 0x5e, 0xbd, - 0xd2, 0x76, 0x6b, 0x41, 0x4d, 0xd9, 0x2d, 0x7a, 0x55, 0x36, 0xc1, 0xba, 0xdf, 0xaf, 0x16, 0x8e, - 0x9a, 0x03, 0x63, 0x19, 0x9c, 0x2a, 0x0b, 0xe0, 0x5e, 0x32, 0xba, 0xbc, 0x1d, 0xd1, 0x11, 0xc8, - 0x80, 0xf7, 0x84, 0x62, 0xa4, 0x04, 0x41, 0x85, 0x24, 0x85, 0xc6, 0xe5, 0xc0, 0xce, 0x60, 0xbf, - 0x39, 0x41, 0xd0, 0xf8, 0x52, 0x5e, 0x09, 0x8d, 0x8d, 0x12, 0x1a, 0x6d, 0xca, 0x0c, 0xe1, 0x82, - 0x0f, 0x84, 0xc6, 0x6b, 0x25, 0x34, 0x1e, 0x55, 0x68, 0x1c, 0x34, 0x66, 0x3c, 0xec, 0x0e, 0x9a, - 0x97, 0x06, 0x3f, 0x1f, 0xb4, 0x21, 0x0d, 0x0e, 0xf6, 0x4a, 0x1e, 0x03, 0x23, 0x21, 0x0d, 0xf6, - 0x5f, 0x6b, 0x07, 0x3f, 0xae, 0x34, 0x28, 0x4a, 0x50, 0x6b, 0x7a, 0x65, 0x19, 0x44, 0xf0, 0xc9, - 0x2c, 0x2c, 0xfb, 0xfd, 0xd4, 0xb5, 0xa5, 0x5a, 0x53, 0x0e, 0xe4, 0x0c, 0xc3, 0x92, 0xf9, 0xbf, - 0x81, 0x88, 0x0f, 0x06, 0xe8, 0x9b, 0xfd, 0x49, 0xbf, 0x95, 0x97, 0xef, 0x15, 0xf3, 0x7b, 0x1b, - 0xce, 0xe9, 0xad, 0x95, 0xc7, 0x2b, 0x69, 0x6e, 0xfb, 0x0e, 0xda, 0x91, 0x4b, 0xec, 0x72, 0x59, - 0xbb, 0xd1, 0x09, 0x50, 0x26, 0x85, 0xbe, 0xa6, 0xda, 0x31, 0xf0, 0x98, 0x58, 0xba, 0xe9, 0x95, - 0xd1, 0xb7, 0x0b, 0xe9, 0x38, 0x2c, 0x69, 0x99, 0xf2, 0x8a, 0xc7, 0xfe, 0xa9, 0x1d, 0x25, 0x6b, - 0x5d, 0x38, 0x65, 0x71, 0x71, 0x55, 0x4e, 0x6e, 0x81, 0xe5, 0x4e, 0xe0, 0x7f, 0xf9, 0x1b, 0x15, - 0xe7, 0x13, 0xbf, 0x16, 0x7a, 0xd7, 0x79, 0xe4, 0x14, 0xdf, 0x8a, 0x02, 0xf4, 0x67, 0x19, 0xe6, - 0x69, 0x52, 0x00, 0xae, 0xa3, 0xfc, 0x6b, 0x51, 0xfc, 0x89, 0x7d, 0xb3, 0x1f, 0x4b, 0xee, 0x3d, - 0x88, 0xd8, 0x0b, 0x0c, 0xcf, 0x87, 0x97, 0x7b, 0x83, 0x4a, 0x72, 0xef, 0x55, 0x25, 0xb1, 0xb7, - 0xb3, 0x57, 0x41, 0xee, 0xed, 0x96, 0x11, 0x96, 0x0b, 0x01, 0xe6, 0x6d, 0xa8, 0xfc, 0x52, 0xe2, - 0xab, 0x55, 0xf3, 0x2d, 0xb2, 0x24, 0x53, 0xd6, 0x5b, 0xf3, 0x62, 0x2c, 0xbe, 0xe2, 0xdd, 0x10, - 0x23, 0xee, 0x60, 0xf0, 0x60, 0x36, 0x5c, 0xa9, 0x65, 0xff, 0xc2, 0x84, 0xfb, 0x52, 0xcd, 0x84, - 0xfb, 0xb2, 0xa1, 0x22, 0x70, 0x57, 0xc9, 0xc0, 0x56, 0x65, 0x60, 0xd4, 0xe1, 0xf3, 0xcd, 0x3e, - 0x9a, 0x33, 0x67, 0x32, 0x41, 0xc2, 0x9f, 0xa4, 0x44, 0x62, 0xf3, 0x22, 0x31, 0xcd, 0x69, 0xb7, - 0x21, 0x82, 0xb1, 0xd4, 0xe6, 0x82, 0x12, 0x8c, 0xad, 0x0b, 0xc6, 0x3d, 0x25, 0x18, 0x1f, 0x5e, - 0x30, 0x7e, 0xb0, 0x0d, 0x25, 0x16, 0xdb, 0x15, 0x8b, 0xfe, 0xae, 0xc3, 0xa6, 0x08, 0xc5, 0x32, - 0xbb, 0xa3, 0x4a, 0x28, 0x96, 0x64, 0xaf, 0x0a, 0x52, 0xf1, 0x55, 0xe9, 0x28, 0xbc, 0x91, 0x8b, - 0xb1, 0xe1, 0x3c, 0xf0, 0x46, 0xc9, 0x0f, 0x26, 0x4b, 0xbf, 0xf2, 0x68, 0xec, 0x6f, 0x76, 0x18, - 0x8f, 0xad, 0x44, 0x68, 0xb3, 0x22, 0x34, 0x19, 0xec, 0xfe, 0xf0, 0xc2, 0x33, 0x2b, 0x61, 0xbb, - 0xe2, 0xa9, 0xd3, 0x3d, 0xf4, 0x16, 0xed, 0xa2, 0x8a, 0xee, 0xc8, 0x86, 0xdb, 0xe2, 0x37, 0x06, - 0x84, 0x2f, 0xb4, 0xe7, 0xe0, 0x01, 0xbd, 0x03, 0x3b, 0xfb, 0x83, 0x41, 0x15, 0x89, 0xff, 0x7f, - 0xff, 0xfb, 0x3f, 0x55, 0x64, 0x7e, 0xa3, 0x54, 0xe3, 0x24, 0xeb, 0x10, 0x90, 0x49, 0x1d, 0x20, - 0x5a, 0xc7, 0xb2, 0xd6, 0xc1, 0xc4, 0x6e, 0x5a, 0xd3, 0xec, 0x97, 0xd6, 0x34, 0x9f, 0x88, 0x37, - 0x56, 0x7a, 0xa6, 0x4d, 0x3d, 0xf3, 0x1e, 0x4f, 0xf4, 0xb9, 0xc9, 0xbe, 0xd9, 0x7e, 0xec, 0xd5, - 0x29, 0xbe, 0xc6, 0xa6, 0x52, 0x36, 0xcd, 0xdb, 0xeb, 0x7c, 0x5f, 0x7e, 0x7f, 0x83, 0x36, 0xa8, - 0x1e, 0x4c, 0x68, 0xff, 0xa2, 0x0d, 0x36, 0xd3, 0x9b, 0x70, 0x50, 0x42, 0x9a, 0x75, 0xde, 0xeb, - 0x4c, 0x47, 0xa7, 0xce, 0x74, 0xca, 0x73, 0x79, 0x7f, 0xf4, 0x00, 0xa3, 0xfd, 0x76, 0x23, 0xcf, - 0x8f, 0x66, 0x8e, 0xe3, 0x61, 0x4e, 0x6d, 0x6e, 0x3f, 0x53, 0x91, 0x69, 0x74, 0xa7, 0x69, 0x5a, - 0xa7, 0x89, 0x70, 0xce, 0xba, 0x51, 0xa5, 0x3b, 0xbb, 0x83, 0xf6, 0x63, 0x3a, 0xf9, 0x01, 0x7a, - 0x9f, 0x19, 0x31, 0x09, 0xbb, 0xd3, 0x28, 0xfe, 0x73, 0x8e, 0x3d, 0x76, 0x4c, 0x4c, 0x7c, 0x86, - 0xa9, 0x45, 0x3c, 0x8f, 0x38, 0x76, 0xf5, 0xbb, 0x4d, 0xa4, 0x8f, 0xd6, 0x8b, 0x3e, 0xa6, 0x33, - 0x15, 0xf8, 0x79, 0x67, 0x68, 0xd9, 0x73, 0xc2, 0xf3, 0x81, 0x05, 0xa7, 0xc5, 0x57, 0x01, 0x76, - 0x8f, 0xb0, 0xe9, 0xe1, 0x0a, 0xdd, 0x09, 0x0c, 0x3f, 0x6c, 0x11, 0xf6, 0x09, 0x7b, 0x9e, 0x3e, - 0xc5, 0xb0, 0x92, 0x80, 0x66, 0xd5, 0xbb, 0x31, 0xa6, 0xc3, 0x7b, 0x85, 0x96, 0x63, 0xe4, 0x75, - 0xb6, 0xeb, 0xc1, 0xfb, 0x2c, 0xe8, 0xcc, 0x4f, 0x20, 0x0f, 0x78, 0x00, 0xf1, 0x43, 0x1e, 0x90, - 0x77, 0xe7, 0x31, 0x6c, 0x21, 0x77, 0x81, 0x48, 0xab, 0x89, 0x48, 0x9c, 0xd6, 0xb5, 0xed, 0xff, - 0xd3, 0x7b, 0xd4, 0x7b, 0x68, 0xee, 0xe5, 0x2d, 0xa5, 0x13, 0xdb, 0x2d, 0x75, 0xdf, 0x4b, 0x45, - 0x4b, 0x47, 0x5c, 0x22, 0xcd, 0x4e, 0x7d, 0x96, 0xe5, 0x78, 0xa5, 0x6b, 0x96, 0xcc, 0xac, 0xcd, - 0xae, 0x6e, 0x89, 0x64, 0x61, 0x30, 0x04, 0x5e, 0x4b, 0x57, 0x9e, 0x80, 0x6d, 0xa6, 0xb9, 0x0e, - 0xb1, 0x59, 0x70, 0xc1, 0xd6, 0x6e, 0x59, 0x19, 0xac, 0xf5, 0x61, 0x3e, 0x74, 0xe4, 0xa5, 0xe5, - 0x1f, 0xe1, 0x09, 0x71, 0x5a, 0xf8, 0x43, 0xc9, 0x79, 0xe9, 0x52, 0x07, 0x38, 0x9a, 0xdd, 0x21, - 0xdd, 0x24, 0xba, 0xe7, 0xd3, 0x3c, 0x41, 0x7a, 0x8d, 0x95, 0xa1, 0x7f, 0x0a, 0xd0, 0xe0, 0x98, - 0x14, 0x71, 0x34, 0xca, 0x10, 0x65, 0x1d, 0x9a, 0x52, 0x0a, 0x43, 0x9d, 0xe6, 0x44, 0x0f, 0xe6, - 0x1a, 0x66, 0x1e, 0xd3, 0x55, 0x1f, 0xc3, 0x99, 0xee, 0x0d, 0xd3, 0x4f, 0x07, 0x6b, 0x00, 0x36, - 0x5f, 0x75, 0x0c, 0xb3, 0x0e, 0x57, 0xab, 0x0f, 0xff, 0xdc, 0xb5, 0x86, 0xe9, 0xa7, 0xaa, 0x35, - 0x40, 0xf9, 0xc4, 0x69, 0x28, 0x43, 0x89, 0x33, 0xcb, 0x9a, 0xc3, 0xca, 0x0f, 0x2e, 0x19, 0x16, - 0x1c, 0x2a, 0x56, 0x1f, 0x5b, 0xec, 0xf0, 0xa1, 0x61, 0x23, 0xc7, 0x8c, 0x35, 0xc5, 0xfe, 0x91, - 0xe3, 0xab, 0x86, 0x59, 0x67, 0x59, 0xd5, 0x86, 0x2f, 0x78, 0x3f, 0xed, 0xfc, 0xac, 0xfa, 0x90, - 0x7d, 0xce, 0x4f, 0x3f, 0x7a, 0xac, 0x36, 0x74, 0xc1, 0xf7, 0x69, 0x47, 0x8e, 0xd5, 0xa7, 0xf8, - 0x0a, 0xd7, 0x17, 0x9e, 0xe8, 0xd5, 0x18, 0x4e, 0x9f, 0xe7, 0xf3, 0x4f, 0xa3, 0xae, 0x8d, 0x2c, - 0xc1, 0xf2, 0x0d, 0x9c, 0xc1, 0xd5, 0x20, 0xd3, 0x9b, 0x73, 0x83, 0x2c, 0x78, 0xbe, 0x51, 0x76, - 0xe7, 0x90, 0x05, 0xb7, 0xbb, 0xcd, 0x31, 0xba, 0x80, 0xe9, 0xf3, 0xb9, 0xdb, 0x24, 0x8b, 0x73, - 0xb8, 0x82, 0xc3, 0x69, 0x73, 0xcc, 0x2d, 0x28, 0xbb, 0xca, 0xdb, 0x2d, 0xb1, 0x75, 0x14, 0x5b, - 0xc0, 0xd5, 0x2d, 0xc8, 0x70, 0x8e, 0x25, 0xc1, 0xce, 0x93, 0xb5, 0x90, 0xdd, 0x91, 0x54, 0xad, - 0x4f, 0xfa, 0x6d, 0x60, 0xf2, 0x0d, 0xd3, 0x73, 0x11, 0x6b, 0xe3, 0xe1, 0xa1, 0xe1, 0x38, 0x8e, - 0x63, 0x25, 0x4d, 0xb1, 0x0e, 0x12, 0xe7, 0x1a, 0xd3, 0x2f, 0x41, 0x80, 0x52, 0x14, 0x4b, 0x56, - 0xfa, 0x62, 0x1d, 0x5c, 0x73, 0xbe, 0xed, 0xff, 0x25, 0x12, 0x0d, 0x15, 0xc3, 0x98, 0x9f, 0xe0, - 0xd8, 0x14, 0xde, 0x0f, 0xb6, 0x91, 0x89, 0x35, 0x99, 0x00, 0x59, 0x07, 0x67, 0x6c, 0x8f, 0x6e, - 0x81, 0x31, 0xfb, 0x98, 0xaa, 0xcd, 0x4a, 0x6e, 0x3c, 0xe1, 0x8b, 0xf0, 0xbf, 0x64, 0xb2, 0x14, - 0xf9, 0x49, 0x3c, 0x12, 0xde, 0xf0, 0x7a, 0x4e, 0x43, 0xe9, 0xc3, 0x93, 0xf2, 0x3b, 0x9e, 0x75, - 0x56, 0x57, 0xad, 0x9b, 0x05, 0xf9, 0x4d, 0x71, 0x47, 0x93, 0xa9, 0xba, 0x58, 0x50, 0xd6, 0xc9, - 0xa8, 0x2e, 0x16, 0x6c, 0x00, 0x8c, 0xba, 0x78, 0x50, 0x5d, 0x3c, 0xa8, 0x2e, 0x1e, 0x4c, 0x12, - 0x4c, 0x5d, 0x3c, 0x58, 0xff, 0xe2, 0x41, 0x75, 0x01, 0xa0, 0xf4, 0x18, 0x94, 0xbb, 0xa2, 0xf1, - 0x01, 0x2f, 0x16, 0x94, 0xc1, 0x14, 0x5b, 0x6b, 0xa9, 0xab, 0x08, 0xe5, 0xa0, 0xa8, 0xab, 0x08, - 0xd5, 0x55, 0x84, 0xea, 0x2a, 0xc2, 0xfa, 0x9c, 0xac, 0xae, 0x22, 0x54, 0x57, 0x11, 0xaa, 0xab, - 0x08, 0x0b, 0x08, 0xb6, 0xce, 0x57, 0x11, 0xaa, 0x7b, 0x08, 0xd5, 0x3d, 0x84, 0x3f, 0xde, 0x3d, - 0x84, 0x19, 0xce, 0x9b, 0x96, 0xef, 0x1a, 0xac, 0x2c, 0xbd, 0xd4, 0x3d, 0x84, 0xea, 0x1e, 0x42, - 0x75, 0x0f, 0x61, 0x0a, 0x22, 0x75, 0x0f, 0x61, 0x4b, 0x76, 0x92, 0xba, 0x87, 0x50, 0xdd, 0x43, - 0x58, 0x67, 0x6a, 0xab, 0x7b, 0x08, 0x9b, 0xbc, 0x87, 0x50, 0xdd, 0x31, 0x88, 0xd4, 0x1d, 0x83, - 0xea, 0x8e, 0xc1, 0x26, 0xe7, 0x65, 0xde, 0x94, 0x54, 0x77, 0x03, 0x56, 0x65, 0xad, 0xf5, 0xb9, - 0x1b, 0x50, 0x5d, 0xff, 0xa7, 0xae, 0xff, 0xab, 0x1b, 0x4e, 0x54, 0xfc, 0x66, 0x91, 0xf8, 0xe7, - 0xe7, 0x89, 0x65, 0xe8, 0x17, 0xee, 0x71, 0x88, 0xe5, 0x93, 0xc9, 0xdf, 0x99, 0x97, 0xda, 0xfb, - 0x99, 0x73, 0xf3, 0xde, 0x61, 0xef, 0x6c, 0x03, 0xfe, 0x86, 0xff, 0x72, 0x96, 0xdb, 0x8b, 0x60, - 0xa4, 0xec, 0x98, 0xa5, 0xb8, 0x8b, 0x22, 0x7d, 0xc9, 0xeb, 0xf0, 0x0c, 0x47, 0xff, 0x3a, 0xb5, - 0xfc, 0x15, 0xfb, 0x6a, 0x26, 0x8c, 0x90, 0x48, 0x26, 0xfe, 0x0d, 0x46, 0x7c, 0x43, 0x2f, 0x58, - 0x3c, 0xbe, 0xf9, 0x2c, 0x58, 0xbb, 0xe0, 0x72, 0xc5, 0xdc, 0x61, 0x4b, 0xf6, 0x29, 0xfe, 0x53, - 0x80, 0xf4, 0x02, 0xd4, 0x53, 0x94, 0x85, 0x08, 0x4f, 0x4f, 0x07, 0x95, 0x30, 0x44, 0xfb, 0x11, - 0xbf, 0x0d, 0x9d, 0xdb, 0xb6, 0x88, 0x1c, 0x7b, 0x06, 0x0a, 0xd5, 0x8e, 0x07, 0x1d, 0x2d, 0x0b, - 0x61, 0x17, 0xeb, 0x2c, 0x79, 0x35, 0xd8, 0x22, 0xf2, 0x11, 0x20, 0x23, 0xc3, 0x61, 0xb1, 0xb4, - 0x6d, 0xc7, 0xbe, 0xa0, 0x64, 0x3a, 0xc5, 0x74, 0x75, 0x84, 0x45, 0x94, 0x84, 0x3f, 0x96, 0x9d, - 0x51, 0xdc, 0xe1, 0xc5, 0xc3, 0x84, 0xba, 0xc2, 0xa7, 0x02, 0x1f, 0x07, 0x7f, 0x87, 0x7f, 0xfe, - 0x4b, 0x40, 0x86, 0x9f, 0x5e, 0xbc, 0x48, 0xb3, 0xb7, 0x42, 0x38, 0x2f, 0x3b, 0xe8, 0x85, 0xff, - 0xcb, 0x0b, 0xfe, 0x4b, 0xde, 0x98, 0x73, 0x78, 0x2f, 0x5e, 0x6c, 0x25, 0x37, 0x4c, 0xf8, 0x6b, - 0xf4, 0x0f, 0xb4, 0x97, 0x86, 0x45, 0x7c, 0x7b, 0x93, 0x48, 0x4a, 0x4f, 0x80, 0x8d, 0x90, 0x2f, - 0x68, 0x54, 0x2c, 0x73, 0x4b, 0x72, 0x68, 0x76, 0xd2, 0x86, 0x26, 0x36, 0x1f, 0xd3, 0xc7, 0x22, - 0x87, 0xdc, 0x60, 0x35, 0xd8, 0xc0, 0xc3, 0x2b, 0xf1, 0x64, 0x5d, 0xf8, 0x97, 0xc7, 0x73, 0x7a, - 0x1a, 0x75, 0x6e, 0x8e, 0x80, 0xd9, 0x59, 0xb7, 0x07, 0x04, 0xc8, 0xb0, 0x13, 0x9e, 0x3f, 0x47, - 0xcf, 0x02, 0x37, 0x19, 0xf1, 0xce, 0x1c, 0xca, 0x8e, 0x7c, 0xb0, 0xd8, 0xe8, 0x8a, 0xfd, 0xa4, - 0x67, 0xd6, 0xa1, 0x89, 0xe1, 0x53, 0xf0, 0x1a, 0xda, 0x9d, 0xf0, 0x9e, 0x19, 0xc4, 0xcb, 0x6a, - 0x49, 0x16, 0xdc, 0x74, 0xe2, 0x85, 0x18, 0xc0, 0xce, 0x8a, 0xf4, 0x14, 0x54, 0xdb, 0x14, 0x03, - 0x59, 0x78, 0x33, 0x22, 0x54, 0x19, 0xc1, 0xa8, 0xbc, 0x77, 0x6c, 0x9c, 0x24, 0x8a, 0x3f, 0xe2, - 0x36, 0x4e, 0x1b, 0xed, 0xd5, 0x89, 0x90, 0xa5, 0x0f, 0x56, 0xc7, 0x3c, 0x38, 0x6b, 0x0a, 0xde, - 0x27, 0x5c, 0xe0, 0x09, 0x6e, 0x59, 0xd0, 0x7e, 0x6c, 0x62, 0x9d, 0x26, 0x43, 0xe9, 0x16, 0xd3, - 0x40, 0x37, 0x0c, 0xca, 0xe3, 0xe5, 0x0c, 0x7c, 0xed, 0xa5, 0x35, 0x95, 0x97, 0xb1, 0x41, 0x16, - 0x02, 0x66, 0x5e, 0xe4, 0x9f, 0xbc, 0xfc, 0xbf, 0x32, 0x4b, 0xed, 0x42, 0x31, 0x51, 0x1a, 0xe6, - 0x08, 0xfa, 0x27, 0x9f, 0x31, 0x02, 0x3e, 0xfc, 0xf6, 0xaf, 0x4e, 0x6a, 0x25, 0x0f, 0xb3, 0xdf, - 0x7c, 0xe8, 0xc1, 0x10, 0x01, 0x89, 0x0f, 0x7d, 0xe9, 0xdb, 0xe5, 0x55, 0x57, 0x59, 0x85, 0xd3, - 0x35, 0xa8, 0xa5, 0x99, 0xd8, 0x9e, 0xb2, 0x99, 0x60, 0xa9, 0x0c, 0x61, 0x17, 0xc2, 0x7f, 0xf1, - 0x46, 0xa2, 0x41, 0x31, 0xb2, 0x11, 0x30, 0xb2, 0x29, 0xeb, 0x0e, 0xb6, 0x4b, 0x64, 0x5c, 0x76, - 0xbe, 0xe3, 0xbb, 0xce, 0x30, 0x44, 0x2a, 0x9f, 0x3e, 0xdc, 0x11, 0x76, 0x34, 0xd4, 0xe4, 0x8d, - 0x93, 0x8b, 0xc2, 0x5e, 0x25, 0x4c, 0x90, 0xb7, 0xcd, 0xe9, 0xc3, 0x87, 0x00, 0x3a, 0x00, 0xcb, - 0xc8, 0xdf, 0x27, 0xdd, 0xce, 0x97, 0x0f, 0xa3, 0xa3, 0x4e, 0x0f, 0x3d, 0x83, 0x15, 0xe5, 0xcb, - 0x4c, 0x1f, 0x50, 0x13, 0xfd, 0x16, 0x1c, 0xf0, 0x38, 0xbd, 0x2e, 0xe8, 0x14, 0xac, 0x6f, 0xc0, - 0x7a, 0xec, 0x6e, 0x46, 0x8f, 0xf2, 0x66, 0x75, 0xfb, 0xa2, 0x76, 0x45, 0x8a, 0x70, 0xa3, 0x37, - 0xee, 0x99, 0x88, 0xa8, 0xa9, 0xfb, 0xa8, 0x82, 0x80, 0x89, 0xfb, 0x81, 0x52, 0x9e, 0x0f, 0x1e, - 0x27, 0x74, 0xe6, 0xc1, 0x00, 0x9d, 0xc3, 0xd3, 0x0f, 0x48, 0x54, 0x81, 0x75, 0x11, 0xb1, 0x27, - 0xce, 0x76, 0x46, 0xd6, 0x7c, 0x19, 0xf1, 0xec, 0x9b, 0xf7, 0xd1, 0x76, 0xf9, 0xe6, 0x50, 0x9a, - 0xda, 0x9a, 0x08, 0x3d, 0xa9, 0x59, 0xa2, 0xca, 0xf9, 0x6d, 0x52, 0x0a, 0x97, 0x41, 0x1b, 0xac, - 0xae, 0x4b, 0xe1, 0xd5, 0xfd, 0x3a, 0xd9, 0x88, 0x17, 0xbe, 0xb4, 0x15, 0x7d, 0x6e, 0x0c, 0x83, - 0x2b, 0xad, 0xc5, 0x97, 0x34, 0x3d, 0x7f, 0x90, 0xa6, 0xe8, 0xe3, 0x66, 0x75, 0xa8, 0xe9, 0xe3, - 0x6f, 0x8b, 0x35, 0x3d, 0xac, 0xd7, 0x23, 0xe6, 0xf2, 0x52, 0x72, 0x2f, 0xd8, 0x88, 0xf3, 0x94, - 0x90, 0xe1, 0xbd, 0xf4, 0xea, 0xdc, 0xe4, 0xd5, 0xc4, 0xd9, 0x01, 0xdc, 0xb4, 0xfa, 0x8f, 0x57, - 0x13, 0xfe, 0xa7, 0x23, 0x69, 0xca, 0x40, 0xab, 0xe6, 0x24, 0xb3, 0xdb, 0x83, 0x72, 0xf6, 0x4d, - 0x71, 0xa7, 0xfb, 0x7d, 0x21, 0x53, 0x9f, 0x45, 0xc8, 0xad, 0x05, 0x80, 0xf9, 0x44, 0x4a, 0x21, - 0x09, 0x97, 0xb4, 0xb9, 0x44, 0x59, 0x11, 0xc2, 0x80, 0xa3, 0x36, 0x71, 0xfb, 0xfd, 0x7b, 0x79, - 0x02, 0x2e, 0x78, 0xb0, 0x01, 0x12, 0xae, 0x9a, 0xeb, 0x57, 0x8e, 0x63, 0xa2, 0x70, 0x52, 0x25, - 0xd9, 0x2b, 0x5e, 0x6a, 0x31, 0x05, 0x32, 0x8b, 0x71, 0xdb, 0xff, 0x06, 0xd6, 0xcc, 0xd0, 0x8a, - 0x11, 0x5f, 0xf1, 0xc7, 0x4e, 0xfe, 0xca, 0xe1, 0x55, 0x32, 0xe9, 0x32, 0xfd, 0x2a, 0xc5, 0xaf, - 0xea, 0xef, 0x84, 0xf4, 0xfb, 0x33, 0x62, 0x60, 0x98, 0xbf, 0x57, 0xb0, 0x18, 0xa3, 0xc2, 0x20, - 0xba, 0x12, 0x90, 0xd0, 0x54, 0x9f, 0x4f, 0xf1, 0x6a, 0xa4, 0x8c, 0xbf, 0x52, 0xba, 0xf0, 0x41, - 0x2e, 0xcf, 0x57, 0x59, 0x5d, 0xa8, 0x66, 0xaa, 0xa4, 0x0c, 0x08, 0x21, 0x65, 0xb7, 0xb2, 0xb5, - 0x40, 0x46, 0x5f, 0x38, 0xa3, 0xbd, 0x12, 0x7d, 0x81, 0x05, 0x84, 0xfd, 0x37, 0xc6, 0x43, 0xe4, - 0x4d, 0x6e, 0xcd, 0xf1, 0xdc, 0x86, 0x09, 0xa1, 0xd6, 0x0d, 0x60, 0x44, 0xbe, 0xa3, 0x03, 0xb0, - 0x4f, 0x71, 0xaa, 0x35, 0x95, 0x67, 0x74, 0x2f, 0xd9, 0xef, 0x54, 0xf7, 0xd8, 0xf1, 0xcd, 0xf9, - 0xad, 0x70, 0x98, 0x78, 0xdd, 0x9e, 0x36, 0xbb, 0xb9, 0xb8, 0x73, 0xf1, 0x88, 0x81, 0x6d, 0x29, - 0x88, 0x1a, 0xda, 0x19, 0x19, 0x2e, 0x85, 0x49, 0x77, 0xc5, 0x09, 0x92, 0xe7, 0xde, 0x86, 0xf2, - 0xd1, 0x41, 0x17, 0x18, 0x0a, 0x77, 0xa7, 0x97, 0x49, 0x24, 0xde, 0x22, 0xf5, 0x84, 0x53, 0x37, - 0xdf, 0x41, 0x13, 0xc7, 0x93, 0x73, 0xd6, 0x9d, 0xd4, 0xc9, 0x38, 0x69, 0x0d, 0x97, 0xda, 0x79, - 0x4b, 0xcd, 0x9b, 0xe9, 0xf7, 0x83, 0xd1, 0x8b, 0x3a, 0xa5, 0x31, 0xb2, 0x73, 0x72, 0xbe, 0x32, - 0xba, 0x95, 0x1f, 0x7f, 0x21, 0x7d, 0xe8, 0x4f, 0x5a, 0xf7, 0xe4, 0xf7, 0x29, 0xa2, 0xe3, 0x13, - 0x26, 0xf9, 0x88, 0x01, 0x6a, 0x6c, 0x53, 0x29, 0xd1, 0xeb, 0xe2, 0x33, 0x95, 0x4b, 0x1d, 0x77, - 0x04, 0xbd, 0x8f, 0xb9, 0xab, 0xcb, 0x9c, 0xfa, 0x14, 0xed, 0xbc, 0x0d, 0x32, 0x9e, 0x5a, 0xc4, - 0xd6, 0xcd, 0x23, 0xcb, 0xe8, 0x76, 0x00, 0xe6, 0x65, 0xe8, 0x5d, 0x47, 0x3b, 0x1d, 0x39, 0x3f, - 0x7a, 0xe9, 0x73, 0x9a, 0x64, 0x1b, 0x30, 0x90, 0x6d, 0x40, 0x95, 0x01, 0x91, 0x3b, 0xe6, 0x2b, - 0xcd, 0x5f, 0x9a, 0x9f, 0xc5, 0x28, 0xd7, 0xa8, 0x1c, 0x97, 0x6a, 0x29, 0xae, 0xbb, 0xcf, 0x90, - 0x71, 0x60, 0x26, 0x84, 0x6a, 0x2f, 0x8f, 0x35, 0xe4, 0x53, 0xe4, 0x72, 0x10, 0x2d, 0x34, 0xa7, - 0x34, 0xa6, 0xfc, 0xfb, 0x4e, 0xef, 0x4b, 0x3b, 0x01, 0xb3, 0x8c, 0x0b, 0xca, 0xb2, 0x4c, 0x8b, - 0xfd, 0x86, 0x6d, 0xb3, 0x5c, 0xfd, 0x95, 0x46, 0x17, 0x9e, 0x37, 0xac, 0x5b, 0x2e, 0x70, 0xf9, - 0xf9, 0x05, 0x32, 0xf8, 0xe9, 0x83, 0x37, 0x33, 0xec, 0xeb, 0xcb, 0xb1, 0x03, 0x12, 0x96, 0x6f, - 0xae, 0x19, 0xdc, 0xb2, 0xe3, 0xda, 0x12, 0x11, 0x2f, 0x48, 0x16, 0xc4, 0xc6, 0x36, 0x72, 0x44, - 0x8e, 0x8c, 0x9d, 0x06, 0x12, 0x60, 0x99, 0xfe, 0x21, 0x86, 0xbc, 0x8a, 0x0e, 0x8b, 0x84, 0x6b, - 0xac, 0xe5, 0xeb, 0xda, 0x73, 0xee, 0x78, 0xfe, 0x1d, 0x56, 0xa5, 0xdd, 0xcc, 0x50, 0xe8, 0x90, - 0x6c, 0xfc, 0xb6, 0xdc, 0xf4, 0x69, 0x13, 0x1b, 0x5d, 0xb1, 0x29, 0x91, 0x15, 0x51, 0x96, 0x52, - 0x72, 0x84, 0xd9, 0xdc, 0xcd, 0x28, 0x9e, 0xb8, 0x28, 0xf7, 0xc4, 0x9a, 0xf3, 0x93, 0x1a, 0xbb, - 0x83, 0xdb, 0x63, 0x78, 0x8a, 0xab, 0x5c, 0x59, 0xde, 0xc7, 0x9c, 0x06, 0xe5, 0x4a, 0x2e, 0x4e, - 0xa5, 0x74, 0xbb, 0x2d, 0x5f, 0x8d, 0x16, 0x53, 0xab, 0x02, 0x1d, 0xca, 0xcf, 0x89, 0xfb, 0xad, - 0xff, 0x07, 0xa0, 0xd2, 0xc9, 0x84, -}; diff --git a/package_firmware.py b/package_firmware.py index c4365cea..19714252 100755 --- a/package_firmware.py +++ b/package_firmware.py @@ -61,6 +61,9 @@ package_dict["A200S_V4"] = [['a200s_v4', default_name]] package_dict["100_250"] = [['100_250', default_name], ['100_250_no_limits', no_limits_name]] package_dict["LUNA_BBSHD"] = [['luna_bbshd', default_name]] +package_dict["LUNA_M600"] = [['luna_m600', default_name]] +package_dict["LUNA_M600_V2"] = [['luna_m600', default_name]] +package_dict["LUNA_M600_V2_Rev5"] = [['luna_m600_Rev5', default_name]] package_dict["UNITY"] = [['unity', default_name], ['unity_no_limits', no_limits_name]] package_dict["Cheap_FOCer_2"] = [['Cheap_FOCer_2', default_name]]