Merge branch 'dev_fw_5_03' of https://github.com/vedderb/bldc into dev_fw_5_03

This commit is contained in:
Jeffrey M. Friesen 2021-12-20 14:33:47 -08:00
commit 796c122fc2
19 changed files with 518 additions and 422 deletions

3
appconf/appconf_default.h Normal file → Executable file
View File

@ -42,6 +42,9 @@
#ifndef APPCONF_UAVCAN_RAW_MODE
#define APPCONF_UAVCAN_RAW_MODE UAVCAN_RAW_MODE_CURRENT
#endif
#ifndef APPCONF_UAVCAN_RAW_RPM_MAX
#define APPCONF_UAVCAN_RAW_RPM_MAX 50000.0
#endif
#ifndef APPCONF_SERVO_OUT_ENABLE
#define APPCONF_SERVO_OUT_ENABLE false
#endif

View File

@ -275,11 +275,6 @@ static THD_FUNCTION(adc_thread, arg) {
static float pwr_ramp = 0.0;
float ramp_time = fabsf(pwr) > fabsf(pwr_ramp) ? config.ramp_time_pos : config.ramp_time_neg;
// TODO: Remember what this was about?
// if (fabsf(pwr) > 0.001) {
// ramp_time = fminf(config.ramp_time_pos, config.ramp_time_neg);
// }
if (ramp_time > 0.01) {
const float ramp_step = (float)ST2MS(chVTTimeElapsedSinceX(last_time)) / (ramp_time * 1000.0);
utils_step_towards(&pwr_ramp, pwr, ramp_step);
@ -300,11 +295,7 @@ static THD_FUNCTION(adc_thread, arg) {
case ADC_CTRL_TYPE_CURRENT_REV_CENTER:
case ADC_CTRL_TYPE_CURRENT_REV_BUTTON:
current_mode = true;
if ((pwr >= 0.0 && rpm_now > 0.0) || (pwr < 0.0 && rpm_now < 0.0)) {
current_rel = pwr;
} else {
current_rel = pwr;
}
current_rel = pwr;
if (fabsf(pwr) < 0.001) {
ms_without_power += (1000.0 * (float)sleep_time) / (float)CH_CFG_ST_FREQUENCY;

View File

@ -27,6 +27,7 @@ Item {
er_msg.ER_MSG_GET_IO = 2
er_msg.ER_MSG_RESTORE_SETTINGS = 3
er_msg.ER_MSG_SET_MOTORS_ENABLED = 4
er_msg.ER_MSG_SET_PEDAL_TEST_MODE = 5
er_set.p_throttle_hyst = 0.04
er_set.p_pedal_current = 20.0
@ -98,6 +99,12 @@ Item {
} else {
VescIf.emitStatusMessage("ER Motors Disabled", true)
}
} else if (cmd == er_msg.ER_MSG_SET_PEDAL_TEST_MODE) {
if (dv.getUint8(ind++)) {
VescIf.emitStatusMessage("Pedal Test Enabled", true)
} else {
VescIf.emitStatusMessage("Pedal Test Disabled", true)
}
}
}
}
@ -156,6 +163,15 @@ Item {
mCommands.sendCustomAppData(buffer)
}
function setPedalTestMode(enabled) {
var buffer = new ArrayBuffer(2)
var dv = new DataView(buffer)
var ind = 0
dv.setUint8(ind++, er_msg.ER_MSG_SET_PEDAL_TEST_MODE)
dv.setUint8(ind++, enabled)
mCommands.sendCustomAppData(buffer)
}
function updateSliders() {
repSliders.itemAt(0).value = er_set.p_pedal_current
repSliders.itemAt(1).value = er_set.p_start_gain
@ -305,6 +321,17 @@ Item {
readSettings()
}
}
CheckBox {
Layout.fillWidth: true
Layout.preferredWidth: 500
Layout.preferredHeight: 80
text: "Pedal Test"
onToggled: {
setPedalTestMode(checked)
}
}
}
}
@ -487,7 +514,7 @@ Item {
return
}
mMcConf.updateParamDouble("si_gear_ratio", 5.6, null)
mMcConf.updateParamDouble("si_gear_ratio", 112 / 18, null)
mMcConf.updateParamInt("si_motor_poles", 8, null)
mMcConf.updateParamDouble("si_wheel_diameter", 0.58, null)
@ -506,8 +533,8 @@ Item {
mMcConf.updateParamDouble("l_battery_cut_start", 47.6, null)
mMcConf.updateParamDouble("l_battery_cut_end", 42, null)
mMcConf.updateParamDouble("l_temp_motor_start", 90, null)
mMcConf.updateParamDouble("l_temp_motor_end", 105, null)
mMcConf.updateParamDouble("l_temp_motor_start", 125, null)
mMcConf.updateParamDouble("l_temp_motor_end", 135, null)
mMcConf.updateParamDouble("l_temp_accel_dec", 0, null)
mMcConf.updateParamDouble("foc_f_sw", 30000, null)
@ -517,6 +544,9 @@ Item {
mMcConf.updateParamBool("foc_sample_high_current", 1, null)
mMcConf.updateParamDouble("foc_phase_filter_max_erpm", 1600, null)
// Field Weakening
mMcConf.updateParamDouble("foc_fw_current_max", 40, null)
mMcConf.updateParamEnum("m_motor_temp_sens_type", 4, null)
mMcConf.updateParamInt("m_hall_extra_samples", 4, null)
@ -545,7 +575,7 @@ Item {
rl[1] = rl[1] * 1e-6
mMcConf.updateParamDouble("foc_motor_r", rl[0], null)
mMcConf.updateParamDouble("foc_motor_l", rl[1], null)
mMcConf.updateParamDouble("foc_motor_l", rl[1] * 0.9, null)
// Flux linkage
@ -655,6 +685,8 @@ Item {
return
}
mMcConf.updateParamBool("m_invert_direction", 1, null)
// Resistance and inductance
var rl = Utility.measureRLBlocking(VescIf)

View File

@ -87,7 +87,8 @@ typedef enum {
ER_MSG_GET_MODE_PARAMS,
ER_MSG_GET_IO,
ER_MSG_RESTORE_SETTINGS,
ER_MSG_SET_MOTORS_ENABLED
ER_MSG_SET_MOTORS_ENABLED,
ER_MSG_SET_PEDAL_TEST_MODE
} ER_MSG;
typedef struct {
@ -108,6 +109,7 @@ static volatile SETTINGS_T m_set_sport;
static volatile SETTINGS_T *m_set_now = &m_set_normal;
static volatile int m_set_now_offset = 0;
static volatile bool m_motors_enabled = true;
static volatile bool m_pedal_test_mode = false;
// Private functions
static void process_custom_app_data(unsigned char *data, unsigned int len);
@ -124,26 +126,26 @@ static void terminal_set_top_speed_erpm(int argc, const char **argv);
static void terminal_set_brake_power(int argc, const char **argv);
static void restore_settings(void) {
m_set_normal.p_throttle_hyst = 0.04;
m_set_normal.p_pedal_current = 20.0;
m_set_normal.p_start_gain = 4.0;
m_set_normal.p_start_gain_end_speed = 15.0;
m_set_normal.p_output_power = 1.0;
m_set_normal.p_top_speed_erpm = 2000;
m_set_normal.p_brake_current_front = 0.5;
m_set_normal.p_brake_current_rear = 0.5;
m_set_normal.p_brake_current_both = 1.0;
m_set_eco.p_throttle_hyst = 0.04;
m_set_eco.p_pedal_current = 25.0;
m_set_eco.p_start_gain = 4.0;
m_set_eco.p_start_gain_end_speed = 15.0;
m_set_eco.p_start_gain = 2.9;
m_set_eco.p_start_gain_end_speed = 7.8;
m_set_eco.p_output_power = 0.7;
m_set_eco.p_top_speed_erpm = 2000;
m_set_eco.p_brake_current_front = 0.5;
m_set_eco.p_brake_current_rear = 0.5;
m_set_eco.p_brake_current_both = 1.0;
m_set_normal.p_throttle_hyst = 0.04;
m_set_normal.p_pedal_current = 20.0;
m_set_normal.p_start_gain = 3.4;
m_set_normal.p_start_gain_end_speed = 9.0;
m_set_normal.p_output_power = 0.85;
m_set_normal.p_top_speed_erpm = 2000;
m_set_normal.p_brake_current_front = 0.5;
m_set_normal.p_brake_current_rear = 0.5;
m_set_normal.p_brake_current_both = 1.0;
m_set_sport.p_throttle_hyst = 0.04;
m_set_sport.p_pedal_current = 15.0;
m_set_sport.p_start_gain = 4.0;
@ -350,7 +352,7 @@ static THD_FUNCTION(my_thread, arg) {
const float output_filter = 0.3;
const float poles = 8;
const float gearing = 5.6;
const float gearing = 112.0 / 18.0;
const float wheel_d = 0.585;
float erpm_now = 0.0;
@ -406,6 +408,10 @@ static THD_FUNCTION(my_thread, arg) {
pedal_current_target = utils_map(erpm_motor, 0.0, erpm_ramp_in, 0.0, pedal_current_target);
}
if ((!m_kill_sw || m_brake_front || m_brake_rear) && !m_pedal_test_mode) {
running = false;
}
if (running) {
mc_interface_set_pid_speed(erpm_now);
@ -547,7 +553,9 @@ static THD_FUNCTION(my_thread, arg) {
}
}
if (!m_kill_sw || brake > 0.0001) {
if (!m_kill_sw || m_pedal_test_mode) {
comm_can_set_current_brake_rel(255, 0.0);
} else if (brake > 0.0001) {
comm_can_set_current_brake_rel(255, brake);
} else {
comm_can_set_current_rel(255, pwr_out * m_set_now->p_output_power);
@ -662,6 +670,17 @@ static void process_custom_app_data(unsigned char *data, unsigned int len) {
commands_send_app_data(dataTx, ind);
} break;
case ER_MSG_SET_PEDAL_TEST_MODE: {
m_pedal_test_mode = data[ind++];
// Send ack
uint8_t dataTx[50];
ind = 0;
dataTx[ind++] = msg;
dataTx[ind++] = m_pedal_test_mode;
commands_send_app_data(dataTx, ind);
} break;
default:
break;
}

View File

@ -2,270 +2,279 @@
#include "er_qml.h"
uint8_t data_qml_app[4234] = {
0x00, 0x00, 0x66, 0xc9, 0x78, 0xda, 0xed, 0x5c, 0xeb, 0x73, 0xdb, 0x36, 0x12, 0xff, 0xee, 0xbf,
0x02, 0xd5, 0xcd, 0xcd, 0x48, 0x8d, 0x42, 0x4b, 0xb2, 0xe5, 0xa4, 0x6e, 0x33, 0x37, 0xb6, 0xe3,
0xa4, 0x9e, 0x8b, 0xe3, 0xd4, 0x72, 0x9b, 0x0f, 0x89, 0x86, 0x03, 0x93, 0x90, 0xcc, 0x31, 0x09,
0xb0, 0x7c, 0xf8, 0xd1, 0xd6, 0xff, 0xfb, 0xed, 0x02, 0xa4, 0xf8, 0x02, 0x29, 0x51, 0x72, 0xd2,
0xa4, 0x17, 0x4d, 0xc6, 0xb1, 0xc8, 0xdd, 0x1f, 0x17, 0x0b, 0x60, 0x9f, 0xa0, 0x1d, 0xcf, 0x17,
0x41, 0x44, 0x7e, 0x63, 0xb6, 0xcd, 0x02, 0xe3, 0x86, 0x85, 0x96, 0xfc, 0xe1, 0xf0, 0x88, 0x05,
0x33, 0x6a, 0x31, 0x32, 0x34, 0x06, 0x3f, 0x3a, 0x8a, 0xa8, 0xf3, 0x7b, 0x60, 0xed, 0x6f, 0x7b,
0xe2, 0xd2, 0x71, 0x59, 0x27, 0xbd, 0xf8, 0x4b, 0xf4, 0x4b, 0xec, 0x58, 0xd7, 0x64, 0x64, 0x8c,
0xb7, 0x8a, 0x97, 0x8c, 0x23, 0xc1, 0xa3, 0x40, 0xb8, 0x21, 0xdc, 0x1b, 0x95, 0xef, 0xbd, 0xa1,
0xf7, 0x22, 0x8e, 0x42, 0x80, 0xdf, 0xd9, 0x4a, 0xef, 0xe5, 0x85, 0xb0, 0x84, 0xe7, 0x51, 0x6e,
0x23, 0xc1, 0x40, 0x7f, 0x9f, 0xcf, 0x9c, 0xb9, 0x4f, 0x03, 0xea, 0xd5, 0xd2, 0xc4, 0x91, 0xe3,
0x3a, 0xd1, 0xbd, 0xbc, 0xbd, 0x75, 0x12, 0x31, 0x8f, 0xfc, 0xb9, 0x45, 0xe0, 0xe3, 0xd8, 0xfb,
0x04, 0xf8, 0x23, 0xea, 0x70, 0x16, 0xc8, 0x2b, 0x94, 0x5b, 0x57, 0x22, 0x08, 0x8d, 0x99, 0xe3,
0xba, 0xfb, 0x04, 0x50, 0x19, 0x8f, 0x0a, 0x37, 0x3c, 0x1a, 0xcc, 0x1d, 0x1e, 0xee, 0x93, 0xe1,
0x40, 0x5e, 0x97, 0x3f, 0xfc, 0x40, 0xf8, 0x2c, 0x80, 0x07, 0x1c, 0xa5, 0xc2, 0x7a, 0xe9, 0x6f,
0xfb, 0x20, 0x48, 0x68, 0x9d, 0xcc, 0x16, 0xe3, 0xe8, 0xf6, 0xca, 0x2c, 0x28, 0xff, 0x3b, 0x25,
0xbf, 0x77, 0x6a, 0xe1, 0xf7, 0x05, 0x93, 0x67, 0xa9, 0xdb, 0xcd, 0x4c, 0x07, 0xbe, 0x5f, 0xe0,
0xa2, 0xea, 0x7b, 0x95, 0xed, 0x86, 0x06, 0xc4, 0xa2, 0xfc, 0x25, 0xbb, 0x01, 0xb9, 0x3e, 0x4c,
0x35, 0x03, 0xb8, 0x14, 0xc2, 0x25, 0x01, 0xa3, 0xf6, 0x84, 0x45, 0x91, 0xc3, 0xe7, 0xe1, 0x4b,
0xc1, 0xd9, 0x3e, 0x99, 0x51, 0x37, 0x64, 0x55, 0x2c, 0x16, 0x98, 0x5e, 0x38, 0x5f, 0x40, 0x95,
0xef, 0x85, 0x2c, 0xaa, 0xbd, 0xe7, 0x88, 0xa2, 0x04, 0xa0, 0x2f, 0x1f, 0x1e, 0xc5, 0x23, 0x43,
0x70, 0xfc, 0xdd, 0x65, 0x11, 0x83, 0xd9, 0xf9, 0x93, 0x24, 0x9f, 0xad, 0xf4, 0x17, 0xf5, 0x4c,
0xe3, 0xf8, 0xdc, 0x3c, 0x9d, 0xbc, 0x36, 0x27, 0xc7, 0x17, 0xe6, 0xe9, 0xd9, 0xcb, 0x63, 0xf3,
0xdd, 0xc1, 0xf9, 0xc1, 0xe9, 0x84, 0xbc, 0x20, 0x83, 0x1a, 0xca, 0xd7, 0x15, 0xca, 0x61, 0x03,
0xe5, 0xc9, 0x19, 0x10, 0x8c, 0x6a, 0x08, 0xce, 0x8f, 0x27, 0x17, 0x67, 0xe7, 0xc7, 0xf8, 0xf0,
0x8b, 0x93, 0xb7, 0xaf, 0x11, 0x6b, 0xa7, 0x51, 0x3e, 0xa0, 0x9e, 0x98, 0xc7, 0x6f, 0x0f, 0x0e,
0xdf, 0x1c, 0xbf, 0x04, 0xe2, 0xdd, 0x2d, 0xdd, 0xa8, 0x40, 0x5b, 0x86, 0x6f, 0x46, 0x57, 0x81,
0x88, 0x22, 0x97, 0x99, 0x57, 0xf7, 0x61, 0x84, 0xc3, 0x31, 0x06, 0xbb, 0x55, 0x2a, 0x9f, 0xd9,
0xd4, 0x35, 0xad, 0x38, 0xc0, 0xf5, 0x89, 0x92, 0x02, 0x59, 0x95, 0x2a, 0x8c, 0x68, 0x10, 0x99,
0x73, 0x58, 0xdd, 0xf8, 0xd0, 0x66, 0x0a, 0x93, 0x71, 0xdb, 0x0c, 0x7d, 0xc6, 0x6c, 0xd4, 0xcc,
0x58, 0x47, 0x0c, 0xdb, 0xd4, 0x8f, 0x23, 0xd3, 0x17, 0xb7, 0x2c, 0x40, 0x22, 0x1d, 0x4d, 0x24,
0x7c, 0x85, 0x62, 0xb2, 0xc0, 0xf7, 0xa4, 0x64, 0x03, 0x0d, 0xd9, 0x65, 0x40, 0xaf, 0x59, 0x2a,
0xbf, 0x39, 0x0b, 0x04, 0x57, 0x63, 0x1d, 0x2f, 0x23, 0x85, 0xa5, 0x19, 0xac, 0x46, 0x79, 0x29,
0xa2, 0xab, 0x92, 0x94, 0x79, 0x16, 0x47, 0x18, 0x9e, 0xb0, 0x99, 0x79, 0x19, 0xa1, 0x72, 0xb2,
0xf5, 0x9d, 0xdd, 0x56, 0x70, 0xa9, 0x6c, 0xf5, 0x14, 0x89, 0x48, 0x3a, 0x82, 0x6b, 0xb0, 0x22,
0x66, 0x78, 0x5b, 0x73, 0xd7, 0x45, 0x2d, 0x59, 0xc2, 0x14, 0xbc, 0x81, 0x20, 0x44, 0x63, 0xd6,
0x4c, 0xe2, 0x8a, 0x5b, 0xf3, 0x92, 0x46, 0x4b, 0xa8, 0x66, 0x34, 0x76, 0x2b, 0x24, 0x0f, 0xd9,
0x06, 0xbc, 0x70, 0x3c, 0x98, 0xd6, 0x3f, 0x17, 0x9c, 0x01, 0xf3, 0x19, 0x85, 0xfd, 0x1b, 0x05,
0x71, 0x06, 0x27, 0xbd, 0xc1, 0x0d, 0x05, 0xd3, 0x38, 0xca, 0x4d, 0x6b, 0x10, 0x73, 0x0e, 0xb6,
0xa2, 0x44, 0xbb, 0xf8, 0x45, 0xf0, 0x8b, 0xc0, 0x99, 0xcf, 0x59, 0x20, 0x37, 0xf4, 0xe2, 0xb2,
0x7a, 0x08, 0xb5, 0x4f, 0x44, 0x62, 0xa6, 0x32, 0x81, 0x1e, 0xf2, 0x76, 0x81, 0x73, 0x66, 0x45,
0x8e, 0xe0, 0x61, 0x8e, 0x17, 0x96, 0xed, 0x1c, 0x8d, 0xcb, 0xc2, 0xcc, 0xea, 0x9e, 0x7a, 0x14,
0x87, 0x91, 0x40, 0xe3, 0xf8, 0x92, 0x46, 0xf4, 0x9c, 0x59, 0xcc, 0xb9, 0xa9, 0x4a, 0x80, 0xe6,
0xc8, 0xbe, 0x01, 0xa5, 0x70, 0x76, 0x4b, 0x90, 0xf0, 0x37, 0x87, 0xdd, 0x76, 0x6d, 0xf8, 0xa5,
0x4f, 0x06, 0xbd, 0x0a, 0xa9, 0xc3, 0xed, 0x82, 0x8d, 0x49, 0xaf, 0x5b, 0x1e, 0x5e, 0xb7, 0x6f,
0x0c, 0x10, 0xeb, 0x57, 0xd0, 0xd2, 0xf3, 0x2e, 0x50, 0x3e, 0x79, 0x52, 0x04, 0x28, 0x7c, 0x71,
0x66, 0xa4, 0x2b, 0xb9, 0x5e, 0x34, 0x9b, 0xb4, 0x5e, 0x49, 0x60, 0xfc, 0x24, 0x76, 0x9e, 0x79,
0x4e, 0x34, 0x89, 0x68, 0x14, 0x87, 0xa7, 0x2c, 0x0c, 0xe9, 0x9c, 0x75, 0x3b, 0xc7, 0xe7, 0x24,
0xf1, 0x0a, 0x60, 0xc0, 0xc9, 0xd9, 0x7f, 0x3b, 0x7d, 0x39, 0x29, 0x45, 0x39, 0x1e, 0x08, 0x83,
0x05, 0x50, 0x2f, 0xc1, 0xeb, 0xe5, 0x12, 0xd4, 0xda, 0x2b, 0xa5, 0x82, 0x57, 0xae, 0xa0, 0xd1,
0xce, 0x08, 0x95, 0xd0, 0xfb, 0x51, 0x2a, 0xed, 0x49, 0xde, 0xec, 0x2d, 0xb5, 0x67, 0xeb, 0xa1,
0x14, 0xec, 0xdd, 0xa6, 0x10, 0x05, 0x83, 0xb8, 0x1e, 0x58, 0xc9, 0x60, 0xae, 0x07, 0x52, 0xb1,
0xa8, 0xeb, 0xc1, 0xe8, 0x2d, 0xee, 0x63, 0x60, 0x25, 0xf6, 0xef, 0x31, 0xa0, 0x12, 0x9b, 0xdd,
0x0a, 0xaa, 0x1c, 0xac, 0x00, 0x7f, 0xc1, 0x0c, 0xa5, 0x9f, 0xd8, 0x87, 0x4d, 0xcd, 0x26, 0xae,
0x03, 0x51, 0x61, 0xd8, 0x6d, 0xbf, 0x21, 0x4e, 0xce, 0x6a, 0xf6, 0x41, 0xd1, 0x93, 0x94, 0x4c,
0x40, 0x26, 0xf9, 0xb0, 0x86, 0xb7, 0xe8, 0x66, 0xd6, 0x64, 0x2f, 0xcc, 0x41, 0x0b, 0xee, 0xcc,
0x41, 0xb5, 0x60, 0xad, 0xc1, 0x2a, 0xb8, 0xb3, 0xd6, 0x92, 0x94, 0x7c, 0xdd, 0x5a, 0xfc, 0x45,
0x47, 0xb8, 0x16, 0x44, 0xce, 0x4b, 0x6e, 0xa2, 0x11, 0xb5, 0xd8, 0x4e, 0x84, 0xb2, 0xce, 0x2d,
0x57, 0x5b, 0x35, 0x66, 0xd4, 0xad, 0x3c, 0x64, 0xaf, 0xfa, 0x1b, 0x1d, 0xe5, 0x52, 0x8f, 0x71,
0x2a, 0x22, 0x48, 0x6d, 0xc8, 0x31, 0xa7, 0x97, 0xa0, 0x03, 0xad, 0xcb, 0xc8, 0xc9, 0xbd, 0xfe,
0x03, 0x5e, 0x3a, 0xe1, 0x92, 0x27, 0x6c, 0xe9, 0xbf, 0x55, 0xa2, 0x82, 0x59, 0xcc, 0x65, 0x4c,
0x50, 0xd8, 0xfd, 0xdd, 0xfc, 0xe0, 0xd1, 0x29, 0x5f, 0xc6, 0xb3, 0x99, 0xb4, 0xbc, 0xe8, 0xdb,
0x0f, 0x82, 0x80, 0xde, 0x1f, 0xca, 0x2b, 0xdd, 0x61, 0x6f, 0xab, 0xd9, 0xff, 0x2b, 0xce, 0x22,
0x55, 0xd9, 0xf5, 0x83, 0xf2, 0xc3, 0x82, 0xf2, 0xfb, 0x4b, 0xdc, 0xe8, 0x82, 0x73, 0x11, 0xb5,
0x00, 0x00, 0xb7, 0x0b, 0x61, 0x4a, 0xe1, 0xc9, 0xba, 0x01, 0xdf, 0x06, 0x0e, 0x58, 0x31, 0xdd,
0x88, 0x71, 0x41, 0x7c, 0x57, 0xb6, 0x86, 0xbd, 0x4a, 0xc0, 0x15, 0xc5, 0x01, 0xdf, 0xaa, 0xaa,
0x78, 0x35, 0xc5, 0xed, 0x3c, 0xfb, 0x04, 0x9a, 0xeb, 0x2f, 0x09, 0x80, 0x34, 0x1b, 0x4f, 0x21,
0xe4, 0x3c, 0x44, 0xbf, 0x26, 0x22, 0xd1, 0x79, 0x8e, 0x26, 0xe6, 0x42, 0x20, 0xd2, 0x96, 0x39,
0x0b, 0x1e, 0xd6, 0xe7, 0xcc, 0xc2, 0x8e, 0xb6, 0x18, 0xf9, 0x68, 0xa3, 0x2d, 0x6f, 0x31, 0xc8,
0x68, 0xcb, 0xad, 0x89, 0x2d, 0x36, 0x83, 0x40, 0x77, 0xb6, 0x19, 0x02, 0x46, 0x12, 0x3a, 0x84,
0x4d, 0xb6, 0x5e, 0xc0, 0x80, 0x3a, 0x60, 0x5f, 0xaa, 0xb9, 0x29, 0x57, 0x25, 0x7a, 0x8f, 0x34,
0x68, 0x95, 0xa1, 0x7d, 0x79, 0xa6, 0x15, 0x02, 0xb2, 0x47, 0x19, 0x21, 0x3c, 0x49, 0xf9, 0xa7,
0xc4, 0xff, 0x75, 0x99, 0xfa, 0x7f, 0xe5, 0x21, 0x8f, 0x3e, 0xcb, 0x90, 0x35, 0x51, 0x41, 0x23,
0x73, 0x32, 0x88, 0x47, 0x51, 0x51, 0x29, 0x76, 0x2e, 0x56, 0x09, 0x92, 0xcb, 0x06, 0xf8, 0x25,
0xef, 0x20, 0xea, 0x0e, 0x7a, 0xc6, 0x0d, 0x75, 0x63, 0x8c, 0xc3, 0xf5, 0x56, 0xb5, 0x81, 0x77,
0xa8, 0xe1, 0xcd, 0x4c, 0x63, 0x03, 0xe3, 0xa8, 0x91, 0x31, 0xb3, 0xa9, 0x0d, 0x10, 0x3b, 0x1a,
0x88, 0xbc, 0x49, 0x6d, 0x60, 0xdd, 0xd5, 0xb0, 0x16, 0x2d, 0x6a, 0x03, 0xf3, 0x58, 0xc3, 0xac,
0x31, 0xa8, 0x0d, 0x08, 0x7b, 0x4b, 0x11, 0xd0, 0x9e, 0x36, 0x00, 0x3c, 0x5b, 0x0a, 0x80, 0xe6,
0x74, 0xc9, 0xea, 0xc8, 0x82, 0xdd, 0x7c, 0x4c, 0x22, 0xce, 0x65, 0x19, 0x89, 0x05, 0xb9, 0xe5,
0x61, 0x09, 0x57, 0xe0, 0x3e, 0xea, 0x96, 0x92, 0xa7, 0xff, 0x90, 0xce, 0x3c, 0x60, 0x8c, 0x77,
0xf6, 0x49, 0xc7, 0xa6, 0xc1, 0xf5, 0x6b, 0xd8, 0x62, 0x9d, 0x5e, 0x03, 0xd6, 0xb0, 0x82, 0x95,
0x4f, 0xa6, 0x16, 0x70, 0x64, 0x55, 0xbc, 0x51, 0x0d, 0x9e, 0xcc, 0xae, 0xda, 0xc3, 0xed, 0x54,
0xe0, 0xd2, 0x74, 0xab, 0x3d, 0xd6, 0x6e, 0x05, 0x2b, 0x97, 0x6e, 0xb5, 0x87, 0x1b, 0x6b, 0xe1,
0x16, 0xf9, 0x57, 0x7b, 0xc0, 0x3d, 0x2d, 0x60, 0x3e, 0x21, 0x6b, 0x8f, 0xf9, 0x4c, 0x8b, 0xb9,
0xc8, 0xd0, 0x96, 0x01, 0x16, 0xcc, 0x6d, 0xe4, 0x60, 0x44, 0x88, 0x56, 0xf9, 0x05, 0xe9, 0x74,
0x0a, 0x31, 0x73, 0x59, 0x9d, 0xe5, 0x90, 0xb9, 0xc0, 0x7a, 0x6c, 0x09, 0x92, 0x06, 0x00, 0x19,
0x4c, 0x2e, 0xa3, 0xab, 0x6a, 0xb3, 0x11, 0x6f, 0x22, 0x7b, 0x55, 0xb5, 0x88, 0x0d, 0x9c, 0x6f,
0x45, 0xe0, 0x51, 0x57, 0xc7, 0x5a, 0xd5, 0x00, 0x0a, 0x16, 0x26, 0x84, 0x87, 0xe2, 0xce, 0x90,
0x40, 0xe4, 0xbb, 0x17, 0x19, 0x62, 0x4f, 0x53, 0x98, 0xcd, 0x02, 0x9d, 0x26, 0xec, 0x2a, 0x6e,
0x0e, 0xb6, 0xd6, 0x66, 0x40, 0xda, 0x7a, 0x44, 0xf9, 0x89, 0x5d, 0x4d, 0x61, 0x92, 0xfe, 0x14,
0xa8, 0x90, 0xcf, 0xb1, 0x1a, 0x04, 0x4e, 0xb2, 0x2c, 0x9c, 0xad, 0xf2, 0xc8, 0x97, 0x0e, 0x75,
0xc5, 0xbc, 0x94, 0x5c, 0x27, 0xec, 0x20, 0xc4, 0xaf, 0xaa, 0xe9, 0x67, 0x84, 0x70, 0x09, 0x9e,
0x85, 0x09, 0xea, 0x19, 0x77, 0xef, 0xbb, 0x2a, 0x53, 0x2d, 0x72, 0x29, 0x6f, 0x59, 0x01, 0x7c,
0x68, 0x08, 0x1a, 0x5c, 0x66, 0x45, 0xe7, 0x60, 0x18, 0x64, 0xec, 0x50, 0x89, 0x8f, 0x20, 0x56,
0x2c, 0x17, 0xa2, 0x0a, 0xa3, 0xcc, 0xbc, 0x31, 0x68, 0x62, 0x82, 0x0e, 0x99, 0xf2, 0x6e, 0x25,
0x7b, 0x4f, 0x5b, 0x87, 0x94, 0x5f, 0x78, 0xfe, 0xd9, 0x0d, 0x0b, 0x02, 0xb0, 0xdb, 0x5d, 0x59,
0xbe, 0x2f, 0x54, 0xa7, 0xb5, 0xab, 0x25, 0xa7, 0xe2, 0x6a, 0xe1, 0xb9, 0xa8, 0xe4, 0xef, 0x34,
0x4a, 0xae, 0x7f, 0x3e, 0x8e, 0xaa, 0x9f, 0x2a, 0xfa, 0xc3, 0x60, 0xaa, 0xad, 0x6e, 0xfc, 0xa9,
0x29, 0xd4, 0x85, 0x95, 0xf6, 0x84, 0x2e, 0xcd, 0xaf, 0xe8, 0x0a, 0x92, 0xda, 0xb0, 0x46, 0x33,
0x58, 0x6e, 0x48, 0x0a, 0x0d, 0xc9, 0xe4, 0x75, 0x26, 0x72, 0x66, 0x08, 0x4e, 0x8d, 0xaa, 0x3b,
0x74, 0xfa, 0x15, 0x51, 0x3a, 0x47, 0x22, 0x76, 0x6d, 0xc2, 0x45, 0x94, 0x4c, 0x24, 0x91, 0x26,
0xde, 0x43, 0x72, 0x83, 0x9c, 0x82, 0xcd, 0x27, 0x61, 0x1c, 0x30, 0x12, 0x5d, 0xd1, 0x08, 0x7e,
0x30, 0x72, 0x74, 0xf0, 0xf6, 0xe9, 0x65, 0x1c, 0x12, 0x27, 0x24, 0xbe, 0x1b, 0xcf, 0xe7, 0xcc,
0x86, 0x00, 0xce, 0xd0, 0x20, 0x27, 0x73, 0x23, 0xff, 0x6b, 0xdc, 0x36, 0x2a, 0x11, 0x47, 0xa5,
0xd4, 0xfb, 0x55, 0xde, 0xb4, 0xca, 0xb4, 0x73, 0x73, 0xcc, 0xed, 0xae, 0xc6, 0x02, 0x16, 0x56,
0xdb, 0xa9, 0x85, 0x2d, 0xf3, 0x1c, 0x99, 0xd4, 0x71, 0xba, 0x5b, 0x6e, 0xa9, 0x13, 0x4d, 0x9c,
0x39, 0xa7, 0x6e, 0x37, 0x69, 0x46, 0xf7, 0x49, 0x67, 0xa4, 0x5c, 0x3c, 0x60, 0x77, 0xfa, 0x64,
0x77, 0x30, 0x18, 0xf4, 0x56, 0x9f, 0x0f, 0x90, 0xde, 0x4e, 0xfa, 0xd5, 0x71, 0x40, 0x71, 0x60,
0x25, 0xb5, 0xe5, 0x26, 0x03, 0xad, 0x8e, 0x9a, 0x05, 0x62, 0xe5, 0x39, 0xca, 0x9a, 0x6e, 0xd2,
0x72, 0x4e, 0x93, 0x13, 0x2b, 0x10, 0xae, 0x8b, 0x21, 0x78, 0x4e, 0xda, 0xda, 0x0e, 0xbf, 0xb4,
0x1e, 0xae, 0xe3, 0x97, 0xda, 0x58, 0x78, 0x3e, 0x00, 0x48, 0xde, 0x3b, 0x76, 0x74, 0xb5, 0x4f,
0xe8, 0x0d, 0x75, 0x5c, 0xb4, 0x15, 0xf2, 0x7b, 0x55, 0xd3, 0x47, 0xc2, 0x8d, 0x3d, 0xae, 0xce,
0x34, 0x94, 0x54, 0x84, 0x87, 0x0d, 0x3c, 0x88, 0x46, 0x15, 0x49, 0x7d, 0x63, 0xa8, 0x51, 0xc0,
0x0a, 0xf5, 0x05, 0xbb, 0x8b, 0x34, 0x9b, 0x4d, 0x49, 0x20, 0x31, 0x12, 0xc9, 0xb5, 0x45, 0x71,
0xe9, 0x5f, 0xc1, 0x7d, 0xbe, 0xbf, 0x02, 0x9f, 0xdb, 0xa9, 0xdc, 0x06, 0x39, 0x9c, 0x3f, 0xf0,
0x7c, 0x84, 0x7b, 0xe0, 0xc2, 0x9a, 0xf0, 0x40, 0x92, 0x7d, 0xf9, 0x44, 0x43, 0x7e, 0xff, 0xf9,
0x88, 0x61, 0x3f, 0xb0, 0xba, 0x09, 0x80, 0xc5, 0xf0, 0x05, 0xa4, 0x23, 0x13, 0xe7, 0x0f, 0x86,
0xbd, 0xc2, 0x0a, 0x49, 0x04, 0x20, 0xf0, 0xdc, 0xe3, 0x40, 0x58, 0xd7, 0x4e, 0x84, 0xeb, 0x23,
0x14, 0x6e, 0x49, 0x82, 0x87, 0xfa, 0x51, 0xbf, 0x0e, 0x44, 0xec, 0x83, 0xc7, 0xd1, 0xd5, 0x45,
0x41, 0xcd, 0xb7, 0xce, 0x1f, 0x34, 0xb0, 0xe1, 0x7e, 0xf5, 0xb9, 0xe8, 0x99, 0xf6, 0xc9, 0xef,
0xe1, 0x45, 0xd0, 0xed, 0xa8, 0xf3, 0x2a, 0xe0, 0xe6, 0x62, 0xbf, 0xd3, 0x5b, 0x57, 0x85, 0x95,
0x0b, 0xaf, 0x61, 0x23, 0x6a, 0x17, 0x40, 0x79, 0x82, 0x21, 0x45, 0x38, 0x95, 0xa7, 0x49, 0xf6,
0xc9, 0xd3, 0x71, 0x23, 0x25, 0x84, 0xdf, 0x90, 0xad, 0xad, 0x48, 0x5c, 0xbb, 0x6e, 0x72, 0x93,
0x0e, 0x0b, 0x30, 0xdc, 0xcf, 0x9d, 0x6f, 0xa8, 0xde, 0x9e, 0xf8, 0xd4, 0x92, 0x3d, 0x5d, 0xfd,
0xc3, 0x02, 0x71, 0xbb, 0xa0, 0x18, 0x68, 0x29, 0xb4, 0x17, 0x4f, 0x3c, 0xb0, 0x0c, 0x87, 0x31,
0x8c, 0x86, 0xd7, 0x28, 0xa7, 0x85, 0xe6, 0x4b, 0xe4, 0x7e, 0xc0, 0x20, 0x89, 0x0d, 0x98, 0x9d,
0xf0, 0x8c, 0x07, 0x83, 0x95, 0x59, 0x7e, 0x66, 0xce, 0xfc, 0x0a, 0x16, 0xe4, 0xf3, 0x7a, 0x96,
0xda, 0x1b, 0x97, 0x72, 0x38, 0x17, 0x6a, 0x41, 0xcb, 0xc5, 0xf4, 0x91, 0xa3, 0xc9, 0xfe, 0xc8,
0x95, 0xfb, 0xa9, 0x65, 0x74, 0x50, 0x19, 0x93, 0xc0, 0xda, 0x4f, 0xce, 0x53, 0x81, 0x2f, 0xd8,
0x76, 0xc0, 0xdc, 0x84, 0xdb, 0xca, 0x11, 0xf9, 0x7c, 0xde, 0x69, 0x2f, 0x8e, 0xe0, 0x47, 0x2e,
0x2c, 0xeb, 0x6a, 0xa7, 0xbb, 0xfc, 0x09, 0x51, 0x54, 0x14, 0x54, 0x59, 0x6a, 0x43, 0xf8, 0x8c,
0x77, 0x7b, 0xb5, 0x2c, 0x0f, 0x5b, 0xab, 0x5f, 0xfd, 0xbf, 0x9e, 0xfb, 0x57, 0x98, 0x7d, 0x7e,
0x15, 0x93, 0x2f, 0x25, 0xfd, 0x36, 0xfb, 0x8f, 0x33, 0xfb, 0xe7, 0xaa, 0x3a, 0xfc, 0x91, 0xbf,
0xc3, 0x62, 0xd7, 0x47, 0x5e, 0x4d, 0xcc, 0x56, 0x5f, 0x02, 0x88, 0x45, 0x83, 0xe8, 0xe9, 0x0f,
0x7b, 0x9f, 0x7a, 0x1d, 0x54, 0x6a, 0xda, 0x4b, 0xa8, 0xb5, 0x59, 0xe1, 0xba, 0x8b, 0xe5, 0xe1,
0x11, 0xdc, 0x7d, 0xc1, 0xa1, 0x9f, 0x9c, 0x11, 0x55, 0x84, 0xfa, 0x3b, 0xdc, 0xf9, 0xa6, 0x7e,
0x57, 0x7b, 0x31, 0xad, 0x89, 0x34, 0x4c, 0x23, 0x06, 0x3c, 0x59, 0xf1, 0xa4, 0xfd, 0x5a, 0xc1,
0xfa, 0x1b, 0x08, 0xfe, 0xa1, 0x93, 0x16, 0xe2, 0x20, 0xc6, 0xef, 0xe4, 0x0a, 0x69, 0xd9, 0x57,
0x4c, 0x92, 0xf0, 0x5b, 0x52, 0xc6, 0xd2, 0xa4, 0x3f, 0x85, 0xb8, 0x3e, 0x2b, 0xa9, 0x20, 0x53,
0xbe, 0x24, 0x92, 0x7e, 0xcf, 0xd5, 0x87, 0xd2, 0x4b, 0x69, 0x79, 0xa7, 0x33, 0x6d, 0x04, 0xaf,
0xbd, 0x79, 0x0e, 0x09, 0x13, 0xe5, 0x73, 0x97, 0x65, 0x47, 0x47, 0x5b, 0xf1, 0xaf, 0x61, 0x85,
0xe4, 0xce, 0xa0, 0xb6, 0x13, 0x87, 0x75, 0xd1, 0xd2, 0x22, 0x9e, 0x4e, 0x8c, 0xcd, 0xce, 0xa0,
0x91, 0x2c, 0x8d, 0xca, 0x17, 0x45, 0xad, 0xad, 0xb5, 0x87, 0x52, 0x93, 0x1e, 0xd4, 0xad, 0x61,
0x4b, 0x06, 0xf4, 0x27, 0xbc, 0x71, 0x1d, 0x57, 0xe3, 0x78, 0xb9, 0x84, 0xb0, 0x93, 0xb0, 0x94,
0x3e, 0x1d, 0xda, 0xad, 0x3e, 0xe1, 0x58, 0x6e, 0x45, 0x3e, 0xb7, 0x7d, 0xc1, 0xdd, 0x95, 0x2b,
0x71, 0x35, 0xdb, 0x9f, 0xd4, 0x36, 0x42, 0x06, 0x14, 0x24, 0x95, 0x05, 0x66, 0x4b, 0xed, 0x7c,
0x4e, 0x83, 0x24, 0x45, 0x96, 0x15, 0x7e, 0x24, 0x5d, 0xdd, 0xd6, 0xb4, 0x37, 0x64, 0x3b, 0x75,
0xb9, 0x01, 0xdc, 0xcb, 0xb5, 0x19, 0x2c, 0x11, 0xd7, 0x20, 0xcd, 0xc0, 0x02, 0xec, 0xe7, 0x46,
0x64, 0x5c, 0x08, 0xff, 0x42, 0x1c, 0xca, 0x74, 0x67, 0x75, 0xc1, 0xb7, 0xb7, 0xc9, 0x5b, 0xea,
0xb1, 0x3e, 0xf1, 0x1c, 0x0e, 0x3f, 0xe8, 0x5d, 0x9f, 0xdc, 0x50, 0xb7, 0x4f, 0x62, 0xee, 0x44,
0xaf, 0xa8, 0x05, 0x0e, 0xae, 0x4f, 0x6c, 0x66, 0x81, 0xbf, 0x75, 0x43, 0x75, 0xb5, 0xbf, 0x38,
0x8f, 0x8e, 0x8c, 0x5a, 0xd0, 0xc2, 0x81, 0x75, 0x18, 0xcc, 0x69, 0x62, 0x26, 0xb5, 0xc4, 0x1f,
0x3a, 0x89, 0xd7, 0x3f, 0x52, 0x0d, 0x13, 0xb0, 0x66, 0x43, 0x63, 0xdc, 0x87, 0x48, 0x04, 0x7e,
0x81, 0xff, 0x87, 0xf2, 0x5f, 0x87, 0x1c, 0xa0, 0x99, 0x2b, 0xf5, 0xc3, 0x3a, 0xd3, 0x7e, 0x0d,
0xe6, 0x04, 0x83, 0x00, 0xf2, 0x9a, 0x3a, 0x68, 0x1d, 0x11, 0x02, 0xd0, 0x76, 0x17, 0x60, 0x0a,
0x2a, 0xeb, 0x72, 0xad, 0x82, 0xf3, 0x91, 0x1f, 0x73, 0x9b, 0x4c, 0xb0, 0x2f, 0x95, 0x42, 0x16,
0x25, 0xfc, 0xc8, 0xaf, 0xbd, 0xed, 0xab, 0x32, 0x74, 0xd6, 0x40, 0xab, 0x7f, 0xc8, 0x3b, 0x6c,
0x92, 0x01, 0xe3, 0x40, 0x02, 0x0d, 0x8c, 0xe7, 0x09, 0xf8, 0x00, 0xc7, 0xfd, 0x6f, 0x85, 0x98,
0xef, 0xa7, 0xd5, 0x23, 0x9d, 0xd2, 0x3b, 0x22, 0xd1, 0x40, 0xda, 0xf3, 0x77, 0xa7, 0xc0, 0x3a,
0xc2, 0x91, 0x43, 0x54, 0x07, 0x3f, 0x47, 0xf2, 0xe7, 0x50, 0xe1, 0x2a, 0xd4, 0x62, 0xab, 0xad,
0x1e, 0x37, 0x09, 0xcc, 0x0f, 0xd1, 0x97, 0xe5, 0x04, 0x1d, 0x6b, 0x04, 0xd5, 0x34, 0xe0, 0xea,
0x71, 0x55, 0xb2, 0xd7, 0x1e, 0x56, 0xba, 0xd3, 0x5a, 0x54, 0xd8, 0x04, 0x57, 0x09, 0x6a, 0xb8,
0x80, 0x1d, 0x2e, 0x05, 0xc5, 0x4e, 0x5d, 0x1d, 0xe8, 0xf4, 0x51, 0xe3, 0x8e, 0x24, 0x6e, 0xc8,
0x2c, 0x8d, 0x91, 0xee, 0x92, 0xf6, 0x31, 0xc8, 0x0a, 0x6e, 0xaa, 0x85, 0xe7, 0x28, 0x39, 0xa5,
0x0f, 0x83, 0xe9, 0xa7, 0xcb, 0x6b, 0x56, 0x0c, 0xd0, 0x32, 0x6b, 0xb8, 0x76, 0x80, 0xf6, 0x28,
0x8a, 0x56, 0x42, 0x2c, 0x51, 0xf5, 0x1a, 0xf1, 0x0f, 0x6c, 0x11, 0x2f, 0xaf, 0xf2, 0xe1, 0xf4,
0x47, 0x12, 0x89, 0xfc, 0x95, 0x11, 0x5c, 0x91, 0x5d, 0xe6, 0xfc, 0xc5, 0x9d, 0xe9, 0xfa, 0xa1,
0x8d, 0xe0, 0xbf, 0x21, 0xdc, 0xd1, 0x15, 0x84, 0x7b, 0xcb, 0x13, 0x9d, 0xa4, 0xf3, 0xfd, 0x2b,
0x18, 0xff, 0xb4, 0xbf, 0xe8, 0x70, 0x9b, 0xdd, 0xf5, 0x0c, 0x5c, 0x2d, 0xe4, 0x05, 0xfa, 0xbb,
0x90, 0xc9, 0xa3, 0x45, 0x5d, 0xd5, 0x0c, 0xff, 0x3e, 0x27, 0xe7, 0xee, 0x14, 0xe8, 0xc4, 0x2b,
0xe7, 0x8e, 0xd9, 0xdd, 0xec, 0xea, 0x78, 0xda, 0x23, 0x4f, 0x72, 0x54, 0x7b, 0xd3, 0x35, 0x03,
0x9a, 0x15, 0xc6, 0xfa, 0x0e, 0x32, 0xb5, 0x90, 0xd9, 0x2d, 0x46, 0x2b, 0xcb, 0xfa, 0xbe, 0x62,
0xeb, 0xad, 0x40, 0x9f, 0x9d, 0xcb, 0xfe, 0x90, 0x0d, 0xe9, 0xd9, 0x74, 0x0a, 0xba, 0x91, 0x0a,
0x59, 0x09, 0xa0, 0x74, 0x3c, 0x71, 0x29, 0xcf, 0xc3, 0x27, 0x0e, 0x01, 0x1f, 0x61, 0xdf, 0xe2,
0x92, 0xf9, 0x7b, 0x37, 0xed, 0xa7, 0xb0, 0x8e, 0xb9, 0xe5, 0x5e, 0x3d, 0x10, 0x92, 0xec, 0x8c,
0x4f, 0xb0, 0x0f, 0x1e, 0x3d, 0x74, 0xcf, 0xbd, 0xcd, 0x59, 0x63, 0xc2, 0xd2, 0x0a, 0x4f, 0xc5,
0x86, 0xad, 0x72, 0xbe, 0xb8, 0xd4, 0x6a, 0xce, 0x3d, 0x09, 0xdf, 0xe7, 0xd4, 0xd7, 0xce, 0xb2,
0x26, 0x8f, 0x91, 0x9c, 0xc2, 0xaa, 0xf4, 0x3d, 0x2b, 0x67, 0xce, 0x72, 0xad, 0xac, 0x87, 0xad,
0xa2, 0x08, 0xc5, 0xde, 0xb4, 0x5e, 0x02, 0xcb, 0x15, 0x21, 0x5b, 0x26, 0x42, 0x41, 0x01, 0x15,
0x09, 0xb2, 0x13, 0xd9, 0x89, 0x00, 0x0a, 0x3a, 0xdf, 0x9d, 0x97, 0x6f, 0xcb, 0xa6, 0xcf, 0xdc,
0x2a, 0x65, 0x40, 0x9d, 0x77, 0x81, 0xb0, 0xc0, 0xd8, 0xc0, 0xc6, 0x37, 0x0c, 0xa3, 0x93, 0x6b,
0xa9, 0x81, 0x68, 0xef, 0x84, 0xeb, 0x58, 0xf7, 0xfb, 0x10, 0xd6, 0xf9, 0xb1, 0x6f, 0xbc, 0x15,
0x07, 0x71, 0x24, 0x8e, 0xf0, 0xc6, 0x56, 0x6e, 0xbf, 0xe0, 0x6b, 0x65, 0x05, 0x19, 0x67, 0xc2,
0xc2, 0x9c, 0x5a, 0x5e, 0x5b, 0x5c, 0xbc, 0x55, 0x1e, 0x49, 0xa5, 0x27, 0x86, 0xfc, 0x46, 0x9e,
0xe6, 0x5b, 0x4c, 0x77, 0x8b, 0x77, 0x73, 0xf1, 0x73, 0xbf, 0x20, 0x55, 0xc9, 0x37, 0xd9, 0x26,
0x23, 0xa0, 0xcf, 0xbe, 0x2c, 0x28, 0x15, 0x59, 0xfe, 0x85, 0xe0, 0xc5, 0x2d, 0x18, 0xda, 0x1c,
0x0d, 0xe9, 0x21, 0x2d, 0xdb, 0x8b, 0xa5, 0x39, 0x13, 0x6e, 0x25, 0x30, 0x33, 0x90, 0x99, 0x80,
0xb5, 0xd9, 0x27, 0x37, 0x4e, 0xe8, 0x80, 0xba, 0xeb, 0x57, 0x9e, 0x56, 0xeb, 0xa5, 0x52, 0x7d,
0x36, 0x89, 0x11, 0xe5, 0x36, 0x76, 0xba, 0x64, 0x21, 0x12, 0x54, 0x95, 0x2c, 0x87, 0xb3, 0x6b,
0xf2, 0x57, 0xfa, 0xfb, 0x11, 0x88, 0x98, 0x33, 0x3a, 0xcb, 0xf4, 0xbc, 0xf0, 0x95, 0xa8, 0x9f,
0xb4, 0xe3, 0x94, 0xd3, 0xa7, 0xcb, 0x66, 0xba, 0xcb, 0x9a, 0x59, 0x96, 0xf3, 0x7b, 0xc6, 0x8f,
0x43, 0x8b, 0xfa, 0xac, 0xb2, 0x5a, 0x64, 0xb1, 0x3c, 0xd7, 0xa5, 0x57, 0xaf, 0xad, 0xa1, 0xaa,
0x72, 0x15, 0xd3, 0xea, 0x94, 0x68, 0xb3, 0xb3, 0xfc, 0x2b, 0xcd, 0x9a, 0x89, 0xbf, 0x07, 0xe3,
0xb4, 0x64, 0x0d, 0xac, 0xd2, 0xbf, 0xd5, 0x4e, 0xf5, 0x27, 0xe8, 0xc5, 0xfe, 0x6b, 0x26, 0x3f,
0x55, 0x23, 0x7e, 0x03, 0x03, 0x76, 0xac, 0x9a, 0x5e, 0xec, 0x6f, 0x35, 0xbd, 0xd8, 0xdb, 0x80,
0x4a, 0xb7, 0x93, 0xd0, 0xbe, 0x17, 0x81, 0xfd, 0x1e, 0x2e, 0xd5, 0x35, 0x64, 0x2f, 0xae, 0x1c,
0x79, 0xca, 0x61, 0x2e, 0x60, 0x1f, 0x43, 0x04, 0x47, 0x42, 0xdf, 0xc1, 0x13, 0x7e, 0xf2, 0x14,
0x44, 0xe5, 0x90, 0x44, 0x87, 0x3c, 0xa9, 0xb1, 0xf4, 0x9d, 0xec, 0xfc, 0x04, 0x87, 0x8c, 0x04,
0xc1, 0x10, 0x98, 0x4b, 0x9c, 0x5b, 0x7a, 0x6f, 0x74, 0x6a, 0x4d, 0x71, 0xee, 0x0d, 0xce, 0x03,
0xcb, 0x62, 0x7e, 0x54, 0x0d, 0x77, 0x64, 0x68, 0x53, 0x39, 0x1c, 0xd1, 0xd3, 0x1e, 0x3a, 0x29,
0xbc, 0xef, 0xb0, 0xc4, 0x99, 0x34, 0x1d, 0x2c, 0x2a, 0x7c, 0x69, 0x3e, 0x50, 0xf1, 0x58, 0x87,
0x2a, 0x36, 0x3c, 0x58, 0xb1, 0xc1, 0x01, 0x8b, 0xe6, 0x83, 0x16, 0xe9, 0x47, 0x73, 0x40, 0xa5,
0xfa, 0x6a, 0x15, 0xaf, 0xd5, 0x68, 0xfb, 0xf9, 0x49, 0x94, 0x67, 0x28, 0xcd, 0x49, 0x8b, 0xf1,
0x52, 0xc4, 0x80, 0xdf, 0xed, 0x84, 0x8e, 0x39, 0x07, 0x31, 0x4c, 0x39, 0x1e, 0x50, 0xe8, 0xd8,
0xd8, 0xeb, 0x13, 0x1e, 0xbb, 0x6e, 0x6f, 0x19, 0xc2, 0x09, 0x8f, 0x24, 0xbb, 0x54, 0x8b, 0xe9,
0x0b, 0x57, 0xe6, 0xdb, 0xcf, 0x57, 0xe4, 0xce, 0x3d, 0xff, 0xf6, 0x8a, 0x31, 0xd7, 0xb4, 0x1d,
0x65, 0xc6, 0x3a, 0xb2, 0x08, 0xa0, 0x85, 0x59, 0x86, 0x79, 0xcc, 0x63, 0x4f, 0x22, 0x62, 0x6d,
0x9c, 0x05, 0xf7, 0x66, 0x74, 0xef, 0x27, 0xa5, 0x85, 0x56, 0x23, 0x4a, 0xd9, 0xc1, 0xfe, 0xbb,
0x38, 0xa6, 0xe1, 0x6e, 0xfb, 0x41, 0xa5, 0x18, 0x14, 0x8b, 0x42, 0xc3, 0xd1, 0x60, 0x9d, 0xf1,
0xa4, 0x70, 0x8b, 0x92, 0x97, 0xe9, 0xd1, 0x3b, 0x80, 0xdb, 0x79, 0x3e, 0x68, 0x29, 0x50, 0x0e,
0x41, 0x16, 0xc5, 0x9e, 0xd6, 0x48, 0xd4, 0x08, 0xe1, 0xf0, 0xb2, 0x1c, 0x83, 0xcd, 0x40, 0x12,
0x51, 0xd6, 0x40, 0xa1, 0x97, 0x61, 0x49, 0x96, 0xdd, 0xe7, 0x1b, 0xaa, 0x18, 0xa4, 0x31, 0x6f,
0xa4, 0x44, 0x6b, 0xa8, 0x06, 0x64, 0x48, 0x98, 0x9f, 0xb5, 0x67, 0x5e, 0x2c, 0xb7, 0x38, 0x52,
0xb5, 0x43, 0x1c, 0xce, 0xb3, 0x95, 0xf7, 0xa1, 0x1e, 0x88, 0x71, 0xac, 0x54, 0xee, 0x8e, 0x36,
0x53, 0x0a, 0x24, 0x09, 0x7e, 0xb2, 0xc1, 0x53, 0xc9, 0x7e, 0x68, 0x3f, 0xc0, 0x1c, 0x8a, 0x12,
0x6b, 0x38, 0x18, 0xaf, 0x07, 0x42, 0xc1, 0xb1, 0x81, 0xa9, 0x60, 0x56, 0xdd, 0xae, 0x5e, 0x15,
0x0f, 0x42, 0x37, 0x73, 0x26, 0x7b, 0x71, 0xb8, 0x8a, 0x57, 0x5e, 0x81, 0xca, 0xc2, 0x20, 0x73,
0xc8, 0x78, 0x08, 0xe3, 0x91, 0x3d, 0x0a, 0x58, 0x32, 0x2d, 0x87, 0x83, 0x08, 0x98, 0xfd, 0xb8,
0x42, 0xf8, 0x26, 0x16, 0x5f, 0x41, 0x8c, 0xf1, 0x60, 0x0d, 0x90, 0xd0, 0x55, 0xc5, 0xdb, 0x3e,
0xd9, 0x5b, 0x7d, 0x14, 0x87, 0x42, 0xb8, 0x09, 0x3b, 0xc5, 0xbf, 0x18, 0x63, 0x5e, 0x41, 0x40,
0xb7, 0x28, 0xab, 0xcb, 0x6a, 0x69, 0x6b, 0x41, 0xfc, 0x2b, 0x1a, 0x32, 0x13, 0x62, 0xb5, 0x08,
0x5f, 0xbf, 0x81, 0xed, 0x90, 0x88, 0x35, 0xdc, 0x1b, 0x0c, 0xd6, 0xb7, 0xe5, 0x5e, 0xb2, 0x6c,
0xe4, 0xe4, 0xa3, 0xca, 0x53, 0x93, 0xbe, 0xdb, 0xc6, 0xa4, 0x7b, 0xe6, 0x15, 0x75, 0x41, 0x51,
0x77, 0x51, 0x40, 0x93, 0x21, 0x87, 0x75, 0x18, 0xcd, 0x9f, 0x9a, 0x60, 0x26, 0x5c, 0x04, 0x33,
0x1a, 0x8f, 0x5f, 0x1b, 0xd1, 0xa4, 0xec, 0x18, 0xd3, 0x50, 0xeb, 0x3a, 0xfd, 0x4b, 0x1b, 0xdd,
0x5f, 0x26, 0x51, 0x00, 0x81, 0xdf, 0x9a, 0xe1, 0xcd, 0x7b, 0xac, 0x24, 0xb5, 0x8d, 0x6f, 0x64,
0xf9, 0xe9, 0x2b, 0x0e, 0x70, 0xb6, 0xb7, 0x21, 0x25, 0x0a, 0x1d, 0xcc, 0xeb, 0x2c, 0x06, 0x19,
0x07, 0x1e, 0x33, 0xb6, 0x63, 0x4b, 0x7e, 0xad, 0xe7, 0x92, 0x1d, 0x2a, 0x37, 0x77, 0xe4, 0xdd,
0x63, 0x14, 0xe3, 0xef, 0xf3, 0x37, 0x87, 0x2e, 0x9e, 0xaf, 0xe4, 0x73, 0xed, 0xa1, 0x77, 0x9c,
0xd0, 0xc0, 0xcd, 0x1f, 0xb4, 0x27, 0x7f, 0xfd, 0x05, 0x40, 0x1f, 0x06, 0x53, 0xf2, 0x13, 0x19,
0x32, 0xf0, 0x68, 0xed, 0xa6, 0xec, 0x54, 0x3d, 0x96, 0x9c, 0xbf, 0x59, 0x3e, 0x53, 0x89, 0x88,
0x78, 0x00, 0x45, 0x3f, 0xdc, 0xaf, 0x63, 0xc2, 0x40, 0x5b, 0x43, 0xac, 0x90, 0xaa, 0xff, 0xbf,
0x47, 0xad, 0xed, 0xad, 0x6d, 0xc8, 0x95, 0x8d, 0xc0, 0xc8, 0x51, 0x4e, 0xc2, 0x1a, 0xd6, 0x4b,
0x21, 0xb8, 0x0a, 0x61, 0x38, 0x5d, 0x66, 0x18, 0xca, 0x6b, 0xef, 0x95, 0x1b, 0xdf, 0x11, 0xd7,
0xe1, 0xd7, 0x30, 0xa9, 0xcd, 0xcb, 0x2d, 0x21, 0xaa, 0xae, 0xb9, 0x37, 0xea, 0xc6, 0x59, 0xe2,
0x14, 0x4a, 0x0b, 0x30, 0x69, 0x5f, 0xa9, 0x26, 0xde, 0xc0, 0xd8, 0x59, 0x8c, 0x54, 0x8a, 0x5b,
0x5d, 0x9e, 0xe9, 0x63, 0x7e, 0x7a, 0xb1, 0xc9, 0x7a, 0x94, 0xc3, 0x4a, 0x04, 0x5b, 0x7d, 0x65,
0xce, 0x72, 0xca, 0xf8, 0x3a, 0x16, 0x63, 0xde, 0x38, 0xcb, 0x07, 0x4e, 0x22, 0xe1, 0x2f, 0x34,
0x8f, 0x7e, 0x19, 0x9d, 0x6b, 0x6f, 0xc3, 0xf5, 0x89, 0x7a, 0x31, 0x17, 0x7a, 0x49, 0x35, 0xb4,
0xd4, 0x37, 0xc2, 0xf2, 0x3a, 0xa2, 0xae, 0x15, 0xbb, 0x80, 0x4c, 0xd2, 0xbf, 0xf4, 0x63, 0xa9,
0x3f, 0x0c, 0xe8, 0xb2, 0x40, 0xee, 0x7e, 0x71, 0x19, 0xb2, 0xe0, 0x06, 0xbe, 0x60, 0xd3, 0x39,
0x6c, 0x15, 0x84, 0x24, 0x9c, 0xaa, 0x13, 0xde, 0x27, 0xdd, 0xa1, 0x31, 0x60, 0x4f, 0x77, 0xc8,
0x76, 0xb6, 0x86, 0xbe, 0x4f, 0x45, 0x05, 0x47, 0x84, 0x1b, 0x55, 0x1b, 0x97, 0xca, 0x77, 0xc5,
0x2c, 0xf5, 0x77, 0xcb, 0xca, 0x5b, 0x59, 0xbe, 0x04, 0x7c, 0xab, 0xfe, 0xa6, 0x18, 0x00, 0x47,
0x56, 0x1b, 0x01, 0xd3, 0x28, 0xff, 0xda, 0x4f, 0x37, 0x27, 0x08, 0x71, 0x79, 0xbb, 0xc6, 0x1e,
0x5f, 0x20, 0x39, 0xa9, 0xa1, 0xa8, 0x45, 0x2a, 0x4f, 0xc0, 0x05, 0x84, 0x1f, 0x0c, 0x1c, 0x22,
0x2c, 0xef, 0xe6, 0xed, 0x1d, 0xa9, 0xb9, 0xce, 0x6d, 0x6f, 0x59, 0xe7, 0x90, 0x0d, 0xb7, 0xb0,
0xec, 0x54, 0x8c, 0x2c, 0x2e, 0x5e, 0x3d, 0x62, 0x93, 0x3c, 0x96, 0xf0, 0xfc, 0x35, 0xe3, 0xb4,
0x05, 0x3f, 0x64, 0x0b, 0x10, 0xb0, 0xe1, 0x57, 0xfc, 0xb3, 0x22, 0x4a, 0x8c, 0x55, 0x74, 0xf1,
0x33, 0x84, 0x52, 0x24, 0xa2, 0xf9, 0x62, 0xac, 0x56, 0x15, 0x18, 0x72, 0x55, 0xcd, 0x1c, 0x72,
0xbf, 0x12, 0x56, 0xd5, 0xbc, 0x8d, 0x07, 0x55, 0x2b, 0x86, 0x10, 0x38, 0x4d, 0x4b, 0x5e, 0xb3,
0x6a, 0xb0, 0x60, 0x52, 0xd8, 0x89, 0x0c, 0xd5, 0xc3, 0xd5, 0x2d, 0x98, 0x14, 0x3d, 0x6c, 0xe4,
0xfa, 0xf2, 0x0b, 0x3c, 0x32, 0xf2, 0xc5, 0x19, 0x97, 0xb1, 0xaf, 0x9c, 0x30, 0xd3, 0x1c, 0xc0,
0x5c, 0x4b, 0xad, 0x0e, 0xa7, 0x6d, 0x02, 0xe8, 0x32, 0xcc, 0x30, 0x85, 0x19, 0x6d, 0x04, 0x33,
0x4a, 0x61, 0x76, 0x36, 0x82, 0xd9, 0x49, 0x61, 0x76, 0x37, 0x82, 0xd9, 0x4d, 0x61, 0xc6, 0x1b,
0xc1, 0x8c, 0x53, 0x98, 0xbd, 0x8d, 0x60, 0xf6, 0x52, 0x98, 0x67, 0x1b, 0xc1, 0x3c, 0x4b, 0x61,
0x9e, 0x4f, 0x97, 0x67, 0x61, 0xdf, 0xf2, 0x99, 0x2f, 0x65, 0x3f, 0x2f, 0x7b, 0x60, 0xe9, 0x61,
0x2b, 0xbf, 0xe2, 0x59, 0xec, 0x1d, 0xe9, 0xde, 0xf0, 0xc4, 0x3f, 0x7e, 0xf4, 0x9d, 0xe6, 0x86,
0x7a, 0x79, 0x75, 0xd9, 0x9b, 0x83, 0xf5, 0x5d, 0xb8, 0xdc, 0x3b, 0x13, 0xff, 0x9c, 0x36, 0x9c,
0x1c, 0xd4, 0xb7, 0x3e, 0xdc, 0xd7, 0xd2, 0x87, 0x53, 0x7f, 0xdf, 0xe2, 0x4b, 0x68, 0xc4, 0x7d,
0x6b, 0x98, 0xb5, 0xb2, 0xbf, 0xdf, 0x6a, 0x45, 0x5f, 0x50, 0xad, 0xe8, 0x5b, 0x1d, 0xe8, 0xef,
0xac, 0x03, 0x8d, 0x72, 0x65, 0xa0, 0xd1, 0x3f, 0xba, 0x0c, 0xf4, 0xb9, 0x3a, 0xe0, 0x1b, 0x57,
0x68, 0x96, 0x97, 0x8f, 0xc6, 0xcd, 0xe5, 0xa3, 0xaf, 0xac, 0xc4, 0xb3, 0xf7, 0xad, 0xc4, 0xf3,
0x0f, 0x2e, 0xf1, 0x7c, 0xcb, 0x02, 0x3f, 0x8b, 0x41, 0xda, 0x24, 0x83, 0xcb, 0xa5, 0x1d, 0x8f,
0x96, 0xc2, 0x3d, 0x6c, 0xfd, 0x0f, 0x28, 0x5f, 0x0e, 0x1a,
uint8_t data_qml_app[4375] = {
0x00, 0x00, 0x6b, 0xac, 0x78, 0xda, 0xed, 0x5c, 0x6d, 0x53, 0xdb, 0x48, 0x12, 0xfe, 0xce, 0xaf,
0x98, 0xf5, 0xd5, 0x55, 0xd9, 0x1b, 0x47, 0xd8, 0x06, 0x93, 0x1c, 0x7b, 0xa9, 0x2b, 0xde, 0x92,
0xa5, 0x2e, 0x04, 0x16, 0xb3, 0x9b, 0x0f, 0x09, 0xa5, 0x12, 0xd2, 0xd8, 0x56, 0x21, 0xcd, 0xe8,
0xf4, 0x82, 0x61, 0x77, 0xf9, 0xef, 0xd7, 0x3d, 0x23, 0xd9, 0x23, 0x69, 0x24, 0x5b, 0x36, 0xe4,
0x92, 0xbd, 0x50, 0x29, 0x82, 0xa5, 0xee, 0x47, 0x3d, 0x3d, 0x33, 0xfd, 0x3a, 0xb2, 0xeb, 0x07,
0x3c, 0x8c, 0xc9, 0x6f, 0xd4, 0x71, 0x68, 0x68, 0xdc, 0xd1, 0xc8, 0x16, 0xbf, 0x5c, 0x16, 0xd3,
0x70, 0x6c, 0xd9, 0x94, 0xf4, 0x8d, 0xde, 0x4f, 0xae, 0x24, 0x6a, 0xfd, 0x27, 0xb4, 0xf7, 0xb7,
0x7d, 0x7e, 0xe3, 0x7a, 0xb4, 0x95, 0x5d, 0xfc, 0x25, 0xfe, 0x25, 0x71, 0xed, 0x5b, 0x32, 0x30,
0x86, 0x5b, 0xf9, 0x4b, 0xc6, 0x11, 0x67, 0x71, 0xc8, 0xbd, 0x08, 0xee, 0x0d, 0x8a, 0xf7, 0xde,
0x5b, 0x0f, 0x3c, 0x89, 0x23, 0x80, 0xdf, 0xd9, 0xca, 0xee, 0xa9, 0x42, 0xd8, 0xdc, 0xf7, 0x2d,
0xe6, 0x20, 0x41, 0x4f, 0x7f, 0x9f, 0x8d, 0xdd, 0x49, 0x60, 0x85, 0x96, 0x5f, 0x49, 0x93, 0xc4,
0xae, 0xe7, 0xc6, 0x0f, 0xe2, 0xf6, 0xd6, 0x69, 0x4c, 0x7d, 0xf2, 0xc7, 0x16, 0x81, 0x1f, 0xd7,
0xd9, 0x27, 0xc0, 0x1f, 0x5b, 0x2e, 0xa3, 0xa1, 0xb8, 0x62, 0x31, 0x7b, 0xca, 0xc3, 0xc8, 0x18,
0xbb, 0x9e, 0xb7, 0x4f, 0x00, 0x95, 0xb2, 0x38, 0x77, 0xc3, 0xb7, 0xc2, 0x89, 0xcb, 0xa2, 0x7d,
0xd2, 0xef, 0x89, 0xeb, 0xe2, 0x57, 0x10, 0xf2, 0x80, 0x86, 0xf0, 0x80, 0xa3, 0x4c, 0x58, 0x3f,
0xfb, 0x6b, 0x1f, 0x04, 0x89, 0xec, 0xd3, 0xf1, 0x7c, 0x1c, 0xed, 0x4e, 0x91, 0x05, 0xe5, 0xbf,
0x90, 0xf2, 0xfb, 0x67, 0x36, 0x7e, 0x9e, 0x33, 0xf9, 0xb6, 0xbc, 0x5d, 0xcf, 0x74, 0x10, 0x04,
0x39, 0x2e, 0x4b, 0x7e, 0x2e, 0xb3, 0xdd, 0x59, 0x21, 0xb1, 0x2d, 0x76, 0x4c, 0xef, 0x40, 0xae,
0x4f, 0xd7, 0x9a, 0x01, 0xdc, 0x70, 0xee, 0x91, 0x90, 0x5a, 0xce, 0x88, 0xc6, 0xb1, 0xcb, 0x26,
0xd1, 0x31, 0x67, 0x74, 0x9f, 0x8c, 0x2d, 0x2f, 0xa2, 0x65, 0x2c, 0x1a, 0x9a, 0x7e, 0x34, 0x99,
0x43, 0x15, 0xef, 0x45, 0x34, 0xae, 0xbc, 0xe7, 0xf2, 0xbc, 0x04, 0xa0, 0xaf, 0x00, 0x1e, 0xc5,
0x62, 0x83, 0x33, 0xfc, 0xdb, 0xa3, 0x31, 0x85, 0xd9, 0xf9, 0x83, 0xa4, 0x3f, 0x5b, 0xd9, 0x1f,
0xf2, 0x99, 0xc6, 0xc9, 0xa5, 0x79, 0x36, 0x7a, 0x67, 0x8e, 0x4e, 0xae, 0xcc, 0xb3, 0xf3, 0xe3,
0x13, 0xf3, 0xe2, 0xe0, 0xf2, 0xe0, 0x6c, 0x44, 0xde, 0x90, 0x5e, 0x05, 0xe5, 0xbb, 0x12, 0x65,
0xbf, 0x86, 0xf2, 0xf4, 0x1c, 0x08, 0x06, 0x15, 0x04, 0x97, 0x27, 0xa3, 0xab, 0xf3, 0xcb, 0x13,
0x7c, 0xf8, 0xd5, 0xe9, 0x87, 0x77, 0x88, 0xb5, 0x53, 0x2b, 0x1f, 0x50, 0x8f, 0xcc, 0x93, 0x0f,
0x07, 0x87, 0xef, 0x4f, 0x8e, 0x81, 0x78, 0xb7, 0x86, 0xf8, 0xe2, 0xe4, 0xf8, 0xe0, 0xbd, 0x79,
0x05, 0x4f, 0x10, 0xd2, 0x02, 0xf5, 0x70, 0x4b, 0xa7, 0x03, 0xd0, 0xad, 0x11, 0x98, 0xf1, 0x34,
0xe4, 0x71, 0xec, 0x51, 0x73, 0xfa, 0x10, 0xc5, 0x38, 0x78, 0xa3, 0xb7, 0x5b, 0xa6, 0x0a, 0xa8,
0x63, 0x79, 0xa6, 0x9d, 0x84, 0xb8, 0x9a, 0x71, 0x5c, 0x40, 0x56, 0xa6, 0x8a, 0x62, 0x2b, 0x8c,
0xcd, 0x09, 0xec, 0x05, 0x14, 0xb1, 0x9e, 0xc2, 0xa4, 0xcc, 0x31, 0xa3, 0x80, 0x52, 0x07, 0xf5,
0x38, 0xd4, 0x11, 0xc3, 0xa6, 0x0e, 0x92, 0xd8, 0x0c, 0xf8, 0x8c, 0x86, 0x48, 0xa4, 0xa3, 0x89,
0x79, 0x20, 0x51, 0x4c, 0x1a, 0x06, 0xbe, 0x90, 0xac, 0xa7, 0x21, 0xbb, 0x09, 0xad, 0x5b, 0x9a,
0xc9, 0x6f, 0x8e, 0x43, 0xce, 0xe4, 0x58, 0x87, 0xcb, 0x48, 0x61, 0x21, 0x87, 0xab, 0x51, 0xde,
0xf0, 0x78, 0x5a, 0x90, 0x52, 0x65, 0x71, 0xb9, 0xe1, 0x73, 0x87, 0x9a, 0x37, 0x31, 0x2a, 0x67,
0xb1, 0x1b, 0x16, 0xb7, 0x25, 0x5c, 0x26, 0x5b, 0x35, 0x45, 0x2a, 0x92, 0x8e, 0xe0, 0x16, 0x6c,
0x8e, 0x19, 0xcd, 0x2a, 0xee, 0x7a, 0xa8, 0x25, 0x9b, 0x9b, 0x9c, 0xd5, 0x10, 0x44, 0x68, 0xfa,
0xea, 0x49, 0x3c, 0x3e, 0x33, 0x6f, 0xac, 0x78, 0x09, 0xd5, 0xd8, 0x4a, 0xbc, 0x12, 0xc9, 0xe3,
0x62, 0xbb, 0x5e, 0xb9, 0x3e, 0x4c, 0xeb, 0x1f, 0x73, 0xce, 0x90, 0x06, 0xd4, 0x82, 0xdd, 0x1e,
0x87, 0xc9, 0x02, 0x4e, 0xf8, 0x8e, 0x3b, 0x0b, 0x0c, 0xe9, 0x40, 0x99, 0xd6, 0x30, 0x61, 0x0c,
0x2c, 0x4b, 0x81, 0x76, 0xfe, 0x07, 0x67, 0x57, 0xa1, 0x3b, 0x99, 0xd0, 0x50, 0x6c, 0xff, 0xf9,
0x65, 0xf9, 0x10, 0xcb, 0x39, 0xe5, 0xa9, 0x51, 0x5b, 0x08, 0xf4, 0xa8, 0x5a, 0x11, 0xc6, 0xa8,
0x1d, 0xbb, 0x9c, 0x45, 0x0a, 0x2f, 0x2c, 0xdb, 0x09, 0x9a, 0xa2, 0xb9, 0x51, 0xd6, 0x3d, 0xf5,
0x28, 0x89, 0x62, 0x8e, 0xa6, 0xf4, 0xd8, 0x8a, 0xad, 0x4b, 0x6a, 0x53, 0xf7, 0xae, 0x2c, 0x01,
0x1a, 0x2f, 0xe7, 0x0e, 0x94, 0xc2, 0xe8, 0x8c, 0x20, 0xe1, 0x6f, 0x2e, 0x9d, 0xb5, 0x1d, 0xf8,
0xa3, 0x4b, 0x7a, 0x9d, 0x12, 0xa9, 0xcb, 0x9c, 0x9c, 0x45, 0xca, 0xae, 0xdb, 0x3e, 0x5e, 0x77,
0xee, 0x0c, 0x10, 0xeb, 0x57, 0xd0, 0xd2, 0xeb, 0x36, 0x50, 0xbe, 0x78, 0x91, 0x07, 0xc8, 0x7d,
0x70, 0xc7, 0xa4, 0x2d, 0xb8, 0xde, 0xd4, 0x1b, 0xc0, 0x4e, 0x41, 0x60, 0xfc, 0x49, 0xbd, 0x02,
0xf5, 0xdd, 0x78, 0x14, 0x5b, 0x71, 0x12, 0x9d, 0xd1, 0x28, 0xb2, 0x26, 0xb4, 0xdd, 0x3a, 0xb9,
0x24, 0xa9, 0x0f, 0x01, 0x73, 0x4f, 0xce, 0xff, 0xdd, 0xea, 0x8a, 0x49, 0xc9, 0xcb, 0xf1, 0x48,
0x28, 0x2c, 0x80, 0x6a, 0x09, 0xde, 0x2d, 0x97, 0xa0, 0xd2, 0x5e, 0x49, 0x15, 0xbc, 0xf5, 0xb8,
0x15, 0xef, 0x0c, 0x50, 0x09, 0x9d, 0x9f, 0x84, 0xd2, 0x5e, 0xa8, 0x46, 0x72, 0xa9, 0x3d, 0x5b,
0x0f, 0x25, 0x67, 0xef, 0x36, 0x85, 0xc8, 0x19, 0xc4, 0xf5, 0xc0, 0x0a, 0x06, 0x73, 0x3d, 0x90,
0x92, 0x45, 0x5d, 0x0f, 0x46, 0x6f, 0x71, 0x9f, 0x02, 0x2b, 0xb5, 0x7f, 0x4f, 0x01, 0x95, 0xda,
0xec, 0x46, 0x50, 0xc5, 0xd0, 0x06, 0xf8, 0x73, 0x66, 0x28, 0xfb, 0x49, 0x02, 0xd8, 0xd4, 0x74,
0xe4, 0xb9, 0x10, 0x43, 0x46, 0xed, 0xe6, 0x1b, 0xe2, 0xf4, 0xbc, 0x62, 0x1f, 0xe4, 0x3d, 0x49,
0xc1, 0x04, 0x2c, 0x24, 0xef, 0x57, 0xf0, 0xe6, 0xdd, 0xcc, 0x9a, 0xec, 0xb9, 0x39, 0x68, 0xc0,
0xbd, 0x70, 0x50, 0x0d, 0x58, 0x2b, 0xb0, 0x72, 0xee, 0xac, 0xb1, 0x24, 0x05, 0x5f, 0xb7, 0x16,
0x7f, 0xde, 0x11, 0xae, 0x05, 0xa1, 0x78, 0xc9, 0x4d, 0x34, 0x22, 0x17, 0xdb, 0x29, 0x97, 0xd6,
0xb9, 0xe1, 0x6a, 0x2b, 0x47, 0x98, 0xba, 0x95, 0x87, 0xec, 0x65, 0x7f, 0xa3, 0xa3, 0x5c, 0xea,
0x31, 0xce, 0x78, 0x0c, 0x89, 0x10, 0x39, 0x61, 0xd6, 0x0d, 0xe8, 0x40, 0xeb, 0x32, 0x14, 0xb9,
0xd7, 0x7f, 0xc0, 0xb1, 0x1b, 0x2d, 0x79, 0x42, 0x63, 0x3d, 0x15, 0x82, 0xeb, 0xe7, 0x54, 0xd4,
0x05, 0xfa, 0x28, 0x72, 0x45, 0xc1, 0xcd, 0x3d, 0x93, 0xa6, 0x94, 0x27, 0x34, 0x55, 0x55, 0x75,
0x00, 0x35, 0x4e, 0x98, 0x08, 0x9f, 0x72, 0x86, 0xb2, 0xad, 0x0e, 0x1f, 0xe3, 0x97, 0x9b, 0x64,
0x3c, 0x16, 0x4e, 0x0a, 0xc3, 0xa0, 0x83, 0x30, 0xb4, 0x1e, 0x0e, 0xc5, 0x95, 0x76, 0xbf, 0xb3,
0x55, 0x1f, 0x2a, 0x49, 0xce, 0x3c, 0x55, 0x31, 0x4a, 0x02, 0xf5, 0x47, 0x39, 0xf5, 0x77, 0x97,
0x44, 0x1c, 0x73, 0xce, 0x79, 0x80, 0x07, 0x00, 0xcc, 0xc9, 0x45, 0x74, 0xb9, 0x27, 0xeb, 0x06,
0x3c, 0x0b, 0x5d, 0x30, 0xf8, 0xba, 0x11, 0xe3, 0x92, 0xf8, 0xa1, 0xe8, 0x38, 0x3a, 0xa5, 0xd8,
0x34, 0x4e, 0x42, 0xb6, 0x55, 0x56, 0xf1, 0x6a, 0x8a, 0xdb, 0x79, 0xf5, 0x0c, 0x9a, 0xeb, 0x2e,
0x89, 0x15, 0x35, 0x36, 0x4a, 0x22, 0x28, 0xce, 0xb4, 0x5b, 0x11, 0xbc, 0xe9, 0x9c, 0x6c, 0x1d,
0x73, 0x2e, 0x66, 0x6b, 0xca, 0xbc, 0x88, 0xb3, 0xd6, 0xe7, 0x5c, 0x44, 0x68, 0x4d, 0x31, 0xd4,
0xc0, 0xac, 0x29, 0x6f, 0x3e, 0x1e, 0x6b, 0xca, 0xad, 0x09, 0xc3, 0x36, 0x83, 0x40, 0xcf, 0xbf,
0x19, 0x02, 0x06, 0x5d, 0x3a, 0x84, 0x4d, 0xb6, 0x5e, 0x08, 0x36, 0x8c, 0x87, 0xf4, 0x6b, 0x35,
0x37, 0xc5, 0x72, 0x4f, 0xe7, 0x89, 0x06, 0x2d, 0x93, 0xd9, 0xaf, 0xcf, 0xb4, 0x42, 0xec, 0xfa,
0x24, 0x23, 0x84, 0x27, 0x49, 0x57, 0x9e, 0x3a, 0xc0, 0x36, 0x95, 0xff, 0xaf, 0x3c, 0xe4, 0xc1,
0x17, 0x19, 0xb2, 0x26, 0x80, 0xaa, 0x65, 0x4e, 0x07, 0xf1, 0x54, 0x2a, 0x12, 0x6e, 0x1c, 0xbd,
0xf8, 0x19, 0xa4, 0x05, 0x5f, 0xb1, 0x8a, 0x8a, 0xb1, 0xd3, 0x17, 0xd3, 0x51, 0x21, 0x15, 0xcb,
0x17, 0x9d, 0xd2, 0xcb, 0x06, 0xf8, 0x6e, 0xff, 0x20, 0x6e, 0xf7, 0x3a, 0xc6, 0x9d, 0xe5, 0x25,
0x98, 0xd6, 0xe9, 0x3d, 0x4f, 0x0d, 0x6f, 0x5f, 0xc3, 0xbb, 0x70, 0x1f, 0x35, 0x8c, 0x83, 0x5a,
0xc6, 0x85, 0xdf, 0xa9, 0x81, 0xd8, 0xd1, 0x40, 0xa8, 0x6e, 0xa7, 0x86, 0x75, 0x57, 0xc3, 0x9a,
0xf7, 0x3a, 0x35, 0xcc, 0x43, 0x0d, 0xb3, 0xc6, 0xe9, 0xd4, 0x20, 0xec, 0x2d, 0x45, 0x40, 0x9f,
0x53, 0x03, 0xf0, 0x6a, 0x29, 0x00, 0xba, 0x9c, 0x25, 0xab, 0x63, 0x91, 0x3b, 0xa9, 0x71, 0x1b,
0xbf, 0x14, 0x55, 0x49, 0x1a, 0x2a, 0xcb, 0xc3, 0xe6, 0x1e, 0xc7, 0x8d, 0xd4, 0x2e, 0xe4, 0xe2,
0xff, 0x22, 0xad, 0x49, 0x48, 0x29, 0x6b, 0xed, 0x93, 0x96, 0x63, 0x85, 0xb7, 0xef, 0x60, 0x8f,
0xb5, 0x3a, 0x35, 0x58, 0xfd, 0x12, 0x96, 0x9a, 0x9b, 0xcf, 0xe1, 0xc8, 0xaa, 0x78, 0x83, 0x0a,
0x3c, 0x91, 0xac, 0x37, 0x87, 0xdb, 0x29, 0xc1, 0x65, 0xd9, 0x7b, 0x73, 0xac, 0xdd, 0x12, 0x96,
0x92, 0xbd, 0x37, 0x87, 0x1b, 0x6a, 0xe1, 0xe6, 0xe9, 0x7c, 0x73, 0xc0, 0x3d, 0x2d, 0xa0, 0x9a,
0xdf, 0x37, 0xc7, 0x7c, 0xa5, 0xc5, 0x9c, 0x27, 0xfc, 0xcb, 0x00, 0x73, 0xf6, 0x36, 0x76, 0x31,
0x6a, 0x46, 0xb3, 0xfc, 0x86, 0xb4, 0x5a, 0xb9, 0xbc, 0xa2, 0xa8, 0xce, 0x62, 0x5a, 0x91, 0x63,
0x3d, 0xb1, 0x39, 0xc9, 0x82, 0xa4, 0x05, 0x8c, 0x92, 0xf8, 0x96, 0xb5, 0x59, 0x8b, 0x37, 0x12,
0x8d, 0xd2, 0x4a, 0xc4, 0x1a, 0xce, 0x0f, 0x3c, 0xf4, 0x21, 0xf9, 0xd4, 0xb0, 0x96, 0x35, 0x80,
0x82, 0x45, 0x29, 0xe1, 0x21, 0xbf, 0x37, 0x04, 0x10, 0xf9, 0xe1, 0xcd, 0x02, 0xb1, 0xa3, 0xa9,
0xf3, 0x2f, 0x82, 0xc1, 0x3a, 0xec, 0x32, 0xae, 0x02, 0x5b, 0x69, 0x33, 0x20, 0xb9, 0x3f, 0xb2,
0xd8, 0xa9, 0x53, 0x4e, 0xf3, 0xd2, 0xe6, 0x28, 0xa8, 0x90, 0x4d, 0xb0, 0xb8, 0x08, 0x5e, 0xb2,
0x28, 0x9c, 0x23, 0x73, 0xed, 0x63, 0xd7, 0xf2, 0xf8, 0xa4, 0x50, 0xab, 0x49, 0xd9, 0x41, 0x88,
0x5f, 0x65, 0xc7, 0xd9, 0x88, 0xe0, 0x12, 0x3c, 0x0b, 0xb3, 0xf8, 0x73, 0xe6, 0x3d, 0xb4, 0x65,
0x3a, 0x9f, 0xe7, 0x92, 0xde, 0xb2, 0x04, 0xf8, 0x58, 0x13, 0x35, 0x78, 0xd4, 0x8e, 0x2f, 0xc1,
0x30, 0x88, 0xf8, 0xaa, 0x14, 0x43, 0x42, 0x3c, 0x5d, 0xac, 0x6b, 0xe6, 0x46, 0xb9, 0xf0, 0xc6,
0xa0, 0x89, 0x11, 0x3a, 0x64, 0x8b, 0xb5, 0x4b, 0x35, 0x8e, 0xac, 0x6f, 0x6d, 0xb1, 0x2b, 0x3f,
0x38, 0xbf, 0xa3, 0x61, 0x08, 0x76, 0xbb, 0x2d, 0xba, 0x41, 0xb9, 0x66, 0x87, 0x76, 0xb5, 0x28,
0x2a, 0x2e, 0xf7, 0x31, 0xf2, 0x4a, 0xfe, 0x41, 0xa3, 0xe4, 0xea, 0xe7, 0xe3, 0xa8, 0xba, 0x99,
0xa2, 0x3f, 0xf5, 0xae, 0xb5, 0xc5, 0xb2, 0x3f, 0x34, 0x75, 0xdf, 0xa8, 0xd4, 0xed, 0xd2, 0x95,
0x42, 0x4a, 0xba, 0x82, 0xc4, 0x3f, 0xaa, 0xd0, 0x0c, 0xd6, 0x64, 0xd2, 0x6a, 0x4c, 0x3a, 0x79,
0xad, 0x91, 0x98, 0x19, 0x82, 0x53, 0x23, 0xcb, 0x58, 0xad, 0x6e, 0x49, 0x94, 0xd6, 0x11, 0x4f,
0x3c, 0x87, 0x30, 0x1e, 0xa7, 0x13, 0x49, 0x84, 0x89, 0xf7, 0x91, 0xdc, 0x20, 0x67, 0x60, 0xf3,
0x49, 0x94, 0x84, 0x94, 0xc4, 0x53, 0x2b, 0x86, 0x5f, 0x94, 0x1c, 0x1d, 0x7c, 0x78, 0x79, 0x93,
0x44, 0xc4, 0x8d, 0x48, 0xe0, 0x25, 0x93, 0x09, 0x75, 0x20, 0x82, 0x33, 0x34, 0xc8, 0xe9, 0xdc,
0x88, 0xff, 0x6a, 0xb7, 0x8d, 0x2c, 0x56, 0xa0, 0x52, 0xaa, 0xfd, 0x2a, 0xab, 0x5b, 0x65, 0xda,
0xb9, 0x39, 0x61, 0x4e, 0x5b, 0x63, 0x01, 0x73, 0xab, 0xed, 0xcc, 0xc6, 0xf3, 0x1a, 0x0a, 0x99,
0xd0, 0x71, 0xb6, 0x5b, 0x66, 0x96, 0x1b, 0x8f, 0xdc, 0x09, 0xb3, 0xbc, 0x76, 0x7a, 0x12, 0xa2,
0x4b, 0x5a, 0x03, 0xe9, 0xe2, 0x01, 0xbb, 0xd5, 0x25, 0xbb, 0xbd, 0x5e, 0xaf, 0xb3, 0xfa, 0x7c,
0x80, 0xf4, 0x4e, 0x7a, 0x58, 0x22, 0x09, 0x2d, 0x1c, 0x58, 0x41, 0x6d, 0xca, 0x64, 0xa0, 0xd5,
0x91, 0xb3, 0x40, 0x6c, 0x95, 0xa3, 0xa8, 0xe9, 0x3a, 0x2d, 0x2b, 0x9a, 0x1c, 0xd9, 0x21, 0xf7,
0x3c, 0x8c, 0xc1, 0x15, 0x69, 0x2b, 0x8f, 0x97, 0x08, 0xeb, 0xe1, 0xb9, 0x41, 0xa1, 0x2b, 0x8a,
0x87, 0x53, 0x80, 0xe4, 0xa3, 0xeb, 0xc4, 0xd3, 0x7d, 0x62, 0xdd, 0x59, 0xae, 0x87, 0xb6, 0x42,
0x7c, 0x2e, 0x6b, 0xfa, 0x88, 0x7b, 0x89, 0xcf, 0xe4, 0x81, 0x9a, 0x82, 0x8a, 0xf0, 0xa4, 0x8b,
0x0f, 0xd1, 0xa8, 0x24, 0xa9, 0xee, 0x33, 0xd6, 0x0a, 0x58, 0xa2, 0xbe, 0xa2, 0xf7, 0xb1, 0x66,
0xb3, 0x49, 0x09, 0x04, 0x46, 0x2a, 0xb9, 0xb6, 0xc7, 0x22, 0xfc, 0x2b, 0xb8, 0xcf, 0x8f, 0x53,
0xf0, 0xb9, 0xad, 0xd2, 0x6d, 0x90, 0xc3, 0xfd, 0x1d, 0x0f, 0xe7, 0x78, 0x07, 0x1e, 0xac, 0x09,
0x1f, 0x24, 0xd9, 0x17, 0x4f, 0x34, 0xc4, 0xe7, 0x9f, 0x8f, 0x28, 0xb6, 0x97, 0xcb, 0x9b, 0x00,
0x58, 0x8c, 0x80, 0x43, 0x3a, 0x32, 0x72, 0x7f, 0xa7, 0xd8, 0x7a, 0x2e, 0x91, 0xc4, 0x00, 0x02,
0xcf, 0x3d, 0x09, 0xb9, 0x7d, 0xeb, 0xc6, 0xb8, 0x3e, 0x22, 0xee, 0x15, 0x24, 0x78, 0xac, 0x1e,
0xf5, 0xbb, 0x90, 0x27, 0x01, 0x78, 0x1c, 0x5d, 0xf5, 0x18, 0xd4, 0x3c, 0x73, 0x7f, 0xb7, 0x42,
0x07, 0xee, 0x97, 0x9f, 0x8b, 0x9e, 0x69, 0x9f, 0xfc, 0x27, 0xba, 0x0a, 0xdb, 0x2d, 0x79, 0x58,
0x0a, 0xdc, 0x5c, 0x12, 0xb4, 0x3a, 0xeb, 0xaa, 0xb0, 0x74, 0xe1, 0x1d, 0x6c, 0x44, 0xed, 0x02,
0x28, 0x4e, 0x30, 0xa4, 0x08, 0x67, 0xe2, 0x28, 0xd3, 0x3e, 0x79, 0x39, 0xac, 0xa5, 0x84, 0xf0,
0x1b, 0xb2, 0xb5, 0x15, 0x89, 0x2b, 0xd7, 0x8d, 0x32, 0xe9, 0xb0, 0x00, 0xa3, 0x7d, 0xe5, 0x70,
0x4d, 0xf9, 0xf6, 0x28, 0xb0, 0x6c, 0x71, 0x44, 0x40, 0xff, 0xb0, 0x90, 0xcf, 0xe6, 0x14, 0x3d,
0x2d, 0x85, 0xf6, 0xe2, 0xa9, 0x0f, 0x96, 0xe1, 0x30, 0x81, 0xd1, 0xb0, 0x0a, 0xe5, 0x34, 0xd0,
0x7c, 0x81, 0x3c, 0x08, 0x29, 0x24, 0xb1, 0x21, 0x75, 0x52, 0x9e, 0x61, 0xaf, 0xb7, 0x32, 0xcb,
0xcf, 0xd4, 0x9d, 0x4c, 0x61, 0x41, 0xbe, 0xae, 0x66, 0xa9, 0xbc, 0x71, 0x23, 0x86, 0x73, 0x25,
0x17, 0xb4, 0x58, 0x4c, 0x9f, 0x19, 0x9a, 0xec, 0xcf, 0x4c, 0xba, 0x9f, 0x4a, 0x46, 0x17, 0x95,
0x31, 0x0a, 0xed, 0xfd, 0xf4, 0x30, 0x1f, 0xf8, 0x82, 0x6d, 0x17, 0xcc, 0x4d, 0xb4, 0x2d, 0x1d,
0x51, 0xc0, 0x26, 0xad, 0xe6, 0xe2, 0x70, 0x76, 0xe4, 0xc1, 0xb2, 0x2e, 0x1f, 0x9c, 0x28, 0xfe,
0x44, 0x28, 0x2a, 0x0a, 0x2a, 0x2d, 0xb5, 0xc1, 0x03, 0xca, 0xda, 0x9d, 0x4a, 0x96, 0xc7, 0xad,
0xd5, 0xaf, 0xfe, 0x5f, 0xcf, 0xfd, 0x5b, 0xcc, 0x3e, 0xbf, 0x89, 0xc9, 0x17, 0x92, 0x7e, 0x9f,
0xfd, 0xa7, 0x99, 0xfd, 0x4b, 0x59, 0x41, 0xff, 0xcc, 0x44, 0x35, 0xf1, 0x33, 0x2b, 0x27, 0x66,
0xab, 0x2f, 0x01, 0xc4, 0xb2, 0xc2, 0xf8, 0xe5, 0x3f, 0xf6, 0x9e, 0x7b, 0x1d, 0x94, 0xea, 0xfe,
0x4b, 0xa8, 0xb5, 0x59, 0xe1, 0x93, 0x2f, 0x96, 0xa3, 0x29, 0xb5, 0x6f, 0xf5, 0xee, 0xfd, 0xab,
0x5e, 0x29, 0x69, 0x54, 0xb3, 0x68, 0x0b, 0xaf, 0x35, 0x75, 0x57, 0x7c, 0x32, 0xf1, 0x56, 0xda,
0xc2, 0xf9, 0xc2, 0xb5, 0x8d, 0x5a, 0x53, 0x4b, 0xbe, 0xeb, 0xce, 0xcb, 0xe3, 0x13, 0x84, 0x61,
0xb9, 0x40, 0xeb, 0xf4, 0x9c, 0xc8, 0xe2, 0xe0, 0xff, 0x22, 0xcc, 0xda, 0x34, 0x1e, 0xd2, 0x5e,
0xcc, 0x6a, 0x55, 0x35, 0x73, 0x84, 0x81, 0xe8, 0xa2, 0xa8, 0xd5, 0x7c, 0x21, 0x60, 0x5d, 0x14,
0x04, 0xff, 0xd4, 0xca, 0x0a, 0xa4, 0x90, 0x7b, 0xb5, 0x94, 0x02, 0xe7, 0xe2, 0x23, 0x26, 0xaf,
0xf8, 0x29, 0x2d, 0x2f, 0x6a, 0xd2, 0xd2, 0x5c, 0xbe, 0xb5, 0x28, 0x75, 0x21, 0x93, 0x5a, 0xaa,
0xca, 0x3e, 0x2b, 0x75, 0xbb, 0xec, 0x52, 0x56, 0x76, 0x6b, 0x5d, 0xd7, 0x82, 0x57, 0xde, 0xbc,
0x84, 0x44, 0xd6, 0x62, 0xb0, 0xae, 0x17, 0xe7, 0xc9, 0x1b, 0xf1, 0xaf, 0xb1, 0xe7, 0x85, 0xc5,
0xb2, 0x1c, 0x37, 0x89, 0xaa, 0xa2, 0xd8, 0x79, 0x9e, 0x93, 0x6e, 0xed, 0x9d, 0x5e, 0x2d, 0x59,
0x96, 0x2d, 0xcd, 0x8b, 0x8d, 0x5b, 0x6b, 0x0f, 0xa5, 0x22, 0x6d, 0xab, 0x5a, 0xc3, 0xb6, 0x48,
0xb4, 0x4e, 0x59, 0xed, 0x3a, 0x2e, 0x5b, 0x22, 0xb1, 0x84, 0xb0, 0xc3, 0xb3, 0x94, 0x3e, 0x1b,
0xda, 0x4c, 0x9f, 0x08, 0x2e, 0xb7, 0x22, 0x5f, 0xda, 0xbe, 0xe0, 0xee, 0x52, 0x4a, 0x8f, 0xf5,
0xf6, 0x27, 0xf3, 0x59, 0x90, 0x99, 0x86, 0x69, 0xc5, 0x87, 0x3a, 0x42, 0x3b, 0x5f, 0xd2, 0x20,
0x09, 0x91, 0x45, 0xe7, 0x05, 0x49, 0x57, 0xb7, 0x35, 0xcd, 0x0d, 0xd9, 0x4e, 0x55, 0xce, 0x06,
0xf7, 0x94, 0xf6, 0x8f, 0xcd, 0x93, 0x0a, 0xa4, 0x31, 0x58, 0x80, 0x7d, 0x65, 0x44, 0xc6, 0x15,
0x0f, 0xae, 0xf8, 0xa1, 0x48, 0x43, 0x57, 0x17, 0x7c, 0x7b, 0x9b, 0x7c, 0xb0, 0x7c, 0xda, 0x25,
0xbe, 0xcb, 0xe0, 0x97, 0x75, 0xdf, 0x25, 0x77, 0x96, 0xd7, 0x25, 0x09, 0x73, 0xe3, 0xb7, 0x96,
0x0d, 0x81, 0x47, 0x97, 0x38, 0xd4, 0x86, 0x38, 0xc8, 0x8b, 0xe4, 0xd5, 0xee, 0xfc, 0x25, 0x15,
0x64, 0xd4, 0x82, 0xe6, 0xde, 0x62, 0x81, 0xc1, 0x9c, 0xa5, 0x66, 0x52, 0x4b, 0xfc, 0xa9, 0x95,
0x46, 0x63, 0x47, 0xb2, 0x91, 0x05, 0xd6, 0xac, 0x6f, 0x0c, 0xbb, 0xe0, 0xf7, 0xe1, 0x0f, 0xf8,
0xbf, 0x2f, 0xfe, 0xb5, 0xc8, 0x01, 0x9a, 0xb9, 0x42, 0x9f, 0xb2, 0x75, 0xdd, 0xad, 0xc0, 0x1c,
0x61, 0x70, 0x46, 0xde, 0x59, 0x2e, 0x5a, 0x47, 0x84, 0x00, 0xb4, 0xdd, 0x39, 0x98, 0x84, 0x5a,
0x74, 0x1f, 0x57, 0xc1, 0xf9, 0xcc, 0x4e, 0x98, 0x43, 0x46, 0xd8, 0x2f, 0xcc, 0x20, 0xf3, 0x12,
0x7e, 0x66, 0xb7, 0xfe, 0xf6, 0xb4, 0x08, 0xbd, 0x68, 0x6c, 0x56, 0x3f, 0xe4, 0x02, 0x9b, 0x97,
0xc0, 0xd8, 0x13, 0x40, 0x3d, 0xe3, 0x75, 0x0a, 0xde, 0xc3, 0x71, 0xff, 0x5d, 0x22, 0xaa, 0x7d,
0xce, 0x6a, 0xa4, 0x33, 0xeb, 0x9e, 0x08, 0x34, 0x90, 0xf6, 0xf2, 0xe2, 0x0c, 0x58, 0x07, 0x38,
0x72, 0x88, 0xa1, 0xe0, 0xf7, 0x40, 0xfc, 0xee, 0x4b, 0x5c, 0x89, 0x9a, 0x6f, 0x81, 0x56, 0xe3,
0xa6, 0x09, 0xd3, 0x21, 0xfa, 0x32, 0x45, 0xd0, 0xa1, 0x46, 0x50, 0x4d, 0x63, 0xb4, 0x1a, 0x57,
0x26, 0xe1, 0xcd, 0x61, 0x85, 0x3b, 0xad, 0x44, 0x85, 0x4d, 0x30, 0x4d, 0x51, 0xa3, 0x39, 0x6c,
0x7f, 0x29, 0x28, 0x76, 0x50, 0xab, 0x40, 0xaf, 0x9f, 0x34, 0xee, 0x48, 0xe3, 0x86, 0x85, 0xa5,
0x31, 0xb2, 0x5d, 0xd2, 0x3c, 0x06, 0x59, 0xc1, 0x4d, 0x35, 0xf0, 0x1c, 0x05, 0xa7, 0xf4, 0xa9,
0x77, 0xfd, 0x7c, 0x29, 0xc4, 0x8a, 0x01, 0xda, 0xc2, 0x1a, 0xae, 0x1d, 0xa0, 0x3d, 0x89, 0xa2,
0xa5, 0x10, 0x4b, 0x54, 0xbd, 0x46, 0xfc, 0x03, 0x5b, 0xc4, 0x57, 0x55, 0xde, 0xbf, 0xfe, 0x89,
0xc4, 0x5c, 0xbd, 0x32, 0x80, 0x2b, 0xa2, 0xfb, 0xaf, 0x5e, 0xdc, 0xb9, 0x5e, 0x3f, 0xb4, 0xe1,
0xec, 0x37, 0x84, 0x3b, 0x9a, 0x42, 0xb8, 0xb7, 0x3c, 0x8b, 0x49, 0x4f, 0x24, 0xfc, 0x0a, 0xc6,
0x3f, 0xeb, 0xfb, 0xba, 0xcc, 0xa1, 0xf7, 0x1d, 0x03, 0x57, 0x0b, 0x79, 0x83, 0xfe, 0x2e, 0xa2,
0xe2, 0x58, 0x5c, 0x5b, 0x1e, 0x52, 0xf8, 0x51, 0x91, 0x73, 0xf7, 0x1a, 0xe8, 0xf8, 0x5b, 0xf7,
0x9e, 0x3a, 0xed, 0xc5, 0xd5, 0xe1, 0x75, 0x87, 0xbc, 0x50, 0xa8, 0xf6, 0xae, 0xd7, 0x0c, 0x68,
0x56, 0x18, 0xeb, 0x05, 0x64, 0xd0, 0x11, 0x75, 0x1a, 0x8c, 0x56, 0xb4, 0x5b, 0x02, 0xc9, 0xd6,
0x59, 0x81, 0x5e, 0xf4, 0x27, 0xc5, 0xb1, 0x8c, 0x4f, 0x8b, 0x21, 0xbd, 0xba, 0xbe, 0x06, 0xdd,
0x08, 0x85, 0xac, 0x04, 0x50, 0x38, 0x5a, 0xbb, 0x94, 0xe7, 0xf1, 0x99, 0x43, 0xc0, 0x27, 0xd8,
0xb7, 0xb8, 0x64, 0xfe, 0xb7, 0x9b, 0xf6, 0x39, 0xac, 0xa3, 0xb2, 0xdc, 0xcb, 0x07, 0x75, 0xd2,
0x9d, 0xf1, 0x0c, 0xfb, 0xe0, 0xc9, 0x43, 0x77, 0xe5, 0x15, 0xef, 0x0a, 0x13, 0x96, 0xd5, 0x53,
0x4a, 0x36, 0x6c, 0x95, 0xb3, 0xf1, 0x85, 0x23, 0x00, 0xca, 0x93, 0xf0, 0x25, 0x6f, 0x7d, 0x4d,
0x73, 0xd1, 0x7c, 0x33, 0xd2, 0xd3, 0x71, 0xa5, 0x7e, 0x74, 0xe9, 0xbc, 0xa4, 0xd2, 0x62, 0x7c,
0xdc, 0xca, 0x8b, 0x90, 0x3f, 0x33, 0xa0, 0x97, 0xc0, 0xf6, 0x78, 0x44, 0x97, 0x89, 0x90, 0x53,
0x40, 0x49, 0x82, 0xc5, 0xdb, 0x04, 0xa9, 0x00, 0x12, 0x5a, 0x3d, 0x35, 0x21, 0x5e, 0xa1, 0xcf,
0x9e, 0xb9, 0x55, 0xc8, 0x80, 0x5a, 0x17, 0x21, 0xb7, 0xc1, 0xd8, 0xc0, 0xc6, 0x37, 0x0c, 0xa3,
0xa5, 0xb4, 0x3a, 0x41, 0xb4, 0x0b, 0xee, 0xb9, 0xf6, 0xc3, 0x3e, 0x84, 0x75, 0x41, 0x12, 0x18,
0x1f, 0xf8, 0x41, 0x12, 0xf3, 0x23, 0xbc, 0xb1, 0xa5, 0xec, 0x17, 0x7c, 0x7b, 0x34, 0x27, 0xe3,
0x98, 0xdb, 0x98, 0x53, 0x8b, 0x6b, 0xf3, 0x8b, 0x33, 0xe9, 0x91, 0x64, 0x7a, 0x62, 0x88, 0x4f,
0xe4, 0xa5, 0xda, 0xfa, 0xbb, 0x9f, 0xbf, 0xb0, 0x8f, 0x3f, 0x0f, 0x73, 0x52, 0x99, 0x7c, 0x93,
0x6d, 0x32, 0x00, 0xfa, 0xc5, 0x87, 0x39, 0xa5, 0x24, 0x53, 0xbf, 0x25, 0x60, 0x7e, 0x0b, 0x86,
0x36, 0x41, 0x43, 0x7a, 0x68, 0x15, 0xed, 0xc5, 0xd2, 0x9c, 0x09, 0xb7, 0x12, 0x98, 0x19, 0xc8,
0x4c, 0xc0, 0xda, 0xec, 0x93, 0x3b, 0x37, 0x72, 0x41, 0xdd, 0xd5, 0x2b, 0x4f, 0xab, 0xf5, 0x42,
0x0b, 0x65, 0x31, 0x89, 0xb1, 0xc5, 0x1c, 0xec, 0x40, 0x8a, 0x02, 0x31, 0xa8, 0x2a, 0x5d, 0x0e,
0xe7, 0xb7, 0xe4, 0xcf, 0xec, 0xef, 0x23, 0x10, 0x51, 0x31, 0x3a, 0xcb, 0xf4, 0x3c, 0xf7, 0x95,
0xa8, 0x9f, 0xac, 0x13, 0xa8, 0xe8, 0xd3, 0xa3, 0x63, 0xdd, 0x65, 0xcd, 0x2c, 0x8b, 0xf9, 0x3d,
0x67, 0x27, 0x91, 0x6d, 0x05, 0xb4, 0xb4, 0x5a, 0x44, 0x13, 0x43, 0x39, 0x3d, 0x21, 0xdf, 0x4e,
0x45, 0x55, 0x29, 0x95, 0xec, 0xf2, 0x94, 0x68, 0xb3, 0x33, 0xf5, 0x7b, 0x0e, 0x34, 0x13, 0xff,
0x00, 0xc6, 0x69, 0xc9, 0x1a, 0x58, 0xa5, 0xaf, 0xae, 0x9d, 0xea, 0x67, 0xe8, 0x91, 0xff, 0x6d,
0x2c, 0x7e, 0xca, 0x46, 0xfc, 0x0e, 0x06, 0xec, 0xda, 0x15, 0x3d, 0xf2, 0xdf, 0x2a, 0x7a, 0xe4,
0xb3, 0xd0, 0x12, 0x6e, 0x27, 0xa5, 0xfd, 0xc8, 0x43, 0xe7, 0x23, 0x5c, 0xaa, 0x6a, 0x94, 0x5f,
0x4d, 0x5d, 0x71, 0xfa, 0x64, 0xc2, 0x61, 0x1f, 0x43, 0x04, 0x47, 0xa2, 0xc0, 0xc5, 0x93, 0x97,
0xe2, 0x74, 0x4a, 0xe9, 0xf0, 0x4a, 0x8b, 0xbc, 0xa8, 0xb0, 0xf4, 0xad, 0xc5, 0xb9, 0x16, 0x06,
0x19, 0x09, 0x82, 0x21, 0x30, 0x13, 0x38, 0x33, 0xeb, 0xc1, 0x68, 0x55, 0x9a, 0x62, 0xe5, 0x45,
0xed, 0x03, 0xdb, 0xa6, 0x41, 0x5c, 0x0e, 0x77, 0x44, 0x68, 0x53, 0x3a, 0xb4, 0xd2, 0xd1, 0x1e,
0x06, 0xca, 0xbd, 0xab, 0xb3, 0xc4, 0x99, 0xd4, 0x1d, 0xf8, 0xca, 0x7d, 0xa8, 0x3f, 0xe8, 0xf2,
0x54, 0x87, 0x5d, 0x36, 0x3c, 0xf0, 0xb2, 0xc1, 0xc1, 0x97, 0xfa, 0x03, 0x30, 0xd9, 0x8f, 0xe6,
0xe0, 0x50, 0xf9, 0x0d, 0x4a, 0x56, 0xa9, 0xd1, 0xe6, 0xf3, 0x93, 0x2a, 0xcf, 0x90, 0x9a, 0x13,
0x16, 0xe3, 0x98, 0x27, 0x80, 0xdf, 0x6e, 0x45, 0xae, 0x39, 0x01, 0x31, 0x4c, 0x31, 0x1e, 0xac,
0x6d, 0xf4, 0x07, 0xb0, 0xb3, 0xfb, 0xaf, 0xbb, 0x84, 0x25, 0x9e, 0xd7, 0x59, 0x06, 0x73, 0xca,
0x62, 0x81, 0x21, 0x74, 0x63, 0x06, 0xdc, 0x13, 0x49, 0xf7, 0xaa, 0xdc, 0x8a, 0x10, 0xb3, 0x29,
0xa5, 0x9e, 0xe9, 0xb8, 0xd2, 0x96, 0xb5, 0x44, 0x25, 0x40, 0x0b, 0xb3, 0x0c, 0xf3, 0x84, 0x25,
0xbe, 0x40, 0xc4, 0x02, 0x39, 0x0d, 0x1f, 0xcc, 0xf8, 0x21, 0x48, 0xeb, 0x0b, 0x8d, 0x46, 0x94,
0xb1, 0x83, 0x13, 0xf0, 0x70, 0x4c, 0xfd, 0xdd, 0xe6, 0x83, 0xca, 0x30, 0x2c, 0xac, 0x0c, 0xf5,
0x07, 0xbd, 0x75, 0xc6, 0x93, 0xc1, 0xcd, 0xeb, 0x5e, 0xa6, 0x6f, 0xdd, 0x03, 0xdc, 0xce, 0xeb,
0x5e, 0x43, 0x81, 0x14, 0x04, 0x51, 0x19, 0x7b, 0x59, 0x21, 0x51, 0x2d, 0x84, 0xcb, 0x8a, 0x72,
0xf4, 0x36, 0x03, 0x49, 0x45, 0x59, 0x03, 0xc5, 0xba, 0x89, 0x0a, 0xb2, 0xec, 0xbe, 0xde, 0x50,
0xc5, 0x20, 0x8d, 0x79, 0x27, 0x24, 0x5a, 0x43, 0x35, 0x20, 0x43, 0xca, 0xfc, 0xaa, 0x39, 0xf3,
0x7c, 0xb9, 0x25, 0xb1, 0x2c, 0x20, 0xe2, 0x70, 0x5e, 0x19, 0x7b, 0x1b, 0x01, 0x51, 0x86, 0xe5,
0xca, 0xdd, 0xc1, 0x66, 0x4a, 0x81, 0x4c, 0x21, 0x48, 0x37, 0x78, 0x26, 0x59, 0x7f, 0x30, 0x6c,
0x2c, 0x98, 0x02, 0x23, 0xe5, 0xea, 0xef, 0xac, 0x09, 0x62, 0x81, 0x7b, 0x03, 0x5b, 0x41, 0xed,
0xaa, 0x6d, 0xbd, 0x2a, 0x1e, 0x04, 0x70, 0xe6, 0x58, 0x74, 0xe4, 0x70, 0x19, 0xaf, 0xbc, 0x04,
0xa5, 0x89, 0x41, 0xe6, 0x88, 0xb2, 0x08, 0xc6, 0x23, 0x3a, 0x15, 0xb0, 0x66, 0x1a, 0x0e, 0x07,
0x11, 0x30, 0x07, 0xf2, 0x38, 0x0f, 0x4c, 0x2c, 0xc1, 0x82, 0x18, 0xc3, 0xde, 0x1a, 0x20, 0x91,
0x27, 0x4b, 0xb8, 0x5d, 0xb2, 0xb7, 0xfa, 0x28, 0x0e, 0x39, 0xf7, 0x52, 0x76, 0x0b, 0xbf, 0x4c,
0xca, 0x9c, 0x42, 0x58, 0x37, 0x2f, 0xae, 0x8b, 0x9a, 0x69, 0x63, 0x41, 0x82, 0xa9, 0x15, 0x51,
0x13, 0x22, 0xb6, 0x18, 0xdf, 0x8e, 0x82, 0xfd, 0x90, 0x8a, 0xd5, 0xdf, 0xeb, 0x2d, 0x9f, 0xa8,
0xed, 0x6d, 0xf2, 0xd6, 0xa5, 0xe0, 0x71, 0x3f, 0x52, 0x08, 0x92, 0xf0, 0x0b, 0x70, 0x1a, 0xcd,
0xe3, 0xac, 0x68, 0x0c, 0x7a, 0xeb, 0xbb, 0x0f, 0x3f, 0x5d, 0xa8, 0x62, 0xb9, 0xe1, 0x24, 0x67,
0x5e, 0x64, 0xb7, 0x89, 0x17, 0xf1, 0xcd, 0xa9, 0xe5, 0xc1, 0xd4, 0xdc, 0xc7, 0xa1, 0x95, 0x2a,
0x39, 0xaa, 0xc2, 0xa8, 0xff, 0xa9, 0x08, 0xa2, 0xa2, 0x79, 0x10, 0xa5, 0x89, 0x34, 0x2a, 0x23,
0xa9, 0x8c, 0x1d, 0x63, 0x29, 0xcb, 0xbe, 0xcd, 0xbe, 0xc8, 0xa7, 0xfd, 0xcb, 0x28, 0x0e, 0x41,
0xe9, 0x6b, 0x86, 0x55, 0x1f, 0xb1, 0x82, 0xd5, 0x34, 0xae, 0x12, 0x65, 0xaf, 0x6f, 0x38, 0xb0,
0x82, 0x25, 0x7b, 0x49, 0x23, 0x17, 0xf3, 0x49, 0x9b, 0x42, 0xa6, 0x83, 0xc7, 0xce, 0x9d, 0xc4,
0x16, 0x1f, 0xab, 0xb9, 0x44, 0x67, 0xcc, 0x53, 0x5e, 0x81, 0xf0, 0xa9, 0x85, 0x71, 0xff, 0xe5,
0xfb, 0x43, 0x0f, 0xcf, 0xdb, 0xb2, 0x89, 0xf6, 0x25, 0x08, 0x9c, 0xd0, 0xd0, 0x53, 0x5f, 0xbc,
0x20, 0x7f, 0xfe, 0x09, 0x40, 0x9f, 0x7a, 0xd7, 0xe4, 0x9f, 0xa4, 0x4f, 0xc1, 0x89, 0x36, 0x9b,
0xb2, 0x33, 0xf9, 0x58, 0x72, 0xf9, 0x7e, 0xf9, 0x4c, 0xa5, 0x22, 0xe2, 0x81, 0x24, 0xfd, 0x70,
0xbf, 0x8d, 0x09, 0x03, 0x6d, 0xf5, 0xb1, 0x32, 0x2b, 0xff, 0xff, 0x11, 0xb5, 0xb6, 0xb7, 0xb6,
0xeb, 0x90, 0x36, 0x02, 0x83, 0x55, 0x31, 0x09, 0x6b, 0xd8, 0x4b, 0x89, 0xe0, 0x49, 0x04, 0x21,
0x50, 0xcf, 0xf8, 0xc7, 0x32, 0xf3, 0x50, 0x32, 0x9a, 0x5e, 0x72, 0x4f, 0x3c, 0x97, 0xdd, 0xc2,
0xd4, 0xd6, 0x2f, 0xba, 0x94, 0xa8, 0xbc, 0xf2, 0xde, 0xcb, 0x1b, 0xe7, 0xa9, 0x33, 0x2a, 0x2c,
0xc3, 0xb4, 0x79, 0x26, 0x5b, 0x88, 0x3d, 0x63, 0x67, 0x3e, 0x5e, 0x21, 0x74, 0x79, 0x91, 0x66,
0x8f, 0xf9, 0xe7, 0x9b, 0x4d, 0x56, 0xa5, 0x18, 0x56, 0x2a, 0xd8, 0xea, 0xeb, 0x73, 0xac, 0x28,
0xe3, 0xdb, 0x58, 0x92, 0xaa, 0x89, 0x16, 0x0f, 0x1c, 0xc5, 0x3c, 0x98, 0x6b, 0x1e, 0xe3, 0x01,
0x74, 0xea, 0x9d, 0x0d, 0x57, 0x29, 0xea, 0xc5, 0x9c, 0xeb, 0x25, 0xd3, 0xd0, 0x2a, 0x3e, 0xf9,
0xc8, 0xf2, 0xec, 0xc4, 0x03, 0x64, 0x92, 0x7d, 0x9d, 0x98, 0x2d, 0xbf, 0xab, 0xd4, 0xa3, 0xa1,
0xb0, 0x01, 0xfc, 0x26, 0xa2, 0xe1, 0x1d, 0x7c, 0xc0, 0x96, 0x77, 0xd4, 0x28, 0xf8, 0x49, 0x39,
0x65, 0x1f, 0xbe, 0x4b, 0xda, 0x7d, 0xa3, 0x47, 0x5f, 0xee, 0x40, 0x02, 0x3a, 0x5f, 0x43, 0x3f,
0x66, 0xa2, 0x82, 0x3b, 0xc2, 0xed, 0xaa, 0x0d, 0x88, 0xc5, 0x1b, 0x84, 0xb6, 0xfc, 0x72, 0xc4,
0xe2, 0x86, 0x16, 0xef, 0x86, 0xcf, 0xe4, 0x17, 0x17, 0x02, 0x70, 0x6c, 0x37, 0x11, 0x30, 0x8b,
0x28, 0x6e, 0x03, 0x65, 0x8b, 0xde, 0xcc, 0xd6, 0xd8, 0xe9, 0x73, 0x24, 0x37, 0x33, 0x17, 0x95,
0x48, 0xc5, 0x09, 0xb8, 0x82, 0x20, 0x84, 0x82, 0x5b, 0x84, 0xe5, 0x5d, 0xbf, 0xbd, 0x63, 0x39,
0xd7, 0xca, 0xf6, 0x16, 0x55, 0x16, 0xd1, 0xee, 0x8b, 0x8a, 0xae, 0xc5, 0x58, 0xc4, 0xe3, 0xab,
0x47, 0x8a, 0x82, 0xc7, 0xe6, 0x7e, 0xb0, 0x66, 0x7c, 0x38, 0xe7, 0x87, 0x34, 0x05, 0x02, 0x45,
0xfc, 0x88, 0x5f, 0xc8, 0x23, 0xc5, 0x58, 0x45, 0x17, 0x3f, 0x43, 0x40, 0x45, 0x62, 0x4b, 0x2d,
0x05, 0x6b, 0x55, 0x81, 0x81, 0x57, 0xd9, 0xcc, 0x21, 0xf7, 0x5b, 0x6e, 0x97, 0xcd, 0xdb, 0xb0,
0x57, 0xb6, 0x62, 0x08, 0x81, 0xd3, 0xb4, 0xe4, 0xe5, 0xbb, 0x1a, 0x0b, 0x26, 0x84, 0x1d, 0x89,
0x14, 0x21, 0x5a, 0xdd, 0x82, 0x09, 0xd1, 0xa3, 0x5a, 0xae, 0xaf, 0xbf, 0xbc, 0x24, 0xe2, 0x5f,
0x9c, 0x71, 0x11, 0x01, 0x8b, 0x09, 0x33, 0xcd, 0x1e, 0xcc, 0xb5, 0xd0, 0x6a, 0xff, 0xba, 0x49,
0x18, 0x5d, 0x84, 0xe9, 0x67, 0x30, 0x83, 0x8d, 0x60, 0x06, 0x19, 0xcc, 0xce, 0x46, 0x30, 0x3b,
0x19, 0xcc, 0xee, 0x46, 0x30, 0xbb, 0x19, 0xcc, 0x70, 0x23, 0x98, 0x61, 0x06, 0xb3, 0xb7, 0x11,
0xcc, 0x5e, 0x06, 0xf3, 0x6a, 0x23, 0x98, 0x57, 0x19, 0xcc, 0xeb, 0xeb, 0xe5, 0xb9, 0xd8, 0xf7,
0xac, 0xe6, 0x6b, 0xd9, 0xcf, 0xcb, 0x1e, 0x58, 0x78, 0xd8, 0xca, 0x2f, 0xfe, 0xe6, 0x3b, 0x57,
0xba, 0xf7, 0x7e, 0xf1, 0x6b, 0xc3, 0x7e, 0xd0, 0xdc, 0x90, 0xaf, 0x34, 0x2f, 0x7b, 0x9f, 0xb4,
0xba, 0x07, 0xa8, 0xbc, 0x49, 0xf3, 0xd7, 0x69, 0x02, 0x8a, 0x41, 0x7d, 0xef, 0x02, 0x7e, 0x2b,
0x5d, 0x40, 0xf9, 0xad, 0x27, 0x5f, 0x43, 0x1b, 0xf0, 0x7b, 0xbb, 0xae, 0x91, 0xfd, 0x7d, 0xee,
0x58, 0x49, 0x86, 0xd7, 0xbe, 0xe9, 0x32, 0x5c, 0xa3, 0xa6, 0xe3, 0x86, 0xf2, 0xfb, 0xb9, 0xab,
0x62, 0xec, 0xef, 0x15, 0xa8, 0x27, 0xac, 0x40, 0xfd, 0x1f, 0x55, 0x97, 0xbe, 0xc2, 0xba, 0xd2,
0x40, 0x29, 0x2b, 0x0d, 0xfe, 0xd2, 0x65, 0xa5, 0x2f, 0xd5, 0xcf, 0xdf, 0xb8, 0xe2, 0xb3, 0xbc,
0x1c, 0x35, 0xac, 0x2f, 0x47, 0x7d, 0x63, 0x25, 0xa3, 0xbd, 0xef, 0x25, 0xa3, 0xbf, 0x70, 0xc9,
0xe8, 0x7b, 0x56, 0xf9, 0x45, 0x0c, 0xd2, 0x26, 0x19, 0xa1, 0x92, 0xc6, 0x3c, 0x59, 0x4a, 0xf8,
0xb8, 0xf5, 0x5f, 0x40, 0x5d, 0x4a, 0x4b,
};

View File

@ -8,7 +8,7 @@
#include <stdbool.h>
// Constants
#define DATA_QML_APP_SIZE 4234
#define DATA_QML_APP_SIZE 4375
// Variables
extern uint8_t data_qml_app[];

View File

@ -13,21 +13,21 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_46.c\" -DHW_HEADER=\"hw_46.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_46.c\" -DHW_HEADER=\"hw_46.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# 33k
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DVIN_R1=33000.0 -DHW_SOURCE=\"hw_46.c\" -DHW_HEADER=\"hw_46.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DVIN_R1=33000.0 -DHW_SOURCE=\"hw_46.c\" -DHW_HEADER=\"hw_46.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_33k.bin
# 0005ohm
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DCURRENT_SHUNT_RES=0.0005 -DHW_SOURCE=\"hw_46.c\" -DHW_HEADER=\"hw_46.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DCURRENT_SHUNT_RES=0.0005 -DHW_SOURCE=\"hw_46.c\" -DHW_HEADER=\"hw_46.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_0005ohm.bin
@ -41,7 +41,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_48.c\" -DHW_HEADER=\"hw_48.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_48.c\" -DHW_HEADER=\"hw_48.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -55,21 +55,21 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_410.c\" -DHW_HEADER=\"hw_410.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_410.c\" -DHW_HEADER=\"hw_410.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_410.c\" -DHW_HEADER=\"hw_410.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_410.c\" -DHW_HEADER=\"hw_410.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
# 0005ohm
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DCURRENT_SHUNT_RES=0.0005 -DHW_SOURCE=\"hw_410.c\" -DHW_HEADER=\"hw_410.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DCURRENT_SHUNT_RES=0.0005 -DHW_SOURCE=\"hw_410.c\" -DHW_HEADER=\"hw_410.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_0005ohm.bin
@ -82,14 +82,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -102,14 +102,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK3' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK3' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK3' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK3' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -122,14 +122,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK4' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK4' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK4' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK4' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -142,14 +142,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK5' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK5' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK5' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_60.c\" -DHW_HEADER=\"hw_60.h\" -DHW60_IS_MK5' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -162,7 +162,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_das_rs.c\" -DHW_HEADER=\"hw_das_rs.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_das_rs.c\" -DHW_HEADER=\"hw_das_rs.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -175,14 +175,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -195,14 +195,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\" -DHW75_300_REV_2' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\" -DHW75_300_REV_2' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\" -DHW75_300_REV_2' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\" -DHW75_300_REV_2' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -215,14 +215,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\" -DHW75_300_REV_3' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\" -DHW75_300_REV_3' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\" -DHW75_300_REV_3' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_75_300.c\" -DHW_HEADER=\"hw_75_300.h\" -DHW75_300_REV_3' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -235,7 +235,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DAD2S1205_USE_HW_SPI_PINS=1 -DHW_SOURCE=\"hw_axiom.c\" -DHW_HEADER=\"hw_axiom.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DAD2S1205_USE_HW_SPI_PINS=1 -DHW_SOURCE=\"hw_axiom.c\" -DHW_HEADER=\"hw_axiom.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -248,7 +248,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_uavc_omega.c\" -DHW_HEADER=\"hw_uavc_omega.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_uavc_omega.c\" -DHW_HEADER=\"hw_uavc_omega.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -261,14 +261,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_hd60.c\" -DHW_HEADER=\"hw_hd60.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_hd60.c\" -DHW_HEADER=\"hw_hd60.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_hd60.c\" -DHW_HEADER=\"hw_hd60.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_hd60.c\" -DHW_HEADER=\"hw_hd60.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -281,14 +281,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_hd75.c\" -DHW_HEADER=\"hw_hd75.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_hd75.c\" -DHW_HEADER=\"hw_hd75.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_hd75.c\" -DHW_HEADER=\"hw_hd75.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_hd75.c\" -DHW_HEADER=\"hw_hd75.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -301,7 +301,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_a50s.c\" -DHW_HEADER=\"hw_a50s.h\" -DHW_A50S_6S' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_a50s.c\" -DHW_HEADER=\"hw_a50s.h\" -DHW_A50S_6S' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -314,7 +314,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_a50s.c\" -DHW_HEADER=\"hw_a50s.h\" -DHW_A50S_12S' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_a50s.c\" -DHW_HEADER=\"hw_a50s.h\" -DHW_A50S_12S' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -327,7 +327,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_a200s_v2.c\" -DHW_HEADER=\"hw_a200s_v2.h\" -DHW_A200S_REV_21' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_a200s_v2.c\" -DHW_HEADER=\"hw_a200s_v2.h\" -DHW_A200S_REV_21' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -340,7 +340,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_a200s_v2.c\" -DHW_HEADER=\"hw_a200s_v2.h\" ' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_a200s_v2.c\" -DHW_HEADER=\"hw_a200s_v2.h\" ' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -353,14 +353,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_100_250.c\" -DHW_HEADER=\"hw_100_250.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_100_250.c\" -DHW_HEADER=\"hw_100_250.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_100_250.c\" -DHW_HEADER=\"hw_100_250.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_100_250.c\" -DHW_HEADER=\"hw_100_250.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -373,7 +373,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_luna_bbshd.c\" -DHW_HEADER=\"hw_luna_bbshd.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_luna_bbshd.c\" -DHW_HEADER=\"hw_luna_bbshd.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -387,14 +387,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_unity.c\" -DHW_HEADER=\"hw_unity.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_unity.c\" -DHW_HEADER=\"hw_unity.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_unity.c\" -DHW_HEADER=\"hw_unity.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_unity.c\" -DHW_HEADER=\"hw_unity.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -407,14 +407,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_stormcore_60d.c\" -DHW_HEADER=\"hw_stormcore_60d.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_stormcore_60d.c\" -DHW_HEADER=\"hw_stormcore_60d.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_60d.c\" -DHW_HEADER=\"hw_stormcore_60d.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_60d.c\" -DHW_HEADER=\"hw_stormcore_60d.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -427,14 +427,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_stormcore_60d.c\" -DHW_HEADER=\"hw_stormcore_60d.h\" -DHW_VER_IS_60D_PLUS' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_stormcore_60d.c\" -DHW_HEADER=\"hw_stormcore_60d.h\" -DHW_VER_IS_60D_PLUS' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_60d.c\" -DHW_HEADER=\"hw_stormcore_60d.h\" -DHW_VER_IS_60D_PLUS' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_60d.c\" -DHW_HEADER=\"hw_stormcore_60d.h\" -DHW_VER_IS_60D_PLUS' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -447,14 +447,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_stormcore_100d.c\" -DHW_HEADER=\"hw_stormcore_100d.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_stormcore_100d.c\" -DHW_HEADER=\"hw_stormcore_100d.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_100d.c\" -DHW_HEADER=\"hw_stormcore_100d.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_100d.c\" -DHW_HEADER=\"hw_stormcore_100d.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -467,14 +467,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_stormcore_100d.c\" -DHW_HEADER=\"hw_stormcore_100d.h\" -DHW_VER_IS_100D_V2' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_stormcore_100d.c\" -DHW_HEADER=\"hw_stormcore_100d.h\" -DHW_VER_IS_100D_V2' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_100d.c\" -DHW_HEADER=\"hw_stormcore_100d.h\" -DHW_VER_IS_100D_V2' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_100d.c\" -DHW_HEADER=\"hw_stormcore_100d.h\" -DHW_VER_IS_100D_V2' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -487,14 +487,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_stormcore_100s.c\" -DHW_HEADER=\"hw_stormcore_100s.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_stormcore_100s.c\" -DHW_HEADER=\"hw_stormcore_100s.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_100s.c\" -DHW_HEADER=\"hw_stormcore_100s.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_stormcore_100s.c\" -DHW_HEADER=\"hw_stormcore_100s.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -507,7 +507,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_Cheap_FOCer_2.c\" -DHW_HEADER=\"hw_Cheap_FOCer_2.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_Cheap_FOCer_2.c\" -DHW_HEADER=\"hw_Cheap_FOCer_2.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -520,14 +520,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_Little_FOCer.c\" -DHW_HEADER=\"hw_Little_FOCer.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_Little_FOCer.c\" -DHW_HEADER=\"hw_Little_FOCer.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_Little_FOCer.c\" -DHW_HEADER=\"hw_Little_FOCer.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_Little_FOCer.c\" -DHW_HEADER=\"hw_Little_FOCer.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin
@ -540,7 +540,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_uxv_sr.c\" -DHW_HEADER=\"hw_uxv_sr.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_uxv_sr.c\" -DHW_HEADER=\"hw_uxv_sr.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -558,7 +558,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_gesc.c\" -DHW_HEADER=\"hw_gesc.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_gesc.c\" -DHW_HEADER=\"hw_gesc.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -576,7 +576,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_warrior6.c\" -DHW_HEADER=\"hw_warrior6.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_warrior6.c\" -DHW_HEADER=\"hw_warrior6.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -589,7 +589,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_raiden7.c\" -DHW_HEADER=\"hw_raiden7.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_raiden7.c\" -DHW_HEADER=\"hw_raiden7.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -602,7 +602,7 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_ubox_single.c\" -DHW_HEADER=\"hw_ubox_single.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_ubox_single.c\" -DHW_HEADER=\"hw_ubox_single.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
@ -615,14 +615,14 @@ rm -f $COPYDIR/*
# default
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DHW_SOURCE=\"hw_100_500.c\" -DHW_HEADER=\"hw_100_500.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DHW_SOURCE=\"hw_100_500.c\" -DHW_HEADER=\"hw_100_500.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin
# default with HW limits disabled
cd $FWPATH
touch conf_general.h
make -j8 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_100_500.c\" -DHW_HEADER=\"hw_100_500.h\"' USE_VERBOSE_COMPILE=no
make -j12 build_args='-DDISABLE_HW_LIMITS -DHW_SOURCE=\"hw_100_500.c\" -DHW_HEADER=\"hw_100_500.h\"' USE_VERBOSE_COMPILE=no
cd $DIR
cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default_no_hw_limits.bin

View File

@ -1522,6 +1522,8 @@ void commands_process_packet(unsigned char *data, unsigned int len,
ack = data[0];
}
mc_interface_stat_reset();
if (ack) {
int32_t ind = 0;
uint8_t send_buffer[50];

View File

@ -1498,8 +1498,10 @@ int conf_general_detect_apply_all_foc(float max_power_loss,
#ifdef HW_HAS_DUAL_MOTORS
mc_interface_select_motor_thread(2);
mc_configuration *mcconf_second = mempools_alloc_mcconf();
mc_configuration *mcconf_old_second = mempools_alloc_mcconf();
*mcconf_old_second = *mc_interface_get_configuration();
*mcconf_second = *mc_interface_get_configuration();
*mcconf_old_second = *mcconf_second;
mc_interface_select_motor_thread(1);
#endif
@ -1519,8 +1521,22 @@ int conf_general_detect_apply_all_foc(float max_power_loss,
mc_interface_set_configuration(mcconf);
#ifdef HW_HAS_DUAL_MOTORS
mcconf_second->motor_type = MOTOR_TYPE_FOC;
mcconf_second->foc_sensor_mode = FOC_SENSOR_MODE_SENSORLESS;
mcconf_second->foc_f_sw = 10000.0; // Lower f_sw => less dead-time distortion
mcconf_second->foc_current_kp = 0.0005;
mcconf_second->foc_current_ki = 1.0;
mcconf_second->l_current_max = MCCONF_L_CURRENT_MAX;
mcconf_second->l_current_min = MCCONF_L_CURRENT_MIN;
mcconf_second->l_current_max_scale = MCCONF_L_CURRENT_MAX_SCALE;
mcconf_second->l_current_min_scale = MCCONF_L_CURRENT_MIN_SCALE;
mcconf_second->l_watt_max = MCCONF_L_WATT_MAX;
mcconf_second->l_watt_min = MCCONF_L_WATT_MIN;
mcconf_second->l_max_erpm = MCCONF_L_RPM_MAX;
mcconf_second->l_min_erpm = MCCONF_L_RPM_MIN;
mc_interface_select_motor_thread(2);
mc_interface_set_configuration(mcconf);
mc_interface_set_configuration(mcconf_second);
mc_interface_select_motor_thread(1);
#endif
@ -1533,6 +1549,7 @@ int conf_general_detect_apply_all_foc(float max_power_loss,
mc_interface_select_motor_thread(2);
mc_interface_set_configuration(mcconf_old_second);
mc_interface_select_motor_thread(1);
mempools_free_mcconf(mcconf_second);
mempools_free_mcconf(mcconf_old_second);
#endif
mc_interface_select_motor_thread(motor_last);
@ -1593,6 +1610,7 @@ int conf_general_detect_apply_all_foc(float max_power_loss,
mc_interface_select_motor_thread(2);
mc_interface_set_configuration(mcconf_old_second);
mc_interface_select_motor_thread(1);
mempools_free_mcconf(mcconf_second);
mempools_free_mcconf(mcconf_old_second);
#endif
mc_interface_select_motor_thread(motor_last);
@ -1607,7 +1625,8 @@ int conf_general_detect_apply_all_foc(float max_power_loss,
#ifdef HW_HAS_DUAL_MOTORS
mc_interface_select_motor_thread(2);
mc_interface_set_configuration(mcconf);
mcconf_second->foc_f_sw = 20000.0;
mc_interface_set_configuration(mcconf_second);
mc_interface_select_motor_thread(1);
#endif
@ -1730,6 +1749,7 @@ int conf_general_detect_apply_all_foc(float max_power_loss,
mempools_free_mcconf(mcconf);
mempools_free_mcconf(mcconf_old);
#ifdef HW_HAS_DUAL_MOTORS
mempools_free_mcconf(mcconf_second);
mempools_free_mcconf(mcconf_old_second);
#endif
@ -1806,8 +1826,17 @@ int conf_general_detect_apply_all_foc_can(bool detect_can, float max_power_loss,
mc_interface_set_configuration(mcconf);
#ifdef HW_HAS_DUAL_MOTORS
mc_interface_select_motor_thread(2);
mc_interface_set_configuration(mcconf);
mc_configuration *mcconf_second = mempools_alloc_mcconf();
*mcconf_second = *mc_interface_get_configuration();
mcconf_second->l_in_current_min = mcconf->l_in_current_min;
mcconf_second->l_in_current_max = mcconf->l_in_current_max;
mcconf_second->foc_openloop_rpm = mcconf->foc_openloop_rpm;
mcconf_second->foc_sl_erpm = mcconf->foc_sl_erpm;
mc_interface_set_configuration(mcconf_second);
mc_interface_select_motor_thread(1);
mempools_free_mcconf(mcconf_second);
#endif
int can_devs = 0;

View File

@ -24,7 +24,7 @@
#define FW_VERSION_MAJOR 5
#define FW_VERSION_MINOR 03
// Set to 0 for building a release and iterate during beta test builds
#define FW_TEST_VERSION_NUMBER 68
#define FW_TEST_VERSION_NUMBER 75
#include "datatypes.h"

View File

@ -204,6 +204,7 @@ int32_t confgenerator_serialize_appconf(uint8_t *buffer, const app_configuration
buffer[ind++] = conf->can_mode;
buffer[ind++] = (uint8_t)conf->uavcan_esc_index;
buffer[ind++] = conf->uavcan_raw_mode;
buffer_append_float32_auto(buffer, conf->uavcan_raw_rpm_max, &ind);
buffer[ind++] = conf->servo_out_enable;
buffer[ind++] = conf->kill_sw_mode;
buffer[ind++] = conf->app_to_use;
@ -223,7 +224,7 @@ int32_t confgenerator_serialize_appconf(uint8_t *buffer, const app_configuration
buffer[ind++] = conf->app_ppm_conf.multi_esc;
buffer[ind++] = conf->app_ppm_conf.tc;
buffer_append_float32_auto(buffer, conf->app_ppm_conf.tc_max_diff, &ind);
buffer_append_float32_auto(buffer, conf->app_ppm_conf.max_erpm_for_dir, &ind);
buffer_append_float16(buffer, conf->app_ppm_conf.max_erpm_for_dir, 1, &ind);
buffer_append_float32_auto(buffer, conf->app_ppm_conf.smart_rev_max_duty, &ind);
buffer_append_float32_auto(buffer, conf->app_ppm_conf.smart_rev_ramp_time, &ind);
buffer[ind++] = conf->app_adc_conf.ctrl_type;
@ -574,6 +575,7 @@ bool confgenerator_deserialize_appconf(const uint8_t *buffer, app_configuration
conf->can_mode = buffer[ind++];
conf->uavcan_esc_index = buffer[ind++];
conf->uavcan_raw_mode = buffer[ind++];
conf->uavcan_raw_rpm_max = buffer_get_float32_auto(buffer, &ind);
conf->servo_out_enable = buffer[ind++];
conf->kill_sw_mode = buffer[ind++];
conf->app_to_use = buffer[ind++];
@ -593,7 +595,7 @@ bool confgenerator_deserialize_appconf(const uint8_t *buffer, app_configuration
conf->app_ppm_conf.multi_esc = buffer[ind++];
conf->app_ppm_conf.tc = buffer[ind++];
conf->app_ppm_conf.tc_max_diff = buffer_get_float32_auto(buffer, &ind);
conf->app_ppm_conf.max_erpm_for_dir = buffer_get_float32_auto(buffer, &ind);
conf->app_ppm_conf.max_erpm_for_dir = buffer_get_float16(buffer, 1, &ind);
conf->app_ppm_conf.smart_rev_max_duty = buffer_get_float32_auto(buffer, &ind);
conf->app_ppm_conf.smart_rev_ramp_time = buffer_get_float32_auto(buffer, &ind);
conf->app_adc_conf.ctrl_type = buffer[ind++];
@ -928,6 +930,7 @@ void confgenerator_set_defaults_appconf(app_configuration *conf) {
conf->can_mode = APPCONF_CAN_MODE;
conf->uavcan_esc_index = APPCONF_UAVCAN_ESC_INDEX;
conf->uavcan_raw_mode = APPCONF_UAVCAN_RAW_MODE;
conf->uavcan_raw_rpm_max = APPCONF_UAVCAN_RAW_RPM_MAX;
conf->servo_out_enable = APPCONF_SERVO_OUT_ENABLE;
conf->kill_sw_mode = APPCONF_KILL_SW_MODE;
conf->app_to_use = APPCONF_APP_TO_USE;

View File

@ -8,8 +8,8 @@
#include <stdbool.h>
// Constants
#define MCCONF_SIGNATURE 2686986464
#define APPCONF_SIGNATURE 763356168
#define MCCONF_SIGNATURE 2090246193
#define APPCONF_SIGNATURE 3733512279
// Functions
int32_t confgenerator_serialize_mcconf(uint8_t *buffer, const mc_configuration *conf);

View File

@ -854,7 +854,8 @@ typedef enum {
typedef enum {
UAVCAN_RAW_MODE_CURRENT = 0,
UAVCAN_RAW_MODE_CURRENT_NO_REV_BRAKE,
UAVCAN_RAW_MODE_DUTY
UAVCAN_RAW_MODE_DUTY,
UAVCAN_RAW_MODE_RPM
} UAVCAN_RAW_MODE;
typedef enum {
@ -883,6 +884,7 @@ typedef struct {
CAN_MODE can_mode;
uint8_t uavcan_esc_index;
UAVCAN_RAW_MODE uavcan_raw_mode;
float uavcan_raw_rpm_max;
// Application to use
app_use app_to_use;

View File

@ -216,8 +216,7 @@
#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. See the stm32f4 reference manual for calculating this value.
#define HW_DEAD_TIME_NSEC 660.0
#define HW_DEAD_TIME_NSEC 1000.0
// Default setting overrides
#ifndef MCCONF_L_MIN_VOLTAGE

View File

@ -510,7 +510,9 @@ static void handle_esc_raw_command(CanardInstance* ins, CanardRxTransfer* transf
if (cmd.cmd.len > app_get_configuration()->uavcan_esc_index) {
float raw_val = ((float)cmd.cmd.data[app_get_configuration()->uavcan_esc_index]) / 8192.0;
switch (app_get_configuration()->uavcan_raw_mode) {
volatile const app_configuration *conf = app_get_configuration();
switch (conf->uavcan_raw_mode) {
case UAVCAN_RAW_MODE_CURRENT:
mc_interface_set_current_rel(raw_val);
break;
@ -527,6 +529,10 @@ static void handle_esc_raw_command(CanardInstance* ins, CanardRxTransfer* transf
mc_interface_set_duty(raw_val);
break;
case UAVCAN_RAW_MODE_RPM:
mc_interface_set_pid_speed(raw_val * conf->uavcan_raw_rpm_max);
break;
default:
break;
}

View File

@ -152,7 +152,11 @@ typedef struct {
int m_hfi_plot_en;
float m_hfi_plot_sample;
float m_phase_before;
// For braking
float m_br_speed_before;
float m_br_vq_before;
int m_br_no_duty_samples;
float m_duty_abs_filtered;
float m_duty_filtered;
bool m_was_control_duty;
@ -2640,27 +2644,28 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
motor_now->m_phase_now_encoder = DEG2RAD_f(phase_tmp);
}
const float phase_diff = utils_angle_difference_rad(motor_now->m_motor_state.phase, motor_now->m_phase_before);
motor_now->m_phase_before = motor_now->m_motor_state.phase;
if (motor_now->m_state == MC_STATE_RUNNING) {
// Clarke transform assuming balanced currents
motor_now->m_motor_state.i_alpha = ia;
motor_now->m_motor_state.i_beta = ONE_BY_SQRT3 * ia + TWO_BY_SQRT3 * ib;
// Full Clarke transform in case there are current offsets
// motor_now->m_motor_state.i_alpha = (2.0 / 3.0) * ia - (1.0 / 3.0) * ib - (1.0 / 3.0) * ic;
// motor_now->m_motor_state.i_beta = ONE_BY_SQRT3 * ib - ONE_BY_SQRT3 * ic;
const float duty_now = motor_now->m_motor_state.duty_now;
const float duty_abs = fabsf(duty_now);
const float vq_now = motor_now->m_motor_state.vq;
const float speed_fast_now = motor_now->m_pll_speed;
const float duty_abs = fabsf(motor_now->m_motor_state.duty_now);
float id_set_tmp = motor_now->m_id_set;
float iq_set_tmp = motor_now->m_iq_set;
motor_now->m_motor_state.max_duty = conf_now->l_max_duty;
UTILS_LP_FAST(motor_now->m_duty_abs_filtered, fabsf(motor_now->m_motor_state.duty_now), 0.01);
if (motor_now->m_control_mode == CONTROL_MODE_CURRENT_BRAKE) {
utils_truncate_number_abs(&iq_set_tmp, -conf_now->lo_current_min);
}
UTILS_LP_FAST(motor_now->m_duty_abs_filtered, duty_abs, 0.01);
utils_truncate_number_abs((float*)&motor_now->m_duty_abs_filtered, 1.0);
UTILS_LP_FAST(motor_now->m_duty_filtered, motor_now->m_motor_state.duty_now, 0.01);
UTILS_LP_FAST(motor_now->m_duty_filtered, duty_now, 0.01);
utils_truncate_number_abs((float*)&motor_now->m_duty_filtered, 1.0);
float duty_set = motor_now->m_duty_cycle_set;
@ -2668,17 +2673,31 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
motor_now->m_control_mode == CONTROL_MODE_OPENLOOP_DUTY ||
motor_now->m_control_mode == CONTROL_MODE_OPENLOOP_DUTY_PHASE;
// When the modulation is low in brake mode and the set brake current
// cannot be reached, short all phases to get more braking without
// applying active braking. Use a bit of hysteresis when leaving
// the shorted mode.
if (motor_now->m_control_mode == CONTROL_MODE_CURRENT_BRAKE &&
fabsf(motor_now->m_duty_filtered) < conf_now->l_min_duty * 1.5 &&
motor_now->m_motor_state.i_abs < fminf(fabsf(iq_set_tmp), fabsf(conf_now->l_current_min))) {
control_duty = true;
duty_set = 0.0;
// Short all phases (duty=0) the moment the direction or modulation changes sign. That will avoid
// active braking or changing direction. Keep all phases shorted (duty == 0) until the
// braking current reaches the set or maximum value, then go back to current control
// mode. Stay in duty=0 for at least 10 cycles to avoid jumping in and out of that mode rapidly
// around the threshold.
if (motor_now->m_control_mode == CONTROL_MODE_CURRENT_BRAKE) {
if ((SIGN(speed_fast_now) != SIGN(motor_now->m_br_speed_before) ||
SIGN(vq_now) != SIGN(motor_now->m_br_vq_before) ||
fabsf(motor_now->m_duty_filtered) < 0.001 || motor_now->m_br_no_duty_samples < 10) &&
motor_now->m_motor_state.i_abs_filter < fabsf(iq_set_tmp)) {
control_duty = true;
duty_set = 0.0;
motor_now->m_br_no_duty_samples = 0;
} else if (motor_now->m_br_no_duty_samples < 10) {
control_duty = true;
duty_set = 0.0;
motor_now->m_br_no_duty_samples++;
}
} else {
motor_now->m_br_no_duty_samples = 0;
}
motor_now->m_br_speed_before = speed_fast_now;
motor_now->m_br_vq_before = vq_now;
// Brake when set ERPM is below min ERPM
if (motor_now->m_control_mode == CONTROL_MODE_SPEED &&
fabsf(motor_now->m_speed_pid_set_rpm) < conf_now->s_pid_min_erpm) {
@ -2697,6 +2716,10 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
}
motor_now->m_was_control_duty = control_duty;
if (!control_duty) {
motor_now->m_duty_i_term = motor_now->m_motor_state.iq / conf_now->lo_current_max;
}
if (control_duty) {
// Duty cycle control
if (fabsf(duty_set) < (duty_abs - 0.05) ||
@ -2723,7 +2746,7 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
} else {
// If the duty cycle is less than or equal to the set duty cycle just limit
// the modulation and use the maximum allowed current.
motor_now->m_duty_i_term = 0.0;
motor_now->m_duty_i_term = motor_now->m_motor_state.iq / conf_now->lo_current_max;
motor_now->m_motor_state.max_duty = duty_set;
if (duty_set > 0.0) {
iq_set_tmp = conf_now->lo_current_max;
@ -2733,13 +2756,7 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
}
} else if (motor_now->m_control_mode == CONTROL_MODE_CURRENT_BRAKE) {
// Braking
iq_set_tmp = fabsf(iq_set_tmp);
if (phase_diff > 0.0) {
iq_set_tmp = -iq_set_tmp;
} else if (phase_diff == 0.0) {
iq_set_tmp = 0.0;
}
iq_set_tmp = -SIGN(speed_fast_now) * fabsf(iq_set_tmp);
}
// Set motor phase
@ -2748,6 +2765,9 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
observer_update(motor_now->m_motor_state.v_alpha, motor_now->m_motor_state.v_beta,
motor_now->m_motor_state.i_alpha, motor_now->m_motor_state.i_beta, dt,
&motor_now->m_observer_x1, &motor_now->m_observer_x2, &motor_now->m_phase_now_observer, motor_now);
// Compensate from the phase lag caused by the switching frequency. This is important for motors
// that run on high ERPM compared to the switching frequency.
motor_now->m_phase_now_observer += motor_now->m_pll_speed * dt * 0.5;
utils_norm_angle_rad((float*)&motor_now->m_phase_now_observer);
}
@ -3579,7 +3599,7 @@ void observer_update(float v_alpha, float v_beta, float i_alpha, float i_beta,
// Temperature compensation
const float t = mc_interface_temp_motor_filtered();
if (conf_now->foc_temp_comp && t > -25.0) {
if (conf_now->foc_temp_comp && t > -30.0) {
R += R * 0.00386 * (t - conf_now->foc_temp_comp_base_temp);
}
@ -3747,7 +3767,7 @@ static void control_current(volatile motor_all_state_t *motor, float dt) {
// Temperature compensation
const float t = mc_interface_temp_motor_filtered();
float ki = conf_now->foc_current_ki;
if (conf_now->foc_temp_comp && t > -5.0) {
if (conf_now->foc_temp_comp && t > -30.0) {
ki += ki * 0.00386 * (t - conf_now->foc_temp_comp_base_temp);
}
@ -3764,8 +3784,8 @@ static void control_current(volatile motor_all_state_t *motor, float dt) {
float dec_bemf = 0.0;
if (motor->m_control_mode < CONTROL_MODE_HANDBRAKE && conf_now->foc_cc_decoupling != FOC_CC_DECOUPLING_DISABLED) {
float lq = conf_now->foc_motor_l + conf_now->foc_motor_ld_lq_diff / 2.0;
float ld = conf_now->foc_motor_l - conf_now->foc_motor_ld_lq_diff / 2.0;
float lq = conf_now->foc_motor_l + conf_now->foc_motor_ld_lq_diff * 0.5;
float ld = conf_now->foc_motor_l - conf_now->foc_motor_ld_lq_diff * 0.5;
switch (conf_now->foc_cc_decoupling) {
case FOC_CC_DECOUPLING_CROSS:

View File

@ -721,7 +721,7 @@ void terminal_process_string(char *str) {
#endif
commands_printf("Motor Current : %.1f A", (double)(mcconf->l_current_max));
commands_printf("Motor R : %.2f mOhm", (double)(mcconf->foc_motor_r * 1e3));
commands_printf("Motor L : %.2f microH", (double)(mcconf->foc_motor_l * 1e6));
commands_printf("Motor L : %.2f uH", (double)(mcconf->foc_motor_l * 1e6));
commands_printf("Motor Flux Linkage : %.3f mWb", (double)(mcconf->foc_motor_flux_linkage * 1e3));
commands_printf("Temp Comp : %s", mcconf->foc_temp_comp ? "true" : "false");
if (mcconf->foc_temp_comp) {
@ -743,7 +743,7 @@ void terminal_process_string(char *str) {
commands_printf("\nMOTOR 2\n");
commands_printf("Motor Current : %.1f A", (double)(mcconf->l_current_max));
commands_printf("Motor R : %.2f mOhm", (double)(mcconf->foc_motor_r * 1e3));
commands_printf("Motor L : %.2f microH", (double)(mcconf->foc_motor_l * 1e6));
commands_printf("Motor L : %.2f uH", (double)(mcconf->foc_motor_l * 1e6));
commands_printf("Motor Flux Linkage : %.3f mWb", (double)(mcconf->foc_motor_flux_linkage * 1e3));
commands_printf("Temp Comp : %s", mcconf->foc_temp_comp ? "true" : "false");
if (mcconf->foc_sensor_mode == FOC_SENSOR_MODE_SENSORLESS) {
@ -1122,21 +1122,6 @@ void terminal_process_string(char *str) {
commands_printf("Invalid arguments\n");
}
}
} else if (strcmp(argv[0], "stats") == 0) {
commands_printf("Speed Avg : %.1f km/h", (double)(mc_interface_stat_speed_avg() * 3.6));
commands_printf("Speed Max : %.1f km/h", (double)(mc_interface_stat_speed_max() * 3.6));
commands_printf("Power Avg : %.1f W", (double)mc_interface_stat_power_avg());
commands_printf("Power Max : %.1f W", (double)mc_interface_stat_power_max());
commands_printf("Current Avg: %.1f A", (double)mc_interface_stat_current_avg());
commands_printf("Current Max: %.1f A", (double)mc_interface_stat_current_max());
commands_printf("T FET Avg : %.1f degC", (double)mc_interface_stat_temp_mosfet_avg());
commands_printf("T FET Max : %.1f degC", (double)mc_interface_stat_temp_mosfet_max());
commands_printf("T MOTOR Avg: %.1f degC", (double)mc_interface_stat_temp_motor_avg());
commands_printf("T MOTOR Max: %.1f degC", (double)mc_interface_stat_temp_motor_max());
commands_printf("Count Time : %.1f s\n", (double)mc_interface_stat_count_time());
} else if (strcmp(argv[0], "stats_reset") == 0) {
mc_interface_stat_reset();
commands_printf("OK\n");
}
// The help command
@ -1285,12 +1270,6 @@ void terminal_process_string(char *str) {
commands_printf("update_pid_pos_offset [angle_now] [store]");
commands_printf(" Update position PID offset.");
commands_printf("stats");
commands_printf(" Print setup statistics.");
commands_printf("stats_reset");
commands_printf(" Reset setup statistics.");
for (int i = 0;i < callback_write;i++) {
if (callbacks[i].cbf == 0) {
continue;

View File

@ -323,6 +323,8 @@ float utils_fast_atan2(float y, float x) {
angle = ((0.1963 * rsq) - 0.9817) * r + (3.0 * M_PI / 4.0);
}
UTILS_NAN_ZERO(angle);
if (y < 0) {
return(-angle);
} else {

View File

@ -67,8 +67,8 @@ uint16_t utils_median_filter_uint16_run(uint16_t *buffer,
unsigned int *buffer_index, unsigned int filter_len, uint16_t sample);
const char* utils_hw_type_to_string(HW_TYPE hw);
// Return the sign of the argument. -1 if negative, 1 if zero or positive.
#define SIGN(x) ((x < 0) ? -1 : 1)
// Return the sign of the argument. -1.0 if negative, 1.0 if zero or positive.
#define SIGN(x) (((x) < 0.0) ? -1.0 : 1.0)
// Squared
#define SQ(x) ((x) * (x))