![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
This is Ben and I's final project for Embedded Systems. Our goal was to create a car diagnostic system that interfaces with the CAN bus in all US sold cars newer than 2008. We aimed to request data such as RPM, Vehicle speed, engine temp, etc and then display our findings. This software was succussful in communicating with the car and reading and writing, however it fails to accomplish it's task when dealing with certain makes of cars, specifically Honda. Included are various PID codes, functions, and files that interface with a car's CAN bus system.
Dependencies: UniGraphic mbed
Revision 0:bb9076ae4c4a, committed 2016-01-27
- Comitter:
- Nrode17
- Date:
- Wed Jan 27 17:40:51 2016 +0000
- Commit message:
- Final Update for our final project
Changed in this revision
diff -r 000000000000 -r bb9076ae4c4a ODBII.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ODBII.cpp Wed Jan 27 17:40:51 2016 +0000 @@ -0,0 +1,73 @@ +#include "ODBII.h" +#include "globals.h" + +DigitalOut myled(LED1);//diagnostic LED, used to see if data is being transmitted +Timer CANTimer;//This is used to determine whether or not the car has taken too long to respond + +void set_frequency(int amount) +{ + can2.frequency(amount);//Different ECU's operate at different frequencies, 125kbs, 25kbs, 500kbs +} + +float request(char pid) +{ + char can_msg[8];//message to be send to CAN + float engine_data = 0;// this is what we get back + + + //forming the CAN message payload, uses 8 bytes, first is number of extra bytes, second is mode, third is PID, others are misc + can_msg[0] = 0x02;//# of extra bytes + can_msg[1] = 0x01;//mode + can_msg[2] = pid; + can_msg[3] = 0; + can_msg[4] = 0; + can_msg[5] = 0; + can_msg[6] = 0; + can_msg[7] = 0; + + if (can2.write(CANMessage(PID_REQUEST, can_msg, 8))) + { + myled = !myled;//diagnostic LED + } + CANTimer.reset(); + CANTimer.start(); + + while(CANTimer.read_us() < 200)//give it some time to respond + { + if (can2.read(can_MsgRx)) {//if you can read back, then go into it + pc.printf("Message read\n\r"); + + + for (int i = 0; i < (int)can_MsgRx.len; i++) { + pc.printf("can_MsgRx.data[%d]: %x\n\r", i, can_MsgRx.data[i]);//this just prints the contents of the data back + } + + + + if ((can_MsgRx.id == PID_REPLY) && (can_MsgRx.data[2] == pid)) //if the PID match, then we know we have valid data + { + pc.printf("We've made it this far\n\r"); + switch (can_MsgRx.data[2]) //the PID is in [2], so we use that in this switch + { + case ENGINE_RPM: // ((A*256)+B)/4 is the formula for rpm + engine_data = ((can_MsgRx.data[3]*256) + can_MsgRx.data[4])/4; + break; + + case ENGINE_COOLANT_TEMP: //C, this is the formula for temp + engine_data = can_MsgRx.data[3] - 40; + break; + + case VEHICLE_SPEED: //[km], this is the formula for kmph + engine_data = can_MsgRx.data[3]; + break; + } + + return engine_data;//whatever we get we return back to the main.cpp + + } + + } + } + + return 0; +} \ No newline at end of file
diff -r 000000000000 -r bb9076ae4c4a ODBII.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ODBII.h Wed Jan 27 17:40:51 2016 +0000 @@ -0,0 +1,21 @@ +#ifndef ODBII_H +#define ODBII_H + +#include "mbed.h" +//Can Speed +#define CANSPEED_125 125000 +#define CANSPEED_250 250000 +#define CANSPEED_500 500000 +//These are used to define the different PID codes as well as other codes +#define ENGINE_COOLANT_TEMP 0x05 +#define ENGINE_RPM 0x0C +#define VEHICLE_SPEED 0x0D + + +#define PID_REQUEST 0x7DF +#define PID_REPLY 0x7E8 +//the two functions +float request(char pid); +void set_frequency(int amount); + +#endif \ No newline at end of file
diff -r 000000000000 -r bb9076ae4c4a UniGraphic.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UniGraphic.lib Wed Jan 27 17:40:51 2016 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/teams/GraphicsDisplay/code/UniGraphic/#87855d03d91a
diff -r 000000000000 -r bb9076ae4c4a globals.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/globals.cpp Wed Jan 27 17:40:51 2016 +0000 @@ -0,0 +1,5 @@ +#include "globals.h" +extern Serial pc (USBTX,USBRX); +// Used these two files to set up the CAN objects and Serial communication +CAN can2(p30, p29); +CANMessage can_MsgRx; \ No newline at end of file
diff -r 000000000000 -r bb9076ae4c4a globals.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/globals.h Wed Jan 27 17:40:51 2016 +0000 @@ -0,0 +1,11 @@ +#ifndef GLOBALS_H +#define GLOBALS_H + +#include "mbed.h" + +extern Serial pc; + +// Using mbed pins 29(CAN_TXD) and 30(CAN_RXD). +extern CAN can2; +extern CANMessage can_MsgRx; +#endif \ No newline at end of file
diff -r 000000000000 -r bb9076ae4c4a main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jan 27 17:40:51 2016 +0000 @@ -0,0 +1,46 @@ +#include "mbed.h" +#include "ODBII.h" +#include "globals.h" +#include "pavement_48x34.h" +#include "ILI932x.h" +#include "Arial24x23.h" +/* +This is Ben and I's final project for Embedded Systems. Our goal was to create a car diagnostic system that interfaces with +the CAN bus in all US sold cars newer than 2008. We aimed to request data such as RPM, Vehicle speed, engine temp, etc and then +display our findings. This software was succussful in communicating with the car and reading and writing, however it fails +to accompolish it's task when dealing with certain makes of cars, specifically Honda. Included are various PID codes, functions, +and files that interface with a car's CAN bus system. +*/ +PinName dataBus[]= {p30, p29, p28, p27, p26, p25, p24, p23}; +ILI932x myLCD(BUS_8, dataBus, p15, p17, p16, p14, p20, "myLCD", 240, 320); +char orient = 3; +void refresh(float engine); + + +int main() +{ + set_frequency(CANSPEED_500);//set the frequency to deal with the main engine ECU + float engine_info; + myLCD.set_orientation(orient); + myLCD.background(Black); + myLCD.foreground(White); + myLCD.set_font((unsigned char*) Arial24x23); + while(1) + { + if (request(ENGINE_RPM)) //used to check if we can get valid data back + { + engine_info = request(ENGINE_RPM);//if we can, then we're all set to go! + refresh(engine_info); + } + wait(3); + } + + +} + +void refresh(float engine) +{ + myLCD.locate(myLCD.width()/2, myLCD.height()/2); + myLCD.printf("Your info is: %f\n\r", engine); +} +
diff -r 000000000000 -r bb9076ae4c4a mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Jan 27 17:40:51 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/6f327212ef96 \ No newline at end of file
diff -r 000000000000 -r bb9076ae4c4a pavement_48x34.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pavement_48x34.h Wed Jan 27 17:40:51 2016 +0000 @@ -0,0 +1,207 @@ +__align(2) +const unsigned char pavement_48x34[] = { /* 0X40,0X10,0X30,0X00,0X22,0X00,0X01,0X1B, */ +0X0F,0XB4,0XCD,0XB3,0XAD,0XAB,0X6D,0XA3,0XCB,0X82,0X6D,0X9B,0X6D,0X9B,0X4C,0X9B, +0X0B,0X8B,0X48,0X62,0X4C,0X93,0XAD,0XA3,0XAE,0XA3,0X6C,0X9B,0X4C,0X93,0X0B,0X7B, +0X8D,0X9B,0X4C,0X93,0XEB,0X82,0XEB,0X7A,0X8A,0X6A,0X6A,0X6A,0XCB,0X72,0XEB,0X7A, +0X0B,0X83,0X4C,0X8B,0XAE,0X93,0XEE,0X9B,0XAE,0XA3,0XAE,0XA3,0XAE,0X9B,0XCE,0XA3, +0XCE,0XAB,0XCA,0X6A,0X30,0X8C,0X71,0X94,0X71,0X94,0X31,0X8C,0XF0,0X83,0X10,0X8C, +0XEF,0X83,0XD3,0XA4,0X51,0X94,0X71,0X94,0X0B,0X63,0X4C,0X93,0X0B,0X8B,0X50,0XB4, +0X0E,0XBC,0XAD,0XAB,0X8D,0XA3,0XAD,0XAB,0X6C,0X9B,0X0F,0XAC,0XEE,0XAB,0X8D,0XA3, +0X4C,0X93,0XAA,0X6A,0X6D,0X8B,0XAE,0XA3,0XAD,0XAB,0XCE,0XAB,0X2C,0X8B,0XAE,0X9B, +0X6D,0X9B,0X2C,0X8B,0XCB,0X7A,0XCA,0X72,0XCB,0X72,0X49,0X5A,0XAA,0X6A,0X0C,0X73, +0XEB,0X7A,0X6C,0X93,0X4C,0X93,0X8D,0X9B,0XCE,0XA3,0X8D,0XA3,0XAD,0XA3,0XCE,0XAB, +0X2F,0XB4,0X4C,0X7B,0X51,0X8C,0X51,0X94,0X10,0X8C,0XF0,0X83,0X10,0X84,0X30,0X8C, +0X51,0X94,0X92,0X9C,0X30,0X94,0X10,0X84,0X2C,0X6B,0X2C,0X8B,0XCE,0XAB,0X2F,0XBC, +0XCE,0XB3,0XCE,0XAB,0XAD,0XAB,0XAD,0XAB,0X8D,0XA3,0XEF,0XAB,0XEE,0XAB,0XCE,0XA3, +0X8D,0X9B,0X07,0X52,0XAE,0X9B,0X2F,0XB4,0XCE,0XAB,0XAE,0XA3,0X6D,0X93,0X4C,0X93, +0X6D,0X9B,0X0B,0X83,0X2C,0X83,0X2C,0X83,0XEB,0X7A,0X6A,0X62,0XAA,0X6A,0X8E,0X8B, +0X4D,0X83,0X4C,0X93,0X0B,0X8B,0X2C,0X8B,0X4C,0X93,0X8D,0X9B,0XCE,0XA3,0XAE,0XA3, +0X70,0XC4,0XAA,0X62,0X31,0X8C,0X71,0X94,0XCF,0X83,0XAE,0X7B,0XCF,0X7B,0XCF,0X83, +0XEF,0X83,0XAF,0X7B,0XEF,0X83,0X10,0X8C,0X2C,0X6B,0X6D,0X9B,0XCE,0XAB,0XEE,0XB3, +0X8D,0XAB,0X6C,0X9B,0X4C,0X9B,0XCE,0XB3,0XAE,0XAB,0X8D,0XA3,0XEE,0XAB,0X8D,0XA3, +0XAD,0XA3,0XAA,0X6A,0XF3,0XC4,0X0F,0XAC,0XAE,0XA3,0X6D,0X93,0X0B,0X83,0X8D,0X9B, +0X6D,0X93,0XEF,0XA3,0X6D,0X93,0X2C,0X8B,0XEC,0X72,0XAB,0X62,0X0C,0X73,0X6D,0X83, +0X8D,0X8B,0X8D,0X9B,0X4C,0X8B,0X2C,0X8B,0XEB,0X82,0X2C,0X93,0X6D,0X9B,0XEE,0XAB, +0X12,0XCD,0X28,0X4A,0XF0,0X83,0X10,0X84,0XCF,0X83,0XCF,0X7B,0XF0,0X83,0XF0,0X83, +0XEF,0X83,0XF0,0X83,0XCF,0X83,0X10,0X8C,0X2B,0X6B,0XAE,0X93,0XCE,0XAB,0XAD,0XAB, +0XEF,0XAB,0XAE,0X9B,0XEE,0XAB,0XCE,0XA3,0XAE,0XA3,0XCE,0XAB,0XCE,0XA3,0XCE,0XA3, +0XB1,0XBC,0X65,0X39,0X08,0X52,0XCB,0X72,0X6D,0X93,0X4D,0X93,0X2C,0X8B,0X4C,0X8B, +0X8D,0X9B,0X6D,0X93,0X4C,0X93,0X4D,0X8B,0X6A,0X62,0X8A,0X5A,0XCB,0X72,0X0C,0X73, +0X6D,0X83,0X4C,0X83,0XAA,0X62,0X0C,0X73,0X89,0X62,0XCB,0X72,0XEB,0X7A,0X2C,0X83, +0X86,0X39,0XE3,0X20,0X6E,0X73,0X51,0X94,0XF0,0X83,0X31,0X8C,0X10,0X84,0XCF,0X83, +0XEF,0X8B,0X51,0X94,0XF0,0X83,0X51,0X94,0X2C,0X6B,0X49,0X5A,0XCE,0XA3,0XAE,0XA3, +0XAB,0X62,0XCF,0X8B,0X62,0X10,0XC3,0X18,0XE8,0X49,0XAB,0X62,0X29,0X52,0XC7,0X39, +0X08,0X4A,0X08,0X42,0XA7,0X39,0XCB,0X62,0X08,0X4A,0XC3,0X20,0X05,0X29,0X86,0X39, +0X6A,0X52,0X6A,0X5A,0XE8,0X41,0X86,0X39,0X08,0X42,0X49,0X52,0X44,0X29,0X25,0X29, +0X08,0X52,0XE7,0X51,0X8A,0X6A,0XA6,0X41,0XC7,0X51,0X08,0X5A,0X28,0X62,0XAA,0X72, +0X89,0X72,0X28,0X62,0XAA,0X72,0X65,0X39,0X46,0X29,0XEC,0X62,0X6A,0X52,0X49,0X4A, +0X8A,0X5A,0X4D,0X73,0XEC,0X6A,0X08,0X4A,0XAB,0X5A,0XA7,0X39,0XCB,0X62,0X4D,0X73, +0XCF,0X83,0X71,0X9C,0X45,0X29,0XC8,0X39,0XCF,0X83,0X0F,0X8C,0X30,0X8C,0X30,0X8C, +0XCF,0X83,0XAE,0X7B,0X8E,0X7B,0X8E,0X7B,0X6D,0X7B,0X82,0X10,0XCB,0X62,0X6D,0X73, +0X2C,0X6B,0XCB,0X62,0XAB,0X5A,0XEB,0X62,0X4D,0X73,0X2C,0X6B,0X8A,0X52,0XEB,0X7A, +0X0B,0X83,0X4C,0X8B,0X4C,0X93,0X6D,0X93,0X4C,0X93,0XAE,0XA3,0X0E,0XAC,0XAD,0XA3, +0X8C,0XA3,0X6C,0X9B,0X4C,0X93,0XA9,0X72,0X8B,0X5A,0X30,0X8C,0X10,0X8C,0XB2,0XA4, +0X91,0X9C,0X91,0X9C,0X71,0X94,0XEF,0X83,0X6D,0X7B,0X10,0X8C,0X91,0X9C,0X50,0X9C, +0XCF,0X8B,0XAE,0X83,0XE7,0X41,0X30,0X8C,0X50,0X94,0X30,0X8C,0X30,0X94,0X0F,0X8C, +0X6D,0X73,0X6D,0X73,0X6D,0X73,0XEF,0X83,0XCF,0X83,0XC3,0X18,0X6D,0X73,0X4D,0X73, +0X6D,0X73,0X0C,0X6B,0XEC,0X6A,0X0C,0X6B,0X2C,0X6B,0X4D,0X73,0X89,0X5A,0XEB,0X7A, +0X0B,0X83,0X0B,0X7B,0XEB,0X82,0X0B,0X83,0X2C,0X93,0X2F,0XB4,0XCE,0XAB,0XAD,0XA3, +0X6C,0XA3,0XEB,0X8A,0X6C,0X9B,0X47,0X5A,0X50,0X94,0X71,0X9C,0X71,0X94,0X91,0X9C, +0XD2,0XA4,0X91,0X9C,0X10,0X8C,0X10,0X8C,0X30,0X94,0X71,0X9C,0X71,0X9C,0X30,0X94, +0X0F,0X8C,0X0F,0X94,0X69,0X52,0XEF,0X8B,0X10,0X8C,0X30,0X8C,0XCE,0X83,0XCE,0X83, +0XAE,0X7B,0XEF,0X83,0XCF,0X83,0X30,0X8C,0X0F,0X8C,0X45,0X29,0X6D,0X73,0X2C,0X6B, +0X2C,0X6B,0X2D,0X73,0X2C,0X73,0X2C,0X6B,0X2C,0X73,0X2C,0X6B,0X8A,0X5A,0XCB,0X7A, +0X0B,0X7B,0XCF,0X9B,0X6D,0X93,0XAD,0X9B,0X8D,0X9B,0XAD,0XA3,0XAD,0XA3,0XCE,0XAB, +0X4C,0X9B,0X2C,0X93,0X70,0XB4,0X88,0X62,0X10,0X8C,0X51,0X94,0X71,0X94,0X91,0X9C, +0X91,0X9C,0X92,0X9C,0X51,0X94,0X0F,0X8C,0X51,0X94,0X71,0X9C,0X30,0X94,0X50,0X94, +0XEF,0X8B,0XCE,0X8B,0X28,0X4A,0XEF,0X8B,0XEF,0X8B,0XEF,0X8B,0X8E,0X7B,0XAF,0X83, +0XCF,0X83,0XEF,0X8B,0X30,0X8C,0XEF,0X8B,0XAE,0X7B,0X44,0X29,0X2C,0X6B,0X4D,0X73, +0X6D,0X73,0X2C,0X6B,0XAB,0X62,0XAA,0X5A,0X8E,0X7B,0XCF,0X83,0X69,0X52,0XCA,0X7A, +0X4C,0X8B,0XAD,0X9B,0XAD,0XA3,0X8D,0X9B,0X6C,0X9B,0X8D,0X93,0XCE,0XAB,0XCE,0XAB, +0X8D,0XA3,0XAD,0XAB,0X0F,0XB4,0XA9,0X6A,0XF0,0X8B,0X92,0X9C,0X71,0X9C,0X50,0X94, +0X51,0X94,0X91,0X9C,0X51,0X94,0X30,0X8C,0XD2,0XA4,0XB2,0XA4,0X91,0X9C,0X50,0X9C, +0X6E,0X7B,0XAE,0X8B,0X08,0X42,0X50,0X94,0X51,0X94,0XAE,0X7B,0X8E,0X7B,0X10,0X8C, +0X50,0X94,0X30,0X8C,0XEF,0X83,0XCE,0X83,0X10,0X8C,0X65,0X31,0XAB,0X5A,0X8E,0X7B, +0X4D,0X73,0X0C,0X6B,0XCB,0X62,0XCB,0X62,0XAE,0X7B,0X8E,0X7B,0XCB,0X62,0X0B,0X83, +0X4C,0X8B,0X6C,0X93,0X8D,0X9B,0X4C,0X93,0X2C,0X8B,0XEE,0XA3,0X0E,0XB4,0XCD,0XAB, +0XCD,0XA3,0XCE,0XAB,0XEE,0XB3,0XA9,0X72,0X10,0X8C,0X51,0X94,0X30,0X94,0XF0,0X8B, +0X71,0X9C,0X30,0X94,0X51,0X94,0X30,0X94,0XB2,0XA4,0X91,0X9C,0X91,0XA4,0X10,0X8C, +0XAE,0X7B,0X50,0X9C,0X69,0X52,0XD2,0XA4,0X30,0X94,0X10,0X8C,0X51,0X94,0XEF,0X8B, +0XEF,0X83,0XAE,0X7B,0XAE,0X7B,0XEF,0X83,0X10,0X8C,0X08,0X42,0X6D,0X7B,0XAE,0X83, +0X6D,0X73,0X0C,0X6B,0X0C,0X6B,0XEC,0X6A,0X2C,0X6B,0X2C,0X73,0X4D,0X73,0X2D,0X83, +0X6D,0X8B,0X6D,0X93,0X2C,0X8B,0X4C,0X8B,0XAD,0X9B,0XEE,0XAB,0XEE,0XAB,0X8C,0XA3, +0X4C,0X9B,0X8D,0XA3,0XCE,0XB3,0XAA,0X72,0X0C,0X6B,0X71,0X94,0X30,0X8C,0X30,0X8C, +0XEF,0X8B,0X10,0X8C,0X51,0X9C,0X51,0X9C,0X71,0X9C,0X51,0X9C,0X30,0X94,0XAE,0X83, +0X30,0X94,0X91,0XA4,0X4C,0X73,0X71,0X9C,0X0F,0X8C,0XCF,0X83,0XCF,0X83,0X30,0X8C, +0XCF,0X83,0X6D,0X73,0XEF,0X83,0XCF,0X83,0XAE,0X83,0X66,0X31,0X6D,0X73,0XAE,0X83, +0X2C,0X6B,0X4D,0X73,0X6D,0X7B,0X4D,0X7B,0XEB,0X62,0X8E,0X7B,0XEE,0X8B,0X66,0X39, +0X2C,0X83,0X2C,0X83,0X2C,0X83,0XCE,0X9B,0XCE,0XA3,0X0F,0XAC,0XEF,0XAB,0X0B,0X8B, +0X8D,0X9B,0X2F,0XB4,0XCD,0XB3,0XEA,0X7A,0XCF,0X83,0X30,0X8C,0XEF,0X8B,0X51,0X94, +0X30,0X94,0X92,0X9C,0X51,0X9C,0X30,0X94,0X10,0X8C,0X30,0X94,0X91,0X9C,0X10,0X8C, +0XCF,0X83,0X71,0X9C,0X69,0X52,0X30,0X8C,0XCF,0X83,0XCF,0X83,0XCF,0X83,0XEF,0X8B, +0X10,0X8C,0XEF,0X83,0X10,0X8C,0X10,0X8C,0XAE,0X7B,0X04,0X21,0XAE,0X83,0X6D,0X73, +0X0C,0X63,0X10,0X8C,0XCF,0X8B,0X6D,0X7B,0X0C,0X6B,0XAE,0X83,0XCE,0X83,0X49,0X62, +0X2C,0X8B,0X0C,0X83,0XAE,0X9B,0XCE,0X9B,0XAD,0XA3,0XAD,0XA3,0XAD,0X9B,0X8D,0XA3, +0XB1,0XBC,0XCE,0XAB,0XCE,0XB3,0X68,0X62,0XAE,0X83,0X10,0X8C,0XEF,0X8B,0X91,0X9C, +0X91,0X9C,0X51,0X94,0X30,0X94,0XCF,0X83,0X30,0X94,0X71,0X9C,0X71,0X9C,0X50,0X94, +0X10,0X8C,0X75,0XBD,0X29,0X4A,0XAE,0X7B,0X8E,0X7B,0XAE,0X7B,0XCF,0X83,0X0F,0X8C, +0XEF,0X8B,0XEF,0X8B,0X10,0X8C,0X10,0X8C,0XEF,0X8B,0X86,0X39,0X8E,0X7B,0X6D,0X73, +0X4D,0X73,0XCE,0X83,0XAE,0X83,0X4D,0X7B,0X4D,0X73,0X4D,0X73,0XD2,0XA4,0X08,0X5A, +0XEB,0X82,0X6D,0X8B,0X50,0XAC,0XEE,0XAB,0XCE,0XA3,0XEE,0XAB,0XAD,0XAB,0X6C,0XA3, +0XEE,0XAB,0XCD,0XB3,0X50,0XBC,0XCA,0X72,0XF0,0X8B,0X10,0X8C,0XEF,0X83,0X71,0X9C, +0X91,0X9C,0X30,0X94,0XEF,0X8B,0X6E,0X7B,0XCF,0X83,0X71,0X9C,0X50,0X9C,0X30,0X94, +0X92,0XA4,0X54,0XBD,0X6D,0X73,0XD3,0XA4,0X8E,0X7B,0X0F,0X8C,0XF3,0XAC,0X71,0X9C, +0X10,0X8C,0XEF,0X83,0XEF,0X83,0X51,0X94,0X91,0X9C,0X85,0X31,0XCB,0X62,0X2C,0X6B, +0X4D,0X73,0XCF,0X83,0X4D,0X73,0X2C,0X73,0X4D,0X73,0X6D,0X73,0X2F,0X8C,0XE7,0X49, +0XEB,0X7A,0XAE,0X9B,0X50,0XAC,0X0F,0XAC,0X4F,0XB4,0XAD,0XA3,0XCD,0XAB,0X8D,0XA3, +0XCE,0XAB,0XEE,0XAB,0XD1,0XD4,0XEA,0X6A,0X0C,0X6B,0X10,0X8C,0X30,0X8C,0XB2,0XA4, +0XD2,0XA4,0X10,0X8C,0X8E,0X7B,0XCF,0X83,0X30,0X94,0X71,0X9C,0X50,0X94,0XB2,0XA4, +0X49,0X52,0X24,0X29,0XE3,0X18,0X86,0X31,0X89,0X5A,0X28,0X4A,0X49,0X52,0X69,0X52, +0X28,0X4A,0X8A,0X5A,0XE7,0X41,0X08,0X42,0X45,0X31,0X41,0X08,0X61,0X10,0XE7,0X41, +0X08,0X42,0X28,0X4A,0XC7,0X41,0X65,0X31,0X85,0X31,0XE7,0X41,0XA6,0X39,0XC3,0X20, +0X28,0X52,0X08,0X52,0XCA,0X6A,0X48,0X5A,0X89,0X5A,0XE7,0X49,0X69,0X5A,0X2C,0X7B, +0XCA,0X6A,0X89,0X5A,0X28,0X52,0X66,0X31,0XC7,0X41,0XCB,0X62,0X69,0X52,0XCB,0X62, +0XEB,0X6A,0X48,0X52,0X65,0X31,0XA6,0X39,0X08,0X42,0X69,0X52,0X89,0X5A,0XCA,0X62, +0X6D,0X93,0X4C,0X83,0X4C,0X8B,0XEB,0X7A,0X0F,0X9C,0XA6,0X39,0X2C,0X7B,0XAE,0X8B, +0XEF,0X93,0X0F,0X8C,0X8E,0X83,0X6E,0X7B,0XCF,0X83,0X2D,0X73,0X6D,0X7B,0XEF,0X8B, +0X25,0X29,0XCB,0X72,0XCE,0XA3,0X2C,0X93,0X4C,0X93,0X6D,0X9B,0X8D,0XA3,0X4C,0X9B, +0X2C,0X8B,0XCB,0X7A,0X0C,0X83,0XC7,0X49,0X09,0X42,0X4D,0X73,0X0F,0X8C,0X0F,0X8C, +0XAF,0X83,0XCF,0X83,0X71,0X9C,0X92,0X9C,0X71,0X9C,0X30,0X94,0X0F,0X94,0X30,0X9C, +0X30,0X94,0XCE,0X83,0X08,0X52,0X8D,0X93,0X2C,0X8B,0X2C,0X83,0X8D,0X93,0XEE,0X9B, +0X0F,0XA4,0XAE,0X9B,0X4C,0X8B,0X8E,0X93,0XAE,0X93,0XAA,0X62,0X50,0XA4,0X8E,0X83, +0X8E,0X83,0X0F,0X8C,0XAE,0X83,0X10,0X8C,0X30,0X94,0X0F,0X94,0XCE,0X83,0X10,0X8C, +0X08,0X4A,0X2C,0X8B,0X8D,0XA3,0X2C,0X9B,0XAE,0XA3,0X50,0XB4,0XEE,0XAB,0X6D,0X9B, +0XEB,0X8A,0XEB,0X82,0X4C,0X8B,0X08,0X52,0XCF,0X83,0X10,0X94,0XEF,0X93,0XCF,0X8B, +0X10,0X94,0X91,0X9C,0X51,0X9C,0X71,0X9C,0X91,0XA4,0X30,0X94,0X51,0X9C,0X30,0X9C, +0X50,0X9C,0XEF,0X8B,0XAA,0X6A,0X8D,0X93,0X4D,0X8B,0XAD,0X9B,0XAD,0X93,0XCE,0XA3, +0X0F,0XA4,0XAE,0X9B,0XAE,0X9B,0XAE,0X9B,0XEF,0XA3,0X69,0X5A,0X30,0X9C,0XCF,0X8B, +0XB2,0XA4,0X50,0X9C,0XEF,0X8B,0X0F,0X94,0X30,0X94,0XEF,0X8B,0XAE,0X83,0X0C,0X6B, +0XC7,0X41,0X89,0X72,0X6C,0X9B,0X4C,0X9B,0X2F,0XAC,0XEE,0XAB,0XCE,0XA3,0X8D,0X93, +0X6D,0X93,0X6C,0X93,0X6D,0X8B,0XC6,0X41,0XCF,0X83,0X0F,0X94,0XEF,0X93,0XAE,0X8B, +0XEF,0X93,0X30,0X9C,0X30,0X9C,0X0F,0X94,0XCE,0X8B,0XEF,0X8B,0X91,0XA4,0X91,0XA4, +0X51,0X9C,0X8D,0X7B,0X49,0X5A,0XAE,0X93,0XEF,0X9B,0XCE,0X9B,0X6D,0X93,0X6D,0X8B, +0XCE,0X9B,0XCE,0X9B,0XAE,0X93,0XCE,0X9B,0XEE,0XA3,0X69,0X5A,0XEF,0X93,0XEF,0X93, +0X50,0X9C,0X71,0X9C,0XEF,0X8B,0X6D,0X7B,0X0F,0X8C,0XAE,0X83,0XAE,0X83,0X4D,0X73, +0XC7,0X41,0XCA,0X82,0XEB,0X8A,0X4C,0X93,0X0F,0XB4,0X71,0XBC,0X8E,0X9B,0XEB,0X7A, +0X6D,0X93,0X2B,0X83,0XAA,0X72,0X8A,0X62,0X6E,0X7B,0X30,0X94,0XEF,0X93,0XEF,0X93, +0X0F,0X94,0X0F,0X94,0XCF,0X8B,0XCF,0X8B,0X0F,0X94,0X30,0X9C,0X71,0XA4,0X71,0XA4, +0X51,0X9C,0XEF,0X83,0X8A,0X62,0XEF,0XA3,0XCE,0X9B,0XAE,0X9B,0X2C,0X83,0XCE,0X9B, +0X0F,0XA4,0XAD,0X9B,0X6D,0X93,0X6D,0X8B,0XCE,0X9B,0X48,0X5A,0X0F,0X94,0X71,0XA4, +0X30,0X9C,0X71,0X9C,0X8D,0X7B,0XEF,0X8B,0X30,0X9C,0XEF,0X8B,0X8E,0X83,0X0F,0X8C, +0X49,0X52,0X8A,0X72,0X2C,0X93,0X6D,0X9B,0XAE,0XA3,0X8D,0X9B,0X2C,0X8B,0X0C,0X83, +0X0B,0X83,0X0B,0X83,0X0C,0X7B,0XCA,0X6A,0X30,0X94,0X50,0X9C,0XEF,0X93,0XCF,0X8B, +0XCF,0X8B,0XEF,0X8B,0X30,0X9C,0XCF,0X8B,0XEF,0X93,0X0F,0X94,0X71,0XA4,0X10,0X94, +0X30,0X9C,0XAE,0X83,0XEB,0X72,0X2F,0XAC,0X2F,0XAC,0XAE,0X9B,0XCE,0X93,0XEF,0XA3, +0XEE,0X9B,0X0C,0X83,0XEB,0X7A,0XCE,0X93,0XEE,0X9B,0X28,0X52,0X30,0X9C,0XEF,0X8B, +0XEF,0X8B,0XEF,0X8B,0X30,0X94,0X30,0X94,0X30,0X9C,0X30,0X94,0XCF,0X83,0XCE,0X83, +0XA6,0X39,0XEB,0X7A,0X8E,0X9B,0X8D,0X9B,0X6D,0X9B,0X6D,0X9B,0XCB,0X7A,0X4C,0X8B, +0X2B,0X8B,0X8D,0X9B,0X8D,0X93,0X0B,0X7B,0XCF,0X83,0X0F,0X94,0XEF,0X8B,0XCF,0X8B, +0XEF,0X8B,0X10,0X94,0X10,0X94,0X30,0X94,0X30,0X94,0X30,0X9C,0XEF,0X93,0XEF,0X93, +0X30,0X94,0XAD,0X83,0X8A,0X6A,0X8D,0X93,0XAE,0X93,0XAE,0X93,0XAE,0X9B,0XEF,0XA3, +0XAD,0X93,0X4D,0X8B,0XCE,0X93,0XEE,0X9B,0XEF,0XA3,0X0B,0X73,0XAE,0X8B,0XCE,0X8B, +0XCF,0X8B,0X30,0X94,0X50,0X94,0X10,0X94,0XAE,0X83,0X8E,0X7B,0X8E,0X7B,0X30,0X94, +0XE8,0X41,0X6D,0X93,0XAD,0XA3,0X8D,0X9B,0X8D,0X9B,0XEB,0X82,0X8D,0X93,0X4C,0X8B, +0X8D,0X9B,0XCE,0XA3,0X8D,0X93,0XEA,0X72,0X0D,0X6B,0XEF,0X8B,0XEF,0X93,0XAE,0X8B, +0XEF,0X8B,0X30,0X9C,0X0F,0X94,0X30,0X94,0X91,0XA4,0X30,0X9C,0X50,0X9C,0X30,0X9C, +0X71,0XA4,0XB1,0XA4,0X69,0X62,0X4C,0X8B,0X4D,0X8B,0XAE,0X9B,0XCE,0X9B,0X0F,0XA4, +0XEF,0X9B,0XCE,0X9B,0X0F,0XA4,0X30,0XAC,0XEF,0XA3,0X69,0X5A,0X6D,0X7B,0X71,0X9C, +0X51,0X9C,0X91,0XA4,0X10,0X94,0XAE,0X83,0X2C,0X73,0X8E,0X7B,0X6E,0X7B,0XEF,0X8B, +0X08,0X4A,0X2C,0X8B,0XAD,0XA3,0XAD,0XA3,0XCE,0XA3,0X8D,0X9B,0X8D,0X93,0X8D,0X9B, +0X8D,0X9B,0X8D,0X9B,0X8D,0X9B,0X88,0X62,0X4D,0X73,0XCF,0X8B,0XEF,0X93,0XCF,0X8B, +0X71,0X9C,0X71,0X9C,0XEF,0X8B,0X0F,0X94,0X30,0X9C,0XEF,0X93,0X30,0X94,0X30,0X9C, +0X50,0X9C,0X0F,0X8C,0X69,0X62,0X6D,0X8B,0XAE,0X93,0XCE,0X9B,0X0F,0XA4,0XEF,0XA3, +0X2F,0XA4,0X0F,0XA4,0XCE,0X9B,0XCE,0X9B,0X0F,0XA4,0XE7,0X49,0X30,0X9C,0X71,0X9C, +0X92,0X9C,0X91,0XA4,0X10,0X94,0X0F,0X8C,0XAE,0X83,0X51,0X9C,0XAE,0X83,0XAE,0X7B, +0XC7,0X39,0X2C,0X8B,0X6D,0X9B,0X6D,0X9B,0X8D,0X9B,0X4C,0X8B,0X6C,0X93,0X8D,0XA3, +0X2B,0X93,0X4C,0X93,0X6D,0X93,0X0A,0X73,0X4D,0X7B,0XCF,0X83,0XCF,0X8B,0XEF,0X93, +0X0F,0X94,0X50,0X9C,0X30,0X94,0XEF,0X8B,0X10,0X8C,0X0F,0X94,0X50,0X9C,0X0F,0X94, +0X10,0X94,0X0F,0X8C,0X69,0X62,0X8E,0X93,0XAE,0X93,0XCE,0X9B,0X0F,0XA4,0XEF,0XA3, +0X0F,0XA4,0XEE,0XA3,0X0F,0XA4,0XCE,0X9B,0X91,0XB4,0XEB,0X62,0X92,0XA4,0X91,0XA4, +0XD2,0XA4,0X92,0X9C,0X30,0X94,0X0F,0X8C,0XAE,0X83,0XCE,0X83,0XCF,0X83,0X51,0X94, +0X8A,0X5A,0X4C,0X93,0XCB,0X82,0X6D,0X9B,0X4D,0X93,0X0C,0X83,0X6C,0X9B,0X4C,0X93, +0X8D,0X9B,0XEF,0XAB,0XEF,0XA3,0X0E,0X94,0X4D,0X73,0X10,0X8C,0XEF,0X8B,0XCF,0X8B, +0X30,0X94,0X50,0X9C,0X30,0X94,0XEF,0X8B,0XEF,0X8B,0X30,0X94,0X71,0X9C,0X51,0X9C, +0X71,0X9C,0X6F,0X9C,0XEB,0X72,0X8E,0X8B,0XEF,0X9B,0X50,0XAC,0X0F,0XA4,0X0F,0XA4, +0X48,0X5A,0X48,0X5A,0XCA,0X72,0XAA,0X6A,0XCA,0X6A,0X04,0X21,0X07,0X4A,0X69,0X52, +0XCA,0X62,0X4C,0X73,0X6D,0X7B,0XCB,0X62,0XCB,0X62,0X0C,0X6B,0X69,0X52,0X2C,0X6B, +0XE3,0X20,0X45,0X39,0XC7,0X49,0XC7,0X49,0X08,0X5A,0X49,0X62,0XCA,0X72,0XAA,0X72, +0X07,0X5A,0X69,0X6A,0X2B,0X7B,0X65,0X31,0XE3,0X20,0X89,0X5A,0X49,0X5A,0XEB,0X62, +0X2C,0X73,0XCA,0X62,0X0B,0X6B,0X2C,0X73,0X0C,0X6B,0X2C,0X73,0X6D,0X7B,0XCB,0X62, +0X4C,0X73,0XA5,0X31,0XC7,0X41,0X2C,0X7B,0XCB,0X6A,0X4C,0X83,0X2C,0X7B,0X89,0X6A, +0XCE,0XAB,0X0F,0XB4,0X8D,0XA3,0X4C,0X93,0XAE,0XA3,0X8D,0X9B,0XAD,0X9B,0X08,0X5A, +0X0C,0X8B,0XC7,0X49,0XA7,0X41,0X09,0X52,0X0B,0X8B,0XAD,0XA3,0X8D,0XA3,0X0B,0X8B, +0XCB,0X7A,0X69,0X72,0X89,0X72,0X08,0X52,0XE3,0X28,0X62,0X08,0X26,0X29,0X69,0X62, +0XEA,0X7A,0X49,0X62,0XE7,0X51,0XEB,0X82,0XEB,0X82,0X0B,0X83,0X2C,0X8B,0X2C,0X8B, +0XAE,0X93,0XA6,0X39,0XAB,0X5A,0X2D,0X6B,0XAE,0X7B,0XCF,0X83,0X6D,0X73,0XF0,0X83, +0X8E,0X7B,0X10,0X8C,0X50,0X94,0X30,0X94,0XC3,0X18,0XA7,0X41,0XEB,0X7A,0XAE,0X9B, +0X4F,0XBC,0X0F,0XB4,0X0E,0XB4,0XEE,0XB3,0XEE,0XB3,0X0F,0XB4,0X8D,0XA3,0X0B,0X93, +0X8D,0X9B,0X48,0X62,0X49,0X6A,0XAB,0X7A,0X2B,0X93,0X6C,0X9B,0X8D,0XA3,0X8D,0X9B, +0X2C,0X93,0X0C,0X8B,0XCB,0X7A,0XEB,0X82,0XAA,0X6A,0X86,0X39,0X69,0X5A,0XEB,0X7A, +0X0B,0X83,0X4C,0X93,0X4C,0X93,0X6D,0X9B,0X4C,0X93,0XAD,0XA3,0XAD,0XAB,0XCE,0XAB, +0X2F,0XB4,0XEB,0X6A,0X10,0X8C,0X30,0X8C,0X71,0X94,0X91,0X9C,0X10,0X8C,0X51,0X94, +0X30,0X8C,0X51,0X94,0X10,0X94,0X10,0X8C,0X08,0X42,0X8A,0X72,0XEE,0XB3,0X50,0XBC, +0X0F,0XBC,0X0E,0XB4,0XAE,0XAB,0X8D,0XA3,0X0F,0XB4,0XCE,0XAB,0X8D,0XA3,0X2C,0X93, +0X2F,0XB4,0XC7,0X49,0X6C,0X9B,0X4C,0X9B,0X2C,0X93,0X6D,0X9B,0X6D,0X9B,0X6C,0X9B, +0X2C,0X93,0XCB,0X7A,0XCB,0X7A,0X4D,0X8B,0XCB,0X7A,0XEB,0X7A,0XEB,0X72,0X6D,0X83, +0X6D,0X8B,0XAD,0X9B,0XAD,0XA3,0X4C,0X93,0XAE,0X9B,0X2F,0XB4,0XEE,0XB3,0XAD,0XAB, +0XEE,0XB3,0XCA,0X62,0X71,0X94,0XB2,0X9C,0XF3,0XA4,0X92,0X9C,0X10,0X8C,0X10,0X8C, +0X71,0X9C,0X51,0X94,0X0F,0X8C,0X30,0X94,0X89,0X5A,0XCE,0XAB,0X0E,0XB4,0X2F,0XBC, +0XCE,0XAB,0XAD,0XAB,0X6D,0X9B,0X2F,0XB4,0X0F,0XBC,0XCE,0XAB,0XEE,0XAB,0XCE,0XA3, +0XEE,0XAB,0X89,0X6A,0X8D,0XA3,0X6D,0X9B,0XEF,0XA3,0X70,0XB4,0X0F,0XB4,0X8D,0XA3, +0X2C,0X93,0XEB,0X82,0X0C,0X8B,0X8D,0X9B,0XCB,0X72,0X0B,0X7B,0X4C,0X83,0X6D,0X8B, +0X8D,0X93,0X4C,0X93,0XAD,0X9B,0X2C,0X93,0XAE,0X9B,0X2F,0XB4,0X0F,0XB4,0X2C,0X93, +0X30,0XB4,0X69,0X52,0X92,0X9C,0XB2,0X9C,0X91,0X9C,0XEF,0X83,0XEF,0X83,0X30,0X8C, +0X92,0X9C,0XEF,0X83,0XEF,0X8B,0XEF,0X8B,0X6D,0X73,0XAE,0XA3,0X2F,0XBC,0X0F,0XB4, +0XAD,0XAB,0X8D,0XA3,0X0F,0XB4,0X0F,0XB4,0XCE,0XAB,0XAD,0XA3,0XAD,0XA3,0XEE,0XAB, +0X0F,0XAC,0X48,0X62,0X8D,0XA3,0X8D,0X9B,0XEE,0XAB,0XEE,0XB3,0X50,0XB4,0X4C,0X93, +0X2C,0X93,0X2C,0X93,0X6C,0X9B,0X0C,0X8B,0XCB,0X72,0X0B,0X7B,0X2C,0X83,0X4C,0X8B, +0X4C,0X93,0X2C,0X8B,0X0B,0X8B,0X4C,0X93,0X6D,0X9B,0XEE,0XAB,0XAD,0XA3,0X8D,0XA3, +0X0F,0XB4,0XCA,0X62,0X91,0X94,0X92,0X9C,0X30,0X8C,0XEF,0X83,0X6E,0X73,0X51,0X94, +0XCF,0X83,0XAE,0X83,0XEF,0X83,0XEF,0X83,0X2C,0X6B,0X70,0XBC,0X50,0XBC,0X6D,0XA3, +0X8D,0XA3,0XCD,0XB3,0XCD,0XB3,0XCE,0XAB,0X8D,0XA3,0X0B,0X93,0X2C,0X93,0XAD,0XA3, +0X8D,0X9B,0X89,0X6A,0X8D,0X9B,0X8D,0XA3,0XCE,0XA3,0XAD,0XA3,0X6D,0X9B,0XCB,0X7A, +0X2C,0X8B,0XAD,0X9B,0X4C,0X9B,0X0C,0X8B,0X8A,0X62,0X49,0X5A,0X2C,0X83,0X4C,0X8B, +0X2C,0X8B,0X2C,0X83,0X2C,0X83,0X6D,0X93,0XEF,0XA3,0X0F,0XAC,0XEF,0XA3,0XCE,0XA3, +0X0F,0XB4,0XEB,0X6A,0X92,0X94,0X51,0X94,0X51,0X94,0X10,0X8C,0X10,0X8C,0X10,0X8C, +0XCF,0X83,0XCF,0X7B,0XF0,0X83,0X10,0X8C,0X6D,0X73,0XCE,0XAB,0X4D,0X8B,0X2C,0X93, +};