fixed serial debug output, backward beep and low bat beeps work now together, low bat beeps can now be disabled, added inactivity timeout

This commit is contained in:
larsm 2018-07-25 12:54:13 +02:00
parent 2932480274
commit 612dce68ea
5 changed files with 280 additions and 254 deletions

View File

@ -6,23 +6,29 @@
#define PWM_FREQ 16000 // PWM frequency in Hz
#define DEAD_TIME 32 // PWM deadtime
#define DC_CUR_LIMIT 15 // Motor DC current limit in amps. it does not disable motors, it is a soft current limit.
#define DC_CUR_LIMIT 15 // DC current limit in amps per motor. so 15 means it will draw 30A out of your battery. it does not disable motors, it is a soft current limit.
// Battery voltage calibration: connect power source. use multimeter to measure real voltage and write it to BAT_CALIB_REAL_VOLTAGE. watch UART on one of the sensor board cables. write value nr 4 to BAT_CALIB_ADC. make and flash firmware. you can verify voltage on UART debug value 5 (devide it by 100.0 to get calibrated voltage).
#define DELAY_IN_MAIN_LOOP 5 // in ms. default 5. it is independent of all the timing critical stuff. do not touch if you do not know what you are doing.
// Battery voltage calibration: connect power source. use multimeter to measure real voltage and write it to BAT_CALIB_REAL_VOLTAGE. enable DEBUG_SERIAL_USART3 and DEBUG_SERIAL_ASCII (and disconnect and disable CONTROL_NUNCHUCK) and watch UART on right sensor board cable. write value nr 5 to BAT_CALIB_ADC. make and flash firmware. you can verify voltage on UART debug value 6 (devide it by 100.0 to get calibrated voltage).
#define BAT_CALIB_REAL_VOLTAGE 42.0 // input voltage measured by multimeter
#define BAT_CALIB_ADC 1667 // adc-value measured by mainboard (value nr 4 on UART debug output)
#define BAT_NUMBER_OF_CELLS 10 // normal Hoverboard battery: 10s
#define BAT_NUMBER_OF_CELLS 12 // normal Hoverboard battery: 10s
#define BAT_LOW_LVL1_ENABLE 0 // to beep or not to beep, 1 or 0
#define BAT_LOW_LVL1 3.6 // gently beeps at this voltage level. [V/cell]
#define BAT_LOW_LVL2 3.5 // your battery is almost empty. Charge now! [V/cell]
#define BAT_LOW_DEAD 3.37 // undervoltage lockout. [V/cell]
#define BAT_LOW_LVL2_ENABLE 1 // to beep or not to beep, 1 or 0
#define BAT_LOW_LVL2 3.5 // your battery is almost empty. Charge now! [V/cell]
#define BAT_LOW_DEAD 3.37 // undervoltage lockout. [V/cell]
#define INACTIVITY_TIMEOUT 8 // minutes of not driving until poweroff. it is not very precise.
// ################################################################################
//#define DEBUG_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuck) is used!
#define DEBUG_BAUD 115200 // UART baud rate
//#define DEBUG_SERIAL_SERVOTERM
//#define DEBUG_SERIAL_ASCII // human readable output. i.e. "345;1337;0;0\n\r"
#define DEBUG_SERIAL_ASCII // "1:345 2:1337 3:0 4:0 5:0 6:0 7:0 8:0\r\n"
//#define CONTROL_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used!
#define CONTROL_BAUD 19200 // control via usart from eg an Arduino or raspberry
@ -40,7 +46,7 @@
//#define PPM_NUM_CHANNELS 6 // total number of PPM channels to receive, even if they are not used.
// ###### CONTROL VIA TWO POTENTIOMETERS ######
// ADC-calibration to cover the full poti-range: connect potis to left sensor board cable (0 to 3.3V), watch UART on the right sensor board cable. the first 2 values are ADC1 and ADC2. write minimum and maximum poti position-values to ADC?_MIN and ADC?_MAX.
// ADC-calibration to cover the full poti-range: connect potis to left sensor board cable (0 to 3.3V) (do NOT use the red 15V wire in the cable!). enable DEBUG_SERIAL_USART3 and DEBUG_SERIAL_ASCII (and disconnect and disable CONTROL_NUNCHUCK) and watch UART on right sensor board cable. value1 == ADC1 and value2 == ADC2. write minimum and maximum poti position-values to ADC?_MIN and ADC?_MAX.
//#define CONTROL_ADC // use ADC as input. disable DEBUG_SERIAL_USART2!
//#define ADC1_MIN 0 // min ADC1-value while poti at minimum-position (0 - 4095)
//#define ADC1_MAX 4095 // max ADC1-value while poti at maximum-position (0 - 4095)
@ -64,7 +70,7 @@
// - weakr and weakl: field weakening for extra boost at high speed (speedR > 700 and speedL > 700). 0 to ~400
#define FILTER 0.1 // lower value == softer filter. do not use values <0.01, you will get float precision issues.
#define SPEED_COEFFICIENT 0.5 // higher value == stronger. 0.0 to 1.0
#define SPEED_COEFFICIENT 0.5 // higher value == stronger. 0.0 to ~2.0?
#define STEER_COEFFICIENT 0.5 // higher value == stronger. if you do not want any steering, set it to 0.0; 0.0 to 1.0
//#define INVERT_R_DIRECTION
//#define INVERT_L_DIRECTION
@ -108,7 +114,7 @@ else {\
weakl = 0;\
weakr = 0;
// #define BEEPS_BACKWARD
#define BEEPS_BACKWARD 1 // 0 or 1
// ################################################################################

View File

@ -165,18 +165,6 @@ void DMA1_Channel1_IRQHandler() {
batteryVoltage = batteryVoltage * 0.999 + ((float)adc_buffer.batt1 * ((float)BAT_CALIB_REAL_VOLTAGE / (float)BAT_CALIB_ADC)) * 0.001;
}
#ifdef BEEPS_BACKWARD
if (speed < -50 && enable == 1) {
buzzerFreq = 5;
buzzerPattern = 1;
} else if (enable == 1) {
buzzerFreq = 0;
buzzerPattern = 1;
}
#endif
//disable PWM when current limit is reached (current chopping)
if(ABS((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP) > DC_CUR_LIMIT || timeout > TIMEOUT || enable == 0) {
LEFT_TIM->BDTR &= ~TIM_BDTR_MOE;

View File

@ -25,7 +25,7 @@ void setScopeChannel(uint8_t ch, int16_t val) {
}
void consoleScope() {
#ifdef DEBUG_SERIAL_SERVOTERM
#if defined DEBUG_SERIAL_SERVOTERM && defined DEBUG_SERIAL_USART3
uart_buf[0] = 0xff;
uart_buf[1] = CLAMP(ch_buf[0]+127, 0, 255);
uart_buf[2] = CLAMP(ch_buf[1]+127, 0, 255);
@ -45,7 +45,7 @@ void consoleScope() {
}
#endif
#ifdef DEBUG_SERIAL_ASCII
#if defined DEBUG_SERIAL_ASCII && defined DEBUG_SERIAL_USART3
memset(uart_buf, 0, sizeof(uart_buf));
sprintf(uart_buf, "1:%i 2:%i 3:%i 4:%i 5:%i 6:%i 7:%i 8:%i\r\n", ch_buf[0], ch_buf[1], ch_buf[2], ch_buf[3], ch_buf[4], ch_buf[5], ch_buf[6], ch_buf[7]);

View File

@ -67,6 +67,8 @@ extern uint8_t enable; // global variable for motor enable
extern volatile uint32_t timeout; // global variable for timeout
extern float batteryVoltage; // global variable for battery voltage
uint32_t inactivity_timeout_counter;
extern uint8_t nunchuck_data[6];
#ifdef CONTROL_PPM
extern volatile uint16_t ppm_captured_value[PPM_NUM_CHANNELS+1];
@ -162,7 +164,7 @@ int main(void) {
enable = 1; // enable motors
while(1) {
HAL_Delay(5);
HAL_Delay(DELAY_IN_MAIN_LOOP); //delay in ms
#ifdef CONTROL_NUNCHUCK
Nunchuck_Read();
@ -211,17 +213,19 @@ int main(void) {
// ####### DEBUG SERIAL OUT #######
#ifdef CONTROL_ADC
setScopeChannel(0, (int)adc_buffer.l_tx2); // 1: ADC1
setScopeChannel(1, (int)adc_buffer.l_rx2); // 2: ADC2
#endif
setScopeChannel(2, (int)speedR); // 3:
setScopeChannel(3, (int)speedL); // 4:
setScopeChannel(4, (int)adc_buffer.batt1); // 5: for battery voltage calibration
setScopeChannel(5, (int)(batteryVoltage * 100.0f)); // 6: for verifying battery voltage calibration
// setScopeChannel(6, (int)); // 7:
// setScopeChannel(7, (int)); // 8:
consoleScope();
if (inactivity_timeout_counter % 10 == 0) {
#ifdef CONTROL_ADC
setScopeChannel(0, (int)adc_buffer.l_tx2); // 1: ADC1
setScopeChannel(1, (int)adc_buffer.l_rx2); // 2: ADC2
#endif
setScopeChannel(2, (int)speedR); // 3:
setScopeChannel(3, (int)speedL); // 4:
setScopeChannel(4, (int)adc_buffer.batt1); // 5: for battery voltage calibration
setScopeChannel(5, (int)(batteryVoltage * 100.0f)); // 6: for verifying battery voltage calibration
// setScopeChannel(6, (int)); // 7:
// setScopeChannel(7, (int)); // 8:
consoleScope();
}
#ifdef ADDITIONAL_CODE
@ -263,13 +267,16 @@ int main(void) {
// ####### BATTERY VOLTAGE #######
if (batteryVoltage < ((float)BAT_LOW_LVL1 * (float)BAT_NUMBER_OF_CELLS) && batteryVoltage > ((float)BAT_LOW_LVL2 * (float)BAT_NUMBER_OF_CELLS)) {
if (BEEPS_BACKWARD && speed < -50) { // backward beep
buzzerFreq = 5;
buzzerPattern = 1;
} else if (batteryVoltage < ((float)BAT_LOW_LVL1 * (float)BAT_NUMBER_OF_CELLS) && batteryVoltage > ((float)BAT_LOW_LVL2 * (float)BAT_NUMBER_OF_CELLS) && BAT_LOW_LVL1_ENABLE) { // low bat 1: slow beep
buzzerFreq = 5;
buzzerPattern = 42;
} else if (batteryVoltage < ((float)BAT_LOW_LVL2 * (float)BAT_NUMBER_OF_CELLS) && batteryVoltage > ((float)BAT_LOW_DEAD * (float)BAT_NUMBER_OF_CELLS)) {
} else if (batteryVoltage < ((float)BAT_LOW_LVL2 * (float)BAT_NUMBER_OF_CELLS) && batteryVoltage > ((float)BAT_LOW_DEAD * (float)BAT_NUMBER_OF_CELLS) && BAT_LOW_LVL2_ENABLE) { // low bat 2: fast beep
buzzerFreq = 5;
buzzerPattern = 6;
} else if (batteryVoltage < ((float)BAT_LOW_DEAD * (float)BAT_NUMBER_OF_CELLS)) {
} else if (batteryVoltage < ((float)BAT_LOW_DEAD * (float)BAT_NUMBER_OF_CELLS) && abs(speed) < 20) { // low bat 3: power off
buzzerPattern = 0;
enable = 0;
for (int i = 0; i < 8; i++) {
@ -278,10 +285,28 @@ int main(void) {
}
HAL_GPIO_WritePin(OFF_PORT, OFF_PIN, 0);
while(1) {}
} else {
} else { // do not beep
buzzerFreq = 0;
buzzerPattern = 0;
}
// ####### INACTIVITY TIMEOUT #######
if (abs(speedL) > 50 || abs(speedR) > 50) {
inactivity_timeout_counter = 0;
} else {
inactivity_timeout_counter ++;
}
if (inactivity_timeout_counter > (INACTIVITY_TIMEOUT * 60 * 1000) / (DELAY_IN_MAIN_LOOP + 1)) { // rest of main loop needs maybe 1ms
buzzerPattern = 0;
enable = 0;
for (int i = 0; i < 8; i++) {
buzzerFreq = i;
HAL_Delay(100);
}
HAL_GPIO_WritePin(OFF_PORT, OFF_PIN, 0);
while(1) {}
}
}
}

View File

@ -1,23 +1,23 @@
:020000040800F2
:1000000000C000206538000847380008493800085B
:100010004B3800084D3800084F3800080000000039
:10002000000000000000000000000000513800083F
:100030005338000800000000553800085738000801
:10004000AD380008AD380008AD380008AD380008FC
:10005000AD380008AD380008AD380008AD380008EC
:10006000AD380008AD380008AD380008E9300008A8
:10007000AD380008AD380008AD380008AD380008CC
:10008000AD380008AD380008AD380008AD380008BC
:10009000AD380008AD380008AD380008AD380008AC
:1000A000AD380008AD380008AD380008AD3800089C
:1000B000AD380008AD380008AD380008AD3800088C
:1000C000AD380008AD380008AD380008AD3800087C
:1000D000AD380008AD380008AD380008AD3800086C
:1000E000AD380008AD380008AD380008AD3800085C
:1000F000AD380008AD380008AD380008AD3800084C
:10010000AD380008AD380008AD380008AD3800083B
:10011000AD380008AD380008AD380008AD3800082B
:10012000AD380008AD380008AD380008AD3800081B
:1000000000C00020D5380008B7380008B93800080B
:10001000BB380008BD380008BF38000800000000E9
:10002000000000000000000000000000C1380008CF
:10003000C338000800000000C5380008C7380008B1
:100040001D3900081D3900081D3900081D39000838
:100050001D3900081D3900081D3900081D39000828
:100060001D3900081D3900081D39000859310008E4
:100070001D3900081D3900081D3900081D39000808
:100080001D3900081D3900081D3900081D390008F8
:100090001D3900081D3900081D3900081D390008E8
:1000A0001D3900081D3900081D3900081D390008D8
:1000B0001D3900081D3900081D3900081D390008C8
:1000C0001D3900081D3900081D3900081D390008B8
:1000D0001D3900081D3900081D3900081D390008A8
:1000E0001D3900081D3900081D3900081D39000898
:1000F0001D3900081D3900081D3900081D39000888
:100100001D3900081D3900081D3900081D39000877
:100110001D3900081D3900081D3900081D39000867
:100120001D3900081D3900081D3900081D39000857
:1001300000000000000000000000000000000000BF
:1001400000000000000000000000000000000000AF
:10015000000000000000000000000000000000009F
@ -32,8 +32,8 @@
:0401E0005FF8E0F1F3
:1001E80010B5054C237833B9044B13B10448AFF369
:1001F80000800123237010BD2400002000000000AF
:10020800F838000808B5034B1BB103490348AFF39E
:10021800008008BD0000000028000020F838000811
:100208006839000808B5034B1BB103490348AFF32D
:10021800008008BD000000002800002068390008A0
:1002280081F0004102E000BF83F0004330B54FEA9F
:1002380041044FEA430594EA050F08BF90EA020F0C
:100248001FBF54EA000C55EA020C7FEA645C7FEA9F
@ -353,7 +353,7 @@
:1015E800624412F8100C13F4803F05D10C4B03FB36
:1015F80000F007B010BC7047084B5B68C3F340436A
:10160800634413F8142C074BB3FBF2F300FB03F00D
:10161800EFE70448EDE700BF10390008001002406A
:10161800EFE70448EDE700BF8039000800100240FA
:1016280000093D0000127A00594B1B6803F00703BC
:101638008B420CD2564A136823F007030B431360FE
:10164800136803F007038B4201D00120704770B57F
@ -377,7 +377,7 @@
:1017680023F46053296943EAC1035360FFF724FF58
:10177800084B5B68C3F30313074AD35CD840074B95
:101788001860002000F01EFD002070BD0120FCE75D
:101798000020024000100240243900080000002008
:101798000020024000100240943900080000002098
:1017A800014B1868704700BF0000002030B4036A7E
:1017B80023F001030362056A4268846924F0730414
:1017C8000B681C4325F002058B682B43104DA8427B
@ -720,7 +720,7 @@
:102CD800FFF7ECF9FEF764FD084BA3FB0030800911
:102CE800FFF7AEF80420FFF7C1F8224621464FF05F
:102CF800FF30FFF765F817B030BD00BFD34D621045
:102D08002DE9F04F83B0FFF773FA874CA36943F0BE
:102D08002DE9F04F83B0FFF773FAC94CA36943F07C
:102D18000103A361A36903F001030193019B03204D
:102D2800FFF73CF8002211466FF00B00FFF748F858
:102D3800002211466FF00A00FFF742F80022114600
@ -729,197 +729,204 @@
:102D6800002211466FF00100FFF72AF800221146F1
:102D78004FF0FF30FFF724F8FFF788FF636923F06F
:102D880001036361FFF79CFCFFF79CFDFFF792FED0
:102D9800FFF724FF012220216448FFF77CF96448EB
:102DA800FFF736FB6348FFF733FB082405E0624B67
:102D9800FFF724FF01222021A648FFF77CF9A64867
:102DA800FFF736FBA548FFF733FB082405E0A44BE3
:102DB8001C706420FFF73CFA013C002CF7DA4FF056
:102DC800000A5D4B83F800A0012204215B48FFF74D
:102DD80062F95B4B01221A70D346D8E04FF47A7837
:102DC800000A9F4B83F800A0012204219D48FFF7C9
:102DD80062F99D4B01221A70D34674E04FF47A7859
:102DE80032463B4620462946FDF720FA04460D4662
:102DF8000022544BFDF760FE88B949A3D3E90023AC
:102E080020462946FDF73AFE002856D12046294695
:102E1800FDF75CFE044604E0DFF85081E0E74FF47C
:102E28007A744146022000F003FD2146032000F099
:102E3800FFFC454B9989042000F0FAFC4349444BB8
:102E48001868FDF7C9FFFEF78DF90146052000F067
:102E5800EFFC00F0F3FC0AF13203A34215DDAAF1FE
:102E6800320AA24511DA0BF1320343450DDDABF10D
:102E7800320BC34509DA374B1B68042B05D8C8F158
:102E88000003354A1360354B1C6002212748FFF7C1
:102E9800FBF8A0B92E4B1D6831492846FEF73AF9D0
:102EA80050B330492846FEF753F928B3224B052280
:102EB8001A702D4B2A221A7067E02C4CB1E7204B70
:102EC80000221A7002211948FFF7DEF80028F9D10C
:102ED8000024194B1C70244B1C7005E0164B1C7009
:102EE8006420FFF7A5F90134072CF7DD0022202123
:102EF8000E48FFF7D0F8FEE71A492846FEF70AF908
:102F0800C0B31B492846FEF723F998B30A4B05229C
:102F18001A70154B06221A7037E000BFAFF3008015
:102F28000000000000408FC000100240000801406F
:102F3800FC010020B000002040000020000C0140EF
:102F48004800002000408F40700200200000C84266
:102F580008000020040000205C0000205800002029
:102F6800CCCC2C42000028424100002018FCFFFF76
:102F78008FC221424E492846FEF7CCF8002874D16A
:102F880000234C4A13704C4A1370C346A2460520CE
:102F9800FFF74EF9494C2068FDF794FA3EA3D3E9B0
:102FA8000023FDF7F9FA06460F46454B1868FDF76A
:102FB80089FA3BA3D3E90023FDF7EEFA02460B4654
:102FC80030463946FDF732F9FDF780FD06462060A8
:102FD8003C4F3868FDF776FA2FA3D3E90023FDF7B5
:102FE800DBFA04460D46384B1868FDF76BFA2CA33C
:102FF800D3E90023FDF7D0FA02460B4620462946BE
:10300800FDF714F9FDF762FD3860FDF75BFA002261
:103018002E4BFDF7C1FA04460D463046FDF752FA2D
:1030280000222A4BFDF7B8FA06460F4602460B4621
:1030380020462946FDF7F8F8804689460022244BA9
:10304800FDF73AFD00287FF4C9AE17A3D3E90023A2
:1030580040464946FDF712FD00287FF4DDAE4046A4
:103068004946FDF733FD8046BAE60024124B1C7032
:10307800184B1C7005E00F4B1C706420FFF7D8F844
:103088000134072CF7DD002220211348FFF703F84D
:10309800FEE700BFAFF30080CDCCCCCCCCCCEC3F6E
:1030A8009A9999999999B93F0000000000408FC0FA
:1030B8008FC2214240000020410000201003002060
:1030C80020030020180300200C0300200000E03F2C
:1030D80000408F4048000020000801400000000028
:1030E800774B02225A60774B1B68B3F57A7F5EDB19
:1030F8002DE9F041744B1A88744BA3FB02135B094A
:10310800642101FB13239BB20BBB714C2068FDF7B4
:10311800EBF965A3D3E90023FDF73EFA06460F460F
:103128006C4B9889FDF700FE6B49FDF755FEFDF7DE
:10313800DBF95FA3D3E90023FDF72EFA02460B461D
:1031480030463946FDF772F8FDF7E8FC2060614B20
:103158005889624B1C68001BFDF7B4F956A3D3E9E4
:103168000023FDF719FA00220023FDF787FC002849
:1031780052D1584B5889001BFDF7A4F94EA3D3E947
:103188000023FDF709FA0022554BFDF795FC0028AE
:1031980052D1544B1B68052B4ED8534B1B78002B30
:1031A8004AD0524A536C43F40043536449E0013314
:1031B800444A1360474A90884D490B68034403EB1F
:1031C800D3735B100B60D0884A490B68034403EB48
:1031D800D3735B100B60108847490B68034403EBFB
:1031E800D3735B100B60508844490B68034403EBAE
:1031F800D3735B100B60508938490B68034403EBA9
:10320800D3735B100B6011893D4A13680B4403EBC1
:10321800D3735B10136070472E4B5889001BFDF762
:1032280051F925A3D3E90023FDF7B6F90022354B60
:10323800FDF724FC0028ACD02C4A536C23F400433F
:103248005364244B18892E4B1C68001BFDF73AF970
:1032580019A3D3E90023FDF79FF900220023FDF706
:103268000DFC002852D11B4B1889001BFDF72AF9C9
:1032780011A3D3E90023FDF78FF90022184BFDF7BE
:103288001BFC002852D1174B1B68052B4ED8164B38
:103298001B78002B4AD01C4A536C43F400435364F8
:1032A80049E000BFAFF300802B8716D9CEF7EF3F78
:1032B800FCA9F1D24D62503F7B14AE47E17A943FAE
:1032C800000002404C000020420000201F85EB5106
:1032D8000800002070020020AA65CE3C0C000020E7
:1032E80000002E4004000020480000200034014067
:1032F80014000020180000201C00002020000020DE
:103308001000002000002EC0002C0140924B1889AC
:10331800001BFDF7D7F88EA3D3E90023FDF73CF98E
:1033280000228E4BFDF7AAFB0028ACD08C4A536CC8
:1033380023F4004353648B498B6813F0200F0CBFB0
:10334800012300238A6812F0400F0CBF01220022DB
:10335800896811F0800F0CBF012500258249886813
:1033680010F4806F0CBF012000208C6814F4006FEB
:103378000CBF01240024896811F4805F02EB450228
:1033880003EB4203794EF35C79490B600B6803F158
:1033980002030B600D68774B83FB0572A2EBE572A5
:1033A80002EB42024FEA4207A5EB07020A600CBF94
:1033B80002220022224400EB4202B05C6E4A1060F6
:1033C800106802301060106883FB0043A3EBE073C1
:1033D80003EB43035C00031B136009685E488388A2
:1033E800664A12689A1AC388654800681B1A052934
:1033F80035D8DFE801F00324272A2D30D31A614A93
:103408001360614A138801339BB213805F4A1478B2
:103418004CB35F4AA2FB0312120B5E4909780131D3
:1034280092FBF1F001FB1022EAB993FBF4F204FBE2
:103438001233EBB910215848FEF733FE18E0514B10
:103448001A60DEE74F4B1A60DBE74E4A1360D8E795
:103458004C4A1360D5E79B1A4A4A1360D1E7494B97
:1034680000221A60CDE7002210214B48FEF713FE18
:103478004A4BD3F800C03E4B1B68052B2BD8DFE81E
:1034880003F00312171C2226CCF1000064469C4668
:10349800434B1968384B1B68052B52D8DFE803F0FB
:1034A8001F3F43474B4E6446CCF1000C0020EFE72A
:1034B8006046CCF1000C0024EAE7CCF10004604639
:1034C8004FF0000CE4E7CCF100040020E0E7CCF179
:1034D80000000024DCE7002004468446D8E74E427A
:1034E8000F4619462D4B1B68002B40F39B802D4B34
:1034F8001D681F4B1B6805331E4A82FB03E2A2EBC3
:10350800E37202EB42024FEA420EA3EB0E02052AD7
:1035180000F2BC80DFE802F0486D72777C810F46CC
:1035280049420026DEE70E4649420027DAE74F42C5
:103538000E460021D6E74F420026D3E74E42002729
:10354800D0E7002637463146CCE700BFAFF300800E
:103558007B14AE47E17A943F7002002000002EC031
:10356800002C0140000C01400010014034390008D3
:1035780050000020ABAAAA2A540000201400002002
:1035880018000020440000204200002040000020D5
:103598005917B7D141000020000801405800002009
:1035A8005C00002060000020C5F10008AE4615460A
:1035B800654474444044964B1B68002B40F3D78005
:1035C800944B1B68944A126802F1050C934A82FBDB
:1035D8000CE2A2EBEC7202EB42024FEA420EACEBB9
:1035E8000E02052A00F2F980DFE802F058A8ADB211
:1035F800B7BCAE466D424FF00008D9E7A8466D4209
:103608004FF0000ED4E7C5F1000EA8460025CFE71D
:10361800C5F1000E4FF00008CAE7C5F100084FF0E9
:10362800000EC5E77E4B1D68C5F1000E7D4B1A687C
:1036380001327A4B83FB0283A3EBE27303EB430370
:103648004FEA4308A2EB0803052B1AD8DFE803F07A
:103658000323060A0E14A8461D46A9E7F0464FF0B4
:10366800000EA5E7F046AE460025A1E72B467546B5
:103678009E464FF000089BE7A84675464FF0000E9F
:1036880096E74FF00008C646454691E74FF0000818
:10369800C64645468CE74FF0000889E7C3F10008A5
:1036A8009E461346194407EB0E0206EB080305F580
:1036B8007A7540F2C676B54200F397800A2DB8BFF6
:1036C8000A25594E756304F57A7440F2C675AC4202
:1036D80000F38E800A2CB8BF0A24534DAC6300F562
:1036E8007A7040F2C674A04200F385800A28B8BFF9
:1036F8000A204D4CE06301F57A7140F2C6708142B0
:103708007CDC0A29B8BF0A214848416302F57A726D
:1037180040F2C6718A4274DC0A2AB8BF0A224349B9
:103728008A6303F57A7340F2C67293426CDC0A2B03
:10373800B8BF0A233D4AD363BDE8F0819E465B4289
:103748004FF00008AEE798465B424FF0000EA9E73D
:10375800C3F1000E98460023A4E7C3F1000E4FF012
:1037680000089FE7C3F100084FF0000E9AE7294BC5
:103778001B68C3F1000E284A12680132DFF89CC0AA
:103788008CFB028CACEBE27C0CEB4C0C4FEA4C084B
:10379800A2EB080CBCF1050F1AD8DFE80CF00323E4
:1037A800060A0E14984663467CE7F0464FF0000E72
:1037B80078E7F0469E46002374E71A467346964615
:1037C8004FF000086EE7984673464FF0000E69E721
:1037D8004FF00008C646434664E74FF00008C64667
:1037E80043465FE74FF000085CE740F2C67568E7BC
:1037F80040F2C67471E740F2C6707AE740F2C671CB
:1038080082E740F2C6728AE740F2C67392E700BFC9
:103818005C0000206400002054000020ABAAAA2A03
:10382800600000205000002000340140002C0140BE
:10383800014B23F810107047880300207047704729
:10384800FEE7FEE7FEE7FEE770477047704708B5FA
:10385800FEF7E0FCFEF71BFB08BD0000002103E0BB
:103868000B4B5B58435004310A480B4B42189A42A1
:10387800F6D30A4A02E0002342F8043B084B9A4276
:10388800F9D3FEF7F7FE00F00FF8FFF739FA7047A3
:1038980044390008000000202400002024000020F3
:1038A80098030020FEE7000070B500250C4E0D4C73
:1038B800A41BA410A54209D100F01AF800250A4E4D
:1038C8000A4CA41BA410A54205D170BD56F825309A
:1038D80098470135EEE756F8253098470135F2E765
:1038E8003C3900083C3900083C39000840390008D8
:1038F800F8B500BFF8BC08BC9E467047F8B500BFD5
:08390800F8BC08BC9E467047A4
:1039100002030405060708090A0B0C0D0E0F101010
:10392000010200000000000000000000010203048A
:0C3930000607080900000201040503005E
:04393C000D02000870
:04394000E901000891
:1039440000A24A046400000000002042D0070000E6
:10395400D0070000D0070000D0070000D007000007
:04396400D007000088
:040000050800386552
:102DF8000022964BFDF760FE90B987A3D3E9002324
:102E080020462946FDF73AFE002840F0CA802046B1
:102E18002946FDF75BFE044604E0DFF86482DFE73D
:102E28004FF47A748A4B19688A4BA3FB0123DB0899
:102E380003EB83035A00914200F0B5800AF1320394
:102E4800A34215DDAAF1320AA24511DA0BF13203C9
:102E580043450DDDABF1320BC34509DA7E4B1B68E8
:102E6800042B05D8C8F100037C4A13607C4B1C6016
:102E780002217048FFF708F9002840F0AF80794B2D
:102E88001D6815F1320F80F203816D4B05221A700F
:102E9800754B01221A7084EAE473A3EBE473322BB6
:102EA80006DC88EAE873A3EBE873322B40F325814C
:102EB800674B00221A60664B1A68A246C3466B4BE2
:102EC8009A4200F21F810520FFF7B2F9684C20688A
:102ED800FDF7F8FA52A3D3E90023FDF75DFB064698
:102EE8000F46644B1868FDF7EDFA4FA3D3E90023AA
:102EF800FDF752FB02460B4630463946FDF796F978
:102F0800FDF7E4FD06462060564F3868FDF7DAFA0B
:102F180043A3D3E90023FDF73FFB04460D46564B78
:102F28001868FDF7CFFA40A3D3E90023FDF734FB77
:102F380002460B4620462946FDF778F9FDF7C6FDFF
:102F48003860FDF7BFFA00224C4BFDF725FB04461D
:102F58000D463046FDF7B6FA0022484BFDF71CFB3C
:102F680006460F4602460B4620462946FDF75CF901
:102F7800804689460022354BFDF79EFD00287FF4E8
:102F88002DAF25A3D3E9002340464946FDF776FD3A
:102F980000287FF442AF40464946FDF797FD80463A
:102FA8001EE7374C3EE74146022000F079FC2146F7
:102FB800032000F075FC334B9989042000F070FC65
:102FC8003149324B1868FDF707FFFEF7CBF8014689
:102FD800052000F065FC00F069FC2FE71A4B002281
:102FE8001A7002211348FFF74FF80028F9D100247E
:102FF800134B1C701C4B1C7005E0114B1C7064209B
:10300800FFF716F90134072CF7DD002220210948C3
:10301800FFF741F8FEE700BF0000000000408FC046
:10302800CDCCCCCCCCCCEC3F9A9999999999B93F15
:103038000010024000080140FC010020B000002000
:1030480040000020000C01404800002000408F4054
:1030580004030020CDCCCCCC040000205C00002070
:10306800580000201C030020410000208038010087
:103078001403002024030020100300200000E03F78
:1030880018FCFFFF700200200000C8420800002062
:10309800264B1E6826493046FEF73CF858B12549AC
:1030A8003046FEF755F830B1234B05221A70234BF2
:1030B80006221A70EFE61F493046FEF72BF810B1CA
:1030C8001335262D05D900231B4A13701B4A13708C
:1030D800E1E60024194B1C70194B1C70072C06DC08
:1030E800154B1C706420FFF7A3F80134F6E70022A3
:1030F80020211448FEF7CFFFFEE7134A1368013377
:103108001360D8E600240D4B1C700D4B1C7005E0B5
:10311800094B1C706420FFF78BF80134072CF7DD8E
:10312800002220210748FEF7B6FFFEE7080000202E
:10313800000028428FC221424000002041000020A8
:10314800480000200008014004030020000000009F
:10315800774B02225A60774B1B68B3F57A7F5EDBA8
:103168002DE9F041744B1A88744BA3FB02135B09D9
:10317800642101FB13239BB20BBB714C2068FDF744
:10318800B3F965A3D3E90023FDF706FA06460F460F
:103198006C4B9889FDF7C8FD6B49FDF71DFEFDF7DF
:1031A800A3F95FA3D3E90023FDF7F6F902460B461E
:1031B80030463946FDF73AF8FDF7B0FC2060614B20
:1031C8005889624B1C68001BFDF77CF956A3D3E9AC
:1031D8000023FDF7E1F900220023FDF74FFC00284A
:1031E80052D1584B5889001BFDF76CF94EA3D3E90F
:1031F8000023FDF7D1F90022554BFDF75DFC0028AF
:1032080052D1544B1B68052B4ED8534B1B78002BBF
:103218004AD0524A536C43F40043536449E00133A3
:10322800444A1360474A90884D490B68034403EBAE
:10323800D3735B100B60D0884A490B68034403EBD7
:10324800D3735B100B60108847490B68034403EB8A
:10325800D3735B100B60508844490B68034403EB3D
:10326800D3735B100B60508938490B68034403EB38
:10327800D3735B100B6011893D4A13680B4403EB51
:10328800D3735B10136070472E4B5889001BFDF7F2
:1032980019F925A3D3E90023FDF77EF90022354B60
:1032A800FDF7ECFB0028ACD02C4A536C23F4004308
:1032B8005364244B18892E4B1C68001BFDF702F938
:1032C80019A3D3E90023FDF767F900220023FDF7CE
:1032D800D5FB002852D11B4B1889001BFDF7F2F8CB
:1032E80011A3D3E90023FDF757F90022184BFDF786
:1032F800E3FB002852D1174B1B68052B4ED8164B01
:103308001B78002B4AD01C4A536C43F40043536487
:1033180049E000BFAFF300802B8716D9CEF7EF3F07
:10332800FCA9F1D24D62503F7B14AE47E17A943F3D
:10333800000002404C000020420000201F85EB5195
:103348000800002070020020AA65CE3C0C00002076
:1033580000002E40040000204800002000340140F6
:1033680014000020180000201C000020200000206D
:103378001000002000002EC0002C0140924B18893C
:10338800001BFDF79FF88EA3D3E90023FDF704F98E
:1033980000228E4BFDF772FB0028ACD08C4A536C90
:1033A80023F4004353648B498B6813F0200F0CBF40
:1033B800012300238A6812F0400F0CBF012200226B
:1033C800896811F0800F0CBF0125002582498868A3
:1033D80010F4806F0CBF012000208C6814F4006F7B
:1033E8000CBF01240024896811F4805F02EB4502B8
:1033F80003EB4203794EF35C79490B600B6803F1E8
:1034080002030B600D68774B83FB0572A2EBE57234
:1034180002EB42024FEA4207A5EB07020A600CBF23
:1034280002220022224400EB4202B05C6E4A106085
:10343800106802301060106883FB0043A3EBE07350
:1034480003EB43035C00031B136009685E48838831
:10345800664A12689A1AC388654800681B1A0529C3
:1034680035D8DFE801F00324272A2D30D31A614A22
:103478001360614A138801339BB213805F4A147842
:103488004CB35F4AA2FB0312120B5E490978013163
:1034980092FBF1F001FB1022EAB993FBF4F204FB72
:1034A8001233EBB910215848FEF7FBFD18E0514BD9
:1034B8001A60DEE74F4B1A60DBE74E4A1360D8E725
:1034C8004C4A1360D5E79B1A4A4A1360D1E7494B27
:1034D80000221A60CDE7002210214B48FEF7DBFDE1
:1034E8004A4BD3F800C03E4B1B68052B2BD8DFE8AE
:1034F80003F00312171C2226CCF1000064469C46F8
:10350800434B1968384B1B68052B52D8DFE803F08A
:103518001F3F43474B4E6446CCF1000C0020EFE7B9
:103528006046CCF1000C0024EAE7CCF100046046C8
:103538004FF0000CE4E7CCF100040020E0E7CCF108
:1035480000000024DCE7002004468446D8E74E4209
:103558000F4619462D4B1B68002B40F39B802D4BC3
:103568001D681F4B1B6805331E4A82FB03E2A2EB52
:10357800E37202EB42024FEA420EA3EB0E02052A67
:1035880000F2BC80DFE802F0486D72777C810F465C
:1035980049420026DEE70E4649420027DAE74F4255
:1035A8000E460021D6E74F420026D3E74E420027B9
:1035B800D0E7002637463146CCE700BFAFF300809E
:1035C8007B14AE47E17A943F7002002000002EC0C1
:1035D800002C0140000C014000100140A4390008F3
:1035E80050000020ABAAAA2A540000201400002092
:1035F8001800002044000020420000204000002065
:103608005917B7D141000020000801405800002098
:103618005C00002060000020C5F10008AE46154699
:10362800654474444044964B1B68002B40F3D78094
:10363800944B1B68944A126802F1050C934A82FB6A
:103648000CE2A2EBEC7202EB42024FEA420EACEB48
:103658000E02052A00F2F980DFE802F058A8ADB2A0
:10366800B7BCAE466D424FF00008D9E7A8466D4298
:103678004FF0000ED4E7C5F1000EA8460025CFE7AD
:10368800C5F1000E4FF00008CAE7C5F100084FF079
:10369800000EC5E77E4B1D68C5F1000E7D4B1A680C
:1036A80001327A4B83FB0283A3EBE27303EB430300
:1036B8004FEA4308A2EB0803052B1AD8DFE803F00A
:1036C8000323060A0E14A8461D46A9E7F0464FF044
:1036D800000EA5E7F046AE460025A1E72B46754645
:1036E8009E464FF000089BE7A84675464FF0000E2F
:1036F80096E74FF00008C646454691E74FF00008A8
:10370800C64645468CE74FF0000889E7C3F1000834
:103718009E461346194407EB0E0206EB080305F50F
:103728007A7540F2C676B54200F397800A2DB8BF85
:103738000A25594E756304F57A7440F2C675AC4291
:1037480000F38E800A2CB8BF0A24534DAC6300F5F1
:103758007A7040F2C674A04200F385800A28B8BF88
:103768000A204D4CE06301F57A7140F2C67081423F
:103778007CDC0A29B8BF0A214848416302F57A72FD
:1037880040F2C6718A4274DC0A2AB8BF0A22434949
:103798008A6303F57A7340F2C67293426CDC0A2B93
:1037A800B8BF0A233D4AD363BDE8F0819E465B4219
:1037B8004FF00008AEE798465B424FF0000EA9E7CD
:1037C800C3F1000E98460023A4E7C3F1000E4FF0A2
:1037D80000089FE7C3F100084FF0000E9AE7294B55
:1037E8001B68C3F1000E284A12680132DFF89CC03A
:1037F8008CFB028CACEBE27C0CEB4C0C4FEA4C08DB
:10380800A2EB080CBCF1050F1AD8DFE80CF0032373
:10381800060A0E14984663467CE7F0464FF0000E01
:1038280078E7F0469E46002374E71A4673469646A4
:103838004FF000086EE7984673464FF0000E69E7B0
:103848004FF00008C646434664E74FF00008C646F6
:1038580043465FE74FF000085CE740F2C67568E74B
:1038680040F2C67471E740F2C6707AE740F2C6715A
:1038780082E740F2C6728AE740F2C67392E700BF59
:103888005C0000206400002054000020ABAAAA2A93
:10389800600000205000002000340140002C01404E
:1038A800014B23F8101070478C03002070477047B5
:1038B800FEE7FEE7FEE7FEE770477047704708B58A
:1038C800FEF7A8FCFEF7E3FA08BD0000002103E0BC
:1038D8000B4B5B58435004310A480B4B42189A4231
:1038E800F6D30A4A02E0002342F8043B084B9A4206
:1038F800F9D3FEF7BFFE00F00FF8FFF701FA7047A3
:10390800B439000800000020240000202400002012
:103918009C030020FEE7000070B500250C4E0D4CFE
:10392800A41BA410A54209D100F01AF800250A4EDC
:103938000A4CA41BA410A54205D170BD56F8253029
:1039480098470135EEE756F8253098470135F2E7F4
:10395800AC390008AC390008AC390008B0390008A7
:10396800F8B500BFF8BC08BC9E467047F8B500BF64
:08397800F8BC08BC9E46704734
:1039800002030405060708090A0B0C0D0E0F1010A0
:10399000010200000000000000000000010203041A
:0C39A000060708090000020104050300EE
:0439AC000D02000800
:0439B000E901000821
:1039B40000A24A046400000000004042D007000056
:1039C400D0070000D0070000D0070000D007000097
:0439D400D007000018
:04000005080038D5E2
:00000001FF