From c58fcf5554827113680ee16559c36ed21e0ec0e0 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sun, 11 Dec 2011 19:56:50 -0500 Subject: fixed TIMER4 use on Leonardo ATMEGA32U4 has major differences in TIMER4 registers compared to ATMEGA1280 and 2560. turnOffPWM, analogWrite, and initialize routines had wrong registers, bit names, etc. --- boards.txt | 30 +++++++++++++++--------------- cores/arduino/wiring.c | 11 ++++++++++- cores/arduino/wiring_analog.c | 24 ++++++++++++++++-------- cores/arduino/wiring_digital.c | 22 +++++++++++++++++++--- variants/leonardo/pins_arduino.h | 2 +- 5 files changed, 61 insertions(+), 28 deletions(-) mode change 100755 => 100644 cores/arduino/wiring.c mode change 100755 => 100644 cores/arduino/wiring_digital.c diff --git a/boards.txt b/boards.txt index 018a7fa..ded7572 100644 --- a/boards.txt +++ b/boards.txt @@ -144,21 +144,21 @@ mega.build.variant=mega ############################################################## -#leonardo.name=Arduino Leonardo -#leonardo.upload.protocol=arduino -#leonardo.upload.maximum_size=28672 -#leonardo.upload.speed=1200 -#leonardo.bootloader.low_fuses=0xde -#leonardo.bootloader.high_fuses=0xd8 -#leonardo.bootloader.extended_fuses=0xcb -#leonardo.bootloader.path=diskloader -#leonardo.bootloader.file=DiskLoader-Leonardo.hex -#leonardo.bootloader.unlock_bits=0x3F -#leonardo.bootloader.lock_bits=0x2F -#leonardo.build.mcu=atmega32u4 -#leonardo.build.f_cpu=16000000L -#leonardo.build.core=arduino -#leonardo.build.variant=leonardo +leonardo.name=Arduino Leonardo +leonardo.upload.protocol=arduino +leonardo.upload.maximum_size=28672 +leonardo.upload.speed=1200 +leonardo.bootloader.low_fuses=0xde +leonardo.bootloader.high_fuses=0xd8 +leonardo.bootloader.extended_fuses=0xcb +leonardo.bootloader.path=diskloader +leonardo.bootloader.file=DiskLoader-Leonardo.hex +leonardo.bootloader.unlock_bits=0x3F +leonardo.bootloader.lock_bits=0x2F +leonardo.build.mcu=atmega32u4 +leonardo.build.f_cpu=16000000L +leonardo.build.core=arduino +leonardo.build.variant=leonardo ############################################################## diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c old mode 100755 new mode 100644 index e7f7cde..9c264d0 --- a/cores/arduino/wiring.c +++ b/cores/arduino/wiring.c @@ -278,12 +278,21 @@ void init() sbi(TCCR3B, CS30); sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode #endif - + +#if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */ + sbi(TCCR4A, COM4A1); // clear channel A on output compare match + sbi(TCCR4C, COM4D1); // clear channel D on output compare match + sbi(TCCR4B, CS42); // set timer4 prescale factor to 64 + sbi(TCCR4B, CS41); + sbi(TCCR4B, CS40); + sbi(TCCR4D, WGM40); // put timer 4 in phase- and frequency-correct PWM mode +#else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */ #if defined(TCCR4B) && defined(CS41) && defined(WGM40) sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 sbi(TCCR4B, CS40); sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode #endif +#endif /* end timer4 block for ATMEGA1280/2560 and similar */ #if defined(TCCR5B) && defined(CS51) && defined(WGM50) sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64 diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c index 902b153..db6cb7e 100644 --- a/cores/arduino/wiring_analog.c +++ b/cores/arduino/wiring_analog.c @@ -204,14 +204,18 @@ void analogWrite(uint8_t pin, int val) break; #endif - #if defined(TCCR4A) && defined(COM4A1) + #if defined(TCCR4A) case TIMER4A: - // connect pwm to pin on timer 4, channel A + //connect pwm to pin on timer 4, channel A + #if defined(PWM4A) /* ATMEGA32U4 and related */ + sbi(TCCR4A, PWM4A); + #elif defined(COM4A1) /* ATMEGA1280/2560 and related */ sbi(TCCR4A, COM4A1); - OCR4A = val; // set pwm duty + #endif + OCR4A = val; // set pwm duty break; #endif - + #if defined(TCCR4A) && defined(COM4B1) case TIMER4B: // connect pwm to pin on timer 4, channel B @@ -228,14 +232,17 @@ void analogWrite(uint8_t pin, int val) break; #endif - #if defined(TCCR4A) && defined(COM4D1) - case TIMER4D: + #if defined(TCCR4C) + case TIMER4D: // connect pwm to pin on timer 4, channel D - sbi(TCCR4A, COM4D1); - OCR4D = val; // set pwm duty + #if defined(PWM4D) /* ATMEGA32U4 and related */ + sbi(TCCR4C, PWM4D); + #endif + OCR4D = val; // set pwm duty break; #endif + #if defined(TCCR5A) && defined(COM5A1) case TIMER5A: // connect pwm to pin on timer 5, channel A @@ -270,3 +277,4 @@ void analogWrite(uint8_t pin, int val) } } } + diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c old mode 100755 new mode 100644 index 97ef134..112defc --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -105,15 +105,31 @@ static void turnOffPWM(uint8_t timer) case TIMER3C: cbi(TCCR3A, COM3C1); break; #endif - #if defined(TCCR4A) && defined(COM4A1) - case TIMER4A: cbi(TCCR4A, COM4A1); break; - #endif + #if defined(TCCR4A) + case TIMER4A: + #if defined(PWM4A) + cbi(TCCR4A, PWM4A); + #elif defined(COM4A1) + cbi(TCCR4A, COM4A1); + #endif + break; + #endif + #if defined(TCCR4A) && defined(COM4B1) case TIMER4B: cbi(TCCR4A, COM4B1); break; #endif #if defined(TCCR4A) && defined(COM4C1) case TIMER4C: cbi(TCCR4A, COM4C1); break; #endif + + #if defined(TCCR4C) + case TIMER4D: + #if defined(PWM4D) + cbi(TCCR4C, PWM4D); + #endif + break; + #endif + #if defined(TCCR5A) case TIMER5A: cbi(TCCR5A, COM5A1); break; case TIMER5B: cbi(TCCR5A, COM5B1); break; diff --git a/variants/leonardo/pins_arduino.h b/variants/leonardo/pins_arduino.h index 15afb4e..0a0c574 100644 --- a/variants/leonardo/pins_arduino.h +++ b/variants/leonardo/pins_arduino.h @@ -212,7 +212,7 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[30] = { _BV(6), // D29 / D12 - A11 - PD6 }; -const uint8_t PROGMEM digital_pin_to_timer_PGM[18] = { +const uint8_t PROGMEM digital_pin_to_timer_PGM[16] = { NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, -- cgit v1.2.3-18-g5258 From 9bd7761e3a77e939b54dc05241a57c64f1c55b74 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sun, 18 Dec 2011 12:52:30 -0500 Subject: fix bootloader size in boards.txt - 2 kB instead of 4 kB --- boards.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boards.txt b/boards.txt index ded7572..efd0766 100644 --- a/boards.txt +++ b/boards.txt @@ -146,10 +146,10 @@ mega.build.variant=mega leonardo.name=Arduino Leonardo leonardo.upload.protocol=arduino -leonardo.upload.maximum_size=28672 +leonardo.upload.maximum_size=30720 leonardo.upload.speed=1200 leonardo.bootloader.low_fuses=0xde -leonardo.bootloader.high_fuses=0xd8 +leonardo.bootloader.high_fuses=0xda leonardo.bootloader.extended_fuses=0xcb leonardo.bootloader.path=diskloader leonardo.bootloader.file=DiskLoader-Leonardo.hex -- cgit v1.2.3-18-g5258 From 177641003c53844ad73584553a9d44f2da4648e2 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sun, 18 Dec 2011 14:18:38 -0500 Subject: fixed digitalWrite on timer 4 pins (D6 and D13) --- cores/arduino/wiring.c | 4 ++++ cores/arduino/wiring_analog.c | 8 +------- cores/arduino/wiring_digital.c | 24 ++++++------------------ 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c index 9c264d0..fb447eb 100644 --- a/cores/arduino/wiring.c +++ b/cores/arduino/wiring.c @@ -281,11 +281,15 @@ void init() #if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */ sbi(TCCR4A, COM4A1); // clear channel A on output compare match + cbi(TCCR4A, COM4A0); sbi(TCCR4C, COM4D1); // clear channel D on output compare match + cbi(TCCR4C, COM4D0); sbi(TCCR4B, CS42); // set timer4 prescale factor to 64 sbi(TCCR4B, CS41); sbi(TCCR4B, CS40); sbi(TCCR4D, WGM40); // put timer 4 in phase- and frequency-correct PWM mode + sbi(TCCR4A, PWM4A); // enable PWM mode for comparator OCR4A + sbi(TCCR4C, PWM4D); // enable PWM mode for comparator OCR4D #else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */ #if defined(TCCR4B) && defined(CS41) && defined(WGM40) sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c index db6cb7e..8a6fef3 100644 --- a/cores/arduino/wiring_analog.c +++ b/cores/arduino/wiring_analog.c @@ -207,11 +207,7 @@ void analogWrite(uint8_t pin, int val) #if defined(TCCR4A) case TIMER4A: //connect pwm to pin on timer 4, channel A - #if defined(PWM4A) /* ATMEGA32U4 and related */ - sbi(TCCR4A, PWM4A); - #elif defined(COM4A1) /* ATMEGA1280/2560 and related */ sbi(TCCR4A, COM4A1); - #endif OCR4A = val; // set pwm duty break; #endif @@ -235,9 +231,7 @@ void analogWrite(uint8_t pin, int val) #if defined(TCCR4C) case TIMER4D: // connect pwm to pin on timer 4, channel D - #if defined(PWM4D) /* ATMEGA32U4 and related */ - sbi(TCCR4C, PWM4D); - #endif + sbi(TCCR4C, COM4D1); OCR4D = val; // set pwm duty break; #endif diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 112defc..75f850e 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -105,29 +105,17 @@ static void turnOffPWM(uint8_t timer) case TIMER3C: cbi(TCCR3A, COM3C1); break; #endif - #if defined(TCCR4A) - case TIMER4A: - #if defined(PWM4A) - cbi(TCCR4A, PWM4A); - #elif defined(COM4A1) - cbi(TCCR4A, COM4A1); - #endif - break; - #endif - + #if defined(TCCR4A) && defined(COM4A1) + case TIMER4A: cbi(TCCR4A, COM4A1); break; + #endif #if defined(TCCR4A) && defined(COM4B1) case TIMER4B: cbi(TCCR4A, COM4B1); break; #endif #if defined(TCCR4A) && defined(COM4C1) case TIMER4C: cbi(TCCR4A, COM4C1); break; - #endif - - #if defined(TCCR4C) - case TIMER4D: - #if defined(PWM4D) - cbi(TCCR4C, PWM4D); - #endif - break; + #endif + #if defined(TCCR4C) && defined(COM4D1) + case TIMER4D: cbi(TCCR4C, COM4D1); break; #endif #if defined(TCCR5A) -- cgit v1.2.3-18-g5258 From 58fc0d17cc2d7c5dfb4ce268b7e43d35eebac342 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sun, 18 Dec 2011 17:52:35 -0500 Subject: added asynchronous buffering of received CDC characters This fixes the issue Federico reported where bytes written by host but not read by sketch would cause serial connection to lock up. Ring buffer implementation is based on HardwareSerial.cpp. Adds public accept() method to CDC. --- cores/arduino/CDC.cpp | 67 ++++++++++++++++++++++++++++++++++++----------- cores/arduino/USBAPI.h | 3 +++ cores/arduino/USBCore.cpp | 2 ++ 3 files changed, 56 insertions(+), 16 deletions(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 14a0eae..8605ce3 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -30,6 +30,25 @@ void Reboot() asm volatile("jmp 0x7800"); // jump to bootloader - DiskLoader takes up last 2 kB } +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which head is the index of the location +// to which to write the next incoming character and tail is the index of the +// location from which to read. +#if (RAMEND < 1000) +#define SERIAL_BUFFER_SIZE 16 +#else +#define SERIAL_BUFFER_SIZE 64 +#endif + +struct ring_buffer +{ + unsigned char buffer[SERIAL_BUFFER_SIZE]; + volatile int head; + volatile int tail; +}; + +ring_buffer cdc_rx_buffer = { { 0 }, 0, 0}; + typedef struct { u32 dwDTERate; @@ -111,33 +130,49 @@ void Serial_::end(void) { } +void Serial_::accept(void) +{ + ring_buffer *buffer = &cdc_rx_buffer; + int c = USB_Recv(CDC_RX); + int i = (unsigned int)(buffer->head+1) % SERIAL_BUFFER_SIZE; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != buffer->tail) { + buffer->buffer[buffer->head] = c; + buffer->head = i; + } +} + int Serial_::available(void) { - u8 avail = USB_Available(CDC_RX); - if (_serialPeek != -1) - avail++; - return avail; + ring_buffer *buffer = &cdc_rx_buffer; + return (unsigned int)(SERIAL_BUFFER_SIZE + buffer->head - buffer->tail) % SERIAL_BUFFER_SIZE; } -// peek is nasty int Serial_::peek(void) { - if (_serialPeek == -1) - _serialPeek = read(); - return _serialPeek; + ring_buffer *buffer = &cdc_rx_buffer; + if (buffer->head == buffer->tail) { + return -1; + } else { + return buffer->buffer[buffer->tail]; + } } int Serial_::read(void) { - int c; - if (_serialPeek != -1) - { - c = _serialPeek; - _serialPeek = -1; + ring_buffer *buffer = &cdc_rx_buffer; + // if the head isn't ahead of the tail, we don't have any characters + if (buffer->head == buffer->tail) { + return -1; } else { - c = USB_Recv(CDC_RX); - } - return c; + unsigned char c = buffer->buffer[buffer->tail]; + buffer->tail = (unsigned int)(buffer->tail + 1) % SERIAL_BUFFER_SIZE; + return c; + } } void Serial_::flush(void) diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 26a2032..1772c3c 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -27,11 +27,14 @@ extern USB_ USB; class Serial_ : public Stream { +private: + ring_buffer *_cdc_rx_buffer; public: void begin(uint16_t baud_count); void end(void); virtual int available(void); + virtual void accept(void); virtual int peek(void); virtual int read(void); virtual void flush(void); diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index 398bc73..7924078 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -599,6 +599,8 @@ ISR(USB_GEN_vect) { #ifdef CDC_ENABLED USB_Flush(CDC_TX); // Send a tx frame if found + while (USB_Available(CDC_RX)) // Handle received bytes (if any) + Serial.accept(); #endif // check whether the one-shot period has elapsed. if so, turn off the LED -- cgit v1.2.3-18-g5258 From 6dc00061df81b4750208996bb7dd0ec76f8f901f Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 19 Dec 2011 15:40:12 -0500 Subject: fixed attachInterrupt() on Leonardo had to define a separate block for the 32U4 since it looks like a Mega-series board based on a simple register trick. Only two useable HW interrupts though, compared to the Megas' 8, and numbering differs. --- cores/arduino/WInterrupts.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) mode change 100755 => 100644 cores/arduino/WInterrupts.c diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.c old mode 100755 new mode 100644 index 1449cfb..2ec72a5 --- a/cores/arduino/WInterrupts.c +++ b/cores/arduino/WInterrupts.c @@ -47,7 +47,19 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { // Enable the interrupt. switch (interruptNum) { -#if defined(EICRA) && defined(EICRB) && defined(EIMSK) +#if defined(__AVR_ATmega32U4__) + // I hate doing this, but the register assignment differs between the 1280/2560 + // and the 32U4. Since avrlib defines registers PCMSK1 and PCMSK2 that aren't + // even present on the 32U4 this is the only way to distinguish between them. + case 0: + EICRA = (EICRA & ~((1< Date: Tue, 20 Dec 2011 17:00:19 -0500 Subject: changed Keyboard write() method to type(). Made write() an alias for type() to allow subclassing by Stream. --- cores/arduino/HID.cpp | 5 +++++ cores/arduino/USBAPI.h | 1 + 2 files changed, 6 insertions(+) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index 8ed1566..d69522f 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -407,6 +407,11 @@ const uint8_t _asciimap[128] = uint8_t USBPutChar(uint8_t c); size_t Keyboard_::write(uint8_t c) +{ + type(c); +} + +size_t Keyboard_::type(uint8_t c) { // Keydown { diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 1772c3c..326fd6c 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -105,6 +105,7 @@ private: public: Keyboard_(); virtual size_t write(uint8_t); + virtual size_t type(uint8_t); }; extern Keyboard_ Keyboard; -- cgit v1.2.3-18-g5258 From e405a6eb6099a71959c664cab8ca8241634c6b91 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 20 Dec 2011 17:08:07 -0500 Subject: Revert "changed Keyboard write() method to type(). Made write() an alias for type() to allow subclassing by Stream." This reverts commit de1d5fc0cb82874c0dcb766c5fb27ab36c5cb32c. --- cores/arduino/HID.cpp | 5 ----- cores/arduino/USBAPI.h | 1 - 2 files changed, 6 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index d69522f..8ed1566 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -407,11 +407,6 @@ const uint8_t _asciimap[128] = uint8_t USBPutChar(uint8_t c); size_t Keyboard_::write(uint8_t c) -{ - type(c); -} - -size_t Keyboard_::type(uint8_t c) { // Keydown { diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 326fd6c..1772c3c 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -105,7 +105,6 @@ private: public: Keyboard_(); virtual size_t write(uint8_t); - virtual size_t type(uint8_t); }; extern Keyboard_ Keyboard; -- cgit v1.2.3-18-g5258 From 4e9fb924b2ea4c1373edc09408db2ac0c402e68c Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 20 Dec 2011 17:09:44 -0500 Subject: changed Keyboard write() method to type(). Made write() an alias for type() to allow subclassing by Stream. --- cores/arduino/HID.cpp | 3 ++- cores/arduino/USBAPI.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index 8ed1566..e6fb5f7 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -406,7 +406,8 @@ const uint8_t _asciimap[128] = }; uint8_t USBPutChar(uint8_t c); -size_t Keyboard_::write(uint8_t c) + +size_t Keyboard_::type(uint8_t c) { // Keydown { diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 1772c3c..6a0b989 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -104,7 +104,8 @@ private: void setKeyMap(KeyMap* keyMap); public: Keyboard_(); - virtual size_t write(uint8_t); + virtual size_t write(uint8_t c) {type(c);}; + virtual size_t type(uint8_t c); }; extern Keyboard_ Keyboard; -- cgit v1.2.3-18-g5258 From 80b02232e4b8912dbaadef47ca4cf24f35fa473d Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 26 Dec 2011 17:19:48 -0500 Subject: bootloader merged with blink sketch full set of descriptors in sketch fixes driver installation issue on Win7. --- bootloaders/diskloader/DiskLoader-Leonardo.hex | 1133 +++++++++++++++++++++--- 1 file changed, 1018 insertions(+), 115 deletions(-) diff --git a/bootloaders/diskloader/DiskLoader-Leonardo.hex b/bootloaders/diskloader/DiskLoader-Leonardo.hex index 0d0c167..e14aa31 100644 --- a/bootloaders/diskloader/DiskLoader-Leonardo.hex +++ b/bootloaders/diskloader/DiskLoader-Leonardo.hex @@ -1,115 +1,1018 @@ -:1078000011241FBECFEFDAE0DEBFCDBFFFC04101C4 -:1078100042144505560455026403740300001E9586 -:1078200087020110030000C18081C106C0FF0A0069 -:107830000CA10185037508150026FF00954009017C -:107840008102954009029102C0040309041A033021 -:1078500000300030003000300030003000300031A7 -:1078600000370030003100380341007200640075B9 -:107870000069006E006F0020004C0065006F006E14 -:10788000006100720064006F00200062006F006FF2 -:107890000074006C006F00610064006500720018E5 -:1078A00003410072006400750069006E006F0020E3 -:1078B000004C004C00430012010002020000404155 -:1078C0002334000001000203011201000200000045 -:1078D0004041233400000100020301090264000357 -:1078E00001008032080B00020202010009040000BE -:1078F0000102020000052400100105240101010419 -:107900002402020524060001070581031000400936 -:10791000040100020A0000000705020240000007FF -:107920000583024000000904020001030000000971 -:107930002101010001221E000705840340004000D0 -:1079400020918A0130918B012C5F3F4F30938B0146 -:1079500020938A01C901892F99278695982F803411 -:1079600018F08FE7891B982F990F921710F44798FA -:107970000895479A08955D9A289A81E08093E000DF -:107980001092E200EE27FF27099408950F931F93AA -:10799000CF93DF93982FEB01042F10E088E760303E -:1079A000780730F411E083E0FB0180935700E895FD -:1079B000892F68E071E0402FF8D0112311F107B64C -:1079C00000FCFDCF402F4695FE01A8E0B1E020E08D -:1079D00031E009C08D919D910C0130935700E895DD -:1079E000112432962F5F2417A8F385E0FE018093BF -:1079F0005700E89507B600FCFDCF81E18093570062 -:107A0000E895DF91CF911F910F91089588E10FB60E -:107A1000F89480936000109260000FBE5D9A289ADF -:107A200047983F9A209A559A90E890936100109257 -:107A3000610081E885BF95BF9FD084E18093880174 -:107A400080E180938901E0E0F0E0859194918F5F7F -:107A50009F4F19F081E080938F01EE24FF24BB2417 -:107A6000B39454EFC52E51E0D52E13D2082F8EE0DB -:107A700098E7FC012491319602964491201711F069 -:107A80002223B9F7109291011092900182E068E0F0 -:107A900071E08BD0013479F4609108016058633053 -:107AA00028F0683111F064E001C063E0C62FD0E037 -:107AB000CF5DD7480EC0063571F480910801803340 -:107AC00011F011E022C080910A01C82FD0E0C25EFF -:107AD000D74811E022C0053721F413E0CEE1D8E702 -:107AE0001CC0053539F4E0900801F0900901EE0C56 -:107AF000FF1C0AC0043631F482E0B701409109014D -:107B000045DF02C0043721F010E0C5E2D8E705C028 -:107B100010910901E701E10EF11CBBD18097B1F48E -:107B200083E068E871E041E050E059D0112329F08A -:107B3000412F50E083E8BE0152D083E469E871E050 -:107B400041E050E04CD0013509F08FCFD092910147 -:107B5000C0929001B0928F01EE24FF2486CFFC01E9 -:107B6000289884E680938D0104C08091F100819370 -:107B700061506623D1F708951092910110929001FF -:107B800010928E0110928F0181E08093D70080EADD -:107B90008093D80082E189BD09B400FEFDCF80E961 -:107BA0008093D8001092E0000895FB018093E900D3 -:107BB00024E69BE611C08091E80085FFFCCF289861 -:107BC00020938D018091F10081938091E80085FDE3 -:107BD00002C09093E8004150442369F70895982F1C -:107BE000FB01282F207287708093E90064E63AE356 -:107BF00017C08091E80085FFFCCF97FF02C08491F9 -:107C000001C080813196211180E05D9860938C01E4 -:107C10008093F1008091E80085FD02C03093E80078 -:107C2000415050408FEF4F3F580719F796FF03C060 -:107C30008AE38093E800089580919301813299F45A -:107C40005D9884E680938C0120E030E003C0808161 -:107C50008093F100F901E050FF4F2F5F3F4F283034 -:107C60003105A9F714C0803261F48091E80082FFE9 -:107C7000FCCF80E091E067E072DF8BEF8093E8005B -:107C800006C0823221F4809194018093070181E043 -:107C9000089520919501223289F1213081F480915B -:107CA000980190919901089711F420939A0180917D -:107CB0009A01882309F04FC0E9ECF8E74EC0223062 -:107CC00021F484E6EBEDF8E71CC0233009F041C055 -:107CD00080919401882319F4E9E4F8E73EC08230EA -:107CE00019F4E7E6F8E739C0833019F4EDE4F8E772 -:107CF00034C0813071F5EFE9F8E72FC081E0EBE2A5 -:107D0000F8E790919801382F981708F4392F90913F -:107D10008C0120E04EEF8091E8008570E1F38091C6 -:107D2000E80082FD12C02F5F84915D988093F1007E -:107D3000822F8F7311F44093E800319694E6231755 -:107D400050F390938C0181E0089590938C0180E032 -:107D5000089580E00895E7EBF8E78491D2CF109280 -:107D6000E9008091E80083FF61C082E991E068E06A -:107D7000F6DE82EF8093E8008091920187FF05C0D4 -:107D80008091E80080FFFCCF03C08EEF8093E80075 -:107D900080919301853051F48091E80080FFFCCF01 -:107DA0008091940180688093E30039C08930E1F4C8 -:107DB0008091940180938E01E7E2F8E791E031E051 -:107DC00026E39093E9003093EB0084918093EC00DC -:107DD0002093ED009F5F3196953099F78EE7809361 -:107DE000EA001092EA001BC0883049F490918E019D -:107DF0005D9884E680938C019093F10010C08823F5 -:107E000039F45D9884E680938C011092F10007C0EC -:107E1000863011F43EDF01C00FDF882321F08EEFA2 -:107E20008093E800089581E28093EB0008958091AB -:107E3000E1001092E100282F83FF0CC01092E900AE -:107E400081E08093EB001092EC0082E38093ED00E0 -:107E500010928E0122FF1CC080918C01882331F08A -:107E6000815080938C01882309F45D9A80918D0163 -:107E7000882331F0815080938D01882309F4289A5A -:107E800080918F01882321F410929101109290012A -:107E900008951F93CF93DF9312E0C0E9D1E05FDF35 -:107EA000C6DF1093E9008091E80085FF13C0289891 -:107EB00084E680938D019091F1008091E80085FD2A -:107EC00003C08BE68093E800892F90E0DF91CF918B -:107ED0001F91089580919001909191010197909345 -:107EE0009101809390018091900190919101892B53 -:0E7EF00009F441DDCE010197F1F722DDD0CF7C -:087EFE0000E10000000000009B -:040000030000780081 -:00000001FF +:200000000C946F010C9497010C9497010C9497010C9497010C9497010C9497010C94970148 +:200020000C9497010C9497010C94FE040C9489050C9497010C9497010C9497010C949701A0 +:200040000C9497010C9497010C9497010C9497010C9497010C9497010C9497010C94B301C4 +:200060000C9497010C9497010C9497010C9497010C9497010C9497010C9497010C949701C0 +:200080000C9497010C9497010C9497010C9497010C9497010C9497010C9497010C949701A0 +:2000A0000C9497010C9497010C94970100000000240027002A002D003000000000002500A1 +:2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D +:2000E0000202040302020202060606060606040402020204040802011040804010204080A8 +:200100004080080204018040201002011080102040400000000200080E0000030401000BB2 +:2001200000000000070605040100080A0B0C0D09040309042203410072006400750069003B +:200140006E006F0020004C0065006F006E006100720064006F0018034100720064007500C7 +:2001600069006E006F0020004C004C0043001201000200000040412334000001010200014C +:2001800012010002020000404123340000010102000100C18081C1080B00020202010009C5 +:2001A0000400000102020000052400100105240101010424020605240600010705810310D0 +:2001C000004009040100020A000000070502024000000705830240000005010902A10109E8 +:2001E00001A1008501050919012903150025019503750181029501750581030501093009DB +:200200003109381581257F750895038106C0C005010906A1018502050719E029E715002589 +:200220000175019508810295017508810395067508150025650507190029658100C00904D8 +:20024000020001030000000921010100012265000705840340000100000000000000002AE6 +:200260002B280000000000000000000000000000000000000000002C9EB4A0A1A2A434A64C +:20028000A7A5AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B25 +:2002A0008C8D8E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B7C +:2002C0000C0D0E0F101112131415161718191A1B1C1DAFB1B0B5000058041C07F00711243D +:2002E0001FBECFEFDAE0DEBFCDBF11E0A0E0B1E0EAE9F1E102C005900D92A632B107D9F783 +:2003000011E0A6E2B1E001C01D92A139B107E1F712E0CEEDD2E004C02297FE010E94C708AD +:20032000C83DD107C9F70E9479030C94CB080C9400008DE061E00E94460368EE73E080E04D +:2003400090E00E94FB018DE060E00E94460368EE73E080E090E00E94FB0108958DE061E095 +:200360000E94C20208951F920F920FB60F9211242F933F938F939F93AF93BF9380912A01D5 +:2003800090912B01A0912C01B0912D0130912E010196A11DB11D232F2D5F2D3720F02D575A +:2003A0000196A11DB11D20932E0180932A0190932B01A0932C01B0932D0180912601909181 +:2003C0002701A0912801B09129010196A11DB11D8093260190932701A0932801B0932901BF +:2003E000BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F89480910A +:20040000260190912701A0912801B091290166B5A89B05C06F3F19F00196A11DB11D7FBF6C +:20042000BA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC01FE +:200440002DC0FFB7F8948091260190912701A0912801B0912901E6B5A89B05C0EF3F19F04D +:200460000196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FB3 +:20048000BB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105A4 +:2004A0004105510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816060 +:2004C00085BDEEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E893 +:2004E000F0E0808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0A9 +:20050000808182608083808181608083E0E9F0E080818160808320EC30E0F9018081806893 +:20052000808380818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E080818460A0 +:200540008083808182608083808181608083E3ECF0E0808181608083F90180818260808369 +:200560008C9181608C93EAE7F0E08081846080838081826080838081816080838081806821 +:2005800080830895482F50E0CA018C509F4FFC0124914A525F4FFA0184918823C1F0E82F00 +:2005A000F0E0EE0FFF1FE455FF4FA591B491662341F49FB7F8948C91209582238C939FBFBA +:2005C00008959FB7F8948C91822B8C939FBF08958730C1F1883080F48330F9F0843030F4AF +:2005E000813029F1823009F050C024C08430C9F0863009F04AC022C08A3091F18B3030F46E +:20060000883031F1893009F040C026C08C3091F18C3060F18E30C9F533C0809180008F7717 +:2006200003C0809180008F7D80938000089584B58F7702C084B58F7D84BD08958091B00045 +:200640008F7703C08091B0008F7D8093B0000895809190008F7707C0809190008F7D03C0C6 +:2006600080919000877F8093900008958091C0008F7703C08091C0008F7D8093C0000895AC +:200680008091C200877F8093C2000895FF920F931F93F62E482F50E0CA018E5E9E4FFC01BE +:2006A0002491CA018C509F4FFC0114914A525F4FFA0104910023C9F0222319F0822F0E94F7 +:2006C000E802E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F48C9110958123B7 +:2006E00002C08C91812B8C939FBF1F910F91FF900895CF93DF930E94540287E391E00E942D +:200700003F040E94AE01C0E0D0E00E9499012097E1F30E940000F9CF282F8091310188237F +:20072000C1F057FF1AC015C02898909330018091F1008193E217F307B9F74115510539F061 +:200740008091F200882319F48BE68093E800AFBF02C04FEF5FEFCA010895AFB7F8942770C5 +:200760002093E9008091F200282F30E0241735070CF4A901FB019B01240F311D94E6DACF16 +:20078000DF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E948C03019719F02FEF3FEF01 +:2007A00003C08981282F30E0C9010F90CF91DF910895FF920F931F93F82E142F052F4091DC +:2007C000340150913501212F302FC901DC01FB016EEF29C0F7FE02C0949101C090812091D6 +:2007E00032013091330124173507ACF48091E8008570E1F38091E80082FF03C02FEF3FEF6F +:2008000017C09093F100C90101968F739070892B11F46093E8002F5F3F4F30933301209330 +:200820003201119731961097A9F6812F902F9C01C9011F910F91FF9008959C018091E800E8 +:2008400082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289884E680933001CD +:200860008BEF8093E800CB0108958093E9008091F200882319F08AE38093E8000895109240 +:20088000310181E08093D70080EA8093D80082E189BD09B400FEFDCF80E98093D8008CE096 +:2008A0008093E2001092E000559A209A0895089508955F926F927F928F929F92AF92BF925A +:2008C000CF92DF92EF92FF920F931F93CF93DF93E82E842E752E80913101882371F18B01C5 +:2008E000242F352FC901EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12C80 +:20090000A822B9223AE3632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E800B0 +:2009200085FD02C020E004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC02B +:2009400061E070E080E090E00E94FB013BC0822F90E0C817D9070CF42C2FC21BD1094FB7A5 +:20096000F8949092E900A114B10421F406C01092F10021502223D9F719C0E7FC03C0F8010A +:20098000922F10C0C801322F06C0FC010196E491E093F10031503323C1F706C081918093EF +:2009A000F10091509923D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092EF +:2009C000E8004FBF209709F0A5CF5D9884E680932F01282D372DC9019C01C901DF91CF91A1 +:2009E0001F910F91FF90EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F9203 +:200A00000FB60F9211241F932F933F934F935F936F937F938F939F93AF93BF93EF93FF9311 +:200A20008091E1001092E100982F83FF0FC01092E90081E08093EB001092EC0082E3809339 +:200A4000ED001092310188E08093F00092FF36C083E08093E9008091F200882349F08AE330 +:200A60008093E80005C08CE791E00E945F0701C012E09FB7F8941093E9008091F2009FBF48 +:200A8000882389F780912F01882351F080912F01815080932F0180912F01882309F45D9AC9 +:200AA00080913001882351F08091300181508093300180913001882309F4289AFF91EF91F5 +:200AC000BF91AF919F918F917F916F915F914F913F912F911F910F900FBE0F901F901895AF +:200AE0000F931F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8010E947E07C8010E94B3 +:200B00008F08898190E00F90CF91DF911F910F9108951F920F920FB60F921124EF92FF9269 +:200B20001F932F933F934F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB733 +:200B4000DEB76197DEBFCDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C0CD +:200B60008091F1008193E217F307D1F7289884E68093300182EF8093E800998197FF05C055 +:200B80008091E80080FFFCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C080 +:200BA0008A81882329F41092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F433 +:200BC0008091E80080FFFCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230AE +:200BE000C1F51092E900109233011092320110923501109234010E94700599E0FE013996FC +:200C0000DF01292F1D922A95E9F799871A8791E09E8790E8988B9AEF998B2091320130910A +:200C20003301275F3F4F3C872B878D871092E9001092330110923201F0923501E09234014E +:200C400080E0BF0149E050E00E94D9030E94700585C01092E9001092330110923201F09289 +:200C60003501E0923401123241F482E290E00E948708892B09F476C071C0113079F488E0EB +:200C8000E816F10419F481E08093360180913601882309F06BC0EEE6F1E013C0133009F0DE +:200CA00061C08B81882319F4E0E3F1E00AC0823019F4E4E3F1E005C0813009F053C0E6E54D +:200CC000F1E0449180E8BF0150E00E94D90346C0873009F447C0883021F481E08093F100A5 +:200CE0003DC08930D9F523703070232BD9F5E3E9F1E091E031E026E39093E9003093EB003F +:200D000084918093EC002093ED009F5F3196953099F78EE78093EA001092EA008B818093E8 +:200D200031011CC08F8198851092E900109233011092320190933501809334018D818823E8 +:200D400029F4CE0101960E94920706C0823051F4CE0101960E94D407882321F08EEF8093E9 +:200D6000E80007C081E28093EB0003C0E0E8F1E0A8CF6196DEBFCDBFCF91DF91FF91EF9190 +:200D8000BF91AF919F918F917F916F915F914F913F912F911F91FF90EF900F900FBE0F903A +:200DA0001F901895209178013091790180917A0190917B01281B390B2F733070C901089519 +:200DC000209178013091790180917A0190917B012817390719F42FEF3FEF09C0E0917A01F8 +:200DE000F0917B01E85CFE4F8081282F30E0C9010895209178013091790180917A01909184 +:200E00007B012817390719F42FEF3FEF13C0E0917A01F0917B01E85CFE4F208180917A0104 +:200E200090917B0101968F73907090937B0180937A0130E0C901089510927F0110927E0195 +:200E400088EE93E0A0E0B0E08093800190938101A0938201B09383018EE091E090937D0163 +:200E600080937C0108950F931F93DF93CF930F92CDB7DEB78C01698380910701882369F0CD +:200E800083E0BE016F5F7F4F41E050E00E9459041816190614F49C0107C081E090E0F801C1 +:200EA0009383828320E030E0C9010F90CF91DF911F910F91089583E00E943504089582E0A4 +:200EC0000E94C003482F20917801309179012F5F3F4F2F73307080917A0190917B0128170B +:200EE000390759F0E0917801F0917901E85CFE4F408330937901209378010895FC0180812C +:200F00008E5F808380E867E971E042E450E00E94D903089587E391E00E945704F8940C9463 +:200F2000003C0895CF93DF93EC0189819881913A51F4813269F580E060E071E047E050E08B +:200F40000E94D90323C0913219F5803239F480E091E067E070E00E941D0418C08232C1F414 +:200F600080910701882379F08091000190910101A0910201B0910301805B9440A040B04017 +:200F800011F40E948A078A818093070181E001C080E0DF91CF910895DC01ED91FC91048098 +:200FA000F581E02D09950895FC0191818081813A31F4913089F080E0933089F40DC0813229 +:200FC00069F49B3021F482818093080105C09A3029F482818093090181E0089580E00895EE +:200FE00010928A0110928E0110928D0180E291E090938C0180938B011092900110928F01DC +:201000000895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0184E0BE016F5F3B +:201020007F4F41E050E00E94590484E4B801A7010E9459040F90CF91DF911F910F91FF907C +:20104000EF90089582E048E050E00E9401080895EF92FF920F931F93DF93CF93CDB7DEB71F +:2010600028970FB6F894DEBF0FBECDBF7C019E012F5F3F4F88E0F90111928A95E9F7F70136 +:20108000A481B581109759F0ED91FC9111970190F081E02DCD0170E0A901099518C067FDA1 +:2010A00007C0E62FF0E0E95AFD4F6491662341F481E090E0F7019383828320E030E019C075 +:2010C00067FF04C08981826089836F776B83C7018E010F5F1F4FB8010E94220888E0F80101 +:2010E00011928A95E9F7C701B8010E94220821E030E0C90128960FB6F894DEBF0FBECDBF21 +:20110000CF91DF911F910F91FF90EF90089580E869ED71E045E650E00E94D9030895FC0182 +:2011200080818F5F808380E86EE372E049E150E00E94D9030895CF92DF92EF92FF920F93B7 +:201140001F93CF93DF937C016B018A01C0E0D0E00FC0D6016D916D01D701ED91FC910190BF +:20116000F081E02DC7010995C80FD91F015010400115110571F7CE01DF91CF911F910F9198 +:20118000FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994F894FFCF00E100000000BC +:2011A000000001010000000033079B08D206F906E0065B075F0700000000CC079B08280825 +:2011C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2011E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:20120000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:20122000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20124000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20126000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20128000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:2012A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:2012C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:20700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20702000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20704000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:20706000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:20708000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2070A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:2070C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:2070E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20710000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20712000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20714000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:20716000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:20718000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2071A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:2071C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:2071E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20720000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20722000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20724000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:20726000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:20728000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2072A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:2072C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:2072E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20730000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20732000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20734000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:20736000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:20738000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2073A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:2073C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:2073E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20740000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20742000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20744000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:20746000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:20748000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2074A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:2074C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:2074E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20750000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20752000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20754000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:20756000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:20758000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2075A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:2075C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:2075E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20760000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20762000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20764000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:20766000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:20768000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2076A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:2076C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:2076E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20770000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20772000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20774000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:20776000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:20778000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2077A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:2077C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:2077E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:2078000011241FBECFEFDAE0DEBFCDBFFFC0410142144505560455026403740300001E95D2 +:2078200087020110030000C18081C106C0FF0A000CA10185037508150026FF00954009018D +:207840008102954009029102C0040309041A03300030003000300030003000300030003190 +:20786000003700300031003803410072006400750069006E006F0020004C0065006F006EB5 +:20788000006100720064006F00200062006F006F0074006C006F00610064006500720018DF +:2078A00003410072006400750069006E006F0020004C004C00430012010002020000404160 +:2078C0002334000001000203011201000200000040412334000001000203010902640003E4 +:2078E00001008032080B00020202010009040000010202000005240010010524010101043F +:2079000024020205240600010705810310004009040100020A0000000705020240000007BE +:20792000058302400000090402000103000000092101010001221E000705840340004000EA +:2079400020918A0130918B012C5F3F4F30938B0120938A01C901892F99278695982F803420 +:2079600018F08FE7891B982F990F921710F447980895479A08955D9A289A81E08093E000C2 +:207980001092E200EE27FF27099408950F931F93CF93DF93982FEB01042F10E088E76030F1 +:2079A000780730F411E083E0FB0180935700E895892F68E071E0402FF8D0112311F107B672 +:2079C00000FCFDCF402F4695FE01A8E0B1E020E031E009C08D919D910C0130935700E895B3 +:2079E000112432962F5F2417A8F385E0FE0180935700E89507B600FCFDCF81E1809357008A +:207A0000E895DF91CF911F910F91089588E10FB6F89480936000109260000FBE5D9A289A77 +:207A200047983F9A209A559A90E8909361001092610081E885BF95BF9FD084E18093880175 +:207A400080E180938901E0E0F0E0859194918F5F9F4F19F081E080938F01EE24FF24BB2460 +:207A6000B39454EFC52E51E0D52E13D2082F8EE098E7FC012491319602964491201711F02E +:207A80002223B9F7109291011092900182E068E071E08BD0013479F460910801605863304D +:207AA00028F0683111F064E001C063E0C62FD0E0CF5DD7480EC0063571F4809108018033A1 +:207AC00011F011E022C080910A01C82FD0E0C25ED74811E022C0053721F413E0CEE1D8E74B +:207AE0001CC0053539F4E0900801F0900901EE0CFF1C0AC0043631F482E0B701409109010D +:207B000045DF02C0043721F010E0C5E2D8E705C010910901E701E10EF11CBBD18097B1F441 +:207B200083E068E871E041E050E059D0112329F0412F50E083E8BE0152D083E469E871E085 +:207B400041E050E04CD0013509F08FCFD0929101C0929001B0928F01EE24FF2486CFFC01FB +:207B6000289884E680938D0104C08091F100819361506623D1F7089510929101109290015A +:207B800010928E0110928F0181E08093D70080EA8093D80082E189BD09B400FEFDCF80E949 +:207BA0008093D8001092E0000895FB018093E90024E69BE611C08091E80085FFFCCF28985F +:207BC00020938D018091F10081938091E80085FD02C09093E8004150442369F70895982F4A +:207BE000FB01282F207287708093E90064E63AE317C08091E80085FFFCCF97FF02C08491BA +:207C000001C080813196211180E05D9860938C018093F1008091E80085FD02C03093E800E8 +:207C2000415050408FEF4F3F580719F796FF03C08AE38093E800089580919301813299F466 +:207C40005D9884E680938C0120E030E003C080818093F100F901E050FF4F2F5F3F4F283061 +:207C60003105A9F714C0803261F48091E80082FFFCCF80E091E067E072DF8BEF8093E80030 +:207C800006C0823221F4809194018093070181E0089520919501223289F1213081F48091AA +:207CA000980190919901089711F420939A0180919A01882309F04FC0E9ECF8E74EC022300B +:207CC00021F484E6EBEDF8E71CC0233009F041C080919401882319F4E9E4F8E73EC082308B +:207CE00019F4E7E6F8E739C0833019F4EDE4F8E734C0813071F5EFE9F8E72FC081E0EBE283 +:207D0000F8E790919801382F981708F4392F90918C0120E04EEF8091E8008570E1F3809192 +:207D2000E80082FD12C02F5F84915D988093F100822F8F7311F44093E800319694E6231780 +:207D400050F390938C0181E0089590938C0180E0089580E00895E7EBF8E78491D2CF10927F +:207D6000E9008091E80083FF61C082E991E068E0F6DE82EF8093E8008091920187FF05C02B +:207D80008091E80080FFFCCF03C08EEF8093E80080919301853051F48091E80080FFFCCF83 +:207DA0008091940180688093E30039C08930E1F48091940180938E01E7E2F8E791E031E046 +:207DC00026E39093E9003093EB0084918093EC002093ED009F5F3196953099F78EE780938A +:207DE000EA001092EA001BC0883049F490918E015D9884E680938C019093F10010C08823FF +:207E000039F45D9884E680938C011092F10007C0863011F43EDF01C00FDF882321F08EEF1C +:207E20008093E800089581E28093EB0008958091E1001092E100282F83FF0CC01092E90007 +:207E400081E08093EB001092EC0082E38093ED0010928E0122FF1CC080918C01882331F038 +:207E6000815080938C01882309F45D9A80918D01882331F0815080938D01882309F4289AAB +:207E800080918F01882321F4109291011092900108951F93CF93DF9312E0C0E9D1E05FDF6D +:207EA000C6DF1093E9008091E80085FF13C0289884E680938D019091F1008091E80085FDE9 +:207EC00003C08BE68093E800892F90E0DF91CF911F9108958091900190919101019790931E +:207EE0009101809390018091900190919101892B09F441DDCE010197F1F722DDD0CF00E15A +:067F00000000000000007B +:00000001FF -- cgit v1.2.3-18-g5258 From 28e9e122af24e63e84d5bcd2c619b76c490970fc Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sat, 31 Dec 2011 12:19:08 -0500 Subject: reset the Leonardo board when leaving the bootloader, before starting the sketch Done so all IO and other registers are properly reinitialized when a new sketch is uploaded or when an existing sketch is started. Uses a watchdog timeout with a 15 ms period to accomplish the reset. Bootloader checks the reason for reset and only enumerates as bootloader and enters the programming loop if reset was NOT caused by WDT. --- bootloaders/diskloader/DiskLoader-Leonardo.hex | 371 +++++++++++++------------ bootloaders/diskloader/src/DiskLoader.cpp | 18 +- bootloaders/diskloader/src/USBCore.cpp | 4 +- 3 files changed, 203 insertions(+), 190 deletions(-) diff --git a/bootloaders/diskloader/DiskLoader-Leonardo.hex b/bootloaders/diskloader/DiskLoader-Leonardo.hex index e14aa31..74f18d0 100644 --- a/bootloaders/diskloader/DiskLoader-Leonardo.hex +++ b/bootloaders/diskloader/DiskLoader-Leonardo.hex @@ -1,145 +1,145 @@ -:200000000C946F010C9497010C9497010C9497010C9497010C9497010C9497010C94970148 -:200020000C9497010C9497010C94FE040C9489050C9497010C9497010C9497010C949701A0 -:200040000C9497010C9497010C9497010C9497010C9497010C9497010C9497010C94B301C4 -:200060000C9497010C9497010C9497010C9497010C9497010C9497010C9497010C949701C0 -:200080000C9497010C9497010C9497010C9497010C9497010C9497010C9497010C949701A0 -:2000A0000C9497010C9497010C94970100000000240027002A002D003000000000002500A1 +:200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 +:200020000C9496010C9496010C94FD040C9488050C9496010C9496010C9496010C949601A8 +:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B201CC +:200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 +:200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 +:2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 :2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D :2000E0000202040302020202060606060606040402020204040802011040804010204080A8 :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 -:2001200000000000070605040100080A0B0C0D09040309042203410072006400750069003B -:200140006E006F0020004C0065006F006E006100720064006F0018034100720064007500C7 -:2001600069006E006F0020004C004C0043001201000200000040412334000001010200014C -:2001800012010002020000404123340000010102000100C18081C1080B00020202010009C5 -:2001A0000400000102020000052400100105240101010424020605240600010705810310D0 -:2001C000004009040100020A000000070502024000000705830240000005010902A10109E8 -:2001E00001A1008501050919012903150025019503750181029501750581030501093009DB -:200200003109381581257F750895038106C0C005010906A1018502050719E029E715002589 -:200220000175019508810295017508810395067508150025650507190029658100C00904D8 -:20024000020001030000000921010100012265000705840340000100000000000000002AE6 -:200260002B280000000000000000000000000000000000000000002C9EB4A0A1A2A434A64C -:20028000A7A5AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B25 -:2002A0008C8D8E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B7C -:2002C0000C0D0E0F101112131415161718191A1B1C1DAFB1B0B5000058041C07F00711243D -:2002E0001FBECFEFDAE0DEBFCDBF11E0A0E0B1E0EAE9F1E102C005900D92A632B107D9F783 -:2003000011E0A6E2B1E001C01D92A139B107E1F712E0CEEDD2E004C02297FE010E94C708AD -:20032000C83DD107C9F70E9479030C94CB080C9400008DE061E00E94460368EE73E080E04D -:2003400090E00E94FB018DE060E00E94460368EE73E080E090E00E94FB0108958DE061E095 -:200360000E94C20208951F920F920FB60F9211242F933F938F939F93AF93BF9380912A01D5 -:2003800090912B01A0912C01B0912D0130912E010196A11DB11D232F2D5F2D3720F02D575A -:2003A0000196A11DB11D20932E0180932A0190932B01A0932C01B0932D0180912601909181 -:2003C0002701A0912801B09129010196A11DB11D8093260190932701A0932801B0932901BF -:2003E000BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F89480910A -:20040000260190912701A0912801B091290166B5A89B05C06F3F19F00196A11DB11D7FBF6C -:20042000BA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC01FE -:200440002DC0FFB7F8948091260190912701A0912801B0912901E6B5A89B05C0EF3F19F04D -:200460000196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FB3 -:20048000BB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105A4 -:2004A0004105510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816060 -:2004C00085BDEEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E893 -:2004E000F0E0808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0A9 -:20050000808182608083808181608083E0E9F0E080818160808320EC30E0F9018081806893 -:20052000808380818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E080818460A0 -:200540008083808182608083808181608083E3ECF0E0808181608083F90180818260808369 -:200560008C9181608C93EAE7F0E08081846080838081826080838081816080838081806821 -:2005800080830895482F50E0CA018C509F4FFC0124914A525F4FFA0184918823C1F0E82F00 -:2005A000F0E0EE0FFF1FE455FF4FA591B491662341F49FB7F8948C91209582238C939FBFBA -:2005C00008959FB7F8948C91822B8C939FBF08958730C1F1883080F48330F9F0843030F4AF -:2005E000813029F1823009F050C024C08430C9F0863009F04AC022C08A3091F18B3030F46E -:20060000883031F1893009F040C026C08C3091F18C3060F18E30C9F533C0809180008F7717 -:2006200003C0809180008F7D80938000089584B58F7702C084B58F7D84BD08958091B00045 -:200640008F7703C08091B0008F7D8093B0000895809190008F7707C0809190008F7D03C0C6 -:2006600080919000877F8093900008958091C0008F7703C08091C0008F7D8093C0000895AC -:200680008091C200877F8093C2000895FF920F931F93F62E482F50E0CA018E5E9E4FFC01BE -:2006A0002491CA018C509F4FFC0114914A525F4FFA0104910023C9F0222319F0822F0E94F7 -:2006C000E802E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F48C9110958123B7 -:2006E00002C08C91812B8C939FBF1F910F91FF900895CF93DF930E94540287E391E00E942D -:200700003F040E94AE01C0E0D0E00E9499012097E1F30E940000F9CF282F8091310188237F -:20072000C1F057FF1AC015C02898909330018091F1008193E217F307B9F74115510539F061 -:200740008091F200882319F48BE68093E800AFBF02C04FEF5FEFCA010895AFB7F8942770C5 -:200760002093E9008091F200282F30E0241735070CF4A901FB019B01240F311D94E6DACF16 -:20078000DF93CF930F92CDB7DEB7BE016F5F7F4F41E050E00E948C03019719F02FEF3FEF01 -:2007A00003C08981282F30E0C9010F90CF91DF910895FF920F931F93F82E142F052F4091DC -:2007C000340150913501212F302FC901DC01FB016EEF29C0F7FE02C0949101C090812091D6 -:2007E00032013091330124173507ACF48091E8008570E1F38091E80082FF03C02FEF3FEF6F -:2008000017C09093F100C90101968F739070892B11F46093E8002F5F3F4F30933301209330 -:200820003201119731961097A9F6812F902F9C01C9011F910F91FF9008959C018091E800E8 -:2008400082FFFCCFF901260F311D03C08091F1008193E217F307D1F7289884E680933001CD -:200860008BEF8093E800CB0108958093E9008091F200882319F08AE38093E8000895109240 -:20088000310181E08093D70080EA8093D80082E189BD09B400FEFDCF80E98093D8008CE096 -:2008A0008093E2001092E000559A209A0895089508955F926F927F928F929F92AF92BF925A -:2008C000CF92DF92EF92FF920F931F93CF93DF93E82E842E752E80913101882371F18B01C5 -:2008E000242F352FC901EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12C80 -:20090000A822B9223AE3632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E800B0 -:2009200085FD02C020E004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC02B -:2009400061E070E080E090E00E94FB013BC0822F90E0C817D9070CF42C2FC21BD1094FB7A5 -:20096000F8949092E900A114B10421F406C01092F10021502223D9F719C0E7FC03C0F8010A -:20098000922F10C0C801322F06C0FC010196E491E093F10031503323C1F706C081918093EF -:2009A000F10091509923D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092EF -:2009C000E8004FBF209709F0A5CF5D9884E680932F01282D372DC9019C01C901DF91CF91A1 -:2009E0001F910F91FF90EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F9203 -:200A00000FB60F9211241F932F933F934F935F936F937F938F939F93AF93BF93EF93FF9311 -:200A20008091E1001092E100982F83FF0FC01092E90081E08093EB001092EC0082E3809339 -:200A4000ED001092310188E08093F00092FF36C083E08093E9008091F200882349F08AE330 -:200A60008093E80005C08CE791E00E945F0701C012E09FB7F8941093E9008091F2009FBF48 -:200A8000882389F780912F01882351F080912F01815080932F0180912F01882309F45D9AC9 -:200AA00080913001882351F08091300181508093300180913001882309F4289AFF91EF91F5 -:200AC000BF91AF919F918F917F916F915F914F913F912F911F910F900FBE0F901F901895AF -:200AE0000F931F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8010E947E07C8010E94B3 -:200B00008F08898190E00F90CF91DF911F910F9108951F920F920FB60F921124EF92FF9269 -:200B20001F932F933F934F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB733 -:200B4000DEB76197DEBFCDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C0CD -:200B60008091F1008193E217F307D1F7289884E68093300182EF8093E800998197FF05C055 -:200B80008091E80080FFFCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C080 -:200BA0008A81882329F41092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F433 -:200BC0008091E80080FFFCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230AE -:200BE000C1F51092E900109233011092320110923501109234010E94700599E0FE013996FC -:200C0000DF01292F1D922A95E9F799871A8791E09E8790E8988B9AEF998B2091320130910A -:200C20003301275F3F4F3C872B878D871092E9001092330110923201F0923501E09234014E -:200C400080E0BF0149E050E00E94D9030E94700585C01092E9001092330110923201F09289 -:200C60003501E0923401123241F482E290E00E948708892B09F476C071C0113079F488E0EB -:200C8000E816F10419F481E08093360180913601882309F06BC0EEE6F1E013C0133009F0DE -:200CA00061C08B81882319F4E0E3F1E00AC0823019F4E4E3F1E005C0813009F053C0E6E54D -:200CC000F1E0449180E8BF0150E00E94D90346C0873009F447C0883021F481E08093F100A5 -:200CE0003DC08930D9F523703070232BD9F5E3E9F1E091E031E026E39093E9003093EB003F -:200D000084918093EC002093ED009F5F3196953099F78EE78093EA001092EA008B818093E8 -:200D200031011CC08F8198851092E900109233011092320190933501809334018D818823E8 -:200D400029F4CE0101960E94920706C0823051F4CE0101960E94D407882321F08EEF8093E9 -:200D6000E80007C081E28093EB0003C0E0E8F1E0A8CF6196DEBFCDBFCF91DF91FF91EF9190 -:200D8000BF91AF919F918F917F916F915F914F913F912F911F91FF90EF900F900FBE0F903A -:200DA0001F901895209178013091790180917A0190917B01281B390B2F733070C901089519 -:200DC000209178013091790180917A0190917B012817390719F42FEF3FEF09C0E0917A01F8 -:200DE000F0917B01E85CFE4F8081282F30E0C9010895209178013091790180917A01909184 -:200E00007B012817390719F42FEF3FEF13C0E0917A01F0917B01E85CFE4F208180917A0104 -:200E200090917B0101968F73907090937B0180937A0130E0C901089510927F0110927E0195 -:200E400088EE93E0A0E0B0E08093800190938101A0938201B09383018EE091E090937D0163 -:200E600080937C0108950F931F93DF93CF930F92CDB7DEB78C01698380910701882369F0CD -:200E800083E0BE016F5F7F4F41E050E00E9459041816190614F49C0107C081E090E0F801C1 -:200EA0009383828320E030E0C9010F90CF91DF911F910F91089583E00E943504089582E0A4 -:200EC0000E94C003482F20917801309179012F5F3F4F2F73307080917A0190917B0128170B -:200EE000390759F0E0917801F0917901E85CFE4F408330937901209378010895FC0180812C -:200F00008E5F808380E867E971E042E450E00E94D903089587E391E00E945704F8940C9463 -:200F2000003C0895CF93DF93EC0189819881913A51F4813269F580E060E071E047E050E08B -:200F40000E94D90323C0913219F5803239F480E091E067E070E00E941D0418C08232C1F414 -:200F600080910701882379F08091000190910101A0910201B0910301805B9440A040B04017 -:200F800011F40E948A078A818093070181E001C080E0DF91CF910895DC01ED91FC91048098 -:200FA000F581E02D09950895FC0191818081813A31F4913089F080E0933089F40DC0813229 -:200FC00069F49B3021F482818093080105C09A3029F482818093090181E0089580E00895EE -:200FE00010928A0110928E0110928D0180E291E090938C0180938B011092900110928F01DC -:201000000895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0184E0BE016F5F3B -:201020007F4F41E050E00E94590484E4B801A7010E9459040F90CF91DF911F910F91FF907C -:20104000EF90089582E048E050E00E9401080895EF92FF920F931F93DF93CF93CDB7DEB71F -:2010600028970FB6F894DEBF0FBECDBF7C019E012F5F3F4F88E0F90111928A95E9F7F70136 -:20108000A481B581109759F0ED91FC9111970190F081E02DCD0170E0A901099518C067FDA1 -:2010A00007C0E62FF0E0E95AFD4F6491662341F481E090E0F7019383828320E030E019C075 -:2010C00067FF04C08981826089836F776B83C7018E010F5F1F4FB8010E94220888E0F80101 -:2010E00011928A95E9F7C701B8010E94220821E030E0C90128960FB6F894DEBF0FBECDBF21 -:20110000CF91DF911F910F91FF90EF90089580E869ED71E045E650E00E94D9030895FC0182 -:2011200080818F5F808380E86EE372E049E150E00E94D9030895CF92DF92EF92FF920F93B7 -:201140001F93CF93DF937C016B018A01C0E0D0E00FC0D6016D916D01D701ED91FC910190BF -:20116000F081E02DC7010995C80FD91F015010400115110571F7CE01DF91CF911F910F9198 -:20118000FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994F894FFCF00E100000000BC -:2011A000000001010000000033079B08D206F906E0065B075F0700000000CC079B08280825 +:200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD +:200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC +:200160006E006F0020004C004C0043001201000200000040412334000001010200011201A2 +:200180000002020000404123340000010102000100C18081C1080B000202020100090400D4 +:2001A000000102020000052400100105240101010424020605240600010705810310004094 +:2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 +:2001E000008501050919012903150025019503750181029501750581030501093009310943 +:20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D +:20022000019508810295017508810395067508150025650507190029658100C0090402004C +:2002400001030000000921010100012265000705840340000100000000000000002A2B2895 +:200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 +:20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 +:2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C +:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000057041B07EF0711241FBE7C +:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E8E9F1E102C005900D92A632B107D9F711E071 +:20030000A6E2B1E001C01D92A139B107E1F712E0CCEDD2E004C02297FE010E94C608C63D9E +:20032000D107C9F70E9478030C94CA080C9400008DE061E00E94450368EE73E080E090E0E5 +:200340000E94FA018DE060E00E94450368EE73E080E090E00E94FA0108958DE061E00E9466 +:20036000C10208951F920F920FB60F9211242F933F938F939F93AF93BF9380912A01909157 +:200380002B01A0912C01B0912D0130912E010196A11DB11D232F2D5F2D3720F02D570196E4 +:2003A000A11DB11D20932E0180932A0190932B01A0932C01B0932D018091260190912701F0 +:2003C000A0912801B09129010196A11DB11D8093260190932701A0932801B0932901BF9197 +:2003E000AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F8948091260133 +:2004000090912701A0912801B091290166B5A89B05C06F3F19F00196A11DB11D7FBFBA2FAA +:20042000A92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC012DC0FA +:20044000FFB7F8948091260190912701A0912801B0912901E6B5A89B05C0EF3F19F00196A3 +:20046000A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FBB1F70 +:20048000EA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105410538 +:2004A000510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816085BD64 +:2004C000EEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F0E005 +:2004E000808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0808178 +:2005000082608083808181608083E0E9F0E080818160808320EC30E0F90180818068808391 +:2005200080818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E0808184608083A0 +:20054000808182608083808181608083E3ECF0E0808181608083F9018081826080838C914F +:2005600081608C93EAE7F0E08081846080838081826080838081816080838081806880833B +:200580000895482F50E0CA018C509F4FFC0124914A525F4FFA0184918823C1F0E82FF0E033 +:2005A000EE0FFF1FE455FF4FA591B491662341F49FB7F8948C91209582238C939FBF0895ED +:2005C0009FB7F8948C91822B8C939FBF08958730C1F1883080F48330F9F0843030F481309B +:2005E00029F1823009F050C024C08430C9F0863009F04AC022C08A3091F18B3030F4883067 +:2006000031F1893009F040C026C08C3091F18C3060F18E30C9F533C0809180008F7703C00C +:20062000809180008F7D80938000089584B58F7702C084B58F7D84BD08958091B0008F7702 +:2006400003C08091B0008F7D8093B0000895809190008F7707C0809190008F7D03C08091BB +:200660009000877F8093900008958091C0008F7703C08091C0008F7D8093C00008958091AC +:20068000C200877F8093C2000895FF920F931F93F62E482F50E0CA018E5E9E4FFC0124911A +:2006A000CA018C509F4FFC0114914A525F4FFA0104910023C9F0222319F0822F0E94E702C3 +:2006C000E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F48C911095812302C0DF +:2006E0008C91812B8C939FBF1F910F91FF900895CF93DF930E94530287E391E00E943E04AE +:200700000E94AD01C0E0D0E00E9498012097E1F30E940000F9CF282F809131018823C1F013 +:2007200057FF1AC015C02898909330018091F1008193E217F307B9F74115510539F0809101 +:20074000F200882319F48BE68093E800AFBF02C04FEF5FEFCA010895AFB7F8942770209323 +:20076000E9008091F200282F30E0241735070CF4A901FB019B01240F311D94E6DACFDF9357 +:20078000CF930F92CDB7DEB7BE016F5F7F4F41E050E00E948B03019719F02FEF3FEF03C0B1 +:2007A0008981282F30E0C9010F90CF91DF910895FF920F931F93F82E142F052F409134016A +:2007C00050913501212F302FC901DC01FB016EEF29C0F7FE02C0949101C0908120913201D8 +:2007E0003091330124173507ACF48091E8008570E1F38091E80082FF03C02FEF3FEF17C0CB +:200800009093F100C90101968F739070892B11F46093E8002F5F3F4F3093330120933201D4 +:20082000119731961097A9F6812F902F9C01C9011F910F91FF9008959C018091E80082FF9A +:20084000FCCFF901260F311D03C08091F1008193E217F307D1F7289884E6809330018BEFD4 +:200860008093E800CB0108958093E9008091F200882319F08AE38093E80008951092310188 +:2008800081E08093D70080EA8093D80082E189BD09B400FEFDCF80E98093D8008CE08093B5 +:2008A000E2001092E000559A209A0895089508955F926F927F928F929F92AF92BF92CF920C +:2008C000DF92EF92FF920F931F93CF93DF93E82E842E752E80913101882371F18B01242FD3 +:2008E000352FC901EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA82209 +:20090000B9223AE3632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FDF8 +:2009200002C020E004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E06C +:2009400070E080E090E00E94FA013BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8945B +:200960009092E900A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922FD5 +:2009800010C0C801322F06C0FC010196E491E093F10031503323C1F706C081918093F100BF +:2009A00091509923D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E800F8 +:2009C0004FBF209709F0A5CF5D9884E680932F01282D372DC9019C01C901DF91CF911F91D9 +:2009E0000F91FF90EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB6EE +:200A00000F9211241F932F933F934F935F936F937F938F939F93AF93BF93EF93FF938091C5 +:200A2000E1001092E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED005D +:200A40001092310188E08093F00092FF36C083E08093E9008091F200882349F08AE380930A +:200A6000E80005C08CE791E00E945E0701C012E09FB7F8941093E9008091F2009FBF8823B1 +:200A800089F780912F01882351F080912F01815080932F0180912F01882309F45D9A809163 +:200AA0003001882351F08091300181508093300180913001882309F4289AFF91EF91BF91B6 +:200AC000AF919F918F917F916F915F914F913F912F911F910F900FBE0F901F9018950F935D +:200AE0001F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8010E947D07C8010E948E08C0 +:200B0000898190E00F90CF91DF911F910F9108951F920F920FB60F921124EF92FF921F934E +:200B20002F933F934F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB750 +:200B40006197DEBFCDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C0809151 +:200B6000F1008193E217F307D1F7289884E68093300182EF8093E800998197FF05C0809155 +:200B8000E80080FFFCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C08A8186 +:200BA000882329F41092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F480912D +:200BC000E80080FFFCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230C1F509 +:200BE0001092E900109233011092320110923501109234010E946F0599E0FE013996DF01D3 +:200C0000292F1D922A95E9F799871A8791E09E8790E8988B9AEF998B2091320130913301B6 +:200C2000275F3F4F3C872B878D871092E9001092330110923201F0923501E092340180E022 +:200C4000BF0149E050E00E94D8030E946F0585C01092E9001092330110923201F0923501B5 +:200C6000E0923401123241F482E290E00E948608892B09F476C071C0113079F488E0E81624 +:200C8000F10419F481E08093360180913601882309F06BC0ECE6F1E013C0133009F061C0BD +:200CA0008B81882319F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F053C0E4E5F1E094 +:200CC000449180E8BF0150E00E94D80346C0873009F447C0883021F481E08093F1003DC07A +:200CE0008930D9F523703070232BD9F5E1E9F1E091E031E026E39093E9003093EB00849129 +:200D00008093EC002093ED009F5F3196953099F78EE78093EA001092EA008B8180933101CB +:200D20001CC08F8198851092E900109233011092320190933501809334018D81882329F4FD +:200D4000CE0101960E94910706C0823051F4CE0101960E94D307882321F08EEF8093E80020 +:200D600007C081E28093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF911B +:200D8000AF919F918F917F916F915F914F913F912F911F91FF90EF900F900FBE0F901F90DB +:200DA0001895209178013091790180917A0190917B01281B390B2F733070C9010895209117 +:200DC00078013091790180917A0190917B012817390719F42FEF3FEF09C0E0917A01F09128 +:200DE0007B01E85CFE4F8081282F30E0C9010895209178013091790180917A0190917B0189 +:200E00002817390719F42FEF3FEF13C0E0917A01F0917B01E85CFE4F208180917A0190915F +:200E20007B0101968F73907090937B0180937A0130E0C901089510927F0110927E0188EE40 +:200E400093E0A0E0B0E08093800190938101A0938201B09383018EE091E090937D018093C6 +:200E60007C0108950F931F93DF93CF930F92CDB7DEB78C01698380910701882369F083E07D +:200E8000BE016F5F7F4F41E050E00E9458041816190614F49C0107C081E090E0F80193830F +:200EA000828320E030E0C9010F90CF91DF911F910F91089583E00E943404089582E00E9419 +:200EC000BF03482F20917801309179012F5F3F4F2F73307080917A0190917B01281739076E +:200EE00059F0E0917801F0917901E85CFE4F408330937901209378010895FC0180818E5F7F +:200F0000808380E865E971E042E450E00E94D803089587E391E00E945604F8940C94003C18 +:200F20000895CF93DF93EC0189819881913A51F4813269F580E060E071E047E050E00E9425 +:200F4000D80323C0913219F5803239F480E091E067E070E00E941C0418C08232C1F48091A7 +:200F60000701882379F08091000190910101A0910201B0910301805B9440A040B04011F423 +:200F80000E9489078A818093070181E001C080E0DF91CF910895DC01ED91FC910480F58128 +:200FA000E02D09950895FC0191818081813A31F4913089F080E0933089F40DC0813269F442 +:200FC0009B3021F482818093080105C09A3029F482818093090181E0089580E008951092A9 +:200FE0008A0110928E0110928D0180E291E090938C0180938B011092900110928F010895E1 +:20100000EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0184E0BE016F5F7F4F0A +:2010200041E050E00E94580484E4B801A7010E9458040F90CF91DF911F910F91FF90EF90CD +:20104000089582E048E050E00E9400080895EF92FF920F931F93DF93CF93CDB7DEB72897E0 +:201060000FB6F894DEBF0FBECDBF7C019E012F5F3F4F88E0F90111928A95E9F7F701A481D0 +:20108000B581109759F0ED91FC9111970190F081E02DCD0170E0A901099518C067FD07C0FF +:2010A000E62FF0E0EB5AFD4F6491662341F481E090E0F7019383828320E030E019C067FFD4 +:2010C00004C08981826089836F776B83C7018E010F5F1F4FB8010E94210888E0F8011192C5 +:2010E0008A95E9F7C701B8010E94210821E030E0C90128960FB6F894DEBF0FBECDBFCF9165 +:20110000DF911F910F91FF90EF90089580E867ED71E045E650E00E94D8030895FC018081E4 +:201120008F5F808380E86CE372E049E150E00E94D8030895CF92DF92EF92FF920F931F9309 +:20114000CF93DF937C016B018A01C0E0D0E00FC0D6016D916D01D701ED91FC910190F08100 +:20116000E02DC7010995C80FD91F015010400115110571F7CE01DF91CF911F910F91FF907A +:20118000EF90DF90CF900895EE0FFF1F0590F491E02D0994F894FFCF00E10000000000004B +:2011A00001010000000032079A08D106F806DF065A075E0700000000CB079A082708FFFF31 :2011C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :2011E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :20120000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE @@ -958,7 +958,7 @@ :2077A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :2077C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :2077E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:2078000011241FBECFEFDAE0DEBFCDBFFFC0410142144505560455026403740300001E95D2 +:2078000011241FBECFEFDAE0DEBFCDBF0BC1410142144505560455026403740300001E95C5 :2078200087020110030000C18081C106C0FF0A000CA10185037508150026FF00954009018D :207840008102954009029102C0040309041A03300030003000300030003000300030003190 :20786000003700300031003803410072006400750069006E006F0020004C0065006F006EB5 @@ -970,49 +970,50 @@ :20792000058302400000090402000103000000092101010001221E000705840340004000EA :2079400020918A0130918B012C5F3F4F30938B0120938A01C901892F99278695982F803420 :2079600018F08FE7891B982F990F921710F447980895479A08955D9A289A81E08093E000C2 -:207980001092E200EE27FF27099408950F931F93CF93DF93982FEB01042F10E088E76030F1 -:2079A000780730F411E083E0FB0180935700E895892F68E071E0402FF8D0112311F107B672 -:2079C00000FCFDCF402F4695FE01A8E0B1E020E031E009C08D919D910C0130935700E895B3 -:2079E000112432962F5F2417A8F385E0FE0180935700E89507B600FCFDCF81E1809357008A -:207A0000E895DF91CF911F910F91089588E10FB6F89480936000109260000FBE5D9A289A77 -:207A200047983F9A209A559A90E8909361001092610081E885BF95BF9FD084E18093880175 -:207A400080E180938901E0E0F0E0859194918F5F9F4F19F081E080938F01EE24FF24BB2460 -:207A6000B39454EFC52E51E0D52E13D2082F8EE098E7FC012491319602964491201711F02E -:207A80002223B9F7109291011092900182E068E071E08BD0013479F460910801605863304D -:207AA00028F0683111F064E001C063E0C62FD0E0CF5DD7480EC0063571F4809108018033A1 -:207AC00011F011E022C080910A01C82FD0E0C25ED74811E022C0053721F413E0CEE1D8E74B -:207AE0001CC0053539F4E0900801F0900901EE0CFF1C0AC0043631F482E0B701409109010D -:207B000045DF02C0043721F010E0C5E2D8E705C010910901E701E10EF11CBBD18097B1F441 -:207B200083E068E871E041E050E059D0112329F0412F50E083E8BE0152D083E469E871E085 -:207B400041E050E04CD0013509F08FCFD0929101C0929001B0928F01EE24FF2486CFFC01FB -:207B6000289884E680938D0104C08091F100819361506623D1F7089510929101109290015A -:207B800010928E0110928F0181E08093D70080EA8093D80082E189BD09B400FEFDCF80E949 -:207BA0008093D8001092E0000895FB018093E90024E69BE611C08091E80085FFFCCF28985F -:207BC00020938D018091F10081938091E80085FD02C09093E8004150442369F70895982F4A -:207BE000FB01282F207287708093E90064E63AE317C08091E80085FFFCCF97FF02C08491BA -:207C000001C080813196211180E05D9860938C018093F1008091E80085FD02C03093E800E8 -:207C2000415050408FEF4F3F580719F796FF03C08AE38093E800089580919301813299F466 -:207C40005D9884E680938C0120E030E003C080818093F100F901E050FF4F2F5F3F4F283061 -:207C60003105A9F714C0803261F48091E80082FFFCCF80E091E067E072DF8BEF8093E80030 -:207C800006C0823221F4809194018093070181E0089520919501223289F1213081F48091AA -:207CA000980190919901089711F420939A0180919A01882309F04FC0E9ECF8E74EC022300B -:207CC00021F484E6EBEDF8E71CC0233009F041C080919401882319F4E9E4F8E73EC082308B -:207CE00019F4E7E6F8E739C0833019F4EDE4F8E734C0813071F5EFE9F8E72FC081E0EBE283 -:207D0000F8E790919801382F981708F4392F90918C0120E04EEF8091E8008570E1F3809192 -:207D2000E80082FD12C02F5F84915D988093F100822F8F7311F44093E800319694E6231780 -:207D400050F390938C0181E0089590938C0180E0089580E00895E7EBF8E78491D2CF10927F -:207D6000E9008091E80083FF61C082E991E068E0F6DE82EF8093E8008091920187FF05C02B -:207D80008091E80080FFFCCF03C08EEF8093E80080919301853051F48091E80080FFFCCF83 -:207DA0008091940180688093E30039C08930E1F48091940180938E01E7E2F8E791E031E046 -:207DC00026E39093E9003093EB0084918093EC002093ED009F5F3196953099F78EE780938A -:207DE000EA001092EA001BC0883049F490918E015D9884E680938C019093F10010C08823FF -:207E000039F45D9884E680938C011092F10007C0863011F43EDF01C00FDF882321F08EEF1C -:207E20008093E800089581E28093EB0008958091E1001092E100282F83FF0CC01092E90007 -:207E400081E08093EB001092EC0082E38093ED0010928E0122FF1CC080918C01882331F038 -:207E6000815080938C01882309F45D9A80918D01882331F0815080938D01882309F4289AAB -:207E800080918F01882321F4109291011092900108951F93CF93DF9312E0C0E9D1E05FDF6D -:207EA000C6DF1093E9008091E80085FF13C0289884E680938D019091F1008091E80085FDE9 -:207EC00003C08BE68093E800892F90E0DF91CF911F9108958091900190919101019790931E -:207EE0009101809390018091900190919101892B09F441DDCE010197F1F722DDD0CF00E15A -:067F00000000000000007B +:207980001092E200EE27FF270994089528E088E190E00FB6F894A895809360000FBE20938C +:2079A0006000FFCF0F931F93CF93DF93982FEB01042F10E088E76030780730F411E083E0A5 +:2079C000FB0180935700E895892F68E071E0402F06D1112311F107B600FCFDCF402F469528 +:2079E000FE01A8E0B1E020E031E009C08D919D910C0130935700E895112432962F5F2417DF +:207A0000A8F385E0FE0180935700E89507B600FCFDCF81E180935700E895DF91CF911F9132 +:207A20000F91089584B794B7977F94BF98E10FB6F89490936000109260000FBE5D9A289A45 +:207A4000479883FF08C0E0E0F0E0859194918F5F9F4F09F090DF3F9A209A559A90E89093D1 +:207A600061001092610081E885BF95BF9FD084E18093880180E180938901E0E0F0E085918D +:207A800094918F5F9F4F19F081E080938F01EE24FF24BB24B39454EFC52E51E0D52E13D22E +:207AA000082F8EE098E7FC012491319602964491201711F02223B9F7109291011092900128 +:207AC00082E068E071E08BD0013479F4609108016058633028F0683111F064E001C063E06F +:207AE000C62FD0E0CF5DD7480EC0063571F480910801803311F011E022C080910A01C82F74 +:207B0000D0E0C25ED74811E022C0053721F413E0CEE1D8E71CC0053539F4E0900801F090B5 +:207B20000901EE0CFF1C0AC0043631F482E0B7014091090137DF02C0043721F010E0C5E24D +:207B4000D8E705C010910901E701E10EF11CBBD18097B1F483E068E871E041E050E059D04C +:207B6000112329F0412F50E083E8BE0152D083E469E871E041E050E04CD0013509F08FCFC9 +:207B8000D0929101C0929001B0928F01EE24FF2486CFFC01289884E680938D0104C0809115 +:207BA000F100819361506623D1F70895109291011092900110928E0110928F0181E08093E3 +:207BC000D70080EA8093D80082E189BD09B400FEFDCF80E98093D8001092E0000895FB01DA +:207BE0008093E90024E69BE611C08091E80085FFFCCF289820938D018091F10081938091BD +:207C0000E80085FD02C09093E8004150442369F70895982FFB01282F207287708093E90099 +:207C200064E63AE317C08091E80085FFFCCF97FF02C0849101C080813196211180E05D9841 +:207C400060938C018093F1008091E80085FD02C03093E800415050408FEF4F3F580719F71C +:207C600096FF03C08AE38093E800089580919301813299F45D9884E680938C0120E030E0B3 +:207C800003C080818093F100F901E050FF4F2F5F3F4F28303105A9F714C0803261F480916E +:207CA000E80082FFFCCF80E091E067E072DF8BEF8093E80006C0823221F48091940180936A +:207CC000070181E0089520919501223289F1213081F48091980190919901089711F4209307 +:207CE0009A0180919A01882309F04FC0E9ECF8E74EC0223021F484E6EBEDF8E71CC0233011 +:207D000009F041C080919401882319F4E9E4F8E73EC0823019F4E7E6F8E739C0833019F43D +:207D2000EDE4F8E734C0813071F5EFE9F8E72FC081E0EBE2F8E790919801382F981708F409 +:207D4000392F90918C0120E04EEF8091E8008570E1F38091E80082FD12C02F5F84915D982C +:207D60008093F100822F8F7311F44093E800319694E6231750F390938C0181E008959093FD +:207D80008C0180E0089580E00895E7EBF8E78491D2CF1092E9008091E80083FF61C082E963 +:207DA00091E068E0F6DE82EF8093E8008091920187FF05C08091E80080FFFCCF03C08EEF58 +:207DC0008093E80080919301853051F48091E80080FFFCCF8091940180688093E30039C049 +:207DE0008930E1F48091940180938E01E7E2F8E791E031E026E39093E9003093EB008491AB +:207E00008093EC002093ED009F5F3196953099F78EE78093EA001092EA001BC0883049F4DB +:207E200090918E015D9884E680938C019093F10010C0882339F45D9884E680938C01109236 +:207E4000F10007C0863011F43EDF01C00FDF882321F08EEF8093E800089581E28093EB00B1 +:207E600008958091E1001092E100282F83FF0CC01092E90081E08093EB001092EC0082E36E +:207E80008093ED0010928E0122FF1CC080918C01882331F0815080938C01882309F45D9A3A +:207EA00080918D01882331F0815080938D01882309F4289A80918F01882321F410929101E6 +:207EC0001092900108951F93CF93DF9312E0C0E9D1E05FDFC6DF1093E9008091E80085FF14 +:207EE00013C0289884E680938D019091F1008091E80085FD03C08BE68093E800892F90E000 +:207F0000DF91CF911F9108958091900190919101019790939101809390018091900190913B +:1A7F20009101892B09F432DDCE010197F1F708DDD0CF00E100000000000041 :00000001FF diff --git a/bootloaders/diskloader/src/DiskLoader.cpp b/bootloaders/diskloader/src/DiskLoader.cpp index 6580618..09f59a7 100644 --- a/bootloaders/diskloader/src/DiskLoader.cpp +++ b/bootloaders/diskloader/src/DiskLoader.cpp @@ -56,7 +56,7 @@ void Program(u8 ep, u16 page, u8 count) boot_rww_enable (); } - +void StartSketch(); int USBGetChar(); #define getch USBGetChar @@ -111,10 +111,15 @@ int main(void) __attribute__ ((naked)); // STK500v1 main loop, very similar to optiboot in protocol and implementation int main() { + uint8_t MCUSR_state = MCUSR; // store the reason for the reset + MCUSR &= ~(1 << WDRF); // must clear the watchdog reset flag before disabling and reenabling WDT wdt_disable(); TXLED0; RXLED0; - LED0; + LED0; + if (MCUSR_state & (1< Date: Tue, 10 Jan 2012 14:25:40 -0500 Subject: fix bug in handling of long descriptors for bootloader USB (thank you, Todd Krein, Limor Fried, and Phillip Torrone) descriptors longer than 255 bytes were being shortened, causing problems with enumeration under Windows --- bootloaders/diskloader/DiskLoader-Leonardo.hex | 1139 +++--------------------- bootloaders/diskloader/src/USBCore.cpp | 8 +- 2 files changed, 124 insertions(+), 1023 deletions(-) diff --git a/bootloaders/diskloader/DiskLoader-Leonardo.hex b/bootloaders/diskloader/DiskLoader-Leonardo.hex index 74f18d0..9a7ea1e 100644 --- a/bootloaders/diskloader/DiskLoader-Leonardo.hex +++ b/bootloaders/diskloader/DiskLoader-Leonardo.hex @@ -1,1019 +1,120 @@ -:200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 -:200020000C9496010C9496010C94FD040C9488050C9496010C9496010C9496010C949601A8 -:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B201CC -:200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 -:200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 -:2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 -:2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D -:2000E0000202040302020202060606060606040402020204040802011040804010204080A8 -:200100004080080204018040201002011080102040400000000200080E0000030401000BB2 -:200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD -:200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC -:200160006E006F0020004C004C0043001201000200000040412334000001010200011201A2 -:200180000002020000404123340000010102000100C18081C1080B000202020100090400D4 -:2001A000000102020000052400100105240101010424020605240600010705810310004094 -:2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 -:2001E000008501050919012903150025019503750181029501750581030501093009310943 -:20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D -:20022000019508810295017508810395067508150025650507190029658100C0090402004C -:2002400001030000000921010100012265000705840340000100000000000000002A2B2895 -:200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 -:20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 -:2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C -:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000057041B07EF0711241FBE7C -:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E8E9F1E102C005900D92A632B107D9F711E071 -:20030000A6E2B1E001C01D92A139B107E1F712E0CCEDD2E004C02297FE010E94C608C63D9E -:20032000D107C9F70E9478030C94CA080C9400008DE061E00E94450368EE73E080E090E0E5 -:200340000E94FA018DE060E00E94450368EE73E080E090E00E94FA0108958DE061E00E9466 -:20036000C10208951F920F920FB60F9211242F933F938F939F93AF93BF9380912A01909157 -:200380002B01A0912C01B0912D0130912E010196A11DB11D232F2D5F2D3720F02D570196E4 -:2003A000A11DB11D20932E0180932A0190932B01A0932C01B0932D018091260190912701F0 -:2003C000A0912801B09129010196A11DB11D8093260190932701A0932801B0932901BF9197 -:2003E000AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F8948091260133 -:2004000090912701A0912801B091290166B5A89B05C06F3F19F00196A11DB11D7FBFBA2FAA -:20042000A92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC012DC0FA -:20044000FFB7F8948091260190912701A0912801B0912901E6B5A89B05C0EF3F19F00196A3 -:20046000A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FBB1F70 -:20048000EA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105410538 -:2004A000510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816085BD64 -:2004C000EEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F0E005 -:2004E000808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0808178 -:2005000082608083808181608083E0E9F0E080818160808320EC30E0F90180818068808391 -:2005200080818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E0808184608083A0 -:20054000808182608083808181608083E3ECF0E0808181608083F9018081826080838C914F -:2005600081608C93EAE7F0E08081846080838081826080838081816080838081806880833B -:200580000895482F50E0CA018C509F4FFC0124914A525F4FFA0184918823C1F0E82FF0E033 -:2005A000EE0FFF1FE455FF4FA591B491662341F49FB7F8948C91209582238C939FBF0895ED -:2005C0009FB7F8948C91822B8C939FBF08958730C1F1883080F48330F9F0843030F481309B -:2005E00029F1823009F050C024C08430C9F0863009F04AC022C08A3091F18B3030F4883067 -:2006000031F1893009F040C026C08C3091F18C3060F18E30C9F533C0809180008F7703C00C -:20062000809180008F7D80938000089584B58F7702C084B58F7D84BD08958091B0008F7702 -:2006400003C08091B0008F7D8093B0000895809190008F7707C0809190008F7D03C08091BB -:200660009000877F8093900008958091C0008F7703C08091C0008F7D8093C00008958091AC -:20068000C200877F8093C2000895FF920F931F93F62E482F50E0CA018E5E9E4FFC0124911A -:2006A000CA018C509F4FFC0114914A525F4FFA0104910023C9F0222319F0822F0E94E702C3 -:2006C000E02FF0E0EE0FFF1FE654FF4FA591B4919FB7F894FF2021F48C911095812302C0DF -:2006E0008C91812B8C939FBF1F910F91FF900895CF93DF930E94530287E391E00E943E04AE -:200700000E94AD01C0E0D0E00E9498012097E1F30E940000F9CF282F809131018823C1F013 -:2007200057FF1AC015C02898909330018091F1008193E217F307B9F74115510539F0809101 -:20074000F200882319F48BE68093E800AFBF02C04FEF5FEFCA010895AFB7F8942770209323 -:20076000E9008091F200282F30E0241735070CF4A901FB019B01240F311D94E6DACFDF9357 -:20078000CF930F92CDB7DEB7BE016F5F7F4F41E050E00E948B03019719F02FEF3FEF03C0B1 -:2007A0008981282F30E0C9010F90CF91DF910895FF920F931F93F82E142F052F409134016A -:2007C00050913501212F302FC901DC01FB016EEF29C0F7FE02C0949101C0908120913201D8 -:2007E0003091330124173507ACF48091E8008570E1F38091E80082FF03C02FEF3FEF17C0CB -:200800009093F100C90101968F739070892B11F46093E8002F5F3F4F3093330120933201D4 -:20082000119731961097A9F6812F902F9C01C9011F910F91FF9008959C018091E80082FF9A -:20084000FCCFF901260F311D03C08091F1008193E217F307D1F7289884E6809330018BEFD4 -:200860008093E800CB0108958093E9008091F200882319F08AE38093E80008951092310188 -:2008800081E08093D70080EA8093D80082E189BD09B400FEFDCF80E98093D8008CE08093B5 -:2008A000E2001092E000559A209A0895089508955F926F927F928F929F92AF92BF92CF920C -:2008C000DF92EF92FF920F931F93CF93DF93E82E842E752E80913101882371F18B01242FD3 -:2008E000352FC901EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA82209 -:20090000B9223AE3632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FDF8 -:2009200002C020E004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E06C -:2009400070E080E090E00E94FA013BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8945B -:200960009092E900A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922FD5 -:2009800010C0C801322F06C0FC010196E491E093F10031503323C1F706C081918093F100BF -:2009A00091509923D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E800F8 -:2009C0004FBF209709F0A5CF5D9884E680932F01282D372DC9019C01C901DF91CF911F91D9 -:2009E0000F91FF90EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB6EE -:200A00000F9211241F932F933F934F935F936F937F938F939F93AF93BF93EF93FF938091C5 -:200A2000E1001092E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED005D -:200A40001092310188E08093F00092FF36C083E08093E9008091F200882349F08AE380930A -:200A6000E80005C08CE791E00E945E0701C012E09FB7F8941093E9008091F2009FBF8823B1 -:200A800089F780912F01882351F080912F01815080932F0180912F01882309F45D9A809163 -:200AA0003001882351F08091300181508093300180913001882309F4289AFF91EF91BF91B6 -:200AC000AF919F918F917F916F915F914F913F912F911F910F900FBE0F901F9018950F935D -:200AE0001F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8010E947D07C8010E948E08C0 -:200B0000898190E00F90CF91DF911F910F9108951F920F920FB60F921124EF92FF921F934E -:200B20002F933F934F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB750 -:200B40006197DEBFCDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C0809151 -:200B6000F1008193E217F307D1F7289884E68093300182EF8093E800998197FF05C0809155 -:200B8000E80080FFFCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C08A8186 -:200BA000882329F41092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F480912D -:200BC000E80080FFFCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230C1F509 -:200BE0001092E900109233011092320110923501109234010E946F0599E0FE013996DF01D3 -:200C0000292F1D922A95E9F799871A8791E09E8790E8988B9AEF998B2091320130913301B6 -:200C2000275F3F4F3C872B878D871092E9001092330110923201F0923501E092340180E022 -:200C4000BF0149E050E00E94D8030E946F0585C01092E9001092330110923201F0923501B5 -:200C6000E0923401123241F482E290E00E948608892B09F476C071C0113079F488E0E81624 -:200C8000F10419F481E08093360180913601882309F06BC0ECE6F1E013C0133009F061C0BD -:200CA0008B81882319F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F053C0E4E5F1E094 -:200CC000449180E8BF0150E00E94D80346C0873009F447C0883021F481E08093F1003DC07A -:200CE0008930D9F523703070232BD9F5E1E9F1E091E031E026E39093E9003093EB00849129 -:200D00008093EC002093ED009F5F3196953099F78EE78093EA001092EA008B8180933101CB -:200D20001CC08F8198851092E900109233011092320190933501809334018D81882329F4FD -:200D4000CE0101960E94910706C0823051F4CE0101960E94D307882321F08EEF8093E80020 -:200D600007C081E28093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF911B -:200D8000AF919F918F917F916F915F914F913F912F911F91FF90EF900F900FBE0F901F90DB -:200DA0001895209178013091790180917A0190917B01281B390B2F733070C9010895209117 -:200DC00078013091790180917A0190917B012817390719F42FEF3FEF09C0E0917A01F09128 -:200DE0007B01E85CFE4F8081282F30E0C9010895209178013091790180917A0190917B0189 -:200E00002817390719F42FEF3FEF13C0E0917A01F0917B01E85CFE4F208180917A0190915F -:200E20007B0101968F73907090937B0180937A0130E0C901089510927F0110927E0188EE40 -:200E400093E0A0E0B0E08093800190938101A0938201B09383018EE091E090937D018093C6 -:200E60007C0108950F931F93DF93CF930F92CDB7DEB78C01698380910701882369F083E07D -:200E8000BE016F5F7F4F41E050E00E9458041816190614F49C0107C081E090E0F80193830F -:200EA000828320E030E0C9010F90CF91DF911F910F91089583E00E943404089582E00E9419 -:200EC000BF03482F20917801309179012F5F3F4F2F73307080917A0190917B01281739076E -:200EE00059F0E0917801F0917901E85CFE4F408330937901209378010895FC0180818E5F7F -:200F0000808380E865E971E042E450E00E94D803089587E391E00E945604F8940C94003C18 -:200F20000895CF93DF93EC0189819881913A51F4813269F580E060E071E047E050E00E9425 -:200F4000D80323C0913219F5803239F480E091E067E070E00E941C0418C08232C1F48091A7 -:200F60000701882379F08091000190910101A0910201B0910301805B9440A040B04011F423 -:200F80000E9489078A818093070181E001C080E0DF91CF910895DC01ED91FC910480F58128 -:200FA000E02D09950895FC0191818081813A31F4913089F080E0933089F40DC0813269F442 -:200FC0009B3021F482818093080105C09A3029F482818093090181E0089580E008951092A9 -:200FE0008A0110928E0110928D0180E291E090938C0180938B011092900110928F010895E1 -:20100000EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0184E0BE016F5F7F4F0A -:2010200041E050E00E94580484E4B801A7010E9458040F90CF91DF911F910F91FF90EF90CD -:20104000089582E048E050E00E9400080895EF92FF920F931F93DF93CF93CDB7DEB72897E0 -:201060000FB6F894DEBF0FBECDBF7C019E012F5F3F4F88E0F90111928A95E9F7F701A481D0 -:20108000B581109759F0ED91FC9111970190F081E02DCD0170E0A901099518C067FD07C0FF -:2010A000E62FF0E0EB5AFD4F6491662341F481E090E0F7019383828320E030E019C067FFD4 -:2010C00004C08981826089836F776B83C7018E010F5F1F4FB8010E94210888E0F8011192C5 -:2010E0008A95E9F7C701B8010E94210821E030E0C90128960FB6F894DEBF0FBECDBFCF9165 -:20110000DF911F910F91FF90EF90089580E867ED71E045E650E00E94D8030895FC018081E4 -:201120008F5F808380E86CE372E049E150E00E94D8030895CF92DF92EF92FF920F931F9309 -:20114000CF93DF937C016B018A01C0E0D0E00FC0D6016D916D01D701ED91FC910190F08100 -:20116000E02DC7010995C80FD91F015010400115110571F7CE01DF91CF911F910F91FF907A -:20118000EF90DF90CF900895EE0FFF1F0590F491E02D0994F894FFCF00E10000000000004B -:2011A00001010000000032079A08D106F806DF065A075E0700000000CB079A082708FFFF31 -:2011C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:2011E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F -:20120000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE -:20122000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:20124000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:20126000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:20128000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E -:2012A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E -:2012C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E -:2012E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E -:20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED -:20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 -:20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 -:2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 -:2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 -:20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF -:20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF -:20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F -:20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F -:20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F -:2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F -:2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF -:20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E -:20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E -:2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E -:2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E -:2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE -:20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED -:20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 -:20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 -:20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 -:2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 -:2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF -:20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F -:20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F -:20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F -:20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F -:2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF -:2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF -:20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E -:20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E -:20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E -:2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E -:2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE -:2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED -:2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:20700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:20702000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 -:20704000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 -:20706000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 -:20708000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:2070A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 -:2070C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:2070E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:20710000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F -:20712000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F -:20714000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F -:20716000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:20718000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F -:2071A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF -:2071C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF -:2071E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF -:20720000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:20722000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E -:20724000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E -:20726000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E -:20728000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E -:2072A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE -:2072C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:2072E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:20730000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20732000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:20734000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:20736000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:20738000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:2073A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED -:2073C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:2073E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20740000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20742000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:20744000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:20746000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:20748000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:2074A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:2074C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:2074E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20750000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20752000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:20754000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:20756000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:20758000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:2075A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:2075C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:2075E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20760000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20762000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:20764000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:20766000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:20768000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:2076A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:2076C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:2076E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20770000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20772000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:20774000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:20776000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:20778000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:2077A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:2077C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:2077E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:2078000011241FBECFEFDAE0DEBFCDBF0BC1410142144505560455026403740300001E95C5 -:2078200087020110030000C18081C106C0FF0A000CA10185037508150026FF00954009018D -:207840008102954009029102C0040309041A03300030003000300030003000300030003190 -:20786000003700300031003803410072006400750069006E006F0020004C0065006F006EB5 -:20788000006100720064006F00200062006F006F0074006C006F00610064006500720018DF -:2078A00003410072006400750069006E006F0020004C004C00430012010002020000404160 -:2078C0002334000001000203011201000200000040412334000001000203010902640003E4 -:2078E00001008032080B00020202010009040000010202000005240010010524010101043F -:2079000024020205240600010705810310004009040100020A0000000705020240000007BE -:20792000058302400000090402000103000000092101010001221E000705840340004000EA -:2079400020918A0130918B012C5F3F4F30938B0120938A01C901892F99278695982F803420 -:2079600018F08FE7891B982F990F921710F447980895479A08955D9A289A81E08093E000C2 -:207980001092E200EE27FF270994089528E088E190E00FB6F894A895809360000FBE20938C -:2079A0006000FFCF0F931F93CF93DF93982FEB01042F10E088E76030780730F411E083E0A5 -:2079C000FB0180935700E895892F68E071E0402F06D1112311F107B600FCFDCF402F469528 -:2079E000FE01A8E0B1E020E031E009C08D919D910C0130935700E895112432962F5F2417DF -:207A0000A8F385E0FE0180935700E89507B600FCFDCF81E180935700E895DF91CF911F9132 -:207A20000F91089584B794B7977F94BF98E10FB6F89490936000109260000FBE5D9A289A45 -:207A4000479883FF08C0E0E0F0E0859194918F5F9F4F09F090DF3F9A209A559A90E89093D1 -:207A600061001092610081E885BF95BF9FD084E18093880180E180938901E0E0F0E085918D -:207A800094918F5F9F4F19F081E080938F01EE24FF24BB24B39454EFC52E51E0D52E13D22E -:207AA000082F8EE098E7FC012491319602964491201711F02223B9F7109291011092900128 -:207AC00082E068E071E08BD0013479F4609108016058633028F0683111F064E001C063E06F -:207AE000C62FD0E0CF5DD7480EC0063571F480910801803311F011E022C080910A01C82F74 -:207B0000D0E0C25ED74811E022C0053721F413E0CEE1D8E71CC0053539F4E0900801F090B5 -:207B20000901EE0CFF1C0AC0043631F482E0B7014091090137DF02C0043721F010E0C5E24D -:207B4000D8E705C010910901E701E10EF11CBBD18097B1F483E068E871E041E050E059D04C -:207B6000112329F0412F50E083E8BE0152D083E469E871E041E050E04CD0013509F08FCFC9 -:207B8000D0929101C0929001B0928F01EE24FF2486CFFC01289884E680938D0104C0809115 -:207BA000F100819361506623D1F70895109291011092900110928E0110928F0181E08093E3 -:207BC000D70080EA8093D80082E189BD09B400FEFDCF80E98093D8001092E0000895FB01DA -:207BE0008093E90024E69BE611C08091E80085FFFCCF289820938D018091F10081938091BD -:207C0000E80085FD02C09093E8004150442369F70895982FFB01282F207287708093E90099 -:207C200064E63AE317C08091E80085FFFCCF97FF02C0849101C080813196211180E05D9841 -:207C400060938C018093F1008091E80085FD02C03093E800415050408FEF4F3F580719F71C -:207C600096FF03C08AE38093E800089580919301813299F45D9884E680938C0120E030E0B3 -:207C800003C080818093F100F901E050FF4F2F5F3F4F28303105A9F714C0803261F480916E -:207CA000E80082FFFCCF80E091E067E072DF8BEF8093E80006C0823221F48091940180936A -:207CC000070181E0089520919501223289F1213081F48091980190919901089711F4209307 -:207CE0009A0180919A01882309F04FC0E9ECF8E74EC0223021F484E6EBEDF8E71CC0233011 -:207D000009F041C080919401882319F4E9E4F8E73EC0823019F4E7E6F8E739C0833019F43D -:207D2000EDE4F8E734C0813071F5EFE9F8E72FC081E0EBE2F8E790919801382F981708F409 -:207D4000392F90918C0120E04EEF8091E8008570E1F38091E80082FD12C02F5F84915D982C -:207D60008093F100822F8F7311F44093E800319694E6231750F390938C0181E008959093FD -:207D80008C0180E0089580E00895E7EBF8E78491D2CF1092E9008091E80083FF61C082E963 -:207DA00091E068E0F6DE82EF8093E8008091920187FF05C08091E80080FFFCCF03C08EEF58 -:207DC0008093E80080919301853051F48091E80080FFFCCF8091940180688093E30039C049 -:207DE0008930E1F48091940180938E01E7E2F8E791E031E026E39093E9003093EB008491AB -:207E00008093EC002093ED009F5F3196953099F78EE78093EA001092EA001BC0883049F4DB -:207E200090918E015D9884E680938C019093F10010C0882339F45D9884E680938C01109236 -:207E4000F10007C0863011F43EDF01C00FDF882321F08EEF8093E800089581E28093EB00B1 -:207E600008958091E1001092E100282F83FF0CC01092E90081E08093EB001092EC0082E36E -:207E80008093ED0010928E0122FF1CC080918C01882331F0815080938C01882309F45D9A3A -:207EA00080918D01882331F0815080938D01882309F4289A80918F01882321F410929101E6 -:207EC0001092900108951F93CF93DF9312E0C0E9D1E05FDFC6DF1093E9008091E80085FF14 -:207EE00013C0289884E680938D019091F1008091E80085FD03C08BE68093E800892F90E000 -:207F0000DF91CF911F9108958091900190919101019790939101809390018091900190913B -:1A7F20009101892B09F432DDCE010197F1F708DDD0CF00E100000000000041 -:00000001FF +:1078000011241FBECFEFDAE0DEBFCDBF0BC14101B7 +:1078100042144505560455026403740300001E9586 +:1078200087020110030000C18081C106C0FF0A0069 +:107830000CA10185037508150026FF00954009017C +:107840008102954009029102C0040309041A033021 +:1078500000300030003000300030003000300031A7 +:107860000037003000310038030000000000000045 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000018D0 +:1078A00003410072006400750069006E006F0020E3 +:1078B000004C004C00430012010002020000404155 +:1078C000235B00000100020301120100020000001E +:1078D0004041235B00000100020301090264000330 +:1078E00001008032080B00020202010009040000BE +:1078F0000102020000052400100105240101010419 +:107900002402020524060001070581031000400936 +:10791000040100020A0000000705020240000007FF +:107920000583024000000904020001030000000971 +:107930002101010001221E000705840340004000D0 +:1079400020918A0130918B012C5F3F4F30938B0146 +:1079500020938A01C901892F99278695982F803411 +:1079600018F08FE7891B982F990F921710F44798FA +:107970000895479A08955D9A289A81E08093E000DF +:107980001092E200EE27FF270994089528E088E18D +:1079900090E00FB6F894A895809360000FBE2093F6 +:1079A0006000FFCF0F931F93CF93DF93982FEB01CE +:1079B000042F10E088E76030780730F411E083E0AE +:1079C000FB0180935700E895892F68E071E0402F14 +:1079D00006D1112311F107B600FCFDCF402F4695CB +:1079E000FE01A8E0B1E020E031E009C08D919D9159 +:1079F0000C0130935700E895112432962F5F24171D +:107A0000A8F385E0FE0180935700E89507B600FCD7 +:107A1000FDCF81E180935700E895DF91CF911F91D1 +:107A20000F91089584B794B7977F94BF98E10FB6EC +:107A3000F89490936000109260000FBE5D9A289AAF +:107A4000479883FF08C0E0E0F0E0859194918F5F54 +:107A50009F4F09F090DF3F9A209A559A90E89093B3 +:107A600061001092610081E885BF95BF9FD084E1DD +:107A70008093880180E180938901E0E0F0E08591C6 +:107A800094918F5F9F4F19F081E080938F01EE24D6 +:107A9000FF24BB24B39454EFC52E51E0D52E1FD242 +:107AA000082F8EE098E7FC012491319602964491CC +:107AB000201711F02223B9F7109291011092900132 +:107AC00082E068E071E08BD0013479F460910801C4 +:107AD0006058633028F0683111F064E001C063E061 +:107AE000C62FD0E0CF5DD7480EC0063571F4809127 +:107AF0000801803311F011E022C080910A01C82FE3 +:107B0000D0E0C25ED74811E022C0053721F413E06F +:107B1000CEE1D8E71CC0053539F4E0900801F090BB +:107B20000901EE0CFF1C0AC0043631F482E0B701F3 +:107B30004091090137DF02C0043721F010E0C5E2AF +:107B4000D8E705C010910901E701E10EF11CC7D18A +:107B50008097B1F483E068E871E041E050E059D0EB +:107B6000112329F0412F50E083E8BE0152D083E475 +:107B700069E871E041E050E04CD0013509F08FCF69 +:107B8000D0929101C0929001B0928F01EE24FF2417 +:107B900086CFFC01289884E680938D0104C08091F3 +:107BA000F100819361506623D1F7089510929101FD +:107BB0001092900110928E0110928F0181E08093BB +:107BC000D70080EA8093D80082E189BD09B400FE25 +:107BD000FDCF80E98093D8001092E0000895FB016A +:107BE0008093E90024E69BE611C08091E80085FFC0 +:107BF000FCCF289820938D018091F1008193809192 +:107C0000E80085FD02C09093E8004150442369F7E5 +:107C10000895982FFB01282F207287708093E90028 +:107C200064E63AE317C08091E80085FFFCCF97FF38 +:107C300002C0849101C080813196211180E05D985D +:107C400060938C018093F1008091E80085FD02C073 +:107C50003093E800415050408FEF4F3F580719F7DD +:107C600096FF03C08AE38093E80008958091930112 +:107C7000813299F45D9884E680938C0120E030E0B5 +:107C800003C080818093F100F901E050FF4F2F5F26 +:107C90003F4F28303105A9F714C0803261F480913C +:107CA000E80082FFFCCF80E091E067E072DF8BEFBD +:107CB0008093E80006C0823221F480919401809381 +:107CC000070181E0089520919501223291F1213040 +:107CD00081F48091980190919901089711F4209373 +:107CE0009A0180919A01882309F059C029EC38E75C +:107CF00058C0223029F484E690E02BED38E71DC00F +:107D0000233009F04AC080919401882319F429E4B2 +:107D100038E747C0823019F427E638E742C083309D +:107D200019F42DE438E73DC08130B9F52FE938E783 +:107D300038C082E090E02BE238E740919801509102 +:107D40009901BC014817590708F4BA0190918C01B8 +:107D500040E050E0AEEF8091E8008570E1F3809163 +:107D6000E80082FD16C0F901E40FF51F4F5F5F4F79 +:107D7000E4915D98E093F100842F8F7311F4A09348 +:107D8000E80094E64617570730F390938C0181E0A2 +:107D9000089590938C0180E0089580E0089527EB8A +:107DA00038E7F901849190E0C8CF1092E900809102 +:107DB000E80083FF61C082E991E068E0EADE82EFDB +:107DC0008093E8008091920187FF05C08091E800D0 +:107DD00080FFFCCF03C08EEF8093E8008091930179 +:107DE000853051F48091E80080FFFCCF80919401B0 +:107DF00080688093E30039C08930E1F48091940178 +:107E000080938E01E7E2F8E791E031E026E390937A +:107E1000E9003093EB0084918093EC002093ED0017 +:107E20009F5F3196953099F78EE78093EA00109224 +:107E3000EA001BC0883049F490918E015D9884E679 +:107E400080938C019093F10010C0882339F45D98E1 +:107E500084E680938C011092F10007C0863011F403 +:107E600032DF01C003DF882321F08EEF8093E8002A +:107E7000089581E28093EB0008958091E1001092D3 +:107E8000E100282F83FF0CC01092E90081E080936D +:107E9000EB001092EC0082E38093ED0010928E01D3 +:107EA00022FF1CC080918C01882331F08150809387 +:107EB0008C01882309F45D9A80918D01882331F02B +:107EC000815080938D01882309F4289A80918F0135 +:107ED000882321F4109291011092900108951F932C +:107EE000CF93DF9312E0C0E9D1E05FDFC6DF1093EC +:107EF000E9008091E80085FF13C0289884E680930C +:107F00008D019091F1008091E80085FD03C08BE622 +:107F10008093E800892F90E0DF91CF911F91089521 +:107F2000809190019091910101979093910180939C +:107F300090018091900190919101892B09F426DDA7 +:0A7F4000CE010197F1F7FCDCD0CF71 +:087F4A0000E10000000000004E +:040000030000780081 +:00000001FF diff --git a/bootloaders/diskloader/src/USBCore.cpp b/bootloaders/diskloader/src/USBCore.cpp index 0467e46..a234596 100644 --- a/bootloaders/diskloader/src/USBCore.cpp +++ b/bootloaders/diskloader/src/USBCore.cpp @@ -351,7 +351,7 @@ u8 _cdcComposite = 0; bool SendDescriptor() { Setup& setup = _setup; - u8 desc_length = 0; + u16 desc_length = 0; const u8* desc_addr = 0; u8 t = setup.wValueH; @@ -387,13 +387,13 @@ bool SendDescriptor() if (desc_length == 0) desc_length = pgm_read_byte(desc_addr); - if ((u8)setup.wLength < desc_length) // bit of a cheat limiting to 255 bytes TODO (saved 8 bytes) - desc_length = (u8)setup.wLength; + if (setup.wLength < desc_length) + desc_length = setup.wLength; // Send descriptor // EP0 is 64 bytes long // RWAL and FIFOCON don't work on EP0 - u8 n = 0; + u16 n = 0; do { if (!WaitForINOrOUT()) -- cgit v1.2.3-18-g5258 From 648dd85e945a7e0a2db284987377a97936ee77e4 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 10 Jan 2012 15:31:56 -0500 Subject: added conditional compilation for HID, removed conditional compilation for CDC (is always used). disabled HID by default. also always enumerates as composite now. the bootloader must always have a CDC interface. HID is optional and not even complete to reduce size. --- bootloaders/diskloader/DiskLoader-Leonardo.hex | 229 ++++++++++++------------- bootloaders/diskloader/src/Platform.h | 5 +- bootloaders/diskloader/src/USBCore.cpp | 10 +- bootloaders/diskloader/src/USBDesc.cpp | 12 +- bootloaders/diskloader/src/USBDesc.h | 43 ++--- 5 files changed, 144 insertions(+), 155 deletions(-) diff --git a/bootloaders/diskloader/DiskLoader-Leonardo.hex b/bootloaders/diskloader/DiskLoader-Leonardo.hex index 9a7ea1e..af819fb 100644 --- a/bootloaders/diskloader/DiskLoader-Leonardo.hex +++ b/bootloaders/diskloader/DiskLoader-Leonardo.hex @@ -1,120 +1,115 @@ -:1078000011241FBECFEFDAE0DEBFCDBF0BC14101B7 +:1078000011241FBECFEFDAE0DEBFCDBFF5C04101CE :1078100042144505560455026403740300001E9586 -:1078200087020110030000C18081C106C0FF0A0069 -:107830000CA10185037508150026FF00954009017C -:107840008102954009029102C0040309041A033021 -:1078500000300030003000300030003000300031A7 -:107860000037003000310038030000000000000045 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000018D0 -:1078A00003410072006400750069006E006F0020E3 -:1078B000004C004C00430012010002020000404155 -:1078C000235B00000100020301120100020000001E -:1078D0004041235B00000100020301090264000330 -:1078E00001008032080B00020202010009040000BE -:1078F0000102020000052400100105240101010419 -:107900002402020524060001070581031000400936 -:10791000040100020A0000000705020240000007FF -:107920000583024000000904020001030000000971 -:107930002101010001221E000705840340004000D0 -:1079400020918A0130918B012C5F3F4F30938B0146 -:1079500020938A01C901892F99278695982F803411 -:1079600018F08FE7891B982F990F921710F44798FA -:107970000895479A08955D9A289A81E08093E000DF -:107980001092E200EE27FF270994089528E088E18D -:1079900090E00FB6F894A895809360000FBE2093F6 -:1079A0006000FFCF0F931F93CF93DF93982FEB01CE -:1079B000042F10E088E76030780730F411E083E0AE -:1079C000FB0180935700E895892F68E071E0402F14 -:1079D00006D1112311F107B600FCFDCF402F4695CB -:1079E000FE01A8E0B1E020E031E009C08D919D9159 -:1079F0000C0130935700E895112432962F5F24171D -:107A0000A8F385E0FE0180935700E89507B600FCD7 -:107A1000FDCF81E180935700E895DF91CF911F91D1 -:107A20000F91089584B794B7977F94BF98E10FB6EC -:107A3000F89490936000109260000FBE5D9A289AAF -:107A4000479883FF08C0E0E0F0E0859194918F5F54 -:107A50009F4F09F090DF3F9A209A559A90E89093B3 -:107A600061001092610081E885BF95BF9FD084E1DD -:107A70008093880180E180938901E0E0F0E08591C6 -:107A800094918F5F9F4F19F081E080938F01EE24D6 -:107A9000FF24BB24B39454EFC52E51E0D52E1FD242 -:107AA000082F8EE098E7FC012491319602964491CC -:107AB000201711F02223B9F7109291011092900132 -:107AC00082E068E071E08BD0013479F460910801C4 -:107AD0006058633028F0683111F064E001C063E061 -:107AE000C62FD0E0CF5DD7480EC0063571F4809127 -:107AF0000801803311F011E022C080910A01C82FE3 -:107B0000D0E0C25ED74811E022C0053721F413E06F -:107B1000CEE1D8E71CC0053539F4E0900801F090BB -:107B20000901EE0CFF1C0AC0043631F482E0B701F3 -:107B30004091090137DF02C0043721F010E0C5E2AF -:107B4000D8E705C010910901E701E10EF11CC7D18A -:107B50008097B1F483E068E871E041E050E059D0EB -:107B6000112329F0412F50E083E8BE0152D083E475 -:107B700069E871E041E050E04CD0013509F08FCF69 -:107B8000D0929101C0929001B0928F01EE24FF2417 -:107B900086CFFC01289884E680938D0104C08091F3 -:107BA000F100819361506623D1F7089510929101FD -:107BB0001092900110928E0110928F0181E08093BB -:107BC000D70080EA8093D80082E189BD09B400FE25 -:107BD000FDCF80E98093D8001092E0000895FB016A -:107BE0008093E90024E69BE611C08091E80085FFC0 -:107BF000FCCF289820938D018091F1008193809192 -:107C0000E80085FD02C09093E8004150442369F7E5 -:107C10000895982FFB01282F207287708093E90028 -:107C200064E63AE317C08091E80085FFFCCF97FF38 -:107C300002C0849101C080813196211180E05D985D -:107C400060938C018093F1008091E80085FD02C073 -:107C50003093E800415050408FEF4F3F580719F7DD -:107C600096FF03C08AE38093E80008958091930112 -:107C7000813299F45D9884E680938C0120E030E0B5 -:107C800003C080818093F100F901E050FF4F2F5F26 -:107C90003F4F28303105A9F714C0803261F480913C -:107CA000E80082FFFCCF80E091E067E072DF8BEFBD -:107CB0008093E80006C0823221F480919401809381 -:107CC000070181E0089520919501223291F1213040 -:107CD00081F48091980190919901089711F4209373 -:107CE0009A0180919A01882309F059C029EC38E75C -:107CF00058C0223029F484E690E02BED38E71DC00F -:107D0000233009F04AC080919401882319F429E4B2 -:107D100038E747C0823019F427E638E742C083309D -:107D200019F42DE438E73DC08130B9F52FE938E783 -:107D300038C082E090E02BE238E740919801509102 -:107D40009901BC014817590708F4BA0190918C01B8 -:107D500040E050E0AEEF8091E8008570E1F3809163 -:107D6000E80082FD16C0F901E40FF51F4F5F5F4F79 -:107D7000E4915D98E093F100842F8F7311F4A09348 -:107D8000E80094E64617570730F390938C0181E0A2 -:107D9000089590938C0180E0089580E0089527EB8A -:107DA00038E7F901849190E0C8CF1092E900809102 -:107DB000E80083FF61C082E991E068E0EADE82EFDB -:107DC0008093E8008091920187FF05C08091E800D0 -:107DD00080FFFCCF03C08EEF8093E8008091930179 -:107DE000853051F48091E80080FFFCCF80919401B0 -:107DF00080688093E30039C08930E1F48091940178 -:107E000080938E01E7E2F8E791E031E026E390937A -:107E1000E9003093EB0084918093EC002093ED0017 -:107E20009F5F3196953099F78EE78093EA00109224 -:107E3000EA001BC0883049F490918E015D9884E679 -:107E400080938C019093F10010C0882339F45D98E1 -:107E500084E680938C011092F10007C0863011F403 -:107E600032DF01C003DF882321F08EEF8093E8002A -:107E7000089581E28093EB0008958091E1001092D3 -:107E8000E100282F83FF0CC01092E90081E080936D -:107E9000EB001092EC0082E38093ED0010928E01D3 -:107EA00022FF1CC080918C01882331F08150809387 -:107EB0008C01882309F45D9A80918D01882331F02B -:107EC000815080938D01882309F4289A80918F0135 -:107ED000882321F4109291011092900108951F932C -:107EE000CF93DF9312E0C0E9D1E05FDFC6DF1093EC -:107EF000E9008091E80085FF13C0289884E680930C -:107F00008D019091F1008091E80085FD03C08BE622 -:107F10008093E800892F90E0DF91CF911F91089521 -:107F2000809190019091910101979093910180939C -:107F300090018091900190919101892B09F426DDA7 -:0A7F4000CE010197F1F7FCDCD0CF71 -:087F4A0000E10000000000004E +:1078200087020110030000C1808106C0FF0A000C1E +:10783000A10185037508150026FF00954009018107 +:1078400002954009029102C0040309041A033000A2 +:1078500030003000300030003000300030003100A7 +:1078600037003000310038034100720064007500B9 +:1078700069006E006F0020004C0065006F006E0014 +:107880006100720064006F00200062006F006F00F2 +:1078900074006C006F0061006400650072001803E2 +:1078A000410072006400750069006E006F002000E6 +:1078B0004C004C0043001201000202000040412332 +:1078C000340000010002030109024B0002010080A4 +:1078D00032080B000202020100090400000102024A +:1078E0000000052400100105240101010424020206 +:1078F000052406000107058103100040090401006A +:10790000020A00000007050202400000070583028A +:107910004000000020918A0130918B012C5F3F4F85 +:1079200030938B0120938A01C901892F992786956D +:10793000982F803418F08FE7891B982F990F921792 +:1079400010F447980895479A08955D9A289A81E01F +:107950008093E0001092E200EE27FF27099408953B +:1079600028E088E190E00FB6F894A8958093600035 +:107970000FBE20936000FFCF0F931F93CF93DF9331 +:10798000982FEB01042F10E088E76030780730F47F +:1079900011E083E0FB0180935700E895892F68E0B0 +:1079A00071E0402F06D1112311F107B600FCFDCF85 +:1079B000402F4695FE01A8E0B1E020E031E009C08B +:1079C0008D919D910C0130935700E89511243296CA +:1079D0002F5F2417A8F385E0FE0180935700E895F8 +:1079E00007B600FCFDCF81E180935700E895DF9159 +:1079F000CF911F910F91089584B794B7977F94BF4B +:107A000098E10FB6F89490936000109260000FBE5A +:107A10005D9A289A479883FF08C0E0E0F0E08591DE +:107A200094918F5F9F4F09F090DF3F9A209A559A6B +:107A300090E8909361001092610081E885BF95BF46 +:107A40009FD084E18093880180E180938901E0E008 +:107A5000F0E0859194918F5F9F4F19F081E08093C2 +:107A60008F01EE24FF24BB24B39454EFC52E51E0C4 +:107A7000D52E0DD2082F8EE098E7FC012491319687 +:107A800002964491201711F02223B9F71092910128 +:107A90001092900182E068E071E08BD0013479F4BB +:107AA000609108016058633028F0683111F064E09B +:107AB00001C063E0C62FD0E0CF5DD7480EC00635C9 +:107AC00071F480910801803311F011E022C080919F +:107AD0000A01C82FD0E0C25ED74811E022C00537A6 +:107AE00021F413E0CEE1D8E71CC0053539F4E0906D +:107AF0000801F0900901EE0CFF1C0AC0043631F4B5 +:107B000082E0B7014091090137DF02C0043721F05C +:107B100010E0C5E2D8E705C010910901E701E10EC8 +:107B2000F11CB5D18097B1F483E068E871E041E0E1 +:107B300050E059D0112329F0412F50E083E8BE01D5 +:107B400052D083E469E871E041E050E04CD0013567 +:107B500009F08FCFD0929101C0929001B0928F0125 +:107B6000EE24FF2486CFFC01289884E680938D01C3 +:107B700004C08091F100819361506623D1F708958C +:107B8000109291011092900110928E0110928F012B +:107B900081E08093D70080EA8093D80082E189BD9C +:107BA00009B400FEFDCF80E98093D8001092E00078 +:107BB0000895FB018093E90024E69BE611C08091C3 +:107BC000E80085FFFCCF289820938D018091F1007B +:107BD00081938091E80085FD02C09093E8004150B8 +:107BE000442369F70895982FFB01282F207287708E +:107BF0008093E90064E63AE317C08091E80085FFCE +:107C0000FCCF97FF02C0849101C080813196211181 +:107C100080E05D9860938C018093F1008091E80092 +:107C200085FD02C03093E800415050408FEF4F3F38 +:107C3000580719F796FF03C08AE38093E800089578 +:107C400080919301813299F45D9884E680938C0150 +:107C500020E030E003C080818093F100F901E05022 +:107C6000FF4F2F5F3F4F28303105A9F714C08032F6 +:107C700061F48091E80082FFFCCF80E091E067E052 +:107C800072DF8BEF8093E80006C0823221F480918E +:107C900094018093070181E00895809195018232DB +:107CA00019F420E030E024C0813019F426EB38E7E5 +:107CB0001FC0823029F48BE490E028EC38E71BC029 +:107CC000833009F048C080919401882319F428E496 +:107CD00038E70EC0823019F426E638E709C0833051 +:107CE00019F42CE438E704C08130A9F52EE938E70F +:107CF000F901849190E04091980150919901BC0163 +:107D00004817590708F4BA0190918C0140E050E0FF +:107D1000AEEF8091E8008570E1F38091E80082FD8C +:107D200016C0F901E40FF51F4F5F5F4FE4915D98B6 +:107D3000E093F100842F8F7311F4A093E80094E690 +:107D40004617570730F390938C0181E00895909384 +:107D50008C0180E0089580E008951092E900809100 +:107D6000E80083FF61C082E991E068E0FCDE82EF19 +:107D70008093E8008091920187FF05C08091E80020 +:107D800080FFFCCF03C08EEF8093E80080919301C9 +:107D9000853051F48091E80080FFFCCF8091940100 +:107DA00080688093E30039C08930E1F480919401C8 +:107DB00080938E01E7E2F8E791E031E026E39093CB +:107DC000E9003093EB0084918093EC002093ED0068 +:107DD0009F5F3196943099F78EE78093EA00109276 +:107DE000EA001BC0883049F490918E015D9884E6CA +:107DF00080938C019093F10010C0882339F45D9832 +:107E000084E680938C011092F10007C0863011F453 +:107E100044DF01C015DF882321F08EEF8093E80056 +:107E2000089581E28093EB0008958091E100109223 +:107E3000E100282F83FF0CC01092E90081E08093BD +:107E4000EB001092EC0082E38093ED0010928E0123 +:107E500022FF1CC080918C01882331F081508093D7 +:107E60008C01882309F45D9A80918D01882331F07B +:107E7000815080938D01882309F4289A80918F0185 +:107E8000882321F4109291011092900108951F937C +:107E9000CF93DF9312E0C0E9D1E05FDFC6DF10933C +:107EA000E9008091E80085FF13C0289884E680935C +:107EB0008D019091F1008091E80085FD03C08BE673 +:107EC0008093E800892F90E0DF91CF911F91089572 +:107ED00080919001909191010197909391018093ED +:107EE00090018091900190919101892B09F438DDE6 +:0A7EF000CE010197F1F70EDDD0CFAF +:087EFA0000E10000000000009F :040000030000780081 :00000001FF diff --git a/bootloaders/diskloader/src/Platform.h b/bootloaders/diskloader/src/Platform.h index 04c5b79..fcce0a1 100644 --- a/bootloaders/diskloader/src/Platform.h +++ b/bootloaders/diskloader/src/Platform.h @@ -43,7 +43,10 @@ void Transfer(u8 ep, const u8* data, int len); void Recv(u8 ep, u8* dst, u8 len); void Program(u8 ep, u16 page, u8 count); -#define CDC_ENABLED +/* HID is not fully-supported in the bootloader - can be enabled + for testing, but note the descriptor report and other parts are + not complete */ +//#define HID_ENABLED #include "USBCore.h" #include "USBDesc.h" diff --git a/bootloaders/diskloader/src/USBCore.cpp b/bootloaders/diskloader/src/USBCore.cpp index a234596..64f5852 100644 --- a/bootloaders/diskloader/src/USBCore.cpp +++ b/bootloaders/diskloader/src/USBCore.cpp @@ -255,13 +255,13 @@ const u8 _initEndpoints[] = { 0, -#ifdef CDC_ENABLED EP_TYPE_INTERRUPT_IN, // CDC_ENDPOINT_ACM EP_TYPE_BULK_OUT, // CDC_ENDPOINT_OUT EP_TYPE_BULK_IN, // CDC_ENDPOINT_IN -#endif +#ifdef HID_ENABLED EP_TYPE_INTERRUPT_IN, // HID_ENDPOINT_INT +#endif }; static void InitEndpoints() @@ -357,13 +357,13 @@ bool SendDescriptor() u8 t = setup.wValueH; if (0x22 == t) { +#ifdef HID_ENABLED desc_addr = _rawHID; desc_length = sizeof(desc_length); +#endif } else if (USB_DEVICE_DESCRIPTOR_TYPE == t) { - if (setup.wLength == 8) - _cdcComposite = 1; - desc_addr = _cdcComposite ? (const u8*)&USB_DeviceDescriptorA : (const u8*)&USB_DeviceDescriptor; + desc_addr = (const u8*)&USB_DeviceDescriptor; } else if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) { diff --git a/bootloaders/diskloader/src/USBDesc.cpp b/bootloaders/diskloader/src/USBDesc.cpp index ade072a..b143687 100644 --- a/bootloaders/diskloader/src/USBDesc.cpp +++ b/bootloaders/diskloader/src/USBDesc.cpp @@ -47,18 +47,12 @@ const u16 STRING_IMANUFACTURER[12] = { }; -//#ifdef CDC_ENABLED -DeviceDescriptor USB_DeviceDescriptorA = D_DEVICE(0X02,0X00,0X00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); -//#else -DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); -//#endif - +DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0X02,0X00,0X00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); Config USB_ConfigDescriptor = { D_CONFIG(sizeof(Config),INTERFACE_COUNT), -#ifdef CDC_ENABLED // CDC { D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1), @@ -76,12 +70,14 @@ Config USB_ConfigDescriptor = D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,0x40,0), D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,0x40,0) }, -#endif + +#ifdef HID_ENABLED // HID { D_INTERFACE(HID_INTERFACE,1,3,0,0), D_HIDREPORT(30), D_ENDPOINT(USB_ENDPOINT_IN (HID_ENDPOINT_INT),USB_ENDPOINT_TYPE_INTERRUPT,0x40,0x40) } +#endif }; diff --git a/bootloaders/diskloader/src/USBDesc.h b/bootloaders/diskloader/src/USBDesc.h index a970fa4..3a7fc55 100644 --- a/bootloaders/diskloader/src/USBDesc.h +++ b/bootloaders/diskloader/src/USBDesc.h @@ -16,36 +16,31 @@ ** SOFTWARE. */ - -#ifdef CDC_ENABLED - -#define CDC_ACM_INTERFACE 0 // CDC ACM -#define CDC_DATA_INTERFACE 1 // CDC Data -#define CDC_ENDPOINT_ACM 1 -#define CDC_ENDPOINT_OUT 2 -#define CDC_ENDPOINT_IN 3 - -#define HID_INTERFACE 2 // HID Interface -#define HID_ENDPOINT_INT 4 - -#define INTERFACE_COUNT 3 // 2 for cdc + 1 for hid - -#else - -#define HID_INTERFACE 2 // HID Interface -#define HID_ENDPOINT_INT 4 - -#define INTERFACE_COUNT 1 // 1 for hid - -#endif +#ifndef HID_ENABLED // HID is NOT enabled + #define CDC_ACM_INTERFACE 0 // CDC ACM + #define CDC_DATA_INTERFACE 1 // CDC Data + #define CDC_ENDPOINT_ACM 1 + #define CDC_ENDPOINT_OUT 2 + #define CDC_ENDPOINT_IN 3 + #define INTERFACE_COUNT 2 // 2 for CDC +#else // HID is enabled + #define CDC_ACM_INTERFACE 0 // CDC ACM + #define CDC_DATA_INTERFACE 1 // CDC Data + #define CDC_ENDPOINT_ACM 1 + #define CDC_ENDPOINT_OUT 2 + #define CDC_ENDPOINT_IN 3 + #define HID_INTERFACE 2 // HID Interface + #define HID_ENDPOINT_INT 4 + #define INTERFACE_COUNT 3 // 2 for CDC + 1 for hid +#endif typedef struct { ConfigDescriptor config; -#ifdef CDC_ENABLED CDCDescriptor cdc; -#endif +#ifdef HID_ENABLED HIDDescriptor hid; +#endif } Config; extern Config USB_ConfigDescriptor PROGMEM; -- cgit v1.2.3-18-g5258 From dbec0f0058fdf33ef95b57f130c5ff8986f5c359 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 10 Jan 2012 15:38:26 -0500 Subject: made the bootloader's LED control macro names less offensive TX_LED_OFF() instead of TXLED0, etc. --- bootloaders/diskloader/src/DiskLoader.cpp | 14 +++++++------- bootloaders/diskloader/src/Platform.h | 12 ++++++------ bootloaders/diskloader/src/USBCore.cpp | 12 ++++++------ 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/bootloaders/diskloader/src/DiskLoader.cpp b/bootloaders/diskloader/src/DiskLoader.cpp index 09f59a7..f5df8a4 100644 --- a/bootloaders/diskloader/src/DiskLoader.cpp +++ b/bootloaders/diskloader/src/DiskLoader.cpp @@ -114,9 +114,9 @@ int main() uint8_t MCUSR_state = MCUSR; // store the reason for the reset MCUSR &= ~(1 << WDRF); // must clear the watchdog reset flag before disabling and reenabling WDT wdt_disable(); - TXLED0; - RXLED0; - LED0; + TX_LED_OFF(); + RX_LED_OFF(); + L_LED_OFF(); if (MCUSR_state & (1< p) - LED0; + L_LED_OFF(); else - LED1; + L_LED_ON(); } void StartSketch() { - TXLED0; // switch off the RX and TX LEDs before starting the user sketch - RXLED0; + TX_LED_OFF(); // switch off the RX and TX LEDs before starting the user sketch + RX_LED_OFF(); UDCON = 1; // Detatch USB UDIEN = 0; asm volatile ( // Reset vector to run firmware diff --git a/bootloaders/diskloader/src/Platform.h b/bootloaders/diskloader/src/Platform.h index fcce0a1..2e90334 100644 --- a/bootloaders/diskloader/src/Platform.h +++ b/bootloaders/diskloader/src/Platform.h @@ -28,12 +28,12 @@ typedef unsigned long u32; #define OEM_NAME 'l','e','o','n','a','r','d','o' // 8 chars #define BOARD_INIT() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); CPU_PRESCALE(0); DISABLE_JTAG(); -#define LED0 PORTC &= ~(1<<7) -#define LED1 PORTC |= (1<<7) -#define TXLED0 PORTD |= (1<<5) -#define TXLED1 PORTD &= ~(1<<5) -#define RXLED0 PORTB |= (1<<0) -#define RXLED1 PORTB &= ~(1<<0) +#define L_LED_OFF() PORTC &= ~(1<<7) +#define L_LED_ON() PORTC |= (1<<7) +#define TX_LED_OFF() PORTD |= (1<<5) +#define TX_LED_ON() PORTD &= ~(1<<5) +#define RX_LED_OFF() PORTB |= (1<<0) +#define RX_LED_ON() PORTB &= ~(1<<0) #define TRANSFER_PGM 0x80 #define TRANSFER_RELEASE 0x40 diff --git a/bootloaders/diskloader/src/USBCore.cpp b/bootloaders/diskloader/src/USBCore.cpp index 64f5852..160e6cf 100644 --- a/bootloaders/diskloader/src/USBCore.cpp +++ b/bootloaders/diskloader/src/USBCore.cpp @@ -89,7 +89,7 @@ static inline void ClearOUT(void) static void Send(volatile const u8* data, u8 count) { - TXLED1; // light the TX LED + TX_LED_ON(); // light the TX LED TxLEDPulse = TX_RX_LED_PULSE_MS; while (count--) UEDATX = *data++; @@ -97,7 +97,7 @@ void Send(volatile const u8* data, u8 count) void Recv(volatile u8* data, u8 count) { - RXLED1; // light the RX LED + RX_LED_ON(); // light the RX LED RxLEDPulse = TX_RX_LED_PULSE_MS; while (count--) *data++ = UEDATX; @@ -105,14 +105,14 @@ void Recv(volatile u8* data, u8 count) static inline u8 Recv8() { - RXLED1; // light the RX LED + RX_LED_ON(); // light the RX LED RxLEDPulse = TX_RX_LED_PULSE_MS; return UEDATX; } static inline void Send8(u8 d) { - TXLED1; // light the TX LED + TX_LED_ON(); // light the TX LED TxLEDPulse = TX_RX_LED_PULSE_MS; UEDATX = d; } @@ -473,9 +473,9 @@ void USBGeneralInterrupt() { // check whether the one-shot period has elapsed. if so, turn off the LED if (TxLEDPulse && !(--TxLEDPulse)) - TXLED0; + TX_LED_OFF(); if (RxLEDPulse && !(--RxLEDPulse)) - RXLED0; + RX_LED_OFF(); if (!_ejected) _timeout = 0; -- cgit v1.2.3-18-g5258 From 94443a2a7700976c148843c2bb7d46e05744cff8 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 10 Jan 2012 15:51:44 -0500 Subject: got rid of u8, u16, u32 typedefs in Diskloader done to bring types in line with others in Arduino core --- bootloaders/diskloader/src/DiskLoader.cpp | 60 +++++++------- bootloaders/diskloader/src/Platform.h | 11 +-- bootloaders/diskloader/src/USBCore.cpp | 118 ++++++++++++++-------------- bootloaders/diskloader/src/USBCore.h | 126 +++++++++++++++--------------- bootloaders/diskloader/src/USBDesc.cpp | 8 +- bootloaders/diskloader/src/USBDesc.h | 8 +- 6 files changed, 163 insertions(+), 168 deletions(-) diff --git a/bootloaders/diskloader/src/DiskLoader.cpp b/bootloaders/diskloader/src/DiskLoader.cpp index f5df8a4..d14c7fb 100644 --- a/bootloaders/diskloader/src/DiskLoader.cpp +++ b/bootloaders/diskloader/src/DiskLoader.cpp @@ -26,15 +26,15 @@ void entrypoint(void) ::); } -u8 _flashbuf[128]; -u8 _inSync; -u8 _ok; -extern volatile u8 _ejected; -extern volatile u16 _timeout; +uint8_t _flashbuf[128]; +uint8_t _inSync; +uint8_t _ok; +extern volatile uint8_t _ejected; +extern volatile uint16_t _timeout; -void Program(u8 ep, u16 page, u8 count) +void Program(uint8_t ep, uint16_t page, uint8_t count) { - u8 write = page < 30*1024; // Don't write over firmware please + uint8_t write = page < 30*1024; // Don't write over firmware please if (write) boot_page_erase(page); @@ -46,9 +46,9 @@ void Program(u8 ep, u16 page, u8 count) boot_spm_busy_wait(); // Wait until the memory is erased. count >>= 1; - u16* p = (u16*)page; - u16* b = (u16*)_flashbuf; - for (u8 i = 0; i < count; i++) + uint16_t* p = (uint16_t*)page; + uint16_t* b = (uint16_t*)_flashbuf; + for (uint8_t i = 0; i < count; i++) boot_page_fill(p++, b[i]); boot_page_write(page); @@ -78,8 +78,8 @@ int USBGetChar(); #define STK_READ_PAGE 0x74 // 't' #define STK_READ_SIGN 0x75 // 'u' -extern const u8 _readSize[] PROGMEM; -const u8 _readSize[] = +extern const uint8_t _readSize[] PROGMEM; +const uint8_t _readSize[] = { STK_GET_PARAMETER, 1, STK_SET_DEVICE, 20, @@ -91,8 +91,8 @@ const u8 _readSize[] = 0,0 }; -extern const u8 _consts[] PROGMEM; -const u8 _consts[] = +extern const uint8_t _consts[] PROGMEM; +const uint8_t _consts[] = { SIGNATURE_0, SIGNATURE_1, @@ -131,18 +131,18 @@ int main() for(;;) { - u8* packet = _flashbuf; - u16 address = 0; + uint8_t* packet = _flashbuf; + uint16_t address = 0; for (;;) { - u8 cmd = getch(); + uint8_t cmd = getch(); // Read packet contents - u8 len; - const u8* rs = _readSize; + uint8_t len; + const uint8_t* rs = _readSize; for(;;) { - u8 c = pgm_read_byte(rs++); + uint8_t c = pgm_read_byte(rs++); len = pgm_read_byte(rs++); if (c == cmd || c == 0) break; @@ -152,11 +152,11 @@ int main() Recv(CDC_RX,packet,len); // Send a response - u8 send = 0; - const u8* pgm = _consts+7; // 0 + uint8_t send = 0; + const uint8_t* pgm = _consts+7; // 0 if (STK_GET_PARAMETER == cmd) { - u8 i = packet[0] - 0x80; + uint8_t i = packet[0] - 0x80; if (i > 2) i = (i == 0x18) ? 3 : 4; // 0x80:HW_VER,0x81:SW_MAJOR,0x82:SW_MINOR,0x18:3 or 0 pgm = _consts + i + 3; @@ -179,7 +179,7 @@ int main() else if (STK_LOAD_ADDRESS == cmd) { - address = *((u16*)packet); // word addresses + address = *((uint16_t*)packet); // word addresses address += address; } @@ -191,7 +191,7 @@ int main() else if (STK_READ_PAGE == cmd) { send = packet[1]; - pgm = (const u8*)address; + pgm = (const uint8_t*)address; address += send; // not sure of this is required } @@ -216,15 +216,15 @@ int main() } // Nice breathing LED indicates we are in the firmware -u16 _pulse; +uint16_t _pulse; void LEDPulse() { _pulse += 4; - u8 p = _pulse >> 9; + uint8_t p = _pulse >> 9; if (p > 63) p = 127-p; p += p; - if (((u8)_pulse) > p) + if (((uint8_t)_pulse) > p) L_LED_OFF(); else L_LED_ON(); @@ -234,7 +234,7 @@ void StartSketch() { TX_LED_OFF(); // switch off the RX and TX LEDs before starting the user sketch RX_LED_OFF(); - UDCON = 1; // Detatch USB + UDCON = 1; // Detach USB UDIEN = 0; asm volatile ( // Reset vector to run firmware "clr r30\n" @@ -245,7 +245,7 @@ void StartSketch() void Reset() { - wdt_enable(WDTO_15MS); + wdt_enable(WDTO_15MS); // reset the microcontroller to reinitialize all IO and other registers for (;;) ; } diff --git a/bootloaders/diskloader/src/Platform.h b/bootloaders/diskloader/src/Platform.h index 2e90334..57dc7d5 100644 --- a/bootloaders/diskloader/src/Platform.h +++ b/bootloaders/diskloader/src/Platform.h @@ -11,11 +11,6 @@ #include #include -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned long u32; - - #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) #define DISABLE_JTAG() MCUCR = (1 << JTD) | (1 << IVCE) | (0 << PUD); MCUCR = (1 << JTD) | (0 << IVSEL) | (0 << IVCE) | (0 << PUD); @@ -39,9 +34,9 @@ typedef unsigned long u32; #define TRANSFER_RELEASE 0x40 #define TRANSFER_ZERO 0x20 -void Transfer(u8 ep, const u8* data, int len); -void Recv(u8 ep, u8* dst, u8 len); -void Program(u8 ep, u16 page, u8 count); +void Transfer(uint8_t ep, const uint8_t* data, int len); +void Recv(uint8_t ep, uint8_t* dst, uint8_t len); +void Program(uint8_t ep, uint16_t page, uint8_t count); /* HID is not fully-supported in the bootloader - can be enabled for testing, but note the descriptor report and other parts are diff --git a/bootloaders/diskloader/src/USBCore.cpp b/bootloaders/diskloader/src/USBCore.cpp index 160e6cf..ac5d081 100644 --- a/bootloaders/diskloader/src/USBCore.cpp +++ b/bootloaders/diskloader/src/USBCore.cpp @@ -31,8 +31,8 @@ /** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ #define TX_RX_LED_PULSE_MS 100 -u8 TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ -u8 RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ +uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ +uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ void Reset(); @@ -41,11 +41,11 @@ void Reset(); typedef struct { - u32 dwDTERate; - u8 bCharFormat; - u8 bParityType; - u8 bDataBits; - u8 lineState; + uint32_t dwDTERate; + uint8_t bCharFormat; + uint8_t bParityType; + uint8_t bDataBits; + uint8_t lineState; } LineInfo; static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; @@ -54,9 +54,9 @@ static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; //================================================================== // 4 bytes of RAM -volatile u8 _usbConfiguration; -volatile u8 _ejected; -volatile u16 _timeout; +volatile uint8_t _usbConfiguration; +volatile uint8_t _ejected; +volatile uint16_t _timeout; static inline void WaitIN(void) { @@ -74,7 +74,7 @@ static inline void WaitOUT(void) ; } -static inline u8 WaitForINOrOUT() +static inline uint8_t WaitForINOrOUT() { while (!(UEINTX & ((1<> 8) @@ -324,7 +324,7 @@ extern const u8 _rawHID[] PROGMEM; #define RAWHID_TX_SIZE 64 #define RAWHID_RX_SIZE 64 -const u8 _rawHID[] = +const uint8_t _rawHID[] = { // RAW HID 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 @@ -346,15 +346,15 @@ const u8 _rawHID[] = 0xC0 // end collection }; -u8 _cdcComposite = 0; +uint8_t _cdcComposite = 0; bool SendDescriptor() { Setup& setup = _setup; - u16 desc_length = 0; - const u8* desc_addr = 0; + uint16_t desc_length = 0; + const uint8_t* desc_addr = 0; - u8 t = setup.wValueH; + uint8_t t = setup.wValueH; if (0x22 == t) { #ifdef HID_ENABLED @@ -363,23 +363,23 @@ bool SendDescriptor() #endif } else if (USB_DEVICE_DESCRIPTOR_TYPE == t) { - desc_addr = (const u8*)&USB_DeviceDescriptor; + desc_addr = (const uint8_t*)&USB_DeviceDescriptor; } else if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) { - desc_addr = (const u8*)&USB_ConfigDescriptor; + desc_addr = (const uint8_t*)&USB_ConfigDescriptor; desc_length = sizeof(USB_ConfigDescriptor); } else if (USB_STRING_DESCRIPTOR_TYPE == t) { if (setup.wValueL == 0) - desc_addr = (const u8*)&STRING_LANGUAGE; + desc_addr = (const uint8_t*)&STRING_LANGUAGE; else if (setup.wValueL == IPRODUCT) - desc_addr = (const u8*)&STRING_IPRODUCT; + desc_addr = (const uint8_t*)&STRING_IPRODUCT; else if (setup.wValueL == ISERIAL) - desc_addr = (const u8*)&STRING_SERIAL; + desc_addr = (const uint8_t*)&STRING_SERIAL; else if (setup.wValueL == IMANUFACTURER) - desc_addr = (const u8*)&STRING_IMANUFACTURER; + desc_addr = (const uint8_t*)&STRING_IMANUFACTURER; else return false; } else @@ -393,13 +393,13 @@ bool SendDescriptor() // Send descriptor // EP0 is 64 bytes long // RWAL and FIFOCON don't work on EP0 - u16 n = 0; + uint16_t n = 0; do { if (!WaitForINOrOUT()) return false; Send8(pgm_read_byte(&desc_addr[n++])); - u8 clr = n & 0x3F; + uint8_t clr = n & 0x3F; if (!clr) ClearIN(); // Fifo is full, release this packet } while (n < desc_length); @@ -413,7 +413,7 @@ void USBSetupInterrupt() return; Setup& setup = _setup; // global saves ~30 bytes - Recv((u8*)&setup,8); + Recv((uint8_t*)&setup,8); ClearSetupInt(); if (setup.bmRequestType & DEVICETOHOST) @@ -422,7 +422,7 @@ void USBSetupInterrupt() ClearIN(); bool ok = true; - u8 r = setup.bRequest; + uint8_t r = setup.bRequest; if (SET_ADDRESS == r) { WaitIN(); @@ -458,7 +458,7 @@ void USBSetupInterrupt() void USBGeneralInterrupt() { - u8 udint = UDINT; + uint8_t udint = UDINT; UDINT = 0; // End of Reset @@ -493,7 +493,7 @@ int USBGetChar() // Read a char if (HasData(CDC_RX)) { - u8 c = Recv8(); + uint8_t c = Recv8(); if (!ReadWriteAllowed()) ReleaseRX(); return c; diff --git a/bootloaders/diskloader/src/USBCore.h b/bootloaders/diskloader/src/USBCore.h index 537c0ec..313ae3b 100644 --- a/bootloaders/diskloader/src/USBCore.h +++ b/bootloaders/diskloader/src/USBCore.h @@ -97,32 +97,32 @@ // Device typedef struct { - u8 len; // 18 - u8 dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE - u16 usbVersion; // 0x200 - u8 deviceClass; - u8 deviceSubClass; - u8 deviceProtocol; - u8 packetSize0; // Packet 0 - u16 idVendor; - u16 idProduct; - u16 deviceVersion; // 0x100 - u8 iManufacturer; - u8 iProduct; - u8 iSerialNumber; - u8 bNumConfigurations; + uint8_t len; // 18 + uint8_t dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE + uint16_t usbVersion; // 0x200 + uint8_t deviceClass; + uint8_t deviceSubClass; + uint8_t deviceProtocol; + uint8_t packetSize0; // Packet 0 + uint16_t idVendor; + uint16_t idProduct; + uint16_t deviceVersion; // 0x100 + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; } DeviceDescriptor; // Config typedef struct { - u8 len; // 9 - u8 dtype; // 2 - u16 clen; // total length - u8 numInterfaces; - u8 config; - u8 iconfig; - u8 attributes; - u8 maxPower; + uint8_t len; // 9 + uint8_t dtype; // 2 + uint16_t clen; // total length + uint8_t numInterfaces; + uint8_t config; + uint8_t iconfig; + uint8_t attributes; + uint8_t maxPower; } ConfigDescriptor; // String @@ -130,58 +130,58 @@ typedef struct { // Interface typedef struct { - u8 len; // 9 - u8 dtype; // 4 - u8 number; - u8 alternate; - u8 numEndpoints; - u8 interfaceClass; - u8 interfaceSubClass; - u8 protocol; - u8 iInterface; + uint8_t len; // 9 + uint8_t dtype; // 4 + uint8_t number; + uint8_t alternate; + uint8_t numEndpoints; + uint8_t interfaceClass; + uint8_t interfaceSubClass; + uint8_t protocol; + uint8_t iInterface; } InterfaceDescriptor; // Endpoint typedef struct { - u8 len; // 7 - u8 dtype; // 5 - u8 addr; - u8 attr; - u16 packetSize; - u8 interval; + uint8_t len; // 7 + uint8_t dtype; // 5 + uint8_t addr; + uint8_t attr; + uint16_t packetSize; + uint8_t interval; } EndpointDescriptor; // Interface Association Descriptor // Used to bind 2 interfaces together in CDC compostite device typedef struct { - u8 len; // 8 - u8 dtype; // 11 - u8 firstInterface; - u8 interfaceCount; - u8 functionClass; - u8 funtionSubClass; - u8 functionProtocol; - u8 iInterface; + uint8_t len; // 8 + uint8_t dtype; // 11 + uint8_t firstInterface; + uint8_t interfaceCount; + uint8_t functionClass; + uint8_t funtionSubClass; + uint8_t functionProtocol; + uint8_t iInterface; } IADDescriptor; // CDC CS interface descriptor typedef struct { - u8 len; // 5 - u8 dtype; // 0x24 - u8 subtype; - u8 d0; - u8 d1; + uint8_t len; // 5 + uint8_t dtype; // 0x24 + uint8_t subtype; + uint8_t d0; + uint8_t d1; } CDCCSInterfaceDescriptor; typedef struct { - u8 len; // 4 - u8 dtype; // 0x24 - u8 subtype; - u8 d0; + uint8_t len; // 4 + uint8_t dtype; // 0x24 + uint8_t subtype; + uint8_t d0; } CDCCSInterfaceDescriptor4; typedef struct @@ -204,15 +204,15 @@ typedef struct typedef struct { - u8 len; // 9 - u8 dtype; // 0x21 - u8 addr; - u8 versionL; // 0x101 - u8 versionH; // 0x101 - u8 country; - u8 desctype; // 0x22 report - u8 descLenL; - u8 descLenH; + uint8_t len; // 9 + uint8_t dtype; // 0x21 + uint8_t addr; + uint8_t versionL; // 0x101 + uint8_t versionH; // 0x101 + uint8_t country; + uint8_t desctype; // 0x22 report + uint8_t descLenL; + uint8_t descLenH; } HIDDescDescriptor; typedef struct diff --git a/bootloaders/diskloader/src/USBDesc.cpp b/bootloaders/diskloader/src/USBDesc.cpp index b143687..7160868 100644 --- a/bootloaders/diskloader/src/USBDesc.cpp +++ b/bootloaders/diskloader/src/USBDesc.cpp @@ -22,17 +22,17 @@ //==================================================================================================== // Actual device descriptors -const u16 STRING_LANGUAGE[2] = { +const uint16_t STRING_LANGUAGE[2] = { (3<<8) | (2+2), 0x0409 // English }; -const u16 STRING_SERIAL[13] = { +const uint16_t STRING_SERIAL[13] = { (3<<8) | (2+2*12), USB_SERIAL_STRING }; -const u16 STRING_IPRODUCT[28] = { +const uint16_t STRING_IPRODUCT[28] = { (3<<8) | (2+2*27), #if USB_PID == USB_PID_LEONARDO 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o',' ','b','o','o','t','l','o','a','d','e','r' @@ -41,7 +41,7 @@ const u16 STRING_IPRODUCT[28] = { #endif }; -const u16 STRING_IMANUFACTURER[12] = { +const uint16_t STRING_IMANUFACTURER[12] = { (3<<8) | (2+2*11), 'A','r','d','u','i','n','o',' ','L','L','C' }; diff --git a/bootloaders/diskloader/src/USBDesc.h b/bootloaders/diskloader/src/USBDesc.h index 3a7fc55..fa962e9 100644 --- a/bootloaders/diskloader/src/USBDesc.h +++ b/bootloaders/diskloader/src/USBDesc.h @@ -47,10 +47,10 @@ extern Config USB_ConfigDescriptor PROGMEM; extern DeviceDescriptor USB_DeviceDescriptor PROGMEM; extern DeviceDescriptor USB_DeviceDescriptorA PROGMEM; -extern const u16 STRING_LANGUAGE[2] PROGMEM; -extern const u16 STRING_IPRODUCT[28] PROGMEM; -extern const u16 STRING_IMANUFACTURER[12] PROGMEM; -extern const u16 STRING_SERIAL[13] PROGMEM; +extern const uint16_t STRING_LANGUAGE[2] PROGMEM; +extern const uint16_t STRING_IPRODUCT[28] PROGMEM; +extern const uint16_t STRING_IMANUFACTURER[12] PROGMEM; +extern const uint16_t STRING_SERIAL[13] PROGMEM; #define IMANUFACTURER 1 #define IPRODUCT 2 -- cgit v1.2.3-18-g5258 From 0ea882bc247b3cca8788f329d9fe802107fa8960 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 10 Jan 2012 16:00:46 -0500 Subject: fixed warning when comparing pgm_read_word(0) to -1 (thanks, Limor Fried and Phillip Torrone) --- bootloaders/diskloader/src/DiskLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootloaders/diskloader/src/DiskLoader.cpp b/bootloaders/diskloader/src/DiskLoader.cpp index d14c7fb..7ef6fa8 100644 --- a/bootloaders/diskloader/src/DiskLoader.cpp +++ b/bootloaders/diskloader/src/DiskLoader.cpp @@ -117,7 +117,7 @@ int main() TX_LED_OFF(); RX_LED_OFF(); L_LED_OFF(); - if (MCUSR_state & (1< Date: Tue, 10 Jan 2012 16:09:56 -0500 Subject: changed USB PID for Leonardo and Micro bootloaders sketch and bootloader will use different PIDs to distinguish one from the other. --- bootloaders/diskloader/DiskLoader-Leonardo.hex | 2 +- bootloaders/diskloader/Makefile | 20 ++++++++++---------- bootloaders/diskloader/src/Platform.h | 4 ++-- bootloaders/diskloader/src/USBDesc.cpp | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/bootloaders/diskloader/DiskLoader-Leonardo.hex b/bootloaders/diskloader/DiskLoader-Leonardo.hex index af819fb..95ca57b 100644 --- a/bootloaders/diskloader/DiskLoader-Leonardo.hex +++ b/bootloaders/diskloader/DiskLoader-Leonardo.hex @@ -10,7 +10,7 @@ :1078900074006C006F0061006400650072001803E2 :1078A000410072006400750069006E006F002000E6 :1078B0004C004C0043001201000202000040412332 -:1078C000340000010002030109024B0002010080A4 +:1078C000300000010002030109024B0002010080A8 :1078D00032080B000202020100090400000102024A :1078E0000000052400100105240101010424020206 :1078F000052406000107058103100040090401006A diff --git a/bootloaders/diskloader/Makefile b/bootloaders/diskloader/Makefile index 6ac3db3..ed4ba78 100644 --- a/bootloaders/diskloader/Makefile +++ b/bootloaders/diskloader/Makefile @@ -9,21 +9,22 @@ CC = avr-gcc # BOARD2 MCU = atmega32u4 -AVR_FREQ = 16000000L +AVR_FREQ = 16000000L -# Specify the Arduino model using the assigned PID. This is used by Descriptors.c -# to set PID and product descriptor string -# Arduino Leonardo PID -ARDUINO_MODEL_PID = 0x0034 -# Arduino Micro PID -#ARDUINO_MODEL_PID = 0x0035 +# Specify the Arduino model using the assigned PID. This is used by Descriptors.c +# to set PID and product descriptor string + +# Arduino Leonardo bootloader PID +ARDUINO_MODEL_PID = 0x0030 +# Arduino Micro bootloader PID +#ARDUINO_MODEL_PID = 0x0031 # Change if your programmer is different AVRDUDE_PROGRAMMER = avrispmkII AVRDUDE_PORT = usb # program name should not be changed... -PROGRAM = DiskLoader +PROGRAM = DiskLoader AVRDUDE = avrdude AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -p $(MCU) @@ -43,7 +44,6 @@ LDFLAGS = $(COMMON) LDFLAGS += -Wl,-gc-sections,-Map=DiskLoader.map,--section-start=.text=0x7800,--relax LDFLAGS += -nodefaultlibs -nostartfiles - ## Intel Hex file production flags HEX_EEPROM_FLAGS = -j .eeprom HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" @@ -102,4 +102,4 @@ size: $(TARGET) # @avr-size -C --mcu=${MCU} ${TARGET}.elf program: $(TARGET).hex - $(AVRDUDE) $(AVRDUDE_FLAGS) -B 5 -u -U flash:w:$(TARGET).hex \ No newline at end of file + $(AVRDUDE) $(AVRDUDE_FLAGS) -B 1 -u -U flash:w:$(TARGET).hex \ No newline at end of file diff --git a/bootloaders/diskloader/src/Platform.h b/bootloaders/diskloader/src/Platform.h index 57dc7d5..9d18e80 100644 --- a/bootloaders/diskloader/src/Platform.h +++ b/bootloaders/diskloader/src/Platform.h @@ -14,8 +14,8 @@ #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) #define DISABLE_JTAG() MCUCR = (1 << JTD) | (1 << IVCE) | (0 << PUD); MCUCR = (1 << JTD) | (0 << IVSEL) | (0 << IVCE) | (0 << PUD); -#define USB_PID_LEONARDO 0x0034 -#define USB_PID_MICRO 0x0035 +#define USB_PID_LEONARDO_BOOTLOADER 0x0030 +#define USB_PID_MICRO_BOOTLOADER 0x0031 #define USB_VID 0x2341 // arduino LLC vid #define USB_PID ARDUINO_MODEL_PID // passed in by Makefile - 0x0034 for Leonardo, 0x0035 for MIcro diff --git a/bootloaders/diskloader/src/USBDesc.cpp b/bootloaders/diskloader/src/USBDesc.cpp index 7160868..a634d4d 100644 --- a/bootloaders/diskloader/src/USBDesc.cpp +++ b/bootloaders/diskloader/src/USBDesc.cpp @@ -34,9 +34,9 @@ const uint16_t STRING_SERIAL[13] = { const uint16_t STRING_IPRODUCT[28] = { (3<<8) | (2+2*27), -#if USB_PID == USB_PID_LEONARDO +#if USB_PID == USB_PID_LEONARDO_BOOTLOADER 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o',' ','b','o','o','t','l','o','a','d','e','r' -#elif USB_PID == USB_PID_MICRO +#elif USB_PID == USB_PID_MICRO_BOOTLOADER 'A','r','d','u','i','n','o',' ','M','i','c','r','o',' ','b','o','o','t','l','o','a','d','e','r',' ',' ',' ' #endif }; -- cgit v1.2.3-18-g5258 From 0ed2d3c95309ecf5905ec06624fc68955fdbd2d0 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 10 Jan 2012 16:29:47 -0500 Subject: renamed DiskLoader to Caterina (after Leonardo's mom) --- boards.txt | 8 +- bootloaders/caterina/Caterina-Leonardo.hex | 115 ++++++ bootloaders/caterina/Makefile | 105 +++++ bootloaders/caterina/src/Caterina.cpp | 251 ++++++++++++ bootloaders/caterina/src/Platform.h | 49 +++ bootloaders/caterina/src/USBCore.cpp | 510 +++++++++++++++++++++++++ bootloaders/caterina/src/USBCore.h | 246 ++++++++++++ bootloaders/caterina/src/USBDesc.cpp | 83 ++++ bootloaders/caterina/src/USBDesc.h | 60 +++ bootloaders/diskloader/DiskLoader-Leonardo.hex | 115 ------ bootloaders/diskloader/Makefile | 105 ----- bootloaders/diskloader/src/DiskLoader.cpp | 251 ------------ bootloaders/diskloader/src/Platform.h | 49 --- bootloaders/diskloader/src/USBCore.cpp | 510 ------------------------- bootloaders/diskloader/src/USBCore.h | 246 ------------ bootloaders/diskloader/src/USBDesc.cpp | 83 ---- bootloaders/diskloader/src/USBDesc.h | 60 --- 17 files changed, 1423 insertions(+), 1423 deletions(-) create mode 100644 bootloaders/caterina/Caterina-Leonardo.hex create mode 100644 bootloaders/caterina/Makefile create mode 100644 bootloaders/caterina/src/Caterina.cpp create mode 100644 bootloaders/caterina/src/Platform.h create mode 100644 bootloaders/caterina/src/USBCore.cpp create mode 100644 bootloaders/caterina/src/USBCore.h create mode 100644 bootloaders/caterina/src/USBDesc.cpp create mode 100644 bootloaders/caterina/src/USBDesc.h delete mode 100644 bootloaders/diskloader/DiskLoader-Leonardo.hex delete mode 100644 bootloaders/diskloader/Makefile delete mode 100644 bootloaders/diskloader/src/DiskLoader.cpp delete mode 100644 bootloaders/diskloader/src/Platform.h delete mode 100644 bootloaders/diskloader/src/USBCore.cpp delete mode 100644 bootloaders/diskloader/src/USBCore.h delete mode 100644 bootloaders/diskloader/src/USBDesc.cpp delete mode 100644 bootloaders/diskloader/src/USBDesc.h diff --git a/boards.txt b/boards.txt index 9c155c1..834db54 100644 --- a/boards.txt +++ b/boards.txt @@ -153,8 +153,8 @@ leonardo.upload.speed=1200 leonardo.bootloader.low_fuses=0xde leonardo.bootloader.high_fuses=0xda leonardo.bootloader.extended_fuses=0xcb -leonardo.bootloader.path=diskloader -leonardo.bootloader.file=DiskLoader-Leonardo.hex +leonardo.bootloader.path=caterina +leonardo.bootloader.file=Caterina-Leonardo.hex leonardo.bootloader.unlock_bits=0x3F leonardo.bootloader.lock_bits=0x2F leonardo.build.mcu=atmega32u4 @@ -171,8 +171,8 @@ leonardo.build.variant=leonardo #micro.bootloader.low_fuses=0xde #micro.bootloader.high_fuses=0xda #micro.bootloader.extended_fuses=0xcb -#micro.bootloader.path=diskloader -#micro.bootloader.file=DiskLoader-Micro.hex +#micro.bootloader.path=caterina +#micro.bootloader.file=Caterina-Micro.hex #micro.bootloader.unlock_bits=0x3F #micro.bootloader.lock_bits=0x2F #micro.build.mcu=atmega32u4 diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex new file mode 100644 index 0000000..95ca57b --- /dev/null +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -0,0 +1,115 @@ +:1078000011241FBECFEFDAE0DEBFCDBFF5C04101CE +:1078100042144505560455026403740300001E9586 +:1078200087020110030000C1808106C0FF0A000C1E +:10783000A10185037508150026FF00954009018107 +:1078400002954009029102C0040309041A033000A2 +:1078500030003000300030003000300030003100A7 +:1078600037003000310038034100720064007500B9 +:1078700069006E006F0020004C0065006F006E0014 +:107880006100720064006F00200062006F006F00F2 +:1078900074006C006F0061006400650072001803E2 +:1078A000410072006400750069006E006F002000E6 +:1078B0004C004C0043001201000202000040412332 +:1078C000300000010002030109024B0002010080A8 +:1078D00032080B000202020100090400000102024A +:1078E0000000052400100105240101010424020206 +:1078F000052406000107058103100040090401006A +:10790000020A00000007050202400000070583028A +:107910004000000020918A0130918B012C5F3F4F85 +:1079200030938B0120938A01C901892F992786956D +:10793000982F803418F08FE7891B982F990F921792 +:1079400010F447980895479A08955D9A289A81E01F +:107950008093E0001092E200EE27FF27099408953B +:1079600028E088E190E00FB6F894A8958093600035 +:107970000FBE20936000FFCF0F931F93CF93DF9331 +:10798000982FEB01042F10E088E76030780730F47F +:1079900011E083E0FB0180935700E895892F68E0B0 +:1079A00071E0402F06D1112311F107B600FCFDCF85 +:1079B000402F4695FE01A8E0B1E020E031E009C08B +:1079C0008D919D910C0130935700E89511243296CA +:1079D0002F5F2417A8F385E0FE0180935700E895F8 +:1079E00007B600FCFDCF81E180935700E895DF9159 +:1079F000CF911F910F91089584B794B7977F94BF4B +:107A000098E10FB6F89490936000109260000FBE5A +:107A10005D9A289A479883FF08C0E0E0F0E08591DE +:107A200094918F5F9F4F09F090DF3F9A209A559A6B +:107A300090E8909361001092610081E885BF95BF46 +:107A40009FD084E18093880180E180938901E0E008 +:107A5000F0E0859194918F5F9F4F19F081E08093C2 +:107A60008F01EE24FF24BB24B39454EFC52E51E0C4 +:107A7000D52E0DD2082F8EE098E7FC012491319687 +:107A800002964491201711F02223B9F71092910128 +:107A90001092900182E068E071E08BD0013479F4BB +:107AA000609108016058633028F0683111F064E09B +:107AB00001C063E0C62FD0E0CF5DD7480EC00635C9 +:107AC00071F480910801803311F011E022C080919F +:107AD0000A01C82FD0E0C25ED74811E022C00537A6 +:107AE00021F413E0CEE1D8E71CC0053539F4E0906D +:107AF0000801F0900901EE0CFF1C0AC0043631F4B5 +:107B000082E0B7014091090137DF02C0043721F05C +:107B100010E0C5E2D8E705C010910901E701E10EC8 +:107B2000F11CB5D18097B1F483E068E871E041E0E1 +:107B300050E059D0112329F0412F50E083E8BE01D5 +:107B400052D083E469E871E041E050E04CD0013567 +:107B500009F08FCFD0929101C0929001B0928F0125 +:107B6000EE24FF2486CFFC01289884E680938D01C3 +:107B700004C08091F100819361506623D1F708958C +:107B8000109291011092900110928E0110928F012B +:107B900081E08093D70080EA8093D80082E189BD9C +:107BA00009B400FEFDCF80E98093D8001092E00078 +:107BB0000895FB018093E90024E69BE611C08091C3 +:107BC000E80085FFFCCF289820938D018091F1007B +:107BD00081938091E80085FD02C09093E8004150B8 +:107BE000442369F70895982FFB01282F207287708E +:107BF0008093E90064E63AE317C08091E80085FFCE +:107C0000FCCF97FF02C0849101C080813196211181 +:107C100080E05D9860938C018093F1008091E80092 +:107C200085FD02C03093E800415050408FEF4F3F38 +:107C3000580719F796FF03C08AE38093E800089578 +:107C400080919301813299F45D9884E680938C0150 +:107C500020E030E003C080818093F100F901E05022 +:107C6000FF4F2F5F3F4F28303105A9F714C08032F6 +:107C700061F48091E80082FFFCCF80E091E067E052 +:107C800072DF8BEF8093E80006C0823221F480918E +:107C900094018093070181E00895809195018232DB +:107CA00019F420E030E024C0813019F426EB38E7E5 +:107CB0001FC0823029F48BE490E028EC38E71BC029 +:107CC000833009F048C080919401882319F428E496 +:107CD00038E70EC0823019F426E638E709C0833051 +:107CE00019F42CE438E704C08130A9F52EE938E70F +:107CF000F901849190E04091980150919901BC0163 +:107D00004817590708F4BA0190918C0140E050E0FF +:107D1000AEEF8091E8008570E1F38091E80082FD8C +:107D200016C0F901E40FF51F4F5F5F4FE4915D98B6 +:107D3000E093F100842F8F7311F4A093E80094E690 +:107D40004617570730F390938C0181E00895909384 +:107D50008C0180E0089580E008951092E900809100 +:107D6000E80083FF61C082E991E068E0FCDE82EF19 +:107D70008093E8008091920187FF05C08091E80020 +:107D800080FFFCCF03C08EEF8093E80080919301C9 +:107D9000853051F48091E80080FFFCCF8091940100 +:107DA00080688093E30039C08930E1F480919401C8 +:107DB00080938E01E7E2F8E791E031E026E39093CB +:107DC000E9003093EB0084918093EC002093ED0068 +:107DD0009F5F3196943099F78EE78093EA00109276 +:107DE000EA001BC0883049F490918E015D9884E6CA +:107DF00080938C019093F10010C0882339F45D9832 +:107E000084E680938C011092F10007C0863011F453 +:107E100044DF01C015DF882321F08EEF8093E80056 +:107E2000089581E28093EB0008958091E100109223 +:107E3000E100282F83FF0CC01092E90081E08093BD +:107E4000EB001092EC0082E38093ED0010928E0123 +:107E500022FF1CC080918C01882331F081508093D7 +:107E60008C01882309F45D9A80918D01882331F07B +:107E7000815080938D01882309F4289A80918F0185 +:107E8000882321F4109291011092900108951F937C +:107E9000CF93DF9312E0C0E9D1E05FDFC6DF10933C +:107EA000E9008091E80085FF13C0289884E680935C +:107EB0008D019091F1008091E80085FD03C08BE673 +:107EC0008093E800892F90E0DF91CF911F91089572 +:107ED00080919001909191010197909391018093ED +:107EE00090018091900190919101892B09F438DDE6 +:0A7EF000CE010197F1F70EDDD0CFAF +:087EFA0000E10000000000009F +:040000030000780081 +:00000001FF diff --git a/bootloaders/caterina/Makefile b/bootloaders/caterina/Makefile new file mode 100644 index 0000000..4bb41c8 --- /dev/null +++ b/bootloaders/caterina/Makefile @@ -0,0 +1,105 @@ +############################################################################### +# Makefile for Caterina (formerly DiskLoader) +############################################################################### + +## General Flags +PROJECT = Caterina +TARGET = Caterina.elf +CC = avr-gcc + +# BOARD2 +MCU = atmega32u4 +AVR_FREQ = 16000000L + +# Specify the Arduino model using the assigned PID. This is used by Descriptors.c +# to set PID and product descriptor string + +# Arduino Leonardo bootloader PID +ARDUINO_MODEL_PID = 0x0030 +# Arduino Micro bootloader PID +#ARDUINO_MODEL_PID = 0x0031 + +# Change if your programmer is different +AVRDUDE_PROGRAMMER = avrispmkII +AVRDUDE_PORT = usb + +# program name should not be changed... +PROGRAM = Caterina + +AVRDUDE = avrdude +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -p $(MCU) + +## Options common to compile, link and assembly rules +COMMON = -mmcu=$(MCU) + +override CFLAGS = -g -Wall -Os -mmcu=$(MCU) -DF_CPU=$(AVR_FREQ) -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) $(DEFS) -ffunction-sections -gdwarf-2 -fdata-sections -fno-split-wide-types + +## Assembly specific flags +ASMFLAGS = $(COMMON) +ASMFLAGS += $(CFLAGS) +ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2 + +## Linker flags +LDFLAGS = $(COMMON) +LDFLAGS += -Wl,-gc-sections,-Map=Caterina.map,--section-start=.text=0x7800,--relax +LDFLAGS += -nodefaultlibs -nostartfiles + +## Intel Hex file production flags +HEX_EEPROM_FLAGS = -j .eeprom +HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" +HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings + +## Objects explicitly added by the user +LINKONLYOBJECTS = + +MODULES := . +SRC_DIR := $(addprefix src/,$(MODULES)) +BUILD_DIR := $(addprefix build/,$(MODULES)) + +SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cpp)) +OBJ := $(patsubst src/%.cpp,build/%.o,$(SRC)) +DEP := $(OBJ:%.o=%.d) +INCLUDES := $(addprefix -I,$(SRC_DIR)) + +vpath %.cpp $(SRC_DIR) + +.PHONY: all checkdirs clean + +all: checkdirs $(TARGET) Caterina.hex Caterina.lss size + +-include $(DEP) + +checkdirs: $(BUILD_DIR) + +$(BUILD_DIR): + @mkdir -p $@ + +clean: + @rm -rf build/ + @rm -f *.hex + @rm -f *.elf + @rm -f *.lss + @rm -f *.map + +define make-goal +$1/%.o: %.cpp + $(CC) $(INCLUDES) $(CFLAGS) -c $$< -MD -o $$@ +endef + +$(foreach bdir,$(BUILD_DIR),$(eval $(call make-goal,$(bdir)))) + +$(TARGET): $(OBJ) + $(CC) $(LDFLAGS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) $^ -o $@ + +%.hex: $(TARGET) + avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ + +%.lss: $(TARGET) + avr-objdump -h -S $< > $@ + +size: $(TARGET) + @echo +# @avr-size -C --mcu=${MCU} ${TARGET}.elf + +program: $(TARGET).hex + $(AVRDUDE) $(AVRDUDE_FLAGS) -B 1 -u -U flash:w:$(TARGET).hex \ No newline at end of file diff --git a/bootloaders/caterina/src/Caterina.cpp b/bootloaders/caterina/src/Caterina.cpp new file mode 100644 index 0000000..7ef6fa8 --- /dev/null +++ b/bootloaders/caterina/src/Caterina.cpp @@ -0,0 +1,251 @@ + + +#include "Platform.h" + +// This bootloader creates a composite Serial device +// +// The serial interface supports a STK500v1 protocol that is very similar to optiboot +// +// The bootloader will timeout and start the firmware after a few hundred milliseconds +// if a usb connection is not detected. +// +// The tweakier code is to keep the bootloader below 2k (no interrupt table, for example) + +extern "C" +void entrypoint(void) __attribute__ ((naked)) __attribute__ ((section (".vectors"))); +void entrypoint(void) +{ + asm volatile ( + "eor r1, r1\n" // Zero register + "out 0x3F, r1\n" // SREG + "ldi r28, 0xFF\n" + "ldi r29, 0x0A\n" + "out 0x3E, r29\n" // SPH + "out 0x3D, r28\n" // SPL + "rjmp main" // Stack is all set up, start the main code + ::); +} + +uint8_t _flashbuf[128]; +uint8_t _inSync; +uint8_t _ok; +extern volatile uint8_t _ejected; +extern volatile uint16_t _timeout; + +void Program(uint8_t ep, uint16_t page, uint8_t count) +{ + uint8_t write = page < 30*1024; // Don't write over firmware please + if (write) + boot_page_erase(page); + + Recv(ep,_flashbuf,count); // Read while page is erasing + + if (!write) + return; + + boot_spm_busy_wait(); // Wait until the memory is erased. + + count >>= 1; + uint16_t* p = (uint16_t*)page; + uint16_t* b = (uint16_t*)_flashbuf; + for (uint8_t i = 0; i < count; i++) + boot_page_fill(p++, b[i]); + + boot_page_write(page); + boot_spm_busy_wait(); + boot_rww_enable (); +} + +void StartSketch(); +int USBGetChar(); +#define getch USBGetChar + +#define HW_VER 0x02 +#define SW_MAJOR 0x01 +#define SW_MINOR 0x10 + +#define STK_OK 0x10 +#define STK_INSYNC 0x14 // ' ' +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' + +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' + +extern const uint8_t _readSize[] PROGMEM; +const uint8_t _readSize[] = +{ + STK_GET_PARAMETER, 1, + STK_SET_DEVICE, 20, + STK_SET_DEVICE_EXT, 5, + STK_UNIVERSAL, 4, + STK_LOAD_ADDRESS, 2, + STK_PROG_PAGE, 3, + STK_READ_PAGE, 3, + 0,0 +}; + +extern const uint8_t _consts[] PROGMEM; +const uint8_t _consts[] = +{ + SIGNATURE_0, + SIGNATURE_1, + SIGNATURE_2, + HW_VER, // Hardware version + SW_MAJOR, // Software major version + SW_MINOR, // Software minor version + 0x03, // Unknown but seems to be required by avr studio 3.56 + 0x00, // +}; + + +void USBInit(void); +int main(void) __attribute__ ((naked)); + +// STK500v1 main loop, very similar to optiboot in protocol and implementation +int main() +{ + uint8_t MCUSR_state = MCUSR; // store the reason for the reset + MCUSR &= ~(1 << WDRF); // must clear the watchdog reset flag before disabling and reenabling WDT + wdt_disable(); + TX_LED_OFF(); + RX_LED_OFF(); + L_LED_OFF(); + if (MCUSR_state & (1< 2) + i = (i == 0x18) ? 3 : 4; // 0x80:HW_VER,0x81:SW_MAJOR,0x82:SW_MINOR,0x18:3 or 0 + pgm = _consts + i + 3; + send = 1; + } + + else if (STK_UNIVERSAL == cmd) + { + if (packet[0] == 0x30) + pgm = _consts + packet[2]; // read signature + send = 1; + } + + // Read signature bytes + else if (STK_READ_SIGN == cmd) + { + pgm = _consts; + send = 3; + } + + else if (STK_LOAD_ADDRESS == cmd) + { + address = *((uint16_t*)packet); // word addresses + address += address; + } + + else if (STK_PROG_PAGE == cmd) + { + Program(CDC_RX,address,packet[1]); + } + + else if (STK_READ_PAGE == cmd) + { + send = packet[1]; + pgm = (const uint8_t*)address; + address += send; // not sure of this is required + } + + // Check sync + if (getch() != ' ') + break; + Transfer(CDC_TX,&_inSync,1); + + // Send result + if (send) + Transfer(CDC_TX|TRANSFER_PGM,pgm,send); // All from pgm memory + + // Send ok + Transfer(CDC_TX|TRANSFER_RELEASE,&_ok,1); + + if (cmd == 'Q') + break; + } + _timeout = 500; // wait a moment before exiting the bootloader - may need to finish responding to 'Q' for example + _ejected = 1; + } +} + +// Nice breathing LED indicates we are in the firmware +uint16_t _pulse; +void LEDPulse() +{ + _pulse += 4; + uint8_t p = _pulse >> 9; + if (p > 63) + p = 127-p; + p += p; + if (((uint8_t)_pulse) > p) + L_LED_OFF(); + else + L_LED_ON(); +} + +void StartSketch() +{ + TX_LED_OFF(); // switch off the RX and TX LEDs before starting the user sketch + RX_LED_OFF(); + UDCON = 1; // Detach USB + UDIEN = 0; + asm volatile ( // Reset vector to run firmware + "clr r30\n" + "clr r31\n" + "ijmp\n" + ::); +} + +void Reset() +{ + wdt_enable(WDTO_15MS); // reset the microcontroller to reinitialize all IO and other registers + for (;;) + ; +} diff --git a/bootloaders/caterina/src/Platform.h b/bootloaders/caterina/src/Platform.h new file mode 100644 index 0000000..9d18e80 --- /dev/null +++ b/bootloaders/caterina/src/Platform.h @@ -0,0 +1,49 @@ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) +#define DISABLE_JTAG() MCUCR = (1 << JTD) | (1 << IVCE) | (0 << PUD); MCUCR = (1 << JTD) | (0 << IVSEL) | (0 << IVCE) | (0 << PUD); + +#define USB_PID_LEONARDO_BOOTLOADER 0x0030 +#define USB_PID_MICRO_BOOTLOADER 0x0031 +#define USB_VID 0x2341 // arduino LLC vid +#define USB_PID ARDUINO_MODEL_PID // passed in by Makefile - 0x0034 for Leonardo, 0x0035 for MIcro + +#define USB_SERIAL_STRING '0','0','0','0','0','0','0','0','1','7','0','1' + +#define OEM_NAME 'l','e','o','n','a','r','d','o' // 8 chars +#define BOARD_INIT() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); CPU_PRESCALE(0); DISABLE_JTAG(); +#define L_LED_OFF() PORTC &= ~(1<<7) +#define L_LED_ON() PORTC |= (1<<7) +#define TX_LED_OFF() PORTD |= (1<<5) +#define TX_LED_ON() PORTD &= ~(1<<5) +#define RX_LED_OFF() PORTB |= (1<<0) +#define RX_LED_ON() PORTB &= ~(1<<0) + +#define TRANSFER_PGM 0x80 +#define TRANSFER_RELEASE 0x40 +#define TRANSFER_ZERO 0x20 + +void Transfer(uint8_t ep, const uint8_t* data, int len); +void Recv(uint8_t ep, uint8_t* dst, uint8_t len); +void Program(uint8_t ep, uint16_t page, uint8_t count); + +/* HID is not fully-supported in the bootloader - can be enabled + for testing, but note the descriptor report and other parts are + not complete */ +//#define HID_ENABLED + +#include "USBCore.h" +#include "USBDesc.h" + + diff --git a/bootloaders/caterina/src/USBCore.cpp b/bootloaders/caterina/src/USBCore.cpp new file mode 100644 index 0000000..ac5d081 --- /dev/null +++ b/bootloaders/caterina/src/USBCore.cpp @@ -0,0 +1,510 @@ + + +/* Copyright (c) 2010, Peter Barrett +** +** Permission to use, copy, modify, and/or distribute this software for +** any purpose with or without fee is hereby granted, provided that the +** above copyright notice and this permission notice appear in all copies. +** +** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR +** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +*/ + +#include "Platform.h" + +#define CDC_TX CDC_ENDPOINT_IN +#define CDC_RX CDC_ENDPOINT_OUT + +#define EP_TYPE_CONTROL 0x00 +#define EP_TYPE_BULK_IN 0x81 +#define EP_TYPE_BULK_OUT 0x80 +#define EP_TYPE_INTERRUPT_IN 0xC1 +#define EP_TYPE_INTERRUPT_OUT 0xC0 +#define EP_TYPE_ISOCHRONOUS_IN 0x41 +#define EP_TYPE_ISOCHRONOUS_OUT 0x40 + +/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ +#define TX_RX_LED_PULSE_MS 100 +uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ +uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ + +void Reset(); + +//================================================================== +//================================================================== + +typedef struct +{ + uint32_t dwDTERate; + uint8_t bCharFormat; + uint8_t bParityType; + uint8_t bDataBits; + uint8_t lineState; +} LineInfo; + +static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; + +//================================================================== +//================================================================== + +// 4 bytes of RAM +volatile uint8_t _usbConfiguration; +volatile uint8_t _ejected; +volatile uint16_t _timeout; + +static inline void WaitIN(void) +{ + while (!(UEINTX & (1<> 8) + +#define RAWHID_USAGE_PAGE 0xFFC0 +#define RAWHID_USAGE 0x0C00 +#define RAWHID_TX_SIZE 64 +#define RAWHID_RX_SIZE 64 + +const uint8_t _rawHID[] = +{ + // RAW HID + 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 + 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), + + 0xA1, 0x01, // Collection 0x01 + 0x85, 0x03, // REPORT_ID (3) + 0x75, 0x08, // report size = 8 bits + 0x15, 0x00, // logical minimum = 0 + 0x26, 0xFF, 0x00, // logical maximum = 255 + + 0x95, 64, // report count TX + 0x09, 0x01, // usage + 0x81, 0x02, // Input (array) + + 0x95, 64, // report count RX + 0x09, 0x02, // usage + 0x91, 0x02, // Output (array) + 0xC0 // end collection +}; + +uint8_t _cdcComposite = 0; + +bool SendDescriptor() +{ + Setup& setup = _setup; + uint16_t desc_length = 0; + const uint8_t* desc_addr = 0; + + uint8_t t = setup.wValueH; + if (0x22 == t) + { +#ifdef HID_ENABLED + desc_addr = _rawHID; + desc_length = sizeof(desc_length); +#endif + } else if (USB_DEVICE_DESCRIPTOR_TYPE == t) + { + desc_addr = (const uint8_t*)&USB_DeviceDescriptor; + } + else if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) + { + desc_addr = (const uint8_t*)&USB_ConfigDescriptor; + desc_length = sizeof(USB_ConfigDescriptor); + } + else if (USB_STRING_DESCRIPTOR_TYPE == t) + { + if (setup.wValueL == 0) + desc_addr = (const uint8_t*)&STRING_LANGUAGE; + else if (setup.wValueL == IPRODUCT) + desc_addr = (const uint8_t*)&STRING_IPRODUCT; + else if (setup.wValueL == ISERIAL) + desc_addr = (const uint8_t*)&STRING_SERIAL; + else if (setup.wValueL == IMANUFACTURER) + desc_addr = (const uint8_t*)&STRING_IMANUFACTURER; + else + return false; + } else + return false; + + if (desc_length == 0) + desc_length = pgm_read_byte(desc_addr); + if (setup.wLength < desc_length) + desc_length = setup.wLength; + + // Send descriptor + // EP0 is 64 bytes long + // RWAL and FIFOCON don't work on EP0 + uint16_t n = 0; + do + { + if (!WaitForINOrOUT()) + return false; + Send8(pgm_read_byte(&desc_addr[n++])); + uint8_t clr = n & 0x3F; + if (!clr) + ClearIN(); // Fifo is full, release this packet + } while (n < desc_length); + return true; +} + +void USBSetupInterrupt() +{ + SetEP(0); + if (!ReceivedSetupInt()) + return; + + Setup& setup = _setup; // global saves ~30 bytes + Recv((uint8_t*)&setup,8); + ClearSetupInt(); + + if (setup.bmRequestType & DEVICETOHOST) + WaitIN(); + else + ClearIN(); + + bool ok = true; + uint8_t r = setup.bRequest; + if (SET_ADDRESS == r) + { + WaitIN(); + UDADDR = setup.wValueL | (1<> 8) & 0xFF) + +#define CDC_V1_10 0x0110 +#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02 + +#define CDC_CALL_MANAGEMENT 0x01 +#define CDC_ABSTRACT_CONTROL_MODEL 0x02 +#define CDC_HEADER 0x00 +#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02 +#define CDC_UNION 0x06 +#define CDC_CS_INTERFACE 0x24 +#define CDC_CS_ENDPOINT 0x25 +#define CDC_DATA_INTERFACE_CLASS 0x0A + + +// Device +typedef struct { + uint8_t len; // 18 + uint8_t dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE + uint16_t usbVersion; // 0x200 + uint8_t deviceClass; + uint8_t deviceSubClass; + uint8_t deviceProtocol; + uint8_t packetSize0; // Packet 0 + uint16_t idVendor; + uint16_t idProduct; + uint16_t deviceVersion; // 0x100 + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} DeviceDescriptor; + +// Config +typedef struct { + uint8_t len; // 9 + uint8_t dtype; // 2 + uint16_t clen; // total length + uint8_t numInterfaces; + uint8_t config; + uint8_t iconfig; + uint8_t attributes; + uint8_t maxPower; +} ConfigDescriptor; + +// String + +// Interface +typedef struct +{ + uint8_t len; // 9 + uint8_t dtype; // 4 + uint8_t number; + uint8_t alternate; + uint8_t numEndpoints; + uint8_t interfaceClass; + uint8_t interfaceSubClass; + uint8_t protocol; + uint8_t iInterface; +} InterfaceDescriptor; + +// Endpoint +typedef struct +{ + uint8_t len; // 7 + uint8_t dtype; // 5 + uint8_t addr; + uint8_t attr; + uint16_t packetSize; + uint8_t interval; +} EndpointDescriptor; + +// Interface Association Descriptor +// Used to bind 2 interfaces together in CDC compostite device +typedef struct +{ + uint8_t len; // 8 + uint8_t dtype; // 11 + uint8_t firstInterface; + uint8_t interfaceCount; + uint8_t functionClass; + uint8_t funtionSubClass; + uint8_t functionProtocol; + uint8_t iInterface; +} IADDescriptor; + +// CDC CS interface descriptor +typedef struct +{ + uint8_t len; // 5 + uint8_t dtype; // 0x24 + uint8_t subtype; + uint8_t d0; + uint8_t d1; +} CDCCSInterfaceDescriptor; + +typedef struct +{ + uint8_t len; // 4 + uint8_t dtype; // 0x24 + uint8_t subtype; + uint8_t d0; +} CDCCSInterfaceDescriptor4; + +typedef struct +{ + IADDescriptor iad; // Only needed on compound device + + // Control + InterfaceDescriptor cif; // + CDCCSInterfaceDescriptor header; + CDCCSInterfaceDescriptor callManagement; + CDCCSInterfaceDescriptor4 controlManagement; + CDCCSInterfaceDescriptor functionalDescriptor; + EndpointDescriptor cifin; + + // Data + InterfaceDescriptor dif; + EndpointDescriptor in; + EndpointDescriptor out; +} CDCDescriptor; + +typedef struct +{ + uint8_t len; // 9 + uint8_t dtype; // 0x21 + uint8_t addr; + uint8_t versionL; // 0x101 + uint8_t versionH; // 0x101 + uint8_t country; + uint8_t desctype; // 0x22 report + uint8_t descLenL; + uint8_t descLenH; +} HIDDescDescriptor; + +typedef struct +{ + InterfaceDescriptor hid; + HIDDescDescriptor desc; + EndpointDescriptor in; +} HIDDescriptor; + +#define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \ + { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs } + +#define D_CONFIG(_totalLength,_interfaces) \ + { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(100) } + +#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \ + { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 } + +#define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \ + { 7, 5, _addr,_attr,_packetSize, _interval } + +#define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \ + { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 } + +#define D_HIDREPORT(_descriptorLength) \ + { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 } + +#define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 } +#define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 } + +#endif \ No newline at end of file diff --git a/bootloaders/caterina/src/USBDesc.cpp b/bootloaders/caterina/src/USBDesc.cpp new file mode 100644 index 0000000..a634d4d --- /dev/null +++ b/bootloaders/caterina/src/USBDesc.cpp @@ -0,0 +1,83 @@ + + +/* Copyright (c) 2011, Peter Barrett +** +** Permission to use, copy, modify, and/or distribute this software for +** any purpose with or without fee is hereby granted, provided that the +** above copyright notice and this permission notice appear in all copies. +** +** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR +** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +*/ + +#include "Platform.h" + +//==================================================================================================== +//==================================================================================================== +// Actual device descriptors + +const uint16_t STRING_LANGUAGE[2] = { + (3<<8) | (2+2), + 0x0409 // English +}; + +const uint16_t STRING_SERIAL[13] = { + (3<<8) | (2+2*12), + USB_SERIAL_STRING +}; + +const uint16_t STRING_IPRODUCT[28] = { + (3<<8) | (2+2*27), +#if USB_PID == USB_PID_LEONARDO_BOOTLOADER + 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o',' ','b','o','o','t','l','o','a','d','e','r' +#elif USB_PID == USB_PID_MICRO_BOOTLOADER + 'A','r','d','u','i','n','o',' ','M','i','c','r','o',' ','b','o','o','t','l','o','a','d','e','r',' ',' ',' ' +#endif +}; + +const uint16_t STRING_IMANUFACTURER[12] = { + (3<<8) | (2+2*11), + 'A','r','d','u','i','n','o',' ','L','L','C' +}; + + +DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0X02,0X00,0X00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); + +Config USB_ConfigDescriptor = +{ + D_CONFIG(sizeof(Config),INTERFACE_COUNT), + + // CDC + { + D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1), + + // CDC communication interface + D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), + D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd) + D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management + D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,2), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported + D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 + D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40), + + // CDC data interface + D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0), + D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,0x40,0), + D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,0x40,0) + }, + +#ifdef HID_ENABLED + // HID + { + D_INTERFACE(HID_INTERFACE,1,3,0,0), + D_HIDREPORT(30), + D_ENDPOINT(USB_ENDPOINT_IN (HID_ENDPOINT_INT),USB_ENDPOINT_TYPE_INTERRUPT,0x40,0x40) + } +#endif +}; + diff --git a/bootloaders/caterina/src/USBDesc.h b/bootloaders/caterina/src/USBDesc.h new file mode 100644 index 0000000..fa962e9 --- /dev/null +++ b/bootloaders/caterina/src/USBDesc.h @@ -0,0 +1,60 @@ + + +/* Copyright (c) 2011, Peter Barrett +** +** Permission to use, copy, modify, and/or distribute this software for +** any purpose with or without fee is hereby granted, provided that the +** above copyright notice and this permission notice appear in all copies. +** +** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR +** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +*/ + +#ifndef HID_ENABLED // HID is NOT enabled + #define CDC_ACM_INTERFACE 0 // CDC ACM + #define CDC_DATA_INTERFACE 1 // CDC Data + #define CDC_ENDPOINT_ACM 1 + #define CDC_ENDPOINT_OUT 2 + #define CDC_ENDPOINT_IN 3 + #define INTERFACE_COUNT 2 // 2 for CDC +#else // HID is enabled + #define CDC_ACM_INTERFACE 0 // CDC ACM + #define CDC_DATA_INTERFACE 1 // CDC Data + #define CDC_ENDPOINT_ACM 1 + #define CDC_ENDPOINT_OUT 2 + #define CDC_ENDPOINT_IN 3 + #define HID_INTERFACE 2 // HID Interface + #define HID_ENDPOINT_INT 4 + #define INTERFACE_COUNT 3 // 2 for CDC + 1 for hid +#endif + +typedef struct +{ + ConfigDescriptor config; + CDCDescriptor cdc; +#ifdef HID_ENABLED + HIDDescriptor hid; +#endif +} Config; + +extern Config USB_ConfigDescriptor PROGMEM; +extern DeviceDescriptor USB_DeviceDescriptor PROGMEM; +extern DeviceDescriptor USB_DeviceDescriptorA PROGMEM; + +extern const uint16_t STRING_LANGUAGE[2] PROGMEM; +extern const uint16_t STRING_IPRODUCT[28] PROGMEM; +extern const uint16_t STRING_IMANUFACTURER[12] PROGMEM; +extern const uint16_t STRING_SERIAL[13] PROGMEM; + +#define IMANUFACTURER 1 +#define IPRODUCT 2 +#define ISERIAL 3 + +#define CDC_TX CDC_ENDPOINT_IN +#define CDC_RX CDC_ENDPOINT_OUT \ No newline at end of file diff --git a/bootloaders/diskloader/DiskLoader-Leonardo.hex b/bootloaders/diskloader/DiskLoader-Leonardo.hex deleted file mode 100644 index 95ca57b..0000000 --- a/bootloaders/diskloader/DiskLoader-Leonardo.hex +++ /dev/null @@ -1,115 +0,0 @@ -:1078000011241FBECFEFDAE0DEBFCDBFF5C04101CE -:1078100042144505560455026403740300001E9586 -:1078200087020110030000C1808106C0FF0A000C1E -:10783000A10185037508150026FF00954009018107 -:1078400002954009029102C0040309041A033000A2 -:1078500030003000300030003000300030003100A7 -:1078600037003000310038034100720064007500B9 -:1078700069006E006F0020004C0065006F006E0014 -:107880006100720064006F00200062006F006F00F2 -:1078900074006C006F0061006400650072001803E2 -:1078A000410072006400750069006E006F002000E6 -:1078B0004C004C0043001201000202000040412332 -:1078C000300000010002030109024B0002010080A8 -:1078D00032080B000202020100090400000102024A -:1078E0000000052400100105240101010424020206 -:1078F000052406000107058103100040090401006A -:10790000020A00000007050202400000070583028A -:107910004000000020918A0130918B012C5F3F4F85 -:1079200030938B0120938A01C901892F992786956D -:10793000982F803418F08FE7891B982F990F921792 -:1079400010F447980895479A08955D9A289A81E01F -:107950008093E0001092E200EE27FF27099408953B -:1079600028E088E190E00FB6F894A8958093600035 -:107970000FBE20936000FFCF0F931F93CF93DF9331 -:10798000982FEB01042F10E088E76030780730F47F -:1079900011E083E0FB0180935700E895892F68E0B0 -:1079A00071E0402F06D1112311F107B600FCFDCF85 -:1079B000402F4695FE01A8E0B1E020E031E009C08B -:1079C0008D919D910C0130935700E89511243296CA -:1079D0002F5F2417A8F385E0FE0180935700E895F8 -:1079E00007B600FCFDCF81E180935700E895DF9159 -:1079F000CF911F910F91089584B794B7977F94BF4B -:107A000098E10FB6F89490936000109260000FBE5A -:107A10005D9A289A479883FF08C0E0E0F0E08591DE -:107A200094918F5F9F4F09F090DF3F9A209A559A6B -:107A300090E8909361001092610081E885BF95BF46 -:107A40009FD084E18093880180E180938901E0E008 -:107A5000F0E0859194918F5F9F4F19F081E08093C2 -:107A60008F01EE24FF24BB24B39454EFC52E51E0C4 -:107A7000D52E0DD2082F8EE098E7FC012491319687 -:107A800002964491201711F02223B9F71092910128 -:107A90001092900182E068E071E08BD0013479F4BB -:107AA000609108016058633028F0683111F064E09B -:107AB00001C063E0C62FD0E0CF5DD7480EC00635C9 -:107AC00071F480910801803311F011E022C080919F -:107AD0000A01C82FD0E0C25ED74811E022C00537A6 -:107AE00021F413E0CEE1D8E71CC0053539F4E0906D -:107AF0000801F0900901EE0CFF1C0AC0043631F4B5 -:107B000082E0B7014091090137DF02C0043721F05C -:107B100010E0C5E2D8E705C010910901E701E10EC8 -:107B2000F11CB5D18097B1F483E068E871E041E0E1 -:107B300050E059D0112329F0412F50E083E8BE01D5 -:107B400052D083E469E871E041E050E04CD0013567 -:107B500009F08FCFD0929101C0929001B0928F0125 -:107B6000EE24FF2486CFFC01289884E680938D01C3 -:107B700004C08091F100819361506623D1F708958C -:107B8000109291011092900110928E0110928F012B -:107B900081E08093D70080EA8093D80082E189BD9C -:107BA00009B400FEFDCF80E98093D8001092E00078 -:107BB0000895FB018093E90024E69BE611C08091C3 -:107BC000E80085FFFCCF289820938D018091F1007B -:107BD00081938091E80085FD02C09093E8004150B8 -:107BE000442369F70895982FFB01282F207287708E -:107BF0008093E90064E63AE317C08091E80085FFCE -:107C0000FCCF97FF02C0849101C080813196211181 -:107C100080E05D9860938C018093F1008091E80092 -:107C200085FD02C03093E800415050408FEF4F3F38 -:107C3000580719F796FF03C08AE38093E800089578 -:107C400080919301813299F45D9884E680938C0150 -:107C500020E030E003C080818093F100F901E05022 -:107C6000FF4F2F5F3F4F28303105A9F714C08032F6 -:107C700061F48091E80082FFFCCF80E091E067E052 -:107C800072DF8BEF8093E80006C0823221F480918E -:107C900094018093070181E00895809195018232DB -:107CA00019F420E030E024C0813019F426EB38E7E5 -:107CB0001FC0823029F48BE490E028EC38E71BC029 -:107CC000833009F048C080919401882319F428E496 -:107CD00038E70EC0823019F426E638E709C0833051 -:107CE00019F42CE438E704C08130A9F52EE938E70F -:107CF000F901849190E04091980150919901BC0163 -:107D00004817590708F4BA0190918C0140E050E0FF -:107D1000AEEF8091E8008570E1F38091E80082FD8C -:107D200016C0F901E40FF51F4F5F5F4FE4915D98B6 -:107D3000E093F100842F8F7311F4A093E80094E690 -:107D40004617570730F390938C0181E00895909384 -:107D50008C0180E0089580E008951092E900809100 -:107D6000E80083FF61C082E991E068E0FCDE82EF19 -:107D70008093E8008091920187FF05C08091E80020 -:107D800080FFFCCF03C08EEF8093E80080919301C9 -:107D9000853051F48091E80080FFFCCF8091940100 -:107DA00080688093E30039C08930E1F480919401C8 -:107DB00080938E01E7E2F8E791E031E026E39093CB -:107DC000E9003093EB0084918093EC002093ED0068 -:107DD0009F5F3196943099F78EE78093EA00109276 -:107DE000EA001BC0883049F490918E015D9884E6CA -:107DF00080938C019093F10010C0882339F45D9832 -:107E000084E680938C011092F10007C0863011F453 -:107E100044DF01C015DF882321F08EEF8093E80056 -:107E2000089581E28093EB0008958091E100109223 -:107E3000E100282F83FF0CC01092E90081E08093BD -:107E4000EB001092EC0082E38093ED0010928E0123 -:107E500022FF1CC080918C01882331F081508093D7 -:107E60008C01882309F45D9A80918D01882331F07B -:107E7000815080938D01882309F4289A80918F0185 -:107E8000882321F4109291011092900108951F937C -:107E9000CF93DF9312E0C0E9D1E05FDFC6DF10933C -:107EA000E9008091E80085FF13C0289884E680935C -:107EB0008D019091F1008091E80085FD03C08BE673 -:107EC0008093E800892F90E0DF91CF911F91089572 -:107ED00080919001909191010197909391018093ED -:107EE00090018091900190919101892B09F438DDE6 -:0A7EF000CE010197F1F70EDDD0CFAF -:087EFA0000E10000000000009F -:040000030000780081 -:00000001FF diff --git a/bootloaders/diskloader/Makefile b/bootloaders/diskloader/Makefile deleted file mode 100644 index ed4ba78..0000000 --- a/bootloaders/diskloader/Makefile +++ /dev/null @@ -1,105 +0,0 @@ -############################################################################### -# Makefile for DiskLoader -############################################################################### - -## General Flags -PROJECT = DiskLoader -TARGET = DiskLoader.elf -CC = avr-gcc - -# BOARD2 -MCU = atmega32u4 -AVR_FREQ = 16000000L - -# Specify the Arduino model using the assigned PID. This is used by Descriptors.c -# to set PID and product descriptor string - -# Arduino Leonardo bootloader PID -ARDUINO_MODEL_PID = 0x0030 -# Arduino Micro bootloader PID -#ARDUINO_MODEL_PID = 0x0031 - -# Change if your programmer is different -AVRDUDE_PROGRAMMER = avrispmkII -AVRDUDE_PORT = usb - -# program name should not be changed... -PROGRAM = DiskLoader - -AVRDUDE = avrdude -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -p $(MCU) - -## Options common to compile, link and assembly rules -COMMON = -mmcu=$(MCU) - -override CFLAGS = -g -Wall -Os -mmcu=$(MCU) -DF_CPU=$(AVR_FREQ) -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) $(DEFS) -ffunction-sections -gdwarf-2 -fdata-sections -fno-split-wide-types - -## Assembly specific flags -ASMFLAGS = $(COMMON) -ASMFLAGS += $(CFLAGS) -ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2 - -## Linker flags -LDFLAGS = $(COMMON) -LDFLAGS += -Wl,-gc-sections,-Map=DiskLoader.map,--section-start=.text=0x7800,--relax -LDFLAGS += -nodefaultlibs -nostartfiles - -## Intel Hex file production flags -HEX_EEPROM_FLAGS = -j .eeprom -HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" -HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings - -## Objects explicitly added by the user -LINKONLYOBJECTS = - -MODULES := . -SRC_DIR := $(addprefix src/,$(MODULES)) -BUILD_DIR := $(addprefix build/,$(MODULES)) - -SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cpp)) -OBJ := $(patsubst src/%.cpp,build/%.o,$(SRC)) -DEP := $(OBJ:%.o=%.d) -INCLUDES := $(addprefix -I,$(SRC_DIR)) - -vpath %.cpp $(SRC_DIR) - -.PHONY: all checkdirs clean - -all: checkdirs $(TARGET) DiskLoader.hex DiskLoader.lss size - --include $(DEP) - -checkdirs: $(BUILD_DIR) - -$(BUILD_DIR): - @mkdir -p $@ - -clean: - @rm -rf build/ - @rm -f *.hex - @rm -f *.elf - @rm -f *.lss - @rm -f *.map - -define make-goal -$1/%.o: %.cpp - $(CC) $(INCLUDES) $(CFLAGS) -c $$< -MD -o $$@ -endef - -$(foreach bdir,$(BUILD_DIR),$(eval $(call make-goal,$(bdir)))) - -$(TARGET): $(OBJ) - $(CC) $(LDFLAGS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) $^ -o $@ - -%.hex: $(TARGET) - avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ - -%.lss: $(TARGET) - avr-objdump -h -S $< > $@ - -size: $(TARGET) - @echo -# @avr-size -C --mcu=${MCU} ${TARGET}.elf - -program: $(TARGET).hex - $(AVRDUDE) $(AVRDUDE_FLAGS) -B 1 -u -U flash:w:$(TARGET).hex \ No newline at end of file diff --git a/bootloaders/diskloader/src/DiskLoader.cpp b/bootloaders/diskloader/src/DiskLoader.cpp deleted file mode 100644 index 7ef6fa8..0000000 --- a/bootloaders/diskloader/src/DiskLoader.cpp +++ /dev/null @@ -1,251 +0,0 @@ - - -#include "Platform.h" - -// This bootloader creates a composite Serial device -// -// The serial interface supports a STK500v1 protocol that is very similar to optiboot -// -// The bootloader will timeout and start the firmware after a few hundred milliseconds -// if a usb connection is not detected. -// -// The tweakier code is to keep the bootloader below 2k (no interrupt table, for example) - -extern "C" -void entrypoint(void) __attribute__ ((naked)) __attribute__ ((section (".vectors"))); -void entrypoint(void) -{ - asm volatile ( - "eor r1, r1\n" // Zero register - "out 0x3F, r1\n" // SREG - "ldi r28, 0xFF\n" - "ldi r29, 0x0A\n" - "out 0x3E, r29\n" // SPH - "out 0x3D, r28\n" // SPL - "rjmp main" // Stack is all set up, start the main code - ::); -} - -uint8_t _flashbuf[128]; -uint8_t _inSync; -uint8_t _ok; -extern volatile uint8_t _ejected; -extern volatile uint16_t _timeout; - -void Program(uint8_t ep, uint16_t page, uint8_t count) -{ - uint8_t write = page < 30*1024; // Don't write over firmware please - if (write) - boot_page_erase(page); - - Recv(ep,_flashbuf,count); // Read while page is erasing - - if (!write) - return; - - boot_spm_busy_wait(); // Wait until the memory is erased. - - count >>= 1; - uint16_t* p = (uint16_t*)page; - uint16_t* b = (uint16_t*)_flashbuf; - for (uint8_t i = 0; i < count; i++) - boot_page_fill(p++, b[i]); - - boot_page_write(page); - boot_spm_busy_wait(); - boot_rww_enable (); -} - -void StartSketch(); -int USBGetChar(); -#define getch USBGetChar - -#define HW_VER 0x02 -#define SW_MAJOR 0x01 -#define SW_MINOR 0x10 - -#define STK_OK 0x10 -#define STK_INSYNC 0x14 // ' ' -#define CRC_EOP 0x20 // 'SPACE' -#define STK_GET_SYNC 0x30 // '0' - -#define STK_GET_PARAMETER 0x41 // 'A' -#define STK_SET_DEVICE 0x42 // 'B' -#define STK_SET_DEVICE_EXT 0x45 // 'E' -#define STK_LOAD_ADDRESS 0x55 // 'U' -#define STK_UNIVERSAL 0x56 // 'V' -#define STK_PROG_PAGE 0x64 // 'd' -#define STK_READ_PAGE 0x74 // 't' -#define STK_READ_SIGN 0x75 // 'u' - -extern const uint8_t _readSize[] PROGMEM; -const uint8_t _readSize[] = -{ - STK_GET_PARAMETER, 1, - STK_SET_DEVICE, 20, - STK_SET_DEVICE_EXT, 5, - STK_UNIVERSAL, 4, - STK_LOAD_ADDRESS, 2, - STK_PROG_PAGE, 3, - STK_READ_PAGE, 3, - 0,0 -}; - -extern const uint8_t _consts[] PROGMEM; -const uint8_t _consts[] = -{ - SIGNATURE_0, - SIGNATURE_1, - SIGNATURE_2, - HW_VER, // Hardware version - SW_MAJOR, // Software major version - SW_MINOR, // Software minor version - 0x03, // Unknown but seems to be required by avr studio 3.56 - 0x00, // -}; - - -void USBInit(void); -int main(void) __attribute__ ((naked)); - -// STK500v1 main loop, very similar to optiboot in protocol and implementation -int main() -{ - uint8_t MCUSR_state = MCUSR; // store the reason for the reset - MCUSR &= ~(1 << WDRF); // must clear the watchdog reset flag before disabling and reenabling WDT - wdt_disable(); - TX_LED_OFF(); - RX_LED_OFF(); - L_LED_OFF(); - if (MCUSR_state & (1< 2) - i = (i == 0x18) ? 3 : 4; // 0x80:HW_VER,0x81:SW_MAJOR,0x82:SW_MINOR,0x18:3 or 0 - pgm = _consts + i + 3; - send = 1; - } - - else if (STK_UNIVERSAL == cmd) - { - if (packet[0] == 0x30) - pgm = _consts + packet[2]; // read signature - send = 1; - } - - // Read signature bytes - else if (STK_READ_SIGN == cmd) - { - pgm = _consts; - send = 3; - } - - else if (STK_LOAD_ADDRESS == cmd) - { - address = *((uint16_t*)packet); // word addresses - address += address; - } - - else if (STK_PROG_PAGE == cmd) - { - Program(CDC_RX,address,packet[1]); - } - - else if (STK_READ_PAGE == cmd) - { - send = packet[1]; - pgm = (const uint8_t*)address; - address += send; // not sure of this is required - } - - // Check sync - if (getch() != ' ') - break; - Transfer(CDC_TX,&_inSync,1); - - // Send result - if (send) - Transfer(CDC_TX|TRANSFER_PGM,pgm,send); // All from pgm memory - - // Send ok - Transfer(CDC_TX|TRANSFER_RELEASE,&_ok,1); - - if (cmd == 'Q') - break; - } - _timeout = 500; // wait a moment before exiting the bootloader - may need to finish responding to 'Q' for example - _ejected = 1; - } -} - -// Nice breathing LED indicates we are in the firmware -uint16_t _pulse; -void LEDPulse() -{ - _pulse += 4; - uint8_t p = _pulse >> 9; - if (p > 63) - p = 127-p; - p += p; - if (((uint8_t)_pulse) > p) - L_LED_OFF(); - else - L_LED_ON(); -} - -void StartSketch() -{ - TX_LED_OFF(); // switch off the RX and TX LEDs before starting the user sketch - RX_LED_OFF(); - UDCON = 1; // Detach USB - UDIEN = 0; - asm volatile ( // Reset vector to run firmware - "clr r30\n" - "clr r31\n" - "ijmp\n" - ::); -} - -void Reset() -{ - wdt_enable(WDTO_15MS); // reset the microcontroller to reinitialize all IO and other registers - for (;;) - ; -} diff --git a/bootloaders/diskloader/src/Platform.h b/bootloaders/diskloader/src/Platform.h deleted file mode 100644 index 9d18e80..0000000 --- a/bootloaders/diskloader/src/Platform.h +++ /dev/null @@ -1,49 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) -#define DISABLE_JTAG() MCUCR = (1 << JTD) | (1 << IVCE) | (0 << PUD); MCUCR = (1 << JTD) | (0 << IVSEL) | (0 << IVCE) | (0 << PUD); - -#define USB_PID_LEONARDO_BOOTLOADER 0x0030 -#define USB_PID_MICRO_BOOTLOADER 0x0031 -#define USB_VID 0x2341 // arduino LLC vid -#define USB_PID ARDUINO_MODEL_PID // passed in by Makefile - 0x0034 for Leonardo, 0x0035 for MIcro - -#define USB_SERIAL_STRING '0','0','0','0','0','0','0','0','1','7','0','1' - -#define OEM_NAME 'l','e','o','n','a','r','d','o' // 8 chars -#define BOARD_INIT() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); CPU_PRESCALE(0); DISABLE_JTAG(); -#define L_LED_OFF() PORTC &= ~(1<<7) -#define L_LED_ON() PORTC |= (1<<7) -#define TX_LED_OFF() PORTD |= (1<<5) -#define TX_LED_ON() PORTD &= ~(1<<5) -#define RX_LED_OFF() PORTB |= (1<<0) -#define RX_LED_ON() PORTB &= ~(1<<0) - -#define TRANSFER_PGM 0x80 -#define TRANSFER_RELEASE 0x40 -#define TRANSFER_ZERO 0x20 - -void Transfer(uint8_t ep, const uint8_t* data, int len); -void Recv(uint8_t ep, uint8_t* dst, uint8_t len); -void Program(uint8_t ep, uint16_t page, uint8_t count); - -/* HID is not fully-supported in the bootloader - can be enabled - for testing, but note the descriptor report and other parts are - not complete */ -//#define HID_ENABLED - -#include "USBCore.h" -#include "USBDesc.h" - - diff --git a/bootloaders/diskloader/src/USBCore.cpp b/bootloaders/diskloader/src/USBCore.cpp deleted file mode 100644 index ac5d081..0000000 --- a/bootloaders/diskloader/src/USBCore.cpp +++ /dev/null @@ -1,510 +0,0 @@ - - -/* Copyright (c) 2010, Peter Barrett -** -** Permission to use, copy, modify, and/or distribute this software for -** any purpose with or without fee is hereby granted, provided that the -** above copyright notice and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR -** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -** SOFTWARE. -*/ - -#include "Platform.h" - -#define CDC_TX CDC_ENDPOINT_IN -#define CDC_RX CDC_ENDPOINT_OUT - -#define EP_TYPE_CONTROL 0x00 -#define EP_TYPE_BULK_IN 0x81 -#define EP_TYPE_BULK_OUT 0x80 -#define EP_TYPE_INTERRUPT_IN 0xC1 -#define EP_TYPE_INTERRUPT_OUT 0xC0 -#define EP_TYPE_ISOCHRONOUS_IN 0x41 -#define EP_TYPE_ISOCHRONOUS_OUT 0x40 - -/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ -#define TX_RX_LED_PULSE_MS 100 -uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ -uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ - -void Reset(); - -//================================================================== -//================================================================== - -typedef struct -{ - uint32_t dwDTERate; - uint8_t bCharFormat; - uint8_t bParityType; - uint8_t bDataBits; - uint8_t lineState; -} LineInfo; - -static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; - -//================================================================== -//================================================================== - -// 4 bytes of RAM -volatile uint8_t _usbConfiguration; -volatile uint8_t _ejected; -volatile uint16_t _timeout; - -static inline void WaitIN(void) -{ - while (!(UEINTX & (1<> 8) - -#define RAWHID_USAGE_PAGE 0xFFC0 -#define RAWHID_USAGE 0x0C00 -#define RAWHID_TX_SIZE 64 -#define RAWHID_RX_SIZE 64 - -const uint8_t _rawHID[] = -{ - // RAW HID - 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 - 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), - - 0xA1, 0x01, // Collection 0x01 - 0x85, 0x03, // REPORT_ID (3) - 0x75, 0x08, // report size = 8 bits - 0x15, 0x00, // logical minimum = 0 - 0x26, 0xFF, 0x00, // logical maximum = 255 - - 0x95, 64, // report count TX - 0x09, 0x01, // usage - 0x81, 0x02, // Input (array) - - 0x95, 64, // report count RX - 0x09, 0x02, // usage - 0x91, 0x02, // Output (array) - 0xC0 // end collection -}; - -uint8_t _cdcComposite = 0; - -bool SendDescriptor() -{ - Setup& setup = _setup; - uint16_t desc_length = 0; - const uint8_t* desc_addr = 0; - - uint8_t t = setup.wValueH; - if (0x22 == t) - { -#ifdef HID_ENABLED - desc_addr = _rawHID; - desc_length = sizeof(desc_length); -#endif - } else if (USB_DEVICE_DESCRIPTOR_TYPE == t) - { - desc_addr = (const uint8_t*)&USB_DeviceDescriptor; - } - else if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) - { - desc_addr = (const uint8_t*)&USB_ConfigDescriptor; - desc_length = sizeof(USB_ConfigDescriptor); - } - else if (USB_STRING_DESCRIPTOR_TYPE == t) - { - if (setup.wValueL == 0) - desc_addr = (const uint8_t*)&STRING_LANGUAGE; - else if (setup.wValueL == IPRODUCT) - desc_addr = (const uint8_t*)&STRING_IPRODUCT; - else if (setup.wValueL == ISERIAL) - desc_addr = (const uint8_t*)&STRING_SERIAL; - else if (setup.wValueL == IMANUFACTURER) - desc_addr = (const uint8_t*)&STRING_IMANUFACTURER; - else - return false; - } else - return false; - - if (desc_length == 0) - desc_length = pgm_read_byte(desc_addr); - if (setup.wLength < desc_length) - desc_length = setup.wLength; - - // Send descriptor - // EP0 is 64 bytes long - // RWAL and FIFOCON don't work on EP0 - uint16_t n = 0; - do - { - if (!WaitForINOrOUT()) - return false; - Send8(pgm_read_byte(&desc_addr[n++])); - uint8_t clr = n & 0x3F; - if (!clr) - ClearIN(); // Fifo is full, release this packet - } while (n < desc_length); - return true; -} - -void USBSetupInterrupt() -{ - SetEP(0); - if (!ReceivedSetupInt()) - return; - - Setup& setup = _setup; // global saves ~30 bytes - Recv((uint8_t*)&setup,8); - ClearSetupInt(); - - if (setup.bmRequestType & DEVICETOHOST) - WaitIN(); - else - ClearIN(); - - bool ok = true; - uint8_t r = setup.bRequest; - if (SET_ADDRESS == r) - { - WaitIN(); - UDADDR = setup.wValueL | (1<> 8) & 0xFF) - -#define CDC_V1_10 0x0110 -#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02 - -#define CDC_CALL_MANAGEMENT 0x01 -#define CDC_ABSTRACT_CONTROL_MODEL 0x02 -#define CDC_HEADER 0x00 -#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02 -#define CDC_UNION 0x06 -#define CDC_CS_INTERFACE 0x24 -#define CDC_CS_ENDPOINT 0x25 -#define CDC_DATA_INTERFACE_CLASS 0x0A - - -// Device -typedef struct { - uint8_t len; // 18 - uint8_t dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE - uint16_t usbVersion; // 0x200 - uint8_t deviceClass; - uint8_t deviceSubClass; - uint8_t deviceProtocol; - uint8_t packetSize0; // Packet 0 - uint16_t idVendor; - uint16_t idProduct; - uint16_t deviceVersion; // 0x100 - uint8_t iManufacturer; - uint8_t iProduct; - uint8_t iSerialNumber; - uint8_t bNumConfigurations; -} DeviceDescriptor; - -// Config -typedef struct { - uint8_t len; // 9 - uint8_t dtype; // 2 - uint16_t clen; // total length - uint8_t numInterfaces; - uint8_t config; - uint8_t iconfig; - uint8_t attributes; - uint8_t maxPower; -} ConfigDescriptor; - -// String - -// Interface -typedef struct -{ - uint8_t len; // 9 - uint8_t dtype; // 4 - uint8_t number; - uint8_t alternate; - uint8_t numEndpoints; - uint8_t interfaceClass; - uint8_t interfaceSubClass; - uint8_t protocol; - uint8_t iInterface; -} InterfaceDescriptor; - -// Endpoint -typedef struct -{ - uint8_t len; // 7 - uint8_t dtype; // 5 - uint8_t addr; - uint8_t attr; - uint16_t packetSize; - uint8_t interval; -} EndpointDescriptor; - -// Interface Association Descriptor -// Used to bind 2 interfaces together in CDC compostite device -typedef struct -{ - uint8_t len; // 8 - uint8_t dtype; // 11 - uint8_t firstInterface; - uint8_t interfaceCount; - uint8_t functionClass; - uint8_t funtionSubClass; - uint8_t functionProtocol; - uint8_t iInterface; -} IADDescriptor; - -// CDC CS interface descriptor -typedef struct -{ - uint8_t len; // 5 - uint8_t dtype; // 0x24 - uint8_t subtype; - uint8_t d0; - uint8_t d1; -} CDCCSInterfaceDescriptor; - -typedef struct -{ - uint8_t len; // 4 - uint8_t dtype; // 0x24 - uint8_t subtype; - uint8_t d0; -} CDCCSInterfaceDescriptor4; - -typedef struct -{ - IADDescriptor iad; // Only needed on compound device - - // Control - InterfaceDescriptor cif; // - CDCCSInterfaceDescriptor header; - CDCCSInterfaceDescriptor callManagement; - CDCCSInterfaceDescriptor4 controlManagement; - CDCCSInterfaceDescriptor functionalDescriptor; - EndpointDescriptor cifin; - - // Data - InterfaceDescriptor dif; - EndpointDescriptor in; - EndpointDescriptor out; -} CDCDescriptor; - -typedef struct -{ - uint8_t len; // 9 - uint8_t dtype; // 0x21 - uint8_t addr; - uint8_t versionL; // 0x101 - uint8_t versionH; // 0x101 - uint8_t country; - uint8_t desctype; // 0x22 report - uint8_t descLenL; - uint8_t descLenH; -} HIDDescDescriptor; - -typedef struct -{ - InterfaceDescriptor hid; - HIDDescDescriptor desc; - EndpointDescriptor in; -} HIDDescriptor; - -#define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \ - { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs } - -#define D_CONFIG(_totalLength,_interfaces) \ - { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(100) } - -#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \ - { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 } - -#define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \ - { 7, 5, _addr,_attr,_packetSize, _interval } - -#define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \ - { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 } - -#define D_HIDREPORT(_descriptorLength) \ - { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 } - -#define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 } -#define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 } - -#endif \ No newline at end of file diff --git a/bootloaders/diskloader/src/USBDesc.cpp b/bootloaders/diskloader/src/USBDesc.cpp deleted file mode 100644 index a634d4d..0000000 --- a/bootloaders/diskloader/src/USBDesc.cpp +++ /dev/null @@ -1,83 +0,0 @@ - - -/* Copyright (c) 2011, Peter Barrett -** -** Permission to use, copy, modify, and/or distribute this software for -** any purpose with or without fee is hereby granted, provided that the -** above copyright notice and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR -** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -** SOFTWARE. -*/ - -#include "Platform.h" - -//==================================================================================================== -//==================================================================================================== -// Actual device descriptors - -const uint16_t STRING_LANGUAGE[2] = { - (3<<8) | (2+2), - 0x0409 // English -}; - -const uint16_t STRING_SERIAL[13] = { - (3<<8) | (2+2*12), - USB_SERIAL_STRING -}; - -const uint16_t STRING_IPRODUCT[28] = { - (3<<8) | (2+2*27), -#if USB_PID == USB_PID_LEONARDO_BOOTLOADER - 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o',' ','b','o','o','t','l','o','a','d','e','r' -#elif USB_PID == USB_PID_MICRO_BOOTLOADER - 'A','r','d','u','i','n','o',' ','M','i','c','r','o',' ','b','o','o','t','l','o','a','d','e','r',' ',' ',' ' -#endif -}; - -const uint16_t STRING_IMANUFACTURER[12] = { - (3<<8) | (2+2*11), - 'A','r','d','u','i','n','o',' ','L','L','C' -}; - - -DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0X02,0X00,0X00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); - -Config USB_ConfigDescriptor = -{ - D_CONFIG(sizeof(Config),INTERFACE_COUNT), - - // CDC - { - D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1), - - // CDC communication interface - D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), - D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd) - D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management - D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,2), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported - D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 - D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40), - - // CDC data interface - D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0), - D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,0x40,0), - D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,0x40,0) - }, - -#ifdef HID_ENABLED - // HID - { - D_INTERFACE(HID_INTERFACE,1,3,0,0), - D_HIDREPORT(30), - D_ENDPOINT(USB_ENDPOINT_IN (HID_ENDPOINT_INT),USB_ENDPOINT_TYPE_INTERRUPT,0x40,0x40) - } -#endif -}; - diff --git a/bootloaders/diskloader/src/USBDesc.h b/bootloaders/diskloader/src/USBDesc.h deleted file mode 100644 index fa962e9..0000000 --- a/bootloaders/diskloader/src/USBDesc.h +++ /dev/null @@ -1,60 +0,0 @@ - - -/* Copyright (c) 2011, Peter Barrett -** -** Permission to use, copy, modify, and/or distribute this software for -** any purpose with or without fee is hereby granted, provided that the -** above copyright notice and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR -** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -** SOFTWARE. -*/ - -#ifndef HID_ENABLED // HID is NOT enabled - #define CDC_ACM_INTERFACE 0 // CDC ACM - #define CDC_DATA_INTERFACE 1 // CDC Data - #define CDC_ENDPOINT_ACM 1 - #define CDC_ENDPOINT_OUT 2 - #define CDC_ENDPOINT_IN 3 - #define INTERFACE_COUNT 2 // 2 for CDC -#else // HID is enabled - #define CDC_ACM_INTERFACE 0 // CDC ACM - #define CDC_DATA_INTERFACE 1 // CDC Data - #define CDC_ENDPOINT_ACM 1 - #define CDC_ENDPOINT_OUT 2 - #define CDC_ENDPOINT_IN 3 - #define HID_INTERFACE 2 // HID Interface - #define HID_ENDPOINT_INT 4 - #define INTERFACE_COUNT 3 // 2 for CDC + 1 for hid -#endif - -typedef struct -{ - ConfigDescriptor config; - CDCDescriptor cdc; -#ifdef HID_ENABLED - HIDDescriptor hid; -#endif -} Config; - -extern Config USB_ConfigDescriptor PROGMEM; -extern DeviceDescriptor USB_DeviceDescriptor PROGMEM; -extern DeviceDescriptor USB_DeviceDescriptorA PROGMEM; - -extern const uint16_t STRING_LANGUAGE[2] PROGMEM; -extern const uint16_t STRING_IPRODUCT[28] PROGMEM; -extern const uint16_t STRING_IMANUFACTURER[12] PROGMEM; -extern const uint16_t STRING_SERIAL[13] PROGMEM; - -#define IMANUFACTURER 1 -#define IPRODUCT 2 -#define ISERIAL 3 - -#define CDC_TX CDC_ENDPOINT_IN -#define CDC_RX CDC_ENDPOINT_OUT \ No newline at end of file -- cgit v1.2.3-18-g5258 From 29e4d73a55b1ba5782d9a1491ab9e1c1331a6b8a Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 10 Jan 2012 17:04:32 -0500 Subject: reenabled HID to force Leonardo bootloader to enumerate as a composite device --- bootloaders/caterina/Caterina-Leonardo.hex | 226 +++++++++++++++-------------- bootloaders/caterina/src/Platform.h | 2 +- 2 files changed, 115 insertions(+), 113 deletions(-) diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex index 95ca57b..c882f7f 100644 --- a/bootloaders/caterina/Caterina-Leonardo.hex +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -1,115 +1,117 @@ -:1078000011241FBECFEFDAE0DEBFCDBFF5C04101CE +:1078000011241FBECFEFDAE0DEBFCDBF02C14101C0 :1078100042144505560455026403740300001E9586 -:1078200087020110030000C1808106C0FF0A000C1E -:10783000A10185037508150026FF00954009018107 -:1078400002954009029102C0040309041A033000A2 -:1078500030003000300030003000300030003100A7 -:1078600037003000310038034100720064007500B9 -:1078700069006E006F0020004C0065006F006E0014 -:107880006100720064006F00200062006F006F00F2 -:1078900074006C006F0061006400650072001803E2 -:1078A000410072006400750069006E006F002000E6 -:1078B0004C004C0043001201000202000040412332 -:1078C000300000010002030109024B0002010080A8 -:1078D00032080B000202020100090400000102024A -:1078E0000000052400100105240101010424020206 -:1078F000052406000107058103100040090401006A -:10790000020A00000007050202400000070583028A -:107910004000000020918A0130918B012C5F3F4F85 -:1079200030938B0120938A01C901892F992786956D -:10793000982F803418F08FE7891B982F990F921792 -:1079400010F447980895479A08955D9A289A81E01F -:107950008093E0001092E200EE27FF27099408953B -:1079600028E088E190E00FB6F894A8958093600035 -:107970000FBE20936000FFCF0F931F93CF93DF9331 -:10798000982FEB01042F10E088E76030780730F47F -:1079900011E083E0FB0180935700E895892F68E0B0 -:1079A00071E0402F06D1112311F107B600FCFDCF85 -:1079B000402F4695FE01A8E0B1E020E031E009C08B -:1079C0008D919D910C0130935700E89511243296CA -:1079D0002F5F2417A8F385E0FE0180935700E895F8 -:1079E00007B600FCFDCF81E180935700E895DF9159 -:1079F000CF911F910F91089584B794B7977F94BF4B -:107A000098E10FB6F89490936000109260000FBE5A -:107A10005D9A289A479883FF08C0E0E0F0E08591DE -:107A200094918F5F9F4F09F090DF3F9A209A559A6B -:107A300090E8909361001092610081E885BF95BF46 -:107A40009FD084E18093880180E180938901E0E008 -:107A5000F0E0859194918F5F9F4F19F081E08093C2 -:107A60008F01EE24FF24BB24B39454EFC52E51E0C4 -:107A7000D52E0DD2082F8EE098E7FC012491319687 -:107A800002964491201711F02223B9F71092910128 -:107A90001092900182E068E071E08BD0013479F4BB -:107AA000609108016058633028F0683111F064E09B -:107AB00001C063E0C62FD0E0CF5DD7480EC00635C9 -:107AC00071F480910801803311F011E022C080919F -:107AD0000A01C82FD0E0C25ED74811E022C00537A6 -:107AE00021F413E0CEE1D8E71CC0053539F4E0906D -:107AF0000801F0900901EE0CFF1C0AC0043631F4B5 -:107B000082E0B7014091090137DF02C0043721F05C -:107B100010E0C5E2D8E705C010910901E701E10EC8 -:107B2000F11CB5D18097B1F483E068E871E041E0E1 -:107B300050E059D0112329F0412F50E083E8BE01D5 -:107B400052D083E469E871E041E050E04CD0013567 -:107B500009F08FCFD0929101C0929001B0928F0125 -:107B6000EE24FF2486CFFC01289884E680938D01C3 -:107B700004C08091F100819361506623D1F708958C -:107B8000109291011092900110928E0110928F012B -:107B900081E08093D70080EA8093D80082E189BD9C -:107BA00009B400FEFDCF80E98093D8001092E00078 -:107BB0000895FB018093E90024E69BE611C08091C3 -:107BC000E80085FFFCCF289820938D018091F1007B -:107BD00081938091E80085FD02C09093E8004150B8 -:107BE000442369F70895982FFB01282F207287708E -:107BF0008093E90064E63AE317C08091E80085FFCE -:107C0000FCCF97FF02C0849101C080813196211181 -:107C100080E05D9860938C018093F1008091E80092 -:107C200085FD02C03093E800415050408FEF4F3F38 -:107C3000580719F796FF03C08AE38093E800089578 -:107C400080919301813299F45D9884E680938C0150 -:107C500020E030E003C080818093F100F901E05022 -:107C6000FF4F2F5F3F4F28303105A9F714C08032F6 -:107C700061F48091E80082FFFCCF80E091E067E052 -:107C800072DF8BEF8093E80006C0823221F480918E -:107C900094018093070181E00895809195018232DB -:107CA00019F420E030E024C0813019F426EB38E7E5 -:107CB0001FC0823029F48BE490E028EC38E71BC029 -:107CC000833009F048C080919401882319F428E496 -:107CD00038E70EC0823019F426E638E709C0833051 -:107CE00019F42CE438E704C08130A9F52EE938E70F -:107CF000F901849190E04091980150919901BC0163 -:107D00004817590708F4BA0190918C0140E050E0FF -:107D1000AEEF8091E8008570E1F38091E80082FD8C -:107D200016C0F901E40FF51F4F5F5F4FE4915D98B6 -:107D3000E093F100842F8F7311F4A093E80094E690 -:107D40004617570730F390938C0181E00895909384 -:107D50008C0180E0089580E008951092E900809100 -:107D6000E80083FF61C082E991E068E0FCDE82EF19 -:107D70008093E8008091920187FF05C08091E80020 -:107D800080FFFCCF03C08EEF8093E80080919301C9 -:107D9000853051F48091E80080FFFCCF8091940100 -:107DA00080688093E30039C08930E1F480919401C8 -:107DB00080938E01E7E2F8E791E031E026E39093CB -:107DC000E9003093EB0084918093EC002093ED0068 -:107DD0009F5F3196943099F78EE78093EA00109276 -:107DE000EA001BC0883049F490918E015D9884E6CA -:107DF00080938C019093F10010C0882339F45D9832 -:107E000084E680938C011092F10007C0863011F453 -:107E100044DF01C015DF882321F08EEF8093E80056 -:107E2000089581E28093EB0008958091E100109223 -:107E3000E100282F83FF0CC01092E90081E08093BD -:107E4000EB001092EC0082E38093ED0010928E0123 -:107E500022FF1CC080918C01882331F081508093D7 -:107E60008C01882309F45D9A80918D01882331F07B -:107E7000815080938D01882309F4289A80918F0185 -:107E8000882321F4109291011092900108951F937C -:107E9000CF93DF9312E0C0E9D1E05FDFC6DF10933C -:107EA000E9008091E80085FF13C0289884E680935C -:107EB0008D019091F1008091E80085FD03C08BE673 -:107EC0008093E800892F90E0DF91CF911F91089572 -:107ED00080919001909191010197909391018093ED -:107EE00090018091900190919101892B09F438DDE6 -:0A7EF000CE010197F1F70EDDD0CFAF -:087EFA0000E10000000000009F +:1078200087020110030000C18081C106C0FF0A0069 +:107830000CA10185037508150026FF00954009017C +:107840008102954009029102C0040309041A033021 +:1078500000300030003000300030003000300031A7 +:1078600000370030003100380341007200640075B9 +:107870000069006E006F0020004C0065006F006E14 +:10788000006100720064006F00200062006F006FF2 +:107890000074006C006F00610064006500720018E5 +:1078A00003410072006400750069006E006F0020E3 +:1078B000004C004C00430012010002020000404155 +:1078C00023300000010002030109026400030100EB +:1078D0008032080B000202020100090400000102CC +:1078E0000200000524001001052401010104240206 +:1078F0000205240600010705810310004009040168 +:1079000000020A000000070502024000000705838C +:1079100002400000090402000103000000092101E7 +:10792000010001221E000705840340004000209151 +:107930008A0130918B012C5F3F4F30938B01209354 +:107940008A01C901892F99278695982F803418F0CC +:107950008FE7891B982F990F921710F44798089575 +:10796000479A08955D9A289A81E08093E0001092EA +:10797000E200EE27FF270994089528E088E190E0CF +:107980000FB6F894A895809360000FBE2093600016 +:10799000FFCF0F931F93CF93DF93982FEB01042F0B +:1079A00010E088E76030780730F411E083E0FB01F5 +:1079B00080935700E895892F68E071E0402F06D149 +:1079C000112311F107B600FCFDCF402F4695FE01B3 +:1079D000A8E0B1E020E031E009C08D919D910C015B +:1079E00030935700E895112432962F5F2417A8F39F +:1079F00085E0FE0180935700E89507B600FCFDCFB7 +:107A000081E180935700E895DF91CF911F910F910D +:107A1000089584B794B7977F94BF98E10FB6F89410 +:107A200090936000109260000FBE5D9A289A47986C +:107A300083FF08C0E0E0F0E0859194918F5F9F4F55 +:107A400009F090DF3F9A209A559A90E89093610050 +:107A50001092610081E885BF95BF9FD084E180933B +:107A6000880180E180938901E0E0F0E085919491C4 +:107A70008F5F9F4F19F081E080938F01EE24FF24E8 +:107A8000BB24B39454EFC52E51E0D52E10D2082F4D +:107A90008EE098E7FC0124913196029644912017DC +:107AA00011F02223B9F7109291011092900182E017 +:107AB00068E071E08BD0013479F46091080160587E +:107AC000633028F0683111F064E001C063E0C62F34 +:107AD000D0E0CF5DD7480EC0063571F48091080123 +:107AE000803311F011E022C080910A01C82FD0E04C +:107AF000C25ED74811E022C0053721F413E0CEE181 +:107B0000D8E71CC0053539F4E0900801F090090170 +:107B1000EE0CFF1C0AC0043631F482E0B70140913C +:107B2000090137DF02C0043721F010E0C5E2D8E7D1 +:107B300005C010910901E701E10EF11CB8D1809751 +:107B4000B1F483E068E871E041E050E059D01123DE +:107B500029F0412F50E083E8BE0152D083E469E868 +:107B600071E041E050E04CD0013509F08FCFD09268 +:107B70009101C0929001B0928F01EE24FF2486CF34 +:107B8000FC01289884E680938D0104C08091F10067 +:107B9000819361506623D1F708951092910110925C +:107BA000900110928E0110928F0181E08093D70096 +:107BB00080EA8093D80082E189BD09B400FEFDCF40 +:107BC00080E98093D8001092E0000895FB01809333 +:107BD000E90024E69BE611C08091E80085FFFCCF18 +:107BE000289820938D018091F10081938091E80085 +:107BF00085FD02C09093E8004150442369F7089541 +:107C0000982FFB01282F207287708093E90064E68B +:107C10003AE317C08091E80085FFFCCF97FF02C0D0 +:107C2000849101C080813196211180E05D9860933C +:107C30008C018093F1008091E80085FD02C03093B3 +:107C4000E800415050408FEF4F3F580719F796FF1B +:107C500003C08AE38093E800089580919301813204 +:107C600099F45D9884E680938C0120E030E003C0B5 +:107C700080818093F100F901E050FF4F2F5F3F4F6B +:107C800028303105A9F714C0803261F48091E800F2 +:107C900082FFFCCF80E091E067E072DF8BEF8093A2 +:107CA000E80006C0823221F480919401809307019C +:107CB00081E0089580919501823219F1813009F4B3 +:107CC00056C0823029F484E690E029EC38E71DC0E4 +:107CD000833009F04AC080919401882319F429E483 +:107CE00038E747C0823019F427E638E742C08330CE +:107CF00019F42DE438E73DC08130B9F52FE938E7B4 +:107D000038C082E090E02BE238E740919801509132 +:107D10009901BC014817590708F4BA0190918C01E8 +:107D200040E050E0AEEF8091E8008570E1F3809193 +:107D3000E80082FD16C0F901E40FF51F4F5F5F4FA9 +:107D4000E4915D98E093F100842F8F7311F4A09378 +:107D5000E80094E64617570730F390938C0181E0D2 +:107D6000089590938C0180E0089580E0089527EBBA +:107D700038E7F901849190E0C8CF1092E900809132 +:107D8000E80083FF61C082E991E068E0F9DE82EFFC +:107D90008093E8008091920187FF05C08091E80000 +:107DA00080FFFCCF03C08EEF8093E80080919301A9 +:107DB000853051F48091E80080FFFCCF80919401E0 +:107DC00080688093E30039C08930E1F480919401A8 +:107DD00080938E01E7E2F8E791E031E026E39093AB +:107DE000E9003093EB0084918093EC002093ED0048 +:107DF0009F5F3196953099F78EE78093EA00109255 +:107E0000EA001BC0883049F490918E015D9884E6A9 +:107E100080938C019093F10010C0882339F45D9811 +:107E200084E680938C011092F10007C0863011F433 +:107E300041DF01C012DF882321F08EEF8093E8003C +:107E4000089581E28093EB0008958091E100109203 +:107E5000E100282F83FF0CC01092E90081E080939D +:107E6000EB001092EC0082E38093ED0010928E0103 +:107E700022FF1CC080918C01882331F081508093B7 +:107E80008C01882309F45D9A80918D01882331F05B +:107E9000815080938D01882309F4289A80918F0165 +:107EA000882321F4109291011092900108951F935C +:107EB000CF93DF9312E0C0E9D1E05FDFC6DF10931C +:107EC000E9008091E80085FF13C0289884E680933C +:107ED0008D019091F1008091E80085FD03C08BE653 +:107EE0008093E800892F90E0DF91CF911F91089552 +:107EF00080919001909191010197909391018093CD +:107F000090018091900190919101892B09F435DDC8 +:0A7F1000CE010197F1F70BDDD0CF91 +:087F1A0000E10000000000007E :040000030000780081 :00000001FF diff --git a/bootloaders/caterina/src/Platform.h b/bootloaders/caterina/src/Platform.h index 9d18e80..37c26de 100644 --- a/bootloaders/caterina/src/Platform.h +++ b/bootloaders/caterina/src/Platform.h @@ -41,7 +41,7 @@ void Program(uint8_t ep, uint16_t page, uint8_t count); /* HID is not fully-supported in the bootloader - can be enabled for testing, but note the descriptor report and other parts are not complete */ -//#define HID_ENABLED +#define HID_ENABLED #include "USBCore.h" #include "USBDesc.h" -- cgit v1.2.3-18-g5258 From 385679caf2e6ad9502b5fe16f594225b8e82f890 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 10 Jan 2012 20:52:57 -0500 Subject: restored composite and non-composite device descriptors (removed in 4b05c3fc7529477fb7031d42103c15b50a6b58be) Windows wants to see both types of device descriptors. --- bootloaders/caterina/Caterina-Leonardo.hex | 219 +++++++++++++++-------------- bootloaders/caterina/src/Platform.h | 2 +- bootloaders/caterina/src/USBCore.cpp | 4 +- bootloaders/caterina/src/USBDesc.cpp | 4 +- 4 files changed, 117 insertions(+), 112 deletions(-) diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex index c882f7f..44a452e 100644 --- a/bootloaders/caterina/Caterina-Leonardo.hex +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -1,117 +1,120 @@ -:1078000011241FBECFEFDAE0DEBFCDBF02C14101C0 +:1078000011241FBECFEFDAE0DEBFCDBF0BC14101B7 :1078100042144505560455026403740300001E9586 :1078200087020110030000C18081C106C0FF0A0069 :107830000CA10185037508150026FF00954009017C :107840008102954009029102C0040309041A033021 :1078500000300030003000300030003000300031A7 -:1078600000370030003100380341007200640075B9 -:107870000069006E006F0020004C0065006F006E14 -:10788000006100720064006F00200062006F006FF2 -:107890000074006C006F00610064006500720018E5 +:107860000037003000310038030000000000000045 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000018D0 :1078A00003410072006400750069006E006F0020E3 :1078B000004C004C00430012010002020000404155 -:1078C00023300000010002030109026400030100EB -:1078D0008032080B000202020100090400000102CC -:1078E0000200000524001001052401010104240206 -:1078F0000205240600010705810310004009040168 -:1079000000020A000000070502024000000705838C -:1079100002400000090402000103000000092101E7 -:10792000010001221E000705840340004000209151 -:107930008A0130918B012C5F3F4F30938B01209354 -:107940008A01C901892F99278695982F803418F0CC -:107950008FE7891B982F990F921710F44798089575 -:10796000479A08955D9A289A81E08093E0001092EA -:10797000E200EE27FF270994089528E088E190E0CF -:107980000FB6F894A895809360000FBE2093600016 -:10799000FFCF0F931F93CF93DF93982FEB01042F0B -:1079A00010E088E76030780730F411E083E0FB01F5 -:1079B00080935700E895892F68E071E0402F06D149 -:1079C000112311F107B600FCFDCF402F4695FE01B3 -:1079D000A8E0B1E020E031E009C08D919D910C015B -:1079E00030935700E895112432962F5F2417A8F39F -:1079F00085E0FE0180935700E89507B600FCFDCFB7 -:107A000081E180935700E895DF91CF911F910F910D -:107A1000089584B794B7977F94BF98E10FB6F89410 -:107A200090936000109260000FBE5D9A289A47986C -:107A300083FF08C0E0E0F0E0859194918F5F9F4F55 -:107A400009F090DF3F9A209A559A90E89093610050 -:107A50001092610081E885BF95BF9FD084E180933B -:107A6000880180E180938901E0E0F0E085919491C4 -:107A70008F5F9F4F19F081E080938F01EE24FF24E8 -:107A8000BB24B39454EFC52E51E0D52E10D2082F4D -:107A90008EE098E7FC0124913196029644912017DC -:107AA00011F02223B9F7109291011092900182E017 -:107AB00068E071E08BD0013479F46091080160587E -:107AC000633028F0683111F064E001C063E0C62F34 -:107AD000D0E0CF5DD7480EC0063571F48091080123 -:107AE000803311F011E022C080910A01C82FD0E04C -:107AF000C25ED74811E022C0053721F413E0CEE181 -:107B0000D8E71CC0053539F4E0900801F090090170 -:107B1000EE0CFF1C0AC0043631F482E0B70140913C -:107B2000090137DF02C0043721F010E0C5E2D8E7D1 -:107B300005C010910901E701E10EF11CB8D1809751 -:107B4000B1F483E068E871E041E050E059D01123DE -:107B500029F0412F50E083E8BE0152D083E469E868 -:107B600071E041E050E04CD0013509F08FCFD09268 -:107B70009101C0929001B0928F01EE24FF2486CF34 -:107B8000FC01289884E680938D0104C08091F10067 -:107B9000819361506623D1F708951092910110925C -:107BA000900110928E0110928F0181E08093D70096 -:107BB00080EA8093D80082E189BD09B400FEFDCF40 -:107BC00080E98093D8001092E0000895FB01809333 -:107BD000E90024E69BE611C08091E80085FFFCCF18 -:107BE000289820938D018091F10081938091E80085 -:107BF00085FD02C09093E8004150442369F7089541 -:107C0000982FFB01282F207287708093E90064E68B -:107C10003AE317C08091E80085FFFCCF97FF02C0D0 -:107C2000849101C080813196211180E05D9860933C -:107C30008C018093F1008091E80085FD02C03093B3 -:107C4000E800415050408FEF4F3F580719F796FF1B -:107C500003C08AE38093E800089580919301813204 -:107C600099F45D9884E680938C0120E030E003C0B5 -:107C700080818093F100F901E050FF4F2F5F3F4F6B -:107C800028303105A9F714C0803261F48091E800F2 -:107C900082FFFCCF80E091E067E072DF8BEF8093A2 -:107CA000E80006C0823221F480919401809307019C -:107CB00081E0089580919501823219F1813009F4B3 -:107CC00056C0823029F484E690E029EC38E71DC0E4 -:107CD000833009F04AC080919401882319F429E483 -:107CE00038E747C0823019F427E638E742C08330CE -:107CF00019F42DE438E73DC08130B9F52FE938E7B4 -:107D000038C082E090E02BE238E740919801509132 -:107D10009901BC014817590708F4BA0190918C01E8 -:107D200040E050E0AEEF8091E8008570E1F3809193 -:107D3000E80082FD16C0F901E40FF51F4F5F5F4FA9 -:107D4000E4915D98E093F100842F8F7311F4A09378 -:107D5000E80094E64617570730F390938C0181E0D2 -:107D6000089590938C0180E0089580E0089527EBBA -:107D700038E7F901849190E0C8CF1092E900809132 -:107D8000E80083FF61C082E991E068E0F9DE82EFFC -:107D90008093E8008091920187FF05C08091E80000 -:107DA00080FFFCCF03C08EEF8093E80080919301A9 -:107DB000853051F48091E80080FFFCCF80919401E0 -:107DC00080688093E30039C08930E1F480919401A8 -:107DD00080938E01E7E2F8E791E031E026E39093AB -:107DE000E9003093EB0084918093EC002093ED0048 -:107DF0009F5F3196953099F78EE78093EA00109255 -:107E0000EA001BC0883049F490918E015D9884E6A9 -:107E100080938C019093F10010C0882339F45D9811 -:107E200084E680938C011092F10007C0863011F433 -:107E300041DF01C012DF882321F08EEF8093E8003C -:107E4000089581E28093EB0008958091E100109203 -:107E5000E100282F83FF0CC01092E90081E080939D -:107E6000EB001092EC0082E38093ED0010928E0103 -:107E700022FF1CC080918C01882331F081508093B7 -:107E80008C01882309F45D9A80918D01882331F05B -:107E9000815080938D01882309F4289A80918F0165 -:107EA000882321F4109291011092900108951F935C -:107EB000CF93DF9312E0C0E9D1E05FDFC6DF10931C -:107EC000E9008091E80085FF13C0289884E680933C -:107ED0008D019091F1008091E80085FD03C08BE653 -:107EE0008093E800892F90E0DF91CF911F91089552 -:107EF00080919001909191010197909391018093CD -:107F000090018091900190919101892B09F435DDC8 -:0A7F1000CE010197F1F70BDDD0CF91 -:087F1A0000E10000000000007E +:1078C0002330000001000203011201000200000049 +:1078D000404123300000010002030109026400035B +:1078E00001008032080B00020202010009040000BE +:1078F0000102020000052400100105240101010419 +:107900002402020524060001070581031000400936 +:10791000040100020A0000000705020240000007FF +:107920000583024000000904020001030000000971 +:107930002101010001221E000705840340004000D0 +:1079400020918A0130918B012C5F3F4F30938B0146 +:1079500020938A01C901892F99278695982F803411 +:1079600018F08FE7891B982F990F921710F44798FA +:107970000895479A08955D9A289A81E08093E000DF +:107980001092E200EE27FF270994089528E088E18D +:1079900090E00FB6F894A895809360000FBE2093F6 +:1079A0006000FFCF0F931F93CF93DF93982FEB01CE +:1079B000042F10E088E76030780730F411E083E0AE +:1079C000FB0180935700E895892F68E071E0402F14 +:1079D00006D1112311F107B600FCFDCF402F4695CB +:1079E000FE01A8E0B1E020E031E009C08D919D9159 +:1079F0000C0130935700E895112432962F5F24171D +:107A0000A8F385E0FE0180935700E89507B600FCD7 +:107A1000FDCF81E180935700E895DF91CF911F91D1 +:107A20000F91089584B794B7977F94BF98E10FB6EC +:107A3000F89490936000109260000FBE5D9A289AAF +:107A4000479883FF08C0E0E0F0E0859194918F5F54 +:107A50009F4F09F090DF3F9A209A559A90E89093B3 +:107A600061001092610081E885BF95BF9FD084E1DD +:107A70008093880180E180938901E0E0F0E08591C6 +:107A800094918F5F9F4F19F081E080938F01EE24D6 +:107A9000FF24BB24B39454EFC52E51E0D52E1FD242 +:107AA000082F8EE098E7FC012491319602964491CC +:107AB000201711F02223B9F7109291011092900132 +:107AC00082E068E071E08BD0013479F460910801C4 +:107AD0006058633028F0683111F064E001C063E061 +:107AE000C62FD0E0CF5DD7480EC0063571F4809127 +:107AF0000801803311F011E022C080910A01C82FE3 +:107B0000D0E0C25ED74811E022C0053721F413E06F +:107B1000CEE1D8E71CC0053539F4E0900801F090BB +:107B20000901EE0CFF1C0AC0043631F482E0B701F3 +:107B30004091090137DF02C0043721F010E0C5E2AF +:107B4000D8E705C010910901E701E10EF11CC7D18A +:107B50008097B1F483E068E871E041E050E059D0EB +:107B6000112329F0412F50E083E8BE0152D083E475 +:107B700069E871E041E050E04CD0013509F08FCF69 +:107B8000D0929101C0929001B0928F01EE24FF2417 +:107B900086CFFC01289884E680938D0104C08091F3 +:107BA000F100819361506623D1F7089510929101FD +:107BB0001092900110928E0110928F0181E08093BB +:107BC000D70080EA8093D80082E189BD09B400FE25 +:107BD000FDCF80E98093D8001092E0000895FB016A +:107BE0008093E90024E69BE611C08091E80085FFC0 +:107BF000FCCF289820938D018091F1008193809192 +:107C0000E80085FD02C09093E8004150442369F7E5 +:107C10000895982FFB01282F207287708093E90028 +:107C200064E63AE317C08091E80085FFFCCF97FF38 +:107C300002C0849101C080813196211180E05D985D +:107C400060938C018093F1008091E80085FD02C073 +:107C50003093E800415050408FEF4F3F580719F7DD +:107C600096FF03C08AE38093E80008958091930112 +:107C7000813299F45D9884E680938C0120E030E0B5 +:107C800003C080818093F100F901E050FF4F2F5F26 +:107C90003F4F28303105A9F714C0803261F480913C +:107CA000E80082FFFCCF80E091E067E072DF8BEFBD +:107CB0008093E80006C0823221F480919401809381 +:107CC000070181E0089520919501223291F1213040 +:107CD00081F48091980190919901089711F4209373 +:107CE0009A0180919A01882309F059C029EC38E75C +:107CF00058C0223029F484E690E02BED38E71DC00F +:107D0000233009F04AC080919401882319F429E4B2 +:107D100038E747C0823019F427E638E742C083309D +:107D200019F42DE438E73DC08130B9F52FE938E783 +:107D300038C082E090E02BE238E740919801509102 +:107D40009901BC014817590708F4BA0190918C01B8 +:107D500040E050E0AEEF8091E8008570E1F3809163 +:107D6000E80082FD16C0F901E40FF51F4F5F5F4F79 +:107D7000E4915D98E093F100842F8F7311F4A09348 +:107D8000E80094E64617570730F390938C0181E0A2 +:107D9000089590938C0180E0089580E0089527EB8A +:107DA00038E7F901849190E0C8CF1092E900809102 +:107DB000E80083FF61C082E991E068E0EADE82EFDB +:107DC0008093E8008091920187FF05C08091E800D0 +:107DD00080FFFCCF03C08EEF8093E8008091930179 +:107DE000853051F48091E80080FFFCCF80919401B0 +:107DF00080688093E30039C08930E1F48091940178 +:107E000080938E01E7E2F8E791E031E026E390937A +:107E1000E9003093EB0084918093EC002093ED0017 +:107E20009F5F3196953099F78EE78093EA00109224 +:107E3000EA001BC0883049F490918E015D9884E679 +:107E400080938C019093F10010C0882339F45D98E1 +:107E500084E680938C011092F10007C0863011F403 +:107E600032DF01C003DF882321F08EEF8093E8002A +:107E7000089581E28093EB0008958091E1001092D3 +:107E8000E100282F83FF0CC01092E90081E080936D +:107E9000EB001092EC0082E38093ED0010928E01D3 +:107EA00022FF1CC080918C01882331F08150809387 +:107EB0008C01882309F45D9A80918D01882331F02B +:107EC000815080938D01882309F4289A80918F0135 +:107ED000882321F4109291011092900108951F932C +:107EE000CF93DF9312E0C0E9D1E05FDFC6DF1093EC +:107EF000E9008091E80085FF13C0289884E680930C +:107F00008D019091F1008091E80085FD03C08BE622 +:107F10008093E800892F90E0DF91CF911F91089521 +:107F2000809190019091910101979093910180939C +:107F300090018091900190919101892B09F426DDA7 +:0A7F4000CE010197F1F7FCDCD0CF71 +:087F4A0000E10000000000004E :040000030000780081 :00000001FF diff --git a/bootloaders/caterina/src/Platform.h b/bootloaders/caterina/src/Platform.h index 37c26de..75e5bc3 100644 --- a/bootloaders/caterina/src/Platform.h +++ b/bootloaders/caterina/src/Platform.h @@ -14,7 +14,7 @@ #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) #define DISABLE_JTAG() MCUCR = (1 << JTD) | (1 << IVCE) | (0 << PUD); MCUCR = (1 << JTD) | (0 << IVSEL) | (0 << IVCE) | (0 << PUD); -#define USB_PID_LEONARDO_BOOTLOADER 0x0030 +#define USB_PID_LEONARDO_BOOTLOADER 0x008D #define USB_PID_MICRO_BOOTLOADER 0x0031 #define USB_VID 0x2341 // arduino LLC vid #define USB_PID ARDUINO_MODEL_PID // passed in by Makefile - 0x0034 for Leonardo, 0x0035 for MIcro diff --git a/bootloaders/caterina/src/USBCore.cpp b/bootloaders/caterina/src/USBCore.cpp index ac5d081..0eecacc 100644 --- a/bootloaders/caterina/src/USBCore.cpp +++ b/bootloaders/caterina/src/USBCore.cpp @@ -363,7 +363,9 @@ bool SendDescriptor() #endif } else if (USB_DEVICE_DESCRIPTOR_TYPE == t) { - desc_addr = (const uint8_t*)&USB_DeviceDescriptor; + if (setup.wLength == 8) + _cdcComposite = 1; + desc_addr = _cdcComposite ? (const uint8_t*)&USB_DeviceDescriptorA : (const uint8_t*)&USB_DeviceDescriptor; } else if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) { diff --git a/bootloaders/caterina/src/USBDesc.cpp b/bootloaders/caterina/src/USBDesc.cpp index a634d4d..a84f3be 100644 --- a/bootloaders/caterina/src/USBDesc.cpp +++ b/bootloaders/caterina/src/USBDesc.cpp @@ -46,8 +46,8 @@ const uint16_t STRING_IMANUFACTURER[12] = { 'A','r','d','u','i','n','o',' ','L','L','C' }; - -DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0X02,0X00,0X00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); +DeviceDescriptor USB_DeviceDescriptorA = D_DEVICE(0X02,0X00,0X00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); +DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); Config USB_ConfigDescriptor = { -- cgit v1.2.3-18-g5258 From 73b46de27bb78a7aeb2066cde86a44bd313a8382 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 10 Jan 2012 21:23:01 -0500 Subject: made Leonardo and Micro bootloader PIDs same as sketch PIDs --- bootloaders/caterina/Caterina-Leonardo.hex | 12 ++++++------ bootloaders/caterina/Makefile | 4 ++-- bootloaders/caterina/src/Platform.h | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex index 44a452e..ea2af98 100644 --- a/bootloaders/caterina/Caterina-Leonardo.hex +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -4,14 +4,14 @@ :107830000CA10185037508150026FF00954009017C :107840008102954009029102C0040309041A033021 :1078500000300030003000300030003000300031A7 -:107860000037003000310038030000000000000045 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000018D0 +:1078600000370030003100380341007200640075B9 +:107870000069006E006F0020004C0065006F006E14 +:10788000006100720064006F00200062006F006FF2 +:107890000074006C006F00610064006500720018E5 :1078A00003410072006400750069006E006F0020E3 :1078B000004C004C00430012010002020000404155 -:1078C0002330000001000203011201000200000049 -:1078D000404123300000010002030109026400035B +:1078C0002334000001000203011201000200000045 +:1078D0004041233400000100020301090264000357 :1078E00001008032080B00020202010009040000BE :1078F0000102020000052400100105240101010419 :107900002402020524060001070581031000400936 diff --git a/bootloaders/caterina/Makefile b/bootloaders/caterina/Makefile index 4bb41c8..8075a56 100644 --- a/bootloaders/caterina/Makefile +++ b/bootloaders/caterina/Makefile @@ -15,9 +15,9 @@ AVR_FREQ = 16000000L # to set PID and product descriptor string # Arduino Leonardo bootloader PID -ARDUINO_MODEL_PID = 0x0030 +ARDUINO_MODEL_PID = 0x0034 # Arduino Micro bootloader PID -#ARDUINO_MODEL_PID = 0x0031 +#ARDUINO_MODEL_PID = 0x0035 # Change if your programmer is different AVRDUDE_PROGRAMMER = avrispmkII diff --git a/bootloaders/caterina/src/Platform.h b/bootloaders/caterina/src/Platform.h index 75e5bc3..26c1114 100644 --- a/bootloaders/caterina/src/Platform.h +++ b/bootloaders/caterina/src/Platform.h @@ -14,8 +14,8 @@ #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) #define DISABLE_JTAG() MCUCR = (1 << JTD) | (1 << IVCE) | (0 << PUD); MCUCR = (1 << JTD) | (0 << IVSEL) | (0 << IVCE) | (0 << PUD); -#define USB_PID_LEONARDO_BOOTLOADER 0x008D -#define USB_PID_MICRO_BOOTLOADER 0x0031 +#define USB_PID_LEONARDO_BOOTLOADER 0x0034 +#define USB_PID_MICRO_BOOTLOADER 0x0035 #define USB_VID 0x2341 // arduino LLC vid #define USB_PID ARDUINO_MODEL_PID // passed in by Makefile - 0x0034 for Leonardo, 0x0035 for MIcro -- cgit v1.2.3-18-g5258 From 58090a259c83029aabd5dfd4d0c50f61a6d40251 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 19 Jan 2012 20:04:55 -0500 Subject: initial checkin of LUFA 111009 CDC bootloader --- bootloaders/caterina_LUFA/BootloaderCDC.aps | 1 + bootloaders/caterina_LUFA/BootloaderCDC.c | 585 ++++++++ bootloaders/caterina_LUFA/BootloaderCDC.h | 88 ++ bootloaders/caterina_LUFA/BootloaderCDC.txt | 119 ++ bootloaders/caterina_LUFA/Descriptors.c | 243 ++++ bootloaders/caterina_LUFA/Descriptors.h | 139 ++ bootloaders/caterina_LUFA/Doxygen.conf | 1565 +++++++++++++++++++++ bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf | 106 ++ bootloaders/caterina_LUFA/makefile | 717 ++++++++++ 9 files changed, 3563 insertions(+) create mode 100755 bootloaders/caterina_LUFA/BootloaderCDC.aps create mode 100755 bootloaders/caterina_LUFA/BootloaderCDC.c create mode 100755 bootloaders/caterina_LUFA/BootloaderCDC.h create mode 100755 bootloaders/caterina_LUFA/BootloaderCDC.txt create mode 100755 bootloaders/caterina_LUFA/Descriptors.c create mode 100755 bootloaders/caterina_LUFA/Descriptors.h create mode 100755 bootloaders/caterina_LUFA/Doxygen.conf create mode 100755 bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf create mode 100755 bootloaders/caterina_LUFA/makefile diff --git a/bootloaders/caterina_LUFA/BootloaderCDC.aps b/bootloaders/caterina_LUFA/BootloaderCDC.aps new file mode 100755 index 0000000..5dc11bf --- /dev/null +++ b/bootloaders/caterina_LUFA/BootloaderCDC.aps @@ -0,0 +1 @@ +BootloaderCDC13-Jul-2010 14:41:2513-Jul-2010 14:42:12241013-Jul-2010 14:41:2544, 18, 0, 685AVR GCCBootloaderCDC.elfC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31000BootloaderCDC.cDescriptors.cBootloaderCDC.hDescriptors.hmakefiledefaultYESmakefileatmega128111BootloaderCDC.elfdefault\1-Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\WinAVR-20100110\bin\avr-gcc.exeC:\WinAVR-20100110\utils\bin\make.exeC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\BootloaderCDC.hC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\Descriptors.hC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\BootloaderCDC.cC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\Descriptors.c diff --git a/bootloaders/caterina_LUFA/BootloaderCDC.c b/bootloaders/caterina_LUFA/BootloaderCDC.c new file mode 100755 index 0000000..4c5aa59 --- /dev/null +++ b/bootloaders/caterina_LUFA/BootloaderCDC.c @@ -0,0 +1,585 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. + */ + +#define INCLUDE_FROM_BOOTLOADERCDC_C +#include "BootloaderCDC.h" + +/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some + * operating systems will not open the port unless the settings can be set successfully. + */ +static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, + .CharFormat = CDC_LINEENCODING_OneStopBit, + .ParityType = CDC_PARITY_None, + .DataBits = 8 }; + +/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, + * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued + * command.) + */ +static uint32_t CurrAddress; + +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run + * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite + * loop until the AVR restarts and the application runs. + */ +static bool RunBootloader = true; + + +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously + * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start + * the loaded application code. + */ +int main(void) +{ + /* Setup hardware required for the bootloader */ + SetupHardware(); + + /* Turn on first LED on the board to indicate that the bootloader has started */ + LEDs_SetAllLEDs(LEDS_LED1); + + /* Enable global interrupts so that the USB stack can function */ + sei(); + + while (RunBootloader) + { + CDC_Task(); + USB_USBTask(); + } + + /* Disconnect from the host - USB interface will be reset later along with the AVR */ + USB_Detach(); + + /* Enable the watchdog and force a timeout to reset the AVR */ + wdt_enable(WDTO_250MS); + + for (;;); +} + +/** Configures all hardware required for the bootloader. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + /* Relocate the interrupt vector table to the bootloader section */ + MCUCR = (1 << IVCE); + MCUCR = (1 << IVSEL); + + /* Initialize USB Subsystem */ + USB_Init(); + LEDs_Init(); + + /* Bootloader active LED toggle timer initialization */ + TIMSK1 = (1 << TOIE1); + TCCR1B = ((1 << CS11) | (1 << CS10)); +} + +/** ISR to periodically toggle the LEDs on the board to indicate that the bootloader is active. */ +ISR(TIMER1_OVF_vect, ISR_BLOCK) +{ + LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); +} + +/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready + * to relay data to and from the attached USB host. + */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + /* Setup CDC Notification, Rx and Tx Endpoints */ + Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, + ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); +} + +/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to + * the device from the USB host before passing along unhandled control requests to the library for processing + * internally. + */ +void EVENT_USB_Device_ControlRequest(void) +{ + /* Ignore any requests that aren't directed to the CDC interface */ + if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != + (REQTYPE_CLASS | REQREC_INTERFACE)) + { + return; + } + + /* Activity - toggle indicator LEDs */ + LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); + + /* Process CDC specific control requests */ + switch (USB_ControlRequest.bRequest) + { + case CDC_REQ_GetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Write the line coding data to the control endpoint */ + Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearOUT(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Read the line coding data in from the host into the global struct */ + Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearIN(); + } + + break; + } +} + +#if !defined(NO_BLOCK_SUPPORT) +/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending + * on the AVR910 protocol command issued. + * + * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform + */ +static void ReadWriteMemoryBlock(const uint8_t Command) +{ + uint16_t BlockSize; + char MemoryType; + + bool HighByte = false; + uint8_t LowByte = 0; + + BlockSize = (FetchNextCommandByte() << 8); + BlockSize |= FetchNextCommandByte(); + + MemoryType = FetchNextCommandByte(); + + if ((MemoryType != 'E') && (MemoryType != 'F')) + { + /* Send error byte back to the host */ + WriteNextResponseByte('?'); + + return; + } + + /* Check if command is to read memory */ + if (Command == 'g') + { + /* Re-enable RWW section */ + boot_rww_enable(); + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* Read the next FLASH byte from the current FLASH page */ + #if (FLASHEND > 0xFFFF) + WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); + #else + WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); + #endif + + /* If both bytes in current word have been read, increment the address counter */ + if (HighByte) + CurrAddress += 2; + + HighByte = !HighByte; + } + else + { + /* Read the next EEPROM byte into the endpoint */ + WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + } + else + { + uint32_t PageStartAddress = CurrAddress; + + if (MemoryType == 'F') + { + boot_page_erase(PageStartAddress); + boot_spm_busy_wait(); + } + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* If both bytes in current word have been written, increment the address counter */ + if (HighByte) + { + /* Write the next FLASH word to the current FLASH page */ + boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + else + { + LowByte = FetchNextCommandByte(); + } + + HighByte = !HighByte; + } + else + { + /* Write the next EEPROM byte from the endpoint */ + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + + /* If in FLASH programming mode, commit the page after writing */ + if (MemoryType == 'F') + { + /* Commit the flash page to memory */ + boot_page_write(PageStartAddress); + + /* Wait until write operation has completed */ + boot_spm_busy_wait(); + } + + /* Send response byte back to the host */ + WriteNextResponseByte('\r'); + } +} +#endif + +/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed + * to allow reception of the next data packet from the host. + * + * \return Next received byte from the host in the CDC data OUT endpoint + */ +static uint8_t FetchNextCommandByte(void) +{ + /* Select the OUT endpoint so that the next data byte can be read */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* If OUT endpoint empty, clear it and wait for the next packet from the host */ + while (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return 0; + } + } + + /* Fetch the next byte from the OUT endpoint */ + return Endpoint_Read_8(); +} + +/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the + * bank when full ready for the next byte in the packet to the host. + * + * \param[in] Response Next response byte to send to the host + */ +static void WriteNextResponseByte(const uint8_t Response) +{ + /* Select the IN endpoint so that the next data byte can be written */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ + if (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Write the next byte to the IN endpoint */ + Endpoint_Write_8(Response); +} + +/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions + * and send the appropriate response back to the host. + */ +void CDC_Task(void) +{ + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Check if endpoint has a command in it sent from the host */ + if (!(Endpoint_IsOUTReceived())) + return; + + /* Read in the bootloader command (first byte sent from host) */ + uint8_t Command = FetchNextCommandByte(); + + if (Command == 'E') + { + RunBootloader = false; + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'T') + { + FetchNextCommandByte(); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if ((Command == 'L') || (Command == 'P')) + { + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 't') + { + /* Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader */ + WriteNextResponseByte(0x44); + WriteNextResponseByte(0x00); + } + else if (Command == 'a') + { + /* Indicate auto-address increment is supported */ + WriteNextResponseByte('Y'); + } + else if (Command == 'A') + { + /* Set the current address to that given by the host */ + CurrAddress = (FetchNextCommandByte() << 9); + CurrAddress |= (FetchNextCommandByte() << 1); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'p') + { + /* Indicate serial programmer back to the host */ + WriteNextResponseByte('S'); + } + else if (Command == 'S') + { + /* Write the 7-byte software identifier to the endpoint */ + for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) + WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); + } + else if (Command == 'V') + { + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); + } + else if (Command == 's') + { + WriteNextResponseByte(AVR_SIGNATURE_3); + WriteNextResponseByte(AVR_SIGNATURE_2); + WriteNextResponseByte(AVR_SIGNATURE_1); + } + else if (Command == 'e') + { + /* Clear the application section of flash */ + for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) + { + boot_page_erase(CurrFlashAddress); + boot_spm_busy_wait(); + boot_page_write(CurrFlashAddress); + boot_spm_busy_wait(); + } + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) + else if (Command == 'l') + { + /* Set the lock bits to those given by the host */ + boot_lock_bits_set(FetchNextCommandByte()); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + #endif + else if (Command == 'r') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); + } + else if (Command == 'F') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); + } + else if (Command == 'N') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); + } + else if (Command == 'Q') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); + } + #if !defined(NO_BLOCK_SUPPORT) + else if (Command == 'b') + { + WriteNextResponseByte('Y'); + + /* Send block size to the host */ + WriteNextResponseByte(SPM_PAGESIZE >> 8); + WriteNextResponseByte(SPM_PAGESIZE & 0xFF); + } + else if ((Command == 'B') || (Command == 'g')) + { + /* Delegate the block write/read to a separate function for clarity */ + ReadWriteMemoryBlock(Command); + } + #endif + #if !defined(NO_FLASH_BYTE_SUPPORT) + else if (Command == 'C') + { + /* Write the high byte to the current flash page */ + boot_page_fill(CurrAddress, FetchNextCommandByte()); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'c') + { + /* Write the low byte to the current flash page */ + boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); + + /* Increment the address */ + CurrAddress += 2; + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'm') + { + /* Commit the flash page to memory */ + boot_page_write(CurrAddress); + + /* Wait until write operation has completed */ + boot_spm_busy_wait(); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'R') + { + #if (FLASHEND > 0xFFFF) + uint16_t ProgramWord = pgm_read_word_far(CurrAddress); + #else + uint16_t ProgramWord = pgm_read_word(CurrAddress); + #endif + + WriteNextResponseByte(ProgramWord >> 8); + WriteNextResponseByte(ProgramWord & 0xFF); + } + #endif + #if !defined(NO_EEPROM_BYTE_SUPPORT) + else if (Command == 'D') + { + /* Read the byte from the endpoint and write it to the EEPROM */ + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + /* Increment the address after use */ + CurrAddress += 2; + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'd') + { + /* Read the EEPROM byte and write it to the endpoint */ + WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); + + /* Increment the address after use */ + CurrAddress += 2; + } + #endif + else if (Command != 27) + { + /* Unknown (non-sync) command, return fail code */ + WriteNextResponseByte('?'); + } + + /* Select the IN endpoint */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* Remember if the endpoint is completely full before clearing it */ + bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); + + /* Send the endpoint data to the host */ + Endpoint_ClearIN(); + + /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ + if (IsEndpointFull) + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearIN(); + } + + /* Wait until the data has been sent to the host */ + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Acknowledge the command from the host */ + Endpoint_ClearOUT(); +} + diff --git a/bootloaders/caterina_LUFA/BootloaderCDC.h b/bootloaders/caterina_LUFA/BootloaderCDC.h new file mode 100755 index 0000000..2856dc4 --- /dev/null +++ b/bootloaders/caterina_LUFA/BootloaderCDC.h @@ -0,0 +1,88 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for BootloaderCDC.c. + */ + +#ifndef _CDC_H_ +#define _CDC_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + #include + + /* Macros: */ + /** Version major of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MAJOR 0x01 + + /** Version minor of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MINOR 0x00 + + /** Hardware version major of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MAJOR 0x01 + + /** Hardware version minor of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MINOR 0x00 + + /** Eight character bootloader firmware identifier reported to the host when requested */ + #define SOFTWARE_IDENTIFIER "LUFACDC" + + /* Type Defines: */ + /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ + typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; + + /* Function Prototypes: */ + void CDC_Task(void); + void SetupHardware(void); + + void EVENT_USB_Device_ConfigurationChanged(void); + + #if defined(INCLUDE_FROM_BOOTLOADERCDC_C) || defined(__DOXYGEN__) + #if !defined(NO_BLOCK_SUPPORT) + static void ReadWriteMemoryBlock(const uint8_t Command); + #endif + static uint8_t FetchNextCommandByte(void); + static void WriteNextResponseByte(const uint8_t Response); + #endif + +#endif + diff --git a/bootloaders/caterina_LUFA/BootloaderCDC.txt b/bootloaders/caterina_LUFA/BootloaderCDC.txt new file mode 100755 index 0000000..c9aff82 --- /dev/null +++ b/bootloaders/caterina_LUFA/BootloaderCDC.txt @@ -0,0 +1,119 @@ +/** \file + * + * This file contains special DoxyGen information for the generation of the main page and other special + * documentation pages. It is not a project source file. + */ + +/** \mainpage CDC Class USB AVR Bootloader + * + * \section Sec_Compat Demo Compatibility: + * + * The following list indicates what microcontrollers are compatible with this demo. + * + * - Series 7 USB AVRs (AT90USBxxx7) + * - Series 6 USB AVRs (AT90USBxxx6) + * - Series 4 USB AVRs (ATMEGAxxU4) + * - Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2) + * + * \section Sec_Info USB Information: + * + * The following table gives a rundown of the USB utilization of this demo. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
USB Mode:Device
USB Class:Communications Device Class (CDC)
USB Subclass:Abstract Control Model (ACM)
Relevant Standards:USBIF CDC Class Standard
Usable Speeds:Full Speed Mode
+ * + * \section Sec_Description Project Description: + * + * This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109 + * protocol compatible programming software to load firmware onto the AVR. + * + * Out of the box this bootloader builds for the USB1287, and will fit into 4KB of bootloader space. If + * you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU + * values in the accompanying makefile. + * + * When the bootloader is running, the board's LED(s) will flash at regular intervals to distinguish the + * bootloader from the normal user application. + * + * \section Sec_Installation Driver Installation + * + * After running this bootloader for the first time on a new computer, you will need to supply the .INF + * file located in this bootloader project's directory as the device's driver when running under Windows. + * This will enable Windows to use its inbuilt CDC drivers, negating the need for custom drivers for the + * device. Other Operating Systems should automatically use their own inbuilt CDC-ACM drivers. + * + * \section Sec_HostApp Host Controller Application + * + * This bootloader is compatible with the open source application AVRDUDE, Atmel's AVRPROG, or other + * applications implementing the AVR109 protocol, which is documented on the Atmel website as an application + * note. + * + * \subsection SSec_AVRDude AVRDUDE (Windows, Mac, Linux) + * + * AVRDude is a free, cross-platform and open source command line programmer for Atmel and third party AVR + * programmers. It is available on the the Windows platform as part of the "WinAVR" package, or on other systems + * either from a build from the official source code, or in many distributions as a precompiled binary package. + * + * To load a new HEX file with AVRDude, specify "AVR109" as the programmer, with the allocated COM port. On Windows + * platforms this will be a COMx port name: + * \code + * avrdude -c AVR109 -p at90usb1287 -P COM0 -U flash:w:Mouse.hex + * \endcode + * + * On Linux systems, this will typically be a /dev/ttyACMx port name: + * \code + * avrdude -c AVR109 -p at90usb1287 -P /dev/ttyACM0 -U flash:w:Mouse.hex + * \endcode + * + * Refer to the AVRDude project documentation for additional usage instructions. + * + * \section Sec_Options Project Options + * + * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NO_BLOCK_SUPPORTMakefile LUFA_OPTSDefine to disable memory block read/write support in the bootloader, requiring all reads and writes to be made + * using the byte-level commands.
NO_EEPROM_BYTE_SUPPORTMakefile LUFA_OPTSDefine to disable EEPROM memory byte read/write support in the bootloader, requiring all EEPROM reads and writes + * to be made using the block-level commands.
NO_FLASH_BYTE_SUPPORTMakefile LUFA_OPTSDefine to disable FLASH memory byte read/write support in the bootloader, requiring all FLASH reads and writes + * to be made using the block-level commands.
NO_LOCK_BYTE_WRITE_SUPPORTMakefile LUFA_OPTSDefine to disable lock byte write support in the bootloader, preventing the lock bits from being set programmatically.
+ */ + diff --git a/bootloaders/caterina_LUFA/Descriptors.c b/bootloaders/caterina_LUFA/Descriptors.c new file mode 100755 index 0000000..a3ca700 --- /dev/null +++ b/bootloaders/caterina_LUFA/Descriptors.c @@ -0,0 +1,243 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +const USB_Descriptor_Device_t DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_NoSpecificSubclass, + .Protocol = CDC_CSCP_NoSpecificProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x03EB, + .ProductID = 0x204A, + .ReleaseNumber = VERSION_BCD(00.01), + + .ManufacturerStrIndex = NO_DESCRIPTOR, + .ProductStrIndex = 0x01, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_ACMSubclass, + .Protocol = CDC_CSCP_ATCommandProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_Header = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x00, + + .CDCSpecification = VERSION_BCD(01.10), + }, + + .CDC_Functional_ACM = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x02, + + .Capabilities = 0x04, + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x06, + + .MasterInterfaceNumber = 0, + .SlaveInterfaceNumber = 1, + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = CDC_CSCP_CDCDataClass, + .SubClass = CDC_CSCP_NoDataSubclass, + .Protocol = CDC_CSCP_NoDataProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t ProductString = +{ + .Header = {.Size = USB_STRING_LEN(18), .Type = DTYPE_String}, + + .UnicodeString = L"AVR CDC Bootloader" +}; + +/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + if (!(DescriptorNumber)) + { + Address = &LanguageString; + Size = LanguageString.Header.Size; + } + else + { + Address = &ProductString; + Size = ProductString.Header.Size; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} + diff --git a/bootloaders/caterina_LUFA/Descriptors.h b/bootloaders/caterina_LUFA/Descriptors.h new file mode 100755 index 0000000..94091ae --- /dev/null +++ b/bootloaders/caterina_LUFA/Descriptors.h @@ -0,0 +1,139 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + /* Macros: */ + #if defined(__AVR_AT90USB1287__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB647__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB1286__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB646__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega32U6__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x87 + #elif defined(__AVR_ATmega16U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x8A + #elif defined(__AVR_ATmega16U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB162__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega8U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB82__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #else + #error The selected AVR part is not currently supported by this bootloader. + #endif + + /** Endpoint number for the CDC control interface event notification endpoint. */ + #define CDC_NOTIFICATION_EPNUM 2 + + /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ + #define CDC_TX_EPNUM 3 + + /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ + #define CDC_RX_EPNUM 4 + + /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ + #define CDC_TXRX_EPSIZE 16 + + /** Size of the CDC control interface notification endpoint bank, in bytes. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + + // CDC Control Interface + USB_Descriptor_Interface_t CDC_CCI_Interface; + USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; + USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; + USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + + // CDC Data Interface + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) + ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif + diff --git a/bootloaders/caterina_LUFA/Doxygen.conf b/bootloaders/caterina_LUFA/Doxygen.conf new file mode 100755 index 0000000..3530583 --- /dev/null +++ b/bootloaders/caterina_LUFA/Doxygen.conf @@ -0,0 +1,1565 @@ +# Doxyfile 1.6.2 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "LUFA Library - CDC Class Bootloader" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.0.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./Documentation/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.h \ + *.c \ + *.txt + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = Documentation/ + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = __* \ + INCLUDE_FROM_* + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = NO + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = NO + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = YES + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 1 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be implemented using a PHP enabled web server instead of at the web client using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server based approach is that it scales better to large projects and allows full text search. The disadvances is that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __DOXYGEN__ \ + PROGMEM + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = NO + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = NO + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = NO + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = NO + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = NO + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = NO + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 15 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 2 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf b/bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf new file mode 100755 index 0000000..7ca9850 --- /dev/null +++ b/bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf @@ -0,0 +1,106 @@ +;************************************************************ +; Windows USB CDC ACM Setup File +; Copyright (c) 2000 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%MFGNAME% +LayoutFile=layout.inf +CatalogFile=%MFGFILENAME%.cat +DriverVer=11/15/2007,5.1.2600.0 + +[Manufacturer] +%MFGNAME%=DeviceList, NTamd64 + +[DestinationDirs] +DefaultDestDir=12 + + +;------------------------------------------------------------------------------ +; Windows 2000/XP/Vista-32bit Sections +;------------------------------------------------------------------------------ + +[DriverInstall.nt] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles.nt +AddReg=DriverInstall.nt.AddReg + +[DriverCopyFiles.nt] +usbser.sys,,,0x20 + +[DriverInstall.nt.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,%DRIVERFILENAME%.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.nt.Services] +AddService=usbser, 0x00000002, DriverService.nt + +[DriverService.nt] +DisplayName=%SERVICE% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\%DRIVERFILENAME%.sys + +;------------------------------------------------------------------------------ +; Vista-64bit Sections +;------------------------------------------------------------------------------ + +[DriverInstall.NTamd64] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles.NTamd64 +AddReg=DriverInstall.NTamd64.AddReg + +[DriverCopyFiles.NTamd64] +%DRIVERFILENAME%.sys,,,0x20 + +[DriverInstall.NTamd64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,%DRIVERFILENAME%.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.NTamd64.Services] +AddService=usbser, 0x00000002, DriverService.NTamd64 + +[DriverService.NTamd64] +DisplayName=%SERVICE% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\%DRIVERFILENAME%.sys + + +;------------------------------------------------------------------------------ +; Vendor and Product ID Definitions +;------------------------------------------------------------------------------ +; When developing your USB device, the VID and PID used in the PC side +; application program and the firmware on the microcontroller must match. +; Modify the below line to use your VID and PID. Use the format as shown below. +; Note: One INF file can be used for multiple devices with different VID and PIDs. +; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. +;------------------------------------------------------------------------------ +[SourceDisksFiles] +[SourceDisksNames] +[DeviceList] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204A + +[DeviceList.NTamd64] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204A + + +;------------------------------------------------------------------------------ +; String Definitions +;------------------------------------------------------------------------------ +;Modify these strings to customize your device +;------------------------------------------------------------------------------ +[Strings] +MFGFILENAME="CDC_vista" +DRIVERFILENAME ="usbser" +MFGNAME="http://www.lufa-lib.org" +INSTDISK="LUFA CDC Bootloader Driver Installer" +DESCRIPTION="Communications Port" +SERVICE="USB RS-232 Emulation Driver" \ No newline at end of file diff --git a/bootloaders/caterina_LUFA/makefile b/bootloaders/caterina_LUFA/makefile new file mode 100755 index 0000000..990d7e5 --- /dev/null +++ b/bootloaders/caterina_LUFA/makefile @@ -0,0 +1,717 @@ +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + + +# MCU name +MCU = at90usb1287 + + +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USBKEY + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 8000000 + + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Starting byte address of the bootloader, as a byte address - computed via the formula +# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) +# +# Note that the bootloader size and start address given in AVRStudio is in words and not +# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. +FLASH_SIZE_KB = 128 +BOOT_SECTION_SIZE_KB = 4 +BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = BootloaderCDC + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../.. + + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D ORDERED_EP_CONFIG +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_RAM_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D NO_INTERNAL_SERIAL +LUFA_OPTS += -D NO_DEVICE_SELF_POWER +LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP +LUFA_OPTS += -D NO_SOF_EVENTS + +#LUFA_OPTS += -D NO_BLOCK_SUPPORT +#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT +#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT +#LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=c99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_USB=$(F_USB)UL +CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CDEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_USB=$(F_USB)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +ADEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_USB=$(F_USB)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = jtagmkII + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation \($(TARGET)\)... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +checksource: + @for f in $(SRC) $(CPPSRC) $(ASRC); do \ + if [ -f $$f ]; then \ + echo "Found Source File: $$f" ; \ + else \ + echo "Source File Not Found: $$f" ; \ + fi; done + + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program debug gdb-config checksource + -- cgit v1.2.3-18-g5258 From 11334827168091350e7d96ede1fd325faaef61fb Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 19 Jan 2012 20:31:35 -0500 Subject: superficial changes to stock LUFA CDC bootloader - renamed project, removed unnecessary files --- bootloaders/caterina_LUFA/BootloaderCDC.aps | 1 - bootloaders/caterina_LUFA/BootloaderCDC.c | 585 -------- bootloaders/caterina_LUFA/BootloaderCDC.h | 88 -- bootloaders/caterina_LUFA/BootloaderCDC.txt | 119 -- bootloaders/caterina_LUFA/Caterina.c | 585 ++++++++ bootloaders/caterina_LUFA/Caterina.h | 88 ++ bootloaders/caterina_LUFA/Caterina.hex | 232 +++ bootloaders/caterina_LUFA/Doxygen.conf | 1565 --------------------- bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf | 106 -- bootloaders/caterina_LUFA/makefile | 10 +- 10 files changed, 910 insertions(+), 2469 deletions(-) delete mode 100755 bootloaders/caterina_LUFA/BootloaderCDC.aps delete mode 100755 bootloaders/caterina_LUFA/BootloaderCDC.c delete mode 100755 bootloaders/caterina_LUFA/BootloaderCDC.h delete mode 100755 bootloaders/caterina_LUFA/BootloaderCDC.txt create mode 100755 bootloaders/caterina_LUFA/Caterina.c create mode 100755 bootloaders/caterina_LUFA/Caterina.h create mode 100644 bootloaders/caterina_LUFA/Caterina.hex delete mode 100755 bootloaders/caterina_LUFA/Doxygen.conf delete mode 100755 bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf diff --git a/bootloaders/caterina_LUFA/BootloaderCDC.aps b/bootloaders/caterina_LUFA/BootloaderCDC.aps deleted file mode 100755 index 5dc11bf..0000000 --- a/bootloaders/caterina_LUFA/BootloaderCDC.aps +++ /dev/null @@ -1 +0,0 @@ -BootloaderCDC13-Jul-2010 14:41:2513-Jul-2010 14:42:12241013-Jul-2010 14:41:2544, 18, 0, 685AVR GCCBootloaderCDC.elfC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31000BootloaderCDC.cDescriptors.cBootloaderCDC.hDescriptors.hmakefiledefaultYESmakefileatmega128111BootloaderCDC.elfdefault\1-Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\WinAVR-20100110\bin\avr-gcc.exeC:\WinAVR-20100110\utils\bin\make.exeC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\BootloaderCDC.hC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\Descriptors.hC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\BootloaderCDC.cC:\Users\Dean\Documents\Electronics\Projects\WORK\LUFAWORK\Bootloaders\CDC\Descriptors.c diff --git a/bootloaders/caterina_LUFA/BootloaderCDC.c b/bootloaders/caterina_LUFA/BootloaderCDC.c deleted file mode 100755 index 4c5aa59..0000000 --- a/bootloaders/caterina_LUFA/BootloaderCDC.c +++ /dev/null @@ -1,585 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. - */ - -#define INCLUDE_FROM_BOOTLOADERCDC_C -#include "BootloaderCDC.h" - -/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some - * operating systems will not open the port unless the settings can be set successfully. - */ -static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, - .CharFormat = CDC_LINEENCODING_OneStopBit, - .ParityType = CDC_PARITY_None, - .DataBits = 8 }; - -/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, - * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued - * command.) - */ -static uint32_t CurrAddress; - -/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run - * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite - * loop until the AVR restarts and the application runs. - */ -static bool RunBootloader = true; - - -/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously - * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start - * the loaded application code. - */ -int main(void) -{ - /* Setup hardware required for the bootloader */ - SetupHardware(); - - /* Turn on first LED on the board to indicate that the bootloader has started */ - LEDs_SetAllLEDs(LEDS_LED1); - - /* Enable global interrupts so that the USB stack can function */ - sei(); - - while (RunBootloader) - { - CDC_Task(); - USB_USBTask(); - } - - /* Disconnect from the host - USB interface will be reset later along with the AVR */ - USB_Detach(); - - /* Enable the watchdog and force a timeout to reset the AVR */ - wdt_enable(WDTO_250MS); - - for (;;); -} - -/** Configures all hardware required for the bootloader. */ -void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Disable clock division */ - clock_prescale_set(clock_div_1); - - /* Relocate the interrupt vector table to the bootloader section */ - MCUCR = (1 << IVCE); - MCUCR = (1 << IVSEL); - - /* Initialize USB Subsystem */ - USB_Init(); - LEDs_Init(); - - /* Bootloader active LED toggle timer initialization */ - TIMSK1 = (1 << TOIE1); - TCCR1B = ((1 << CS11) | (1 << CS10)); -} - -/** ISR to periodically toggle the LEDs on the board to indicate that the bootloader is active. */ -ISR(TIMER1_OVF_vect, ISR_BLOCK) -{ - LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); -} - -/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready - * to relay data to and from the attached USB host. - */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - /* Setup CDC Notification, Rx and Tx Endpoints */ - Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, - ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); -} - -/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to - * the device from the USB host before passing along unhandled control requests to the library for processing - * internally. - */ -void EVENT_USB_Device_ControlRequest(void) -{ - /* Ignore any requests that aren't directed to the CDC interface */ - if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != - (REQTYPE_CLASS | REQREC_INTERFACE)) - { - return; - } - - /* Activity - toggle indicator LEDs */ - LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); - - /* Process CDC specific control requests */ - switch (USB_ControlRequest.bRequest) - { - case CDC_REQ_GetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Write the line coding data to the control endpoint */ - Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearOUT(); - } - - break; - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Read the line coding data in from the host into the global struct */ - Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearIN(); - } - - break; - } -} - -#if !defined(NO_BLOCK_SUPPORT) -/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending - * on the AVR910 protocol command issued. - * - * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform - */ -static void ReadWriteMemoryBlock(const uint8_t Command) -{ - uint16_t BlockSize; - char MemoryType; - - bool HighByte = false; - uint8_t LowByte = 0; - - BlockSize = (FetchNextCommandByte() << 8); - BlockSize |= FetchNextCommandByte(); - - MemoryType = FetchNextCommandByte(); - - if ((MemoryType != 'E') && (MemoryType != 'F')) - { - /* Send error byte back to the host */ - WriteNextResponseByte('?'); - - return; - } - - /* Check if command is to read memory */ - if (Command == 'g') - { - /* Re-enable RWW section */ - boot_rww_enable(); - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* Read the next FLASH byte from the current FLASH page */ - #if (FLASHEND > 0xFFFF) - WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); - #else - WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); - #endif - - /* If both bytes in current word have been read, increment the address counter */ - if (HighByte) - CurrAddress += 2; - - HighByte = !HighByte; - } - else - { - /* Read the next EEPROM byte into the endpoint */ - WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - } - else - { - uint32_t PageStartAddress = CurrAddress; - - if (MemoryType == 'F') - { - boot_page_erase(PageStartAddress); - boot_spm_busy_wait(); - } - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* If both bytes in current word have been written, increment the address counter */ - if (HighByte) - { - /* Write the next FLASH word to the current FLASH page */ - boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - else - { - LowByte = FetchNextCommandByte(); - } - - HighByte = !HighByte; - } - else - { - /* Write the next EEPROM byte from the endpoint */ - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - - /* If in FLASH programming mode, commit the page after writing */ - if (MemoryType == 'F') - { - /* Commit the flash page to memory */ - boot_page_write(PageStartAddress); - - /* Wait until write operation has completed */ - boot_spm_busy_wait(); - } - - /* Send response byte back to the host */ - WriteNextResponseByte('\r'); - } -} -#endif - -/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed - * to allow reception of the next data packet from the host. - * - * \return Next received byte from the host in the CDC data OUT endpoint - */ -static uint8_t FetchNextCommandByte(void) -{ - /* Select the OUT endpoint so that the next data byte can be read */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* If OUT endpoint empty, clear it and wait for the next packet from the host */ - while (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearOUT(); - - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return 0; - } - } - - /* Fetch the next byte from the OUT endpoint */ - return Endpoint_Read_8(); -} - -/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the - * bank when full ready for the next byte in the packet to the host. - * - * \param[in] Response Next response byte to send to the host - */ -static void WriteNextResponseByte(const uint8_t Response) -{ - /* Select the IN endpoint so that the next data byte can be written */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ - if (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearIN(); - - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Write the next byte to the IN endpoint */ - Endpoint_Write_8(Response); -} - -/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions - * and send the appropriate response back to the host. - */ -void CDC_Task(void) -{ - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Check if endpoint has a command in it sent from the host */ - if (!(Endpoint_IsOUTReceived())) - return; - - /* Read in the bootloader command (first byte sent from host) */ - uint8_t Command = FetchNextCommandByte(); - - if (Command == 'E') - { - RunBootloader = false; - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - else if (Command == 'T') - { - FetchNextCommandByte(); - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - else if ((Command == 'L') || (Command == 'P')) - { - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - else if (Command == 't') - { - /* Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader */ - WriteNextResponseByte(0x44); - WriteNextResponseByte(0x00); - } - else if (Command == 'a') - { - /* Indicate auto-address increment is supported */ - WriteNextResponseByte('Y'); - } - else if (Command == 'A') - { - /* Set the current address to that given by the host */ - CurrAddress = (FetchNextCommandByte() << 9); - CurrAddress |= (FetchNextCommandByte() << 1); - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - else if (Command == 'p') - { - /* Indicate serial programmer back to the host */ - WriteNextResponseByte('S'); - } - else if (Command == 'S') - { - /* Write the 7-byte software identifier to the endpoint */ - for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) - WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); - } - else if (Command == 'V') - { - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); - } - else if (Command == 's') - { - WriteNextResponseByte(AVR_SIGNATURE_3); - WriteNextResponseByte(AVR_SIGNATURE_2); - WriteNextResponseByte(AVR_SIGNATURE_1); - } - else if (Command == 'e') - { - /* Clear the application section of flash */ - for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) - { - boot_page_erase(CurrFlashAddress); - boot_spm_busy_wait(); - boot_page_write(CurrFlashAddress); - boot_spm_busy_wait(); - } - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) - else if (Command == 'l') - { - /* Set the lock bits to those given by the host */ - boot_lock_bits_set(FetchNextCommandByte()); - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - #endif - else if (Command == 'r') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); - } - else if (Command == 'F') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); - } - else if (Command == 'N') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); - } - else if (Command == 'Q') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); - } - #if !defined(NO_BLOCK_SUPPORT) - else if (Command == 'b') - { - WriteNextResponseByte('Y'); - - /* Send block size to the host */ - WriteNextResponseByte(SPM_PAGESIZE >> 8); - WriteNextResponseByte(SPM_PAGESIZE & 0xFF); - } - else if ((Command == 'B') || (Command == 'g')) - { - /* Delegate the block write/read to a separate function for clarity */ - ReadWriteMemoryBlock(Command); - } - #endif - #if !defined(NO_FLASH_BYTE_SUPPORT) - else if (Command == 'C') - { - /* Write the high byte to the current flash page */ - boot_page_fill(CurrAddress, FetchNextCommandByte()); - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - else if (Command == 'c') - { - /* Write the low byte to the current flash page */ - boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); - - /* Increment the address */ - CurrAddress += 2; - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - else if (Command == 'm') - { - /* Commit the flash page to memory */ - boot_page_write(CurrAddress); - - /* Wait until write operation has completed */ - boot_spm_busy_wait(); - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - else if (Command == 'R') - { - #if (FLASHEND > 0xFFFF) - uint16_t ProgramWord = pgm_read_word_far(CurrAddress); - #else - uint16_t ProgramWord = pgm_read_word(CurrAddress); - #endif - - WriteNextResponseByte(ProgramWord >> 8); - WriteNextResponseByte(ProgramWord & 0xFF); - } - #endif - #if !defined(NO_EEPROM_BYTE_SUPPORT) - else if (Command == 'D') - { - /* Read the byte from the endpoint and write it to the EEPROM */ - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - /* Increment the address after use */ - CurrAddress += 2; - - /* Send confirmation byte back to the host */ - WriteNextResponseByte('\r'); - } - else if (Command == 'd') - { - /* Read the EEPROM byte and write it to the endpoint */ - WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); - - /* Increment the address after use */ - CurrAddress += 2; - } - #endif - else if (Command != 27) - { - /* Unknown (non-sync) command, return fail code */ - WriteNextResponseByte('?'); - } - - /* Select the IN endpoint */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* Remember if the endpoint is completely full before clearing it */ - bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); - - /* Send the endpoint data to the host */ - Endpoint_ClearIN(); - - /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ - if (IsEndpointFull) - { - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearIN(); - } - - /* Wait until the data has been sent to the host */ - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Acknowledge the command from the host */ - Endpoint_ClearOUT(); -} - diff --git a/bootloaders/caterina_LUFA/BootloaderCDC.h b/bootloaders/caterina_LUFA/BootloaderCDC.h deleted file mode 100755 index 2856dc4..0000000 --- a/bootloaders/caterina_LUFA/BootloaderCDC.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for BootloaderCDC.c. - */ - -#ifndef _CDC_H_ -#define _CDC_H_ - - /* Includes: */ - #include - #include - #include - #include - #include - #include - #include - - #include "Descriptors.h" - - #include - #include - - /* Macros: */ - /** Version major of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MAJOR 0x01 - - /** Version minor of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MINOR 0x00 - - /** Hardware version major of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MAJOR 0x01 - - /** Hardware version minor of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MINOR 0x00 - - /** Eight character bootloader firmware identifier reported to the host when requested */ - #define SOFTWARE_IDENTIFIER "LUFACDC" - - /* Type Defines: */ - /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ - typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; - - /* Function Prototypes: */ - void CDC_Task(void); - void SetupHardware(void); - - void EVENT_USB_Device_ConfigurationChanged(void); - - #if defined(INCLUDE_FROM_BOOTLOADERCDC_C) || defined(__DOXYGEN__) - #if !defined(NO_BLOCK_SUPPORT) - static void ReadWriteMemoryBlock(const uint8_t Command); - #endif - static uint8_t FetchNextCommandByte(void); - static void WriteNextResponseByte(const uint8_t Response); - #endif - -#endif - diff --git a/bootloaders/caterina_LUFA/BootloaderCDC.txt b/bootloaders/caterina_LUFA/BootloaderCDC.txt deleted file mode 100755 index c9aff82..0000000 --- a/bootloaders/caterina_LUFA/BootloaderCDC.txt +++ /dev/null @@ -1,119 +0,0 @@ -/** \file - * - * This file contains special DoxyGen information for the generation of the main page and other special - * documentation pages. It is not a project source file. - */ - -/** \mainpage CDC Class USB AVR Bootloader - * - * \section Sec_Compat Demo Compatibility: - * - * The following list indicates what microcontrollers are compatible with this demo. - * - * - Series 7 USB AVRs (AT90USBxxx7) - * - Series 6 USB AVRs (AT90USBxxx6) - * - Series 4 USB AVRs (ATMEGAxxU4) - * - Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2) - * - * \section Sec_Info USB Information: - * - * The following table gives a rundown of the USB utilization of this demo. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
USB Mode:Device
USB Class:Communications Device Class (CDC)
USB Subclass:Abstract Control Model (ACM)
Relevant Standards:USBIF CDC Class Standard
Usable Speeds:Full Speed Mode
- * - * \section Sec_Description Project Description: - * - * This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109 - * protocol compatible programming software to load firmware onto the AVR. - * - * Out of the box this bootloader builds for the USB1287, and will fit into 4KB of bootloader space. If - * you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU - * values in the accompanying makefile. - * - * When the bootloader is running, the board's LED(s) will flash at regular intervals to distinguish the - * bootloader from the normal user application. - * - * \section Sec_Installation Driver Installation - * - * After running this bootloader for the first time on a new computer, you will need to supply the .INF - * file located in this bootloader project's directory as the device's driver when running under Windows. - * This will enable Windows to use its inbuilt CDC drivers, negating the need for custom drivers for the - * device. Other Operating Systems should automatically use their own inbuilt CDC-ACM drivers. - * - * \section Sec_HostApp Host Controller Application - * - * This bootloader is compatible with the open source application AVRDUDE, Atmel's AVRPROG, or other - * applications implementing the AVR109 protocol, which is documented on the Atmel website as an application - * note. - * - * \subsection SSec_AVRDude AVRDUDE (Windows, Mac, Linux) - * - * AVRDude is a free, cross-platform and open source command line programmer for Atmel and third party AVR - * programmers. It is available on the the Windows platform as part of the "WinAVR" package, or on other systems - * either from a build from the official source code, or in many distributions as a precompiled binary package. - * - * To load a new HEX file with AVRDude, specify "AVR109" as the programmer, with the allocated COM port. On Windows - * platforms this will be a COMx port name: - * \code - * avrdude -c AVR109 -p at90usb1287 -P COM0 -U flash:w:Mouse.hex - * \endcode - * - * On Linux systems, this will typically be a /dev/ttyACMx port name: - * \code - * avrdude -c AVR109 -p at90usb1287 -P /dev/ttyACM0 -U flash:w:Mouse.hex - * \endcode - * - * Refer to the AVRDude project documentation for additional usage instructions. - * - * \section Sec_Options Project Options - * - * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
NO_BLOCK_SUPPORTMakefile LUFA_OPTSDefine to disable memory block read/write support in the bootloader, requiring all reads and writes to be made - * using the byte-level commands.
NO_EEPROM_BYTE_SUPPORTMakefile LUFA_OPTSDefine to disable EEPROM memory byte read/write support in the bootloader, requiring all EEPROM reads and writes - * to be made using the block-level commands.
NO_FLASH_BYTE_SUPPORTMakefile LUFA_OPTSDefine to disable FLASH memory byte read/write support in the bootloader, requiring all FLASH reads and writes - * to be made using the block-level commands.
NO_LOCK_BYTE_WRITE_SUPPORTMakefile LUFA_OPTSDefine to disable lock byte write support in the bootloader, preventing the lock bits from being set programmatically.
- */ - diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c new file mode 100755 index 0000000..da7e7ba --- /dev/null +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -0,0 +1,585 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. + */ + +#define INCLUDE_FROM_CATERINA_C +#include "Caterina.h" + +/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some + * operating systems will not open the port unless the settings can be set successfully. + */ +static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, + .CharFormat = CDC_LINEENCODING_OneStopBit, + .ParityType = CDC_PARITY_None, + .DataBits = 8 }; + +/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, + * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued + * command.) + */ +static uint32_t CurrAddress; + +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run + * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite + * loop until the AVR restarts and the application runs. + */ +static bool RunBootloader = true; + + +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously + * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start + * the loaded application code. + */ +int main(void) +{ + /* Setup hardware required for the bootloader */ + SetupHardware(); + + /* Turn on first LED on the board to indicate that the bootloader has started */ + LEDs_SetAllLEDs(LEDS_LED1); + + /* Enable global interrupts so that the USB stack can function */ + sei(); + + while (RunBootloader) + { + CDC_Task(); + USB_USBTask(); + } + + /* Disconnect from the host - USB interface will be reset later along with the AVR */ + USB_Detach(); + + /* Enable the watchdog and force a timeout to reset the AVR */ + wdt_enable(WDTO_250MS); + + for (;;); +} + +/** Configures all hardware required for the bootloader. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + /* Relocate the interrupt vector table to the bootloader section */ + MCUCR = (1 << IVCE); + MCUCR = (1 << IVSEL); + + /* Initialize USB Subsystem */ + USB_Init(); + LEDs_Init(); + + /* Bootloader active LED toggle timer initialization */ + TIMSK1 = (1 << TOIE1); + TCCR1B = ((1 << CS11) | (1 << CS10)); +} + +/** ISR to periodically toggle the LEDs on the board to indicate that the bootloader is active. */ +ISR(TIMER1_OVF_vect, ISR_BLOCK) +{ + LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); +} + +/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready + * to relay data to and from the attached USB host. + */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + /* Setup CDC Notification, Rx and Tx Endpoints */ + Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, + ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); +} + +/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to + * the device from the USB host before passing along unhandled control requests to the library for processing + * internally. + */ +void EVENT_USB_Device_ControlRequest(void) +{ + /* Ignore any requests that aren't directed to the CDC interface */ + if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != + (REQTYPE_CLASS | REQREC_INTERFACE)) + { + return; + } + + /* Activity - toggle indicator LEDs */ + LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); + + /* Process CDC specific control requests */ + switch (USB_ControlRequest.bRequest) + { + case CDC_REQ_GetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Write the line coding data to the control endpoint */ + Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearOUT(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Read the line coding data in from the host into the global struct */ + Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearIN(); + } + + break; + } +} + +#if !defined(NO_BLOCK_SUPPORT) +/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending + * on the AVR910 protocol command issued. + * + * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform + */ +static void ReadWriteMemoryBlock(const uint8_t Command) +{ + uint16_t BlockSize; + char MemoryType; + + bool HighByte = false; + uint8_t LowByte = 0; + + BlockSize = (FetchNextCommandByte() << 8); + BlockSize |= FetchNextCommandByte(); + + MemoryType = FetchNextCommandByte(); + + if ((MemoryType != 'E') && (MemoryType != 'F')) + { + /* Send error byte back to the host */ + WriteNextResponseByte('?'); + + return; + } + + /* Check if command is to read memory */ + if (Command == 'g') + { + /* Re-enable RWW section */ + boot_rww_enable(); + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* Read the next FLASH byte from the current FLASH page */ + #if (FLASHEND > 0xFFFF) + WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); + #else + WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); + #endif + + /* If both bytes in current word have been read, increment the address counter */ + if (HighByte) + CurrAddress += 2; + + HighByte = !HighByte; + } + else + { + /* Read the next EEPROM byte into the endpoint */ + WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + } + else + { + uint32_t PageStartAddress = CurrAddress; + + if (MemoryType == 'F') + { + boot_page_erase(PageStartAddress); + boot_spm_busy_wait(); + } + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* If both bytes in current word have been written, increment the address counter */ + if (HighByte) + { + /* Write the next FLASH word to the current FLASH page */ + boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + else + { + LowByte = FetchNextCommandByte(); + } + + HighByte = !HighByte; + } + else + { + /* Write the next EEPROM byte from the endpoint */ + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + + /* If in FLASH programming mode, commit the page after writing */ + if (MemoryType == 'F') + { + /* Commit the flash page to memory */ + boot_page_write(PageStartAddress); + + /* Wait until write operation has completed */ + boot_spm_busy_wait(); + } + + /* Send response byte back to the host */ + WriteNextResponseByte('\r'); + } +} +#endif + +/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed + * to allow reception of the next data packet from the host. + * + * \return Next received byte from the host in the CDC data OUT endpoint + */ +static uint8_t FetchNextCommandByte(void) +{ + /* Select the OUT endpoint so that the next data byte can be read */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* If OUT endpoint empty, clear it and wait for the next packet from the host */ + while (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return 0; + } + } + + /* Fetch the next byte from the OUT endpoint */ + return Endpoint_Read_8(); +} + +/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the + * bank when full ready for the next byte in the packet to the host. + * + * \param[in] Response Next response byte to send to the host + */ +static void WriteNextResponseByte(const uint8_t Response) +{ + /* Select the IN endpoint so that the next data byte can be written */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ + if (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Write the next byte to the IN endpoint */ + Endpoint_Write_8(Response); +} + +/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions + * and send the appropriate response back to the host. + */ +void CDC_Task(void) +{ + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Check if endpoint has a command in it sent from the host */ + if (!(Endpoint_IsOUTReceived())) + return; + + /* Read in the bootloader command (first byte sent from host) */ + uint8_t Command = FetchNextCommandByte(); + + if (Command == 'E') + { + RunBootloader = false; + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'T') + { + FetchNextCommandByte(); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if ((Command == 'L') || (Command == 'P')) + { + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 't') + { + /* Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader */ + WriteNextResponseByte(0x44); + WriteNextResponseByte(0x00); + } + else if (Command == 'a') + { + /* Indicate auto-address increment is supported */ + WriteNextResponseByte('Y'); + } + else if (Command == 'A') + { + /* Set the current address to that given by the host */ + CurrAddress = (FetchNextCommandByte() << 9); + CurrAddress |= (FetchNextCommandByte() << 1); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'p') + { + /* Indicate serial programmer back to the host */ + WriteNextResponseByte('S'); + } + else if (Command == 'S') + { + /* Write the 7-byte software identifier to the endpoint */ + for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) + WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); + } + else if (Command == 'V') + { + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); + } + else if (Command == 's') + { + WriteNextResponseByte(AVR_SIGNATURE_3); + WriteNextResponseByte(AVR_SIGNATURE_2); + WriteNextResponseByte(AVR_SIGNATURE_1); + } + else if (Command == 'e') + { + /* Clear the application section of flash */ + for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) + { + boot_page_erase(CurrFlashAddress); + boot_spm_busy_wait(); + boot_page_write(CurrFlashAddress); + boot_spm_busy_wait(); + } + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) + else if (Command == 'l') + { + /* Set the lock bits to those given by the host */ + boot_lock_bits_set(FetchNextCommandByte()); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + #endif + else if (Command == 'r') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); + } + else if (Command == 'F') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); + } + else if (Command == 'N') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); + } + else if (Command == 'Q') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); + } + #if !defined(NO_BLOCK_SUPPORT) + else if (Command == 'b') + { + WriteNextResponseByte('Y'); + + /* Send block size to the host */ + WriteNextResponseByte(SPM_PAGESIZE >> 8); + WriteNextResponseByte(SPM_PAGESIZE & 0xFF); + } + else if ((Command == 'B') || (Command == 'g')) + { + /* Delegate the block write/read to a separate function for clarity */ + ReadWriteMemoryBlock(Command); + } + #endif + #if !defined(NO_FLASH_BYTE_SUPPORT) + else if (Command == 'C') + { + /* Write the high byte to the current flash page */ + boot_page_fill(CurrAddress, FetchNextCommandByte()); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'c') + { + /* Write the low byte to the current flash page */ + boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); + + /* Increment the address */ + CurrAddress += 2; + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'm') + { + /* Commit the flash page to memory */ + boot_page_write(CurrAddress); + + /* Wait until write operation has completed */ + boot_spm_busy_wait(); + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'R') + { + #if (FLASHEND > 0xFFFF) + uint16_t ProgramWord = pgm_read_word_far(CurrAddress); + #else + uint16_t ProgramWord = pgm_read_word(CurrAddress); + #endif + + WriteNextResponseByte(ProgramWord >> 8); + WriteNextResponseByte(ProgramWord & 0xFF); + } + #endif + #if !defined(NO_EEPROM_BYTE_SUPPORT) + else if (Command == 'D') + { + /* Read the byte from the endpoint and write it to the EEPROM */ + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + /* Increment the address after use */ + CurrAddress += 2; + + /* Send confirmation byte back to the host */ + WriteNextResponseByte('\r'); + } + else if (Command == 'd') + { + /* Read the EEPROM byte and write it to the endpoint */ + WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); + + /* Increment the address after use */ + CurrAddress += 2; + } + #endif + else if (Command != 27) + { + /* Unknown (non-sync) command, return fail code */ + WriteNextResponseByte('?'); + } + + /* Select the IN endpoint */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* Remember if the endpoint is completely full before clearing it */ + bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); + + /* Send the endpoint data to the host */ + Endpoint_ClearIN(); + + /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ + if (IsEndpointFull) + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearIN(); + } + + /* Wait until the data has been sent to the host */ + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Acknowledge the command from the host */ + Endpoint_ClearOUT(); +} + diff --git a/bootloaders/caterina_LUFA/Caterina.h b/bootloaders/caterina_LUFA/Caterina.h new file mode 100755 index 0000000..45268de --- /dev/null +++ b/bootloaders/caterina_LUFA/Caterina.h @@ -0,0 +1,88 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for BootloaderCDC.c. + */ + +#ifndef _CDC_H_ +#define _CDC_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + #include + + /* Macros: */ + /** Version major of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MAJOR 0x01 + + /** Version minor of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MINOR 0x00 + + /** Hardware version major of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MAJOR 0x01 + + /** Hardware version minor of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MINOR 0x00 + + /** Eight character bootloader firmware identifier reported to the host when requested */ + #define SOFTWARE_IDENTIFIER "LUFACDC" + + /* Type Defines: */ + /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ + typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; + + /* Function Prototypes: */ + void CDC_Task(void); + void SetupHardware(void); + + void EVENT_USB_Device_ConfigurationChanged(void); + + #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) + #if !defined(NO_BLOCK_SUPPORT) + static void ReadWriteMemoryBlock(const uint8_t Command); + #endif + static uint8_t FetchNextCommandByte(void); + static void WriteNextResponseByte(const uint8_t Response); + #endif + +#endif + diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex new file mode 100644 index 0000000..79bf083 --- /dev/null +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -0,0 +1,232 @@ +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC0000040C400005AC0000004 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C000004EC000004CC000004AC000000C +:1070500049C0000046C0000044C0000042C000001B +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEEC53 +:1070C000FDE702C005900D92AC38B107D9F711E089 +:1070D000ACE8B1E001C01D92AA39B107E1F719D3BC +:1070E00074C68ECF1F920F920FB60F9211248F93FA +:1070F0009F938BB190E389278BB99F918F910F90CC +:107100000FBE0F901F90189584E08093E9000DC08A +:107110008091E8008B778093E80003C08EB38823CA +:1071200051F08091E80082FFF9CF8091E80085FF5F +:10713000EFCF8091F1000895982F83E08093E900CC +:107140008091E80085FD0DC08091E8008E778093E6 +:10715000E80003C08EB3882331F08091E80080FFFF +:10716000F9CF9093F10008954F925F926F927F92C2 +:107170008F929F92AF92BF92CF92DF92EF92FF9247 +:107180000F931F93CF93DF9384E08093E900809166 +:10719000E80082FF45C2B8DF182F853419F4109239 +:1071A000080103C0843519F4AFDF8DE00FC28C34C1 +:1071B000E1F38035D1F3843721F484E4BDDF80E04E +:1071C00005C2813611F489E501C28134B1F49CDF36 +:1071D000182F9ADF90E0880F991FAA2797FDA09596 +:1071E000BA2F312F330F20E0442737FD4095542F1D +:1071F000822B932BA42BB52BBAC1803711F483E5D6 +:10720000E5C1833549F4C0E0D1E0899195DF21E003 +:10721000C730D207D1F7DBC1863521F481E38CDF9B +:1072200080E3D4C1833731F487E886DF85E984DFE2 +:107230008EE1CCC18536B9F4E0E0F0E093E085E082 +:1072400090935700E89507B600FCFDCF8093570058 +:10725000E89507B600FCFDCFE058FF4FA0E7E0300F +:10726000FA0771F7A2CF8C3651F44EDF809599E082 +:10727000E1E0F0E0082E90935700E89596CF823732 +:1072800039F4E1E0F0E089E08093570084919EC1F9 +:10729000863439F4E0E0F0E089E08093570084918F +:1072A00095C18E3439F4E3E0F0E089E08093570033 +:1072B00084918CC1813539F4E2E0F0E089E080937B +:1072C0005700849183C1823631F489E535DF80E04F +:1072D00033DF80E87BC1823419F0873609F0DBC0E8 +:1072E00013DF082F11DFF82E0FDF682E8554823050 +:1072F00008F06BC1902F80E0CF2DD0E0C82BD92BA8 +:10730000173609F04BC081E180935700E895DD24E2 +:10731000CC24C3943FC0E0908C01F0908D0100918B +:107320008E0110918F01B6E46B16D9F4ED2DF0E0CB +:10733000EE29FF29E4918E2FFFDEDD2081F082E02F +:1073400090E0A0E0B0E0E80EF91E0A1F1B1FE092DB +:107350008C01F0928D0100938E0110938F01DC243B +:1073600018C0D801C701B695A7959795879517D5E9 +:10737000E3DE82E090E0A0E0B0E0E80EF91E0A1F34 +:107380001B1FE0928C01F0928D0100938E011093EF +:107390008F012197209709F0BECF19C180908C01F1 +:1073A00090908D01A0908E01B0908F0196E46916A7 +:1073B00009F05DC083E0F40180935700E89507B6BB +:1073C00000FCFDCF54C0F6E46F1661F5772031F173 +:1073D000E0908C01F0908D0100918E0110918F0151 +:1073E00093DED82ECC24852D90E08C299D29F701A1 +:1073F0000C0140925700E895112482E090E0A0E053 +:10740000B0E0E80EF91E0A1F1B1FE0928C01F092FB +:107410008D0100938E0110938F0102C075DE582EEE +:10742000742423C0E0908C01F0908D0100918E01B6 +:1074300010918F0116950795F794E79465DE682FF4 +:10744000C701B5D480918C0190918D01A0918E01DE +:10745000B0918F010296A11DB11D80938C01909374 +:107460008D01A0938E01B0938F01219704C0552404 +:10747000772444244394209709F0A5CF96E4691615 +:1074800009F093CE85E0F40180935700E89507B6A4 +:1074900000FCFDCF8ACE833471F400918C011091F1 +:1074A0008D0132DE90E021E0F8010C0120935700BD +:1074B000E89511247ACE833619F5E0908C01F0908E +:1074C0008D0100918E0110918F011EDEF701E160A8 +:1074D00090E021E00C0120935700E895112482E010 +:1074E00090E0A0E0B0E0E80EF91E0A1F1B1FE0923A +:1074F0008C01F0928D0100938E0110938F0155CE77 +:107500008D3661F4E0918C01F0918D0185E08093DE +:107510005700E89507B600FCFDCF47CE823551F401 +:10752000E0918C01F0918D0105911491812F04DE81 +:10753000802F4CC0843421F5E0908C01F0908D01B7 +:1075400000918E0110918F0116950795F794E7949D +:10755000DBDD682FC7012BD480918C0190918D01C8 +:10756000A0918E01B0918F010296A11DB11D809353 +:107570008C0190938D01A0938E01B0938F0115CE55 +:10758000843609F5E0908C01F0908D0100918E0118 +:1075900010918F01D801C701B695A795979587954A +:1075A000FED3CADD82E090E0A0E0B0E0E80EF91E74 +:1075B0000A1F1B1FE0928C01F0928D0100938E0137 +:1075C00010938F0104C08B3111F08FE3B5DD83E0A0 +:1075D0008093E9009091E8008091E8008E77809395 +:1075E000E80095FF04C010C08EB38823C9F08091D5 +:1075F000E80080FFF9CF8091E8008E778093E80063 +:1076000003C08EB3882361F08091E80080FFF9CF3A +:1076100084E08093E9008091E8008B778093E80014 +:10762000DF91CF911F910F91FF90EF90DF90CF905E +:10763000BF90AF909F908F907F906F905F904F9092 +:10764000089520919201822F8F77813269F58BB155 +:1076500090E389278BB9809193018032A1F0813228 +:1076600019F5213A09F58091E800877F8093E800B9 +:1076700089E091E067E070E0C9D18091E8008B7704 +:107680008093E8000895213279F48091E800877FA3 +:107690008093E80089E091E067E070E01BD2809180 +:1076A000E8008E778093E800089582E061EC42E084 +:1076B00073D083E061E842E16FD084E060E842E1AA +:1076C0006BC01F9384B7877F84BF88E10FB6F8949F +:1076D00080936000109260000FBE80E090E020E890 +:1076E0000FB6F89420936100809361000FBE11E003 +:1076F00015BF82E085BFC1D08AB1806F8AB98BB1D6 +:107700008F708BB910936F0083E0809381001F917D +:107710000895D7DF8BB18F7080618BB9789402C0E8 +:1077200023DD2BD3809108018823D1F78091E000DD +:1077300081608093E0002CE088E190E00FB6F8943F +:10774000A895809360000FBE20936000FFCFFA01E0 +:10775000923071F0933089F0913029F480E191E01A +:1077600022E130E015C080E090E020E030E010C081 +:1077700082E291E02EE330E00BC0882329F480E61A +:1077800091E024E030E004C084E691E026E230E0BD +:1077900091838083C90108958093E9008091EB0073 +:1077A00081608093EB001092ED006093EC004093B9 +:1077B000ED008091EE00881F8827881F0895809132 +:1077C000920188238CF403C08EB38823B1F080919A +:1077D000E80082FFF9CF8091E8008B778093E80082 +:1077E00008958EB3882349F08091E80080FFF9CF97 +:1077F0008091E8008E778093E8000895EF92FF92E1 +:107800000F931F9345D04CD008ED10E0F801808114 +:107810008F77808380818068808380818F7D808363 +:1078200019BC1EBA1092900180EEE82EF12CF701DF +:1078300080818B7F8083F80180818160808380E0FC +:1078400060E042E0A9DFE1EEF0E080818E7F80839E +:10785000E2EEF0E0808181608083808188608083B7 +:10786000F70180818E7F8083F80180818061808331 +:107870001F910F91FF90EF900895E7EDF0E0808168 +:10788000816080838AE482BF81E080939101B6CFDA +:10789000E8EDF0E080818E7F80831092E200089511 +:1078A0001092DA001092E10008951F920F920FB625 +:1078B0000F9211242F933F934F935F936F937F9376 +:1078C0008F939F93AF93BF93EF93FF938091DA00D1 +:1078D00080FF1BC08091D80080FF17C08091DA0024 +:1078E0008E7F8093DA008091D90080FF0BC080E109 +:1078F00089BD82E189BD09B400FEFDCF81E08EBB68 +:107900003BD203C019BC1EBA37D28091E10080FF80 +:1079100017C08091E20080FF13C08091E2008E7F4B +:107920008093E2008091E20080618093E200809188 +:10793000D80080628093D80019BC85E08EBB1CD231 +:107940008091E10084FF2CC08091E20084FF28C078 +:1079500080E189BD82E189BD09B400FEFDCF80913F +:10796000D8008F7D8093D8008091E1008F7E809336 +:10797000E1008091E2008F7E8093E2008091E2003E +:1079800081608093E20080919001882331F480919E +:10799000E30087FD02C081E001C084E08EBBECD132 +:1079A0008091E10083FF21C08091E20083FF1DC030 +:1079B0008091E100877F8093E10082E08EBB10928E +:1079C00090018091E1008E7F8093E1008091E20040 +:1079D0008E7F8093E2008091E20080618093E200DC +:1079E00080E060E042E0D8DEC7D1FF91EF91BF9127 +:1079F000AF919F918F917F916F915F914F913F9147 +:107A00002F910F900FBE0F901F9018959C014091E1 +:107A10009801509199014617570718F4F90190E021 +:107A200044C06115710511F0AB01F8CF8091E800F9 +:107A30008E778093E80040E050E0F0CF8EB388234B +:107A400009F444C0853009F443C08091E80083FF05 +:107A500002C081E008958091E80082FD31C08091EC +:107A6000E80080FF22C08091F3009091F200782F0F +:107A700060E0292F30E0262B372B07C081918093BF +:107A8000F100415050402F5F3F4F4115510519F013 +:107A90002830310598F390E02830310509F491E061 +:107AA0008091E8008E778093E8004115510531F60A +:107AB000992321F605C08EB3882341F0853041F02B +:107AC0008091E80082FFF7CF80E0089582E008957A +:107AD00083E008959C016115710529F48091E80007 +:107AE0008B778093E800F90126C08EB3882391F14B +:107AF000853091F18091E80083FF02C081E0089514 +:107B00008091E80082FFF1CF06C08091F10081935F +:107B10006150704059F02091F3008091F200322FB3 +:107B200020E090E0822B932B892B79F78091E8005D +:107B30008B778093E80061157105B9F605C08EB3A7 +:107B4000882341F0853041F08091E80080FFF7CF35 +:107B500080E0089582E0089583E008950F931F93D5 +:107B6000DF93CF9300D0CDB7DEB7E2E9F1E08091AB +:107B7000F100819381E0EA39F807C9F762DD80916D +:107B8000E80083FFE4C080919201909193019530C9 +:107B900009F46DC0963040F4913081F1913070F06D +:107BA000933009F0D4C02AC0983009F4A3C09930AA +:107BB00009F4B2C0963009F0CAC07CC0803809F41C +:107BC000C6C0823809F0C3C0809196018770809347 +:107BD000E9008091EB001092E9002091E800277FF6 +:107BE0002093E80090E025E0969587952A95E1F7A7 +:107BF00081708093F1001092F10087C0882319F002 +:107C0000823009F0A4C08F71823009F0A0C0809149 +:107C10009401882331F520919601277009F497C0CB +:107C20002093E9008091EB0080FF1BC0933021F48A +:107C30008091EB00806213C08091EB0080618093A3 +:107C4000EB0081E090E002C0880F991F2A95E2F7CF +:107C50008093EA001092EA008091EB0088608093A4 +:107C6000EB001092E9008091E800877F51C08823E3 +:107C700009F06DC0109194011F770FB7F8948091AF +:107C8000E800877F8093E8009ADD8091E80080FF1C +:107C9000FCCF8091E3008078812B8093E3008068A3 +:107CA0008093E300112311F482E001C083E08EBBD6 +:107CB0000FBF4DC08058823008F049C080919401B8 +:107CC0009091950160919601AE014F5F5F4F3FDD4E +:107CD000BC01009709F43BC08091E800877F809346 +:107CE000E80089819A8192DE8091E8008B77809309 +:107CF000E8002DC0803859F58091E800877F809397 +:107D0000E800809190018093F1008091E8008E77E7 +:107D10008093E80054DD1BC08823C9F4909194013E +:107D20009230A8F48091E800877F8093E8009093D8 +:107D3000900145DD80919001882331F48091E3002A +:107D400087FD02C081E001C084E08EBBAEDC809183 +:107D5000E80083FF0AC08091EB0080628093EB0013 +:107D60008091E800877F8093E8000F900F90CF917B +:107D7000DF911F910F91089508951F938EB388236B +:107D800061F01091E9001092E9008091E80083FF12 +:107D900001C0E4DE17701093E9001F910895F9996E +:107DA000FECF92BD81BDF89A992780B50895262F00 +:107DB000F999FECF1FBA92BD81BD20BD0FB6F894D0 +:0E7DC000FA9AF99A0FBE01960895F894FFCF33 +:107DCE004C554641434443000100000000000008AA +:107DDE001201100102000008EB034A20010000010D +:107DEE00000109023E000201008032090400000178 +:107DFE0002020100052400100104240204052406D9 +:107E0E000001070582030800FF09040100020A00B1 +:107E1E00000007050402100001070583021000018F +:107E2E0004030904260341005600520020004300BB +:107E3E0044004300200042006F006F0074006C008D +:0C7E4E006F00610064006500720000001D +:040000030000700089 +:00000001FF diff --git a/bootloaders/caterina_LUFA/Doxygen.conf b/bootloaders/caterina_LUFA/Doxygen.conf deleted file mode 100755 index 3530583..0000000 --- a/bootloaders/caterina_LUFA/Doxygen.conf +++ /dev/null @@ -1,1565 +0,0 @@ -# Doxyfile 1.6.2 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = "LUFA Library - CDC Class Bootloader" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.0.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = ./Documentation/ - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = YES - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it parses. -# With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this tag. -# The format is ext=language, where ext is a file extension, and language is one of -# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = YES - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = NO - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = NO - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = NO - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ./ - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 - -FILE_PATTERNS = *.h \ - *.c \ - *.txt - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = Documentation/ - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = __* \ - INCLUDE_FROM_* - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = NO - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = NO - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = YES - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = YES - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's -# filter section matches. -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 1 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = YES - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = NO - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be implemented using a PHP enabled web server instead of at the web client using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server based approach is that it scales better to large projects and allows full text search. The disadvances is that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = YES - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = __DOXYGEN__ \ - PROGMEM - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = NO - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = NO - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = NO - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = NO - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = NO - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = NO - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = NO - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 15 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 2 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = YES - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf b/bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf deleted file mode 100755 index 7ca9850..0000000 --- a/bootloaders/caterina_LUFA/LUFA CDC Bootloader.inf +++ /dev/null @@ -1,106 +0,0 @@ -;************************************************************ -; Windows USB CDC ACM Setup File -; Copyright (c) 2000 Microsoft Corporation - - -[Version] -Signature="$Windows NT$" -Class=Ports -ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} -Provider=%MFGNAME% -LayoutFile=layout.inf -CatalogFile=%MFGFILENAME%.cat -DriverVer=11/15/2007,5.1.2600.0 - -[Manufacturer] -%MFGNAME%=DeviceList, NTamd64 - -[DestinationDirs] -DefaultDestDir=12 - - -;------------------------------------------------------------------------------ -; Windows 2000/XP/Vista-32bit Sections -;------------------------------------------------------------------------------ - -[DriverInstall.nt] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles.nt -AddReg=DriverInstall.nt.AddReg - -[DriverCopyFiles.nt] -usbser.sys,,,0x20 - -[DriverInstall.nt.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,%DRIVERFILENAME%.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.nt.Services] -AddService=usbser, 0x00000002, DriverService.nt - -[DriverService.nt] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\%DRIVERFILENAME%.sys - -;------------------------------------------------------------------------------ -; Vista-64bit Sections -;------------------------------------------------------------------------------ - -[DriverInstall.NTamd64] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles.NTamd64 -AddReg=DriverInstall.NTamd64.AddReg - -[DriverCopyFiles.NTamd64] -%DRIVERFILENAME%.sys,,,0x20 - -[DriverInstall.NTamd64.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,%DRIVERFILENAME%.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.NTamd64.Services] -AddService=usbser, 0x00000002, DriverService.NTamd64 - -[DriverService.NTamd64] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\%DRIVERFILENAME%.sys - - -;------------------------------------------------------------------------------ -; Vendor and Product ID Definitions -;------------------------------------------------------------------------------ -; When developing your USB device, the VID and PID used in the PC side -; application program and the firmware on the microcontroller must match. -; Modify the below line to use your VID and PID. Use the format as shown below. -; Note: One INF file can be used for multiple devices with different VID and PIDs. -; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. -;------------------------------------------------------------------------------ -[SourceDisksFiles] -[SourceDisksNames] -[DeviceList] -%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204A - -[DeviceList.NTamd64] -%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204A - - -;------------------------------------------------------------------------------ -; String Definitions -;------------------------------------------------------------------------------ -;Modify these strings to customize your device -;------------------------------------------------------------------------------ -[Strings] -MFGFILENAME="CDC_vista" -DRIVERFILENAME ="usbser" -MFGNAME="http://www.lufa-lib.org" -INSTDISK="LUFA CDC Bootloader Driver Installer" -DESCRIPTION="Communications Port" -SERVICE="USB RS-232 Emulation Driver" \ No newline at end of file diff --git a/bootloaders/caterina_LUFA/makefile b/bootloaders/caterina_LUFA/makefile index 990d7e5..473dd77 100755 --- a/bootloaders/caterina_LUFA/makefile +++ b/bootloaders/caterina_LUFA/makefile @@ -48,7 +48,7 @@ # MCU name -MCU = at90usb1287 +MCU = atmega32u4 # Target architecture (see library "Board Types" documentation). @@ -72,7 +72,7 @@ BOARD = USBKEY # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. -F_CPU = 8000000 +F_CPU = 16000000 # Input clock frequency. @@ -94,7 +94,7 @@ F_USB = $(F_CPU) # # Note that the bootloader size and start address given in AVRStudio is in words and not # bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. -FLASH_SIZE_KB = 128 +FLASH_SIZE_KB = 32 BOOT_SECTION_SIZE_KB = 4 BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) @@ -104,7 +104,7 @@ FORMAT = ihex # Target file name (without extension). -TARGET = BootloaderCDC +TARGET = Caterina # Object files directory @@ -114,7 +114,7 @@ OBJDIR = . # Path to the LUFA library -LUFA_PATH = ../.. +LUFA_PATH = ../../../../../LUFA-111009 # LUFA library compile-time options and predefined tokens -- cgit v1.2.3-18-g5258 From d8cc8cdf4a44312b4789c9aaf8f2ba0f2a5437f4 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 19 Jan 2012 21:17:12 -0500 Subject: added Board/LEDs.h to LUFA-based Caterina --- bootloaders/caterina_LUFA/Board/LEDs.h | 128 +++++++++++++++ bootloaders/caterina_LUFA/Caterina.hex | 279 +++++++++++++++++---------------- 2 files changed, 268 insertions(+), 139 deletions(-) create mode 100755 bootloaders/caterina_LUFA/Board/LEDs.h diff --git a/bootloaders/caterina_LUFA/Board/LEDs.h b/bootloaders/caterina_LUFA/Board/LEDs.h new file mode 100755 index 0000000..d73b0bc --- /dev/null +++ b/bootloaders/caterina_LUFA/Board/LEDs.h @@ -0,0 +1,128 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +#ifndef __LEDS_LEONARDO_H__ +#define __LEDS_LEONARDO_H__ + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_LEDS_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** LED mask for the TX LED on the board. */ + #define LEDS_TX_LED (1 << 5) + #define LEDS_TX_LED_DDR DDRD + #define LEDS_TX_LED_PORT PORTD + + /** LED mask for the RX LED on the board. */ + #define LEDS_RX_LED (1 << 0) + #define LEDS_RX_LED_DDR DDRB + #define LEDS_RX_LED_PORT PORTB + + /** LED mask for the "L" LED on the board. */ + #define LEDS_L_LED (1 << 7) + #define LEDS_L_LED_DDR DDRC + #define LEDS_L_LED_PORT PORTC + + /** LED mask for all the LEDs on the board. */ + #define LEDS_ALL_LEDS (LEDS_TX_LED | LEDS_RX_LED | LEDS_L_LED) + + /** LED mask for none of the board LEDs. */ + #define LEDS_NO_LEDS 0 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + LEDS_TX_LED_DDR |= LEDS_TX_LED; + LEDS_RX_LED_DDR |= LEDS_RX_LED; + LEDS_L_LED_DDR |= LEDS_L_LED; + LEDS_TX_LED_PORT |= LEDS_TX_LED; + LEDS_RX_LED_PORT |= LEDS_RX_LED; + LEDS_L_LED_PORT &= ~LEDS_L_LED; // unlike TX and RX LEDs, L LED is active-high + } + + static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) + { + LEDS_TX_LED_PORT &= ~(LEDMask & LEDS_TX_LED); + LEDS_RX_LED_PORT &= ~(LEDMask & LEDS_RX_LED); + LEDS_L_LED_PORT |= (LEDMask & LEDS_L_LED); + } + + static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) + { + LEDS_TX_LED_PORT |= (LEDMask & LEDS_TX_LED); + LEDS_RX_LED_PORT |= (LEDMask & LEDS_RX_LED); + LEDS_L_LED_PORT &= ~(LEDMask & LEDS_L_LED); + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { +// PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask); + LEDs_TurnOffLEDs(LEDS_ALL_LEDS); + LEDs_TurnOnLEDs(LEDMask); + } + + static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, + const uint8_t ActiveMask) + { + LEDs_TurnOffLEDs(LEDMask); + LEDs_TurnOnLEDs(ActiveMask); + } + + static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) + { + LEDS_TX_LED_PORT ^= (LEDMask & LEDS_TX_LED); + LEDS_RX_LED_PORT ^= (LEDMask & LEDS_RX_LED); + LEDS_L_LED_PORT ^= (LEDMask & LEDS_L_LED); + } + + static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t LEDs_GetLEDs(void) + { + return ((LEDS_TX_LED_PORT & LEDS_TX_LED) | (LEDS_RX_LED_PORT & LEDS_RX_LED) | (LEDS_L_LED_PORT & LEDS_L_LED)); + } + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + + diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index 79bf083..c304a50 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC0000040C400005AC0000004 +:1070200060C000005EC0000047C400005AC00000FD :1070300058C0000056C0000054C0000052C00000FC :1070400050C000004EC000004CC000004AC000000C :1070500049C0000046C0000044C0000042C000001B @@ -9,11 +9,11 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEEC53 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0ECED54 :1070C000FDE702C005900D92AC38B107D9F711E089 -:1070D000ACE8B1E001C01D92AA39B107E1F719D3BC -:1070E00074C68ECF1F920F920FB60F9211248F93FA -:1070F0009F938BB190E389278BB99F918F910F90CC +:1070D000ACE8B1E001C01D92AA39B107E1F71BD3BA +:1070E0007BC68ECF1F920F920FB60F9211248F93F3 +:1070F0008BB18BB985B185B988B188B98F910F9063 :107100000FBE0F901F90189584E08093E9000DC08A :107110008091E8008B778093E80003C08EB38823CA :1071200051F08091E80082FFF9CF8091E80085FF5F @@ -52,7 +52,7 @@ :10733000EE29FF29E4918E2FFFDEDD2081F082E02F :1073400090E0A0E0B0E0E80EF91E0A1F1B1FE092DB :107350008C01F0928D0100938E0110938F01DC243B -:1073600018C0D801C701B695A7959795879517D5E9 +:1073600018C0D801C701B695A795979587951ED5E2 :10737000E3DE82E090E0A0E0B0E0E80EF91E0A1F34 :107380001B1FE0928C01F0928D0100938E011093EF :107390008F012197209709F0BECF19C180908C01F1 @@ -66,7 +66,7 @@ :107410008D0100938E0110938F0102C075DE582EEE :10742000742423C0E0908C01F0908D0100918E01B6 :1074300010918F0116950795F794E79465DE682FF4 -:10744000C701B5D480918C0190918D01A0918E01DE +:10744000C701BCD480918C0190918D01A0918E01D7 :10745000B0918F010296A11DB11D80938C01909374 :107460008D01A0938E01B0938F01219704C0552404 :10747000772444244394209709F0A5CF96E4691615 @@ -83,12 +83,12 @@ :10752000E0918C01F0918D0105911491812F04DE81 :10753000802F4CC0843421F5E0908C01F0908D01B7 :1075400000918E0110918F0116950795F794E7949D -:10755000DBDD682FC7012BD480918C0190918D01C8 +:10755000DBDD682FC70132D480918C0190918D01C1 :10756000A0918E01B0918F010296A11DB11D809353 :107570008C0190938D01A0938E01B0938F0115CE55 :10758000843609F5E0908C01F0908D0100918E0118 :1075900010918F01D801C701B695A795979587954A -:1075A000FED3CADD82E090E0A0E0B0E0E80EF91E74 +:1075A00005D4CADD82E090E0A0E0B0E0E80EF91E6C :1075B0000A1F1B1FE0928C01F0928D0100938E0137 :1075C00010938F0104C08B3111F08FE3B5DD83E0A0 :1075D0008093E9009091E8008091E8008E77809395 @@ -98,135 +98,136 @@ :1076100084E08093E9008091E8008B778093E80014 :10762000DF91CF911F910F91FF90EF90DF90CF905E :10763000BF90AF909F908F907F906F905F904F9092 -:10764000089520919201822F8F77813269F58BB155 -:1076500090E389278BB9809193018032A1F0813228 -:1076600019F5213A09F58091E800877F8093E800B9 -:1076700089E091E067E070E0C9D18091E8008B7704 -:107680008093E8000895213279F48091E800877FA3 -:107690008093E80089E091E067E070E01BD2809180 -:1076A000E8008E778093E800089582E061EC42E084 -:1076B00073D083E061E842E16FD084E060E842E1AA -:1076C0006BC01F9384B7877F84BF88E10FB6F8949F -:1076D00080936000109260000FBE80E090E020E890 -:1076E0000FB6F89420936100809361000FBE11E003 -:1076F00015BF82E085BFC1D08AB1806F8AB98BB1D6 -:107700008F708BB910936F0083E0809381001F917D -:107710000895D7DF8BB18F7080618BB9789402C0E8 -:1077200023DD2BD3809108018823D1F78091E000DD -:1077300081608093E0002CE088E190E00FB6F8943F -:10774000A895809360000FBE20936000FFCFFA01E0 -:10775000923071F0933089F0913029F480E191E01A -:1077600022E130E015C080E090E020E030E010C081 -:1077700082E291E02EE330E00BC0882329F480E61A -:1077800091E024E030E004C084E691E026E230E0BD -:1077900091838083C90108958093E9008091EB0073 -:1077A00081608093EB001092ED006093EC004093B9 -:1077B000ED008091EE00881F8827881F0895809132 -:1077C000920188238CF403C08EB38823B1F080919A -:1077D000E80082FFF9CF8091E8008B778093E80082 -:1077E00008958EB3882349F08091E80080FFF9CF97 -:1077F0008091E8008E778093E8000895EF92FF92E1 -:107800000F931F9345D04CD008ED10E0F801808114 -:107810008F77808380818068808380818F7D808363 -:1078200019BC1EBA1092900180EEE82EF12CF701DF -:1078300080818B7F8083F80180818160808380E0FC -:1078400060E042E0A9DFE1EEF0E080818E7F80839E -:10785000E2EEF0E0808181608083808188608083B7 -:10786000F70180818E7F8083F80180818061808331 -:107870001F910F91FF90EF900895E7EDF0E0808168 -:10788000816080838AE482BF81E080939101B6CFDA -:10789000E8EDF0E080818E7F80831092E200089511 -:1078A0001092DA001092E10008951F920F920FB625 -:1078B0000F9211242F933F934F935F936F937F9376 -:1078C0008F939F93AF93BF93EF93FF938091DA00D1 -:1078D00080FF1BC08091D80080FF17C08091DA0024 -:1078E0008E7F8093DA008091D90080FF0BC080E109 -:1078F00089BD82E189BD09B400FEFDCF81E08EBB68 -:107900003BD203C019BC1EBA37D28091E10080FF80 -:1079100017C08091E20080FF13C08091E2008E7F4B -:107920008093E2008091E20080618093E200809188 -:10793000D80080628093D80019BC85E08EBB1CD231 -:107940008091E10084FF2CC08091E20084FF28C078 -:1079500080E189BD82E189BD09B400FEFDCF80913F -:10796000D8008F7D8093D8008091E1008F7E809336 -:10797000E1008091E2008F7E8093E2008091E2003E -:1079800081608093E20080919001882331F480919E -:10799000E30087FD02C081E001C084E08EBBECD132 -:1079A0008091E10083FF21C08091E20083FF1DC030 -:1079B0008091E100877F8093E10082E08EBB10928E -:1079C00090018091E1008E7F8093E1008091E20040 -:1079D0008E7F8093E2008091E20080618093E200DC -:1079E00080E060E042E0D8DEC7D1FF91EF91BF9127 -:1079F000AF919F918F917F916F915F914F913F9147 -:107A00002F910F900FBE0F901F9018959C014091E1 -:107A10009801509199014617570718F4F90190E021 -:107A200044C06115710511F0AB01F8CF8091E800F9 -:107A30008E778093E80040E050E0F0CF8EB388234B -:107A400009F444C0853009F443C08091E80083FF05 -:107A500002C081E008958091E80082FD31C08091EC -:107A6000E80080FF22C08091F3009091F200782F0F -:107A700060E0292F30E0262B372B07C081918093BF -:107A8000F100415050402F5F3F4F4115510519F013 -:107A90002830310598F390E02830310509F491E061 -:107AA0008091E8008E778093E8004115510531F60A -:107AB000992321F605C08EB3882341F0853041F02B -:107AC0008091E80082FFF7CF80E0089582E008957A -:107AD00083E008959C016115710529F48091E80007 -:107AE0008B778093E800F90126C08EB3882391F14B -:107AF000853091F18091E80083FF02C081E0089514 -:107B00008091E80082FFF1CF06C08091F10081935F -:107B10006150704059F02091F3008091F200322FB3 -:107B200020E090E0822B932B892B79F78091E8005D -:107B30008B778093E80061157105B9F605C08EB3A7 -:107B4000882341F0853041F08091E80080FFF7CF35 -:107B500080E0089582E0089583E008950F931F93D5 -:107B6000DF93CF9300D0CDB7DEB7E2E9F1E08091AB -:107B7000F100819381E0EA39F807C9F762DD80916D -:107B8000E80083FFE4C080919201909193019530C9 -:107B900009F46DC0963040F4913081F1913070F06D -:107BA000933009F0D4C02AC0983009F4A3C09930AA -:107BB00009F4B2C0963009F0CAC07CC0803809F41C -:107BC000C6C0823809F0C3C0809196018770809347 -:107BD000E9008091EB001092E9002091E800277FF6 -:107BE0002093E80090E025E0969587952A95E1F7A7 -:107BF00081708093F1001092F10087C0882319F002 -:107C0000823009F0A4C08F71823009F0A0C0809149 -:107C10009401882331F520919601277009F497C0CB -:107C20002093E9008091EB0080FF1BC0933021F48A -:107C30008091EB00806213C08091EB0080618093A3 -:107C4000EB0081E090E002C0880F991F2A95E2F7CF -:107C50008093EA001092EA008091EB0088608093A4 -:107C6000EB001092E9008091E800877F51C08823E3 -:107C700009F06DC0109194011F770FB7F8948091AF -:107C8000E800877F8093E8009ADD8091E80080FF1C -:107C9000FCCF8091E3008078812B8093E3008068A3 -:107CA0008093E300112311F482E001C083E08EBBD6 -:107CB0000FBF4DC08058823008F049C080919401B8 -:107CC0009091950160919601AE014F5F5F4F3FDD4E -:107CD000BC01009709F43BC08091E800877F809346 -:107CE000E80089819A8192DE8091E8008B77809309 -:107CF000E8002DC0803859F58091E800877F809397 -:107D0000E800809190018093F1008091E8008E77E7 -:107D10008093E80054DD1BC08823C9F4909194013E -:107D20009230A8F48091E800877F8093E8009093D8 -:107D3000900145DD80919001882331F48091E3002A -:107D400087FD02C081E001C084E08EBBAEDC809183 -:107D5000E80083FF0AC08091EB0080628093EB0013 -:107D60008091E800877F8093E8000F900F90CF917B -:107D7000DF911F910F91089508951F938EB388236B -:107D800061F01091E9001092E9008091E80083FF12 -:107D900001C0E4DE17701093E9001F910895F9996E -:107DA000FECF92BD81BDF89A992780B50895262F00 -:107DB000F999FECF1FBA92BD81BD20BD0FB6F894D0 -:0E7DC000FA9AF99A0FBE01960895F894FFCF33 -:107DCE004C554641434443000100000000000008AA -:107DDE001201100102000008EB034A20010000010D -:107DEE00000109023E000201008032090400000178 -:107DFE0002020100052400100104240204052406D9 -:107E0E000001070582030800FF09040100020A00B1 -:107E1E00000007050402100001070583021000018F -:107E2E0004030904260341005600520020004300BB -:107E3E0044004300200042006F006F0074006C008D -:0C7E4E006F00610064006500720000001D +:10764000089590919201892F8F77813279F58BB1CE +:107650008BB985B185B988B188B9809193018032A1 +:10766000A1F0813219F5913A09F58091E800877F00 +:107670008093E80089E091E067E070E0CED18091EE +:10768000E8008B778093E8000895913279F4809137 +:10769000E800877F8093E80089E091E067E070E090 +:1076A00020D28091E8008E778093E800089582E0F0 +:1076B00061EC42E078D083E061E842E174D084E09C +:1076C00060E842E170C01F9384B7877F84BF88E180 +:1076D0000FB6F89480936000109260000FBE80E0B7 +:1076E00090E020E80FB6F894209361008093610049 +:1076F0000FBE11E015BF82E085BFC6D0559A209A13 +:107700003F9A5D9A289A479810936F0083E0809380 +:1077100081001F910895D7DF5D9A289A47988BB111 +:107720008BB985B185B988B188B9789402C01CDD60 +:107730002BD3809108018823D1F78091E0008160EC +:107740008093E0002CE088E190E00FB6F894A895D3 +:10775000809360000FBE20936000FFCFFA0192304B +:1077600071F0933089F0913029F480E191E022E1C9 +:1077700030E015C080E090E020E030E010C082E210 +:1077800091E02EE330E00BC0882329F480E691E0FD +:1077900024E030E004C084E691E026E230E091830A +:1077A0008083C90108958093E9008091EB00816096 +:1077B0008093EB001092ED006093EC004093ED009D +:1077C0008091EE00881F8827881F0895809192017C +:1077D00088238CF403C08EB38823B1F08091E80035 +:1077E00082FFF9CF8091E8008B778093E8000895BD +:1077F0008EB3882349F08091E80080FFF9CF809113 +:10780000E8008E778093E8000895EF92FF920F933F +:107810001F9345D04CD008ED10E0F80180818F77A0 +:10782000808380818068808380818F7D808319BC84 +:107830001EBA1092900180EEE82EF12CF7018081A3 +:107840008B7F8083F80180818160808380E060E0AD +:1078500042E0A9DFE1EEF0E080818E7F8083E2EEFE +:10786000F0E0808181608083808188608083F7017F +:1078700080818E7F8083F8018081806180831F9169 +:107880000F91FF90EF900895E7EDF0E08081816027 +:1078900080838AE482BF81E080939101B6CFE8EDD6 +:1078A000F0E080818E7F80831092E2000895109234 +:1078B000DA001092E10008951F920F920FB60F9216 +:1078C00011242F933F934F935F936F937F938F93E5 +:1078D0009F93AF93BF93EF93FF938091DA0080FF64 +:1078E0001BC08091D80080FF17C08091DA008E7F86 +:1078F0008093DA008091D90080FF0BC080E189BDC0 +:1079000082E189BD09B400FEFDCF81E08EBB3BD290 +:1079100003C019BC1EBA37D28091E10080FF17C0A6 +:107920008091E20080FF13C08091E2008E7F8093FF +:10793000E2008091E20080618093E2008091D800B3 +:1079400080628093D80019BC85E08EBB1CD28091E8 +:10795000E10084FF2CC08091E20084FF28C080E118 +:1079600089BD82E189BD09B400FEFDCF8091D800B8 +:107970008F7D8093D8008091E1008F7E8093E1001D +:107980008091E2008F7E8093E2008091E20081602E +:107990008093E20080919001882331F48091E3008C +:1079A00087FD02C081E001C084E08EBBECD18091F4 +:1079B000E10083FF21C08091E20083FF1DC0809120 +:1079C000E100877F8093E10082E08EBB10929001FE +:1079D0008091E1008E7F8093E1008091E2008E7FB4 +:1079E0008093E2008091E20080618093E20080E079 +:1079F00060E042E0D8DEC7D1FF91EF91BF91AF9137 +:107A00009F918F917F916F915F914F913F912F91B6 +:107A10000F900FBE0F901F9018959C0140919801F8 +:107A2000509199014617570718F4F90190E044C0A6 +:107A30006115710511F0AB01F8CF8091E8008E77E8 +:107A40008093E80040E050E0F0CF8EB3882309F443 +:107A500044C0853009F443C08091E80083FF02C030 +:107A600081E008958091E80082FD31C08091E800B6 +:107A700080FF22C08091F3009091F200782F60E0A7 +:107A8000292F30E0262B372B07C081918093F100FE +:107A9000415050402F5F3F4F4115510519F028309C +:107AA000310598F390E02830310509F491E0809198 +:107AB000E8008E778093E8004115510531F699234F +:107AC00021F605C08EB3882341F0853041F08091C6 +:107AD000E80082FFF7CF80E0089582E0089583E018 +:107AE00008959C016115710529F48091E8008B7758 +:107AF0008093E800F90126C08EB3882391F1853088 +:107B000091F18091E80083FF02C081E008958091A7 +:107B1000E80082FFF1CF06C08091F10081936150AF +:107B2000704059F02091F3008091F200322F20E054 +:107B300090E0822B932B892B79F78091E8008B774B +:107B40008093E80061157105B9F605C08EB38823EE +:107B500041F0853041F08091E80080FFF7CF80E070 +:107B6000089582E0089583E008950F931F93DF93B3 +:107B7000CF9300D0CDB7DEB7E2E9F1E08091F1001C +:107B8000819381E0EA39F807C9F75BDD8091E8006D +:107B900083FFE4C08091920190919301953009F4A4 +:107BA0006DC0963040F4913081F1913070F0933097 +:107BB00009F0D4C02AC0983009F4A3C0993009F460 +:107BC000B2C0963009F0CAC07CC0803809F4C6C083 +:107BD000823809F0C3C08091960187708093E900D4 +:107BE0008091EB001092E9002091E800277F20931C +:107BF000E80090E025E0969587952A95E1F7817059 +:107C00008093F1001092F10087C0882319F0823030 +:107C100009F0A4C08F71823009F0A0C08091940156 +:107C2000882331F520919601277009F497C020939D +:107C3000E9008091EB0080FF1BC0933021F480911C +:107C4000EB00806213C08091EB0080618093EB00B9 +:107C500081E090E002C0880F991F2A95E2F7809397 +:107C6000EA001092EA008091EB0088608093EB00BC +:107C70001092E9008091E800877F51C0882309F0C5 +:107C80006DC0109194011F770FB7F8948091E800B0 +:107C9000877F8093E8009ADD8091E80080FFFCCF29 +:107CA0008091E3008078812B8093E300806880934B +:107CB000E300112311F482E001C083E08EBB0FBF0B +:107CC0004DC08058823008F049C080919401909155 +:107CD000950160919601AE014F5F5F4F3FDDBC01A2 +:107CE000009709F43BC08091E800877F8093E8000B +:107CF00089819A8192DE8091E8008B778093E800F9 +:107D00002DC0803859F58091E800877F8093E80086 +:107D1000809190018093F1008091E8008E778093AC +:107D2000E80054DD1BC08823C9F49091940192307F +:107D3000A8F48091E800877F8093E80090939001F9 +:107D400045DD80919001882331F48091E30087FD27 +:107D500002C081E001C084E08EBBA9DC8091E80014 +:107D600083FF0AC08091EB0080628093EB008091DA +:107D7000E800877F8093E8000F900F90CF91DF910C +:107D80001F910F91089508951F938EB3882361F07A +:107D90001091E9001092E9008091E80083FF01C092 +:107DA000E4DE17701093E9001F910895F999FECF52 +:107DB00092BD81BDF89A992780B50895262FF9992B +:107DC000FECF1FBA92BD81BD20BD0FB6F894FA9ABE +:0C7DD000F99A0FBE01960895F894FFCFB9 +:107DDC004C5546414344430001000000000000089C +:107DEC001201100102000008EB034A2001000001FF +:107DFC00000109023E00020100803209040000016A +:107E0C0002020100052400100104240204052406CA +:107E1C000001070582030800FF09040100020A00A3 +:107E2C000000070504021000010705830210000181 +:107E3C0004030904260341005600520020004300AD +:107E4C0044004300200042006F006F0074006C007F +:0C7E5C006F00610064006500720000000F :040000030000700089 :00000001FF -- cgit v1.2.3-18-g5258 From e650b85ca58eeb795ba851227e2474576e0f18a1 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 19 Jan 2012 21:18:07 -0500 Subject: changed fuses to select 4k bootloader for LUFA-based Caterina --- boards.txt | 2 +- bootloaders/caterina_LUFA/makefile | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/boards.txt b/boards.txt index 834db54..fed59eb 100644 --- a/boards.txt +++ b/boards.txt @@ -151,7 +151,7 @@ leonardo.upload.protocol=arduino leonardo.upload.maximum_size=30720 leonardo.upload.speed=1200 leonardo.bootloader.low_fuses=0xde -leonardo.bootloader.high_fuses=0xda +leonardo.bootloader.high_fuses=0xd8 leonardo.bootloader.extended_fuses=0xcb leonardo.bootloader.path=caterina leonardo.bootloader.file=Caterina-Leonardo.hex diff --git a/bootloaders/caterina_LUFA/makefile b/bootloaders/caterina_LUFA/makefile index 473dd77..a647af0 100755 --- a/bootloaders/caterina_LUFA/makefile +++ b/bootloaders/caterina_LUFA/makefile @@ -58,7 +58,7 @@ ARCH = AVR8 # Target board (see library "Board Types" documentation, NONE for projects not requiring # LUFA board drivers). If USER is selected, put custom board drivers in a directory called # "Board" inside the application directory. -BOARD = USBKEY +BOARD = USER # Processor frequency. @@ -354,7 +354,7 @@ LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) # Type: avrdude -c ? # to get a full listing. # -AVRDUDE_PROGRAMMER = jtagmkII +AVRDUDE_PROGRAMMER = avrispmkII # com1 = serial port. Use lpt1 to connect to parallel port. AVRDUDE_PORT = usb @@ -424,7 +424,7 @@ OBJDUMP = avr-objdump SIZE = avr-size AR = avr-ar rcs NM = avr-nm -AVRDUDE = avrdude +AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf REMOVE = rm -f REMOVEDIR = rm -rf COPY = cp -- cgit v1.2.3-18-g5258 From 98a50871fb357f5b16ec2201bcbae660ad1e6b5d Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 19 Jan 2012 21:31:51 -0500 Subject: stripped all LUFA LED control. from LUFA-based Caterina --- bootloaders/caterina_LUFA/Board/LEDs.h | 128 ----------- bootloaders/caterina_LUFA/Caterina.c | 9 +- bootloaders/caterina_LUFA/Caterina.h | 2 - bootloaders/caterina_LUFA/Caterina.hex | 384 ++++++++++++++------------------- 4 files changed, 163 insertions(+), 360 deletions(-) delete mode 100755 bootloaders/caterina_LUFA/Board/LEDs.h diff --git a/bootloaders/caterina_LUFA/Board/LEDs.h b/bootloaders/caterina_LUFA/Board/LEDs.h deleted file mode 100755 index d73b0bc..0000000 --- a/bootloaders/caterina_LUFA/Board/LEDs.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -#ifndef __LEDS_LEONARDO_H__ -#define __LEDS_LEONARDO_H__ - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(__INCLUDE_FROM_LEDS_H) - #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. - #endif - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** LED mask for the TX LED on the board. */ - #define LEDS_TX_LED (1 << 5) - #define LEDS_TX_LED_DDR DDRD - #define LEDS_TX_LED_PORT PORTD - - /** LED mask for the RX LED on the board. */ - #define LEDS_RX_LED (1 << 0) - #define LEDS_RX_LED_DDR DDRB - #define LEDS_RX_LED_PORT PORTB - - /** LED mask for the "L" LED on the board. */ - #define LEDS_L_LED (1 << 7) - #define LEDS_L_LED_DDR DDRC - #define LEDS_L_LED_PORT PORTC - - /** LED mask for all the LEDs on the board. */ - #define LEDS_ALL_LEDS (LEDS_TX_LED | LEDS_RX_LED | LEDS_L_LED) - - /** LED mask for none of the board LEDs. */ - #define LEDS_NO_LEDS 0 - - /* Inline Functions: */ - #if !defined(__DOXYGEN__) - static inline void LEDs_Init(void) - { - LEDS_TX_LED_DDR |= LEDS_TX_LED; - LEDS_RX_LED_DDR |= LEDS_RX_LED; - LEDS_L_LED_DDR |= LEDS_L_LED; - LEDS_TX_LED_PORT |= LEDS_TX_LED; - LEDS_RX_LED_PORT |= LEDS_RX_LED; - LEDS_L_LED_PORT &= ~LEDS_L_LED; // unlike TX and RX LEDs, L LED is active-high - } - - static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) - { - LEDS_TX_LED_PORT &= ~(LEDMask & LEDS_TX_LED); - LEDS_RX_LED_PORT &= ~(LEDMask & LEDS_RX_LED); - LEDS_L_LED_PORT |= (LEDMask & LEDS_L_LED); - } - - static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) - { - LEDS_TX_LED_PORT |= (LEDMask & LEDS_TX_LED); - LEDS_RX_LED_PORT |= (LEDMask & LEDS_RX_LED); - LEDS_L_LED_PORT &= ~(LEDMask & LEDS_L_LED); - } - - static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) - { -// PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask); - LEDs_TurnOffLEDs(LEDS_ALL_LEDS); - LEDs_TurnOnLEDs(LEDMask); - } - - static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, - const uint8_t ActiveMask) - { - LEDs_TurnOffLEDs(LEDMask); - LEDs_TurnOnLEDs(ActiveMask); - } - - static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) - { - LEDS_TX_LED_PORT ^= (LEDMask & LEDS_TX_LED); - LEDS_RX_LED_PORT ^= (LEDMask & LEDS_RX_LED); - LEDS_L_LED_PORT ^= (LEDMask & LEDS_L_LED); - } - - static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; - static inline uint8_t LEDs_GetLEDs(void) - { - return ((LEDS_TX_LED_PORT & LEDS_TX_LED) | (LEDS_RX_LED_PORT & LEDS_RX_LED) | (LEDS_L_LED_PORT & LEDS_L_LED)); - } - #endif - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif - - diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index da7e7ba..dba00e3 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -66,9 +66,6 @@ int main(void) /* Setup hardware required for the bootloader */ SetupHardware(); - /* Turn on first LED on the board to indicate that the bootloader has started */ - LEDs_SetAllLEDs(LEDS_LED1); - /* Enable global interrupts so that the USB stack can function */ sei(); @@ -103,7 +100,6 @@ void SetupHardware(void) /* Initialize USB Subsystem */ USB_Init(); - LEDs_Init(); /* Bootloader active LED toggle timer initialization */ TIMSK1 = (1 << TOIE1); @@ -113,7 +109,7 @@ void SetupHardware(void) /** ISR to periodically toggle the LEDs on the board to indicate that the bootloader is active. */ ISR(TIMER1_OVF_vect, ISR_BLOCK) { - LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); + } /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready @@ -148,9 +144,6 @@ void EVENT_USB_Device_ControlRequest(void) return; } - /* Activity - toggle indicator LEDs */ - LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); - /* Process CDC specific control requests */ switch (USB_ControlRequest.bRequest) { diff --git a/bootloaders/caterina_LUFA/Caterina.h b/bootloaders/caterina_LUFA/Caterina.h index 45268de..4260166 100755 --- a/bootloaders/caterina_LUFA/Caterina.h +++ b/bootloaders/caterina_LUFA/Caterina.h @@ -48,8 +48,6 @@ #include "Descriptors.h" #include - #include - /* Macros: */ /** Version major of the CDC bootloader. */ #define BOOTLOADER_VERSION_MAJOR 0x01 diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index c304a50..edac957 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,233 +1,173 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC0000047C400005AC00000FD +:1070200060C000005EC0000079C200005AC00000CD :1070300058C0000056C0000054C0000052C00000FC :1070400050C000004EC000004CC000004AC000000C -:1070500049C0000046C0000044C0000042C000001B +:1070500048C0000046C0000044C0000042C000001C :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0ECED54 -:1070C000FDE702C005900D92AC38B107D9F711E089 -:1070D000ACE8B1E001C01D92AA39B107E1F71BD3BA -:1070E0007BC68ECF1F920F920FB60F9211248F93F3 -:1070F0008BB18BB985B185B988B188B98F910F9063 -:107100000FBE0F901F90189584E08093E9000DC08A -:107110008091E8008B778093E80003C08EB38823CA -:1071200051F08091E80082FFF9CF8091E80085FF5F -:10713000EFCF8091F1000895982F83E08093E900CC -:107140008091E80085FD0DC08091E8008E778093E6 -:10715000E80003C08EB3882331F08091E80080FFFF -:10716000F9CF9093F10008954F925F926F927F92C2 -:107170008F929F92AF92BF92CF92DF92EF92FF9247 -:107180000F931F93CF93DF9384E08093E900809166 -:10719000E80082FF45C2B8DF182F853419F4109239 -:1071A000080103C0843519F4AFDF8DE00FC28C34C1 -:1071B000E1F38035D1F3843721F484E4BDDF80E04E -:1071C00005C2813611F489E501C28134B1F49CDF36 -:1071D000182F9ADF90E0880F991FAA2797FDA09596 -:1071E000BA2F312F330F20E0442737FD4095542F1D -:1071F000822B932BA42BB52BBAC1803711F483E5D6 -:10720000E5C1833549F4C0E0D1E0899195DF21E003 -:10721000C730D207D1F7DBC1863521F481E38CDF9B -:1072200080E3D4C1833731F487E886DF85E984DFE2 -:107230008EE1CCC18536B9F4E0E0F0E093E085E082 -:1072400090935700E89507B600FCFDCF8093570058 -:10725000E89507B600FCFDCFE058FF4FA0E7E0300F -:10726000FA0771F7A2CF8C3651F44EDF809599E082 -:10727000E1E0F0E0082E90935700E89596CF823732 -:1072800039F4E1E0F0E089E08093570084919EC1F9 -:10729000863439F4E0E0F0E089E08093570084918F -:1072A00095C18E3439F4E3E0F0E089E08093570033 -:1072B00084918CC1813539F4E2E0F0E089E080937B -:1072C0005700849183C1823631F489E535DF80E04F -:1072D00033DF80E87BC1823419F0873609F0DBC0E8 -:1072E00013DF082F11DFF82E0FDF682E8554823050 -:1072F00008F06BC1902F80E0CF2DD0E0C82BD92BA8 -:10730000173609F04BC081E180935700E895DD24E2 -:10731000CC24C3943FC0E0908C01F0908D0100918B -:107320008E0110918F01B6E46B16D9F4ED2DF0E0CB -:10733000EE29FF29E4918E2FFFDEDD2081F082E02F -:1073400090E0A0E0B0E0E80EF91E0A1F1B1FE092DB -:107350008C01F0928D0100938E0110938F01DC243B -:1073600018C0D801C701B695A795979587951ED5E2 -:10737000E3DE82E090E0A0E0B0E0E80EF91E0A1F34 -:107380001B1FE0928C01F0928D0100938E011093EF -:107390008F012197209709F0BECF19C180908C01F1 -:1073A00090908D01A0908E01B0908F0196E46916A7 -:1073B00009F05DC083E0F40180935700E89507B6BB -:1073C00000FCFDCF54C0F6E46F1661F5772031F173 -:1073D000E0908C01F0908D0100918E0110918F0151 -:1073E00093DED82ECC24852D90E08C299D29F701A1 -:1073F0000C0140925700E895112482E090E0A0E053 -:10740000B0E0E80EF91E0A1F1B1FE0928C01F092FB -:107410008D0100938E0110938F0102C075DE582EEE -:10742000742423C0E0908C01F0908D0100918E01B6 -:1074300010918F0116950795F794E79465DE682FF4 -:10744000C701BCD480918C0190918D01A0918E01D7 -:10745000B0918F010296A11DB11D80938C01909374 -:107460008D01A0938E01B0938F01219704C0552404 -:10747000772444244394209709F0A5CF96E4691615 -:1074800009F093CE85E0F40180935700E89507B6A4 -:1074900000FCFDCF8ACE833471F400918C011091F1 -:1074A0008D0132DE90E021E0F8010C0120935700BD -:1074B000E89511247ACE833619F5E0908C01F0908E -:1074C0008D0100918E0110918F011EDEF701E160A8 -:1074D00090E021E00C0120935700E895112482E010 -:1074E00090E0A0E0B0E0E80EF91E0A1F1B1FE0923A -:1074F0008C01F0928D0100938E0110938F0155CE77 -:107500008D3661F4E0918C01F0918D0185E08093DE -:107510005700E89507B600FCFDCF47CE823551F401 -:10752000E0918C01F0918D0105911491812F04DE81 -:10753000802F4CC0843421F5E0908C01F0908D01B7 -:1075400000918E0110918F0116950795F794E7949D -:10755000DBDD682FC70132D480918C0190918D01C1 -:10756000A0918E01B0918F010296A11DB11D809353 -:107570008C0190938D01A0938E01B0938F0115CE55 -:10758000843609F5E0908C01F0908D0100918E0118 -:1075900010918F01D801C701B695A795979587954A -:1075A00005D4CADD82E090E0A0E0B0E0E80EF91E6C -:1075B0000A1F1B1FE0928C01F0928D0100938E0137 -:1075C00010938F0104C08B3111F08FE3B5DD83E0A0 -:1075D0008093E9009091E8008091E8008E77809395 -:1075E000E80095FF04C010C08EB38823C9F08091D5 -:1075F000E80080FFF9CF8091E8008E778093E80063 -:1076000003C08EB3882361F08091E80080FFF9CF3A -:1076100084E08093E9008091E8008B778093E80014 -:10762000DF91CF911F910F91FF90EF90DF90CF905E -:10763000BF90AF909F908F907F906F905F904F9092 -:10764000089590919201892F8F77813279F58BB1CE -:107650008BB985B185B988B188B9809193018032A1 -:10766000A1F0813219F5913A09F58091E800877F00 -:107670008093E80089E091E067E070E0CED18091EE -:10768000E8008B778093E8000895913279F4809137 -:10769000E800877F8093E80089E091E067E070E090 -:1076A00020D28091E8008E778093E800089582E0F0 -:1076B00061EC42E078D083E061E842E174D084E09C -:1076C00060E842E170C01F9384B7877F84BF88E180 -:1076D0000FB6F89480936000109260000FBE80E0B7 -:1076E00090E020E80FB6F894209361008093610049 -:1076F0000FBE11E015BF82E085BFC6D0559A209A13 -:107700003F9A5D9A289A479810936F0083E0809380 -:1077100081001F910895D7DF5D9A289A47988BB111 -:107720008BB985B185B988B188B9789402C01CDD60 -:107730002BD3809108018823D1F78091E0008160EC -:107740008093E0002CE088E190E00FB6F894A895D3 -:10775000809360000FBE20936000FFCFFA0192304B -:1077600071F0933089F0913029F480E191E022E1C9 -:1077700030E015C080E090E020E030E010C082E210 -:1077800091E02EE330E00BC0882329F480E691E0FD -:1077900024E030E004C084E691E026E230E091830A -:1077A0008083C90108958093E9008091EB00816096 -:1077B0008093EB001092ED006093EC004093ED009D -:1077C0008091EE00881F8827881F0895809192017C -:1077D00088238CF403C08EB38823B1F08091E80035 -:1077E00082FFF9CF8091E8008B778093E8000895BD -:1077F0008EB3882349F08091E80080FFF9CF809113 -:10780000E8008E778093E8000895EF92FF920F933F -:107810001F9345D04CD008ED10E0F80180818F77A0 -:10782000808380818068808380818F7D808319BC84 -:107830001EBA1092900180EEE82EF12CF7018081A3 -:107840008B7F8083F80180818160808380E060E0AD -:1078500042E0A9DFE1EEF0E080818E7F8083E2EEFE -:10786000F0E0808181608083808188608083F7017F -:1078700080818E7F8083F8018081806180831F9169 -:107880000F91FF90EF900895E7EDF0E08081816027 -:1078900080838AE482BF81E080939101B6CFE8EDD6 -:1078A000F0E080818E7F80831092E2000895109234 -:1078B000DA001092E10008951F920F920FB60F9216 -:1078C00011242F933F934F935F936F937F938F93E5 -:1078D0009F93AF93BF93EF93FF938091DA0080FF64 -:1078E0001BC08091D80080FF17C08091DA008E7F86 -:1078F0008093DA008091D90080FF0BC080E189BDC0 -:1079000082E189BD09B400FEFDCF81E08EBB3BD290 -:1079100003C019BC1EBA37D28091E10080FF17C0A6 -:107920008091E20080FF13C08091E2008E7F8093FF -:10793000E2008091E20080618093E2008091D800B3 -:1079400080628093D80019BC85E08EBB1CD28091E8 -:10795000E10084FF2CC08091E20084FF28C080E118 -:1079600089BD82E189BD09B400FEFDCF8091D800B8 -:107970008F7D8093D8008091E1008F7E8093E1001D -:107980008091E2008F7E8093E2008091E20081602E -:107990008093E20080919001882331F48091E3008C -:1079A00087FD02C081E001C084E08EBBECD18091F4 -:1079B000E10083FF21C08091E20083FF1DC0809120 -:1079C000E100877F8093E10082E08EBB10929001FE -:1079D0008091E1008E7F8093E1008091E2008E7FB4 -:1079E0008093E2008091E20080618093E20080E079 -:1079F00060E042E0D8DEC7D1FF91EF91BF91AF9137 -:107A00009F918F917F916F915F914F913F912F91B6 -:107A10000F900FBE0F901F9018959C0140919801F8 -:107A2000509199014617570718F4F90190E044C0A6 -:107A30006115710511F0AB01F8CF8091E8008E77E8 -:107A40008093E80040E050E0F0CF8EB3882309F443 -:107A500044C0853009F443C08091E80083FF02C030 -:107A600081E008958091E80082FD31C08091E800B6 -:107A700080FF22C08091F3009091F200782F60E0A7 -:107A8000292F30E0262B372B07C081918093F100FE -:107A9000415050402F5F3F4F4115510519F028309C -:107AA000310598F390E02830310509F491E0809198 -:107AB000E8008E778093E8004115510531F699234F -:107AC00021F605C08EB3882341F0853041F08091C6 -:107AD000E80082FFF7CF80E0089582E0089583E018 -:107AE00008959C016115710529F48091E8008B7758 -:107AF0008093E800F90126C08EB3882391F1853088 -:107B000091F18091E80083FF02C081E008958091A7 -:107B1000E80082FFF1CF06C08091F10081936150AF -:107B2000704059F02091F3008091F200322F20E054 -:107B300090E0822B932B892B79F78091E8008B774B -:107B40008093E80061157105B9F605C08EB38823EE -:107B500041F0853041F08091E80080FFF7CF80E070 -:107B6000089582E0089583E008950F931F93DF93B3 -:107B7000CF9300D0CDB7DEB7E2E9F1E08091F1001C -:107B8000819381E0EA39F807C9F75BDD8091E8006D -:107B900083FFE4C08091920190919301953009F4A4 -:107BA0006DC0963040F4913081F1913070F0933097 -:107BB00009F0D4C02AC0983009F4A3C0993009F460 -:107BC000B2C0963009F0CAC07CC0803809F4C6C083 -:107BD000823809F0C3C08091960187708093E900D4 -:107BE0008091EB001092E9002091E800277F20931C -:107BF000E80090E025E0969587952A95E1F7817059 -:107C00008093F1001092F10087C0882319F0823030 -:107C100009F0A4C08F71823009F0A0C08091940156 -:107C2000882331F520919601277009F497C020939D -:107C3000E9008091EB0080FF1BC0933021F480911C -:107C4000EB00806213C08091EB0080618093EB00B9 -:107C500081E090E002C0880F991F2A95E2F7809397 -:107C6000EA001092EA008091EB0088608093EB00BC -:107C70001092E9008091E800877F51C0882309F0C5 -:107C80006DC0109194011F770FB7F8948091E800B0 -:107C9000877F8093E8009ADD8091E80080FFFCCF29 -:107CA0008091E3008078812B8093E300806880934B -:107CB000E300112311F482E001C083E08EBB0FBF0B -:107CC0004DC08058823008F049C080919401909155 -:107CD000950160919601AE014F5F5F4F3FDDBC01A2 -:107CE000009709F43BC08091E800877F8093E8000B -:107CF00089819A8192DE8091E8008B778093E800F9 -:107D00002DC0803859F58091E800877F8093E80086 -:107D1000809190018093F1008091E8008E778093AC -:107D2000E80054DD1BC08823C9F49091940192307F -:107D3000A8F48091E800877F8093E80090939001F9 -:107D400045DD80919001882331F48091E30087FD27 -:107D500002C081E001C084E08EBBA9DC8091E80014 -:107D600083FF0AC08091EB0080628093EB008091DA -:107D7000E800877F8093E8000F900F90CF91DF910C -:107D80001F910F91089508951F938EB3882361F07A -:107D90001091E9001092E9008091E80083FF01C092 -:107DA000E4DE17701093E9001F910895F999FECF52 -:107DB00092BD81BDF89A992780B50895262FF9992B -:107DC000FECF1FBA92BD81BD20BD0FB6F894FA9ABE -:0C7DD000F99A0FBE01960895F894FFCFB9 -:107DDC004C5546414344430001000000000000089C -:107DEC001201100102000008EB034A2001000001FF -:107DFC00000109023E00020100803209040000016A -:107E0C0002020100052400100104240204052406CA -:107E1C000001070582030800FF09040100020A00A3 -:107E2C000000070504021000010705830210000181 -:107E3C0004030904260341005600520020004300AD -:107E4C0044004300200042006F006F0074006C007F -:0C7E5C006F00610064006500720000000F +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4E168 +:1070C000FAE702C005900D92AC38B107D9F711E08C +:1070D000ACE8B1E001C01D92AA39B107E1F756D181 +:1070E00097C48ECF84E08093E9000DC08091E800C2 +:1070F0008B778093E80003C08EB3882351F0809192 +:10710000E80082FFF9CF8091E80085FFEFCF809102 +:10711000F1000895982F83E08093E9008091E800C2 +:1071200085FD0DC08091E8008E778093E80003C054 +:107130008EB3882331F08091E80080FFF9CF9093DF +:10714000F10008951F93CF93DF9384E08093E900CB +:107150008091E80082FFC0C0C5DF853419F4109229 +:10716000080131C0843511F4BDDF2DC08C3459F1D4 +:10717000803549F1843721F484E4CCDF80E082C09B +:10718000813611F489E57EC08134F9F4ABDF182F24 +:10719000A9DF90E0880F991FAA2797FDA095BA2F25 +:1071A000312F330F20E0442737FD4095542F822B99 +:1071B000932BA42BB52B80938C0190938D01A093DE +:1071C0008E01B0938F018DE05DC0803711F483E5AF +:1071D00059C0833549F4C0E0D1E089919BDF21E0BB +:1071E000C730D207D1F74FC0863521F481E392DF53 +:1071F00080E348C0833731F487E88CDF85E98ADF94 +:107200008EE140C08536B9F4E0E0F0E093E085E03F +:1072100090935700E89507B600FCFDCF8093570088 +:10722000E89507B600FCFDCFE058FF4F20E7E030BF +:10723000F20771F7C8CF823739F4E1E0F0E089E076 +:107240008093570084911EC0863439F4E0E0F0E06A +:1072500089E080935700849115C08E3439F4E3E0BF +:10726000F0E089E08093570084910CC0813539F4B7 +:10727000E2E0F0E089E080935700849103C08B3115 +:1072800011F08FE347DF83E08093E9009091E800FD +:107290008091E8008E778093E80095FF04C010C0CD +:1072A0008EB38823C9F08091E80080FFF9CF8091E8 +:1072B000E8008E778093E80003C08EB3882361F0E6 +:1072C0008091E80080FFF9CF84E08093E90080910D +:1072D000E8008B778093E800DF91CF911F910895AC +:1072E00090919201892F8F77813249F58091930196 +:1072F0008032A1F0813219F5913A09F58091E800C8 +:10730000877F8093E80089E091E067E070E0B7D183 +:107310008091E8008B778093E8000895913279F4AA +:107320008091E800877F8093E80089E091E067E042 +:1073300070E009D28091E8008E778093E80008958C +:1073400082E061EC42E061D083E061E842E15DD03F +:1073500084E060E842E159C084B7877F84BF88E158 +:107360000FB6F89480936000109260000FBE80E02A +:1073700090E020E80FB6F8942093610080936100BC +:107380000FBE81E085BF82E085BFB0C0E5DF7894A5 +:1073900002C0D8DE2BD3809108018823D1F78091D9 +:1073A000E00081608093E0002CE088E190E00FB67F +:1073B000F894A895809360000FBE20936000FFCFE3 +:1073C000FA01923071F0933089F0913029F480E124 +:1073D00091E022E130E015C080E090E020E030E074 +:1073E00010C082E291E02EE330E00BC0882329F444 +:1073F00080E691E024E030E004C084E691E026E2FB +:1074000030E091838083C90108958093E9008091E1 +:10741000EB0081608093EB001092ED006093EC0034 +:107420004093ED008091EE00881F8827881F089503 +:107430008091920188238CF403C08EB38823B1F02D +:107440008091E80082FFF9CF8091E8008B778093EC +:10745000E80008958EB3882349F08091E80080FF0A +:10746000F9CF8091E8008E778093E8000895EF923D +:10747000FF920F931F9345D04CD008ED10E0F80118 +:1074800080818F77808380818068808380818F7DF9 +:10749000808319BC1EBA1092900180EEE82EF12C68 +:1074A000F70180818B7F8083F801808181608083F8 +:1074B00080E060E042E0A9DFE1EEF0E080818E7FD5 +:1074C0008083E2EEF0E0808181608083808188604B +:1074D0008083F70180818E7F8083F80180818061C5 +:1074E00080831F910F91FF90EF900895E7EDF0E0FA +:1074F0008081816080838AE482BF81E080939101F2 +:10750000B6CFE8EDF0E080818E7F80831092E200BC +:1075100008951092DA001092E10008951F920F92E0 +:107520000FB60F9211242F933F934F935F936F9356 +:107530007F938F939F93AF93BF93EF93FF9380912C +:10754000DA0080FF1BC08091D80080FF17C08091B7 +:10755000DA008E7F8093DA008091D90080FF0BC023 +:1075600080E189BD82E189BD09B400FEFDCF81E0E3 +:107570008EBB3BD203C019BC1EBA37D28091E1004A +:1075800080FF17C08091E20080FF13C08091E2006D +:107590008E7F8093E2008091E20080618093E20020 +:1075A0008091D80080628093D80019BC85E08EBBA2 +:1075B0001CD28091E10084FF2CC08091E20084FF06 +:1075C00028C080E189BD82E189BD09B400FEFDCFFC +:1075D0008091D8008F7D8093D8008091E1008F7ECC +:1075E0008093E1008091E2008F7E8093E2008091A1 +:1075F000E20081608093E20080919001882331F461 +:107600008091E30087FD02C081E001C084E08EBB71 +:10761000ECD18091E10083FF21C08091E20083FFE3 +:107620001DC08091E100877F8093E10082E08EBBE6 +:10763000109290018091E1008E7F8093E100809113 +:10764000E2008E7F8093E2008091E200806180936F +:10765000E20080E060E042E0D8DEC7D1FF91EF9128 +:10766000BF91AF919F918F917F916F915F914F915A +:107670003F912F910F900FBE0F901F9018959C0176 +:1076800040919801509199014617570718F4F90154 +:1076900090E044C06115710511F0AB01F8CF809105 +:1076A000E8008E778093E80040E050E0F0CF8EB3A2 +:1076B000882309F444C0853009F443C08091E80070 +:1076C00083FF02C081E008958091E80082FD31C00F +:1076D0008091E80080FF22C08091F3009091F20039 +:1076E000782F60E0292F30E0262B372B07C08191BF +:1076F0008093F100415050402F5F3F4F411551059D +:1077000019F02830310598F390E02830310509F45C +:1077100091E08091E8008E778093E8004115510553 +:1077200031F6992321F605C08EB3882341F08530C8 +:1077300041F08091E80082FFF7CF80E0089582E079 +:10774000089583E008959C016115710529F48091E5 +:10775000E8008B778093E800F90126C08EB3882378 +:1077600091F1853091F18091E80083FF02C081E0C2 +:1077700008958091E80082FFF1CF06C08091F1006A +:1077800081936150704059F02091F3008091F20094 +:10779000322F20E090E0822B932B892B79F7809178 +:1077A000E8008B778093E80061157105B9F605C094 +:1077B0008EB3882341F0853041F08091E80080FF4E +:1077C000F7CF80E0089582E0089583E008950F9355 +:1077D0001F93DF93CF9300D0CDB7DEB7E2E9F1E09E +:1077E0008091F100819381E0EA39F807C9F778DDEB +:1077F0008091E80083FFE4C0809192019091930111 +:10780000953009F46DC0963040F4913081F191309B +:1078100070F0933009F0D4C02AC0983009F4A3C0A6 +:10782000993009F4B2C0963009F0CAC07CC08038E3 +:1078300009F4C6C0823809F0C3C0809196018770F0 +:107840008093E9008091EB001092E9002091E8001C +:10785000277F2093E80090E025E0969587952A956C +:10786000E1F781708093F1001092F10087C08823C6 +:1078700019F0823009F0A4C08F71823009F0A0C0E5 +:1078800080919401882331F520919601277009F4A5 +:1078900097C02093E9008091EB0080FF1BC09330DC +:1078A00021F48091EB00806213C08091EB00806135 +:1078B0008093EB0081E090E002C0880F991F2A9529 +:1078C000E2F78093EA001092EA008091EB00886072 +:1078D0008093EB001092E9008091E800877F51C00F +:1078E000882309F06DC0109194011F770FB7F894A9 +:1078F0008091E800877F8093E8009ADD8091E8001E +:1079000080FFFCCF8091E3008078812B8093E3009F +:1079100080688093E300112311F482E001C083E0CA +:107920008EBB0FBF4DC08058823008F049C0809197 +:1079300094019091950160919601AE014F5F5F4F68 +:107940003FDDBC01009709F43BC08091E800877FD0 +:107950008093E80089819A8192DE8091E8008B779C +:107960008093E8002DC0803859F58091E800877F2A +:107970008093E800809190018093F1008091E8006D +:107980008E778093E80054DD1BC08823C9F4909162 +:1079900094019230A8F48091E800877F8093E800FA +:1079A0009093900145DD80919001882331F480917E +:1079B000E30087FD02C081E001C084E08EBBC0DC33 +:1079C0008091E80083FF0AC08091EB008062809381 +:1079D000EB008091E800877F8093E8000F900F9084 +:1079E000CF91DF911F910F91089508951F938EB34A +:1079F000882361F01091E9001092E9008091E8007D +:107A000083FF01C0E4DE17701093E9001F91089511 +:047A1000F894FFCF18 +:107A14004C55464143444300010000000000000867 +:107A24001201100102000008EB034A2001000001CA +:107A3400000109023E000201008032090400000135 +:107A44000202010005240010010424020405240696 +:107A54000001070582030800FF09040100020A006F +:107A6400000007050402100001070583021000014D +:107A74000403090426034100560052002000430079 +:107A840044004300200042006F006F0074006C004B +:0C7A94006F0061006400650072000000DB :040000030000700089 :00000001FF -- cgit v1.2.3-18-g5258 From 0d8f865d9b783a74ea8238bb77a7bde239617d5e Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sat, 21 Jan 2012 16:39:06 -0500 Subject: Leonardo bootloader checks reason for reset and jumps immediately to sketch if reset was caused by WDT --- bootloaders/caterina_LUFA/Caterina.c | 106 ++++++--- bootloaders/caterina_LUFA/Caterina.hex | 386 +++++++++++++++++++-------------- 2 files changed, 300 insertions(+), 192 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index dba00e3..8bd7403 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -56,6 +56,16 @@ static uint32_t CurrAddress; */ static bool RunBootloader = true; +void StartSketch() +{ + UDCON = 1; // Detach USB + UDIEN = 0; + __asm__ volatile ( // Reset vector to run firmware + "clr r30\n" + "clr r31\n" + "ijmp\n" + ::); +} /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start @@ -63,11 +73,21 @@ static bool RunBootloader = true; */ int main(void) { + uint8_t MCUSR_state = MCUSR; // store the reason for the reset + MCUSR &= ~(1 << WDRF); // must clear the watchdog reset flag before disabling and reenabling WDT + wdt_disable(); + if (MCUSR_state & (1<> 8); WriteNextResponseByte(SPM_PAGESIZE & 0xFF); } else if ((Command == 'B') || (Command == 'g')) { - /* Delegate the block write/read to a separate function for clarity */ + // Delegate the block write/read to a separate function for clarity ReadWriteMemoryBlock(Command); } #endif #if !defined(NO_FLASH_BYTE_SUPPORT) else if (Command == 'C') { - /* Write the high byte to the current flash page */ + // Write the high byte to the current flash page boot_page_fill(CurrAddress, FetchNextCommandByte()); - /* Send confirmation byte back to the host */ + // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'c') { - /* Write the low byte to the current flash page */ + // Write the low byte to the current flash page boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); - /* Increment the address */ + // Increment the address CurrAddress += 2; - /* Send confirmation byte back to the host */ + // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'm') { - /* Commit the flash page to memory */ + // Commit the flash page to memory boot_page_write(CurrAddress); - /* Wait until write operation has completed */ + // Wait until write operation has completed boot_spm_busy_wait(); - /* Send confirmation byte back to the host */ + // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'R') @@ -517,29 +562,30 @@ void CDC_Task(void) #if !defined(NO_EEPROM_BYTE_SUPPORT) else if (Command == 'D') { - /* Read the byte from the endpoint and write it to the EEPROM */ + // Read the byte from the endpoint and write it to the EEPROM eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - /* Increment the address after use */ + // Increment the address after use CurrAddress += 2; - /* Send confirmation byte back to the host */ + // Send confirmation byte back to the host WriteNextResponseByte('\r'); } else if (Command == 'd') { - /* Read the EEPROM byte and write it to the endpoint */ + // Read the EEPROM byte and write it to the endpoint WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); - /* Increment the address after use */ + // Increment the address after use CurrAddress += 2; } #endif else if (Command != 27) { - /* Unknown (non-sync) command, return fail code */ + // Unknown (non-sync) command, return fail code WriteNextResponseByte('?'); } + /* Select the IN endpoint */ Endpoint_SelectEndpoint(CDC_TX_EPNUM); diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index edac957..f78c001 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,173 +1,235 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC0000079C200005AC00000CD +:1070200060C000005EC0000053C400005AC00000F1 :1070300058C0000056C0000054C0000052C00000FC :1070400050C000004EC000004CC000004AC000000C -:1070500048C0000046C0000044C0000042C000001C +:1070500052C0000046C0000044C0000042C0000012 :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4E168 -:1070C000FAE702C005900D92AC38B107D9F711E08C -:1070D000ACE8B1E001C01D92AA39B107E1F756D181 -:1070E00097C48ECF84E08093E9000DC08091E800C2 -:1070F0008B778093E80003C08EB3882351F0809192 -:10710000E80082FFF9CF8091E80085FFEFCF809102 -:10711000F1000895982F83E08093E9008091E800C2 -:1071200085FD0DC08091E8008E778093E80003C054 -:107130008EB3882331F08091E80080FFF9CF9093DF -:10714000F10008951F93CF93DF9384E08093E900CB -:107150008091E80082FFC0C0C5DF853419F4109229 -:10716000080131C0843511F4BDDF2DC08C3459F1D4 -:10717000803549F1843721F484E4CCDF80E082C09B -:10718000813611F489E57EC08134F9F4ABDF182F24 -:10719000A9DF90E0880F991FAA2797FDA095BA2F25 -:1071A000312F330F20E0442737FD4095542F822B99 -:1071B000932BA42BB52B80938C0190938D01A093DE -:1071C0008E01B0938F018DE05DC0803711F483E5AF -:1071D00059C0833549F4C0E0D1E089919BDF21E0BB -:1071E000C730D207D1F74FC0863521F481E392DF53 -:1071F00080E348C0833731F487E88CDF85E98ADF94 -:107200008EE140C08536B9F4E0E0F0E093E085E03F -:1072100090935700E89507B600FCFDCF8093570088 -:10722000E89507B600FCFDCFE058FF4F20E7E030BF -:10723000F20771F7C8CF823739F4E1E0F0E089E076 -:107240008093570084911EC0863439F4E0E0F0E06A -:1072500089E080935700849115C08E3439F4E3E0BF -:10726000F0E089E08093570084910CC0813539F4B7 -:10727000E2E0F0E089E080935700849103C08B3115 -:1072800011F08FE347DF83E08093E9009091E800FD -:107290008091E8008E778093E80095FF04C010C0CD -:1072A0008EB38823C9F08091E80080FFF9CF8091E8 -:1072B000E8008E778093E80003C08EB3882361F0E6 -:1072C0008091E80080FFF9CF84E08093E90080910D -:1072D000E8008B778093E800DF91CF911F910895AC -:1072E00090919201892F8F77813249F58091930196 -:1072F0008032A1F0813219F5913A09F58091E800C8 -:10730000877F8093E80089E091E067E070E0B7D183 -:107310008091E8008B778093E8000895913279F4AA -:107320008091E800877F8093E80089E091E067E042 -:1073300070E009D28091E8008E778093E80008958C -:1073400082E061EC42E061D083E061E842E15DD03F -:1073500084E060E842E159C084B7877F84BF88E158 -:107360000FB6F89480936000109260000FBE80E02A -:1073700090E020E80FB6F8942093610080936100BC -:107380000FBE81E085BF82E085BFB0C0E5DF7894A5 -:1073900002C0D8DE2BD3809108018823D1F78091D9 -:1073A000E00081608093E0002CE088E190E00FB67F -:1073B000F894A895809360000FBE20936000FFCFE3 -:1073C000FA01923071F0933089F0913029F480E124 -:1073D00091E022E130E015C080E090E020E030E074 -:1073E00010C082E291E02EE330E00BC0882329F444 -:1073F00080E691E024E030E004C084E691E026E2FB -:1074000030E091838083C90108958093E9008091E1 -:10741000EB0081608093EB001092ED006093EC0034 -:107420004093ED008091EE00881F8827881F089503 -:107430008091920188238CF403C08EB38823B1F02D -:107440008091E80082FFF9CF8091E8008B778093EC -:10745000E80008958EB3882349F08091E80080FF0A -:10746000F9CF8091E8008E778093E8000895EF923D -:10747000FF920F931F9345D04CD008ED10E0F80118 -:1074800080818F77808380818068808380818F7DF9 -:10749000808319BC1EBA1092900180EEE82EF12C68 -:1074A000F70180818B7F8083F801808181608083F8 -:1074B00080E060E042E0A9DFE1EEF0E080818E7FD5 -:1074C0008083E2EEF0E0808181608083808188604B -:1074D0008083F70180818E7F8083F80180818061C5 -:1074E00080831F910F91FF90EF900895E7EDF0E0FA -:1074F0008081816080838AE482BF81E080939101F2 -:10750000B6CFE8EDF0E080818E7F80831092E200BC -:1075100008951092DA001092E10008951F920F92E0 -:107520000FB60F9211242F933F934F935F936F9356 -:107530007F938F939F93AF93BF93EF93FF9380912C -:10754000DA0080FF1BC08091D80080FF17C08091B7 -:10755000DA008E7F8093DA008091D90080FF0BC023 -:1075600080E189BD82E189BD09B400FEFDCF81E0E3 -:107570008EBB3BD203C019BC1EBA37D28091E1004A -:1075800080FF17C08091E20080FF13C08091E2006D -:107590008E7F8093E2008091E20080618093E20020 -:1075A0008091D80080628093D80019BC85E08EBBA2 -:1075B0001CD28091E10084FF2CC08091E20084FF06 -:1075C00028C080E189BD82E189BD09B400FEFDCFFC -:1075D0008091D8008F7D8093D8008091E1008F7ECC -:1075E0008093E1008091E2008F7E8093E2008091A1 -:1075F000E20081608093E20080919001882331F461 -:107600008091E30087FD02C081E001C084E08EBB71 -:10761000ECD18091E10083FF21C08091E20083FFE3 -:107620001DC08091E100877F8093E10082E08EBBE6 -:10763000109290018091E1008E7F8093E100809113 -:10764000E2008E7F8093E2008091E200806180936F -:10765000E20080E060E042E0D8DEC7D1FF91EF9128 -:10766000BF91AF919F918F917F916F915F914F915A -:107670003F912F910F900FBE0F901F9018959C0176 -:1076800040919801509199014617570718F4F90154 -:1076900090E044C06115710511F0AB01F8CF809105 -:1076A000E8008E778093E80040E050E0F0CF8EB3A2 -:1076B000882309F444C0853009F443C08091E80070 -:1076C00083FF02C081E008958091E80082FD31C00F -:1076D0008091E80080FF22C08091F3009091F20039 -:1076E000782F60E0292F30E0262B372B07C08191BF -:1076F0008093F100415050402F5F3F4F411551059D -:1077000019F02830310598F390E02830310509F45C -:1077100091E08091E8008E778093E8004115510553 -:1077200031F6992321F605C08EB3882341F08530C8 -:1077300041F08091E80082FFF7CF80E0089582E079 -:10774000089583E008959C016115710529F48091E5 -:10775000E8008B778093E800F90126C08EB3882378 -:1077600091F1853091F18091E80083FF02C081E0C2 -:1077700008958091E80082FFF1CF06C08091F1006A -:1077800081936150704059F02091F3008091F20094 -:10779000322F20E090E0822B932B892B79F7809178 -:1077A000E8008B778093E80061157105B9F605C094 -:1077B0008EB3882341F0853041F08091E80080FF4E -:1077C000F7CF80E0089582E0089583E008950F9355 -:1077D0001F93DF93CF9300D0CDB7DEB7E2E9F1E09E -:1077E0008091F100819381E0EA39F807C9F778DDEB -:1077F0008091E80083FFE4C0809192019091930111 -:10780000953009F46DC0963040F4913081F191309B -:1078100070F0933009F0D4C02AC0983009F4A3C0A6 -:10782000993009F4B2C0963009F0CAC07CC08038E3 -:1078300009F4C6C0823809F0C3C0809196018770F0 -:107840008093E9008091EB001092E9002091E8001C -:10785000277F2093E80090E025E0969587952A956C -:10786000E1F781708093F1001092F10087C08823C6 -:1078700019F0823009F0A4C08F71823009F0A0C0E5 -:1078800080919401882331F520919601277009F4A5 -:1078900097C02093E9008091EB0080FF1BC09330DC -:1078A00021F48091EB00806213C08091EB00806135 -:1078B0008093EB0081E090E002C0880F991F2A9529 -:1078C000E2F78093EA001092EA008091EB00886072 -:1078D0008093EB001092E9008091E800877F51C00F -:1078E000882309F06DC0109194011F770FB7F894A9 -:1078F0008091E800877F8093E8009ADD8091E8001E -:1079000080FFFCCF8091E3008078812B8093E3009F -:1079100080688093E300112311F482E001C083E0CA -:107920008EBB0FBF4DC08058823008F049C0809197 -:1079300094019091950160919601AE014F5F5F4F68 -:107940003FDDBC01009709F43BC08091E800877FD0 -:107950008093E80089819A8192DE8091E8008B779C -:107960008093E8002DC0803859F58091E800877F2A -:107970008093E800809190018093F1008091E8006D -:107980008E778093E80054DD1BC08823C9F4909162 -:1079900094019230A8F48091E800877F8093E800FA -:1079A0009093900145DD80919001882331F480917E -:1079B000E30087FD02C081E001C084E08EBBC0DC33 -:1079C0008091E80083FF0AC08091EB008062809381 -:1079D000EB008091E800877F8093E8000F900F9084 -:1079E000CF91DF911F910F91089508951F938EB34A -:1079F000882361F01091E9001092E9008091E8007D -:107A000083FF01C0E4DE17701093E9001F91089511 -:047A1000F894FFCF18 -:107A14004C55464143444300010000000000000867 -:107A24001201100102000008EB034A2001000001CA -:107A3400000109023E000201008032090400000135 -:107A44000202010005240010010424020405240696 -:107A54000001070582030800FF09040100020A006F -:107A6400000007050402100001070583021000014D -:107A74000403090426034100560052002000430079 -:107A840044004300200042006F006F0074006C004B -:0C7A94006F0061006400650072000000DB +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EF5A +:1070C000FDE702C005900D92AC38B107D9F711E089 +:1070D000ACE8B1E001C01D92AA39B107E1F718D3BD +:1070E00087C68ECF81E08093E0001092E200EE2709 +:1070F000FF27099408951F920F920FB60F92112443 +:107100008F939F938BB190E489278BB99F918F9137 +:107110000F900FBE0F901F90189584E08093E900A8 +:107120000DC08091E8008B778093E80003C08EB398 +:10713000882351F08091E80082FFF9CF8091E80028 +:1071400085FFEFCF8091F1000895982F83E0809321 +:10715000E9008091E80085FD0DC08091E8008E7700 +:107160008093E80003C08EB3882331F08091E8005B +:1071700080FFF9CF9093F10008954F925F926F9244 +:107180007F928F929F92AF92BF92CF92DF92EF92B7 +:10719000FF920F931F93CF93DF9384E08093E900D6 +:1071A0008091E80082FF45C2B8DF182F853419F4BA +:1071B0001092080103C0843519F4AFDF8DE00FC2CF +:1071C0008C34E1F38035D1F3843721F484E4BDDFDE +:1071D00080E005C2813611F489E501C28134B1F441 +:1071E0009CDF182F9ADF90E0880F991FAA2797FD40 +:1071F000A095BA2F312F330F20E0442737FD40955B +:10720000542F822B932BA42BB52BBAC1803711F4AA +:1072100083E5E5C1833549F4C0E0D1E0899195DF8C +:1072200021E0C730D207D1F7DBC1863521F481E3F5 +:107230008CDF80E3D4C1833731F487E886DF85E9CA +:1072400084DF8EE1CCC18536B9F4E0E0F0E093E074 +:1072500085E090935700E89507B600FCFDCF80933A +:107260005700E89507B600FCFDCFE058FF4FA0E7B8 +:10727000E030FA0771F7A2CF8C3651F44EDF8095DB +:1072800099E0E1E0F0E0082E90935700E89596CF62 +:10729000823739F4E1E0F0E089E08093570084918F +:1072A0009EC1863439F4E0E0F0E089E08093570035 +:1072B000849195C18E3439F4E3E0F0E089E0809365 +:1072C000570084918CC1813539F4E2E0F0E089E027 +:1072D00080935700849183C1823631F489E535DF8C +:1072E00080E033DF80E87BC1823419F0873609F013 +:1072F000DBC013DF082F11DFF82E0FDF682E855457 +:10730000823008F06BC1902F80E0CF2DD0E0C82BE9 +:10731000D92B173609F04BC081E180935700E895CF +:10732000DD24CC24C3943FC0E0908C01F0908D010B +:1073300000918E0110918F01B6E46B16D9F4ED2DFA +:10734000F0E0EE29FF29E4918E2FFFDEDD2081F0B1 +:1073500082E090E0A0E0B0E0E80EF91E0A1F1B1FDB +:10736000E0928C01F0928D0100938E0110938F01B9 +:10737000DC2418C0D801C701B695A79597958795C5 +:1073800021D5E3DE82E090E0A0E0B0E0E80EF91E57 +:107390000A1F1B1FE0928C01F0928D0100938E0159 +:1073A00010938F012197209709F0BECF19C18090CB +:1073B0008C0190908D01A0908E01B0908F0196E489 +:1073C000691609F05DC083E0F40180935700E895E9 +:1073D00007B600FCFDCF54C0F6E46F1661F57720C8 +:1073E00031F1E0908C01F0908D0100918E011091AF +:1073F0008F0193DED82ECC24852D90E08C299D29F9 +:10740000F7010C0140925700E895112482E090E0CA +:10741000A0E0B0E0E80EF91E0A1F1B1FE0928C01ED +:10742000F0928D0100938E0110938F0102C075DEE2 +:10743000582E742423C0E0908C01F0908D010091AF +:107440008E0110918F0116950795F794E79465DEEC +:10745000682FC701BFD480918C0190918D01A091BC +:107460008E01B0918F010296A11DB11D80938C01F8 +:1074700090938D01A0938E01B0938F01219704C04A +:107480005524772444244394209709F0A5CF96E40B +:10749000691609F093CE85E0F40180935700E895D2 +:1074A00007B600FCFDCF8ACE833471F400918C01C5 +:1074B00010918D0132DE90E021E0F8010C01209363 +:1074C0005700E89511247ACE833619F5E0908C01A7 +:1074D000F0908D0100918E0110918F011EDEF70159 +:1074E000E16090E021E00C0120935700E895112421 +:1074F00082E090E0A0E0B0E0E80EF91E0A1F1B1F3A +:10750000E0928C01F0928D0100938E0110938F0117 +:1075100055CE8D3661F4E0918C01F0918D0185E0BE +:1075200080935700E89507B600FCFDCF47CE823523 +:1075300051F4E0918C01F0918D0105911491812F0E +:1075400004DE802F4CC0843421F5E0908C01F09053 +:107550008D0100918E0110918F0116950795F7947A +:10756000E794DBDD682FC70135D480918C019091C1 +:107570008D01A0918E01B0918F010296A11DB11DC8 +:1075800080938C0190938D01A0938E01B0938F0115 +:1075900015CE843609F5E0908C01F0908D010091B4 +:1075A0008E0110918F01D801C701B695A7959795C7 +:1075B000879508D4CADD82E090E0A0E0B0E0E80E54 +:1075C000F91E0A1F1B1FE0928C01F0928D0100939F +:1075D0008E0110938F0104C08B3111F08FE3B5DD64 +:1075E00083E08093E9009091E8008091E8008E7735 +:1075F0008093E80095FF04C010C08EB38823C9F0C3 +:107600008091E80080FFF9CF8091E8008E77809329 +:10761000E80003C08EB3882361F08091E80080FF0A +:10762000F9CF84E08093E9008091E8008B77809324 +:10763000E800DF91CF911F910F91FF90EF90DF90C5 +:10764000CF90BF90AF909F908F907F906F905F9002 +:107650004F90089590919201892F8F77813249F54B +:10766000809193018032A1F0813219F5913A09F5A8 +:107670008091E800877F8093E80089E091E067E0EF +:1076800070E0D7D18091E8008B778093E80008956F +:10769000913279F48091E800877F8093E80089E057 +:1076A00091E067E070E029D28091E8008E778093C6 +:1076B000E800089582E061EC42E081D083E061E877 +:1076C00042E17DD084E060E842E179C01F9384B755 +:1076D000877F84BF88E10FB6F89480936000109292 +:1076E00060000FBE80E090E020E80FB6F894209391 +:1076F0006100809361000FBE11E015BF82E085BF7D +:10770000CFD010936F0083E0809381001F91089584 +:1077100084B794B7977F94BF98E10FB6F89490938D +:107720006000109260000FBE83FF08C0E0E0F0E050 +:10773000859194918F5F9F4F09F0D4DCC7DF7894D7 +:10774000569A02C01ADD2CD3809108018823D1F704 +:107750005E988091E00081608093E0002CE088E1F9 +:1077600090E00FB6F894A895809360000FBE209328 +:107770006000FFCFFA01923071F0933089F09130C0 +:1077800029F480E191E022E130E015C080E090E052 +:1077900020E030E010C082E291E02EE330E00BC048 +:1077A000882329F480E691E024E030E004C084E6F8 +:1077B00091E026E230E091838083C90108958093AF +:1077C000E9008091EB0081608093EB001092ED0066 +:1077D0006093EC004093ED008091EE00881F8827B5 +:1077E000881F08958091920188238CF403C08EB382 +:1077F0008823B1F08091E80082FFF9CF8091E80002 +:107800008B778093E80008958EB3882349F08091A8 +:10781000E80080FFF9CF8091E8008E778093E80040 +:107820000895EF92FF920F931F9345D04CD008ED2F +:1078300010E0F80180818F77808380818068808369 +:1078400080818F7D808319BC1EBA1092900180EEDA +:10785000E82EF12CF70180818B7F8083F8018081F5 +:107860008160808380E060E042E0A9DFE1EEF0E04B +:1078700080818E7F8083E2EEF0E080818160808372 +:10788000808188608083F70180818E7F8083F8010A +:107890008081806180831F910F91FF90EF90089508 +:1078A000E7EDF0E08081816080838AE482BF81E03F +:1078B00080939101B6CFE8EDF0E080818E7F8083E8 +:1078C0001092E20008951092DA001092E1000895FB +:1078D0001F920F920FB60F9211242F933F934F9345 +:1078E0005F936F937F938F939F93AF93BF93EF9328 +:1078F000FF938091DA0080FF1BC08091D80080FF49 +:1079000017C08091DA008E7F8093DA008091D900D1 +:1079100080FF0BC080E189BD82E189BD09B400FE12 +:10792000FDCF81E08EBB3BD203C019BC1EBA37D25B +:107930008091E10080FF17C08091E20080FF13C0BA +:107940008091E2008E7F8093E2008091E20080616E +:107950008093E2008091D80080628093D80019BCA7 +:1079600085E08EBB1CD28091E10084FF2CC0809109 +:10797000E20084FF28C080E189BD82E189BD09B4AD +:1079800000FEFDCF8091D8008F7D8093D80080913C +:10799000E1008F7E8093E1008091E2008F7E8093F2 +:1079A000E2008091E20081608093E200809190018A +:1079B000882331F48091E30087FD02C081E001C09B +:1079C00084E08EBBECD18091E10083FF21C08091E7 +:1079D000E20083FF1DC08091E100877F8093E1007A +:1079E00082E08EBB109290018091E1008E7F8093A7 +:1079F000E1008091E2008E7F8093E2008091E200BE +:107A000080618093E20080E060E042E0D8DEC7D190 +:107A1000FF91EF91BF91AF919F918F917F916F9166 +:107A20005F914F913F912F910F900FBE0F901F903C +:107A300018959C014091980150919901461757075C +:107A400018F4F90190E044C06115710511F0AB0123 +:107A5000F8CF8091E8008E778093E80040E050E016 +:107A6000F0CF8EB3882309F444C0853009F443C0B5 +:107A70008091E80083FF02C081E008958091E800D2 +:107A800082FD31C08091E80080FF22C08091F30028 +:107A90009091F200782F60E0292F30E0262B372BD1 +:107AA00007C081918093F100415050402F5F3F4FBC +:107AB0004115510519F02830310598F390E0283030 +:107AC000310509F491E08091E8008E778093E80019 +:107AD0004115510531F6992321F605C08EB388234F +:107AE00041F0853041F08091E80082FFF7CF80E0DF +:107AF000089582E0089583E008959C016115710561 +:107B000029F48091E8008B778093E800F90126C082 +:107B10008EB3882391F1853091F18091E80083FF45 +:107B200002C081E008958091E80082FFF1CF06C095 +:107B30008091F10081936150704059F02091F300E1 +:107B40008091F200322F20E090E0822B932B892B42 +:107B500079F78091E8008B778093E80061157105D3 +:107B6000B9F605C08EB3882341F0853041F080918D +:107B7000E80080FFF7CF80E0089582E0089583E079 +:107B800008950F931F93DF93CF9300D0CDB7DEB747 +:107B9000E2E9F1E08091F100819381E0EA39F807B0 +:107BA000C9F758DD8091E80083FFE4C0809192011D +:107BB00090919301953009F46DC0963040F4913066 +:107BC00081F1913070F0933009F0D4C02AC0983020 +:107BD00009F4A3C0993009F4B2C0963009F0CAC0C4 +:107BE0007CC0803809F4C6C0823809F0C3C08091D7 +:107BF000960187708093E9008091EB001092E90074 +:107C00002091E800277F2093E80090E025E09695FA +:107C100087952A95E1F781708093F1001092F10029 +:107C200087C0882319F0823009F0A4C08F71823098 +:107C300009F0A0C080919401882331F5209196012C +:107C4000277009F497C02093E9008091EB0080FF32 +:107C50001BC0933021F48091EB00806213C08091AF +:107C6000EB0080618093EB0081E090E002C0880F20 +:107C7000991F2A95E2F78093EA001092EA0080911A +:107C8000EB0088608093EB001092E9008091E8009F +:107C9000877F51C0882309F06DC0109194011F7730 +:107CA0000FB7F8948091E800877F8093E8009ADD11 +:107CB0008091E80080FFFCCF8091E3008078812BE9 +:107CC0008093E30080688093E300112311F482E045 +:107CD00001C083E08EBB0FBF4DC08058823008F0DA +:107CE00049C0809194019091950160919601AE01F7 +:107CF0004F5F5F4F3FDDBC01009709F43BC08091AF +:107D0000E800877F8093E80089819A8192DE8091E4 +:107D1000E8008B778093E8002DC0803859F580917A +:107D2000E800877F8093E800809190018093F100C4 +:107D30008091E8008E778093E80054DD1BC0882393 +:107D4000C9F4909194019230A8F48091E800877F63 +:107D50008093E8009093900145DD80919001882305 +:107D600031F48091E30087FD02C081E001C084E02E +:107D70008EBBA0DC8091E80083FF0AC08091EB00FD +:107D800080628093EB008091E800877F8093E80019 +:107D90000F900F90CF91DF911F910F91089508954B +:107DA0001F938EB3882361F01091E9001092E900CF +:107DB0008091E80083FF01C0E4DE17701093E900B2 +:107DC0001F910895F999FECF92BD81BDF89A992728 +:107DD00080B50895262FF999FECF1FBA92BD81BDB7 +:107DE00020BD0FB6F894FA9AF99A0FBE019608953D +:047DF000F894FFCF35 +:107DF4004C55464143444300010000000000000884 +:107E04001201100102000008EB034A2001000001E6 +:107E1400000109023E000201008032090400000151 +:107E240002020100052400100104240204052406B2 +:107E34000001070582030800FF09040100020A008B +:107E44000000070504021000010705830210000169 +:107E54000403090426034100560052002000430095 +:107E640044004300200042006F006F0074006C0067 +:0C7E74006F0061006400650072000000F7 :040000030000700089 :00000001FF -- cgit v1.2.3-18-g5258 From 014466a7880e1424aaeedd66c269ea1197624535 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sat, 21 Jan 2012 16:51:55 -0500 Subject: move interrupt vector table to application section before jumping to it after upload finished. --- bootloaders/caterina_LUFA/Caterina.c | 28 ++- bootloaders/caterina_LUFA/Caterina.hex | 443 ++++++++++++++++----------------- 2 files changed, 240 insertions(+), 231 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index 8bd7403..9e1dbbc 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -58,6 +58,16 @@ static bool RunBootloader = true; void StartSketch() { + /* Relocate the interrupt vector table to the application section */ +// MCUCR = (1 << IVCE); // these two lines are for moving interrupts to bootloader, not application +// MCUCR = (1 << IVSEL); + __asm__ volatile ( + "ldi r16, 0x01\n" + "out 0x35, r16\n" + "ldi r16, 0x00\n" + "out 0x35, r16\n" + ::); + UDCON = 1; // Detach USB UDIEN = 0; __asm__ volatile ( // Reset vector to run firmware @@ -73,12 +83,12 @@ void StartSketch() */ int main(void) { - uint8_t MCUSR_state = MCUSR; // store the reason for the reset - MCUSR &= ~(1 << WDRF); // must clear the watchdog reset flag before disabling and reenabling WDT - wdt_disable(); - if (MCUSR_state & (1< Date: Tue, 24 Jan 2012 18:04:10 -0500 Subject: Caterina now cleanly hands off operation to the sketch had to remove TIMER1 operation from bootloader - was interfering with normal sketch operation --- bootloaders/caterina_LUFA/Caterina.c | 55 ++--- bootloaders/caterina_LUFA/Caterina.hex | 436 ++++++++++++++++----------------- cores/arduino/CDC.cpp | 5 +- 3 files changed, 234 insertions(+), 262 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index 9e1dbbc..f95613f 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -58,23 +58,16 @@ static bool RunBootloader = true; void StartSketch() { + cli(); /* Relocate the interrupt vector table to the application section */ -// MCUCR = (1 << IVCE); // these two lines are for moving interrupts to bootloader, not application -// MCUCR = (1 << IVSEL); - __asm__ volatile ( - "ldi r16, 0x01\n" - "out 0x35, r16\n" - "ldi r16, 0x00\n" - "out 0x35, r16\n" - ::); + MCUCR = (1 << IVCE); + MCUCR = 0; - UDCON = 1; // Detach USB - UDIEN = 0; - __asm__ volatile ( // Reset vector to run firmware - "clr r30\n" - "clr r31\n" - "ijmp\n" - ::); +// UDCON = 1; // Detach USB +// UDIEN = 0; + + /* jump to beginning of application space */ + __asm__ volatile("jmp 0x0000"); } /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously @@ -83,12 +76,7 @@ void StartSketch() */ int main(void) { -// uint8_t MCUSR_state = MCUSR; // store the reason for the reset -// MCUSR &= ~(1 << WDRF); // must clear the watchdog reset flag before disabling and reenabling WDT -// wdt_disable(); -// if (MCUSR_state & (1< 10000 && pgm_read_word(0) != 0xFFFF) +// RunBootloader = false; } - PORTD &= ~(1<<6); // turn off LED attached to D12 - /* Disconnect from the host - USB interface will be reset later along with the AVR */ USB_Detach(); - /* Enable the watchdog and force a timeout to reset the AVR */ -// wdt_enable(WDTO_250MS); - -// for (;;); - + /* Jump to beginning of application space to run the sketch - do not reset */ StartSketch(); } @@ -134,16 +117,6 @@ void SetupHardware(void) /* Initialize USB Subsystem */ USB_Init(); - - /* Bootloader active LED toggle timer initialization */ - TIMSK1 = (1 << TOIE1); - TCCR1B = ((1 << CS11) | (1 << CS10)); -} - -/** ISR to periodically toggle the LEDs on the board to indicate that the bootloader is active. */ -ISR(TIMER1_OVF_vect, ISR_BLOCK) -{ - PORTD ^= (1<<6); // toggle LED on D12 } /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index 4d0f17d..c3c1d93 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,232 +1,228 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC000003AC400005AC000000A +:1070200060C000005EC000001FC400005AC0000025 :1070300058C0000056C0000054C0000052C00000FC :1070400050C000004EC000004CC000004AC000000C -:1070500056C0000046C0000044C0000042C000000E +:1070500048C0000046C0000044C0000042C000001C :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E2EC5F +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0ECE859 :1070C000FDE702C005900D92AC38B107D9F711E089 -:1070D000ACE8B1E001C01D92AA39B107E1F71CD3B9 -:1070E0006EC68ECF01E005BF00E005BF81E0809352 -:1070F000E0001092E200EE27FF27099408951F9206 -:107100000F920FB60F9211248F939F938BB190E43F -:1071100089278BB99F918F910F900FBE0F901F9071 -:10712000189584E08093E9000DC08091E8008B778A -:107130008093E80003C08EB3882351F08091E8006B -:1071400082FFF9CF8091E80085FFEFCF8091F100B9 -:107150000895982F83E08093E9008091E80085FDF1 -:107160000DC08091E8008E778093E80003C08EB355 -:10717000882331F08091E80080FFF9CF9093F100EF -:1071800008954F925F926F927F928F929F92AF92EB -:10719000BF92CF92DF92EF92FF920F931F93CF9304 -:1071A000DF9384E08093E9008091E80082FF45C28C -:1071B000B8DF182F853419F41092080103C0843504 -:1071C00019F4AFDF8DE00FC28C34E1F38035D1F3D9 -:1071D000843721F484E4BDDF80E005C2813611F4F8 -:1071E00089E501C28134B1F49CDF182F9ADF90E069 -:1071F000880F991FAA2797FDA095BA2F312F330F1B -:1072000020E0442737FD4095542F822B932BA42B4D -:10721000B52BBAC1803711F483E5E5C1833549F454 -:10722000C0E0D1E0899195DF21E0C730D207D1F7E6 -:10723000DBC1863521F481E38CDF80E3D4C1833761 -:1072400031F487E886DF85E984DF8EE1CCC18536BD -:10725000B9F4E0E0F0E093E085E090935700E89522 -:1072600007B600FCFDCF80935700E89507B600FCF9 -:10727000FDCFE058FF4FA0E7E030FA0771F7A2CF4B -:107280008C3651F44EDF809599E0E1E0F0E0082E75 -:1072900090935700E89596CF823739F4E1E0F0E01B -:1072A00089E08093570084919EC1863439F4E0E0F0 -:1072B000F0E089E080935700849195C18E3439F4D1 -:1072C000E3E0F0E089E08093570084918CC1813540 -:1072D00039F4E2E0F0E089E080935700849183C1C3 -:1072E000823631F489E535DF80E033DF80E87BC129 -:1072F000823419F0873609F0DBC013DF082F11DF65 -:10730000F82E0FDF682E8554823008F06BC1902F65 -:1073100080E0CF2DD0E0C82BD92B173609F04BC019 -:1073200081E180935700E895DD24CC24C3943FC0CD -:10733000E0908C01F0908D0100918E0110918F01F1 -:10734000B6E46B16D9F4ED2DF0E0EE29FF29E491B7 -:107350008E2FFFDEDD2081F082E090E0A0E0B0E043 -:10736000E80EF91E0A1F1B1FE0928C01F0928D019E -:1073700000938E0110938F01DC2418C0D801C7013F -:10738000B695A7959795879504D5E3DE82E090E0C2 -:10739000A0E0B0E0E80EF91E0A1F1B1FE0928C016E -:1073A000F0928D0100938E0110938F012197209709 -:1073B00009F0BECF19C180908C0190908D01A090F2 -:1073C0008E01B0908F0196E4691609F05DC083E0EC -:1073D000F40180935700E89507B600FCFDCF54C038 -:1073E000F6E46F1661F5772031F1E0908C01F090B2 -:1073F0008D0100918E0110918F0193DED82ECC2447 -:10740000852D90E08C299D29F7010C0140925700B1 -:10741000E895112482E090E0A0E0B0E0E80EF91ECB -:107420000A1F1B1FE0928C01F0928D0100938E01C8 -:1074300010938F0102C075DE582E742423C0E09093 -:107440008C01F0908D0100918E0110918F011695A5 -:107450000795F794E79465DE682FC701A2D4809161 -:107460008C0190918D01A0918E01B0918F010296B7 -:10747000A11DB11D80938C0190938D01A0938E016D -:10748000B0938F01219704C055247724442443945A -:10749000209709F0A5CF96E4691609F093CE85E010 -:1074A000F40180935700E89507B600FCFDCF8ACE23 -:1074B000833471F400918C0110918D0132DE90E0E3 -:1074C00021E0F8010C0120935700E89511247ACEB1 -:1074D000833619F5E0908C01F0908D0100918E01BA -:1074E00010918F011EDEF701E16090E021E00C01B8 -:1074F00020935700E895112482E090E0A0E0B0E0EE -:10750000E80EF91E0A1F1B1FE0928C01F0928D01FC -:1075100000938E0110938F0155CE8D3661F4E0916A -:107520008C01F0918D0185E080935700E89507B6B6 -:1075300000FCFDCF47CE823551F4E0918C01F091F3 -:107540008D0105911491812F04DE802F4CC084346D -:1075500021F5E0908C01F0908D0100918E01109149 -:107560008F0116950795F794E794DBDD682FC70127 -:1075700018D480918C0190918D01A0918E01B091D1 -:107580008F010296A11DB11D80938C0190938D01F6 -:10759000A0938E01B0938F0115CE843609F5E0904B -:1075A0008C01F0908D0100918E0110918F01D80116 -:1075B000C701B695A79597958795EBD3CADD82E06D -:1075C00090E0A0E0B0E0E80EF91E0A1F1B1FE09259 -:1075D0008C01F0928D0100938E0110938F0104C0F5 -:1075E0008B3111F08FE3B5DD83E08093E90090915A -:1075F000E8008091E8008E778093E80095FF04C052 -:1076000010C08EB38823C9F08091E80080FFF9CFC5 -:107610008091E8008E778093E80003C08EB38823C2 -:1076200061F08091E80080FFF9CF84E08093E90069 -:107630008091E8008B778093E800DF91CF911F91D4 -:107640000F91FF90EF90DF90CF90BF90AF909F9001 -:107650008F907F906F905F904F90089590919201DE -:10766000892F8F77813249F5809193018032A1F083 -:10767000813219F5913A09F58091E800877F80936E -:10768000E80089E091E067E070E0BAD18091E8001D -:107690008B778093E8000895913279F48091E80027 -:1076A000877F8093E80089E091E067E070E00CD28A -:1076B0008091E8008E778093E800089582E061EC85 -:1076C00042E064D083E061E842E160D084E060E8B9 -:1076D00042E15CC01F9384B7877F84BF88E10FB607 -:1076E000F89480936000109260000FBE80E090E0FC -:1076F00020E80FB6F89420936100809361000FBEDC -:1077000011E015BF82E085BFB2D010936F0083E017 -:10771000809381001F910895DDDF7894569A5E9AD8 -:1077200002C02FDD24D3809108018823D1F75E9811 -:107730008091E00081608093E000D4DC80E090E004 -:107740000895FA01923071F0933089F0913029F464 -:1077500080E191E022E130E015C080E090E020E09F -:1077600030E010C082E291E02EE330E00BC08823CD -:1077700029F480E691E024E030E004C084E691E062 -:1077800026E230E091838083C90108958093E90067 -:107790008091EB0081608093EB001092ED0060938C -:1077A000EC004093ED008091EE00881F8827881F31 -:1077B00008958091920188238CF403C08EB38823AE -:1077C000B1F08091E80082FFF9CF8091E8008B77DB -:1077D0008093E80008958EB3882349F08091E800F3 -:1077E00080FFF9CF8091E8008E778093E8000895BC -:1077F000EF92FF920F931F9345D04CD008ED10E00D -:10780000F80180818F778083808180688083808188 -:107810008F7D808319BC1EBA1092900180EEE82EF5 -:10782000F12CF70180818B7F8083F801808181605A -:10783000808380E060E042E0A9DFE1EEF0E080815B -:107840008E7F8083E2EEF0E08081816080838081A2 -:1078500088608083F70180818E7F8083F80180813A -:10786000806180831F910F91FF90EF900895E7ED65 -:10787000F0E08081816080838AE482BF81E0809330 -:107880009101B6CFE8EDF0E080818E7F8083109289 -:10789000E20008951092DA001092E10008951F921C -:1078A0000F920FB60F9211242F933F934F935F9334 -:1078B0006F937F938F939F93AF93BF93EF93FF93B8 -:1078C0008091DA0080FF1BC08091D80080FF17C034 -:1078D0008091DA008E7F8093DA008091D90080FF5A -:1078E0000BC080E189BD82E189BD09B400FEFDCFF6 -:1078F00081E08EBB3BD203C019BC1EBA37D2809147 -:10790000E10080FF17C08091E20080FF13C08091EA -:10791000E2008E7F8093E2008091E200806180939C -:10792000E2008091D80080628093D80019BC85E085 -:107930008EBB1CD28091E10084FF2CC08091E200BC -:1079400084FF28C080E189BD82E189BD09B400FEC1 -:10795000FDCF8091D8008F7D8093D8008091E10089 -:107960008F7E8093E1008091E2008F7E8093E20021 -:107970008091E20081608093E200809190018823F1 -:1079800031F48091E30087FD02C081E001C084E012 -:107990008EBBECD18091E10083FF21C08091E20099 -:1079A00083FF1DC08091E100877F8093E10082E02A -:1079B0008EBB109290018091E1008E7F8093E10058 -:1079C0008091E2008E7F8093E2008091E2008061EE -:1079D0008093E20080E060E042E0D8DEC7D1FF9112 -:1079E000EF91BF91AF919F918F917F916F915F9137 -:1079F0004F913F912F910F900FBE0F901F901895B0 -:107A00009C0140919801509199014617570718F42D -:107A1000F90190E044C06115710511F0AB01F8CF98 -:107A20008091E8008E778093E80040E050E0F0CF4E -:107A30008EB3882309F444C0853009F443C0809193 -:107A4000E80083FF02C081E008958091E80082FD94 -:107A500031C08091E80080FF22C08091F3009091B6 -:107A6000F200782F60E0292F30E0262B372B07C05B -:107A700081918093F100415050402F5F3F4F41155D -:107A8000510519F02830310598F390E02830310580 -:107A900009F491E08091E8008E778093E800411529 -:107AA000510531F6992321F605C08EB3882341F0A4 -:107AB000853041F08091E80082FFF7CF80E00895A3 -:107AC00082E0089583E008959C016115710529F411 -:107AD0008091E8008B778093E800F90126C08EB38F -:107AE000882391F1853091F18091E80083FF02C0F5 -:107AF00081E008958091E80082FFF1CF06C0809177 -:107B0000F10081936150704059F02091F300809111 -:107B1000F200322F20E090E0822B932B892B79F713 -:107B20008091E8008B778093E80061157105B9F6C4 -:107B300005C08EB3882341F0853041F08091E80084 -:107B400080FFF7CF80E0089582E0089583E00895F4 -:107B50000F931F93DF93CF9300D0CDB7DEB7E2E949 -:107B6000F1E08091F100819381E0EA39F807C9F7EB -:107B700075DD8091E80083FFE4C0809192019091CF -:107B80009301953009F46DC0963040F4913081F145 -:107B9000913070F0933009F0D4C02AC0983009F4C5 -:107BA000A3C0993009F4B2C0963009F0CAC07CC0B5 -:107BB000803809F4C6C0823809F0C3C080919601AC -:107BC00087708093E9008091EB001092E90020918A -:107BD000E800277F2093E80090E025E096958795C0 -:107BE0002A95E1F781708093F1001092F10087C02F -:107BF000882319F0823009F0A4C08F71823009F017 -:107C0000A0C080919401882331F5209196012770BE -:107C100009F497C02093E9008091EB0080FF1BC01E -:107C2000933021F48091EB00806213C08091EB00CF -:107C300080618093EB0081E090E002C0880F991F83 -:107C40002A95E2F78093EA001092EA008091EB0017 -:107C500088608093EB001092E9008091E800877FB4 -:107C600051C0882309F06DC0109194011F770FB7A0 -:107C7000F8948091E800877F8093E8009ADD8091F6 -:107C8000E80080FFFCCF8091E3008078812B809317 -:107C9000E30080688093E300112311F482E001C0C7 -:107CA00083E08EBB0FBF4DC08058823008F049C0C2 -:107CB000809194019091950160919601AE014F5F82 -:107CC0005F4F3FDDBC01009709F43BC08091E800A5 -:107CD000877F8093E80089819A8192DE8091E80015 -:107CE0008B778093E8002DC0803859F58091E800AB -:107CF000877F8093E800809190018093F1008091CC -:107D0000E8008E778093E80054DD1BC08823C9F417 -:107D1000909194019230A8F48091E800877F80933D -:107D2000E8009093900145DD80919001882331F423 -:107D30008091E30087FD02C081E001C084E08EBB3A -:107D4000BDDC8091E80083FF0AC08091EB00806277 -:107D50008093EB008091E800877F8093E8000F908C -:107D60000F90CF91DF911F910F91089508951F9368 -:107D70008EB3882361F01091E9001092E9008091A0 -:107D8000E80083FF01C0E4DE17701093E9001F9143 -:107D90000895F999FECF92BD81BDF89A992780B5D3 -:107DA0000895262FF999FECF1FBA92BD81BD20BD3F -:107DB0000FB6F894FA9AF99A0FBE01960895F894BE -:027DC000FFCFF3 -:107DC2004C554641434443000100000000000008B6 -:107DD2001201100102000008EB034A200100000119 -:107DE200000109023E000201008032090400000184 -:107DF20002020100052400100104240204052406E5 -:107E02000001070582030800FF09040100020A00BD -:107E1200000007050402100001070583021000019B -:107E220004030904260341005600520020004300C7 -:107E320044004300200042006F006F0074006C0099 -:0C7E42006F006100640065007200000029 +:1070D000ACE8B1E001C01D92AA39B107E1F7FCD2DA +:1070E00053C68ECFF89481E085BF15BE0C94000086 +:1070F000089584E08093E9000DC08091E8008B77CB +:107100008093E80003C08EB3882351F08091E8009B +:1071100082FFF9CF8091E80085FFEFCF8091F100E9 +:107120000895982F83E08093E9008091E80085FD21 +:107130000DC08091E8008E778093E80003C08EB385 +:10714000882331F08091E80080FFF9CF9093F1001F +:1071500008954F925F926F927F928F929F92AF921B +:10716000BF92CF92DF92EF92FF920F931F93CF9334 +:10717000DF9384E08093E9008091E80082FF45C2BC +:10718000B8DF182F853419F41092080103C0843534 +:1071900019F4AFDF8DE00FC28C34E1F38035D1F309 +:1071A000843721F484E4BDDF80E005C2813611F428 +:1071B00089E501C28134B1F49CDF182F9ADF90E099 +:1071C000880F991FAA2797FDA095BA2F312F330F4B +:1071D00020E0442737FD4095542F822B932BA42B7E +:1071E000B52BBAC1803711F483E5E5C1833549F485 +:1071F000C0E0D1E0899195DF21E0C730D207D1F717 +:10720000DBC1863521F481E38CDF80E3D4C1833791 +:1072100031F487E886DF85E984DF8EE1CCC18536ED +:10722000B9F4E0E0F0E093E085E090935700E89552 +:1072300007B600FCFDCF80935700E89507B600FC29 +:10724000FDCFE058FF4FA0E7E030FA0771F7A2CF7B +:107250008C3651F44EDF809599E0E1E0F0E0082EA5 +:1072600090935700E89596CF823739F4E1E0F0E04B +:1072700089E08093570084919EC1863439F4E0E020 +:10728000F0E089E080935700849195C18E3439F401 +:10729000E3E0F0E089E08093570084918CC1813570 +:1072A00039F4E2E0F0E089E080935700849183C1F3 +:1072B000823631F489E535DF80E033DF80E87BC159 +:1072C000823419F0873609F0DBC013DF082F11DF95 +:1072D000F82E0FDF682E8554823008F06BC1902F96 +:1072E00080E0CF2DD0E0C82BD92B173609F04BC04A +:1072F00081E180935700E895DD24CC24C3943FC0FE +:10730000E0908C01F0908D0100918E0110918F0121 +:10731000B6E46B16D9F4ED2DF0E0EE29FF29E491E7 +:107320008E2FFFDEDD2081F082E090E0A0E0B0E073 +:10733000E80EF91E0A1F1B1FE0928C01F0928D01CE +:1073400000938E0110938F01DC2418C0D801C7016F +:10735000B695A7959795879501D5E3DE82E090E0F5 +:10736000A0E0B0E0E80EF91E0A1F1B1FE0928C019E +:10737000F0928D0100938E0110938F012197209739 +:1073800009F0BECF19C180908C0190908D01A09022 +:107390008E01B0908F0196E4691609F05DC083E01C +:1073A000F40180935700E89507B600FCFDCF54C068 +:1073B000F6E46F1661F5772031F1E0908C01F090E2 +:1073C0008D0100918E0110918F0193DED82ECC2477 +:1073D000852D90E08C299D29F7010C0140925700E2 +:1073E000E895112482E090E0A0E0B0E0E80EF91EFC +:1073F0000A1F1B1FE0928C01F0928D0100938E01F9 +:1074000010938F0102C075DE582E742423C0E090C3 +:107410008C01F0908D0100918E0110918F011695D5 +:107420000795F794E79465DE682FC7019FD4809194 +:107430008C0190918D01A0918E01B0918F010296E7 +:10744000A11DB11D80938C0190938D01A0938E019D +:10745000B0938F01219704C055247724442443948A +:10746000209709F0A5CF96E4691609F093CE85E040 +:10747000F40180935700E89507B600FCFDCF8ACE53 +:10748000833471F400918C0110918D0132DE90E013 +:1074900021E0F8010C0120935700E89511247ACEE1 +:1074A000833619F5E0908C01F0908D0100918E01EA +:1074B00010918F011EDEF701E16090E021E00C01E8 +:1074C00020935700E895112482E090E0A0E0B0E01E +:1074D000E80EF91E0A1F1B1FE0928C01F0928D012D +:1074E00000938E0110938F0155CE8D3661F4E0919B +:1074F0008C01F0918D0185E080935700E89507B6E7 +:1075000000FCFDCF47CE823551F4E0918C01F09123 +:107510008D0105911491812F04DE802F4CC084349D +:1075200021F5E0908C01F0908D0100918E01109179 +:107530008F0116950795F794E794DBDD682FC70157 +:1075400015D480918C0190918D01A0918E01B09104 +:107550008F010296A11DB11D80938C0190938D0126 +:10756000A0938E01B0938F0115CE843609F5E0907B +:107570008C01F0908D0100918E0110918F01D80146 +:10758000C701B695A79597958795E8D3CADD82E0A0 +:1075900090E0A0E0B0E0E80EF91E0A1F1B1FE09289 +:1075A0008C01F0928D0100938E0110938F0104C025 +:1075B0008B3111F08FE3B5DD83E08093E90090918A +:1075C000E8008091E8008E778093E80095FF04C082 +:1075D00010C08EB38823C9F08091E80080FFF9CFF6 +:1075E0008091E8008E778093E80003C08EB38823F3 +:1075F00061F08091E80080FFF9CF84E08093E9009A +:107600008091E8008B778093E800DF91CF911F9104 +:107610000F91FF90EF90DF90CF90BF90AF909F9031 +:107620008F907F906F905F904F900895909192010E +:10763000892F8F77813249F5809193018032A1F0B3 +:10764000813219F5913A09F58091E800877F80939E +:10765000E80089E091E067E070E0B7D18091E80050 +:107660008B778093E8000895913279F48091E80057 +:10767000877F8093E80089E091E067E070E009D2BD +:107680008091E8008E778093E800089582E061ECB5 +:1076900042E061D083E061E842E15DD084E060E8EF +:1076A00042E159C084B7877F84BF88E10FB6F89460 +:1076B00080936000109260000FBE80E090E020E8B0 +:1076C0000FB6F89420936100809361000FBE81E0B3 +:1076D00085BF82E085BFB0C088E10FB6F894809383 +:1076E0006000109260000FBEDDDF789402C031DDD3 +:1076F00023D3809108018823D1F78091E000816035 +:107700008093E000EFDC80E090E00895FA01923091 +:1077100071F0933089F0913029F480E191E022E119 +:1077200030E015C080E090E020E030E010C082E260 +:1077300091E02EE330E00BC0882329F480E691E04D +:1077400024E030E004C084E691E026E230E091835A +:107750008083C90108958093E9008091EB008160E6 +:107760008093EB001092ED006093EC004093ED00ED +:107770008091EE00881F8827881F089580919201CC +:1077800088238CF403C08EB38823B1F08091E80085 +:1077900082FFF9CF8091E8008B778093E80008950D +:1077A0008EB3882349F08091E80080FFF9CF809163 +:1077B000E8008E778093E8000895EF92FF920F9390 +:1077C0001F9345D04CD008ED10E0F80180818F77F1 +:1077D000808380818068808380818F7D808319BCD5 +:1077E0001EBA1092900180EEE82EF12CF7018081F4 +:1077F0008B7F8083F80180818160808380E060E0FE +:1078000042E0A9DFE1EEF0E080818E7F8083E2EE4E +:10781000F0E0808181608083808188608083F701CF +:1078200080818E7F8083F8018081806180831F91B9 +:107830000F91FF90EF900895E7EDF0E08081816077 +:1078400080838AE482BF81E080939101B6CFE8ED26 +:10785000F0E080818E7F80831092E2000895109284 +:10786000DA001092E10008951F920F920FB60F9266 +:1078700011242F933F934F935F936F937F938F9335 +:107880009F93AF93BF93EF93FF938091DA0080FFB4 +:107890001BC08091D80080FF17C08091DA008E7FD6 +:1078A0008093DA008091D90080FF0BC080E189BD10 +:1078B00082E189BD09B400FEFDCF81E08EBB3BD2E1 +:1078C00003C019BC1EBA37D28091E10080FF17C0F7 +:1078D0008091E20080FF13C08091E2008E7F809350 +:1078E000E2008091E20080618093E2008091D80004 +:1078F00080628093D80019BC85E08EBB1CD2809139 +:10790000E10084FF2CC08091E20084FF28C080E168 +:1079100089BD82E189BD09B400FEFDCF8091D80008 +:107920008F7D8093D8008091E1008F7E8093E1006D +:107930008091E2008F7E8093E2008091E20081607E +:107940008093E20080919001882331F48091E300DC +:1079500087FD02C081E001C084E08EBBECD1809144 +:10796000E10083FF21C08091E20083FF1DC0809170 +:10797000E100877F8093E10082E08EBB109290014E +:107980008091E1008E7F8093E1008091E2008E7F04 +:107990008093E2008091E20080618093E20080E0C9 +:1079A00060E042E0D8DEC7D1FF91EF91BF91AF9187 +:1079B0009F918F917F916F915F914F913F912F9107 +:1079C0000F900FBE0F901F9018959C014091980149 +:1079D000509199014617570718F4F90190E044C0F7 +:1079E0006115710511F0AB01F8CF8091E8008E7739 +:1079F0008093E80040E050E0F0CF8EB3882309F494 +:107A000044C0853009F443C08091E80083FF02C080 +:107A100081E008958091E80082FD31C08091E80006 +:107A200080FF22C08091F3009091F200782F60E0F7 +:107A3000292F30E0262B372B07C081918093F1004E +:107A4000415050402F5F3F4F4115510519F02830EC +:107A5000310598F390E02830310509F491E08091E8 +:107A6000E8008E778093E8004115510531F699239F +:107A700021F605C08EB3882341F0853041F0809116 +:107A8000E80082FFF7CF80E0089582E0089583E068 +:107A900008959C016115710529F48091E8008B77A8 +:107AA0008093E800F90126C08EB3882391F18530D8 +:107AB00091F18091E80083FF02C081E008958091F8 +:107AC000E80082FFF1CF06C08091F1008193615000 +:107AD000704059F02091F3008091F200322F20E0A5 +:107AE00090E0822B932B892B79F78091E8008B779C +:107AF0008093E80061157105B9F605C08EB388233F +:107B000041F0853041F08091E80080FFF7CF80E0C0 +:107B1000089582E0089583E008950F931F93DF9303 +:107B2000CF9300D0CDB7DEB7E2E9F1E08091F1006C +:107B3000819381E0EA39F807C9F778DD8091E800A0 +:107B400083FFE4C08091920190919301953009F4F4 +:107B50006DC0963040F4913081F1913070F09330E7 +:107B600009F0D4C02AC0983009F4A3C0993009F4B0 +:107B7000B2C0963009F0CAC07CC0803809F4C6C0D3 +:107B8000823809F0C3C08091960187708093E90024 +:107B90008091EB001092E9002091E800277F20936C +:107BA000E80090E025E0969587952A95E1F78170A9 +:107BB0008093F1001092F10087C0882319F0823081 +:107BC00009F0A4C08F71823009F0A0C080919401A7 +:107BD000882331F520919601277009F497C02093EE +:107BE000E9008091EB0080FF1BC0933021F480916D +:107BF000EB00806213C08091EB0080618093EB000A +:107C000081E090E002C0880F991F2A95E2F78093E7 +:107C1000EA001092EA008091EB0088608093EB000C +:107C20001092E9008091E800877F51C0882309F015 +:107C30006DC0109194011F770FB7F8948091E80000 +:107C4000877F8093E8009ADD8091E80080FFFCCF79 +:107C50008091E3008078812B8093E300806880939B +:107C6000E300112311F482E001C083E08EBB0FBF5B +:107C70004DC08058823008F049C0809194019091A5 +:107C8000950160919601AE014F5F5F4F3FDDBC01F2 +:107C9000009709F43BC08091E800877F8093E8005B +:107CA00089819A8192DE8091E8008B778093E80049 +:107CB0002DC0803859F58091E800877F8093E800D7 +:107CC000809190018093F1008091E8008E778093FD +:107CD000E80054DD1BC08823C9F4909194019230D0 +:107CE000A8F48091E800877F8093E800909390014A +:107CF00045DD80919001882331F48091E30087FD78 +:107D000002C081E001C084E08EBBC0DC8091E8004D +:107D100083FF0AC08091EB0080628093EB0080912A +:107D2000E800877F8093E8000F900F90CF91DF915C +:107D30001F910F91089508951F938EB3882361F0CA +:107D40001091E9001092E9008091E80083FF01C0E2 +:107D5000E4DE17701093E9001F910895F999FECFA2 +:107D600092BD81BDF89A992780B50895262FF9997B +:107D7000FECF1FBA92BD81BD20BD0FB6F894FA9A0E +:0C7D8000F99A0FBE01960895F894FFCF09 +:107D8C004C554641434443000100000000000008EC +:107D9C001201100102000008EB034A20010000014F +:107DAC00000109023E0002010080320904000001BA +:107DBC00020201000524001001042402040524061B +:107DCC000001070582030800FF09040100020A00F4 +:107DDC0000000705040210000107058302100001D2 +:107DEC0004030904260341005600520020004300FE +:107DFC0044004300200042006F006F0074006C00D0 +:0C7E0C006F00610064006500720000005F :040000030000700089 :00000001FF diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 8605ce3..eb1b2c5 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -27,7 +27,10 @@ void Reboot() { USB.detach(); cli(); - asm volatile("jmp 0x7800"); // jump to bootloader - DiskLoader takes up last 2 kB + + // Reset the microcontroller to run the bootloader + wdt_enable(WDTO_250MS); + for (;;); } // Define constants and variables for buffering incoming serial data. We're -- cgit v1.2.3-18-g5258 From c7df908cec4a3fc36b009cfdb4a8f45bd1e7d91a Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Fri, 3 Feb 2012 20:24:24 -0500 Subject: modify boards.txt with new settings for Caterina_LUFA --- boards.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/boards.txt b/boards.txt index fed59eb..89035e6 100644 --- a/boards.txt +++ b/boards.txt @@ -147,14 +147,14 @@ mega.build.variant=mega ############################################################## leonardo.name=Arduino Leonardo -leonardo.upload.protocol=arduino -leonardo.upload.maximum_size=30720 +leonardo.upload.protocol=avr109 +leonardo.upload.maximum_size=28672 leonardo.upload.speed=1200 leonardo.bootloader.low_fuses=0xde leonardo.bootloader.high_fuses=0xd8 leonardo.bootloader.extended_fuses=0xcb -leonardo.bootloader.path=caterina -leonardo.bootloader.file=Caterina-Leonardo.hex +leonardo.bootloader.path=caterina_LUFA +leonardo.bootloader.file=Caterina.hex leonardo.bootloader.unlock_bits=0x3F leonardo.bootloader.lock_bits=0x2F leonardo.build.mcu=atmega32u4 -- cgit v1.2.3-18-g5258 From d7b0507e8a226a639f000fd1c6e7de70117c7c84 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Fri, 3 Feb 2012 21:42:46 -0500 Subject: fixed starting Leonardo bootloader from sketch AvrdudeUploader class opens and closes Leonardo port at the magic baudrate before starting avrdude; reduced reset timeout from 250 ms to 15 ms --- cores/arduino/CDC.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index eb1b2c5..6dd1cbe 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -29,7 +29,7 @@ void Reboot() cli(); // Reset the microcontroller to run the bootloader - wdt_enable(WDTO_250MS); + wdt_enable(WDTO_15MS); for (;;); } -- cgit v1.2.3-18-g5258 From 4544fb1a1fd04893626dd81273a29bad69360cb2 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Fri, 3 Feb 2012 23:15:04 -0500 Subject: proper bootloader timeout and LED control in Leonardo bootloader --- bootloaders/caterina_LUFA/Caterina.c | 92 +++++-- bootloaders/caterina_LUFA/Caterina.h | 15 +- bootloaders/caterina_LUFA/Caterina.hex | 452 +++++++++++++++++---------------- bootloaders/caterina_LUFA/makefile | 2 +- 4 files changed, 325 insertions(+), 236 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index f95613f..82d468f 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -56,26 +56,58 @@ static uint32_t CurrAddress; */ static bool RunBootloader = true; -void StartSketch() +/* Pulse generation counters to keep track of the time remaining for each pulse type */ +#define TX_RX_LED_PULSE_PERIOD 100 +uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse +uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse + +/* Bootloader timeout timer */ +uint16_t Timeout = 0; + +void StartSketch(void) { cli(); + + /* Undo TIMER1 setup and clear the count before running the sketch */ + TIMSK1 = 0; + TCCR1B = 0; + TCNT1H = 0; // 16-bit write to TCNT1 requires high byte be written first + TCNT1L = 0; + /* Relocate the interrupt vector table to the application section */ MCUCR = (1 << IVCE); MCUCR = 0; - -// UDCON = 1; // Detach USB -// UDIEN = 0; + + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); /* jump to beginning of application space */ __asm__ volatile("jmp 0x0000"); } +/* Breathing animation on L LED indicates bootloader is running */ +uint16_t LLEDPulse; +void LEDPulse(void) +{ + LLEDPulse++; + uint8_t p = LLEDPulse >> 8; + if (p > 127) + p = 254-p; + p += p; + if (((uint8_t)LLEDPulse) > p) + L_LED_OFF(); + else + L_LED_ON(); +} + /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start * the loaded application code. */ int main(void) { + /* Watchdog may be configured with a 15 ms period so must disable it before doing anything else */ wdt_disable(); /* Setup hardware required for the bootloader */ @@ -88,10 +120,11 @@ int main(void) { CDC_Task(); USB_USBTask(); - /* time out and start the sketch if one is present - * TODO - handle ctr now that TIMER1 is gone */ -// if (ctr++ > 10000 && pgm_read_word(0) != 0xFFFF) -// RunBootloader = false; + /* Time out and start the sketch if one is present */ + if (Timeout > 8000 && pgm_read_word(0) != 0xFFFF) + RunBootloader = false; + + LEDPulse(); } /* Disconnect from the host - USB interface will be reset later along with the AVR */ @@ -114,11 +147,39 @@ void SetupHardware(void) /* Relocate the interrupt vector table to the bootloader section */ MCUCR = (1 << IVCE); MCUCR = (1 << IVSEL); + + LED_SETUP(); + CPU_PRESCALE(0); + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + /* Initialize TIMER1 to handle bootloader timeout and LED tasks. Compare match happens at approx. 1 ms interval */ + OCR1AH = 0; + OCR1AL = 250; + TIMSK1 = (1 << OCIE1A); + TCCR1B = ((1 << CS11) | (1 << CS10)); /* Initialize USB Subsystem */ USB_Init(); } +//uint16_t ctr = 0; +ISR(TIMER1_COMPA_vect, ISR_BLOCK) +{ + /* Reset counter */ + TCNT1H = 0; + TCNT1L = 0; + + /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ + if (TxLEDPulse && !(--TxLEDPulse)) + TX_LED_OFF(); + if (RxLEDPulse && !(--RxLEDPulse)) + RX_LED_OFF(); + + Timeout++; +} + /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready * to relay data to and from the attached USB host. */ @@ -345,6 +406,9 @@ static void WriteNextResponseByte(const uint8_t Response) /* Write the next byte to the IN endpoint */ Endpoint_Write_8(Response); + + TX_LED_ON(); + TxLEDPulse = TX_RX_LED_PULSE_PERIOD; } #define STK_OK 0x10 @@ -372,19 +436,13 @@ void CDC_Task(void) /* Check if endpoint has a command in it sent from the host */ if (!(Endpoint_IsOUTReceived())) return; + + RX_LED_ON(); + RxLEDPulse = TX_RX_LED_PULSE_PERIOD; /* Read in the bootloader command (first byte sent from host) */ uint8_t Command = FetchNextCommandByte(); - /* - if (STK_UNIVERSAL == Command) { - WriteNextResponseByte(')'); - } else { - WriteNextResponseByte(Command); - } - */ - - if (Command == 'E') { RunBootloader = false; diff --git a/bootloaders/caterina_LUFA/Caterina.h b/bootloaders/caterina_LUFA/Caterina.h index 4260166..7f37063 100755 --- a/bootloaders/caterina_LUFA/Caterina.h +++ b/bootloaders/caterina_LUFA/Caterina.h @@ -62,13 +62,26 @@ #define BOOTLOADER_HWVERSION_MINOR 0x00 /** Eight character bootloader firmware identifier reported to the host when requested */ - #define SOFTWARE_IDENTIFIER "LUFACDC" + #define SOFTWARE_IDENTIFIER "CATERINA" + + #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) + #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); + #define L_LED_OFF() PORTC &= ~(1<<7) + #define L_LED_ON() PORTC |= (1<<7) + #define L_LED_TOGGLE() PORTC ^= (1<<7) + #define TX_LED_OFF() PORTD |= (1<<5) + #define TX_LED_ON() PORTD &= ~(1<<5) + #define RX_LED_OFF() PORTB |= (1<<0) + #define RX_LED_ON() PORTB &= ~(1<<0) /* Type Defines: */ /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; /* Function Prototypes: */ + void StartSketch(void); + void LEDPulse(); + void CDC_Task(void); void SetupHardware(void); diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index c3c1d93..5987d79 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,228 +1,246 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC000001FC400005AC0000025 +:1070200060C000005EC00000B0C400005AC0000094 :1070300058C0000056C0000054C0000052C00000FC -:1070400050C000004EC000004CC000004AC000000C +:1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C :1070600040C000003EC000003CC000003AC000002C :1070700038C0000036C0000034C0000032C000003C :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0ECE859 -:1070C000FDE702C005900D92AC38B107D9F711E089 -:1070D000ACE8B1E001C01D92AA39B107E1F7FCD2DA -:1070E00053C68ECFF89481E085BF15BE0C94000086 -:1070F000089584E08093E9000DC08091E8008B77CB -:107100008093E80003C08EB3882351F08091E8009B -:1071100082FFF9CF8091E80085FFEFCF8091F100E9 -:107120000895982F83E08093E9008091E80085FD21 -:107130000DC08091E8008E778093E80003C08EB385 -:10714000882331F08091E80080FFF9CF9093F1001F -:1071500008954F925F926F927F928F929F92AF921B -:10716000BF92CF92DF92EF92FF920F931F93CF9334 -:10717000DF9384E08093E9008091E80082FF45C2BC -:10718000B8DF182F853419F41092080103C0843534 -:1071900019F4AFDF8DE00FC28C34E1F38035D1F309 -:1071A000843721F484E4BDDF80E005C2813611F428 -:1071B00089E501C28134B1F49CDF182F9ADF90E099 -:1071C000880F991FAA2797FDA095BA2F312F330F4B -:1071D00020E0442737FD4095542F822B932BA42B7E -:1071E000B52BBAC1803711F483E5E5C1833549F485 -:1071F000C0E0D1E0899195DF21E0C730D207D1F717 -:10720000DBC1863521F481E38CDF80E3D4C1833791 -:1072100031F487E886DF85E984DF8EE1CCC18536ED -:10722000B9F4E0E0F0E093E085E090935700E89552 -:1072300007B600FCFDCF80935700E89507B600FC29 -:10724000FDCFE058FF4FA0E7E030FA0771F7A2CF7B -:107250008C3651F44EDF809599E0E1E0F0E0082EA5 -:1072600090935700E89596CF823739F4E1E0F0E04B -:1072700089E08093570084919EC1863439F4E0E020 -:10728000F0E089E080935700849195C18E3439F401 -:10729000E3E0F0E089E08093570084918CC1813570 -:1072A00039F4E2E0F0E089E080935700849183C1F3 -:1072B000823631F489E535DF80E033DF80E87BC159 -:1072C000823419F0873609F0DBC013DF082F11DF95 -:1072D000F82E0FDF682E8554823008F06BC1902F96 -:1072E00080E0CF2DD0E0C82BD92B173609F04BC04A -:1072F00081E180935700E895DD24CC24C3943FC0FE -:10730000E0908C01F0908D0100918E0110918F0121 -:10731000B6E46B16D9F4ED2DF0E0EE29FF29E491E7 -:107320008E2FFFDEDD2081F082E090E0A0E0B0E073 -:10733000E80EF91E0A1F1B1FE0928C01F0928D01CE -:1073400000938E0110938F01DC2418C0D801C7016F -:10735000B695A7959795879501D5E3DE82E090E0F5 -:10736000A0E0B0E0E80EF91E0A1F1B1FE0928C019E -:10737000F0928D0100938E0110938F012197209739 -:1073800009F0BECF19C180908C0190908D01A09022 -:107390008E01B0908F0196E4691609F05DC083E01C -:1073A000F40180935700E89507B600FCFDCF54C068 -:1073B000F6E46F1661F5772031F1E0908C01F090E2 -:1073C0008D0100918E0110918F0193DED82ECC2477 -:1073D000852D90E08C299D29F7010C0140925700E2 -:1073E000E895112482E090E0A0E0B0E0E80EF91EFC -:1073F0000A1F1B1FE0928C01F0928D0100938E01F9 -:1074000010938F0102C075DE582E742423C0E090C3 -:107410008C01F0908D0100918E0110918F011695D5 -:107420000795F794E79465DE682FC7019FD4809194 -:107430008C0190918D01A0918E01B0918F010296E7 -:10744000A11DB11D80938C0190938D01A0938E019D -:10745000B0938F01219704C055247724442443948A -:10746000209709F0A5CF96E4691609F093CE85E040 -:10747000F40180935700E89507B600FCFDCF8ACE53 -:10748000833471F400918C0110918D0132DE90E013 -:1074900021E0F8010C0120935700E89511247ACEE1 -:1074A000833619F5E0908C01F0908D0100918E01EA -:1074B00010918F011EDEF701E16090E021E00C01E8 -:1074C00020935700E895112482E090E0A0E0B0E01E -:1074D000E80EF91E0A1F1B1FE0928C01F0928D012D -:1074E00000938E0110938F0155CE8D3661F4E0919B -:1074F0008C01F0918D0185E080935700E89507B6E7 -:1075000000FCFDCF47CE823551F4E0918C01F09123 -:107510008D0105911491812F04DE802F4CC084349D -:1075200021F5E0908C01F0908D0100918E01109179 -:107530008F0116950795F794E794DBDD682FC70157 -:1075400015D480918C0190918D01A0918E01B09104 -:107550008F010296A11DB11D80938C0190938D0126 -:10756000A0938E01B0938F0115CE843609F5E0907B -:107570008C01F0908D0100918E0110918F01D80146 -:10758000C701B695A79597958795E8D3CADD82E0A0 -:1075900090E0A0E0B0E0E80EF91E0A1F1B1FE09289 -:1075A0008C01F0928D0100938E0110938F0104C025 -:1075B0008B3111F08FE3B5DD83E08093E90090918A -:1075C000E8008091E8008E778093E80095FF04C082 -:1075D00010C08EB38823C9F08091E80080FFF9CFF6 -:1075E0008091E8008E778093E80003C08EB38823F3 -:1075F00061F08091E80080FFF9CF84E08093E9009A -:107600008091E8008B778093E800DF91CF911F9104 -:107610000F91FF90EF90DF90CF90BF90AF909F9031 -:107620008F907F906F905F904F900895909192010E -:10763000892F8F77813249F5809193018032A1F0B3 -:10764000813219F5913A09F58091E800877F80939E -:10765000E80089E091E067E070E0B7D18091E80050 -:107660008B778093E8000895913279F48091E80057 -:10767000877F8093E80089E091E067E070E009D2BD -:107680008091E8008E778093E800089582E061ECB5 -:1076900042E061D083E061E842E15DD084E060E8EF -:1076A00042E159C084B7877F84BF88E10FB6F89460 -:1076B00080936000109260000FBE80E090E020E8B0 -:1076C0000FB6F89420936100809361000FBE81E0B3 -:1076D00085BF82E085BFB0C088E10FB6F894809383 -:1076E0006000109260000FBEDDDF789402C031DDD3 -:1076F00023D3809108018823D1F78091E000816035 -:107700008093E000EFDC80E090E00895FA01923091 -:1077100071F0933089F0913029F480E191E022E119 -:1077200030E015C080E090E020E030E010C082E260 -:1077300091E02EE330E00BC0882329F480E691E04D -:1077400024E030E004C084E691E026E230E091835A -:107750008083C90108958093E9008091EB008160E6 -:107760008093EB001092ED006093EC004093ED00ED -:107770008091EE00881F8827881F089580919201CC -:1077800088238CF403C08EB38823B1F08091E80085 -:1077900082FFF9CF8091E8008B778093E80008950D -:1077A0008EB3882349F08091E80080FFF9CF809163 -:1077B000E8008E778093E8000895EF92FF920F9390 -:1077C0001F9345D04CD008ED10E0F80180818F77F1 -:1077D000808380818068808380818F7D808319BCD5 -:1077E0001EBA1092900180EEE82EF12CF7018081F4 -:1077F0008B7F8083F80180818160808380E060E0FE -:1078000042E0A9DFE1EEF0E080818E7F8083E2EE4E -:10781000F0E0808181608083808188608083F701CF -:1078200080818E7F8083F8018081806180831F91B9 -:107830000F91FF90EF900895E7EDF0E08081816077 -:1078400080838AE482BF81E080939101B6CFE8ED26 -:10785000F0E080818E7F80831092E2000895109284 -:10786000DA001092E10008951F920F920FB60F9266 -:1078700011242F933F934F935F936F937F938F9335 -:107880009F93AF93BF93EF93FF938091DA0080FFB4 -:107890001BC08091D80080FF17C08091DA008E7FD6 -:1078A0008093DA008091D90080FF0BC080E189BD10 -:1078B00082E189BD09B400FEFDCF81E08EBB3BD2E1 -:1078C00003C019BC1EBA37D28091E10080FF17C0F7 -:1078D0008091E20080FF13C08091E2008E7F809350 -:1078E000E2008091E20080618093E2008091D80004 -:1078F00080628093D80019BC85E08EBB1CD2809139 -:10790000E10084FF2CC08091E20084FF28C080E168 -:1079100089BD82E189BD09B400FEFDCF8091D80008 -:107920008F7D8093D8008091E1008F7E8093E1006D -:107930008091E2008F7E8093E2008091E20081607E -:107940008093E20080919001882331F48091E300DC -:1079500087FD02C081E001C084E08EBBECD1809144 -:10796000E10083FF21C08091E20083FF1DC0809170 -:10797000E100877F8093E10082E08EBB109290014E -:107980008091E1008E7F8093E1008091E2008E7F04 -:107990008093E2008091E20080618093E20080E0C9 -:1079A00060E042E0D8DEC7D1FF91EF91BF91AF9187 -:1079B0009F918F917F916F915F914F913F912F9107 -:1079C0000F900FBE0F901F9018959C014091980149 -:1079D000509199014617570718F4F90190E044C0F7 -:1079E0006115710511F0AB01F8CF8091E8008E7739 -:1079F0008093E80040E050E0F0CF8EB3882309F494 -:107A000044C0853009F443C08091E80083FF02C080 -:107A100081E008958091E80082FD31C08091E80006 -:107A200080FF22C08091F3009091F200782F60E0F7 -:107A3000292F30E0262B372B07C081918093F1004E -:107A4000415050402F5F3F4F4115510519F02830EC -:107A5000310598F390E02830310509F491E08091E8 -:107A6000E8008E778093E8004115510531F699239F -:107A700021F605C08EB3882341F0853041F0809116 -:107A8000E80082FFF7CF80E0089582E0089583E068 -:107A900008959C016115710529F48091E8008B77A8 -:107AA0008093E800F90126C08EB3882391F18530D8 -:107AB00091F18091E80083FF02C081E008958091F8 -:107AC000E80082FFF1CF06C08091F1008193615000 -:107AD000704059F02091F3008091F200322F20E0A5 -:107AE00090E0822B932B892B79F78091E8008B779C -:107AF0008093E80061157105B9F605C08EB388233F -:107B000041F0853041F08091E80080FFF7CF80E0C0 -:107B1000089582E0089583E008950F931F93DF9303 -:107B2000CF9300D0CDB7DEB7E2E9F1E08091F1006C -:107B3000819381E0EA39F807C9F778DD8091E800A0 -:107B400083FFE4C08091920190919301953009F4F4 -:107B50006DC0963040F4913081F1913070F09330E7 -:107B600009F0D4C02AC0983009F4A3C0993009F4B0 -:107B7000B2C0963009F0CAC07CC0803809F4C6C0D3 -:107B8000823809F0C3C08091960187708093E90024 -:107B90008091EB001092E9002091E800277F20936C -:107BA000E80090E025E0969587952A95E1F78170A9 -:107BB0008093F1001092F10087C0882319F0823081 -:107BC00009F0A4C08F71823009F0A0C080919401A7 -:107BD000882331F520919601277009F497C02093EE -:107BE000E9008091EB0080FF1BC0933021F480916D -:107BF000EB00806213C08091EB0080618093EB000A -:107C000081E090E002C0880F991F2A95E2F78093E7 -:107C1000EA001092EA008091EB0088608093EB000C -:107C20001092E9008091E800877F51C0882309F015 -:107C30006DC0109194011F770FB7F8948091E80000 -:107C4000877F8093E8009ADD8091E80080FFFCCF79 -:107C50008091E3008078812B8093E300806880939B -:107C6000E300112311F482E001C083E08EBB0FBF5B -:107C70004DC08058823008F049C0809194019091A5 -:107C8000950160919601AE014F5F5F4F3FDDBC01F2 -:107C9000009709F43BC08091E800877F8093E8005B -:107CA00089819A8192DE8091E8008B778093E80049 -:107CB0002DC0803859F58091E800877F8093E800D7 -:107CC000809190018093F1008091E8008E778093FD -:107CD000E80054DD1BC08823C9F4909194019230D0 -:107CE000A8F48091E800877F8093E800909390014A -:107CF00045DD80919001882331F48091E30087FD78 -:107D000002C081E001C084E08EBBC0DC8091E8004D -:107D100083FF0AC08091EB0080628093EB0080912A -:107D2000E800877F8093E8000F900F90CF91DF915C -:107D30001F910F91089508951F938EB3882361F0CA -:107D40001091E9001092E9008091E80083FF01C0E2 -:107D5000E4DE17701093E9001F910895F999FECFA2 -:107D600092BD81BDF89A992780B50895262FF9997B -:107D7000FECF1FBA92BD81BD20BD0FB6F894FA9A0E -:0C7D8000F99A0FBE01960895F894FFCF09 -:107D8C004C554641434443000100000000000008EC -:107D9C001201100102000008EB034A20010000014F -:107DAC00000109023E0002010080320904000001BA -:107DBC00020201000524001001042402040524061B -:107DCC000001070582030800FF09040100020A00F4 -:107DDC0000000705040210000107058302100001D2 -:107DEC0004030904260341005600520020004300FE -:107DFC0044004300200042006F006F0074006C00D0 -:0C7E0C006F00610064006500720000005F +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEEA55 +:1070C000FEE702C005900D92AE38B107D9F711E086 +:1070D000AEE8B1E001C01D92A43AB107E1F777D361 +:1070E000E4C68ECFF89410926F0010928100109237 +:1070F00085001092840081E085BF15BE47985D9A97 +:10710000289A0C94000008952091980130919901DB +:107110002F5F3F4F3093990120939801932F37FFB2 +:1071200003C08EEF831B982F990F921710F4479886 +:107130000895479A08951F920F920FB60F92112447 +:107140008F939F93109285001092840080918E01FE +:1071500090918F01009741F0019790938F01809358 +:107160008E01892B09F45D9A809190019091910193 +:10717000009741F001979093910180939001892BA2 +:1071800009F4289A8091920190919301019690932D +:107190009301809392019F918F910F900FBE0F905A +:1071A0001F90189584E08093E9000DC08091E8005D +:1071B0008B778093E80003C08EB3882351F08091D1 +:1071C000E80082FFF9CF8091E80085FFEFCF809142 +:1071D000F1000895982F83E08093E9008091E80002 +:1071E00085FD0DC08091E8008E778093E80003C094 +:1071F0008EB3882369F08091E80080FFF9CF9093E7 +:10720000F1005D9884E690E090938F0180938E0169 +:1072100008954F925F926F927F928F929F92AF925A +:10722000BF92CF92DF92EF92FF920F931F93CF9373 +:10723000DF9384E08093E9008091E80082FF4CC2F4 +:10724000289884E690E09093910180939001AADFC2 +:10725000182F853419F41092090103C0843519F4EC +:10726000A1DF8DE00FC28C34E1F38035D1F3843798 +:1072700021F484E4AFDF80E005C2813611F489E5B2 +:1072800001C28134B1F48EDF182F8CDF90E0880FBB +:10729000991FAA2797FDA095BA2F312F330F20E011 +:1072A000442737FD4095542F822B932BA42BB52BCD +:1072B000BAC1803711F483E5E5C1833549F4C0E0F4 +:1072C000D1E0899187DF21E0C730D207D1F7DBC158 +:1072D000863521F481E37EDF80E3D4C1833731F446 +:1072E00087E878DF85E976DF8EE1CCC18536B9F4B1 +:1072F000E0E0F0E093E085E090935700E89507B672 +:1073000000FCFDCF80935700E89507B600FCFDCF49 +:10731000E058FF4FA0E7E030FA0771F7A2CF8C36B4 +:1073200051F440DF809599E0E1E0F0E0082E909381 +:107330005700E89596CF823739F4E1E0F0E089E034 +:107340008093570084919EC1863439F4E0E0F0E0E8 +:1073500089E080935700849195C18E3439F4E3E03D +:10736000F0E089E08093570084918CC1813539F435 +:10737000E2E0F0E089E080935700849183C1823697 +:1073800031F489E527DF80E025DF80E87BC18234A6 +:1073900019F0873609F0DBC005DF082F03DFF82E70 +:1073A00001DF682E8554823008F06BC1902F80E099 +:1073B000CF2DD0E0C82BD92B173609F04BC081E177 +:1073C00080935700E895DD24CC24C3943FC0E0901F +:1073D0009401F09095010091960110919701B6E407 +:1073E0006B16D9F4ED2DF0E0EE29FF29E4918E2FF4 +:1073F000F1DEDD2081F082E090E0A0E0B0E0E80E78 +:10740000F91E0A1F1B1FE0929401F0929501009350 +:10741000960110939701DC2418C0D801C701B695D6 +:10742000A795979587952BD5D5DE82E090E0A0E0D3 +:10743000B0E0E80EF91E0A1F1B1FE0929401F092C3 +:10744000950100939601109397012197209709F0D9 +:10745000BECF19C18090940190909501A0909601A3 +:10746000B090970196E4691609F05DC083E0F401DD +:1074700080935700E89507B600FCFDCF54C0F6E4B2 +:107480006F1661F5772031F1E0909401F09095014D +:10749000009196011091970185DED82ECC24852D80 +:1074A00090E08C299D29F7010C0140925700E89546 +:1074B000112482E090E0A0E0B0E0E80EF91E0A1F7F +:1074C0001B1FE0929401F092950100939601109396 +:1074D000970102C067DE582E742423C0E090940107 +:1074E000F0909501009196011091970116950795DE +:1074F000F794E79457DE682FC701C9D480919401AF +:1075000090919501A0919601B09197010296A11DCD +:10751000B11D8093940190939501A0939601B0932F +:107520009701219704C0552477244424439420973D +:1075300009F0A5CF96E4691609F093CE85E0F40131 +:1075400080935700E89507B600FCFDCF8ACE8334C0 +:1075500071F4009194011091950124DE90E021E0F6 +:10756000F8010C0120935700E89511247ACE833658 +:1075700019F5E0909401F090950100919601109119 +:10758000970110DEF701E16090E021E00C0120930B +:107590005700E895112482E090E0A0E0B0E0E80E0A +:1075A000F91E0A1F1B1FE0929401F09295010093AF +:1075B00096011093970155CE8D3661F4E0919401B8 +:1075C000F091950185E080935700E89507B600FC9F +:1075D000FDCF47CE823551F4E0919401F0919501B1 +:1075E00005911491812FF6DD802F4CC0843421F554 +:1075F000E0909401F090950100919601109197010F +:1076000016950795F794E794CDDD682FC7013FD411 +:107610008091940190919501A0919601B09197016C +:107620000296A11DB11D8093940190939501A093A2 +:107630009601B093970115CE843609F5E090940138 +:10764000F09095010091960110919701D801C70122 +:10765000B695A7959795879512D4BCDD82E090E00A +:10766000A0E0B0E0E80EF91E0A1F1B1FE092940193 +:10767000F0929501009396011093970104C08B310D +:1076800011F08FE3A7DD83E08093E9009091E8009B +:107690008091E8008E778093E80095FF04C010C0C9 +:1076A0008EB38823C9F08091E80080FFF9CF8091E4 +:1076B000E8008E778093E80003C08EB3882361F0E2 +:1076C0008091E80080FFF9CF84E08093E900809109 +:1076D000E8008B778093E800DF91CF911F910F91A5 +:1076E000FF90EF90DF90CF90BF90AF909F908F90E2 +:1076F0007F906F905F904F90089590919C01892F9B +:107700008F77813249F580919D018032A1F08132DD +:1077100019F5913A09F58091E800877F8093E80098 +:107720008AE091E067E070E0E1D18091E8008B773A +:107730008093E8000895913279F48091E800877F82 +:107740008093E8008AE091E067E070E033D28091B6 +:10775000E8008E778093E800089582E061EC42E0D3 +:107760008BD083E061E842E187D084E060E842E1C9 +:1077700083C084B7877F84BF88E10FB6F894809375 +:107780006000109260000FBE20E880E090E00FB62D +:10779000F89420936100809361000FBE81E085BF63 +:1077A00092E095BF3F9A209A559AE1E6F0E0208357 +:1077B000108247985D9A289A109289008AEF8093E8 +:1077C000880090936F0083E080938100C6C0CF93C0 +:1077D000DF9388E10FB6F894809360001092600008 +:1077E0000FBEC7DF7894E0E0F0E0C591D49110C0FF +:1077F00010DD33D3809192019091930181549F4188 +:1078000030F08FEFCF3FD80711F0109209017CDCE8 +:1078100080910901882361F78091E0008160809365 +:10782000E00060DC80E090E0DF91CF910895FA0104 +:10783000923071F0933089F0913029F481E191E038 +:1078400022E130E015C080E090E020E030E010C0A0 +:1078500083E291E02EE330E00BC0882329F481E637 +:1078600091E024E030E004C085E691E026E230E0DB +:1078700091838083C90108958093E9008091EB0092 +:1078800081608093EB001092ED006093EC004093D8 +:10789000ED008091EE00881F8827881F0895809151 +:1078A0009C0188238CF403C08EB38823B1F08091AF +:1078B000E80082FFF9CF8091E8008B778093E800A1 +:1078C00008958EB3882349F08091E80080FFF9CFB6 +:1078D0008091E8008E778093E8000895EF92FF9200 +:1078E0000F931F9345D04CD008ED10E0F801808134 +:1078F0008F77808380818068808380818F7D808383 +:1079000019BC1EBA10929A0180EEE82EF12CF701F4 +:1079100080818B7F8083F80180818160808380E01B +:1079200060E042E0A9DFE1EEF0E080818E7F8083BD +:10793000E2EEF0E0808181608083808188608083D6 +:10794000F70180818E7F8083F80180818061808350 +:107950001F910F91FF90EF900895E7EDF0E0808187 +:10796000816080838AE482BF81E080939B01B6CFEF +:10797000E8EDF0E080818E7F80831092E200089530 +:107980001092DA001092E10008951F920F920FB644 +:107990000F9211242F933F934F935F936F937F9395 +:1079A0008F939F93AF93BF93EF93FF938091DA00F0 +:1079B00080FF1BC08091D80080FF17C08091DA0043 +:1079C0008E7F8093DA008091D90080FF0BC080E128 +:1079D00089BD82E189BD09B400FEFDCF81E08EBB87 +:1079E0003BD203C019BC1EBA37D28091E10080FFA0 +:1079F00017C08091E20080FF13C08091E2008E7F6B +:107A00008093E2008091E20080618093E2008091A7 +:107A1000D80080628093D80019BC85E08EBB1CD250 +:107A20008091E10084FF2CC08091E20084FF28C097 +:107A300080E189BD82E189BD09B400FEFDCF80915E +:107A4000D8008F7D8093D8008091E1008F7E809355 +:107A5000E1008091E2008F7E8093E2008091E2005D +:107A600081608093E20080919A01882331F48091B3 +:107A7000E30087FD02C081E001C084E08EBBECD151 +:107A80008091E10083FF21C08091E20083FF1DC04F +:107A90008091E100877F8093E10082E08EBB1092AD +:107AA0009A018091E1008E7F8093E1008091E20055 +:107AB0008E7F8093E2008091E20080618093E200FB +:107AC00080E060E042E0D8DEC7D1FF91EF91BF9146 +:107AD000AF919F918F917F916F915F914F913F9166 +:107AE0002F910F900FBE0F901F9018959C01409101 +:107AF000A2015091A3014617570718F4F90190E02D +:107B000044C06115710511F0AB01F8CF8091E80018 +:107B10008E778093E80040E050E0F0CF8EB388236A +:107B200009F444C0853009F443C08091E80083FF24 +:107B300002C081E008958091E80082FD31C080910B +:107B4000E80080FF22C08091F3009091F200782F2E +:107B500060E0292F30E0262B372B07C081918093DE +:107B6000F100415050402F5F3F4F4115510519F032 +:107B70002830310598F390E02830310509F491E080 +:107B80008091E8008E778093E8004115510531F629 +:107B9000992321F605C08EB3882341F0853041F04A +:107BA0008091E80082FFF7CF80E0089582E0089599 +:107BB00083E008959C016115710529F48091E80026 +:107BC0008B778093E800F90126C08EB3882391F16A +:107BD000853091F18091E80083FF02C081E0089533 +:107BE0008091E80082FFF1CF06C08091F10081937F +:107BF0006150704059F02091F3008091F200322FD3 +:107C000020E090E0822B932B892B79F78091E8007C +:107C10008B778093E80061157105B9F605C08EB3C6 +:107C2000882341F0853041F08091E80080FFF7CF54 +:107C300080E0089582E0089583E008950F931F93F4 +:107C4000DF93CF9300D0CDB7DEB7ECE9F1E08091C0 +:107C5000F100819381E0E43AF807C9F74EDD8091A5 +:107C6000E80083FFE4C080919C0190919D019530D4 +:107C700009F46DC0963040F4913081F1913070F08C +:107C8000933009F0D4C02AC0983009F4A3C09930C9 +:107C900009F4B2C0963009F0CAC07CC0803809F43B +:107CA000C6C0823809F0C3C08091A001877080935C +:107CB000E9008091EB001092E9002091E800277F15 +:107CC0002093E80090E025E0969587952A95E1F7C6 +:107CD00081708093F1001092F10087C0882319F021 +:107CE000823009F0A4C08F71823009F0A0C0809169 +:107CF0009E01882331F52091A001277009F497C0D7 +:107D00002093E9008091EB0080FF1BC0933021F4A9 +:107D10008091EB00806213C08091EB0080618093C2 +:107D2000EB0081E090E002C0880F991F2A95E2F7EE +:107D30008093EA001092EA008091EB0088608093C3 +:107D4000EB001092E9008091E800877F51C0882302 +:107D500009F06DC010919E011F770FB7F8948091C4 +:107D6000E800877F8093E8009ADD8091E80080FF3B +:107D7000FCCF8091E3008078812B8093E3008068C2 +:107D80008093E300112311F482E001C083E08EBBF5 +:107D90000FBF4DC08058823008F049C080919E01CD +:107DA00090919F016091A001AE014F5F5F4F3FDD59 +:107DB000BC01009709F43BC08091E800877F809365 +:107DC000E80089819A8192DE8091E8008B77809328 +:107DD000E8002DC0803859F58091E800877F8093B6 +:107DE000E80080919A018093F1008091E8008E77FD +:107DF0008093E80054DD1BC08823C9F490919E0154 +:107E00009230A8F48091E800877F8093E8009093F7 +:107E10009A0145DD80919A01882331F48091E30035 +:107E200087FD02C081E001C084E08EBB96DC8091BA +:107E3000E80083FF0AC08091EB0080628093EB0032 +:107E40008091E800877F8093E8000F900F90CF919A +:107E5000DF911F910F91089508951F938EB388238A +:107E600061F01091E9001092E9008091E80083FF31 +:107E700001C0E4DE17701093E9001F910895F9998D +:107E8000FECF92BD81BDF89A992780B50895262F1F +:107E9000F999FECF1FBA92BD81BD20BD0FB6F894EF +:0E7EA000FA9AF99A0FBE01960895F894FFCF52 +:107EAE004341544552494E4100010000000000007C +:107EBE00081201100102000008EB034A2001000025 +:107ECE0001000109023E0002010080320904000097 +:107EDE0001020201000524001001042402040524FD +:107EEE00060001070582030800FF09040100020ACB +:107EFE0000000007050402100001070583021000B0 +:107F0E0001040309042603410056005200200043D9 +:107F1E000044004300200042006F006F0074006CAC +:0E7F2E00006F0061006400650072000000003A :040000030000700089 :00000001FF diff --git a/bootloaders/caterina_LUFA/makefile b/bootloaders/caterina_LUFA/makefile index a647af0..5439b5b 100755 --- a/bootloaders/caterina_LUFA/makefile +++ b/bootloaders/caterina_LUFA/makefile @@ -424,7 +424,7 @@ OBJDUMP = avr-objdump SIZE = avr-size AR = avr-ar rcs NM = avr-nm -AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf +AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 REMOVE = rm -f REMOVEDIR = rm -rf COPY = cp -- cgit v1.2.3-18-g5258 From e720ffb81d6efcc23491ad044b5c0e037fcf4be4 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 6 Feb 2012 15:23:41 -0500 Subject: increased Leonardo bootloader timeout to 16 seconds --- bootloaders/caterina_LUFA/Caterina.c | 2 +- bootloaders/caterina_LUFA/Caterina.hex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index 82d468f..326bce7 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -121,7 +121,7 @@ int main(void) CDC_Task(); USB_USBTask(); /* Time out and start the sketch if one is present */ - if (Timeout > 8000 && pgm_read_word(0) != 0xFFFF) + if (Timeout > 16000 && pgm_read_word(0) != 0xFFFF) RunBootloader = false; LEDPulse(); diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index 5987d79..a06aa85 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -125,7 +125,7 @@ :1077C000880090936F0083E080938100C6C0CF93C0 :1077D000DF9388E10FB6F894809360001092600008 :1077E0000FBEC7DF7894E0E0F0E0C591D49110C0FF -:1077F00010DD33D3809192019091930181549F4188 +:1077F00010DD33D3809192019091930181589E4383 :1078000030F08FEFCF3FD80711F0109209017CDCE8 :1078100080910901882361F78091E0008160809365 :10782000E00060DC80E090E0DF91CF910895FA0104 -- cgit v1.2.3-18-g5258 From 12e2af9cd76abfe7c35d6e4c38cfb62016e1a23e Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 7 Feb 2012 23:46:31 -0500 Subject: fixed bug in Caterina which caused some programming instructions to fail Timer 1 interrupts were trashing self-programming timing. Now disable Timer 1 compare match before doing Flash tasks and reenable afterward. --- bootloaders/caterina_LUFA/Caterina.c | 28 +- bootloaders/caterina_LUFA/Caterina.hex | 458 +++++++++++++++++---------------- 2 files changed, 251 insertions(+), 235 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index 326bce7..11404a7 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -121,7 +121,7 @@ int main(void) CDC_Task(); USB_USBTask(); /* Time out and start the sketch if one is present */ - if (Timeout > 16000 && pgm_read_word(0) != 0xFFFF) + if (Timeout > 16000) RunBootloader = false; LEDPulse(); @@ -154,11 +154,16 @@ void SetupHardware(void) TX_LED_OFF(); RX_LED_OFF(); - /* Initialize TIMER1 to handle bootloader timeout and LED tasks. Compare match happens at approx. 1 ms interval */ + /* Initialize TIMER1 to handle bootloader timeout and LED tasks. + * With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz + * Our chosen compare match generates an interrupt every 1 ms. + * This interrupt is disabled selectively when doing memory reading, erasing, + * or writing since SPM has tight timing requirements. + */ OCR1AH = 0; OCR1AL = 250; - TIMSK1 = (1 << OCIE1A); - TCCR1B = ((1 << CS11) | (1 << CS10)); + TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt + TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input /* Initialize USB Subsystem */ USB_Init(); @@ -176,8 +181,9 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) TX_LED_OFF(); if (RxLEDPulse && !(--RxLEDPulse)) RX_LED_OFF(); - - Timeout++; + + if (pgm_read_word(0) != 0xFFFF) + Timeout++; } /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready @@ -267,9 +273,13 @@ static void ReadWriteMemoryBlock(const uint8_t Command) return; } + /* Disable timer 1 interrupt - can't afford to process nonessential interrupts + * while doing SPM tasks */ + TIMSK1 = 0; + /* Check if command is to read memory */ if (Command == 'g') - { + { /* Re-enable RWW section */ boot_rww_enable(); @@ -353,6 +363,9 @@ static void ReadWriteMemoryBlock(const uint8_t Command) /* Send response byte back to the host */ WriteNextResponseByte('\r'); } + + /* Re-enable timer 1 interrupt disabled earlier in this routine */ + TIMSK1 = (1 << OCIE1A); } #endif @@ -555,6 +568,7 @@ void CDC_Task(void) } else if ((Command == 'B') || (Command == 'g')) { + Timeout = 0; // Delegate the block write/read to a separate function for clarity ReadWriteMemoryBlock(Command); } diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index a06aa85..5da8582 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000B0C400005AC0000094 +:1070200060C000005EC00000BBC400005AC0000089 :1070300058C0000056C0000054C0000052C00000FC :1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C @@ -9,238 +9,240 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEEA55 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EC5D :1070C000FEE702C005900D92AE38B107D9F711E086 -:1070D000AEE8B1E001C01D92A43AB107E1F777D361 -:1070E000E4C68ECFF89410926F0010928100109237 +:1070D000AEE8B1E001C01D92A43AB107E1F78ED34A +:1070E000EFC68ECFF89410926F001092810010922C :1070F00085001092840081E085BF15BE47985D9A97 :10710000289A0C94000008952091980130919901DB :107110002F5F3F4F3093990120939801932F37FFB2 :1071200003C08EEF831B982F990F921710F4479886 :107130000895479A08951F920F920FB60F92112447 -:107140008F939F93109285001092840080918E01FE -:1071500090918F01009741F0019790938F01809358 -:107160008E01892B09F45D9A809190019091910193 -:10717000009741F001979093910180939001892BA2 -:1071800009F4289A8091920190919301019690932D -:107190009301809392019F918F910F900FBE0F905A -:1071A0001F90189584E08093E9000DC08091E8005D -:1071B0008B778093E80003C08EB3882351F08091D1 -:1071C000E80082FFF9CF8091E80085FFEFCF809142 -:1071D000F1000895982F83E08093E9008091E80002 -:1071E00085FD0DC08091E8008E778093E80003C094 -:1071F0008EB3882369F08091E80080FFF9CF9093E7 -:10720000F1005D9884E690E090938F0180938E0169 -:1072100008954F925F926F927F928F929F92AF925A -:10722000BF92CF92DF92EF92FF920F931F93CF9373 -:10723000DF9384E08093E9008091E80082FF4CC2F4 -:10724000289884E690E09093910180939001AADFC2 -:10725000182F853419F41092090103C0843519F4EC -:10726000A1DF8DE00FC28C34E1F38035D1F3843798 -:1072700021F484E4AFDF80E005C2813611F489E5B2 -:1072800001C28134B1F48EDF182F8CDF90E0880FBB -:10729000991FAA2797FDA095BA2F312F330F20E011 -:1072A000442737FD4095542F822B932BA42BB52BCD -:1072B000BAC1803711F483E5E5C1833549F4C0E0F4 -:1072C000D1E0899187DF21E0C730D207D1F7DBC158 -:1072D000863521F481E37EDF80E3D4C1833731F446 -:1072E00087E878DF85E976DF8EE1CCC18536B9F4B1 -:1072F000E0E0F0E093E085E090935700E89507B672 -:1073000000FCFDCF80935700E89507B600FCFDCF49 -:10731000E058FF4FA0E7E030FA0771F7A2CF8C36B4 -:1073200051F440DF809599E0E1E0F0E0082E909381 -:107330005700E89596CF823739F4E1E0F0E089E034 -:107340008093570084919EC1863439F4E0E0F0E0E8 -:1073500089E080935700849195C18E3439F4E3E03D -:10736000F0E089E08093570084918CC1813539F435 -:10737000E2E0F0E089E080935700849183C1823697 -:1073800031F489E527DF80E025DF80E87BC18234A6 -:1073900019F0873609F0DBC005DF082F03DFF82E70 -:1073A00001DF682E8554823008F06BC1902F80E099 -:1073B000CF2DD0E0C82BD92B173609F04BC081E177 -:1073C00080935700E895DD24CC24C3943FC0E0901F -:1073D0009401F09095010091960110919701B6E407 -:1073E0006B16D9F4ED2DF0E0EE29FF29E4918E2FF4 -:1073F000F1DEDD2081F082E090E0A0E0B0E0E80E78 -:10740000F91E0A1F1B1FE0929401F0929501009350 -:10741000960110939701DC2418C0D801C701B695D6 -:10742000A795979587952BD5D5DE82E090E0A0E0D3 -:10743000B0E0E80EF91E0A1F1B1FE0929401F092C3 -:10744000950100939601109397012197209709F0D9 -:10745000BECF19C18090940190909501A0909601A3 -:10746000B090970196E4691609F05DC083E0F401DD -:1074700080935700E89507B600FCFDCF54C0F6E4B2 -:107480006F1661F5772031F1E0909401F09095014D -:10749000009196011091970185DED82ECC24852D80 -:1074A00090E08C299D29F7010C0140925700E89546 -:1074B000112482E090E0A0E0B0E0E80EF91E0A1F7F -:1074C0001B1FE0929401F092950100939601109396 -:1074D000970102C067DE582E742423C0E090940107 -:1074E000F0909501009196011091970116950795DE -:1074F000F794E79457DE682FC701C9D480919401AF -:1075000090919501A0919601B09197010296A11DCD -:10751000B11D8093940190939501A0939601B0932F -:107520009701219704C0552477244424439420973D -:1075300009F0A5CF96E4691609F093CE85E0F40131 -:1075400080935700E89507B600FCFDCF8ACE8334C0 -:1075500071F4009194011091950124DE90E021E0F6 -:10756000F8010C0120935700E89511247ACE833658 -:1075700019F5E0909401F090950100919601109119 -:10758000970110DEF701E16090E021E00C0120930B -:107590005700E895112482E090E0A0E0B0E0E80E0A -:1075A000F91E0A1F1B1FE0929401F09295010093AF -:1075B00096011093970155CE8D3661F4E0919401B8 -:1075C000F091950185E080935700E89507B600FC9F -:1075D000FDCF47CE823551F4E0919401F0919501B1 -:1075E00005911491812FF6DD802F4CC0843421F554 -:1075F000E0909401F090950100919601109197010F -:1076000016950795F794E794CDDD682FC7013FD411 -:107610008091940190919501A0919601B09197016C -:107620000296A11DB11D8093940190939501A093A2 -:107630009601B093970115CE843609F5E090940138 -:10764000F09095010091960110919701D801C70122 -:10765000B695A7959795879512D4BCDD82E090E00A -:10766000A0E0B0E0E80EF91E0A1F1B1FE092940193 -:10767000F0929501009396011093970104C08B310D -:1076800011F08FE3A7DD83E08093E9009091E8009B -:107690008091E8008E778093E80095FF04C010C0C9 -:1076A0008EB38823C9F08091E80080FFF9CF8091E4 -:1076B000E8008E778093E80003C08EB3882361F0E2 -:1076C0008091E80080FFF9CF84E08093E900809109 -:1076D000E8008B778093E800DF91CF911F910F91A5 -:1076E000FF90EF90DF90CF90BF90AF909F908F90E2 -:1076F0007F906F905F904F90089590919C01892F9B -:107700008F77813249F580919D018032A1F08132DD -:1077100019F5913A09F58091E800877F8093E80098 -:107720008AE091E067E070E0E1D18091E8008B773A -:107730008093E8000895913279F48091E800877F82 -:107740008093E8008AE091E067E070E033D28091B6 -:10775000E8008E778093E800089582E061EC42E0D3 -:107760008BD083E061E842E187D084E060E842E1C9 -:1077700083C084B7877F84BF88E10FB6F894809375 -:107780006000109260000FBE20E880E090E00FB62D -:10779000F89420936100809361000FBE81E085BF63 -:1077A00092E095BF3F9A209A559AE1E6F0E0208357 -:1077B000108247985D9A289A109289008AEF8093E8 -:1077C000880090936F0083E080938100C6C0CF93C0 -:1077D000DF9388E10FB6F894809360001092600008 -:1077E0000FBEC7DF7894E0E0F0E0C591D49110C0FF -:1077F00010DD33D3809192019091930181589E4383 -:1078000030F08FEFCF3FD80711F0109209017CDCE8 -:1078100080910901882361F78091E0008160809365 -:10782000E00060DC80E090E0DF91CF910895FA0104 -:10783000923071F0933089F0913029F481E191E038 -:1078400022E130E015C080E090E020E030E010C0A0 -:1078500083E291E02EE330E00BC0882329F481E637 -:1078600091E024E030E004C085E691E026E230E0DB -:1078700091838083C90108958093E9008091EB0092 -:1078800081608093EB001092ED006093EC004093D8 -:10789000ED008091EE00881F8827881F0895809151 -:1078A0009C0188238CF403C08EB38823B1F08091AF -:1078B000E80082FFF9CF8091E8008B778093E800A1 -:1078C00008958EB3882349F08091E80080FFF9CFB6 -:1078D0008091E8008E778093E8000895EF92FF9200 -:1078E0000F931F9345D04CD008ED10E0F801808134 -:1078F0008F77808380818068808380818F7D808383 -:1079000019BC1EBA10929A0180EEE82EF12CF701F4 -:1079100080818B7F8083F80180818160808380E01B -:1079200060E042E0A9DFE1EEF0E080818E7F8083BD -:10793000E2EEF0E0808181608083808188608083D6 -:10794000F70180818E7F8083F80180818061808350 -:107950001F910F91FF90EF900895E7EDF0E0808187 -:10796000816080838AE482BF81E080939B01B6CFEF -:10797000E8EDF0E080818E7F80831092E200089530 -:107980001092DA001092E10008951F920F920FB644 -:107990000F9211242F933F934F935F936F937F9395 -:1079A0008F939F93AF93BF93EF93FF938091DA00F0 -:1079B00080FF1BC08091D80080FF17C08091DA0043 -:1079C0008E7F8093DA008091D90080FF0BC080E128 -:1079D00089BD82E189BD09B400FEFDCF81E08EBB87 -:1079E0003BD203C019BC1EBA37D28091E10080FFA0 -:1079F00017C08091E20080FF13C08091E2008E7F6B -:107A00008093E2008091E20080618093E2008091A7 -:107A1000D80080628093D80019BC85E08EBB1CD250 -:107A20008091E10084FF2CC08091E20084FF28C097 -:107A300080E189BD82E189BD09B400FEFDCF80915E -:107A4000D8008F7D8093D8008091E1008F7E809355 -:107A5000E1008091E2008F7E8093E2008091E2005D -:107A600081608093E20080919A01882331F48091B3 -:107A7000E30087FD02C081E001C084E08EBBECD151 -:107A80008091E10083FF21C08091E20083FF1DC04F -:107A90008091E100877F8093E10082E08EBB1092AD -:107AA0009A018091E1008E7F8093E1008091E20055 -:107AB0008E7F8093E2008091E20080618093E200FB -:107AC00080E060E042E0D8DEC7D1FF91EF91BF9146 -:107AD000AF919F918F917F916F915F914F913F9166 -:107AE0002F910F900FBE0F901F9018959C01409101 -:107AF000A2015091A3014617570718F4F90190E02D -:107B000044C06115710511F0AB01F8CF8091E80018 -:107B10008E778093E80040E050E0F0CF8EB388236A -:107B200009F444C0853009F443C08091E80083FF24 -:107B300002C081E008958091E80082FD31C080910B -:107B4000E80080FF22C08091F3009091F200782F2E -:107B500060E0292F30E0262B372B07C081918093DE -:107B6000F100415050402F5F3F4F4115510519F032 -:107B70002830310598F390E02830310509F491E080 -:107B80008091E8008E778093E8004115510531F629 -:107B9000992321F605C08EB3882341F0853041F04A -:107BA0008091E80082FFF7CF80E0089582E0089599 -:107BB00083E008959C016115710529F48091E80026 -:107BC0008B778093E800F90126C08EB3882391F16A -:107BD000853091F18091E80083FF02C081E0089533 -:107BE0008091E80082FFF1CF06C08091F10081937F -:107BF0006150704059F02091F3008091F200322FD3 -:107C000020E090E0822B932B892B79F78091E8007C -:107C10008B778093E80061157105B9F605C08EB3C6 -:107C2000882341F0853041F08091E80080FFF7CF54 -:107C300080E0089582E0089583E008950F931F93F4 -:107C4000DF93CF9300D0CDB7DEB7ECE9F1E08091C0 -:107C5000F100819381E0E43AF807C9F74EDD8091A5 -:107C6000E80083FFE4C080919C0190919D019530D4 -:107C700009F46DC0963040F4913081F1913070F08C -:107C8000933009F0D4C02AC0983009F4A3C09930C9 -:107C900009F4B2C0963009F0CAC07CC0803809F43B -:107CA000C6C0823809F0C3C08091A001877080935C -:107CB000E9008091EB001092E9002091E800277F15 -:107CC0002093E80090E025E0969587952A95E1F7C6 -:107CD00081708093F1001092F10087C0882319F021 -:107CE000823009F0A4C08F71823009F0A0C0809169 -:107CF0009E01882331F52091A001277009F497C0D7 -:107D00002093E9008091EB0080FF1BC0933021F4A9 -:107D10008091EB00806213C08091EB0080618093C2 -:107D2000EB0081E090E002C0880F991F2A95E2F7EE -:107D30008093EA001092EA008091EB0088608093C3 -:107D4000EB001092E9008091E800877F51C0882302 -:107D500009F06DC010919E011F770FB7F8948091C4 -:107D6000E800877F8093E8009ADD8091E80080FF3B -:107D7000FCCF8091E3008078812B8093E3008068C2 -:107D80008093E300112311F482E001C083E08EBBF5 -:107D90000FBF4DC08058823008F049C080919E01CD -:107DA00090919F016091A001AE014F5F5F4F3FDD59 -:107DB000BC01009709F43BC08091E800877F809365 -:107DC000E80089819A8192DE8091E8008B77809328 -:107DD000E8002DC0803859F58091E800877F8093B6 -:107DE000E80080919A018093F1008091E8008E77FD -:107DF0008093E80054DD1BC08823C9F490919E0154 -:107E00009230A8F48091E800877F8093E8009093F7 -:107E10009A0145DD80919A01882331F48091E30035 -:107E200087FD02C081E001C084E08EBB96DC8091BA -:107E3000E80083FF0AC08091EB0080628093EB0032 -:107E40008091E800877F8093E8000F900F90CF919A -:107E5000DF911F910F91089508951F938EB388238A -:107E600061F01091E9001092E9008091E80083FF31 -:107E700001C0E4DE17701093E9001F910895F9998D -:107E8000FECF92BD81BDF89A992780B50895262F1F -:107E9000F999FECF1FBA92BD81BD20BD0FB6F894EF -:0E7EA000FA9AF99A0FBE01960895F894FFCF52 -:107EAE004341544552494E4100010000000000007C -:107EBE00081201100102000008EB034A2001000025 -:107ECE0001000109023E0002010080320904000097 -:107EDE0001020201000524001001042402040524FD -:107EEE00060001070582030800FF09040100020ACB -:107EFE0000000007050402100001070583021000B0 -:107F0E0001040309042603410056005200200043D9 -:107F1E000044004300200042006F006F0074006CAC -:0E7F2E00006F0061006400650072000000003A +:107140002F938F939F93EF93FF931092850010924C +:10715000840080918E0190918F01009741F00197FA +:1071600090938F0180938E01892B09F45D9A809111 +:10717000900190919101009741F0019790939101B6 +:1071800080939001892B09F4289AE0E0F0E0859142 +:1071900094918F5F9F4F49F080919201909193015C +:1071A00001969093930180939201FF91EF919F91AB +:1071B0008F912F910F900FBE0F901F90189584E024 +:1071C0008093E9000DC08091E8008B778093E80000 +:1071D00003C08EB3882351F08091E80082FFF9CF7D +:1071E0008091E80085FFEFCF8091F1000895982FFE +:1071F00083E08093E9008091E80085FD0DC08091D7 +:10720000E8008E778093E80003C08EB3882369F08E +:107210008091E80080FFF9CF9093F1005D9884E6BB +:1072200090E090938F0180938E0108954F925F922A +:107230006F927F928F929F92AF92BF92CF92DF9286 +:10724000EF92FF920F931F93CF93DF9384E080938D +:10725000E9008091E80082FF56C2289884E690E019 +:107260009093910180939001AADF182F853419F42F +:107270001092090103C0843519F4A1DF8DE019C211 +:107280008C34E1F38035D1F3843721F484E4AFDF2B +:1072900080E00FC2813611F489E50BC28134B1F46C +:1072A0008EDF182F8CDF90E0880F991FAA2797FD9B +:1072B000A095BA2F312F330F20E0442737FD40959A +:1072C000542F822B932BA42BB52BC4C1803711F4E0 +:1072D00083E5EFC1833549F4C0E0D1E0899187DFD0 +:1072E00021E0C730D207D1F7E5C1863521F481E32B +:1072F0007EDF80E3DEC1833731F487E878DF85E91C +:1073000076DF8EE1D6C18536B9F4E0E0F0E093E0B7 +:1073100085E090935700E89507B600FCFDCF809379 +:107320005700E89507B600FCFDCFE058FF4FA0E7F7 +:10733000E030FA0771F7A2CF8C3651F440DF809528 +:1073400099E0E1E0F0E0082E90935700E89596CFA1 +:10735000823739F4E1E0F0E089E0809357008491CE +:10736000A8C1863439F4E0E0F0E089E0809357006A +:1073700084919FC18E3439F4E3E0F0E089E080939A +:107380005700849196C1813539F4E2E0F0E089E05C +:107390008093570084918DC1823631F489E527DFCF +:1073A00080E025DF80E885C1823419F0873609F056 +:1073B000E5C0109293011092920101DF082FFFDEC9 +:1073C000F82EFDDE682E8554823008F071C1902FB2 +:1073D00080E0CF2DD0E0C82BD92B10926F0017364C +:1073E00009F04BC081E180935700E895DD24CC245F +:1073F000C3943FC0E0909401F090950100919601F4 +:1074000010919701B6E46B16D9F4ED2DF0E0EE295A +:10741000FF29E4918E2FEBDEDD2081F082E090E009 +:10742000A0E0B0E0E80EF91E0A1F1B1FE0929401D5 +:10743000F09295010093960110939701DC2418C0F7 +:10744000D801C701B695A7959795879523D5CFDE27 +:1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA +:10746000E0929401F0929501009396011093970198 +:107470002197209709F0BECF7DC080909401909015 +:107480009501A0909601B090970196E4691609F0D5 +:107490005DC083E0F40180935700E89507B600FCD7 +:1074A000FDCF54C0F6E46F1661F5772031F1E0901E +:1074B0009401F090950100919601109197017FDE63 +:1074C000D82ECC24852D90E08C299D29F7010C0124 +:1074D00040925700E895112482E090E0A0E0B0E0EF +:1074E000E80EF91E0A1F1B1FE0929401F09295010D +:1074F000009396011093970102C061DE582E742408 +:1075000023C0E0909401F0909501009196011091B4 +:10751000970116950795F794E79451DE682FC701F8 +:10752000C1D48091940190919501A0919601B09160 +:1075300097010296A11DB11D80939401909395012E +:10754000A0939601B0939701219704C05524772406 +:1075500044244394209709F0A5CF96E4691641F49A +:1075600085E0F40180935700E89507B600FCFDCF55 +:107570008DE03DDE82E080936F009CC0833471F427 +:1075800000919401109195011ADE90E021E0F8013C +:107590000C0120935700E895112470CE833619F51D +:1075A000E0909401F090950100919601109197015F +:1075B00006DEF701E16090E021E00C012093570026 +:1075C000E895112482E090E0A0E0B0E0E80EF91E1A +:1075D0000A1F1B1FE0929401F092950100939601FF +:1075E000109397014BCE8D3661F4E0919401F091A8 +:1075F000950185E080935700E89507B600FCFDCF24 +:107600003DCE823551F4E0919401F09195010591C0 +:107610001491812FECDD802F4CC0843421F5E09053 +:107620009401F090950100919601109197011695A3 +:107630000795F794E794C3DD682FC70133D4809191 +:10764000940190919501A0919601B09197010296B5 +:10765000A11DB11D8093940190939501A093960173 +:10766000B09397010BCE843609F5E0909401F09029 +:1076700095010091960110919701D801C701B69527 +:10768000A7959795879506D4B2DD82E090E0A0E0BB +:10769000B0E0E80EF91E0A1F1B1FE0929401F09261 +:1076A0009501009396011093970104C08B3111F05E +:1076B0008FE39DDD83E08093E9009091E800809165 +:1076C000E8008E778093E80095FF04C010C08EB369 +:1076D0008823C9F08091E80080FFF9CF8091E8000D +:1076E0008E778093E80003C08EB3882361F0809189 +:1076F000E80080FFF9CF84E08093E9008091E80002 +:107700008B778093E800DF91CF911F910F91FF90CD +:10771000EF90DF90CF90BF90AF909F908F907F9031 +:107720006F905F904F90089590919C01892F8F7773 +:10773000813249F580919D018032A1F0813219F5A5 +:10774000913A09F58091E800877F8093E8008AE00C +:1077500091E067E070E0D5D18091E8008B7780936D +:10776000E8000895913279F48091E800877F809352 +:10777000E8008AE091E067E070E027D28091E800BD +:107780008E778093E800089582E061EC42E07FD03C +:1077900083E061E842E17BD084E060E842E177C0C9 +:1077A00084B7877F84BF88E10FB6F8948093600028 +:1077B000109260000FBE20E880E090E00FB6F894D1 +:1077C00020936100809361000FBE81E085BF92E04D +:1077D00095BF3F9A209A559AE1E6F0E02083108207 +:1077E00047985D9A289A109289008AEF80938800C2 +:1077F00090936F0083E080938100BAC088E10FB658 +:10780000F89480936000109260000FBEC9DF7894F6 +:107810000CC00CDD2DD38091920190919301815881 +:107820009E4310F0109209016FDC809109018823BA +:1078300081F78091E00081608093E00053DC80E07C +:1078400090E00895FA01923071F0933089F0913010 +:1078500029F481E191E022E130E015C080E090E080 +:1078600020E030E010C083E291E02EE330E00BC076 +:10787000882329F481E691E024E030E004C085E625 +:1078800091E026E230E091838083C90108958093DE +:10789000E9008091EB0081608093EB001092ED0095 +:1078A0006093EC004093ED008091EE00881F8827E4 +:1078B000881F089580919C0188238CF403C08EB3A7 +:1078C0008823B1F08091E80082FFF9CF8091E80031 +:1078D0008B778093E80008958EB3882349F08091D8 +:1078E000E80080FFF9CF8091E8008E778093E80070 +:1078F0000895EF92FF920F931F9345D04CD008ED5F +:1079000010E0F80180818F77808380818068808398 +:1079100080818F7D808319BC1EBA10929A0180EEFF +:10792000E82EF12CF70180818B7F8083F801808124 +:107930008160808380E060E042E0A9DFE1EEF0E07A +:1079400080818E7F8083E2EEF0E0808181608083A1 +:10795000808188608083F70180818E7F8083F80139 +:107960008081806180831F910F91FF90EF90089537 +:10797000E7EDF0E08081816080838AE482BF81E06E +:1079800080939B01B6CFE8EDF0E080818E7F80830D +:107990001092E20008951092DA001092E10008952A +:1079A0001F920F920FB60F9211242F933F934F9374 +:1079B0005F936F937F938F939F93AF93BF93EF9357 +:1079C000FF938091DA0080FF1BC08091D80080FF78 +:1079D00017C08091DA008E7F8093DA008091D90001 +:1079E00080FF0BC080E189BD82E189BD09B400FE42 +:1079F000FDCF81E08EBB3BD203C019BC1EBA37D28B +:107A00008091E10080FF17C08091E20080FF13C0E9 +:107A10008091E2008E7F8093E2008091E20080619D +:107A20008093E2008091D80080628093D80019BCD6 +:107A300085E08EBB1CD28091E10084FF2CC0809138 +:107A4000E20084FF28C080E189BD82E189BD09B4DC +:107A500000FEFDCF8091D8008F7D8093D80080916B +:107A6000E1008F7E8093E1008091E2008F7E809321 +:107A7000E2008091E20081608093E20080919A01AF +:107A8000882331F48091E30087FD02C081E001C0CA +:107A900084E08EBBECD18091E10083FF21C0809116 +:107AA000E20083FF1DC08091E100877F8093E100A9 +:107AB00082E08EBB10929A018091E1008E7F8093CC +:107AC000E1008091E2008E7F8093E2008091E200ED +:107AD00080618093E20080E060E042E0D8DEC7D1C0 +:107AE000FF91EF91BF91AF919F918F917F916F9196 +:107AF0005F914F913F912F910F900FBE0F901F906C +:107B000018959C014091A2015091A3014617570777 +:107B100018F4F90190E044C06115710511F0AB0152 +:107B2000F8CF8091E8008E778093E80040E050E045 +:107B3000F0CF8EB3882309F444C0853009F443C0E4 +:107B40008091E80083FF02C081E008958091E80001 +:107B500082FD31C08091E80080FF22C08091F30057 +:107B60009091F200782F60E0292F30E0262B372B00 +:107B700007C081918093F100415050402F5F3F4FEB +:107B80004115510519F02830310598F390E028305F +:107B9000310509F491E08091E8008E778093E80048 +:107BA0004115510531F6992321F605C08EB388237E +:107BB00041F0853041F08091E80082FFF7CF80E00E +:107BC000089582E0089583E008959C016115710590 +:107BD00029F48091E8008B778093E800F90126C0B2 +:107BE0008EB3882391F1853091F18091E80083FF75 +:107BF00002C081E008958091E80082FFF1CF06C0C5 +:107C00008091F10081936150704059F02091F30010 +:107C10008091F200322F20E090E0822B932B892B71 +:107C200079F78091E8008B778093E8006115710502 +:107C3000B9F605C08EB3882341F0853041F08091BC +:107C4000E80080FFF7CF80E0089582E0089583E0A8 +:107C500008950F931F93DF93CF9300D0CDB7DEB776 +:107C6000ECE9F1E08091F100819381E0E43AF807DA +:107C7000C9F75ADD8091E80083FFE4C080919C0140 +:107C800090919D01953009F46DC0963040F491308B +:107C900081F1913070F0933009F0D4C02AC098304F +:107CA00009F4A3C0993009F4B2C0963009F0CAC0F3 +:107CB0007CC0803809F4C6C0823809F0C3C0809106 +:107CC000A00187708093E9008091EB001092E90099 +:107CD0002091E800277F2093E80090E025E096952A +:107CE00087952A95E1F781708093F1001092F10059 +:107CF00087C0882319F0823009F0A4C08F718230C8 +:107D000009F0A0C080919E01882331F52091A00147 +:107D1000277009F497C02093E9008091EB0080FF61 +:107D20001BC0933021F48091EB00806213C08091DE +:107D3000EB0080618093EB0081E090E002C0880F4F +:107D4000991F2A95E2F78093EA001092EA00809149 +:107D5000EB0088608093EB001092E9008091E800CE +:107D6000877F51C0882309F06DC010919E011F7755 +:107D70000FB7F8948091E800877F8093E8009ADD40 +:107D80008091E80080FFFCCF8091E3008078812B18 +:107D90008093E30080688093E300112311F482E074 +:107DA00001C083E08EBB0FBF4DC08058823008F009 +:107DB00049C080919E0190919F016091A001AE0108 +:107DC0004F5F5F4F3FDDBC01009709F43BC08091DE +:107DD000E800877F8093E80089819A8192DE809114 +:107DE000E8008B778093E8002DC0803859F58091AA +:107DF000E800877F8093E80080919A018093F100EA +:107E00008091E8008E778093E80054DD1BC08823C2 +:107E1000C9F490919E019230A8F48091E800877F88 +:107E20008093E80090939A0145DD80919A01882320 +:107E300031F48091E30087FD02C081E001C084E05D +:107E40008EBBA2DC8091E80083FF0AC08091EB002A +:107E500080628093EB008091E800877F8093E80048 +:107E60000F900F90CF91DF911F910F91089508957A +:107E70001F938EB3882361F01091E9001092E900FE +:107E80008091E80083FF01C0E4DE17701093E900E1 +:107E90001F910895F999FECF92BD81BDF89A992757 +:107EA00080B50895262FF999FECF1FBA92BD81BDE6 +:107EB00020BD0FB6F894FA9AF99A0FBE019608956C +:047EC000F894FFCF64 +:107EC4004341544552494E41000100000000000066 +:107ED400081201100102000008EB034A200100000F +:107EE40001000109023E0002010080320904000081 +:107EF40001020201000524001001042402040524E7 +:107F0400060001070582030800FF09040100020AB4 +:107F14000000000705040210000107058302100099 +:107F240001040309042603410056005200200043C3 +:107F34000044004300200042006F006F0074006C96 +:0E7F4400006F00610064006500720000000024 :040000030000700089 :00000001FF -- cgit v1.2.3-18-g5258 From 3191583476d18cf8813b65aad6fd9491191c6c61 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 7 Feb 2012 23:52:55 -0500 Subject: changed Caterina descriptors - Arduino LLC VID, new PID, manufacturer string, and serial number --- bootloaders/caterina_LUFA/Caterina.hex | 343 ++++++++++++++++---------------- bootloaders/caterina_LUFA/Descriptors.c | 36 +++- 2 files changed, 203 insertions(+), 176 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index 5da8582..fe12ee3 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000BBC400005AC0000089 +:1070200060C000005EC00000CBC400005AC0000079 :1070300058C0000056C0000054C0000052C00000FC :1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C @@ -9,22 +9,22 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EC5D -:1070C000FEE702C005900D92AE38B107D9F711E086 -:1070D000AEE8B1E001C01D92A43AB107E1F78ED34A -:1070E000EFC68ECFF89410926F001092810010922C +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EE5B +:1070C000FEE702C005900D92A03CB107D9F711E090 +:1070D000A0ECB1E001C01D92A63DB107E1F78ED34F +:1070E000FFC68ECFF89410926F001092810010921C :1070F00085001092840081E085BF15BE47985D9A97 -:10710000289A0C94000008952091980130919901DB -:107110002F5F3F4F3093990120939801932F37FFB2 +:10710000289A0C94000008952091CA013091CB0177 +:107110002F5F3F4F3093CB012093CA01932F37FF4E :1071200003C08EEF831B982F990F921710F4479886 :107130000895479A08951F920F920FB60F92112447 :107140002F938F939F93EF93FF931092850010924C -:10715000840080918E0190918F01009741F00197FA -:1071600090938F0180938E01892B09F45D9A809111 -:10717000900190919101009741F0019790939101B6 -:1071800080939001892B09F4289AE0E0F0E0859142 -:1071900094918F5F9F4F49F080919201909193015C -:1071A00001969093930180939201FF91EF919F91AB +:1071500084008091C0019091C101009741F0019796 +:107160009093C1018093C001892B09F45D9A8091AD +:10717000C2019091C301009741F001979093C30120 +:107180008093C201892B09F4289AE0E0F0E0859110 +:1071900094918F5F9F4F49F08091C4019091C501F8 +:1071A00001969093C5018093C401FF91EF919F9147 :1071B0008F912F910F900FBE0F901F90189584E024 :1071C0008093E9000DC08091E8008B778093E80000 :1071D00003C08EB3882351F08091E80082FFF9CF7D @@ -32,11 +32,11 @@ :1071F00083E08093E9008091E80085FD0DC08091D7 :10720000E8008E778093E80003C08EB3882369F08E :107210008091E80080FFF9CF9093F1005D9884E6BB -:1072200090E090938F0180938E0108954F925F922A +:1072200090E09093C1018093C00108954F925F92C6 :107230006F927F928F929F92AF92BF92CF92DF9286 :10724000EF92FF920F931F93CF93DF9384E080938D :10725000E9008091E80082FF56C2289884E690E019 -:107260009093910180939001AADF182F853419F42F +:107260009093C3018093C201AADF182F853419F4CB :107270001092090103C0843519F4A1DF8DE019C211 :107280008C34E1F38035D1F3843721F484E4AFDF2B :1072900080E00FC2813611F489E50BC28134B1F46C @@ -57,54 +57,54 @@ :107380005700849196C1813539F4E2E0F0E089E05C :107390008093570084918DC1823631F489E527DFCF :1073A00080E025DF80E885C1823419F0873609F056 -:1073B000E5C0109293011092920101DF082FFFDEC9 +:1073B000E5C01092C5011092C40101DF082FFFDE65 :1073C000F82EFDDE682E8554823008F071C1902FB2 :1073D00080E0CF2DD0E0C82BD92B10926F0017364C :1073E00009F04BC081E180935700E895DD24CC245F -:1073F000C3943FC0E0909401F090950100919601F4 -:1074000010919701B6E46B16D9F4ED2DF0E0EE295A +:1073F000C3943FC0E090C601F090C7010091C8015E +:107400001091C901B6E46B16D9F4ED2DF0E0EE2928 :10741000FF29E4918E2FEBDEDD2081F082E090E009 -:10742000A0E0B0E0E80EF91E0A1F1B1FE0929401D5 -:10743000F09295010093960110939701DC2418C0F7 -:10744000D801C701B695A7959795879523D5CFDE27 +:10742000A0E0B0E0E80EF91E0A1F1B1FE092C601A3 +:10743000F092C7010093C8011093C901DC2418C061 +:10744000D801C701B695A7959795879533D5CFDE17 :1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA -:10746000E0929401F0929501009396011093970198 -:107470002197209709F0BECF7DC080909401909015 -:107480009501A0909601B090970196E4691609F0D5 +:10746000E092C601F092C7010093C8011093C901D0 +:107470002197209709F0BECF7DC08090C6019090E3 +:10748000C701A090C801B090C90196E4691609F03F :107490005DC083E0F40180935700E89507B600FCD7 :1074A000FDCF54C0F6E46F1661F5772031F1E0901E -:1074B0009401F090950100919601109197017FDE63 +:1074B000C601F090C7010091C8011091C9017FDE9B :1074C000D82ECC24852D90E08C299D29F7010C0124 :1074D00040925700E895112482E090E0A0E0B0E0EF -:1074E000E80EF91E0A1F1B1FE0929401F09295010D -:1074F000009396011093970102C061DE582E742408 -:1075000023C0E0909401F0909501009196011091B4 -:10751000970116950795F794E79451DE682FC701F8 -:10752000C1D48091940190919501A0919601B09160 -:1075300097010296A11DB11D80939401909395012E -:10754000A0939601B0939701219704C05524772406 +:1074E000E80EF91E0A1F1B1FE092C601F092C701A9 +:1074F0000093C8011093C90102C061DE582E7424A4 +:1075000023C0E090C601F090C7010091C80110911E +:10751000C90116950795F794E79451DE682FC701C6 +:10752000D1D48091C6019091C701A091C801B091BA +:10753000C9010296A11DB11D8093C6019093C70198 +:10754000A093C801B093C901219704C055247724A2 :1075500044244394209709F0A5CF96E4691641F49A :1075600085E0F40180935700E89507B600FCFDCF55 :107570008DE03DDE82E080936F009CC0833471F427 -:1075800000919401109195011ADE90E021E0F8013C +:107580000091C6011091C7011ADE90E021E0F801D8 :107590000C0120935700E895112470CE833619F51D -:1075A000E0909401F090950100919601109197015F +:1075A000E090C601F090C7010091C8011091C90197 :1075B00006DEF701E16090E021E00C012093570026 :1075C000E895112482E090E0A0E0B0E0E80EF91E1A -:1075D0000A1F1B1FE0929401F092950100939601FF -:1075E000109397014BCE8D3661F4E0919401F091A8 -:1075F000950185E080935700E89507B600FCFDCF24 -:107600003DCE823551F4E0919401F09195010591C0 +:1075D0000A1F1B1FE092C601F092C7010093C80169 +:1075E0001093C9014BCE8D3661F4E091C601F09144 +:1075F000C70185E080935700E89507B600FCFDCFF2 +:107600003DCE823551F4E091C601F091C70105915C :107610001491812FECDD802F4CC0843421F5E09053 -:107620009401F090950100919601109197011695A3 -:107630000795F794E794C3DD682FC70133D4809191 -:10764000940190919501A0919601B09197010296B5 -:10765000A11DB11D8093940190939501A093960173 -:10766000B09397010BCE843609F5E0909401F09029 -:1076700095010091960110919701D801C701B69527 -:10768000A7959795879506D4B2DD82E090E0A0E0BB -:10769000B0E0E80EF91E0A1F1B1FE0929401F09261 -:1076A0009501009396011093970104C08B3111F05E +:10762000C601F090C7010091C8011091C9011695DB +:107630000795F794E794C3DD682FC70143D4809181 +:10764000C6019091C701A091C801B091C9010296ED +:10765000A11DB11D8093C6019093C701A093C801DD +:10766000B093C9010BCE843609F5E090C601F090C5 +:10767000C7010091C8011091C901D801C701B69591 +:10768000A7959795879516D4B2DD82E090E0A0E0AB +:10769000B0E0E80EF91E0A1F1B1FE092C601F0922F +:1076A000C7010093C8011093C90104C08B3111F0C8 :1076B0008FE39DDD83E08093E9009091E800809165 :1076C000E8008E778093E80095FF04C010C08EB369 :1076D0008823C9F08091E80080FFF9CF8091E8000D @@ -112,137 +112,142 @@ :1076F000E80080FFF9CF84E08093E9008091E80002 :107700008B778093E800DF91CF911F910F91FF90CD :10771000EF90DF90CF90BF90AF909F908F907F9031 -:107720006F905F904F90089590919C01892F8F7773 -:10773000813249F580919D018032A1F0813219F5A5 +:107720006F905F904F9008959091CE01892F8F7741 +:10773000813249F58091CF018032A1F0813219F573 :10774000913A09F58091E800877F8093E8008AE00C -:1077500091E067E070E0D5D18091E8008B7780936D +:1077500091E067E070E0E5D18091E8008B7780935D :10776000E8000895913279F48091E800877F809352 -:10777000E8008AE091E067E070E027D28091E800BD -:107780008E778093E800089582E061EC42E07FD03C -:1077900083E061E842E17BD084E060E842E177C0C9 +:10777000E8008AE091E067E070E037D28091E800AD +:107780008E778093E800089582E061EC42E08FD02C +:1077900083E061E842E18BD084E060E842E187C0A9 :1077A00084B7877F84BF88E10FB6F8948093600028 :1077B000109260000FBE20E880E090E00FB6F894D1 :1077C00020936100809361000FBE81E085BF92E04D :1077D00095BF3F9A209A559AE1E6F0E02083108207 :1077E00047985D9A289A109289008AEF80938800C2 -:1077F00090936F0083E080938100BAC088E10FB658 +:1077F00090936F0083E080938100CAC088E10FB648 :10780000F89480936000109260000FBEC9DF7894F6 -:107810000CC00CDD2DD38091920190919301815881 +:107810000CC00CDD3DD38091C4019091C50181580D :107820009E4310F0109209016FDC809109018823BA :1078300081F78091E00081608093E00053DC80E07C -:1078400090E00895FA01923071F0933089F0913010 -:1078500029F481E191E022E130E015C080E090E080 -:1078600020E030E010C083E291E02EE330E00BC076 -:10787000882329F481E691E024E030E004C085E625 -:1078800091E026E230E091838083C90108958093DE -:10789000E9008091EB0081608093EB001092ED0095 -:1078A0006093EC004093ED008091EE00881F8827E4 -:1078B000881F089580919C0188238CF403C08EB3A7 -:1078C0008823B1F08091E80082FFF9CF8091E80031 -:1078D0008B778093E80008958EB3882349F08091D8 -:1078E000E80080FFF9CF8091E8008E778093E80070 -:1078F0000895EF92FF920F931F9345D04CD008ED5F -:1079000010E0F80180818F77808380818068808398 -:1079100080818F7D808319BC1EBA10929A0180EEFF -:10792000E82EF12CF70180818B7F8083F801808124 -:107930008160808380E060E042E0A9DFE1EEF0E07A -:1079400080818E7F8083E2EEF0E0808181608083A1 -:10795000808188608083F70180818E7F8083F80139 -:107960008081806180831F910F91FF90EF90089537 -:10797000E7EDF0E08081816080838AE482BF81E06E -:1079800080939B01B6CFE8EDF0E080818E7F80830D -:107990001092E20008951092DA001092E10008952A -:1079A0001F920F920FB60F9211242F933F934F9374 -:1079B0005F936F937F938F939F93AF93BF93EF9357 -:1079C000FF938091DA0080FF1BC08091D80080FF78 -:1079D00017C08091DA008E7F8093DA008091D90001 -:1079E00080FF0BC080E189BD82E189BD09B400FE42 -:1079F000FDCF81E08EBB3BD203C019BC1EBA37D28B -:107A00008091E10080FF17C08091E20080FF13C0E9 -:107A10008091E2008E7F8093E2008091E20080619D -:107A20008093E2008091D80080628093D80019BCD6 -:107A300085E08EBB1CD28091E10084FF2CC0809138 -:107A4000E20084FF28C080E189BD82E189BD09B4DC -:107A500000FEFDCF8091D8008F7D8093D80080916B -:107A6000E1008F7E8093E1008091E2008F7E809321 -:107A7000E2008091E20081608093E20080919A01AF -:107A8000882331F48091E30087FD02C081E001C0CA -:107A900084E08EBBECD18091E10083FF21C0809116 -:107AA000E20083FF1DC08091E100877F8093E100A9 -:107AB00082E08EBB10929A018091E1008E7F8093CC -:107AC000E1008091E2008E7F8093E2008091E200ED -:107AD00080618093E20080E060E042E0D8DEC7D1C0 -:107AE000FF91EF91BF91AF919F918F917F916F9196 -:107AF0005F914F913F912F910F900FBE0F901F906C -:107B000018959C014091A2015091A3014617570777 -:107B100018F4F90190E044C06115710511F0AB0152 -:107B2000F8CF8091E8008E778093E80040E050E045 -:107B3000F0CF8EB3882309F444C0853009F443C0E4 -:107B40008091E80083FF02C081E008958091E80001 -:107B500082FD31C08091E80080FF22C08091F30057 -:107B60009091F200782F60E0292F30E0262B372B00 -:107B700007C081918093F100415050402F5F3F4FEB -:107B80004115510519F02830310598F390E028305F -:107B9000310509F491E08091E8008E778093E80048 -:107BA0004115510531F6992321F605C08EB388237E -:107BB00041F0853041F08091E80082FFF7CF80E00E -:107BC000089582E0089583E008959C016115710590 -:107BD00029F48091E8008B778093E800F90126C0B2 -:107BE0008EB3882391F1853091F18091E80083FF75 -:107BF00002C081E008958091E80082FFF1CF06C0C5 -:107C00008091F10081936150704059F02091F30010 -:107C10008091F200322F20E090E0822B932B892B71 -:107C200079F78091E8008B778093E8006115710502 -:107C3000B9F605C08EB3882341F0853041F08091BC -:107C4000E80080FFF7CF80E0089582E0089583E0A8 -:107C500008950F931F93DF93CF9300D0CDB7DEB776 -:107C6000ECE9F1E08091F100819381E0E43AF807DA -:107C7000C9F75ADD8091E80083FFE4C080919C0140 -:107C800090919D01953009F46DC0963040F491308B -:107C900081F1913070F0933009F0D4C02AC098304F -:107CA00009F4A3C0993009F4B2C0963009F0CAC0F3 -:107CB0007CC0803809F4C6C0823809F0C3C0809106 -:107CC000A00187708093E9008091EB001092E90099 -:107CD0002091E800277F2093E80090E025E096952A -:107CE00087952A95E1F781708093F1001092F10059 -:107CF00087C0882319F0823009F0A4C08F718230C8 -:107D000009F0A0C080919E01882331F52091A00147 -:107D1000277009F497C02093E9008091EB0080FF61 -:107D20001BC0933021F48091EB00806213C08091DE -:107D3000EB0080618093EB0081E090E002C0880F4F -:107D4000991F2A95E2F78093EA001092EA00809149 -:107D5000EB0088608093EB001092E9008091E800CE -:107D6000877F51C0882309F06DC010919E011F7755 -:107D70000FB7F8948091E800877F8093E8009ADD40 -:107D80008091E80080FFFCCF8091E3008078812B18 -:107D90008093E30080688093E300112311F482E074 -:107DA00001C083E08EBB0FBF4DC08058823008F009 -:107DB00049C080919E0190919F016091A001AE0108 -:107DC0004F5F5F4F3FDDBC01009709F43BC08091DE -:107DD000E800877F8093E80089819A8192DE809114 -:107DE000E8008B778093E8002DC0803859F58091AA -:107DF000E800877F8093E80080919A018093F100EA -:107E00008091E8008E778093E80054DD1BC08823C2 -:107E1000C9F490919E019230A8F48091E800877F88 -:107E20008093E80090939A0145DD80919A01882320 -:107E300031F48091E30087FD02C081E001C084E05D -:107E40008EBBA2DC8091E80083FF0AC08091EB002A -:107E500080628093EB008091E800877F8093E80048 -:107E60000F900F90CF91DF911F910F91089508957A -:107E70001F938EB3882361F01091E9001092E900FE -:107E80008091E80083FF01C0E4DE17701093E900E1 -:107E90001F910895F999FECF92BD81BDF89A992757 -:107EA00080B50895262FF999FECF1FBA92BD81BDE6 -:107EB00020BD0FB6F894FA9AF99A0FBE019608956C -:047EC000F894FFCF64 -:107EC4004341544552494E41000100000000000066 -:107ED400081201100102000008EB034A200100000F -:107EE40001000109023E0002010080320904000081 -:107EF40001020201000524001001042402040524E7 -:107F0400060001070582030800FF09040100020AB4 -:107F14000000000705040210000107058302100099 -:107F240001040309042603410056005200200043C3 -:107F34000044004300200042006F006F0074006C96 -:0E7F4400006F00610064006500720000000024 +:1078400090E00895FA01923049F0933061F0913060 +:1078500031F581E191E022E130E025C083E291E061 +:107860002EE330E020C0882329F481E691E024E073 +:1078700030E019C0813029F485E691E022E230E061 +:1078800012C0833029F489E891E02AE130E00BC08E +:10789000823029F485EA91E028E130E004C080E0FC +:1078A00090E020E030E091838083C90108958093C7 +:1078B000E9008091EB0081608093EB001092ED0075 +:1078C0006093EC004093ED008091EE00881F8827C4 +:1078D000881F08958091CE0188238CF403C08EB355 +:1078E0008823B1F08091E80082FFF9CF8091E80011 +:1078F0008B778093E80008958EB3882349F08091B8 +:10790000E80080FFF9CF8091E8008E778093E8004F +:107910000895EF92FF920F931F9345D04CD008ED3E +:1079200010E0F80180818F77808380818068808378 +:1079300080818F7D808319BC1EBA1092CC0180EEAD +:10794000E82EF12CF70180818B7F8083F801808104 +:107950008160808380E060E042E0A9DFE1EEF0E05A +:1079600080818E7F8083E2EEF0E080818160808381 +:10797000808188608083F70180818E7F8083F80119 +:107980008081806180831F910F91FF90EF90089517 +:10799000E7EDF0E08081816080838AE482BF81E04E +:1079A0008093CD01B6CFE8EDF0E080818E7F8083BB +:1079B0001092E20008951092DA001092E10008950A +:1079C0001F920F920FB60F9211242F933F934F9354 +:1079D0005F936F937F938F939F93AF93BF93EF9337 +:1079E000FF938091DA0080FF1BC08091D80080FF58 +:1079F00017C08091DA008E7F8093DA008091D900E1 +:107A000080FF0BC080E189BD82E189BD09B400FE21 +:107A1000FDCF81E08EBB3BD203C019BC1EBA37D26A +:107A20008091E10080FF17C08091E20080FF13C0C9 +:107A30008091E2008E7F8093E2008091E20080617D +:107A40008093E2008091D80080628093D80019BCB6 +:107A500085E08EBB1CD28091E10084FF2CC0809118 +:107A6000E20084FF28C080E189BD82E189BD09B4BC +:107A700000FEFDCF8091D8008F7D8093D80080914B +:107A8000E1008F7E8093E1008091E2008F7E809301 +:107A9000E2008091E20081608093E2008091CC015D +:107AA000882331F48091E30087FD02C081E001C0AA +:107AB00084E08EBBECD18091E10083FF21C08091F6 +:107AC000E20083FF1DC08091E100877F8093E10089 +:107AD00082E08EBB1092CC018091E1008E7F80937A +:107AE000E1008091E2008E7F8093E2008091E200CD +:107AF00080618093E20080E060E042E0D8DEC7D1A0 +:107B0000FF91EF91BF91AF919F918F917F916F9175 +:107B10005F914F913F912F910F900FBE0F901F904B +:107B200018959C014091D4015091D50146175707F3 +:107B300018F4F90190E044C06115710511F0AB0132 +:107B4000F8CF8091E8008E778093E80040E050E025 +:107B5000F0CF8EB3882309F444C0853009F443C0C4 +:107B60008091E80083FF02C081E008958091E800E1 +:107B700082FD31C08091E80080FF22C08091F30037 +:107B80009091F200782F60E0292F30E0262B372BE0 +:107B900007C081918093F100415050402F5F3F4FCB +:107BA0004115510519F02830310598F390E028303F +:107BB000310509F491E08091E8008E778093E80028 +:107BC0004115510531F6992321F605C08EB388235E +:107BD00041F0853041F08091E80082FFF7CF80E0EE +:107BE000089582E0089583E008959C016115710570 +:107BF00029F48091E8008B778093E800F90126C092 +:107C00008EB3882391F1853091F18091E80083FF54 +:107C100002C081E008958091E80082FFF1CF06C0A4 +:107C20008091F10081936150704059F02091F300F0 +:107C30008091F200322F20E090E0822B932B892B51 +:107C400079F78091E8008B778093E80061157105E2 +:107C5000B9F605C08EB3882341F0853041F080919C +:107C6000E80080FFF7CF80E0089582E0089583E088 +:107C700008950F931F93DF93CF9300D0CDB7DEB756 +:107C8000EEECF1E08091F100819381E0E63DF807B0 +:107C9000C9F74ADD8091E80083FFE4C08091CE01FE +:107CA0009091CF01953009F46DC0963040F4913039 +:107CB00081F1913070F0933009F0D4C02AC098302F +:107CC00009F4A3C0993009F4B2C0963009F0CAC0D3 +:107CD0007CC0803809F4C6C0823809F0C3C08091E6 +:107CE000D20187708093E9008091EB001092E90047 +:107CF0002091E800277F2093E80090E025E096950A +:107D000087952A95E1F781708093F1001092F10038 +:107D100087C0882319F0823009F0A4C08F718230A7 +:107D200009F0A0C08091D001882331F52091D201C3 +:107D3000277009F497C02093E9008091EB0080FF41 +:107D40001BC0933021F48091EB00806213C08091BE +:107D5000EB0080618093EB0081E090E002C0880F2F +:107D6000991F2A95E2F78093EA001092EA00809129 +:107D7000EB0088608093EB001092E9008091E800AE +:107D8000877F51C0882309F06DC01091D0011F7703 +:107D90000FB7F8948091E800877F8093E8009ADD20 +:107DA0008091E80080FFFCCF8091E3008078812BF8 +:107DB0008093E30080688093E300112311F482E054 +:107DC00001C083E08EBB0FBF4DC08058823008F0E9 +:107DD00049C08091D0019091D1016091D201AE0152 +:107DE0004F5F5F4F2FDDBC01009709F43BC08091CE +:107DF000E800877F8093E80089819A8192DE8091F4 +:107E0000E8008B778093E8002DC0803859F5809189 +:107E1000E800877F8093E8008091CC018093F10097 +:107E20008091E8008E778093E80054DD1BC08823A2 +:107E3000C9F49091D0019230A8F48091E800877F36 +:107E40008093E8009093CC0145DD8091CC0188239C +:107E500031F48091E30087FD02C081E001C084E03D +:107E60008EBB92DC8091E80083FF0AC08091EB001A +:107E700080628093EB008091E800877F8093E80028 +:107E80000F900F90CF91DF911F910F91089508955A +:107E90001F938EB3882361F01091E9001092E900DE +:107EA0008091E80083FF01C0E4DE17701093E900C1 +:107EB0001F910895F999FECF92BD81BDF89A992737 +:107EC00080B50895262FF999FECF1FBA92BD81BDC6 +:107ED00020BD0FB6F894FA9AF99A0FBE019608954C +:047EE000F894FFCF44 +:107EE4004341544552494E41000100000000000046 +:107EF40008120110010200000841230030010002B1 +:107F040001030109023E000201008032090400005D +:107F140001020201000524001001042402040524C6 +:107F2400060001070582030800FF09040100020A94 +:107F34000000000705040210000107058302100079 +:107F440001040309042203410072006400750069FE +:107F5400006E006F0020004C0065006F006E006131 +:107F640000720064006F0000001A0330003000301B +:107F74000030003000300030003000310034003573 +:107F840000320000001803410072006400750069AB +:107F9400006E006F0020004C004C00430000000005 :040000030000700089 :00000001FF diff --git a/bootloaders/caterina_LUFA/Descriptors.c b/bootloaders/caterina_LUFA/Descriptors.c index a3ca700..fb376c1 100755 --- a/bootloaders/caterina_LUFA/Descriptors.c +++ b/bootloaders/caterina_LUFA/Descriptors.c @@ -53,13 +53,13 @@ const USB_Descriptor_Device_t DeviceDescriptor = .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - .VendorID = 0x03EB, - .ProductID = 0x204A, + .VendorID = 0x2341, + .ProductID = 0x3000, .ReleaseNumber = VERSION_BCD(00.01), - .ManufacturerStrIndex = NO_DESCRIPTOR, + .ManufacturerStrIndex = 0x02, .ProductStrIndex = 0x01, - .SerialNumStrIndex = NO_DESCRIPTOR, + .SerialNumStrIndex = 0x03, .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS }; @@ -191,9 +191,23 @@ const USB_Descriptor_String_t LanguageString = */ const USB_Descriptor_String_t ProductString = { - .Header = {.Size = USB_STRING_LEN(18), .Type = DTYPE_String}, + .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, - .UnicodeString = L"AVR CDC Bootloader" + .UnicodeString = L"Arduino Leonardo" +}; + +const USB_Descriptor_String_t SerialNumString = +{ + .Header = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String}, + + .UnicodeString = L"000000001452" +}; + +const USB_Descriptor_String_t ManufNameString = +{ + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino LLC" }; /** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" @@ -228,10 +242,18 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Address = &LanguageString; Size = LanguageString.Header.Size; } - else + else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) { Address = &ProductString; Size = ProductString.Header.Size; + } else if (DescriptorNumber == DeviceDescriptor.SerialNumStrIndex) + { + Address = &SerialNumString; + Size = SerialNumString.Header.Size; + } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) + { + Address = &ManufNameString; + Size = ManufNameString.Header.Size; } break; -- cgit v1.2.3-18-g5258 From 35bbf80ba955bee9e432d4b2e11d479979599568 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 8 Feb 2012 01:16:56 -0500 Subject: adjusting descriptors - trying to prevent sketch and bootloader from grabbing different COM numbers on Windows --- bootloaders/caterina_LUFA/Caterina.hex | 261 ++++++++++++++++---------------- bootloaders/caterina_LUFA/Descriptors.c | 4 +- cores/arduino/USBDesc.h | 2 +- variants/leonardo/pins_arduino.h | 2 +- 4 files changed, 134 insertions(+), 135 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index fe12ee3..6835265 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000CBC400005AC0000079 +:1070200060C000005EC00000C4C400005AC0000080 :1070300058C0000056C0000054C0000052C00000FC :1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C @@ -9,10 +9,10 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EE5B +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6ED5A :1070C000FEE702C005900D92A03CB107D9F711E090 :1070D000A0ECB1E001C01D92A63DB107E1F78ED34F -:1070E000FFC68ECFF89410926F001092810010921C +:1070E000F8C68ECFF89410926F0010928100109223 :1070F00085001092840081E085BF15BE47985D9A97 :10710000289A0C94000008952091CA013091CB0177 :107110002F5F3F4F3093CB012093CA01932F37FF4E @@ -66,7 +66,7 @@ :10741000FF29E4918E2FEBDEDD2081F082E090E009 :10742000A0E0B0E0E80EF91E0A1F1B1FE092C601A3 :10743000F092C7010093C8011093C901DC2418C061 -:10744000D801C701B695A7959795879533D5CFDE17 +:10744000D801C701B695A795979587952CD5CFDE1E :1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA :10746000E092C601F092C7010093C8011093C901D0 :107470002197209709F0BECF7DC08090C6019090E3 @@ -80,7 +80,7 @@ :1074F0000093C8011093C90102C061DE582E7424A4 :1075000023C0E090C601F090C7010091C80110911E :10751000C90116950795F794E79451DE682FC701C6 -:10752000D1D48091C6019091C701A091C801B091BA +:10752000CAD48091C6019091C701A091C801B091C1 :10753000C9010296A11DB11D8093C6019093C70198 :10754000A093C801B093C901219704C055247724A2 :1075500044244394209709F0A5CF96E4691641F49A @@ -97,12 +97,12 @@ :107600003DCE823551F4E091C601F091C70105915C :107610001491812FECDD802F4CC0843421F5E09053 :10762000C601F090C7010091C8011091C9011695DB -:107630000795F794E794C3DD682FC70143D4809181 +:107630000795F794E794C3DD682FC7013CD4809188 :10764000C6019091C701A091C801B091C9010296ED :10765000A11DB11D8093C6019093C701A093C801DD :10766000B093C9010BCE843609F5E090C601F090C5 :10767000C7010091C8011091C901D801C701B69591 -:10768000A7959795879516D4B2DD82E090E0A0E0AB +:10768000A795979587950FD4B2DD82E090E0A0E0B2 :10769000B0E0E80EF91E0A1F1B1FE092C601F0922F :1076A000C7010093C8011093C90104C08B3111F0C8 :1076B0008FE39DDD83E08093E9009091E800809165 @@ -115,139 +115,138 @@ :107720006F905F904F9008959091CE01892F8F7741 :10773000813249F58091CF018032A1F0813219F573 :10774000913A09F58091E800877F8093E8008AE00C -:1077500091E067E070E0E5D18091E8008B7780935D +:1077500091E067E070E0DED18091E8008B77809364 :10776000E8000895913279F48091E800877F809352 -:10777000E8008AE091E067E070E037D28091E800AD -:107780008E778093E800089582E061EC42E08FD02C -:1077900083E061E842E18BD084E060E842E187C0A9 +:10777000E8008AE091E067E070E030D28091E800B4 +:107780008E778093E800089582E061EC42E088D033 +:1077900083E061E842E184D084E060E842E180C0B7 :1077A00084B7877F84BF88E10FB6F8948093600028 :1077B000109260000FBE20E880E090E00FB6F894D1 :1077C00020936100809361000FBE81E085BF92E04D :1077D00095BF3F9A209A559AE1E6F0E02083108207 :1077E00047985D9A289A109289008AEF80938800C2 -:1077F00090936F0083E080938100CAC088E10FB648 +:1077F00090936F0083E080938100C3C088E10FB64F :10780000F89480936000109260000FBEC9DF7894F6 -:107810000CC00CDD3DD38091C4019091C50181580D +:107810000CC00CDD36D38091C4019091C501815814 :107820009E4310F0109209016FDC809109018823BA :1078300081F78091E00081608093E00053DC80E07C :1078400090E00895FA01923049F0933061F0913060 -:1078500031F581E191E022E130E025C083E291E061 -:107860002EE330E020C0882329F481E691E024E073 -:1078700030E019C0813029F485E691E022E230E061 -:1078800012C0833029F489E891E02AE130E00BC08E -:10789000823029F485EA91E028E130E004C080E0FC -:1078A00090E020E030E091838083C90108958093C7 -:1078B000E9008091EB0081608093EB001092ED0075 -:1078C0006093EC004093ED008091EE00881F8827C4 -:1078D000881F08958091CE0188238CF403C08EB355 -:1078E0008823B1F08091E80082FFF9CF8091E80011 -:1078F0008B778093E80008958EB3882349F08091B8 -:10790000E80080FFF9CF8091E8008E778093E8004F -:107910000895EF92FF920F931F9345D04CD008ED3E -:1079200010E0F80180818F77808380818068808378 -:1079300080818F7D808319BC1EBA1092CC0180EEAD -:10794000E82EF12CF70180818B7F8083F801808104 -:107950008160808380E060E042E0A9DFE1EEF0E05A -:1079600080818E7F8083E2EEF0E080818160808381 -:10797000808188608083F70180818E7F8083F80119 -:107980008081806180831F910F91FF90EF90089517 -:10799000E7EDF0E08081816080838AE482BF81E04E -:1079A0008093CD01B6CFE8EDF0E080818E7F8083BB -:1079B0001092E20008951092DA001092E10008950A -:1079C0001F920F920FB60F9211242F933F934F9354 -:1079D0005F936F937F938F939F93AF93BF93EF9337 -:1079E000FF938091DA0080FF1BC08091D80080FF58 -:1079F00017C08091DA008E7F8093DA008091D900E1 -:107A000080FF0BC080E189BD82E189BD09B400FE21 -:107A1000FDCF81E08EBB3BD203C019BC1EBA37D26A -:107A20008091E10080FF17C08091E20080FF13C0C9 -:107A30008091E2008E7F8093E2008091E20080617D -:107A40008093E2008091D80080628093D80019BCB6 -:107A500085E08EBB1CD28091E10084FF2CC0809118 -:107A6000E20084FF28C080E189BD82E189BD09B4BC -:107A700000FEFDCF8091D8008F7D8093D80080914B -:107A8000E1008F7E8093E1008091E2008F7E809301 -:107A9000E2008091E20081608093E2008091CC015D -:107AA000882331F48091E30087FD02C081E001C0AA -:107AB00084E08EBBECD18091E10083FF21C08091F6 -:107AC000E20083FF1DC08091E100877F8093E10089 -:107AD00082E08EBB1092CC018091E1008E7F80937A -:107AE000E1008091E2008E7F8093E2008091E200CD -:107AF00080618093E20080E060E042E0D8DEC7D1A0 -:107B0000FF91EF91BF91AF919F918F917F916F9175 -:107B10005F914F913F912F910F900FBE0F901F904B -:107B200018959C014091D4015091D50146175707F3 -:107B300018F4F90190E044C06115710511F0AB0132 -:107B4000F8CF8091E8008E778093E80040E050E025 -:107B5000F0CF8EB3882309F444C0853009F443C0C4 -:107B60008091E80083FF02C081E008958091E800E1 -:107B700082FD31C08091E80080FF22C08091F30037 -:107B80009091F200782F60E0292F30E0262B372BE0 -:107B900007C081918093F100415050402F5F3F4FCB -:107BA0004115510519F02830310598F390E028303F -:107BB000310509F491E08091E8008E778093E80028 -:107BC0004115510531F6992321F605C08EB388235E -:107BD00041F0853041F08091E80082FFF7CF80E0EE -:107BE000089582E0089583E008959C016115710570 -:107BF00029F48091E8008B778093E800F90126C092 -:107C00008EB3882391F1853091F18091E80083FF54 -:107C100002C081E008958091E80082FFF1CF06C0A4 -:107C20008091F10081936150704059F02091F300F0 -:107C30008091F200322F20E090E0822B932B892B51 -:107C400079F78091E8008B778093E80061157105E2 -:107C5000B9F605C08EB3882341F0853041F080919C -:107C6000E80080FFF7CF80E0089582E0089583E088 -:107C700008950F931F93DF93CF9300D0CDB7DEB756 -:107C8000EEECF1E08091F100819381E0E63DF807B0 -:107C9000C9F74ADD8091E80083FFE4C08091CE01FE -:107CA0009091CF01953009F46DC0963040F4913039 -:107CB00081F1913070F0933009F0D4C02AC098302F -:107CC00009F4A3C0993009F4B2C0963009F0CAC0D3 -:107CD0007CC0803809F4C6C0823809F0C3C08091E6 -:107CE000D20187708093E9008091EB001092E90047 -:107CF0002091E800277F2093E80090E025E096950A -:107D000087952A95E1F781708093F1001092F10038 -:107D100087C0882319F0823009F0A4C08F718230A7 -:107D200009F0A0C08091D001882331F52091D201C3 -:107D3000277009F497C02093E9008091EB0080FF41 -:107D40001BC0933021F48091EB00806213C08091BE -:107D5000EB0080618093EB0081E090E002C0880F2F -:107D6000991F2A95E2F78093EA001092EA00809129 -:107D7000EB0088608093EB001092E9008091E800AE -:107D8000877F51C0882309F06DC01091D0011F7703 -:107D90000FB7F8948091E800877F8093E8009ADD20 -:107DA0008091E80080FFFCCF8091E3008078812BF8 -:107DB0008093E30080688093E300112311F482E054 -:107DC00001C083E08EBB0FBF4DC08058823008F0E9 -:107DD00049C08091D0019091D1016091D201AE0152 -:107DE0004F5F5F4F2FDDBC01009709F43BC08091CE -:107DF000E800877F8093E80089819A8192DE8091F4 -:107E0000E8008B778093E8002DC0803859F5809189 -:107E1000E800877F8093E8008091CC018093F10097 -:107E20008091E8008E778093E80054DD1BC08823A2 -:107E3000C9F49091D0019230A8F48091E800877F36 -:107E40008093E8009093CC0145DD8091CC0188239C -:107E500031F48091E30087FD02C081E001C084E03D -:107E60008EBB92DC8091E80083FF0AC08091EB001A -:107E700080628093EB008091E800877F8093E80028 -:107E80000F900F90CF91DF911F910F91089508955A -:107E90001F938EB3882361F01091E9001092E900DE -:107EA0008091E80083FF01C0E4DE17701093E900C1 -:107EB0001F910895F999FECF92BD81BDF89A992737 -:107EC00080B50895262FF999FECF1FBA92BD81BDC6 -:107ED00020BD0FB6F894FA9AF99A0FBE019608954C -:047EE000F894FFCF44 -:107EE4004341544552494E41000100000000000046 -:107EF40008120110010200000841230030010002B1 -:107F040001030109023E000201008032090400005D -:107F140001020201000524001001042402040524C6 -:107F2400060001070582030800FF09040100020A94 -:107F34000000000705040210000107058302100079 -:107F440001040309042203410072006400750069FE -:107F5400006E006F0020004C0065006F006E006131 -:107F640000720064006F0000001A0330003000301B -:107F74000030003000300030003000310034003573 -:107F840000320000001803410072006400750069AB -:107F9400006E006F0020004C004C00430000000005 +:10785000F9F481E191E022E130E01EC083E291E0A1 +:107860002EE330E019C0882329F481E691E024E07A +:1078700030E012C0813029F485E691E022E230E068 +:107880000BC0823029F485EA91E028E130E004C0A1 +:1078900080E090E020E030E091838083C90108958A +:1078A0008093E9008091EB0081608093EB0010925F +:1078B000ED006093EC004093ED008091EE00881F96 +:1078C0008827881F08958091CE0188238CF403C0F7 +:1078D0008EB38823B1F08091E80082FFF9CF8091C8 +:1078E000E8008B778093E80008958EB3882349F0F1 +:1078F0008091E80080FFF9CF8091E8008E77809337 +:10790000E8000895EF92FF920F931F9345D04CD05B +:1079100008ED10E0F80180818F7780838081806896 +:10792000808380818F7D808319BC1EBA1092CC0128 +:1079300080EEE82EF12CF70180818B7F8083F801A7 +:1079400080818160808380E060E042E0A9DFE1EE39 +:10795000F0E080818E7F8083E2EEF0E080818160C4 +:107960008083808188608083F70180818E7F80831F +:10797000F8018081806180831F910F91FF90EF90CB +:107980000895E7EDF0E08081816080838AE482BF22 +:1079900081E08093CD01B6CFE8EDF0E080818E7F6D +:1079A00080831092E20008951092DA001092E100B4 +:1079B00008951F920F920FB60F9211242F933F93A9 +:1079C0004F935F936F937F938F939F93AF93BF93E7 +:1079D000EF93FF938091DA0080FF1BC08091D80065 +:1079E00080FF17C08091DA008E7F8093DA0080914B +:1079F000D90080FF0BC080E189BD82E189BD09B457 +:107A000000FEFDCF81E08EBB3BD203C019BC1EBA85 +:107A100037D28091E10080FF17C08091E20080FFA3 +:107A200013C08091E2008E7F8093E2008091E2009B +:107A300080618093E2008091D80080628093D800BA +:107A400019BC85E08EBB1CD28091E10084FF2CC064 +:107A50008091E20084FF28C080E189BD82E189BD78 +:107A600009B400FEFDCF8091D8008F7D8093D800AF +:107A70008091E1008F7E8093E1008091E2008F7E13 +:107A80008093E2008091E20081608093E200809127 +:107A9000CC01882331F48091E30087FD02C081E0AE +:107AA00001C084E08EBBECD18091E10083FF21C056 +:107AB0008091E20083FF1DC08091E100877F809369 +:107AC000E10082E08EBB1092CC018091E1008E7FBC +:107AD0008093E1008091E2008E7F8093E2008091AC +:107AE000E20080618093E20080E060E042E0D8DE66 +:107AF000C7D1FF91EF91BF91AF919F918F917F91EE +:107B00006F915F914F913F912F910F900FBE0F900A +:107B10001F9018959C014091D4015091D5014617B2 +:107B2000570718F4F90190E044C06115710511F090 +:107B3000AB01F8CF8091E8008E778093E80040E0B9 +:107B400050E0F0CF8EB3882309F444C0853009F4A7 +:107B500043C08091E80083FF02C081E008958091D6 +:107B6000E80082FD31C08091E80080FF22C0809152 +:107B7000F3009091F200782F60E0292F30E0262B5F +:107B8000372B07C081918093F100415050402F5F07 +:107B90003F4F4115510519F02830310598F390E019 +:107BA0002830310509F491E08091E8008E778093C8 +:107BB000E8004115510531F6992321F605C08EB331 +:107BC000882341F0853041F08091E80082FFF7CFB3 +:107BD00080E0089582E0089583E008959C01611596 +:107BE000710529F48091E8008B778093E800F90112 +:107BF00026C08EB3882391F1853091F18091E80001 +:107C000083FF02C081E008958091E80082FFF1CFF8 +:107C100006C08091F10081936150704059F020912D +:107C2000F3008091F200322F20E090E0822B932B22 +:107C3000892B79F78091E8008B778093E8006115B4 +:107C40007105B9F605C08EB3882341F0853041F047 +:107C50008091E80080FFF7CF80E0089582E00895EA +:107C600083E008950F931F93DF93CF9300D0CDB798 +:107C7000DEB7EEECF1E08091F100819381E0E63D2A +:107C8000F807C9F751DD8091E80083FFE4C08091D7 +:107C9000CE019091CF01953009F46DC0963040F43B +:107CA000913081F1913070F0933009F0D4C02AC046 +:107CB000983009F4A3C0993009F4B2C0963009F0A5 +:107CC000CAC07CC0803809F4C6C0823809F0C3C07D +:107CD0008091D20187708093E9008091EB0010922F +:107CE000E9002091E800277F2093E80090E025E05C +:107CF000969587952A95E1F781708093F10010920F +:107D0000F10087C0882319F0823009F0A4C08F7178 +:107D1000823009F0A0C08091D001882331F52091F4 +:107D2000D201277009F497C02093E9008091EB00FD +:107D300080FF1BC0933021F48091EB00806213C060 +:107D40008091EB0080618093EB0081E090E002C0C5 +:107D5000880F991F2A95E2F78093EA001092EA00B3 +:107D60008091EB0088608093EB001092E900809195 +:107D7000E800877F51C0882309F06DC01091D001C1 +:107D80001F770FB7F8948091E800877F8093E80011 +:107D90009ADD8091E80080FFFCCF8091E30080783D +:107DA000812B8093E30080688093E300112311F41A +:107DB00082E001C083E08EBB0FBF4DC0805882308F +:107DC00008F049C08091D0019091D1016091D20119 +:107DD000AE014F5F5F4F36DDBC01009709F43BC039 +:107DE0008091E800877F8093E80089819A8192DE04 +:107DF0008091E8008B778093E8002DC0803859F59A +:107E00008091E800877F8093E8008091CC01809387 +:107E1000F1008091E8008E778093E80054DD1BC06C +:107E20008823C9F49091D0019230A8F48091E800A1 +:107E3000877F8093E8009093CC0145DD8091CC0151 +:107E4000882331F48091E30087FD02C081E001C006 +:107E500084E08EBB99DC8091E80083FF0AC08091AA +:107E6000EB0080628093EB008091E800877F809335 +:107E7000E8000F900F90CF91DF911F910F9108951F +:107E800008951F938EB3882361F01091E90010923A +:107E9000E9008091E80083FF01C0E4DE17701093D1 +:107EA000E9001F910895F999FECF92BD81BDF89A1E +:107EB000992780B50895262FF999FECF1FBA92BD54 +:107EC00081BD20BD0FB6F894FA9AF99A0FBE0196BB +:067ED0000895F894FFCFB5 +:107ED6004341544552494E41000100000000000054 +:107EE60008120110010200000841230230010002BD +:107EF60001000109023E000201008032090400006F +:107F060001020201000524001001042402040524D4 +:107F1600060001070582030800FF09040100020AA2 +:107F26000000000705040210000107058302100087 +:107F3600010403090422034100720064007500690C +:107F4600006E006F0020004C0065006F006E00613F +:107F560000720064006F0000001A03300030003029 +:107F66000030003000300030003000310034003581 +:107F760000320000001803410072006400750069B9 +:107F8600006E006F0020004C004C00430000000013 :040000030000700089 :00000001FF diff --git a/bootloaders/caterina_LUFA/Descriptors.c b/bootloaders/caterina_LUFA/Descriptors.c index fb376c1..50b595a 100755 --- a/bootloaders/caterina_LUFA/Descriptors.c +++ b/bootloaders/caterina_LUFA/Descriptors.c @@ -54,12 +54,12 @@ const USB_Descriptor_Device_t DeviceDescriptor = .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .VendorID = 0x2341, - .ProductID = 0x3000, + .ProductID = 0x3002, .ReleaseNumber = VERSION_BCD(00.01), .ManufacturerStrIndex = 0x02, .ProductStrIndex = 0x01, - .SerialNumStrIndex = 0x03, + .SerialNumStrIndex = NO_DESCRIPTOR, .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS }; diff --git a/cores/arduino/USBDesc.h b/cores/arduino/USBDesc.h index 549ed9e..7e4b4ba 100644 --- a/cores/arduino/USBDesc.h +++ b/cores/arduino/USBDesc.h @@ -60,7 +60,7 @@ #define IMANUFACTURER 1 #define IPRODUCT 2 -#define USB_PID_LEONARDO 0x0034 +#define USB_PID_LEONARDO 0x3003 #define USB_PID_MICRO 0x0035 #define USB_VID 0x2341 // arduino LLC vid #define USB_PID ARDUINO_MODEL_USB_PID diff --git a/variants/leonardo/pins_arduino.h b/variants/leonardo/pins_arduino.h index d8faddb..d4c6a0b 100644 --- a/variants/leonardo/pins_arduino.h +++ b/variants/leonardo/pins_arduino.h @@ -27,7 +27,7 @@ #include -#define ARDUINO_MODEL_USB_PID 0x0034 +#define ARDUINO_MODEL_USB_PID 0x3003 #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) #define TXLED0 PORTD |= (1<<5) -- cgit v1.2.3-18-g5258 From ac3aca0acf45f459c2c55e8e0894621aaaa4b4dd Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 13 Feb 2012 00:10:16 -0500 Subject: changed Leonardo bootloader and sketch PID values again (now 0x0701 for bootloader, 0x0801 for sketch) --- bootloaders/caterina_LUFA/Caterina.hex | 2 +- bootloaders/caterina_LUFA/Descriptors.c | 2 +- cores/arduino/USBDesc.h | 2 +- variants/leonardo/pins_arduino.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index 6835265..ffdb83e 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -237,7 +237,7 @@ :107EC00081BD20BD0FB6F894FA9AF99A0FBE0196BB :067ED0000895F894FFCFB5 :107ED6004341544552494E41000100000000000054 -:107EE60008120110010200000841230230010002BD +:107EE60008120110010200000841230107010002E7 :107EF60001000109023E000201008032090400006F :107F060001020201000524001001042402040524D4 :107F1600060001070582030800FF09040100020AA2 diff --git a/bootloaders/caterina_LUFA/Descriptors.c b/bootloaders/caterina_LUFA/Descriptors.c index 50b595a..b5b1aee 100755 --- a/bootloaders/caterina_LUFA/Descriptors.c +++ b/bootloaders/caterina_LUFA/Descriptors.c @@ -54,7 +54,7 @@ const USB_Descriptor_Device_t DeviceDescriptor = .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .VendorID = 0x2341, - .ProductID = 0x3002, + .ProductID = 0x0701, .ReleaseNumber = VERSION_BCD(00.01), .ManufacturerStrIndex = 0x02, diff --git a/cores/arduino/USBDesc.h b/cores/arduino/USBDesc.h index 7e4b4ba..5cd90ad 100644 --- a/cores/arduino/USBDesc.h +++ b/cores/arduino/USBDesc.h @@ -60,7 +60,7 @@ #define IMANUFACTURER 1 #define IPRODUCT 2 -#define USB_PID_LEONARDO 0x3003 +#define USB_PID_LEONARDO 0x0801 #define USB_PID_MICRO 0x0035 #define USB_VID 0x2341 // arduino LLC vid #define USB_PID ARDUINO_MODEL_USB_PID diff --git a/variants/leonardo/pins_arduino.h b/variants/leonardo/pins_arduino.h index d4c6a0b..753aa93 100644 --- a/variants/leonardo/pins_arduino.h +++ b/variants/leonardo/pins_arduino.h @@ -27,7 +27,7 @@ #include -#define ARDUINO_MODEL_USB_PID 0x3003 +#define ARDUINO_MODEL_USB_PID 0x0801 #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) #define TXLED0 PORTD |= (1<<5) -- cgit v1.2.3-18-g5258 From 924e5a48465cf8a9ba3af38e6cf4c2e1a2c0733c Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 13 Feb 2012 00:56:06 -0500 Subject: Leonardo auto-reset-and-upload changes for Windows (explanation below) On Windows COM port changes when board switched between bootloader and sketch. No way to prevent this so now Windows users have to select the upload port separate from the comm port. Also, handling of reset into bootloader was broken on Windows. Would occasionally leave the original COM port completely unusable. Changed the way this reset is initiated. Finally, had to add upload.disable.flushing=true flag to boards.txt so IDE wouldn't try to flush the original COM port after it disappeared. --- boards.txt | 3 ++- cores/arduino/CDC.cpp | 23 +++++++---------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/boards.txt b/boards.txt index 89035e6..7d25ab8 100644 --- a/boards.txt +++ b/boards.txt @@ -149,7 +149,8 @@ mega.build.variant=mega leonardo.name=Arduino Leonardo leonardo.upload.protocol=avr109 leonardo.upload.maximum_size=28672 -leonardo.upload.speed=1200 +leonardo.upload.speed=57600 +leonardo.upload.disable_flushing=true leonardo.bootloader.low_fuses=0xde leonardo.bootloader.high_fuses=0xd8 leonardo.bootloader.extended_fuses=0xcb diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 6dd1cbe..deda5c0 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -23,20 +23,6 @@ #if defined(USBCON) #ifdef CDC_ENABLED -void Reboot() -{ - USB.detach(); - cli(); - - // Reset the microcontroller to run the bootloader - wdt_enable(WDTO_15MS); - for (;;); -} - -// Define constants and variables for buffering incoming serial data. We're -// using a ring buffer (I think), in which head is the index of the location -// to which to write the next incoming character and tail is the index of the -// location from which to read. #if (RAMEND < 1000) #define SERIAL_BUFFER_SIZE 16 #else @@ -114,9 +100,14 @@ bool WEAK CDC_Setup(Setup& setup) if (CDC_SET_CONTROL_LINE_STATE == r) { - if (0 != _usbLineInfo.lineState && 1200 == _usbLineInfo.dwDTERate) // auto-reset is triggered when the port, already open at 1200 bps, is closed - Reboot(); _usbLineInfo.lineState = setup.wValueL; + // auto-reset into the bootloader is triggered when the port, already + // open at 1200 bps, is closed. this is the signal to start the watchdog + // with a relatively long period so it can finish housekeeping tasks + // like servicing endpoints before the sketch ends + if (0 != _usbLineInfo.lineState && 1200 == _usbLineInfo.dwDTERate) { + wdt_enable(WDTO_2S); + } return true; } } -- cgit v1.2.3-18-g5258 From b28e6c2f9cc344cb2ba4ca080b97ad39aa6e2d0d Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 14 Feb 2012 09:59:48 -0500 Subject: Leonardo bootloader jumps straight to sketch for a power-on reset. Disconnect programmer after burning bootloader to get the full effect. ICSP and JTAG programmers do a hardware reset after any reset condition, confusing the firmware a little. --- bootloaders/caterina_LUFA/Caterina.c | 11 +- bootloaders/caterina_LUFA/Caterina.hex | 273 +++++++++++++++++---------------- 2 files changed, 148 insertions(+), 136 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index 11404a7..b6fbd9b 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -110,6 +110,15 @@ int main(void) /* Watchdog may be configured with a 15 ms period so must disable it before doing anything else */ wdt_disable(); + /* Check the reason for the reset and act accordingly */ + uint8_t mcusr_state = MCUSR; // store the initial state of the Status register + MCUSR = 0; // clear all reset flags + // After a power-on reset skip the bootloader and jump straight to sketch + // if one exists. + if (mcusr_state & (1< 16000) + if (Timeout > 16000 && pgm_read_word(0) != 0xFFFF) RunBootloader = false; LEDPulse(); diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index ffdb83e..3657484 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000C4C400005AC0000080 +:1070200060C000005EC00000DCC400005AC0000068 :1070300058C0000056C0000054C0000052C00000FC :1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C @@ -9,10 +9,10 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6ED5A -:1070C000FEE702C005900D92A03CB107D9F711E090 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E067 +:1070C000FFE702C005900D92A03CB107D9F711E08F :1070D000A0ECB1E001C01D92A63DB107E1F78ED34F -:1070E000F8C68ECFF89410926F0010928100109223 +:1070E00010C78ECFF89410926F001092810010920A :1070F00085001092840081E085BF15BE47985D9A97 :10710000289A0C94000008952091CA013091CB0177 :107110002F5F3F4F3093CB012093CA01932F37FF4E @@ -66,7 +66,7 @@ :10741000FF29E4918E2FEBDEDD2081F082E090E009 :10742000A0E0B0E0E80EF91E0A1F1B1FE092C601A3 :10743000F092C7010093C8011093C901DC2418C061 -:10744000D801C701B695A795979587952CD5CFDE1E +:10744000D801C701B695A7959795879544D5CFDE06 :1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA :10746000E092C601F092C7010093C8011093C901D0 :107470002197209709F0BECF7DC08090C6019090E3 @@ -80,7 +80,7 @@ :1074F0000093C8011093C90102C061DE582E7424A4 :1075000023C0E090C601F090C7010091C80110911E :10751000C90116950795F794E79451DE682FC701C6 -:10752000CAD48091C6019091C701A091C801B091C1 +:10752000E2D48091C6019091C701A091C801B091A9 :10753000C9010296A11DB11D8093C6019093C70198 :10754000A093C801B093C901219704C055247724A2 :1075500044244394209709F0A5CF96E4691641F49A @@ -97,12 +97,12 @@ :107600003DCE823551F4E091C601F091C70105915C :107610001491812FECDD802F4CC0843421F5E09053 :10762000C601F090C7010091C8011091C9011695DB -:107630000795F794E794C3DD682FC7013CD4809188 +:107630000795F794E794C3DD682FC70154D4809170 :10764000C6019091C701A091C801B091C9010296ED :10765000A11DB11D8093C6019093C701A093C801DD :10766000B093C9010BCE843609F5E090C601F090C5 :10767000C7010091C8011091C901D801C701B69591 -:10768000A795979587950FD4B2DD82E090E0A0E0B2 +:10768000A7959795879527D4B2DD82E090E0A0E09A :10769000B0E0E80EF91E0A1F1B1FE092C601F0922F :1076A000C7010093C8011093C90104C08B3111F0C8 :1076B0008FE39DDD83E08093E9009091E800809165 @@ -115,138 +115,141 @@ :107720006F905F904F9008959091CE01892F8F7741 :10773000813249F58091CF018032A1F0813219F573 :10774000913A09F58091E800877F8093E8008AE00C -:1077500091E067E070E0DED18091E8008B77809364 +:1077500091E067E070E0F6D18091E8008B7780934C :10776000E8000895913279F48091E800877F809352 -:10777000E8008AE091E067E070E030D28091E800B4 -:107780008E778093E800089582E061EC42E088D033 -:1077900083E061E842E184D084E060E842E180C0B7 +:10777000E8008AE091E067E070E048D28091E8009C +:107780008E778093E800089582E061EC42E0A0D01B +:1077900083E061E842E19CD084E060E842E198C087 :1077A00084B7877F84BF88E10FB6F8948093600028 :1077B000109260000FBE20E880E090E00FB6F894D1 :1077C00020936100809361000FBE81E085BF92E04D :1077D00095BF3F9A209A559AE1E6F0E02083108207 :1077E00047985D9A289A109289008AEF80938800C2 -:1077F00090936F0083E080938100C3C088E10FB64F -:10780000F89480936000109260000FBEC9DF7894F6 -:107810000CC00CDD36D38091C4019091C501815814 -:107820009E4310F0109209016FDC809109018823BA -:1078300081F78091E00081608093E00053DC80E07C -:1078400090E00895FA01923049F0933061F0913060 -:10785000F9F481E191E022E130E01EC083E291E0A1 -:107860002EE330E019C0882329F481E691E024E07A -:1078700030E012C0813029F485E691E022E230E068 -:107880000BC0823029F485EA91E028E130E004C0A1 -:1078900080E090E020E030E091838083C90108958A -:1078A0008093E9008091EB0081608093EB0010925F -:1078B000ED006093EC004093ED008091EE00881F96 -:1078C0008827881F08958091CE0188238CF403C0F7 -:1078D0008EB38823B1F08091E80082FFF9CF8091C8 -:1078E000E8008B778093E80008958EB3882349F0F1 -:1078F0008091E80080FFF9CF8091E8008E77809337 -:10790000E8000895EF92FF920F931F9345D04CD05B -:1079100008ED10E0F80180818F7780838081806896 -:10792000808380818F7D808319BC1EBA1092CC0128 -:1079300080EEE82EF12CF70180818B7F8083F801A7 -:1079400080818160808380E060E042E0A9DFE1EE39 -:10795000F0E080818E7F8083E2EEF0E080818160C4 -:107960008083808188608083F70180818E7F80831F -:10797000F8018081806180831F910F91FF90EF90CB -:107980000895E7EDF0E08081816080838AE482BF22 -:1079900081E08093CD01B6CFE8EDF0E080818E7F6D -:1079A00080831092E20008951092DA001092E100B4 -:1079B00008951F920F920FB60F9211242F933F93A9 -:1079C0004F935F936F937F938F939F93AF93BF93E7 -:1079D000EF93FF938091DA0080FF1BC08091D80065 -:1079E00080FF17C08091DA008E7F8093DA0080914B -:1079F000D90080FF0BC080E189BD82E189BD09B457 -:107A000000FEFDCF81E08EBB3BD203C019BC1EBA85 -:107A100037D28091E10080FF17C08091E20080FFA3 -:107A200013C08091E2008E7F8093E2008091E2009B -:107A300080618093E2008091D80080628093D800BA -:107A400019BC85E08EBB1CD28091E10084FF2CC064 -:107A50008091E20084FF28C080E189BD82E189BD78 -:107A600009B400FEFDCF8091D8008F7D8093D800AF -:107A70008091E1008F7E8093E1008091E2008F7E13 -:107A80008093E2008091E20081608093E200809127 -:107A9000CC01882331F48091E30087FD02C081E0AE -:107AA00001C084E08EBBECD18091E10083FF21C056 -:107AB0008091E20083FF1DC08091E100877F809369 -:107AC000E10082E08EBB1092CC018091E1008E7FBC -:107AD0008093E1008091E2008E7F8093E2008091AC -:107AE000E20080618093E20080E060E042E0D8DE66 -:107AF000C7D1FF91EF91BF91AF919F918F917F91EE -:107B00006F915F914F913F912F910F900FBE0F900A -:107B10001F9018959C014091D4015091D5014617B2 -:107B2000570718F4F90190E044C06115710511F090 -:107B3000AB01F8CF8091E8008E778093E80040E0B9 -:107B400050E0F0CF8EB3882309F444C0853009F4A7 -:107B500043C08091E80083FF02C081E008958091D6 -:107B6000E80082FD31C08091E80080FF22C0809152 -:107B7000F3009091F200782F60E0292F30E0262B5F -:107B8000372B07C081918093F100415050402F5F07 -:107B90003F4F4115510519F02830310598F390E019 -:107BA0002830310509F491E08091E8008E778093C8 -:107BB000E8004115510531F6992321F605C08EB331 -:107BC000882341F0853041F08091E80082FFF7CFB3 -:107BD00080E0089582E0089583E008959C01611596 -:107BE000710529F48091E8008B778093E800F90112 -:107BF00026C08EB3882391F1853091F18091E80001 -:107C000083FF02C081E008958091E80082FFF1CFF8 -:107C100006C08091F10081936150704059F020912D -:107C2000F3008091F200322F20E090E0822B932B22 -:107C3000892B79F78091E8008B778093E8006115B4 -:107C40007105B9F605C08EB3882341F0853041F047 -:107C50008091E80080FFF7CF80E0089582E00895EA -:107C600083E008950F931F93DF93CF9300D0CDB798 -:107C7000DEB7EEECF1E08091F100819381E0E63D2A -:107C8000F807C9F751DD8091E80083FFE4C08091D7 -:107C9000CE019091CF01953009F46DC0963040F43B -:107CA000913081F1913070F0933009F0D4C02AC046 -:107CB000983009F4A3C0993009F4B2C0963009F0A5 -:107CC000CAC07CC0803809F4C6C0823809F0C3C07D -:107CD0008091D20187708093E9008091EB0010922F -:107CE000E9002091E800277F2093E80090E025E05C -:107CF000969587952A95E1F781708093F10010920F -:107D0000F10087C0882319F0823009F0A4C08F7178 -:107D1000823009F0A0C08091D001882331F52091F4 -:107D2000D201277009F497C02093E9008091EB00FD -:107D300080FF1BC0933021F48091EB00806213C060 -:107D40008091EB0080618093EB0081E090E002C0C5 -:107D5000880F991F2A95E2F78093EA001092EA00B3 -:107D60008091EB0088608093EB001092E900809195 -:107D7000E800877F51C0882309F06DC01091D001C1 -:107D80001F770FB7F8948091E800877F8093E80011 -:107D90009ADD8091E80080FFFCCF8091E30080783D -:107DA000812B8093E30080688093E300112311F41A -:107DB00082E001C083E08EBB0FBF4DC0805882308F -:107DC00008F049C08091D0019091D1016091D20119 -:107DD000AE014F5F5F4F36DDBC01009709F43BC039 -:107DE0008091E800877F8093E80089819A8192DE04 -:107DF0008091E8008B778093E8002DC0803859F59A -:107E00008091E800877F8093E8008091CC01809387 -:107E1000F1008091E8008E778093E80054DD1BC06C -:107E20008823C9F49091D0019230A8F48091E800A1 -:107E3000877F8093E8009093CC0145DD8091CC0151 -:107E4000882331F48091E30087FD02C081E001C006 -:107E500084E08EBB99DC8091E80083FF0AC08091AA -:107E6000EB0080628093EB008091E800877F809335 -:107E7000E8000F900F90CF91DF911F910F9108951F -:107E800008951F938EB3882361F01091E90010923A -:107E9000E9008091E80083FF01C0E4DE17701093D1 -:107EA000E9001F910895F999FECF92BD81BDF89A1E -:107EB000992780B50895262FF999FECF1FBA92BD54 -:107EC00081BD20BD0FB6F894FA9AF99A0FBE0196BB -:067ED0000895F894FFCFB5 -:107ED6004341544552494E41000100000000000054 -:107EE60008120110010200000841230107010002E7 -:107EF60001000109023E000201008032090400006F -:107F060001020201000524001001042402040524D4 -:107F1600060001070582030800FF09040100020AA2 -:107F26000000000705040210000107058302100087 -:107F3600010403090422034100720064007500690C -:107F4600006E006F0020004C0065006F006E00613F -:107F560000720064006F0000001A03300030003029 -:107F66000030003000300030003000310034003581 -:107F760000320000001803410072006400750069B9 -:107F8600006E006F0020004C004C00430000000013 +:1077F00090936F0083E080938100DBC0CF93DF9391 +:1078000088E10FB6F89480936000109260000FBE7C +:1078100084B714BE80FF08C0E0E0F0E08591949149 +:107820008F5F9F4F09F05EDCBBDF7894E0E0F0E013 +:10783000C591D49110C0FADC3CD38091C4019091E1 +:10784000C50181589E4330F08FEFCF3FD80711F02C +:107850001092090159DC80910901882361F7809118 +:10786000E00081608093E0003DDC80E090E0DF910B +:10787000CF910895FA01923049F0933061F0913040 +:10788000F9F481E191E022E130E01EC083E291E071 +:107890002EE330E019C0882329F481E691E024E04A +:1078A00030E012C0813029F485E691E022E230E038 +:1078B0000BC0823029F485EA91E028E130E004C071 +:1078C00080E090E020E030E091838083C90108955A +:1078D0008093E9008091EB0081608093EB0010922F +:1078E000ED006093EC004093ED008091EE00881F66 +:1078F0008827881F08958091CE0188238CF403C0C7 +:107900008EB38823B1F08091E80082FFF9CF809197 +:10791000E8008B778093E80008958EB3882349F0C0 +:107920008091E80080FFF9CF8091E8008E77809306 +:10793000E8000895EF92FF920F931F9345D04CD02B +:1079400008ED10E0F80180818F7780838081806866 +:10795000808380818F7D808319BC1EBA1092CC01F8 +:1079600080EEE82EF12CF70180818B7F8083F80177 +:1079700080818160808380E060E042E0A9DFE1EE09 +:10798000F0E080818E7F8083E2EEF0E08081816094 +:107990008083808188608083F70180818E7F8083EF +:1079A000F8018081806180831F910F91FF90EF909B +:1079B0000895E7EDF0E08081816080838AE482BFF2 +:1079C00081E08093CD01B6CFE8EDF0E080818E7F3D +:1079D00080831092E20008951092DA001092E10084 +:1079E00008951F920F920FB60F9211242F933F9379 +:1079F0004F935F936F937F938F939F93AF93BF93B7 +:107A0000EF93FF938091DA0080FF1BC08091D80034 +:107A100080FF17C08091DA008E7F8093DA0080911A +:107A2000D90080FF0BC080E189BD82E189BD09B426 +:107A300000FEFDCF81E08EBB3BD203C019BC1EBA55 +:107A400037D28091E10080FF17C08091E20080FF73 +:107A500013C08091E2008E7F8093E2008091E2006B +:107A600080618093E2008091D80080628093D8008A +:107A700019BC85E08EBB1CD28091E10084FF2CC034 +:107A80008091E20084FF28C080E189BD82E189BD48 +:107A900009B400FEFDCF8091D8008F7D8093D8007F +:107AA0008091E1008F7E8093E1008091E2008F7EE3 +:107AB0008093E2008091E20081608093E2008091F7 +:107AC000CC01882331F48091E30087FD02C081E07E +:107AD00001C084E08EBBECD18091E10083FF21C026 +:107AE0008091E20083FF1DC08091E100877F809339 +:107AF000E10082E08EBB1092CC018091E1008E7F8C +:107B00008093E1008091E2008E7F8093E20080917B +:107B1000E20080618093E20080E060E042E0D8DE35 +:107B2000C7D1FF91EF91BF91AF919F918F917F91BD +:107B30006F915F914F913F912F910F900FBE0F90DA +:107B40001F9018959C014091D4015091D501461782 +:107B5000570718F4F90190E044C06115710511F060 +:107B6000AB01F8CF8091E8008E778093E80040E089 +:107B700050E0F0CF8EB3882309F444C0853009F477 +:107B800043C08091E80083FF02C081E008958091A6 +:107B9000E80082FD31C08091E80080FF22C0809122 +:107BA000F3009091F200782F60E0292F30E0262B2F +:107BB000372B07C081918093F100415050402F5FD7 +:107BC0003F4F4115510519F02830310598F390E0E9 +:107BD0002830310509F491E08091E8008E77809398 +:107BE000E8004115510531F6992321F605C08EB301 +:107BF000882341F0853041F08091E80082FFF7CF83 +:107C000080E0089582E0089583E008959C01611565 +:107C1000710529F48091E8008B778093E800F901E1 +:107C200026C08EB3882391F1853091F18091E800D0 +:107C300083FF02C081E008958091E80082FFF1CFC8 +:107C400006C08091F10081936150704059F02091FD +:107C5000F3008091F200322F20E090E0822B932BF2 +:107C6000892B79F78091E8008B778093E800611584 +:107C70007105B9F605C08EB3882341F0853041F017 +:107C80008091E80080FFF7CF80E0089582E00895BA +:107C900083E008950F931F93DF93CF9300D0CDB768 +:107CA000DEB7EEECF1E08091F100819381E0E63DFA +:107CB000F807C9F739DD8091E80083FFE4C08091BF +:107CC000CE019091CF01953009F46DC0963040F40B +:107CD000913081F1913070F0933009F0D4C02AC016 +:107CE000983009F4A3C0993009F4B2C0963009F075 +:107CF000CAC07CC0803809F4C6C0823809F0C3C04D +:107D00008091D20187708093E9008091EB001092FE +:107D1000E9002091E800277F2093E80090E025E02B +:107D2000969587952A95E1F781708093F1001092DE +:107D3000F10087C0882319F0823009F0A4C08F7148 +:107D4000823009F0A0C08091D001882331F52091C4 +:107D5000D201277009F497C02093E9008091EB00CD +:107D600080FF1BC0933021F48091EB00806213C030 +:107D70008091EB0080618093EB0081E090E002C095 +:107D8000880F991F2A95E2F78093EA001092EA0083 +:107D90008091EB0088608093EB001092E900809165 +:107DA000E800877F51C0882309F06DC01091D00191 +:107DB0001F770FB7F8948091E800877F8093E800E1 +:107DC0009ADD8091E80080FFFCCF8091E30080780D +:107DD000812B8093E30080688093E300112311F4EA +:107DE00082E001C083E08EBB0FBF4DC0805882305F +:107DF00008F049C08091D0019091D1016091D201E9 +:107E0000AE014F5F5F4F36DDBC01009709F43BC008 +:107E10008091E800877F8093E80089819A8192DED3 +:107E20008091E8008B778093E8002DC0803859F569 +:107E30008091E800877F8093E8008091CC01809357 +:107E4000F1008091E8008E778093E80054DD1BC03C +:107E50008823C9F49091D0019230A8F48091E80071 +:107E6000877F8093E8009093CC0145DD8091CC0121 +:107E7000882331F48091E30087FD02C081E001C0D6 +:107E800084E08EBB81DC8091E80083FF0AC0809192 +:107E9000EB0080628093EB008091E800877F809305 +:107EA000E8000F900F90CF91DF911F910F910895EF +:107EB00008951F938EB3882361F01091E90010920A +:107EC000E9008091E80083FF01C0E4DE17701093A1 +:107ED000E9001F910895F999FECF92BD81BDF89AEE +:107EE000992780B50895262FF999FECF1FBA92BD24 +:107EF00081BD20BD0FB6F894FA9AF99A0FBE01968B +:067F00000895F894FFCF84 +:107F06004341544552494E41000100000000000023 +:107F160008120110010200000841230107010002B6 +:107F260001000109023E000201008032090400003E +:107F360001020201000524001001042402040524A4 +:107F4600060001070582030800FF09040100020A72 +:107F56000000000705040210000107058302100057 +:107F660001040309042203410072006400750069DC +:107F7600006E006F0020004C0065006F006E00610F +:107F860000720064006F0000001A033000300030F9 +:107F96000030003000300030003000310034003551 +:107FA6000032000000180341007200640075006989 +:107FB600006E006F0020004C004C004300000000E3 :040000030000700089 :00000001FF -- cgit v1.2.3-18-g5258 From 19c44dd5fd671823610f6b6277874c956cced90e Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 14 Feb 2012 10:00:55 -0500 Subject: Changed Leonardo fuses to select longer clock startup time. Done with the aim of discriminating more reliably between reset sources. --- boards.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards.txt b/boards.txt index 7d25ab8..740671c 100644 --- a/boards.txt +++ b/boards.txt @@ -151,7 +151,7 @@ leonardo.upload.protocol=avr109 leonardo.upload.maximum_size=28672 leonardo.upload.speed=57600 leonardo.upload.disable_flushing=true -leonardo.bootloader.low_fuses=0xde +leonardo.bootloader.low_fuses=0xff leonardo.bootloader.high_fuses=0xd8 leonardo.bootloader.extended_fuses=0xcb leonardo.bootloader.path=caterina_LUFA -- cgit v1.2.3-18-g5258 From 79481252081da0bdc4501cf039c060efcdf85c95 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 14 Feb 2012 12:17:30 -0500 Subject: Leonardo now checks whether bootloader should be run after a WDT event. Before the sketch initiates an auto-reset for upload it pokes a magic word into a specific RAM address. On starting the bootloader checks this address. If it finds the magic word it knows the bootloader code should run. If not it jumps straight back to sketch. Test in a sketch by adding to setup(): wdt_enable(WDTO_2S); Sketch should upload, start, run for two seconds, WDT, and sketch should restart (not bootloader). Had to cut out unused descriptor code to make the bootloader still fit in 4k. --- bootloaders/caterina_LUFA/Caterina.c | 8 + bootloaders/caterina_LUFA/Caterina.h | 2 +- bootloaders/caterina_LUFA/Caterina.hex | 364 ++++++++++++++++---------------- bootloaders/caterina_LUFA/Descriptors.c | 12 +- cores/arduino/CDC.cpp | 3 +- 5 files changed, 200 insertions(+), 189 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index b6fbd9b..d4dbb7b 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -64,6 +64,9 @@ uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse /* Bootloader timeout timer */ uint16_t Timeout = 0; +uint16_t bootKey = 0x7777; +volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0A00; + void StartSketch(void) { cli(); @@ -118,6 +121,11 @@ int main(void) if (mcusr_state & (1< Date: Wed, 22 Feb 2012 22:33:44 -0500 Subject: shortened the watchdog period for resetting Leonardo from 2 s to 250 ms. Reset into bootloader is much snappier. --- cores/arduino/CDC.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 0fa06bc..7f33a6e 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -107,7 +107,7 @@ bool WEAK CDC_Setup(Setup& setup) // like servicing endpoints before the sketch ends if (0 != _usbLineInfo.lineState && 1200 == _usbLineInfo.dwDTERate) { *(uint16_t *)0x0A00 = 0x7777; - wdt_enable(WDTO_2S); + wdt_enable(WDTO_250MS); } return true; } -- cgit v1.2.3-18-g5258 From 73066a4ca24699820580f15520bf07d3f34068a2 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 27 Feb 2012 17:41:38 +0100 Subject: Autoreset 1200 bps fix. --- cores/arduino/CDC.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 7f33a6e..6d3929e 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -101,13 +101,26 @@ bool WEAK CDC_Setup(Setup& setup) if (CDC_SET_CONTROL_LINE_STATE == r) { _usbLineInfo.lineState = setup.wValueL; + // auto-reset into the bootloader is triggered when the port, already // open at 1200 bps, is closed. this is the signal to start the watchdog // with a relatively long period so it can finish housekeeping tasks // like servicing endpoints before the sketch ends - if (0 != _usbLineInfo.lineState && 1200 == _usbLineInfo.dwDTERate) { + + // We check DTR state to determine if host port is open (bit 0 of lineState). + // Serial1.print(">"); Serial1.println(_usbLineInfo.lineState, HEX); + if ((_usbLineInfo.lineState & 0x01) == 0 && _usbLineInfo.dwDTERate == 1200) { *(uint16_t *)0x0A00 = 0x7777; wdt_enable(WDTO_250MS); + } else { + // Most OSs do some intermediate steps when configuring ports and DTR can + // twiggle more than once before stabilizing. + // To avoid spurious resets we set the watchdog to 250ms and eventually + // cancel if DTR goes back high. + + wdt_disable(); + wdt_reset(); + *(uint16_t *)0x0A00 = 0x0; } return true; } @@ -202,4 +215,4 @@ size_t Serial_::write(uint8_t c) Serial_ Serial; #endif -#endif /* if defined(USBCON) */ \ No newline at end of file +#endif /* if defined(USBCON) */ -- cgit v1.2.3-18-g5258 From c8ca7f96366d53b139ded479bcc690332eb8382d Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 1 Mar 2012 08:51:16 -0500 Subject: changed auto-reset logic for Leonardo. only do WDT manipulation if the port is opened at 1200 bps. (Dave Mellis) --- cores/arduino/CDC.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 6d3929e..94faf2e 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -106,21 +106,22 @@ bool WEAK CDC_Setup(Setup& setup) // open at 1200 bps, is closed. this is the signal to start the watchdog // with a relatively long period so it can finish housekeeping tasks // like servicing endpoints before the sketch ends - - // We check DTR state to determine if host port is open (bit 0 of lineState). - // Serial1.print(">"); Serial1.println(_usbLineInfo.lineState, HEX); - if ((_usbLineInfo.lineState & 0x01) == 0 && _usbLineInfo.dwDTERate == 1200) { - *(uint16_t *)0x0A00 = 0x7777; - wdt_enable(WDTO_250MS); - } else { - // Most OSs do some intermediate steps when configuring ports and DTR can - // twiggle more than once before stabilizing. - // To avoid spurious resets we set the watchdog to 250ms and eventually - // cancel if DTR goes back high. - - wdt_disable(); - wdt_reset(); - *(uint16_t *)0x0A00 = 0x0; + if (1200 == _usbLineInfo.dwDTERate) { + // We check DTR state to determine if host port is open (bit 0 of lineState). + // Serial1.print(">"); Serial1.println(_usbLineInfo.lineState, HEX); + if ((_usbLineInfo.lineState & 0x01) == 0) { + *(uint16_t *)0x0A00 = 0x7777; + wdt_enable(WDTO_250MS); + } else { + // Most OSs do some intermediate steps when configuring ports and DTR can + // twiggle more than once before stabilizing. + // To avoid spurious resets we set the watchdog to 250ms and eventually + // cancel if DTR goes back high. + + wdt_disable(); + wdt_reset(); + *(uint16_t *)0x0A00 = 0x0; + } } return true; } -- cgit v1.2.3-18-g5258 From 351817af47ce8bb7b288407cf3ea74562b259748 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 1 Mar 2012 08:51:47 -0500 Subject: reduced Caterina timeout to 8 seconds from 16 --- bootloaders/caterina_LUFA/Caterina.c | 2 +- bootloaders/caterina_LUFA/Caterina.hex | 277 ++++++++++++++++----------------- 2 files changed, 139 insertions(+), 140 deletions(-) diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c index d4dbb7b..c8e82a9 100755 --- a/bootloaders/caterina_LUFA/Caterina.c +++ b/bootloaders/caterina_LUFA/Caterina.c @@ -138,7 +138,7 @@ int main(void) CDC_Task(); USB_USBTask(); /* Time out and start the sketch if one is present */ - if (Timeout > 16000 && pgm_read_word(0) != 0xFFFF) + if (Timeout > 8000) RunBootloader = false; LEDPulse(); diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex index 7e19013..98cf01a 100644 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ b/bootloaders/caterina_LUFA/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000F8C400005AC000004C +:1070200060C000005EC00000ECC400005AC0000058 :1070300058C0000056C0000054C0000052C00000FC :1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C @@ -9,10 +9,10 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEE35C +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E265 :1070C000FFE702C005900D92A83AB107D9F711E089 :1070D000A8EAB1E001C01D92AE3BB107E1F78ED343 -:1070E0002CC78ECFF89410926F00109281001092EE +:1070E00020C78ECFF89410926F00109281001092FA :1070F00085001092840081E085BF15BE47985D9A97 :10710000289A0C94000008952091B2013091B301A7 :107110002F5F3F4F3093B3012093B201932F37FF7E @@ -66,7 +66,7 @@ :10741000FF29E4918E2FEBDEDD2081F082E090E009 :10742000A0E0B0E0E80EF91E0A1F1B1FE092AE01BB :10743000F092AF010093B0011093B101DC2418C0A9 -:10744000D801C701B695A7959795879560D5CFDEEA +:10744000D801C701B695A7959795879554D5CFDEF6 :1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA :10746000E092AE01F092AF010093B0011093B10130 :107470002197209709F0BECF7DC08090AE019090FB @@ -80,7 +80,7 @@ :1074F0000093B0011093B10102C061DE582E7424D4 :1075000023C0E090AE01F090AF010091B001109166 :10751000B10116950795F794E79451DE682FC701DE -:10752000FED48091AE019091AF01A091B001B091D5 +:10752000F2D48091AE019091AF01A091B001B091E1 :10753000B1010296A11DB11D8093AE019093AF01E0 :10754000A093B001B093B101219704C055247724D2 :1075500044244394209709F0A5CF96E4691641F49A @@ -97,12 +97,12 @@ :107600003DCE823551F4E091AE01F091AF0105918C :107610001491812FECDD802F4CC0843421F5E09053 :10762000AE01F090AF010091B0011091B10116953B -:107630000795F794E794C3DD682FC70170D4809154 +:107630000795F794E794C3DD682FC70164D4809160 :10764000AE019091AF01A091B001B091B10102964D :10765000A11DB11D8093AE019093AF01A093B00125 :10766000B093B1010BCE843609F5E090AE01F090F5 :10767000AF010091B0011091B101D801C701B695D9 -:10768000A7959795879543D4B2DD82E090E0A0E07E +:10768000A7959795879537D4B2DD82E090E0A0E08A :10769000B0E0E80EF91E0A1F1B1FE092AE01F09247 :1076A000AF010093B0011093B10104C08B3111F010 :1076B0008FE39DDD83E08093E9009091E800809165 @@ -115,143 +115,142 @@ :107720006F905F904F9008959091B601892F8F7759 :10773000813249F58091B7018032A1F0813219F58B :10774000913A09F58091E800877F8093E8008EE008 -:1077500091E067E070E012D28091E8008B7780932F +:1077500091E067E070E006D28091E8008B7780933B :10776000E8000895913279F48091E800877F809352 -:10777000E8008EE091E067E070E064D28091E8007C -:107780008E778093E800089582E061EC42E0BCD0FF -:1077900083E061E842E1B8D084E060E842E1B4C04F +:10777000E8008EE091E067E070E058D28091E80088 +:107780008E778093E800089582E061EC42E0B0D00B +:1077900083E061E842E1ACD084E060E842E1A8C067 :1077A00084B7877F84BF88E10FB6F8948093600028 :1077B000109260000FBE20E880E090E00FB6F894D1 :1077C00020936100809361000FBE81E085BF92E04D :1077D00095BF3F9A209A559AE1E6F0E02083108207 :1077E00047985D9A289A109289008AEF80938800C2 -:1077F00090936F0083E080938100F7C01F93CF9335 -:10780000DF9388E10FB6F8948093600010926000D7 -:107810000FBE84B714BE182F10FF08C0E0E0F0E0E0 -:10782000859194918F5F9F4F09F05CDC2091000A55 -:107830003091010A1092010A1092000A13FF0FC042 -:107840008091090190910A012817390741F0E0E081 -:10785000F0E0859194918F5F9F4F09F043DCA0DFAA -:107860007894E0E0F0E0C591D49110C0DFDC3DD326 -:107870008091AC019091AD0181589E4330F08FEF23 -:10788000CF3FD80711F010920D013EDC80910D0121 -:10789000882361F78091E00081608093E00022DC22 -:1078A00080E090E0DF91CF911F910895FA0192302E -:1078B00049F0933061F09130F9F485E191E022E1F3 -:1078C00030E01EC087E291E02EE330E019C088234B -:1078D00029F485E691E024E030E012C0813029F4FB -:1078E00089E691E022E230E00BC0823029F48DE895 -:1078F00091E028E130E004C080E090E020E030E05A -:1079000091838083C90108958093E9008091EB0001 -:1079100081608093EB001092ED006093EC00409347 -:10792000ED008091EE00881F8827881F08958091C0 -:10793000B60188238CF403C08EB38823B1F0809104 -:10794000E80082FFF9CF8091E8008B778093E80010 -:1079500008958EB3882349F08091E80080FFF9CF25 -:107960008091E8008E778093E8000895EF92FF926F -:107970000F931F9345D04CD008ED10E0F8018081A3 -:107980008F77808380818068808380818F7D8083F2 -:1079900019BC1EBA1092B40180EEE82EF12CF7014A -:1079A00080818B7F8083F80180818160808380E08B -:1079B00060E042E0A9DFE1EEF0E080818E7F80832D -:1079C000E2EEF0E080818160808380818860808346 -:1079D000F70180818E7F8083F801808180618083C0 -:1079E0001F910F91FF90EF900895E7EDF0E08081F7 -:1079F000816080838AE482BF81E08093B501B6CF45 -:107A0000E8EDF0E080818E7F80831092E20008959F -:107A10001092DA001092E10008951F920F920FB6B3 -:107A20000F9211242F933F934F935F936F937F9304 -:107A30008F939F93AF93BF93EF93FF938091DA005F -:107A400080FF1BC08091D80080FF17C08091DA00B2 -:107A50008E7F8093DA008091D90080FF0BC080E197 -:107A600089BD82E189BD09B400FEFDCF81E08EBBF6 -:107A70003BD203C019BC1EBA37D28091E10080FF0F -:107A800017C08091E20080FF13C08091E2008E7FDA -:107A90008093E2008091E20080618093E200809117 -:107AA000D80080628093D80019BC85E08EBB1CD2C0 -:107AB0008091E10084FF2CC08091E20084FF28C007 -:107AC00080E189BD82E189BD09B400FEFDCF8091CE -:107AD000D8008F7D8093D8008091E1008F7E8093C5 -:107AE000E1008091E2008F7E8093E2008091E200CD -:107AF00081608093E2008091B401882331F4809109 -:107B0000E30087FD02C081E001C084E08EBBECD1C0 -:107B10008091E10083FF21C08091E20083FF1DC0BE -:107B20008091E100877F8093E10082E08EBB10921C -:107B3000B4018091E1008E7F8093E1008091E200AA -:107B40008E7F8093E2008091E20080618093E2006A -:107B500080E060E042E0D8DEC7D1FF91EF91BF91B5 -:107B6000AF919F918F917F916F915F914F913F91D5 -:107B70002F910F900FBE0F901F9018959C01409170 -:107B8000BC015091BD014617570718F4F90190E068 -:107B900044C06115710511F0AB01F8CF8091E80088 -:107BA0008E778093E80040E050E0F0CF8EB38823DA -:107BB00009F444C0853009F443C08091E80083FF94 -:107BC00002C081E008958091E80082FD31C080917B -:107BD000E80080FF22C08091F3009091F200782F9E -:107BE00060E0292F30E0262B372B07C0819180934E -:107BF000F100415050402F5F3F4F4115510519F0A2 -:107C00002830310598F390E02830310509F491E0EF -:107C10008091E8008E778093E8004115510531F698 -:107C2000992321F605C08EB3882341F0853041F0B9 -:107C30008091E80082FFF7CF80E0089582E0089508 -:107C400083E008959C016115710529F48091E80095 -:107C50008B778093E800F90126C08EB3882391F1D9 -:107C6000853091F18091E80083FF02C081E00895A2 -:107C70008091E80082FFF1CF06C08091F1008193EE -:107C80006150704059F02091F3008091F200322F42 -:107C900020E090E0822B932B892B79F78091E800EC -:107CA0008B778093E80061157105B9F605C08EB336 -:107CB000882341F0853041F08091E80080FFF7CFC4 -:107CC00080E0089582E0089583E008950F931F9364 -:107CD000DF93CF9300D0CDB7DEB7E6EBF1E0809134 -:107CE000F100819381E0EE3BF807C9F71DDD80913B -:107CF000E80083FFE4C08091B6019091B701953010 -:107D000009F46DC0963040F4913081F1913070F0FB -:107D1000933009F0D4C02AC0983009F4A3C0993038 -:107D200009F4B2C0963009F0CAC07CC0803809F4AA -:107D3000C6C0823809F0C3C08091BA0187708093B1 -:107D4000E9008091EB001092E9002091E800277F84 -:107D50002093E80090E025E0969587952A95E1F735 -:107D600081708093F1001092F10087C0882319F090 -:107D7000823009F0A4C08F71823009F0A0C08091D8 -:107D8000B801882331F52091BA01277009F497C012 -:107D90002093E9008091EB0080FF1BC0933021F419 -:107DA0008091EB00806213C08091EB008061809332 -:107DB000EB0081E090E002C0880F991F2A95E2F75E -:107DC0008093EA001092EA008091EB008860809333 -:107DD000EB001092E9008091E800877F51C0882372 -:107DE00009F06DC01091B8011F770FB7F89480911A -:107DF000E800877F8093E8009ADD8091E80080FFAB -:107E0000FCCF8091E3008078812B8093E300806831 -:107E10008093E300112311F482E001C083E08EBB64 -:107E20000FBF4DC08058823008F049C08091B80122 -:107E30009091B9016091BA01AE014F5F5F4F36DD9D -:107E4000BC01009709F43BC08091E800877F8093D4 -:107E5000E80089819A8192DE8091E8008B77809397 -:107E6000E8002DC0803859F58091E800877F809325 -:107E7000E8008091B4018093F1008091E8008E7752 -:107E80008093E80054DD1BC08823C9F49091B801A9 -:107E90009230A8F48091E800877F8093E800909367 -:107EA000B40145DD8091B401882331F48091E30071 -:107EB00087FD02C081E001C084E08EBB65DC80915B -:107EC000E80083FF0AC08091EB0080628093EB00A2 -:107ED0008091E800877F8093E8000F900F90CF910A -:107EE000DF911F910F91089508951F938EB38823FA -:107EF00061F01091E9001092E9008091E80083FFA1 -:107F000001C0E4DE17701093E9001F910895F999FC -:107F1000FECF92BD81BDF89A992780B50895262F8E -:107F2000F999FECF1FBA92BD81BD20BD0FB6F8945E -:0E7F3000FA9AF99A0FBE01960895F894FFCFC1 -:107F3E004341544552494E41007777000A010000F3 -:107F4E000000000008120110010200000841230188 -:107F5E000701000201000109023E00020100803209 -:107F6E00090400000102020100052400100104248E -:107F7E0002040524060001070582030800FF090418 -:107F8E000100020A000000070504021000010705A7 -:107F9E0083021000010403090422034100720064ED -:107FAE0000750069006E006F0020004C0065006FC8 -:107FBE00006E006100720064006F00000018034143 -:107FCE000072006400750069006E006F0020004CA6 -:087FDE00004C0043000000000C +:1077F00090936F0083E080938100EBC01F9388E13A +:107800000FB6F89480936000109260000FBE84B7AA +:1078100014BE182F10FF08C0E0E0F0E085919491AD +:107820008F5F9F4F09F05EDC2091000A3091010AC2 +:107830001092010A1092000A13FF0FC080910901F3 +:1078400090910A012817390741F0E0E0F0E08591B6 +:1078500094918F5F9F4F09F045DCA2DF78940CC0B4 +:10786000E5DC37D38091AC019091AD0181549F410B +:1078700010F010920D0148DC80910D01882381F7F2 +:107880008091E00081608093E0002CDC80E090E05B +:107890001F910895FA01923049F0933061F09130D0 +:1078A000F9F485E191E022E130E01EC087E291E049 +:1078B0002EE330E019C0882329F485E691E024E026 +:1078C00030E012C0813029F489E691E022E230E014 +:1078D0000BC0823029F48DE891E028E130E004C04B +:1078E00080E090E020E030E091838083C90108953A +:1078F0008093E9008091EB0081608093EB0010920F +:10790000ED006093EC004093ED008091EE00881F45 +:107910008827881F08958091B60188238CF403C0BE +:107920008EB38823B1F08091E80082FFF9CF809177 +:10793000E8008B778093E80008958EB3882349F0A0 +:107940008091E80080FFF9CF8091E8008E778093E6 +:10795000E8000895EF92FF920F931F9345D04CD00B +:1079600008ED10E0F80180818F7780838081806846 +:10797000808380818F7D808319BC1EBA1092B401F0 +:1079800080EEE82EF12CF70180818B7F8083F80157 +:1079900080818160808380E060E042E0A9DFE1EEE9 +:1079A000F0E080818E7F8083E2EEF0E08081816074 +:1079B0008083808188608083F70180818E7F8083CF +:1079C000F8018081806180831F910F91FF90EF907B +:1079D0000895E7EDF0E08081816080838AE482BFD2 +:1079E00081E08093B501B6CFE8EDF0E080818E7F35 +:1079F00080831092E20008951092DA001092E10064 +:107A000008951F920F920FB60F9211242F933F9358 +:107A10004F935F936F937F938F939F93AF93BF9396 +:107A2000EF93FF938091DA0080FF1BC08091D80014 +:107A300080FF17C08091DA008E7F8093DA008091FA +:107A4000D90080FF0BC080E189BD82E189BD09B406 +:107A500000FEFDCF81E08EBB3BD203C019BC1EBA35 +:107A600037D28091E10080FF17C08091E20080FF53 +:107A700013C08091E2008E7F8093E2008091E2004B +:107A800080618093E2008091D80080628093D8006A +:107A900019BC85E08EBB1CD28091E10084FF2CC014 +:107AA0008091E20084FF28C080E189BD82E189BD28 +:107AB00009B400FEFDCF8091D8008F7D8093D8005F +:107AC0008091E1008F7E8093E1008091E2008F7EC3 +:107AD0008093E2008091E20081608093E2008091D7 +:107AE000B401882331F48091E30087FD02C081E076 +:107AF00001C084E08EBBECD18091E10083FF21C006 +:107B00008091E20083FF1DC08091E100877F809318 +:107B1000E10082E08EBB1092B4018091E1008E7F83 +:107B20008093E1008091E2008E7F8093E20080915B +:107B3000E20080618093E20080E060E042E0D8DE15 +:107B4000C7D1FF91EF91BF91AF919F918F917F919D +:107B50006F915F914F913F912F910F900FBE0F90BA +:107B60001F9018959C014091BC015091BD01461792 +:107B7000570718F4F90190E044C06115710511F040 +:107B8000AB01F8CF8091E8008E778093E80040E069 +:107B900050E0F0CF8EB3882309F444C0853009F457 +:107BA00043C08091E80083FF02C081E00895809186 +:107BB000E80082FD31C08091E80080FF22C0809102 +:107BC000F3009091F200782F60E0292F30E0262B0F +:107BD000372B07C081918093F100415050402F5FB7 +:107BE0003F4F4115510519F02830310598F390E0C9 +:107BF0002830310509F491E08091E8008E77809378 +:107C0000E8004115510531F6992321F605C08EB3E0 +:107C1000882341F0853041F08091E80082FFF7CF62 +:107C200080E0089582E0089583E008959C01611545 +:107C3000710529F48091E8008B778093E800F901C1 +:107C400026C08EB3882391F1853091F18091E800B0 +:107C500083FF02C081E008958091E80082FFF1CFA8 +:107C600006C08091F10081936150704059F02091DD +:107C7000F3008091F200322F20E090E0822B932BD2 +:107C8000892B79F78091E8008B778093E800611564 +:107C90007105B9F605C08EB3882341F0853041F0F7 +:107CA0008091E80080FFF7CF80E0089582E008959A +:107CB00083E008950F931F93DF93CF9300D0CDB748 +:107CC000DEB7E6EBF1E08091F100819381E0EE3BDD +:107CD000F807C9F729DD8091E80083FFE4C08091AF +:107CE000B6019091B701953009F46DC0963040F41B +:107CF000913081F1913070F0933009F0D4C02AC0F6 +:107D0000983009F4A3C0993009F4B2C0963009F054 +:107D1000CAC07CC0803809F4C6C0823809F0C3C02C +:107D20008091BA0187708093E9008091EB001092F6 +:107D3000E9002091E800277F2093E80090E025E00B +:107D4000969587952A95E1F781708093F1001092BE +:107D5000F10087C0882319F0823009F0A4C08F7128 +:107D6000823009F0A0C08091B801882331F52091BC +:107D7000BA01277009F497C02093E9008091EB00C5 +:107D800080FF1BC0933021F48091EB00806213C010 +:107D90008091EB0080618093EB0081E090E002C075 +:107DA000880F991F2A95E2F78093EA001092EA0063 +:107DB0008091EB0088608093EB001092E900809145 +:107DC000E800877F51C0882309F06DC01091B80189 +:107DD0001F770FB7F8948091E800877F8093E800C1 +:107DE0009ADD8091E80080FFFCCF8091E3008078ED +:107DF000812B8093E30080688093E300112311F4CA +:107E000082E001C083E08EBB0FBF4DC0805882303E +:107E100008F049C08091B8019091B9016091BA0110 +:107E2000AE014F5F5F4F36DDBC01009709F43BC0E8 +:107E30008091E800877F8093E80089819A8192DEB3 +:107E40008091E8008B778093E8002DC0803859F549 +:107E50008091E800877F8093E8008091B40180934F +:107E6000F1008091E8008E778093E80054DD1BC01C +:107E70008823C9F49091B8019230A8F48091E80069 +:107E8000877F8093E8009093B40145DD8091B40131 +:107E9000882331F48091E30087FD02C081E001C0B6 +:107EA00084E08EBB71DC8091E80083FF0AC0809182 +:107EB000EB0080628093EB008091E800877F8093E5 +:107EC000E8000F900F90CF91DF911F910F910895CF +:107ED00008951F938EB3882361F01091E9001092EA +:107EE000E9008091E80083FF01C0E4DE1770109381 +:107EF000E9001F910895F999FECF92BD81BDF89ACE +:107F0000992780B50895262FF999FECF1FBA92BD03 +:107F100081BD20BD0FB6F894FA9AF99A0FBE01966A +:067F20000895F894FFCF64 +:107F26004341544552494E41007777000A0100000B +:107F360000000000081201100102000008412301A0 +:107F46000701000201000109023E00020100803221 +:107F560009040000010202010005240010010424A6 +:107F660002040524060001070582030800FF090430 +:107F76000100020A000000070504021000010705BF +:107F86008302100001040309042203410072006405 +:107F960000750069006E006F0020004C0065006FE0 +:107FA600006E006100720064006F0000001803415B +:107FB6000072006400750069006E006F0020004CBE +:087FC600004C00430000000024 :040000030000700089 :00000001FF -- cgit v1.2.3-18-g5258 From 8f5869009ccddad8698969ff2ebe204d7b574b37 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sat, 3 Mar 2012 13:26:57 -0500 Subject: fixed minor compilation warnings for Leonardo --- cores/arduino/HID.cpp | 3 +-- cores/arduino/USBAPI.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index e6fb5f7..b60b3c0 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -144,7 +144,6 @@ u8 _hid_protocol = 1; u8 _hid_idle = 1; #define WEAK __attribute__ ((weak)) -#define WEAK int WEAK HID_GetInterface(u8* interfaceNum) { @@ -245,7 +244,7 @@ void Mouse_::release(uint8_t b) bool Mouse_::isPressed(uint8_t b) { - if (b & _buttons > 0) + if ((b & _buttons) > 0) return true; return false; } diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 6a0b989..3c97ff1 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -104,7 +104,7 @@ private: void setKeyMap(KeyMap* keyMap); public: Keyboard_(); - virtual size_t write(uint8_t c) {type(c);}; + virtual size_t write(uint8_t c) {return type(c);}; virtual size_t type(uint8_t c); }; extern Keyboard_ Keyboard; -- cgit v1.2.3-18-g5258 From fbea67532a03cbcb35c47209f902797c80c499f7 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sat, 3 Mar 2012 22:54:45 -0500 Subject: added Keyboard methods press(), release(), and releaseAll() Changes mean that a single, persistent key report must be used so keys can be added or removed. Also reimplemented type() using the new methods. --- cores/arduino/HID.cpp | 98 +++++++++++++++++++++++++++++++++++--------------- cores/arduino/USBAPI.h | 8 +++-- 2 files changed, 76 insertions(+), 30 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index b60b3c0..9904993 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -253,7 +253,7 @@ bool Mouse_::isPressed(uint8_t b) //================================================================================ // Keyboard -Keyboard_::Keyboard_() : _keyMap(0) +Keyboard_::Keyboard_() : _keyMap(0) { } @@ -406,38 +406,80 @@ const uint8_t _asciimap[128] = uint8_t USBPutChar(uint8_t c); -size_t Keyboard_::type(uint8_t c) +size_t Keyboard_::press(uint8_t k) { - // Keydown - { - KeyReport keys = {0}; - if (_keyMap) - _keyMap->charToKey(c,&keys); - else - { - if (c >= 128) { - setWriteError(); - return 0; - } - c = pgm_read_byte(_asciimap + c); - if (!c) { - setWriteError(); - return 0; - } - if (c & 0x80) - { - keys.modifiers |= KEY_MODIFIER_LEFT_SHIFT; - c &= 0x7F; + uint8_t i; + k = pgm_read_byte(_asciimap + k); + if (!k) { + setWriteError(); + return 0; + } + if (k & 0x80) { + _keyReport.modifiers |= KEY_MODIFIER_LEFT_SHIFT; + k &= 0x7F; + } + if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && + _keyReport.keys[2] != k && _keyReport.keys[3] != k && + _keyReport.keys[4] != k && _keyReport.keys[5] != k) { + + for (i=0; i<6; i++) { + if (_keyReport.keys[i] == 0x00) { + _keyReport.keys[i] = k; + break; } - keys.keys[0] = c; } - sendReport(&keys); + if (i == 6) { + setWriteError(); + return 0; + } } - // Keyup - { - KeyReport keys = {0}; - sendReport(&keys); + sendReport(&_keyReport); + return 1; +} + +size_t Keyboard_::release(uint8_t k) +{ + uint8_t i; + k = pgm_read_byte(_asciimap + k); + if (!k) { + return 0; } + if (k & 0x80) { + _keyReport.modifiers |= KEY_MODIFIER_LEFT_SHIFT; + k &= 0x7F; + } + for (i=0; i<6; i++) { + if (_keyReport.keys[i] == k) { + _keyReport.keys[i] = 0x00; + break; + } + } + if (i == 6) { + return 0; + } + sendReport(&_keyReport); + return 1; +} + +void Keyboard_::releaseAll(void) +{ + _keyReport.keys[0] = 0; + _keyReport.keys[1] = 0; + _keyReport.keys[2] = 0; + _keyReport.keys[3] = 0; + _keyReport.keys[4] = 0; + _keyReport.keys[5] = 0; + _keyReport.modifiers = 0; + sendReport(&_keyReport); +} + +size_t Keyboard_::type(uint8_t c) +{ + releaseAll(); + // Keydown + press(c); + // Keyup + releaseAll(); return 1; } diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 3c97ff1..6615fa8 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -100,12 +100,16 @@ class Keyboard_ : public Print { private: KeyMap* _keyMap; + KeyReport _keyReport; void sendReport(KeyReport* keys); void setKeyMap(KeyMap* keyMap); public: Keyboard_(); - virtual size_t write(uint8_t c) {return type(c);}; - virtual size_t type(uint8_t c); + virtual size_t write(uint8_t k) {return type(k);}; + virtual size_t type(uint8_t k); + virtual size_t press(uint8_t k); + virtual size_t release(uint8_t k); + virtual void releaseAll(void); }; extern Keyboard_ Keyboard; -- cgit v1.2.3-18-g5258 From 54fb0bf3f54a37d4dd9370d5f545a52b54ad1775 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sat, 3 Mar 2012 23:06:44 -0500 Subject: Removed support for key mapping in Keyboard. Was no longer being used and would be damn near impossible to support with the new scheme for handling modifiers and non-printing keyboard characters. --- cores/arduino/HID.cpp | 7 +------ cores/arduino/USBAPI.h | 11 ----------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index 9904993..b508f10 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -253,7 +253,7 @@ bool Mouse_::isPressed(uint8_t b) //================================================================================ // Keyboard -Keyboard_::Keyboard_() : _keyMap(0) +Keyboard_::Keyboard_() { } @@ -262,11 +262,6 @@ void Keyboard_::sendReport(KeyReport* keys) HID_SendReport(2,keys,sizeof(KeyReport)); } -void Keyboard_::setKeyMap(KeyMap* keyMap) -{ - _keyMap = keyMap; -} - extern const uint8_t _asciimap[128] PROGMEM; diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 6615fa8..3f71856 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -87,22 +87,11 @@ typedef struct uint8_t keys[6]; } KeyReport; -// Map a character into a key report -// Called from Print to map text to keycodes -class KeyMap -{ -public: - virtual void charToKey(int c, KeyReport* keyReport) = 0; -}; - -// class Keyboard_ : public Print { private: - KeyMap* _keyMap; KeyReport _keyReport; void sendReport(KeyReport* keys); - void setKeyMap(KeyMap* keyMap); public: Keyboard_(); virtual size_t write(uint8_t k) {return type(k);}; -- cgit v1.2.3-18-g5258 From 15660068717c4721c60c9caefc1a8eaff702cc24 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sat, 3 Mar 2012 23:37:39 -0500 Subject: Added Keyboard support for all modifier and all common non-printing keys. --- cores/arduino/HID.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++-------- cores/arduino/USBAPI.h | 44 +++++++++++++++++++++++++++++++-------- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index b508f10..378a157 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -401,18 +401,32 @@ const uint8_t _asciimap[128] = uint8_t USBPutChar(uint8_t c); +// press() adds the specified key (printing, non-printing, or modifier) +// to the persistent key report and sends the report. Because of the way +// USB HID works, the host acts like the key remains pressed until we +// call release(), releaseAll(), or otherwise clear the report and resend. size_t Keyboard_::press(uint8_t k) { uint8_t i; - k = pgm_read_byte(_asciimap + k); - if (!k) { - setWriteError(); - return 0; - } - if (k & 0x80) { - _keyReport.modifiers |= KEY_MODIFIER_LEFT_SHIFT; - k &= 0x7F; + if (k >= 136) { // it's a non-printing key (not a modifier) + k = k - 136; + } else if (k >= 128) { // it's a modifier key + _keyReport.modifiers |= (1<<(k-128)); + k = 0; + } else { // it's a printing key + k = pgm_read_byte(_asciimap + k); + if (!k) { + setWriteError(); + return 0; + } + if (k & 0x80) { + _keyReport.modifiers |= 0x02; // the left shift modifier + k &= 0x7F; + } } + + // Add k to the key report only if it's not already present + // and if there is an empty slot. if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && _keyReport.keys[2] != k && _keyReport.keys[3] != k && _keyReport.keys[4] != k && _keyReport.keys[5] != k) { @@ -432,17 +446,40 @@ size_t Keyboard_::press(uint8_t k) return 1; } +// release() takes the specified key out of the persistent key report and +// sends the report. This tells the OS the key is no longer pressed and that +// it shouldn't be repeated any more. size_t Keyboard_::release(uint8_t k) { + /* uint8_t i; k = pgm_read_byte(_asciimap + k); if (!k) { return 0; } if (k & 0x80) { - _keyReport.modifiers |= KEY_MODIFIER_LEFT_SHIFT; + _keyReport.modifiers |= 0x02; // the left shift modifier k &= 0x7F; } + */ + uint8_t i; + if (k >= 136) { // it's a non-printing key (not a modifier) + k = k - 136; + } else if (k >= 128) { // it's a modifier key + _keyReport.modifiers &= ~(1<<(k-128)); + k = 0; + } else { // it's a printing key + k = pgm_read_byte(_asciimap + k); + if (!k) { + return 0; + } + if (k & 0x80) { + _keyReport.modifiers &= ~(0x02); // the left shift modifier + k &= 0x7F; + } + } + + // Test the key report to see if k is present. Clear it if it exists. for (i=0; i<6; i++) { if (_keyReport.keys[i] == k) { _keyReport.keys[i] = 0x00; @@ -468,6 +505,7 @@ void Keyboard_::releaseAll(void) sendReport(&_keyReport); } +// type() does a press and release of the specified key. size_t Keyboard_::type(uint8_t c) { releaseAll(); diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 3f71856..05f7318 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -70,14 +70,42 @@ extern Mouse_ Mouse; //================================================================================ // Keyboard -#define KEY_MODIFIER_LEFT_CTRL 0x01 -#define KEY_MODIFIER_LEFT_SHIFT 0x02 -#define KEY_MODIFIER_LEFT_ALT 0x04 -#define KEY_MODIFIER_LEFT_GUI 0x08 -#define KEY_MODIFIER_RIGHT_CTRL 0x010 -#define KEY_MODIFIER_RIGHT_SHIFT 0x020 -#define KEY_MODIFIER_RIGHT_ALT 0x040 -#define KEY_MODIFIER_RIGHT_GUI 0x080 +#define KEY_LEFT_CTRL 0x80 +#define KEY_LEFT_SHIFT 0x81 +#define KEY_LEFT_ALT 0x82 +#define KEY_LEFT_GUI 0x83 +#define KEY_RIGHT_CTRL 0x84 +#define KEY_RIGHT_SHIFT 0x85 +#define KEY_RIGHT_ALT 0x86 +#define KEY_RIGHT_GUI 0x87 + +#define KEY_UP_ARROW 0xDA +#define KEY_DOWN_ARROW 0xD9 +#define KEY_LEFT_ARROW 0xD8 +#define KEY_RIGHT_ARROW 0xD7 +#define KEY_BACKSPACE 0xB2 +#define KEY_TAB 0xB3 +#define KEY_RETURN 0xB0 +#define KEY_ESC 0xB1 +#define KEY_INSERT 0xD1 +#define KEY_DELETE 0xD4 +#define KEY_PAGE_UP 0xD3 +#define KEY_PAGE_DOWN 0xD6 +#define KEY_HOME 0xD2 +#define KEY_END 0xD5 +#define KEY_CAPS_LOCK 0xC1 +#define KEY_F1 0xC2 +#define KEY_F2 0xC3 +#define KEY_F3 0xC4 +#define KEY_F4 0xC5 +#define KEY_F5 0xC6 +#define KEY_F6 0xC7 +#define KEY_F7 0xC8 +#define KEY_F8 0xC9 +#define KEY_F9 0xCA +#define KEY_F10 0xCB +#define KEY_F11 0xCC +#define KEY_F12 0xCD // Low level key report: up to 6 keys and shift, ctrl etc at once typedef struct -- cgit v1.2.3-18-g5258 From b407337677f8b6964a69939e0fb5a371dfb0d3e4 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Wed, 7 Mar 2012 16:21:04 +0100 Subject: Fix for some strange behaviours during board reset --- cores/arduino/USBCore.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index 7924078..c360d26 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -637,6 +637,12 @@ void USB_::attach() PLLCSR = 0x12; // Need 16 MHz xtal while (!(PLLCSR & (1< Date: Thu, 8 Mar 2012 13:47:42 -0500 Subject: removed old version of Leonardo's caterina bootloader, replaced with LUFA-based caterina --- boards.txt | 2 +- bootloaders/caterina/Caterina-Leonardo.hex | 120 ----- bootloaders/caterina/Caterina.c | 698 ++++++++++++++++++++++++ bootloaders/caterina/Caterina.h | 99 ++++ bootloaders/caterina/Caterina.hex | 256 +++++++++ bootloaders/caterina/Descriptors.c | 265 ++++++++++ bootloaders/caterina/Descriptors.h | 139 +++++ bootloaders/caterina/Makefile | 822 +++++++++++++++++++++++++---- bootloaders/caterina/src/Caterina.cpp | 251 --------- bootloaders/caterina/src/Platform.h | 49 -- bootloaders/caterina/src/USBCore.cpp | 512 ------------------ bootloaders/caterina/src/USBCore.h | 246 --------- bootloaders/caterina/src/USBDesc.cpp | 83 --- bootloaders/caterina/src/USBDesc.h | 60 --- bootloaders/caterina_LUFA/Caterina.c | 698 ------------------------ bootloaders/caterina_LUFA/Caterina.h | 99 ---- bootloaders/caterina_LUFA/Caterina.hex | 256 --------- bootloaders/caterina_LUFA/Descriptors.c | 265 ---------- bootloaders/caterina_LUFA/Descriptors.h | 139 ----- bootloaders/caterina_LUFA/makefile | 717 ------------------------- 20 files changed, 2175 insertions(+), 3601 deletions(-) delete mode 100644 bootloaders/caterina/Caterina-Leonardo.hex create mode 100755 bootloaders/caterina/Caterina.c create mode 100755 bootloaders/caterina/Caterina.h create mode 100644 bootloaders/caterina/Caterina.hex create mode 100755 bootloaders/caterina/Descriptors.c create mode 100755 bootloaders/caterina/Descriptors.h mode change 100644 => 100755 bootloaders/caterina/Makefile delete mode 100644 bootloaders/caterina/src/Caterina.cpp delete mode 100644 bootloaders/caterina/src/Platform.h delete mode 100644 bootloaders/caterina/src/USBCore.cpp delete mode 100644 bootloaders/caterina/src/USBCore.h delete mode 100644 bootloaders/caterina/src/USBDesc.cpp delete mode 100644 bootloaders/caterina/src/USBDesc.h delete mode 100755 bootloaders/caterina_LUFA/Caterina.c delete mode 100755 bootloaders/caterina_LUFA/Caterina.h delete mode 100644 bootloaders/caterina_LUFA/Caterina.hex delete mode 100755 bootloaders/caterina_LUFA/Descriptors.c delete mode 100755 bootloaders/caterina_LUFA/Descriptors.h delete mode 100755 bootloaders/caterina_LUFA/makefile diff --git a/boards.txt b/boards.txt index cb603cd..710ae27 100644 --- a/boards.txt +++ b/boards.txt @@ -154,7 +154,7 @@ leonardo.upload.disable_flushing=true leonardo.bootloader.low_fuses=0xff leonardo.bootloader.high_fuses=0xd8 leonardo.bootloader.extended_fuses=0xcb -leonardo.bootloader.path=caterina_LUFA +leonardo.bootloader.path=caterina leonardo.bootloader.file=Caterina.hex leonardo.bootloader.unlock_bits=0x3F leonardo.bootloader.lock_bits=0x2F diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex deleted file mode 100644 index ea2af98..0000000 --- a/bootloaders/caterina/Caterina-Leonardo.hex +++ /dev/null @@ -1,120 +0,0 @@ -:1078000011241FBECFEFDAE0DEBFCDBF0BC14101B7 -:1078100042144505560455026403740300001E9586 -:1078200087020110030000C18081C106C0FF0A0069 -:107830000CA10185037508150026FF00954009017C -:107840008102954009029102C0040309041A033021 -:1078500000300030003000300030003000300031A7 -:1078600000370030003100380341007200640075B9 -:107870000069006E006F0020004C0065006F006E14 -:10788000006100720064006F00200062006F006FF2 -:107890000074006C006F00610064006500720018E5 -:1078A00003410072006400750069006E006F0020E3 -:1078B000004C004C00430012010002020000404155 -:1078C0002334000001000203011201000200000045 -:1078D0004041233400000100020301090264000357 -:1078E00001008032080B00020202010009040000BE -:1078F0000102020000052400100105240101010419 -:107900002402020524060001070581031000400936 -:10791000040100020A0000000705020240000007FF -:107920000583024000000904020001030000000971 -:107930002101010001221E000705840340004000D0 -:1079400020918A0130918B012C5F3F4F30938B0146 -:1079500020938A01C901892F99278695982F803411 -:1079600018F08FE7891B982F990F921710F44798FA -:107970000895479A08955D9A289A81E08093E000DF -:107980001092E200EE27FF270994089528E088E18D -:1079900090E00FB6F894A895809360000FBE2093F6 -:1079A0006000FFCF0F931F93CF93DF93982FEB01CE -:1079B000042F10E088E76030780730F411E083E0AE -:1079C000FB0180935700E895892F68E071E0402F14 -:1079D00006D1112311F107B600FCFDCF402F4695CB -:1079E000FE01A8E0B1E020E031E009C08D919D9159 -:1079F0000C0130935700E895112432962F5F24171D -:107A0000A8F385E0FE0180935700E89507B600FCD7 -:107A1000FDCF81E180935700E895DF91CF911F91D1 -:107A20000F91089584B794B7977F94BF98E10FB6EC -:107A3000F89490936000109260000FBE5D9A289AAF -:107A4000479883FF08C0E0E0F0E0859194918F5F54 -:107A50009F4F09F090DF3F9A209A559A90E89093B3 -:107A600061001092610081E885BF95BF9FD084E1DD -:107A70008093880180E180938901E0E0F0E08591C6 -:107A800094918F5F9F4F19F081E080938F01EE24D6 -:107A9000FF24BB24B39454EFC52E51E0D52E1FD242 -:107AA000082F8EE098E7FC012491319602964491CC -:107AB000201711F02223B9F7109291011092900132 -:107AC00082E068E071E08BD0013479F460910801C4 -:107AD0006058633028F0683111F064E001C063E061 -:107AE000C62FD0E0CF5DD7480EC0063571F4809127 -:107AF0000801803311F011E022C080910A01C82FE3 -:107B0000D0E0C25ED74811E022C0053721F413E06F -:107B1000CEE1D8E71CC0053539F4E0900801F090BB -:107B20000901EE0CFF1C0AC0043631F482E0B701F3 -:107B30004091090137DF02C0043721F010E0C5E2AF -:107B4000D8E705C010910901E701E10EF11CC7D18A -:107B50008097B1F483E068E871E041E050E059D0EB -:107B6000112329F0412F50E083E8BE0152D083E475 -:107B700069E871E041E050E04CD0013509F08FCF69 -:107B8000D0929101C0929001B0928F01EE24FF2417 -:107B900086CFFC01289884E680938D0104C08091F3 -:107BA000F100819361506623D1F7089510929101FD -:107BB0001092900110928E0110928F0181E08093BB -:107BC000D70080EA8093D80082E189BD09B400FE25 -:107BD000FDCF80E98093D8001092E0000895FB016A -:107BE0008093E90024E69BE611C08091E80085FFC0 -:107BF000FCCF289820938D018091F1008193809192 -:107C0000E80085FD02C09093E8004150442369F7E5 -:107C10000895982FFB01282F207287708093E90028 -:107C200064E63AE317C08091E80085FFFCCF97FF38 -:107C300002C0849101C080813196211180E05D985D -:107C400060938C018093F1008091E80085FD02C073 -:107C50003093E800415050408FEF4F3F580719F7DD -:107C600096FF03C08AE38093E80008958091930112 -:107C7000813299F45D9884E680938C0120E030E0B5 -:107C800003C080818093F100F901E050FF4F2F5F26 -:107C90003F4F28303105A9F714C0803261F480913C -:107CA000E80082FFFCCF80E091E067E072DF8BEFBD -:107CB0008093E80006C0823221F480919401809381 -:107CC000070181E0089520919501223291F1213040 -:107CD00081F48091980190919901089711F4209373 -:107CE0009A0180919A01882309F059C029EC38E75C -:107CF00058C0223029F484E690E02BED38E71DC00F -:107D0000233009F04AC080919401882319F429E4B2 -:107D100038E747C0823019F427E638E742C083309D -:107D200019F42DE438E73DC08130B9F52FE938E783 -:107D300038C082E090E02BE238E740919801509102 -:107D40009901BC014817590708F4BA0190918C01B8 -:107D500040E050E0AEEF8091E8008570E1F3809163 -:107D6000E80082FD16C0F901E40FF51F4F5F5F4F79 -:107D7000E4915D98E093F100842F8F7311F4A09348 -:107D8000E80094E64617570730F390938C0181E0A2 -:107D9000089590938C0180E0089580E0089527EB8A -:107DA00038E7F901849190E0C8CF1092E900809102 -:107DB000E80083FF61C082E991E068E0EADE82EFDB -:107DC0008093E8008091920187FF05C08091E800D0 -:107DD00080FFFCCF03C08EEF8093E8008091930179 -:107DE000853051F48091E80080FFFCCF80919401B0 -:107DF00080688093E30039C08930E1F48091940178 -:107E000080938E01E7E2F8E791E031E026E390937A -:107E1000E9003093EB0084918093EC002093ED0017 -:107E20009F5F3196953099F78EE78093EA00109224 -:107E3000EA001BC0883049F490918E015D9884E679 -:107E400080938C019093F10010C0882339F45D98E1 -:107E500084E680938C011092F10007C0863011F403 -:107E600032DF01C003DF882321F08EEF8093E8002A -:107E7000089581E28093EB0008958091E1001092D3 -:107E8000E100282F83FF0CC01092E90081E080936D -:107E9000EB001092EC0082E38093ED0010928E01D3 -:107EA00022FF1CC080918C01882331F08150809387 -:107EB0008C01882309F45D9A80918D01882331F02B -:107EC000815080938D01882309F4289A80918F0135 -:107ED000882321F4109291011092900108951F932C -:107EE000CF93DF9312E0C0E9D1E05FDFC6DF1093EC -:107EF000E9008091E80085FF13C0289884E680930C -:107F00008D019091F1008091E80085FD03C08BE622 -:107F10008093E800892F90E0DF91CF911F91089521 -:107F2000809190019091910101979093910180939C -:107F300090018091900190919101892B09F426DDA7 -:0A7F4000CE010197F1F7FCDCD0CF71 -:087F4A0000E10000000000004E -:040000030000780081 -:00000001FF diff --git a/bootloaders/caterina/Caterina.c b/bootloaders/caterina/Caterina.c new file mode 100755 index 0000000..c8e82a9 --- /dev/null +++ b/bootloaders/caterina/Caterina.c @@ -0,0 +1,698 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. + */ + +#define INCLUDE_FROM_CATERINA_C +#include "Caterina.h" + +/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some + * operating systems will not open the port unless the settings can be set successfully. + */ +static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, + .CharFormat = CDC_LINEENCODING_OneStopBit, + .ParityType = CDC_PARITY_None, + .DataBits = 8 }; + +/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, + * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued + * command.) + */ +static uint32_t CurrAddress; + +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run + * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite + * loop until the AVR restarts and the application runs. + */ +static bool RunBootloader = true; + +/* Pulse generation counters to keep track of the time remaining for each pulse type */ +#define TX_RX_LED_PULSE_PERIOD 100 +uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse +uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse + +/* Bootloader timeout timer */ +uint16_t Timeout = 0; + +uint16_t bootKey = 0x7777; +volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0A00; + +void StartSketch(void) +{ + cli(); + + /* Undo TIMER1 setup and clear the count before running the sketch */ + TIMSK1 = 0; + TCCR1B = 0; + TCNT1H = 0; // 16-bit write to TCNT1 requires high byte be written first + TCNT1L = 0; + + /* Relocate the interrupt vector table to the application section */ + MCUCR = (1 << IVCE); + MCUCR = 0; + + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + /* jump to beginning of application space */ + __asm__ volatile("jmp 0x0000"); +} + +/* Breathing animation on L LED indicates bootloader is running */ +uint16_t LLEDPulse; +void LEDPulse(void) +{ + LLEDPulse++; + uint8_t p = LLEDPulse >> 8; + if (p > 127) + p = 254-p; + p += p; + if (((uint8_t)LLEDPulse) > p) + L_LED_OFF(); + else + L_LED_ON(); +} + +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously + * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start + * the loaded application code. + */ +int main(void) +{ + /* Watchdog may be configured with a 15 ms period so must disable it before doing anything else */ + wdt_disable(); + + /* Check the reason for the reset and act accordingly */ + uint8_t mcusr_state = MCUSR; // store the initial state of the Status register + MCUSR = 0; // clear all reset flags + // After a power-on reset skip the bootloader and jump straight to sketch + // if one exists. + if (mcusr_state & (1< 8000) + RunBootloader = false; + + LEDPulse(); + } + + /* Disconnect from the host - USB interface will be reset later along with the AVR */ + USB_Detach(); + + /* Jump to beginning of application space to run the sketch - do not reset */ + StartSketch(); +} + +/** Configures all hardware required for the bootloader. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + /* Relocate the interrupt vector table to the bootloader section */ + MCUCR = (1 << IVCE); + MCUCR = (1 << IVSEL); + + LED_SETUP(); + CPU_PRESCALE(0); + L_LED_OFF(); + TX_LED_OFF(); + RX_LED_OFF(); + + /* Initialize TIMER1 to handle bootloader timeout and LED tasks. + * With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz + * Our chosen compare match generates an interrupt every 1 ms. + * This interrupt is disabled selectively when doing memory reading, erasing, + * or writing since SPM has tight timing requirements. + */ + OCR1AH = 0; + OCR1AL = 250; + TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt + TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input + + /* Initialize USB Subsystem */ + USB_Init(); +} + +//uint16_t ctr = 0; +ISR(TIMER1_COMPA_vect, ISR_BLOCK) +{ + /* Reset counter */ + TCNT1H = 0; + TCNT1L = 0; + + /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ + if (TxLEDPulse && !(--TxLEDPulse)) + TX_LED_OFF(); + if (RxLEDPulse && !(--RxLEDPulse)) + RX_LED_OFF(); + + if (pgm_read_word(0) != 0xFFFF) + Timeout++; +} + +/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready + * to relay data to and from the attached USB host. + */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + /* Setup CDC Notification, Rx and Tx Endpoints */ + Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, + ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); + + Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, + ENDPOINT_BANK_SINGLE); +} + +/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to + * the device from the USB host before passing along unhandled control requests to the library for processing + * internally. + */ +void EVENT_USB_Device_ControlRequest(void) +{ + /* Ignore any requests that aren't directed to the CDC interface */ + if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != + (REQTYPE_CLASS | REQREC_INTERFACE)) + { + return; + } + + /* Process CDC specific control requests */ + switch (USB_ControlRequest.bRequest) + { + case CDC_REQ_GetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Write the line coding data to the control endpoint */ + Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearOUT(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + + /* Read the line coding data in from the host into the global struct */ + Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); + Endpoint_ClearIN(); + } + + break; + } +} + +#if !defined(NO_BLOCK_SUPPORT) +/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending + * on the AVR910 protocol command issued. + * + * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform + */ +static void ReadWriteMemoryBlock(const uint8_t Command) +{ + uint16_t BlockSize; + char MemoryType; + + bool HighByte = false; + uint8_t LowByte = 0; + + BlockSize = (FetchNextCommandByte() << 8); + BlockSize |= FetchNextCommandByte(); + + MemoryType = FetchNextCommandByte(); + + if ((MemoryType != 'E') && (MemoryType != 'F')) + { + /* Send error byte back to the host */ + WriteNextResponseByte('?'); + + return; + } + + /* Disable timer 1 interrupt - can't afford to process nonessential interrupts + * while doing SPM tasks */ + TIMSK1 = 0; + + /* Check if command is to read memory */ + if (Command == 'g') + { + /* Re-enable RWW section */ + boot_rww_enable(); + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* Read the next FLASH byte from the current FLASH page */ + #if (FLASHEND > 0xFFFF) + WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); + #else + WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); + #endif + + /* If both bytes in current word have been read, increment the address counter */ + if (HighByte) + CurrAddress += 2; + + HighByte = !HighByte; + } + else + { + /* Read the next EEPROM byte into the endpoint */ + WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + } + else + { + uint32_t PageStartAddress = CurrAddress; + + if (MemoryType == 'F') + { + boot_page_erase(PageStartAddress); + boot_spm_busy_wait(); + } + + while (BlockSize--) + { + if (MemoryType == 'F') + { + /* If both bytes in current word have been written, increment the address counter */ + if (HighByte) + { + /* Write the next FLASH word to the current FLASH page */ + boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + else + { + LowByte = FetchNextCommandByte(); + } + + HighByte = !HighByte; + } + else + { + /* Write the next EEPROM byte from the endpoint */ + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + /* Increment the address counter after use */ + CurrAddress += 2; + } + } + + /* If in FLASH programming mode, commit the page after writing */ + if (MemoryType == 'F') + { + /* Commit the flash page to memory */ + boot_page_write(PageStartAddress); + + /* Wait until write operation has completed */ + boot_spm_busy_wait(); + } + + /* Send response byte back to the host */ + WriteNextResponseByte('\r'); + } + + /* Re-enable timer 1 interrupt disabled earlier in this routine */ + TIMSK1 = (1 << OCIE1A); +} +#endif + +/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed + * to allow reception of the next data packet from the host. + * + * \return Next received byte from the host in the CDC data OUT endpoint + */ +static uint8_t FetchNextCommandByte(void) +{ + /* Select the OUT endpoint so that the next data byte can be read */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* If OUT endpoint empty, clear it and wait for the next packet from the host */ + while (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return 0; + } + } + + /* Fetch the next byte from the OUT endpoint */ + return Endpoint_Read_8(); +} + +/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the + * bank when full ready for the next byte in the packet to the host. + * + * \param[in] Response Next response byte to send to the host + */ +static void WriteNextResponseByte(const uint8_t Response) +{ + /* Select the IN endpoint so that the next data byte can be written */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ + if (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Write the next byte to the IN endpoint */ + Endpoint_Write_8(Response); + + TX_LED_ON(); + TxLEDPulse = TX_RX_LED_PULSE_PERIOD; +} + +#define STK_OK 0x10 +#define STK_INSYNC 0x14 // ' ' +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' + +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' + +/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions + * and send the appropriate response back to the host. + */ +void CDC_Task(void) +{ + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Check if endpoint has a command in it sent from the host */ + if (!(Endpoint_IsOUTReceived())) + return; + + RX_LED_ON(); + RxLEDPulse = TX_RX_LED_PULSE_PERIOD; + + /* Read in the bootloader command (first byte sent from host) */ + uint8_t Command = FetchNextCommandByte(); + + if (Command == 'E') + { + RunBootloader = false; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'T') + { + FetchNextCommandByte(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if ((Command == 'L') || (Command == 'P')) + { + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 't') + { + // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader + WriteNextResponseByte(0x44); + WriteNextResponseByte(0x00); + } + else if (Command == 'a') + { + // Indicate auto-address increment is supported + WriteNextResponseByte('Y'); + } + else if (Command == 'A') + { + // Set the current address to that given by the host + CurrAddress = (FetchNextCommandByte() << 9); + CurrAddress |= (FetchNextCommandByte() << 1); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'p') + { + // Indicate serial programmer back to the host + WriteNextResponseByte('S'); + } + else if (Command == 'S') + { + // Write the 7-byte software identifier to the endpoint + for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) + WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); + } + else if (Command == 'V') + { + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); + WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); + } + else if (Command == 's') + { + WriteNextResponseByte(AVR_SIGNATURE_3); + WriteNextResponseByte(AVR_SIGNATURE_2); + WriteNextResponseByte(AVR_SIGNATURE_1); + } + else if (Command == 'e') + { + // Clear the application section of flash + for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) + { + boot_page_erase(CurrFlashAddress); + boot_spm_busy_wait(); + boot_page_write(CurrFlashAddress); + boot_spm_busy_wait(); + } + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) + else if (Command == 'l') + { + // Set the lock bits to those given by the host + boot_lock_bits_set(FetchNextCommandByte()); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + #endif + else if (Command == 'r') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); + } + else if (Command == 'F') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); + } + else if (Command == 'N') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); + } + else if (Command == 'Q') + { + WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); + } + #if !defined(NO_BLOCK_SUPPORT) + else if (Command == 'b') + { + WriteNextResponseByte('Y'); + + // Send block size to the host + WriteNextResponseByte(SPM_PAGESIZE >> 8); + WriteNextResponseByte(SPM_PAGESIZE & 0xFF); + } + else if ((Command == 'B') || (Command == 'g')) + { + Timeout = 0; + // Delegate the block write/read to a separate function for clarity + ReadWriteMemoryBlock(Command); + } + #endif + #if !defined(NO_FLASH_BYTE_SUPPORT) + else if (Command == 'C') + { + // Write the high byte to the current flash page + boot_page_fill(CurrAddress, FetchNextCommandByte()); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'c') + { + // Write the low byte to the current flash page + boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); + + // Increment the address + CurrAddress += 2; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'm') + { + // Commit the flash page to memory + boot_page_write(CurrAddress); + + // Wait until write operation has completed + boot_spm_busy_wait(); + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'R') + { + #if (FLASHEND > 0xFFFF) + uint16_t ProgramWord = pgm_read_word_far(CurrAddress); + #else + uint16_t ProgramWord = pgm_read_word(CurrAddress); + #endif + + WriteNextResponseByte(ProgramWord >> 8); + WriteNextResponseByte(ProgramWord & 0xFF); + } + #endif + #if !defined(NO_EEPROM_BYTE_SUPPORT) + else if (Command == 'D') + { + // Read the byte from the endpoint and write it to the EEPROM + eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); + + // Increment the address after use + CurrAddress += 2; + + // Send confirmation byte back to the host + WriteNextResponseByte('\r'); + } + else if (Command == 'd') + { + // Read the EEPROM byte and write it to the endpoint + WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); + + // Increment the address after use + CurrAddress += 2; + } + #endif + else if (Command != 27) + { + // Unknown (non-sync) command, return fail code + WriteNextResponseByte('?'); + } + + + /* Select the IN endpoint */ + Endpoint_SelectEndpoint(CDC_TX_EPNUM); + + /* Remember if the endpoint is completely full before clearing it */ + bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); + + /* Send the endpoint data to the host */ + Endpoint_ClearIN(); + + /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ + if (IsEndpointFull) + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearIN(); + } + + /* Wait until the data has been sent to the host */ + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + /* Select the OUT endpoint */ + Endpoint_SelectEndpoint(CDC_RX_EPNUM); + + /* Acknowledge the command from the host */ + Endpoint_ClearOUT(); +} + diff --git a/bootloaders/caterina/Caterina.h b/bootloaders/caterina/Caterina.h new file mode 100755 index 0000000..f8251d4 --- /dev/null +++ b/bootloaders/caterina/Caterina.h @@ -0,0 +1,99 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for BootloaderCDC.c. + */ + +#ifndef _CDC_H_ +#define _CDC_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + /* Macros: */ + /** Version major of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MAJOR 0x01 + + /** Version minor of the CDC bootloader. */ + #define BOOTLOADER_VERSION_MINOR 0x00 + + /** Hardware version major of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MAJOR 0x01 + + /** Hardware version minor of the CDC bootloader. */ + #define BOOTLOADER_HWVERSION_MINOR 0x00 + + /** Eight character bootloader firmware identifier reported to the host when requested */ + #define SOFTWARE_IDENTIFIER "CATERINA" + + #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) + #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); + #define L_LED_OFF() PORTC &= ~(1<<7) + #define L_LED_ON() PORTC |= (1<<7) + #define L_LED_TOGGLE() PORTC ^= (1<<7) + #define TX_LED_OFF() PORTD |= (1<<5) + #define TX_LED_ON() PORTD &= ~(1<<5) + #define RX_LED_OFF() PORTB |= (1<<0) + #define RX_LED_ON() PORTB &= ~(1<<0) + + /* Type Defines: */ + /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ + typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; + + /* Function Prototypes: */ + void StartSketch(void); + void LEDPulse(void); + + void CDC_Task(void); + void SetupHardware(void); + + void EVENT_USB_Device_ConfigurationChanged(void); + + #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) + #if !defined(NO_BLOCK_SUPPORT) + static void ReadWriteMemoryBlock(const uint8_t Command); + #endif + static uint8_t FetchNextCommandByte(void); + static void WriteNextResponseByte(const uint8_t Response); + #endif + +#endif + diff --git a/bootloaders/caterina/Caterina.hex b/bootloaders/caterina/Caterina.hex new file mode 100644 index 0000000..98cf01a --- /dev/null +++ b/bootloaders/caterina/Caterina.hex @@ -0,0 +1,256 @@ +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC00000ECC400005AC0000058 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C0000078C000004CC000004AC00000E2 +:1070500048C0000046C0000044C0000042C000001C +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E265 +:1070C000FFE702C005900D92A83AB107D9F711E089 +:1070D000A8EAB1E001C01D92AE3BB107E1F78ED343 +:1070E00020C78ECFF89410926F00109281001092FA +:1070F00085001092840081E085BF15BE47985D9A97 +:10710000289A0C94000008952091B2013091B301A7 +:107110002F5F3F4F3093B3012093B201932F37FF7E +:1071200003C08EEF831B982F990F921710F4479886 +:107130000895479A08951F920F920FB60F92112447 +:107140002F938F939F93EF93FF931092850010924C +:1071500084008091A8019091A901009741F00197C6 +:107160009093A9018093A801892B09F45D9A8091DD +:10717000AA019091AB01009741F001979093AB0168 +:107180008093AA01892B09F4289AE0E0F0E0859128 +:1071900094918F5F9F4F49F08091AC019091AD0128 +:1071A00001969093AD018093AC01FF91EF919F9177 +:1071B0008F912F910F900FBE0F901F90189584E024 +:1071C0008093E9000DC08091E8008B778093E80000 +:1071D00003C08EB3882351F08091E80082FFF9CF7D +:1071E0008091E80085FFEFCF8091F1000895982FFE +:1071F00083E08093E9008091E80085FD0DC08091D7 +:10720000E8008E778093E80003C08EB3882369F08E +:107210008091E80080FFF9CF9093F1005D9884E6BB +:1072200090E09093A9018093A80108954F925F92F6 +:107230006F927F928F929F92AF92BF92CF92DF9286 +:10724000EF92FF920F931F93CF93DF9384E080938D +:10725000E9008091E80082FF56C2289884E690E019 +:107260009093AB018093AA01AADF182F853419F4FB +:1072700010920D0103C0843519F4A1DF8DE019C20D +:107280008C34E1F38035D1F3843721F484E4AFDF2B +:1072900080E00FC2813611F489E50BC28134B1F46C +:1072A0008EDF182F8CDF90E0880F991FAA2797FD9B +:1072B000A095BA2F312F330F20E0442737FD40959A +:1072C000542F822B932BA42BB52BC4C1803711F4E0 +:1072D00083E5EFC1833549F4C0E0D1E0899187DFD0 +:1072E00021E0C730D207D1F7E5C1863521F481E32B +:1072F0007EDF80E3DEC1833731F487E878DF85E91C +:1073000076DF8EE1D6C18536B9F4E0E0F0E093E0B7 +:1073100085E090935700E89507B600FCFDCF809379 +:107320005700E89507B600FCFDCFE058FF4FA0E7F7 +:10733000E030FA0771F7A2CF8C3651F440DF809528 +:1073400099E0E1E0F0E0082E90935700E89596CFA1 +:10735000823739F4E1E0F0E089E0809357008491CE +:10736000A8C1863439F4E0E0F0E089E0809357006A +:1073700084919FC18E3439F4E3E0F0E089E080939A +:107380005700849196C1813539F4E2E0F0E089E05C +:107390008093570084918DC1823631F489E527DFCF +:1073A00080E025DF80E885C1823419F0873609F056 +:1073B000E5C01092AD011092AC0101DF082FFFDE95 +:1073C000F82EFDDE682E8554823008F071C1902FB2 +:1073D00080E0CF2DD0E0C82BD92B10926F0017364C +:1073E00009F04BC081E180935700E895DD24CC245F +:1073F000C3943FC0E090AE01F090AF010091B001A6 +:107400001091B101B6E46B16D9F4ED2DF0E0EE2940 +:10741000FF29E4918E2FEBDEDD2081F082E090E009 +:10742000A0E0B0E0E80EF91E0A1F1B1FE092AE01BB +:10743000F092AF010093B0011093B101DC2418C0A9 +:10744000D801C701B695A7959795879554D5CFDEF6 +:1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA +:10746000E092AE01F092AF010093B0011093B10130 +:107470002197209709F0BECF7DC08090AE019090FB +:10748000AF01A090B001B090B10196E4691609F087 +:107490005DC083E0F40180935700E89507B600FCD7 +:1074A000FDCF54C0F6E46F1661F5772031F1E0901E +:1074B000AE01F090AF010091B0011091B1017FDEFB +:1074C000D82ECC24852D90E08C299D29F7010C0124 +:1074D00040925700E895112482E090E0A0E0B0E0EF +:1074E000E80EF91E0A1F1B1FE092AE01F092AF01D9 +:1074F0000093B0011093B10102C061DE582E7424D4 +:1075000023C0E090AE01F090AF010091B001109166 +:10751000B10116950795F794E79451DE682FC701DE +:10752000F2D48091AE019091AF01A091B001B091E1 +:10753000B1010296A11DB11D8093AE019093AF01E0 +:10754000A093B001B093B101219704C055247724D2 +:1075500044244394209709F0A5CF96E4691641F49A +:1075600085E0F40180935700E89507B600FCFDCF55 +:107570008DE03DDE82E080936F009CC0833471F427 +:107580000091AE011091AF011ADE90E021E0F80108 +:107590000C0120935700E895112470CE833619F51D +:1075A000E090AE01F090AF010091B0011091B101F7 +:1075B00006DEF701E16090E021E00C012093570026 +:1075C000E895112482E090E0A0E0B0E0E80EF91E1A +:1075D0000A1F1B1FE092AE01F092AF010093B001B1 +:1075E0001093B1014BCE8D3661F4E091AE01F09174 +:1075F000AF0185E080935700E89507B600FCFDCF0A +:107600003DCE823551F4E091AE01F091AF0105918C +:107610001491812FECDD802F4CC0843421F5E09053 +:10762000AE01F090AF010091B0011091B10116953B +:107630000795F794E794C3DD682FC70164D4809160 +:10764000AE019091AF01A091B001B091B10102964D +:10765000A11DB11D8093AE019093AF01A093B00125 +:10766000B093B1010BCE843609F5E090AE01F090F5 +:10767000AF010091B0011091B101D801C701B695D9 +:10768000A7959795879537D4B2DD82E090E0A0E08A +:10769000B0E0E80EF91E0A1F1B1FE092AE01F09247 +:1076A000AF010093B0011093B10104C08B3111F010 +:1076B0008FE39DDD83E08093E9009091E800809165 +:1076C000E8008E778093E80095FF04C010C08EB369 +:1076D0008823C9F08091E80080FFF9CF8091E8000D +:1076E0008E778093E80003C08EB3882361F0809189 +:1076F000E80080FFF9CF84E08093E9008091E80002 +:107700008B778093E800DF91CF911F910F91FF90CD +:10771000EF90DF90CF90BF90AF909F908F907F9031 +:107720006F905F904F9008959091B601892F8F7759 +:10773000813249F58091B7018032A1F0813219F58B +:10774000913A09F58091E800877F8093E8008EE008 +:1077500091E067E070E006D28091E8008B7780933B +:10776000E8000895913279F48091E800877F809352 +:10777000E8008EE091E067E070E058D28091E80088 +:107780008E778093E800089582E061EC42E0B0D00B +:1077900083E061E842E1ACD084E060E842E1A8C067 +:1077A00084B7877F84BF88E10FB6F8948093600028 +:1077B000109260000FBE20E880E090E00FB6F894D1 +:1077C00020936100809361000FBE81E085BF92E04D +:1077D00095BF3F9A209A559AE1E6F0E02083108207 +:1077E00047985D9A289A109289008AEF80938800C2 +:1077F00090936F0083E080938100EBC01F9388E13A +:107800000FB6F89480936000109260000FBE84B7AA +:1078100014BE182F10FF08C0E0E0F0E085919491AD +:107820008F5F9F4F09F05EDC2091000A3091010AC2 +:107830001092010A1092000A13FF0FC080910901F3 +:1078400090910A012817390741F0E0E0F0E08591B6 +:1078500094918F5F9F4F09F045DCA2DF78940CC0B4 +:10786000E5DC37D38091AC019091AD0181549F410B +:1078700010F010920D0148DC80910D01882381F7F2 +:107880008091E00081608093E0002CDC80E090E05B +:107890001F910895FA01923049F0933061F09130D0 +:1078A000F9F485E191E022E130E01EC087E291E049 +:1078B0002EE330E019C0882329F485E691E024E026 +:1078C00030E012C0813029F489E691E022E230E014 +:1078D0000BC0823029F48DE891E028E130E004C04B +:1078E00080E090E020E030E091838083C90108953A +:1078F0008093E9008091EB0081608093EB0010920F +:10790000ED006093EC004093ED008091EE00881F45 +:107910008827881F08958091B60188238CF403C0BE +:107920008EB38823B1F08091E80082FFF9CF809177 +:10793000E8008B778093E80008958EB3882349F0A0 +:107940008091E80080FFF9CF8091E8008E778093E6 +:10795000E8000895EF92FF920F931F9345D04CD00B +:1079600008ED10E0F80180818F7780838081806846 +:10797000808380818F7D808319BC1EBA1092B401F0 +:1079800080EEE82EF12CF70180818B7F8083F80157 +:1079900080818160808380E060E042E0A9DFE1EEE9 +:1079A000F0E080818E7F8083E2EEF0E08081816074 +:1079B0008083808188608083F70180818E7F8083CF +:1079C000F8018081806180831F910F91FF90EF907B +:1079D0000895E7EDF0E08081816080838AE482BFD2 +:1079E00081E08093B501B6CFE8EDF0E080818E7F35 +:1079F00080831092E20008951092DA001092E10064 +:107A000008951F920F920FB60F9211242F933F9358 +:107A10004F935F936F937F938F939F93AF93BF9396 +:107A2000EF93FF938091DA0080FF1BC08091D80014 +:107A300080FF17C08091DA008E7F8093DA008091FA +:107A4000D90080FF0BC080E189BD82E189BD09B406 +:107A500000FEFDCF81E08EBB3BD203C019BC1EBA35 +:107A600037D28091E10080FF17C08091E20080FF53 +:107A700013C08091E2008E7F8093E2008091E2004B +:107A800080618093E2008091D80080628093D8006A +:107A900019BC85E08EBB1CD28091E10084FF2CC014 +:107AA0008091E20084FF28C080E189BD82E189BD28 +:107AB00009B400FEFDCF8091D8008F7D8093D8005F +:107AC0008091E1008F7E8093E1008091E2008F7EC3 +:107AD0008093E2008091E20081608093E2008091D7 +:107AE000B401882331F48091E30087FD02C081E076 +:107AF00001C084E08EBBECD18091E10083FF21C006 +:107B00008091E20083FF1DC08091E100877F809318 +:107B1000E10082E08EBB1092B4018091E1008E7F83 +:107B20008093E1008091E2008E7F8093E20080915B +:107B3000E20080618093E20080E060E042E0D8DE15 +:107B4000C7D1FF91EF91BF91AF919F918F917F919D +:107B50006F915F914F913F912F910F900FBE0F90BA +:107B60001F9018959C014091BC015091BD01461792 +:107B7000570718F4F90190E044C06115710511F040 +:107B8000AB01F8CF8091E8008E778093E80040E069 +:107B900050E0F0CF8EB3882309F444C0853009F457 +:107BA00043C08091E80083FF02C081E00895809186 +:107BB000E80082FD31C08091E80080FF22C0809102 +:107BC000F3009091F200782F60E0292F30E0262B0F +:107BD000372B07C081918093F100415050402F5FB7 +:107BE0003F4F4115510519F02830310598F390E0C9 +:107BF0002830310509F491E08091E8008E77809378 +:107C0000E8004115510531F6992321F605C08EB3E0 +:107C1000882341F0853041F08091E80082FFF7CF62 +:107C200080E0089582E0089583E008959C01611545 +:107C3000710529F48091E8008B778093E800F901C1 +:107C400026C08EB3882391F1853091F18091E800B0 +:107C500083FF02C081E008958091E80082FFF1CFA8 +:107C600006C08091F10081936150704059F02091DD +:107C7000F3008091F200322F20E090E0822B932BD2 +:107C8000892B79F78091E8008B778093E800611564 +:107C90007105B9F605C08EB3882341F0853041F0F7 +:107CA0008091E80080FFF7CF80E0089582E008959A +:107CB00083E008950F931F93DF93CF9300D0CDB748 +:107CC000DEB7E6EBF1E08091F100819381E0EE3BDD +:107CD000F807C9F729DD8091E80083FFE4C08091AF +:107CE000B6019091B701953009F46DC0963040F41B +:107CF000913081F1913070F0933009F0D4C02AC0F6 +:107D0000983009F4A3C0993009F4B2C0963009F054 +:107D1000CAC07CC0803809F4C6C0823809F0C3C02C +:107D20008091BA0187708093E9008091EB001092F6 +:107D3000E9002091E800277F2093E80090E025E00B +:107D4000969587952A95E1F781708093F1001092BE +:107D5000F10087C0882319F0823009F0A4C08F7128 +:107D6000823009F0A0C08091B801882331F52091BC +:107D7000BA01277009F497C02093E9008091EB00C5 +:107D800080FF1BC0933021F48091EB00806213C010 +:107D90008091EB0080618093EB0081E090E002C075 +:107DA000880F991F2A95E2F78093EA001092EA0063 +:107DB0008091EB0088608093EB001092E900809145 +:107DC000E800877F51C0882309F06DC01091B80189 +:107DD0001F770FB7F8948091E800877F8093E800C1 +:107DE0009ADD8091E80080FFFCCF8091E3008078ED +:107DF000812B8093E30080688093E300112311F4CA +:107E000082E001C083E08EBB0FBF4DC0805882303E +:107E100008F049C08091B8019091B9016091BA0110 +:107E2000AE014F5F5F4F36DDBC01009709F43BC0E8 +:107E30008091E800877F8093E80089819A8192DEB3 +:107E40008091E8008B778093E8002DC0803859F549 +:107E50008091E800877F8093E8008091B40180934F +:107E6000F1008091E8008E778093E80054DD1BC01C +:107E70008823C9F49091B8019230A8F48091E80069 +:107E8000877F8093E8009093B40145DD8091B40131 +:107E9000882331F48091E30087FD02C081E001C0B6 +:107EA00084E08EBB71DC8091E80083FF0AC0809182 +:107EB000EB0080628093EB008091E800877F8093E5 +:107EC000E8000F900F90CF91DF911F910F910895CF +:107ED00008951F938EB3882361F01091E9001092EA +:107EE000E9008091E80083FF01C0E4DE1770109381 +:107EF000E9001F910895F999FECF92BD81BDF89ACE +:107F0000992780B50895262FF999FECF1FBA92BD03 +:107F100081BD20BD0FB6F894FA9AF99A0FBE01966A +:067F20000895F894FFCF64 +:107F26004341544552494E41007777000A0100000B +:107F360000000000081201100102000008412301A0 +:107F46000701000201000109023E00020100803221 +:107F560009040000010202010005240010010424A6 +:107F660002040524060001070582030800FF090430 +:107F76000100020A000000070504021000010705BF +:107F86008302100001040309042203410072006405 +:107F960000750069006E006F0020004C0065006FE0 +:107FA600006E006100720064006F0000001803415B +:107FB6000072006400750069006E006F0020004CBE +:087FC600004C00430000000024 +:040000030000700089 +:00000001FF diff --git a/bootloaders/caterina/Descriptors.c b/bootloaders/caterina/Descriptors.c new file mode 100755 index 0000000..f1756e2 --- /dev/null +++ b/bootloaders/caterina/Descriptors.c @@ -0,0 +1,265 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +const USB_Descriptor_Device_t DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_NoSpecificSubclass, + .Protocol = CDC_CSCP_NoSpecificProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x2341, + .ProductID = 0x0701, + .ReleaseNumber = VERSION_BCD(00.01), + + .ManufacturerStrIndex = 0x02, + .ProductStrIndex = 0x01, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_ACMSubclass, + .Protocol = CDC_CSCP_ATCommandProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_Header = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x00, + + .CDCSpecification = VERSION_BCD(01.10), + }, + + .CDC_Functional_ACM = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x02, + + .Capabilities = 0x04, + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, + .Subtype = 0x06, + + .MasterInterfaceNumber = 0, + .SlaveInterfaceNumber = 1, + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = CDC_CSCP_CDCDataClass, + .SubClass = CDC_CSCP_NoDataSubclass, + .Protocol = CDC_CSCP_NoDataProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t ProductString = +{ + .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Leonardo" +}; +/* +const USB_Descriptor_String_t SerialNumString = +{ + .Header = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String}, + + .UnicodeString = L"000000001452" +}; +*/ +const USB_Descriptor_String_t ManufNameString = +{ + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino LLC" +}; + +/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + if (!(DescriptorNumber)) + { + Address = &LanguageString; + Size = LanguageString.Header.Size; + } + else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) + { + Address = &ProductString; + Size = ProductString.Header.Size; +// } else if (DescriptorNumber == DeviceDescriptor.SerialNumStrIndex) +// { +// Address = &SerialNumString; +// Size = SerialNumString.Header.Size; + } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) + { + Address = &ManufNameString; + Size = ManufNameString.Header.Size; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} + diff --git a/bootloaders/caterina/Descriptors.h b/bootloaders/caterina/Descriptors.h new file mode 100755 index 0000000..94091ae --- /dev/null +++ b/bootloaders/caterina/Descriptors.h @@ -0,0 +1,139 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + /* Macros: */ + #if defined(__AVR_AT90USB1287__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB647__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB1286__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB646__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega32U6__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x87 + #elif defined(__AVR_ATmega16U4__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x8A + #elif defined(__AVR_ATmega16U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB162__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega8U2__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB82__) + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #else + #error The selected AVR part is not currently supported by this bootloader. + #endif + + /** Endpoint number for the CDC control interface event notification endpoint. */ + #define CDC_NOTIFICATION_EPNUM 2 + + /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ + #define CDC_TX_EPNUM 3 + + /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ + #define CDC_RX_EPNUM 4 + + /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ + #define CDC_TXRX_EPSIZE 16 + + /** Size of the CDC control interface notification endpoint bank, in bytes. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + + // CDC Control Interface + USB_Descriptor_Interface_t CDC_CCI_Interface; + USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; + USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; + USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + + // CDC Data Interface + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) + ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif + diff --git a/bootloaders/caterina/Makefile b/bootloaders/caterina/Makefile old mode 100644 new mode 100755 index 8075a56..5439b5b --- a/bootloaders/caterina/Makefile +++ b/bootloaders/caterina/Makefile @@ -1,105 +1,717 @@ -############################################################################### -# Makefile for Caterina (formerly DiskLoader) -############################################################################### - -## General Flags -PROJECT = Caterina -TARGET = Caterina.elf -CC = avr-gcc - -# BOARD2 -MCU = atmega32u4 -AVR_FREQ = 16000000L - -# Specify the Arduino model using the assigned PID. This is used by Descriptors.c -# to set PID and product descriptor string - -# Arduino Leonardo bootloader PID -ARDUINO_MODEL_PID = 0x0034 -# Arduino Micro bootloader PID -#ARDUINO_MODEL_PID = 0x0035 - -# Change if your programmer is different -AVRDUDE_PROGRAMMER = avrispmkII -AVRDUDE_PORT = usb - -# program name should not be changed... -PROGRAM = Caterina - -AVRDUDE = avrdude -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -p $(MCU) - -## Options common to compile, link and assembly rules -COMMON = -mmcu=$(MCU) - -override CFLAGS = -g -Wall -Os -mmcu=$(MCU) -DF_CPU=$(AVR_FREQ) -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) $(DEFS) -ffunction-sections -gdwarf-2 -fdata-sections -fno-split-wide-types - -## Assembly specific flags -ASMFLAGS = $(COMMON) -ASMFLAGS += $(CFLAGS) -ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2 - -## Linker flags -LDFLAGS = $(COMMON) -LDFLAGS += -Wl,-gc-sections,-Map=Caterina.map,--section-start=.text=0x7800,--relax -LDFLAGS += -nodefaultlibs -nostartfiles - -## Intel Hex file production flags -HEX_EEPROM_FLAGS = -j .eeprom -HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" -HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings - -## Objects explicitly added by the user -LINKONLYOBJECTS = - -MODULES := . -SRC_DIR := $(addprefix src/,$(MODULES)) -BUILD_DIR := $(addprefix build/,$(MODULES)) - -SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cpp)) -OBJ := $(patsubst src/%.cpp,build/%.o,$(SRC)) -DEP := $(OBJ:%.o=%.d) -INCLUDES := $(addprefix -I,$(SRC_DIR)) - -vpath %.cpp $(SRC_DIR) - -.PHONY: all checkdirs clean - -all: checkdirs $(TARGET) Caterina.hex Caterina.lss size - --include $(DEP) - -checkdirs: $(BUILD_DIR) - -$(BUILD_DIR): - @mkdir -p $@ - -clean: - @rm -rf build/ - @rm -f *.hex - @rm -f *.elf - @rm -f *.lss - @rm -f *.map - -define make-goal -$1/%.o: %.cpp - $(CC) $(INCLUDES) $(CFLAGS) -c $$< -MD -o $$@ -endef - -$(foreach bdir,$(BUILD_DIR),$(eval $(call make-goal,$(bdir)))) - -$(TARGET): $(OBJ) - $(CC) $(LDFLAGS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) $^ -o $@ - -%.hex: $(TARGET) - avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ - -%.lss: $(TARGET) - avr-objdump -h -S $< > $@ - -size: $(TARGET) - @echo -# @avr-size -C --mcu=${MCU} ${TARGET}.elf - -program: $(TARGET).hex - $(AVRDUDE) $(AVRDUDE_FLAGS) -B 1 -u -U flash:w:$(TARGET).hex \ No newline at end of file +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + + +# MCU name +MCU = atmega32u4 + + +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Starting byte address of the bootloader, as a byte address - computed via the formula +# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) +# +# Note that the bootloader size and start address given in AVRStudio is in words and not +# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. +FLASH_SIZE_KB = 32 +BOOT_SECTION_SIZE_KB = 4 +BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Caterina + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../../../../../LUFA-111009 + + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D ORDERED_EP_CONFIG +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_RAM_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D NO_INTERNAL_SERIAL +LUFA_OPTS += -D NO_DEVICE_SELF_POWER +LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP +LUFA_OPTS += -D NO_SOF_EVENTS + +#LUFA_OPTS += -D NO_BLOCK_SUPPORT +#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT +#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT +#LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=c99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_USB=$(F_USB)UL +CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CDEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_USB=$(F_USB)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +ADEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_USB=$(F_USB)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkII + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation \($(TARGET)\)... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +checksource: + @for f in $(SRC) $(CPPSRC) $(ASRC); do \ + if [ -f $$f ]; then \ + echo "Found Source File: $$f" ; \ + else \ + echo "Source File Not Found: $$f" ; \ + fi; done + + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program debug gdb-config checksource + diff --git a/bootloaders/caterina/src/Caterina.cpp b/bootloaders/caterina/src/Caterina.cpp deleted file mode 100644 index 7ef6fa8..0000000 --- a/bootloaders/caterina/src/Caterina.cpp +++ /dev/null @@ -1,251 +0,0 @@ - - -#include "Platform.h" - -// This bootloader creates a composite Serial device -// -// The serial interface supports a STK500v1 protocol that is very similar to optiboot -// -// The bootloader will timeout and start the firmware after a few hundred milliseconds -// if a usb connection is not detected. -// -// The tweakier code is to keep the bootloader below 2k (no interrupt table, for example) - -extern "C" -void entrypoint(void) __attribute__ ((naked)) __attribute__ ((section (".vectors"))); -void entrypoint(void) -{ - asm volatile ( - "eor r1, r1\n" // Zero register - "out 0x3F, r1\n" // SREG - "ldi r28, 0xFF\n" - "ldi r29, 0x0A\n" - "out 0x3E, r29\n" // SPH - "out 0x3D, r28\n" // SPL - "rjmp main" // Stack is all set up, start the main code - ::); -} - -uint8_t _flashbuf[128]; -uint8_t _inSync; -uint8_t _ok; -extern volatile uint8_t _ejected; -extern volatile uint16_t _timeout; - -void Program(uint8_t ep, uint16_t page, uint8_t count) -{ - uint8_t write = page < 30*1024; // Don't write over firmware please - if (write) - boot_page_erase(page); - - Recv(ep,_flashbuf,count); // Read while page is erasing - - if (!write) - return; - - boot_spm_busy_wait(); // Wait until the memory is erased. - - count >>= 1; - uint16_t* p = (uint16_t*)page; - uint16_t* b = (uint16_t*)_flashbuf; - for (uint8_t i = 0; i < count; i++) - boot_page_fill(p++, b[i]); - - boot_page_write(page); - boot_spm_busy_wait(); - boot_rww_enable (); -} - -void StartSketch(); -int USBGetChar(); -#define getch USBGetChar - -#define HW_VER 0x02 -#define SW_MAJOR 0x01 -#define SW_MINOR 0x10 - -#define STK_OK 0x10 -#define STK_INSYNC 0x14 // ' ' -#define CRC_EOP 0x20 // 'SPACE' -#define STK_GET_SYNC 0x30 // '0' - -#define STK_GET_PARAMETER 0x41 // 'A' -#define STK_SET_DEVICE 0x42 // 'B' -#define STK_SET_DEVICE_EXT 0x45 // 'E' -#define STK_LOAD_ADDRESS 0x55 // 'U' -#define STK_UNIVERSAL 0x56 // 'V' -#define STK_PROG_PAGE 0x64 // 'd' -#define STK_READ_PAGE 0x74 // 't' -#define STK_READ_SIGN 0x75 // 'u' - -extern const uint8_t _readSize[] PROGMEM; -const uint8_t _readSize[] = -{ - STK_GET_PARAMETER, 1, - STK_SET_DEVICE, 20, - STK_SET_DEVICE_EXT, 5, - STK_UNIVERSAL, 4, - STK_LOAD_ADDRESS, 2, - STK_PROG_PAGE, 3, - STK_READ_PAGE, 3, - 0,0 -}; - -extern const uint8_t _consts[] PROGMEM; -const uint8_t _consts[] = -{ - SIGNATURE_0, - SIGNATURE_1, - SIGNATURE_2, - HW_VER, // Hardware version - SW_MAJOR, // Software major version - SW_MINOR, // Software minor version - 0x03, // Unknown but seems to be required by avr studio 3.56 - 0x00, // -}; - - -void USBInit(void); -int main(void) __attribute__ ((naked)); - -// STK500v1 main loop, very similar to optiboot in protocol and implementation -int main() -{ - uint8_t MCUSR_state = MCUSR; // store the reason for the reset - MCUSR &= ~(1 << WDRF); // must clear the watchdog reset flag before disabling and reenabling WDT - wdt_disable(); - TX_LED_OFF(); - RX_LED_OFF(); - L_LED_OFF(); - if (MCUSR_state & (1< 2) - i = (i == 0x18) ? 3 : 4; // 0x80:HW_VER,0x81:SW_MAJOR,0x82:SW_MINOR,0x18:3 or 0 - pgm = _consts + i + 3; - send = 1; - } - - else if (STK_UNIVERSAL == cmd) - { - if (packet[0] == 0x30) - pgm = _consts + packet[2]; // read signature - send = 1; - } - - // Read signature bytes - else if (STK_READ_SIGN == cmd) - { - pgm = _consts; - send = 3; - } - - else if (STK_LOAD_ADDRESS == cmd) - { - address = *((uint16_t*)packet); // word addresses - address += address; - } - - else if (STK_PROG_PAGE == cmd) - { - Program(CDC_RX,address,packet[1]); - } - - else if (STK_READ_PAGE == cmd) - { - send = packet[1]; - pgm = (const uint8_t*)address; - address += send; // not sure of this is required - } - - // Check sync - if (getch() != ' ') - break; - Transfer(CDC_TX,&_inSync,1); - - // Send result - if (send) - Transfer(CDC_TX|TRANSFER_PGM,pgm,send); // All from pgm memory - - // Send ok - Transfer(CDC_TX|TRANSFER_RELEASE,&_ok,1); - - if (cmd == 'Q') - break; - } - _timeout = 500; // wait a moment before exiting the bootloader - may need to finish responding to 'Q' for example - _ejected = 1; - } -} - -// Nice breathing LED indicates we are in the firmware -uint16_t _pulse; -void LEDPulse() -{ - _pulse += 4; - uint8_t p = _pulse >> 9; - if (p > 63) - p = 127-p; - p += p; - if (((uint8_t)_pulse) > p) - L_LED_OFF(); - else - L_LED_ON(); -} - -void StartSketch() -{ - TX_LED_OFF(); // switch off the RX and TX LEDs before starting the user sketch - RX_LED_OFF(); - UDCON = 1; // Detach USB - UDIEN = 0; - asm volatile ( // Reset vector to run firmware - "clr r30\n" - "clr r31\n" - "ijmp\n" - ::); -} - -void Reset() -{ - wdt_enable(WDTO_15MS); // reset the microcontroller to reinitialize all IO and other registers - for (;;) - ; -} diff --git a/bootloaders/caterina/src/Platform.h b/bootloaders/caterina/src/Platform.h deleted file mode 100644 index 26c1114..0000000 --- a/bootloaders/caterina/src/Platform.h +++ /dev/null @@ -1,49 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) -#define DISABLE_JTAG() MCUCR = (1 << JTD) | (1 << IVCE) | (0 << PUD); MCUCR = (1 << JTD) | (0 << IVSEL) | (0 << IVCE) | (0 << PUD); - -#define USB_PID_LEONARDO_BOOTLOADER 0x0034 -#define USB_PID_MICRO_BOOTLOADER 0x0035 -#define USB_VID 0x2341 // arduino LLC vid -#define USB_PID ARDUINO_MODEL_PID // passed in by Makefile - 0x0034 for Leonardo, 0x0035 for MIcro - -#define USB_SERIAL_STRING '0','0','0','0','0','0','0','0','1','7','0','1' - -#define OEM_NAME 'l','e','o','n','a','r','d','o' // 8 chars -#define BOARD_INIT() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); CPU_PRESCALE(0); DISABLE_JTAG(); -#define L_LED_OFF() PORTC &= ~(1<<7) -#define L_LED_ON() PORTC |= (1<<7) -#define TX_LED_OFF() PORTD |= (1<<5) -#define TX_LED_ON() PORTD &= ~(1<<5) -#define RX_LED_OFF() PORTB |= (1<<0) -#define RX_LED_ON() PORTB &= ~(1<<0) - -#define TRANSFER_PGM 0x80 -#define TRANSFER_RELEASE 0x40 -#define TRANSFER_ZERO 0x20 - -void Transfer(uint8_t ep, const uint8_t* data, int len); -void Recv(uint8_t ep, uint8_t* dst, uint8_t len); -void Program(uint8_t ep, uint16_t page, uint8_t count); - -/* HID is not fully-supported in the bootloader - can be enabled - for testing, but note the descriptor report and other parts are - not complete */ -#define HID_ENABLED - -#include "USBCore.h" -#include "USBDesc.h" - - diff --git a/bootloaders/caterina/src/USBCore.cpp b/bootloaders/caterina/src/USBCore.cpp deleted file mode 100644 index 0eecacc..0000000 --- a/bootloaders/caterina/src/USBCore.cpp +++ /dev/null @@ -1,512 +0,0 @@ - - -/* Copyright (c) 2010, Peter Barrett -** -** Permission to use, copy, modify, and/or distribute this software for -** any purpose with or without fee is hereby granted, provided that the -** above copyright notice and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR -** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -** SOFTWARE. -*/ - -#include "Platform.h" - -#define CDC_TX CDC_ENDPOINT_IN -#define CDC_RX CDC_ENDPOINT_OUT - -#define EP_TYPE_CONTROL 0x00 -#define EP_TYPE_BULK_IN 0x81 -#define EP_TYPE_BULK_OUT 0x80 -#define EP_TYPE_INTERRUPT_IN 0xC1 -#define EP_TYPE_INTERRUPT_OUT 0xC0 -#define EP_TYPE_ISOCHRONOUS_IN 0x41 -#define EP_TYPE_ISOCHRONOUS_OUT 0x40 - -/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ -#define TX_RX_LED_PULSE_MS 100 -uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ -uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ - -void Reset(); - -//================================================================== -//================================================================== - -typedef struct -{ - uint32_t dwDTERate; - uint8_t bCharFormat; - uint8_t bParityType; - uint8_t bDataBits; - uint8_t lineState; -} LineInfo; - -static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; - -//================================================================== -//================================================================== - -// 4 bytes of RAM -volatile uint8_t _usbConfiguration; -volatile uint8_t _ejected; -volatile uint16_t _timeout; - -static inline void WaitIN(void) -{ - while (!(UEINTX & (1<> 8) - -#define RAWHID_USAGE_PAGE 0xFFC0 -#define RAWHID_USAGE 0x0C00 -#define RAWHID_TX_SIZE 64 -#define RAWHID_RX_SIZE 64 - -const uint8_t _rawHID[] = -{ - // RAW HID - 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 - 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), - - 0xA1, 0x01, // Collection 0x01 - 0x85, 0x03, // REPORT_ID (3) - 0x75, 0x08, // report size = 8 bits - 0x15, 0x00, // logical minimum = 0 - 0x26, 0xFF, 0x00, // logical maximum = 255 - - 0x95, 64, // report count TX - 0x09, 0x01, // usage - 0x81, 0x02, // Input (array) - - 0x95, 64, // report count RX - 0x09, 0x02, // usage - 0x91, 0x02, // Output (array) - 0xC0 // end collection -}; - -uint8_t _cdcComposite = 0; - -bool SendDescriptor() -{ - Setup& setup = _setup; - uint16_t desc_length = 0; - const uint8_t* desc_addr = 0; - - uint8_t t = setup.wValueH; - if (0x22 == t) - { -#ifdef HID_ENABLED - desc_addr = _rawHID; - desc_length = sizeof(desc_length); -#endif - } else if (USB_DEVICE_DESCRIPTOR_TYPE == t) - { - if (setup.wLength == 8) - _cdcComposite = 1; - desc_addr = _cdcComposite ? (const uint8_t*)&USB_DeviceDescriptorA : (const uint8_t*)&USB_DeviceDescriptor; - } - else if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) - { - desc_addr = (const uint8_t*)&USB_ConfigDescriptor; - desc_length = sizeof(USB_ConfigDescriptor); - } - else if (USB_STRING_DESCRIPTOR_TYPE == t) - { - if (setup.wValueL == 0) - desc_addr = (const uint8_t*)&STRING_LANGUAGE; - else if (setup.wValueL == IPRODUCT) - desc_addr = (const uint8_t*)&STRING_IPRODUCT; - else if (setup.wValueL == ISERIAL) - desc_addr = (const uint8_t*)&STRING_SERIAL; - else if (setup.wValueL == IMANUFACTURER) - desc_addr = (const uint8_t*)&STRING_IMANUFACTURER; - else - return false; - } else - return false; - - if (desc_length == 0) - desc_length = pgm_read_byte(desc_addr); - if (setup.wLength < desc_length) - desc_length = setup.wLength; - - // Send descriptor - // EP0 is 64 bytes long - // RWAL and FIFOCON don't work on EP0 - uint16_t n = 0; - do - { - if (!WaitForINOrOUT()) - return false; - Send8(pgm_read_byte(&desc_addr[n++])); - uint8_t clr = n & 0x3F; - if (!clr) - ClearIN(); // Fifo is full, release this packet - } while (n < desc_length); - return true; -} - -void USBSetupInterrupt() -{ - SetEP(0); - if (!ReceivedSetupInt()) - return; - - Setup& setup = _setup; // global saves ~30 bytes - Recv((uint8_t*)&setup,8); - ClearSetupInt(); - - if (setup.bmRequestType & DEVICETOHOST) - WaitIN(); - else - ClearIN(); - - bool ok = true; - uint8_t r = setup.bRequest; - if (SET_ADDRESS == r) - { - WaitIN(); - UDADDR = setup.wValueL | (1<> 8) & 0xFF) - -#define CDC_V1_10 0x0110 -#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02 - -#define CDC_CALL_MANAGEMENT 0x01 -#define CDC_ABSTRACT_CONTROL_MODEL 0x02 -#define CDC_HEADER 0x00 -#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02 -#define CDC_UNION 0x06 -#define CDC_CS_INTERFACE 0x24 -#define CDC_CS_ENDPOINT 0x25 -#define CDC_DATA_INTERFACE_CLASS 0x0A - - -// Device -typedef struct { - uint8_t len; // 18 - uint8_t dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE - uint16_t usbVersion; // 0x200 - uint8_t deviceClass; - uint8_t deviceSubClass; - uint8_t deviceProtocol; - uint8_t packetSize0; // Packet 0 - uint16_t idVendor; - uint16_t idProduct; - uint16_t deviceVersion; // 0x100 - uint8_t iManufacturer; - uint8_t iProduct; - uint8_t iSerialNumber; - uint8_t bNumConfigurations; -} DeviceDescriptor; - -// Config -typedef struct { - uint8_t len; // 9 - uint8_t dtype; // 2 - uint16_t clen; // total length - uint8_t numInterfaces; - uint8_t config; - uint8_t iconfig; - uint8_t attributes; - uint8_t maxPower; -} ConfigDescriptor; - -// String - -// Interface -typedef struct -{ - uint8_t len; // 9 - uint8_t dtype; // 4 - uint8_t number; - uint8_t alternate; - uint8_t numEndpoints; - uint8_t interfaceClass; - uint8_t interfaceSubClass; - uint8_t protocol; - uint8_t iInterface; -} InterfaceDescriptor; - -// Endpoint -typedef struct -{ - uint8_t len; // 7 - uint8_t dtype; // 5 - uint8_t addr; - uint8_t attr; - uint16_t packetSize; - uint8_t interval; -} EndpointDescriptor; - -// Interface Association Descriptor -// Used to bind 2 interfaces together in CDC compostite device -typedef struct -{ - uint8_t len; // 8 - uint8_t dtype; // 11 - uint8_t firstInterface; - uint8_t interfaceCount; - uint8_t functionClass; - uint8_t funtionSubClass; - uint8_t functionProtocol; - uint8_t iInterface; -} IADDescriptor; - -// CDC CS interface descriptor -typedef struct -{ - uint8_t len; // 5 - uint8_t dtype; // 0x24 - uint8_t subtype; - uint8_t d0; - uint8_t d1; -} CDCCSInterfaceDescriptor; - -typedef struct -{ - uint8_t len; // 4 - uint8_t dtype; // 0x24 - uint8_t subtype; - uint8_t d0; -} CDCCSInterfaceDescriptor4; - -typedef struct -{ - IADDescriptor iad; // Only needed on compound device - - // Control - InterfaceDescriptor cif; // - CDCCSInterfaceDescriptor header; - CDCCSInterfaceDescriptor callManagement; - CDCCSInterfaceDescriptor4 controlManagement; - CDCCSInterfaceDescriptor functionalDescriptor; - EndpointDescriptor cifin; - - // Data - InterfaceDescriptor dif; - EndpointDescriptor in; - EndpointDescriptor out; -} CDCDescriptor; - -typedef struct -{ - uint8_t len; // 9 - uint8_t dtype; // 0x21 - uint8_t addr; - uint8_t versionL; // 0x101 - uint8_t versionH; // 0x101 - uint8_t country; - uint8_t desctype; // 0x22 report - uint8_t descLenL; - uint8_t descLenH; -} HIDDescDescriptor; - -typedef struct -{ - InterfaceDescriptor hid; - HIDDescDescriptor desc; - EndpointDescriptor in; -} HIDDescriptor; - -#define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \ - { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs } - -#define D_CONFIG(_totalLength,_interfaces) \ - { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(100) } - -#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \ - { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 } - -#define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \ - { 7, 5, _addr,_attr,_packetSize, _interval } - -#define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \ - { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 } - -#define D_HIDREPORT(_descriptorLength) \ - { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 } - -#define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 } -#define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 } - -#endif \ No newline at end of file diff --git a/bootloaders/caterina/src/USBDesc.cpp b/bootloaders/caterina/src/USBDesc.cpp deleted file mode 100644 index a84f3be..0000000 --- a/bootloaders/caterina/src/USBDesc.cpp +++ /dev/null @@ -1,83 +0,0 @@ - - -/* Copyright (c) 2011, Peter Barrett -** -** Permission to use, copy, modify, and/or distribute this software for -** any purpose with or without fee is hereby granted, provided that the -** above copyright notice and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR -** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -** SOFTWARE. -*/ - -#include "Platform.h" - -//==================================================================================================== -//==================================================================================================== -// Actual device descriptors - -const uint16_t STRING_LANGUAGE[2] = { - (3<<8) | (2+2), - 0x0409 // English -}; - -const uint16_t STRING_SERIAL[13] = { - (3<<8) | (2+2*12), - USB_SERIAL_STRING -}; - -const uint16_t STRING_IPRODUCT[28] = { - (3<<8) | (2+2*27), -#if USB_PID == USB_PID_LEONARDO_BOOTLOADER - 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o',' ','b','o','o','t','l','o','a','d','e','r' -#elif USB_PID == USB_PID_MICRO_BOOTLOADER - 'A','r','d','u','i','n','o',' ','M','i','c','r','o',' ','b','o','o','t','l','o','a','d','e','r',' ',' ',' ' -#endif -}; - -const uint16_t STRING_IMANUFACTURER[12] = { - (3<<8) | (2+2*11), - 'A','r','d','u','i','n','o',' ','L','L','C' -}; - -DeviceDescriptor USB_DeviceDescriptorA = D_DEVICE(0X02,0X00,0X00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); -DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,0,IPRODUCT,ISERIAL,1); - -Config USB_ConfigDescriptor = -{ - D_CONFIG(sizeof(Config),INTERFACE_COUNT), - - // CDC - { - D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1), - - // CDC communication interface - D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), - D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd) - D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management - D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,2), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported - D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 - D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40), - - // CDC data interface - D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0), - D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,0x40,0), - D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,0x40,0) - }, - -#ifdef HID_ENABLED - // HID - { - D_INTERFACE(HID_INTERFACE,1,3,0,0), - D_HIDREPORT(30), - D_ENDPOINT(USB_ENDPOINT_IN (HID_ENDPOINT_INT),USB_ENDPOINT_TYPE_INTERRUPT,0x40,0x40) - } -#endif -}; - diff --git a/bootloaders/caterina/src/USBDesc.h b/bootloaders/caterina/src/USBDesc.h deleted file mode 100644 index fa962e9..0000000 --- a/bootloaders/caterina/src/USBDesc.h +++ /dev/null @@ -1,60 +0,0 @@ - - -/* Copyright (c) 2011, Peter Barrett -** -** Permission to use, copy, modify, and/or distribute this software for -** any purpose with or without fee is hereby granted, provided that the -** above copyright notice and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR -** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -** SOFTWARE. -*/ - -#ifndef HID_ENABLED // HID is NOT enabled - #define CDC_ACM_INTERFACE 0 // CDC ACM - #define CDC_DATA_INTERFACE 1 // CDC Data - #define CDC_ENDPOINT_ACM 1 - #define CDC_ENDPOINT_OUT 2 - #define CDC_ENDPOINT_IN 3 - #define INTERFACE_COUNT 2 // 2 for CDC -#else // HID is enabled - #define CDC_ACM_INTERFACE 0 // CDC ACM - #define CDC_DATA_INTERFACE 1 // CDC Data - #define CDC_ENDPOINT_ACM 1 - #define CDC_ENDPOINT_OUT 2 - #define CDC_ENDPOINT_IN 3 - #define HID_INTERFACE 2 // HID Interface - #define HID_ENDPOINT_INT 4 - #define INTERFACE_COUNT 3 // 2 for CDC + 1 for hid -#endif - -typedef struct -{ - ConfigDescriptor config; - CDCDescriptor cdc; -#ifdef HID_ENABLED - HIDDescriptor hid; -#endif -} Config; - -extern Config USB_ConfigDescriptor PROGMEM; -extern DeviceDescriptor USB_DeviceDescriptor PROGMEM; -extern DeviceDescriptor USB_DeviceDescriptorA PROGMEM; - -extern const uint16_t STRING_LANGUAGE[2] PROGMEM; -extern const uint16_t STRING_IPRODUCT[28] PROGMEM; -extern const uint16_t STRING_IMANUFACTURER[12] PROGMEM; -extern const uint16_t STRING_SERIAL[13] PROGMEM; - -#define IMANUFACTURER 1 -#define IPRODUCT 2 -#define ISERIAL 3 - -#define CDC_TX CDC_ENDPOINT_IN -#define CDC_RX CDC_ENDPOINT_OUT \ No newline at end of file diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c deleted file mode 100755 index c8e82a9..0000000 --- a/bootloaders/caterina_LUFA/Caterina.c +++ /dev/null @@ -1,698 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Main source file for the CDC class bootloader. This file contains the complete bootloader logic. - */ - -#define INCLUDE_FROM_CATERINA_C -#include "Caterina.h" - -/** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some - * operating systems will not open the port unless the settings can be set successfully. - */ -static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0, - .CharFormat = CDC_LINEENCODING_OneStopBit, - .ParityType = CDC_PARITY_None, - .DataBits = 8 }; - -/** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host, - * and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued - * command.) - */ -static uint32_t CurrAddress; - -/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run - * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite - * loop until the AVR restarts and the application runs. - */ -static bool RunBootloader = true; - -/* Pulse generation counters to keep track of the time remaining for each pulse type */ -#define TX_RX_LED_PULSE_PERIOD 100 -uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse -uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse - -/* Bootloader timeout timer */ -uint16_t Timeout = 0; - -uint16_t bootKey = 0x7777; -volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0A00; - -void StartSketch(void) -{ - cli(); - - /* Undo TIMER1 setup and clear the count before running the sketch */ - TIMSK1 = 0; - TCCR1B = 0; - TCNT1H = 0; // 16-bit write to TCNT1 requires high byte be written first - TCNT1L = 0; - - /* Relocate the interrupt vector table to the application section */ - MCUCR = (1 << IVCE); - MCUCR = 0; - - L_LED_OFF(); - TX_LED_OFF(); - RX_LED_OFF(); - - /* jump to beginning of application space */ - __asm__ volatile("jmp 0x0000"); -} - -/* Breathing animation on L LED indicates bootloader is running */ -uint16_t LLEDPulse; -void LEDPulse(void) -{ - LLEDPulse++; - uint8_t p = LLEDPulse >> 8; - if (p > 127) - p = 254-p; - p += p; - if (((uint8_t)LLEDPulse) > p) - L_LED_OFF(); - else - L_LED_ON(); -} - -/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously - * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start - * the loaded application code. - */ -int main(void) -{ - /* Watchdog may be configured with a 15 ms period so must disable it before doing anything else */ - wdt_disable(); - - /* Check the reason for the reset and act accordingly */ - uint8_t mcusr_state = MCUSR; // store the initial state of the Status register - MCUSR = 0; // clear all reset flags - // After a power-on reset skip the bootloader and jump straight to sketch - // if one exists. - if (mcusr_state & (1< 8000) - RunBootloader = false; - - LEDPulse(); - } - - /* Disconnect from the host - USB interface will be reset later along with the AVR */ - USB_Detach(); - - /* Jump to beginning of application space to run the sketch - do not reset */ - StartSketch(); -} - -/** Configures all hardware required for the bootloader. */ -void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Disable clock division */ - clock_prescale_set(clock_div_1); - - /* Relocate the interrupt vector table to the bootloader section */ - MCUCR = (1 << IVCE); - MCUCR = (1 << IVSEL); - - LED_SETUP(); - CPU_PRESCALE(0); - L_LED_OFF(); - TX_LED_OFF(); - RX_LED_OFF(); - - /* Initialize TIMER1 to handle bootloader timeout and LED tasks. - * With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz - * Our chosen compare match generates an interrupt every 1 ms. - * This interrupt is disabled selectively when doing memory reading, erasing, - * or writing since SPM has tight timing requirements. - */ - OCR1AH = 0; - OCR1AL = 250; - TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt - TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input - - /* Initialize USB Subsystem */ - USB_Init(); -} - -//uint16_t ctr = 0; -ISR(TIMER1_COMPA_vect, ISR_BLOCK) -{ - /* Reset counter */ - TCNT1H = 0; - TCNT1L = 0; - - /* Check whether the TX or RX LED one-shot period has elapsed. if so, turn off the LED */ - if (TxLEDPulse && !(--TxLEDPulse)) - TX_LED_OFF(); - if (RxLEDPulse && !(--RxLEDPulse)) - RX_LED_OFF(); - - if (pgm_read_word(0) != 0xFFFF) - Timeout++; -} - -/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready - * to relay data to and from the attached USB host. - */ -void EVENT_USB_Device_ConfigurationChanged(void) -{ - /* Setup CDC Notification, Rx and Tx Endpoints */ - Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, - ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); - - Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE, - ENDPOINT_BANK_SINGLE); -} - -/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to - * the device from the USB host before passing along unhandled control requests to the library for processing - * internally. - */ -void EVENT_USB_Device_ControlRequest(void) -{ - /* Ignore any requests that aren't directed to the CDC interface */ - if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != - (REQTYPE_CLASS | REQREC_INTERFACE)) - { - return; - } - - /* Process CDC specific control requests */ - switch (USB_ControlRequest.bRequest) - { - case CDC_REQ_GetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Write the line coding data to the control endpoint */ - Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearOUT(); - } - - break; - case CDC_REQ_SetLineEncoding: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Read the line coding data in from the host into the global struct */ - Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); - Endpoint_ClearIN(); - } - - break; - } -} - -#if !defined(NO_BLOCK_SUPPORT) -/** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending - * on the AVR910 protocol command issued. - * - * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform - */ -static void ReadWriteMemoryBlock(const uint8_t Command) -{ - uint16_t BlockSize; - char MemoryType; - - bool HighByte = false; - uint8_t LowByte = 0; - - BlockSize = (FetchNextCommandByte() << 8); - BlockSize |= FetchNextCommandByte(); - - MemoryType = FetchNextCommandByte(); - - if ((MemoryType != 'E') && (MemoryType != 'F')) - { - /* Send error byte back to the host */ - WriteNextResponseByte('?'); - - return; - } - - /* Disable timer 1 interrupt - can't afford to process nonessential interrupts - * while doing SPM tasks */ - TIMSK1 = 0; - - /* Check if command is to read memory */ - if (Command == 'g') - { - /* Re-enable RWW section */ - boot_rww_enable(); - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* Read the next FLASH byte from the current FLASH page */ - #if (FLASHEND > 0xFFFF) - WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); - #else - WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); - #endif - - /* If both bytes in current word have been read, increment the address counter */ - if (HighByte) - CurrAddress += 2; - - HighByte = !HighByte; - } - else - { - /* Read the next EEPROM byte into the endpoint */ - WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - } - else - { - uint32_t PageStartAddress = CurrAddress; - - if (MemoryType == 'F') - { - boot_page_erase(PageStartAddress); - boot_spm_busy_wait(); - } - - while (BlockSize--) - { - if (MemoryType == 'F') - { - /* If both bytes in current word have been written, increment the address counter */ - if (HighByte) - { - /* Write the next FLASH word to the current FLASH page */ - boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - else - { - LowByte = FetchNextCommandByte(); - } - - HighByte = !HighByte; - } - else - { - /* Write the next EEPROM byte from the endpoint */ - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - /* Increment the address counter after use */ - CurrAddress += 2; - } - } - - /* If in FLASH programming mode, commit the page after writing */ - if (MemoryType == 'F') - { - /* Commit the flash page to memory */ - boot_page_write(PageStartAddress); - - /* Wait until write operation has completed */ - boot_spm_busy_wait(); - } - - /* Send response byte back to the host */ - WriteNextResponseByte('\r'); - } - - /* Re-enable timer 1 interrupt disabled earlier in this routine */ - TIMSK1 = (1 << OCIE1A); -} -#endif - -/** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed - * to allow reception of the next data packet from the host. - * - * \return Next received byte from the host in the CDC data OUT endpoint - */ -static uint8_t FetchNextCommandByte(void) -{ - /* Select the OUT endpoint so that the next data byte can be read */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* If OUT endpoint empty, clear it and wait for the next packet from the host */ - while (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearOUT(); - - while (!(Endpoint_IsOUTReceived())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return 0; - } - } - - /* Fetch the next byte from the OUT endpoint */ - return Endpoint_Read_8(); -} - -/** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the - * bank when full ready for the next byte in the packet to the host. - * - * \param[in] Response Next response byte to send to the host - */ -static void WriteNextResponseByte(const uint8_t Response) -{ - /* Select the IN endpoint so that the next data byte can be written */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* If IN endpoint full, clear it and wait until ready for the next packet to the host */ - if (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearIN(); - - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - } - - /* Write the next byte to the IN endpoint */ - Endpoint_Write_8(Response); - - TX_LED_ON(); - TxLEDPulse = TX_RX_LED_PULSE_PERIOD; -} - -#define STK_OK 0x10 -#define STK_INSYNC 0x14 // ' ' -#define CRC_EOP 0x20 // 'SPACE' -#define STK_GET_SYNC 0x30 // '0' - -#define STK_GET_PARAMETER 0x41 // 'A' -#define STK_SET_DEVICE 0x42 // 'B' -#define STK_SET_DEVICE_EXT 0x45 // 'E' -#define STK_LOAD_ADDRESS 0x55 // 'U' -#define STK_UNIVERSAL 0x56 // 'V' -#define STK_PROG_PAGE 0x64 // 'd' -#define STK_READ_PAGE 0x74 // 't' -#define STK_READ_SIGN 0x75 // 'u' - -/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions - * and send the appropriate response back to the host. - */ -void CDC_Task(void) -{ - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Check if endpoint has a command in it sent from the host */ - if (!(Endpoint_IsOUTReceived())) - return; - - RX_LED_ON(); - RxLEDPulse = TX_RX_LED_PULSE_PERIOD; - - /* Read in the bootloader command (first byte sent from host) */ - uint8_t Command = FetchNextCommandByte(); - - if (Command == 'E') - { - RunBootloader = false; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'T') - { - FetchNextCommandByte(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if ((Command == 'L') || (Command == 'P')) - { - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 't') - { - // Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader - WriteNextResponseByte(0x44); - WriteNextResponseByte(0x00); - } - else if (Command == 'a') - { - // Indicate auto-address increment is supported - WriteNextResponseByte('Y'); - } - else if (Command == 'A') - { - // Set the current address to that given by the host - CurrAddress = (FetchNextCommandByte() << 9); - CurrAddress |= (FetchNextCommandByte() << 1); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'p') - { - // Indicate serial programmer back to the host - WriteNextResponseByte('S'); - } - else if (Command == 'S') - { - // Write the 7-byte software identifier to the endpoint - for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) - WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); - } - else if (Command == 'V') - { - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); - WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); - } - else if (Command == 's') - { - WriteNextResponseByte(AVR_SIGNATURE_3); - WriteNextResponseByte(AVR_SIGNATURE_2); - WriteNextResponseByte(AVR_SIGNATURE_1); - } - else if (Command == 'e') - { - // Clear the application section of flash - for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) - { - boot_page_erase(CurrFlashAddress); - boot_spm_busy_wait(); - boot_page_write(CurrFlashAddress); - boot_spm_busy_wait(); - } - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - #if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) - else if (Command == 'l') - { - // Set the lock bits to those given by the host - boot_lock_bits_set(FetchNextCommandByte()); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - #endif - else if (Command == 'r') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); - } - else if (Command == 'F') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); - } - else if (Command == 'N') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); - } - else if (Command == 'Q') - { - WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); - } - #if !defined(NO_BLOCK_SUPPORT) - else if (Command == 'b') - { - WriteNextResponseByte('Y'); - - // Send block size to the host - WriteNextResponseByte(SPM_PAGESIZE >> 8); - WriteNextResponseByte(SPM_PAGESIZE & 0xFF); - } - else if ((Command == 'B') || (Command == 'g')) - { - Timeout = 0; - // Delegate the block write/read to a separate function for clarity - ReadWriteMemoryBlock(Command); - } - #endif - #if !defined(NO_FLASH_BYTE_SUPPORT) - else if (Command == 'C') - { - // Write the high byte to the current flash page - boot_page_fill(CurrAddress, FetchNextCommandByte()); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'c') - { - // Write the low byte to the current flash page - boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); - - // Increment the address - CurrAddress += 2; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'm') - { - // Commit the flash page to memory - boot_page_write(CurrAddress); - - // Wait until write operation has completed - boot_spm_busy_wait(); - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'R') - { - #if (FLASHEND > 0xFFFF) - uint16_t ProgramWord = pgm_read_word_far(CurrAddress); - #else - uint16_t ProgramWord = pgm_read_word(CurrAddress); - #endif - - WriteNextResponseByte(ProgramWord >> 8); - WriteNextResponseByte(ProgramWord & 0xFF); - } - #endif - #if !defined(NO_EEPROM_BYTE_SUPPORT) - else if (Command == 'D') - { - // Read the byte from the endpoint and write it to the EEPROM - eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); - - // Increment the address after use - CurrAddress += 2; - - // Send confirmation byte back to the host - WriteNextResponseByte('\r'); - } - else if (Command == 'd') - { - // Read the EEPROM byte and write it to the endpoint - WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); - - // Increment the address after use - CurrAddress += 2; - } - #endif - else if (Command != 27) - { - // Unknown (non-sync) command, return fail code - WriteNextResponseByte('?'); - } - - - /* Select the IN endpoint */ - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* Remember if the endpoint is completely full before clearing it */ - bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); - - /* Send the endpoint data to the host */ - Endpoint_ClearIN(); - - /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ - if (IsEndpointFull) - { - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - Endpoint_ClearIN(); - } - - /* Wait until the data has been sent to the host */ - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } - - /* Select the OUT endpoint */ - Endpoint_SelectEndpoint(CDC_RX_EPNUM); - - /* Acknowledge the command from the host */ - Endpoint_ClearOUT(); -} - diff --git a/bootloaders/caterina_LUFA/Caterina.h b/bootloaders/caterina_LUFA/Caterina.h deleted file mode 100755 index f8251d4..0000000 --- a/bootloaders/caterina_LUFA/Caterina.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for BootloaderCDC.c. - */ - -#ifndef _CDC_H_ -#define _CDC_H_ - - /* Includes: */ - #include - #include - #include - #include - #include - #include - #include - - #include "Descriptors.h" - - #include - /* Macros: */ - /** Version major of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MAJOR 0x01 - - /** Version minor of the CDC bootloader. */ - #define BOOTLOADER_VERSION_MINOR 0x00 - - /** Hardware version major of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MAJOR 0x01 - - /** Hardware version minor of the CDC bootloader. */ - #define BOOTLOADER_HWVERSION_MINOR 0x00 - - /** Eight character bootloader firmware identifier reported to the host when requested */ - #define SOFTWARE_IDENTIFIER "CATERINA" - - #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) - #define LED_SETUP() DDRC |= (1<<7); DDRB |= (1<<0); DDRD |= (1<<5); - #define L_LED_OFF() PORTC &= ~(1<<7) - #define L_LED_ON() PORTC |= (1<<7) - #define L_LED_TOGGLE() PORTC ^= (1<<7) - #define TX_LED_OFF() PORTD |= (1<<5) - #define TX_LED_ON() PORTD &= ~(1<<5) - #define RX_LED_OFF() PORTB |= (1<<0) - #define RX_LED_ON() PORTB &= ~(1<<0) - - /* Type Defines: */ - /** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ - typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; - - /* Function Prototypes: */ - void StartSketch(void); - void LEDPulse(void); - - void CDC_Task(void); - void SetupHardware(void); - - void EVENT_USB_Device_ConfigurationChanged(void); - - #if defined(INCLUDE_FROM_CATERINA_C) || defined(__DOXYGEN__) - #if !defined(NO_BLOCK_SUPPORT) - static void ReadWriteMemoryBlock(const uint8_t Command); - #endif - static uint8_t FetchNextCommandByte(void); - static void WriteNextResponseByte(const uint8_t Response); - #endif - -#endif - diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex deleted file mode 100644 index 98cf01a..0000000 --- a/bootloaders/caterina_LUFA/Caterina.hex +++ /dev/null @@ -1,256 +0,0 @@ -:1070000055C000006EC000006CC000006AC00000E7 -:1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000ECC400005AC0000058 -:1070300058C0000056C0000054C0000052C00000FC -:1070400050C0000078C000004CC000004AC00000E2 -:1070500048C0000046C0000044C0000042C000001C -:1070600040C000003EC000003CC000003AC000002C -:1070700038C0000036C0000034C0000032C000003C -:1070800030C000002EC000002CC000002AC000004C -:1070900028C0000026C0000024C0000022C000005C -:1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E265 -:1070C000FFE702C005900D92A83AB107D9F711E089 -:1070D000A8EAB1E001C01D92AE3BB107E1F78ED343 -:1070E00020C78ECFF89410926F00109281001092FA -:1070F00085001092840081E085BF15BE47985D9A97 -:10710000289A0C94000008952091B2013091B301A7 -:107110002F5F3F4F3093B3012093B201932F37FF7E -:1071200003C08EEF831B982F990F921710F4479886 -:107130000895479A08951F920F920FB60F92112447 -:107140002F938F939F93EF93FF931092850010924C -:1071500084008091A8019091A901009741F00197C6 -:107160009093A9018093A801892B09F45D9A8091DD -:10717000AA019091AB01009741F001979093AB0168 -:107180008093AA01892B09F4289AE0E0F0E0859128 -:1071900094918F5F9F4F49F08091AC019091AD0128 -:1071A00001969093AD018093AC01FF91EF919F9177 -:1071B0008F912F910F900FBE0F901F90189584E024 -:1071C0008093E9000DC08091E8008B778093E80000 -:1071D00003C08EB3882351F08091E80082FFF9CF7D -:1071E0008091E80085FFEFCF8091F1000895982FFE -:1071F00083E08093E9008091E80085FD0DC08091D7 -:10720000E8008E778093E80003C08EB3882369F08E -:107210008091E80080FFF9CF9093F1005D9884E6BB -:1072200090E09093A9018093A80108954F925F92F6 -:107230006F927F928F929F92AF92BF92CF92DF9286 -:10724000EF92FF920F931F93CF93DF9384E080938D -:10725000E9008091E80082FF56C2289884E690E019 -:107260009093AB018093AA01AADF182F853419F4FB -:1072700010920D0103C0843519F4A1DF8DE019C20D -:107280008C34E1F38035D1F3843721F484E4AFDF2B -:1072900080E00FC2813611F489E50BC28134B1F46C -:1072A0008EDF182F8CDF90E0880F991FAA2797FD9B -:1072B000A095BA2F312F330F20E0442737FD40959A -:1072C000542F822B932BA42BB52BC4C1803711F4E0 -:1072D00083E5EFC1833549F4C0E0D1E0899187DFD0 -:1072E00021E0C730D207D1F7E5C1863521F481E32B -:1072F0007EDF80E3DEC1833731F487E878DF85E91C -:1073000076DF8EE1D6C18536B9F4E0E0F0E093E0B7 -:1073100085E090935700E89507B600FCFDCF809379 -:107320005700E89507B600FCFDCFE058FF4FA0E7F7 -:10733000E030FA0771F7A2CF8C3651F440DF809528 -:1073400099E0E1E0F0E0082E90935700E89596CFA1 -:10735000823739F4E1E0F0E089E0809357008491CE -:10736000A8C1863439F4E0E0F0E089E0809357006A -:1073700084919FC18E3439F4E3E0F0E089E080939A -:107380005700849196C1813539F4E2E0F0E089E05C -:107390008093570084918DC1823631F489E527DFCF -:1073A00080E025DF80E885C1823419F0873609F056 -:1073B000E5C01092AD011092AC0101DF082FFFDE95 -:1073C000F82EFDDE682E8554823008F071C1902FB2 -:1073D00080E0CF2DD0E0C82BD92B10926F0017364C -:1073E00009F04BC081E180935700E895DD24CC245F -:1073F000C3943FC0E090AE01F090AF010091B001A6 -:107400001091B101B6E46B16D9F4ED2DF0E0EE2940 -:10741000FF29E4918E2FEBDEDD2081F082E090E009 -:10742000A0E0B0E0E80EF91E0A1F1B1FE092AE01BB -:10743000F092AF010093B0011093B101DC2418C0A9 -:10744000D801C701B695A7959795879554D5CFDEF6 -:1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA -:10746000E092AE01F092AF010093B0011093B10130 -:107470002197209709F0BECF7DC08090AE019090FB -:10748000AF01A090B001B090B10196E4691609F087 -:107490005DC083E0F40180935700E89507B600FCD7 -:1074A000FDCF54C0F6E46F1661F5772031F1E0901E -:1074B000AE01F090AF010091B0011091B1017FDEFB -:1074C000D82ECC24852D90E08C299D29F7010C0124 -:1074D00040925700E895112482E090E0A0E0B0E0EF -:1074E000E80EF91E0A1F1B1FE092AE01F092AF01D9 -:1074F0000093B0011093B10102C061DE582E7424D4 -:1075000023C0E090AE01F090AF010091B001109166 -:10751000B10116950795F794E79451DE682FC701DE -:10752000F2D48091AE019091AF01A091B001B091E1 -:10753000B1010296A11DB11D8093AE019093AF01E0 -:10754000A093B001B093B101219704C055247724D2 -:1075500044244394209709F0A5CF96E4691641F49A -:1075600085E0F40180935700E89507B600FCFDCF55 -:107570008DE03DDE82E080936F009CC0833471F427 -:107580000091AE011091AF011ADE90E021E0F80108 -:107590000C0120935700E895112470CE833619F51D -:1075A000E090AE01F090AF010091B0011091B101F7 -:1075B00006DEF701E16090E021E00C012093570026 -:1075C000E895112482E090E0A0E0B0E0E80EF91E1A -:1075D0000A1F1B1FE092AE01F092AF010093B001B1 -:1075E0001093B1014BCE8D3661F4E091AE01F09174 -:1075F000AF0185E080935700E89507B600FCFDCF0A -:107600003DCE823551F4E091AE01F091AF0105918C -:107610001491812FECDD802F4CC0843421F5E09053 -:10762000AE01F090AF010091B0011091B10116953B -:107630000795F794E794C3DD682FC70164D4809160 -:10764000AE019091AF01A091B001B091B10102964D -:10765000A11DB11D8093AE019093AF01A093B00125 -:10766000B093B1010BCE843609F5E090AE01F090F5 -:10767000AF010091B0011091B101D801C701B695D9 -:10768000A7959795879537D4B2DD82E090E0A0E08A -:10769000B0E0E80EF91E0A1F1B1FE092AE01F09247 -:1076A000AF010093B0011093B10104C08B3111F010 -:1076B0008FE39DDD83E08093E9009091E800809165 -:1076C000E8008E778093E80095FF04C010C08EB369 -:1076D0008823C9F08091E80080FFF9CF8091E8000D -:1076E0008E778093E80003C08EB3882361F0809189 -:1076F000E80080FFF9CF84E08093E9008091E80002 -:107700008B778093E800DF91CF911F910F91FF90CD -:10771000EF90DF90CF90BF90AF909F908F907F9031 -:107720006F905F904F9008959091B601892F8F7759 -:10773000813249F58091B7018032A1F0813219F58B -:10774000913A09F58091E800877F8093E8008EE008 -:1077500091E067E070E006D28091E8008B7780933B -:10776000E8000895913279F48091E800877F809352 -:10777000E8008EE091E067E070E058D28091E80088 -:107780008E778093E800089582E061EC42E0B0D00B -:1077900083E061E842E1ACD084E060E842E1A8C067 -:1077A00084B7877F84BF88E10FB6F8948093600028 -:1077B000109260000FBE20E880E090E00FB6F894D1 -:1077C00020936100809361000FBE81E085BF92E04D -:1077D00095BF3F9A209A559AE1E6F0E02083108207 -:1077E00047985D9A289A109289008AEF80938800C2 -:1077F00090936F0083E080938100EBC01F9388E13A -:107800000FB6F89480936000109260000FBE84B7AA -:1078100014BE182F10FF08C0E0E0F0E085919491AD -:107820008F5F9F4F09F05EDC2091000A3091010AC2 -:107830001092010A1092000A13FF0FC080910901F3 -:1078400090910A012817390741F0E0E0F0E08591B6 -:1078500094918F5F9F4F09F045DCA2DF78940CC0B4 -:10786000E5DC37D38091AC019091AD0181549F410B -:1078700010F010920D0148DC80910D01882381F7F2 -:107880008091E00081608093E0002CDC80E090E05B -:107890001F910895FA01923049F0933061F09130D0 -:1078A000F9F485E191E022E130E01EC087E291E049 -:1078B0002EE330E019C0882329F485E691E024E026 -:1078C00030E012C0813029F489E691E022E230E014 -:1078D0000BC0823029F48DE891E028E130E004C04B -:1078E00080E090E020E030E091838083C90108953A -:1078F0008093E9008091EB0081608093EB0010920F -:10790000ED006093EC004093ED008091EE00881F45 -:107910008827881F08958091B60188238CF403C0BE -:107920008EB38823B1F08091E80082FFF9CF809177 -:10793000E8008B778093E80008958EB3882349F0A0 -:107940008091E80080FFF9CF8091E8008E778093E6 -:10795000E8000895EF92FF920F931F9345D04CD00B -:1079600008ED10E0F80180818F7780838081806846 -:10797000808380818F7D808319BC1EBA1092B401F0 -:1079800080EEE82EF12CF70180818B7F8083F80157 -:1079900080818160808380E060E042E0A9DFE1EEE9 -:1079A000F0E080818E7F8083E2EEF0E08081816074 -:1079B0008083808188608083F70180818E7F8083CF -:1079C000F8018081806180831F910F91FF90EF907B -:1079D0000895E7EDF0E08081816080838AE482BFD2 -:1079E00081E08093B501B6CFE8EDF0E080818E7F35 -:1079F00080831092E20008951092DA001092E10064 -:107A000008951F920F920FB60F9211242F933F9358 -:107A10004F935F936F937F938F939F93AF93BF9396 -:107A2000EF93FF938091DA0080FF1BC08091D80014 -:107A300080FF17C08091DA008E7F8093DA008091FA -:107A4000D90080FF0BC080E189BD82E189BD09B406 -:107A500000FEFDCF81E08EBB3BD203C019BC1EBA35 -:107A600037D28091E10080FF17C08091E20080FF53 -:107A700013C08091E2008E7F8093E2008091E2004B -:107A800080618093E2008091D80080628093D8006A -:107A900019BC85E08EBB1CD28091E10084FF2CC014 -:107AA0008091E20084FF28C080E189BD82E189BD28 -:107AB00009B400FEFDCF8091D8008F7D8093D8005F -:107AC0008091E1008F7E8093E1008091E2008F7EC3 -:107AD0008093E2008091E20081608093E2008091D7 -:107AE000B401882331F48091E30087FD02C081E076 -:107AF00001C084E08EBBECD18091E10083FF21C006 -:107B00008091E20083FF1DC08091E100877F809318 -:107B1000E10082E08EBB1092B4018091E1008E7F83 -:107B20008093E1008091E2008E7F8093E20080915B -:107B3000E20080618093E20080E060E042E0D8DE15 -:107B4000C7D1FF91EF91BF91AF919F918F917F919D -:107B50006F915F914F913F912F910F900FBE0F90BA -:107B60001F9018959C014091BC015091BD01461792 -:107B7000570718F4F90190E044C06115710511F040 -:107B8000AB01F8CF8091E8008E778093E80040E069 -:107B900050E0F0CF8EB3882309F444C0853009F457 -:107BA00043C08091E80083FF02C081E00895809186 -:107BB000E80082FD31C08091E80080FF22C0809102 -:107BC000F3009091F200782F60E0292F30E0262B0F -:107BD000372B07C081918093F100415050402F5FB7 -:107BE0003F4F4115510519F02830310598F390E0C9 -:107BF0002830310509F491E08091E8008E77809378 -:107C0000E8004115510531F6992321F605C08EB3E0 -:107C1000882341F0853041F08091E80082FFF7CF62 -:107C200080E0089582E0089583E008959C01611545 -:107C3000710529F48091E8008B778093E800F901C1 -:107C400026C08EB3882391F1853091F18091E800B0 -:107C500083FF02C081E008958091E80082FFF1CFA8 -:107C600006C08091F10081936150704059F02091DD -:107C7000F3008091F200322F20E090E0822B932BD2 -:107C8000892B79F78091E8008B778093E800611564 -:107C90007105B9F605C08EB3882341F0853041F0F7 -:107CA0008091E80080FFF7CF80E0089582E008959A -:107CB00083E008950F931F93DF93CF9300D0CDB748 -:107CC000DEB7E6EBF1E08091F100819381E0EE3BDD -:107CD000F807C9F729DD8091E80083FFE4C08091AF -:107CE000B6019091B701953009F46DC0963040F41B -:107CF000913081F1913070F0933009F0D4C02AC0F6 -:107D0000983009F4A3C0993009F4B2C0963009F054 -:107D1000CAC07CC0803809F4C6C0823809F0C3C02C -:107D20008091BA0187708093E9008091EB001092F6 -:107D3000E9002091E800277F2093E80090E025E00B -:107D4000969587952A95E1F781708093F1001092BE -:107D5000F10087C0882319F0823009F0A4C08F7128 -:107D6000823009F0A0C08091B801882331F52091BC -:107D7000BA01277009F497C02093E9008091EB00C5 -:107D800080FF1BC0933021F48091EB00806213C010 -:107D90008091EB0080618093EB0081E090E002C075 -:107DA000880F991F2A95E2F78093EA001092EA0063 -:107DB0008091EB0088608093EB001092E900809145 -:107DC000E800877F51C0882309F06DC01091B80189 -:107DD0001F770FB7F8948091E800877F8093E800C1 -:107DE0009ADD8091E80080FFFCCF8091E3008078ED -:107DF000812B8093E30080688093E300112311F4CA -:107E000082E001C083E08EBB0FBF4DC0805882303E -:107E100008F049C08091B8019091B9016091BA0110 -:107E2000AE014F5F5F4F36DDBC01009709F43BC0E8 -:107E30008091E800877F8093E80089819A8192DEB3 -:107E40008091E8008B778093E8002DC0803859F549 -:107E50008091E800877F8093E8008091B40180934F -:107E6000F1008091E8008E778093E80054DD1BC01C -:107E70008823C9F49091B8019230A8F48091E80069 -:107E8000877F8093E8009093B40145DD8091B40131 -:107E9000882331F48091E30087FD02C081E001C0B6 -:107EA00084E08EBB71DC8091E80083FF0AC0809182 -:107EB000EB0080628093EB008091E800877F8093E5 -:107EC000E8000F900F90CF91DF911F910F910895CF -:107ED00008951F938EB3882361F01091E9001092EA -:107EE000E9008091E80083FF01C0E4DE1770109381 -:107EF000E9001F910895F999FECF92BD81BDF89ACE -:107F0000992780B50895262FF999FECF1FBA92BD03 -:107F100081BD20BD0FB6F894FA9AF99A0FBE01966A -:067F20000895F894FFCF64 -:107F26004341544552494E41007777000A0100000B -:107F360000000000081201100102000008412301A0 -:107F46000701000201000109023E00020100803221 -:107F560009040000010202010005240010010424A6 -:107F660002040524060001070582030800FF090430 -:107F76000100020A000000070504021000010705BF -:107F86008302100001040309042203410072006405 -:107F960000750069006E006F0020004C0065006FE0 -:107FA600006E006100720064006F0000001803415B -:107FB6000072006400750069006E006F0020004CBE -:087FC600004C00430000000024 -:040000030000700089 -:00000001FF diff --git a/bootloaders/caterina_LUFA/Descriptors.c b/bootloaders/caterina_LUFA/Descriptors.c deleted file mode 100755 index f1756e2..0000000 --- a/bootloaders/caterina_LUFA/Descriptors.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * USB Device Descriptors, for library use when in USB device mode. Descriptors are special - * computer-readable structures which the host requests upon device enumeration, to determine - * the device's capabilities and functions. - */ - -#include "Descriptors.h" - -/** Device descriptor structure. This descriptor, located in SRAM memory, describes the overall - * device characteristics, including the supported USB version, control endpoint size and the - * number of device configurations. The descriptor is read out by the USB host when the enumeration - * process begins. - */ -const USB_Descriptor_Device_t DeviceDescriptor = -{ - .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, - - .USBSpecification = VERSION_BCD(01.10), - .Class = CDC_CSCP_CDCClass, - .SubClass = CDC_CSCP_NoSpecificSubclass, - .Protocol = CDC_CSCP_NoSpecificProtocol, - - .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - - .VendorID = 0x2341, - .ProductID = 0x0701, - .ReleaseNumber = VERSION_BCD(00.01), - - .ManufacturerStrIndex = 0x02, - .ProductStrIndex = 0x01, - .SerialNumStrIndex = NO_DESCRIPTOR, - - .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS -}; - -/** Configuration descriptor structure. This descriptor, located in SRAM memory, describes the usage - * of the device in one of its supported configurations, including information about any device interfaces - * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting - * a configuration so that the host may correctly communicate with the USB device. - */ -const USB_Descriptor_Configuration_t ConfigurationDescriptor = -{ - .Config = - { - .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, - - .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), - .TotalInterfaces = 2, - - .ConfigurationNumber = 1, - .ConfigurationStrIndex = NO_DESCRIPTOR, - - .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, - - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) - }, - - .CDC_CCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 0, - .AlternateSetting = 0, - - .TotalEndpoints = 1, - - .Class = CDC_CSCP_CDCClass, - .SubClass = CDC_CSCP_ACMSubclass, - .Protocol = CDC_CSCP_ATCommandProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_Functional_Header = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x00, - - .CDCSpecification = VERSION_BCD(01.10), - }, - - .CDC_Functional_ACM = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x02, - - .Capabilities = 0x04, - }, - - .CDC_Functional_Union = - { - .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, - .Subtype = 0x06, - - .MasterInterfaceNumber = 0, - .SlaveInterfaceNumber = 1, - }, - - .CDC_NotificationEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_NOTIFICATION_EPSIZE, - .PollingIntervalMS = 0xFF - }, - - .CDC_DCI_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = 1, - .AlternateSetting = 0, - - .TotalEndpoints = 2, - - .Class = CDC_CSCP_CDCDataClass, - .SubClass = CDC_CSCP_NoDataSubclass, - .Protocol = CDC_CSCP_NoDataProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .CDC_DataOutEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - }, - - .CDC_DataInEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | CDC_TX_EPNUM), - .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = CDC_TXRX_EPSIZE, - .PollingIntervalMS = 0x01 - } -}; - -/** Language descriptor structure. This descriptor, located in SRAM memory, is returned when the host requests - * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate - * via the language ID table available at USB.org what languages the device supports for its string descriptors. - */ -const USB_Descriptor_String_t LanguageString = -{ - .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, - - .UnicodeString = {LANGUAGE_ID_ENG} -}; - -/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, - * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device - * Descriptor. - */ -const USB_Descriptor_String_t ProductString = -{ - .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino Leonardo" -}; -/* -const USB_Descriptor_String_t SerialNumString = -{ - .Header = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String}, - - .UnicodeString = L"000000001452" -}; -*/ -const USB_Descriptor_String_t ManufNameString = -{ - .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, - - .UnicodeString = L"Arduino LLC" -}; - -/** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" - * documentation) by the application code so that the address and size of a requested descriptor can be given - * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function - * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the - * USB host. - */ -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - const void** const DescriptorAddress) -{ - const uint8_t DescriptorType = (wValue >> 8); - const uint8_t DescriptorNumber = (wValue & 0xFF); - - const void* Address = NULL; - uint16_t Size = NO_DESCRIPTOR; - - switch (DescriptorType) - { - case DTYPE_Device: - Address = &DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = &ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_String: - if (!(DescriptorNumber)) - { - Address = &LanguageString; - Size = LanguageString.Header.Size; - } - else if (DescriptorNumber == DeviceDescriptor.ProductStrIndex) - { - Address = &ProductString; - Size = ProductString.Header.Size; -// } else if (DescriptorNumber == DeviceDescriptor.SerialNumStrIndex) -// { -// Address = &SerialNumString; -// Size = SerialNumString.Header.Size; - } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) - { - Address = &ManufNameString; - Size = ManufNameString.Header.Size; - } - - break; - } - - *DescriptorAddress = Address; - return Size; -} - diff --git a/bootloaders/caterina_LUFA/Descriptors.h b/bootloaders/caterina_LUFA/Descriptors.h deleted file mode 100755 index 94091ae..0000000 --- a/bootloaders/caterina_LUFA/Descriptors.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2011. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * Header file for Descriptors.c. - */ - -#ifndef _DESCRIPTORS_H_ -#define _DESCRIPTORS_H_ - - /* Includes: */ - #include - - /* Macros: */ - #if defined(__AVR_AT90USB1287__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB647__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB1286__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x97 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_AT90USB646__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x96 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega32U6__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U4__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x87 - #elif defined(__AVR_ATmega16U4__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x88 - #elif defined(__AVR_ATmega32U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x95 - #define AVR_SIGNATURE_3 0x8A - #elif defined(__AVR_ATmega16U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB162__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #elif defined(__AVR_ATmega8U2__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x93 - #define AVR_SIGNATURE_3 0x89 - #elif defined(__AVR_AT90USB82__) - #define AVR_SIGNATURE_1 0x1E - #define AVR_SIGNATURE_2 0x94 - #define AVR_SIGNATURE_3 0x82 - #else - #error The selected AVR part is not currently supported by this bootloader. - #endif - - /** Endpoint number for the CDC control interface event notification endpoint. */ - #define CDC_NOTIFICATION_EPNUM 2 - - /** Endpoint number for the CDC data interface TX (data IN) endpoint. */ - #define CDC_TX_EPNUM 3 - - /** Endpoint number for the CDC data interface RX (data OUT) endpoint. */ - #define CDC_RX_EPNUM 4 - - /** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ - #define CDC_TXRX_EPSIZE 16 - - /** Size of the CDC control interface notification endpoint bank, in bytes. */ - #define CDC_NOTIFICATION_EPSIZE 8 - - /* Type Defines: */ - /** Type define for the device configuration descriptor structure. This must be defined in the - * application code, as the configuration descriptor contains several sub-descriptors which - * vary between devices, and which describe the device's usage to the host. - */ - typedef struct - { - USB_Descriptor_Configuration_Header_t Config; - - // CDC Control Interface - USB_Descriptor_Interface_t CDC_CCI_Interface; - USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; - USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; - USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; - USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; - - // CDC Data Interface - USB_Descriptor_Interface_t CDC_DCI_Interface; - USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; - USB_Descriptor_Endpoint_t CDC_DataInEndpoint; - } USB_Descriptor_Configuration_t; - - /* Function Prototypes: */ - uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint8_t wIndex, - const void** const DescriptorAddress) - ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - -#endif - diff --git a/bootloaders/caterina_LUFA/makefile b/bootloaders/caterina_LUFA/makefile deleted file mode 100755 index 5439b5b..0000000 --- a/bootloaders/caterina_LUFA/makefile +++ /dev/null @@ -1,717 +0,0 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. -# >> Modified for use with the LUFA project. << -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# Dean Camera -# Opendous Inc. -# Denver Gingerich -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make doxygen = Generate DoxyGen documentation for the project (must have -# DoxyGen installed) -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - - -# MCU name -MCU = atmega32u4 - - -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - - -# Target board (see library "Board Types" documentation, NONE for projects not requiring -# LUFA board drivers). If USER is selected, put custom board drivers in a directory called -# "Board" inside the application directory. -BOARD = USER - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - - -# Starting byte address of the bootloader, as a byte address - computed via the formula -# BOOT_START = ((FLASH_SIZE_KB - BOOT_SECTION_SIZE_KB) * 1024) -# -# Note that the bootloader size and start address given in AVRStudio is in words and not -# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. -FLASH_SIZE_KB = 32 -BOOT_SECTION_SIZE_KB = 4 -BOOT_START = 0x$(shell echo "obase=16; ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024" | bc) - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = Caterina - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Path to the LUFA library -LUFA_PATH = ../../../../../LUFA-111009 - - -# LUFA library compile-time options and predefined tokens -LUFA_OPTS = -D USB_DEVICE_ONLY -LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 -LUFA_OPTS += -D ORDERED_EP_CONFIG -LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 -LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 -LUFA_OPTS += -D USE_RAM_DESCRIPTORS -LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -LUFA_OPTS += -D NO_INTERNAL_SERIAL -LUFA_OPTS += -D NO_DEVICE_SELF_POWER -LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP -LUFA_OPTS += -D NO_SOF_EVENTS - -#LUFA_OPTS += -D NO_BLOCK_SUPPORT -#LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT -#LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT -#LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT - - -# Create the LUFA source path variables by including the LUFA root makefile -include $(LUFA_PATH)/LUFA/makefile - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c \ - Descriptors.c \ - $(LUFA_SRC_USB) \ - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(LUFA_PATH)/ - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=c99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL -CDEFS += -DF_USB=$(F_USB)UL -CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) -CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CDEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) -ADEFS += -DF_USB=$(F_USB)UL -ADEFS += -DBOARD=BOARD_$(BOARD) -ADEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -ADEFS += $(LUFA_OPTS) - - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -CPPDEFS += -DF_USB=$(F_USB)UL -CPPDEFS += -DBOARD=BOARD_$(BOARD) -CPPDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL -CPPDEFS += $(LUFA_OPTS) -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fno-inline-small-functions -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CPPFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) -LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = avrispmkII - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = usb - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = /Applications/avrdude -C /Applications/avrdude.conf -B 1 -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex eep lss sym -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) -FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S -z $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - -doxygen: - @echo Generating Project Documentation \($(TARGET)\)... - @doxygen Doxygen.conf - @echo Documentation Generation Complete. - -clean_doxygen: - rm -rf Documentation - -checksource: - @for f in $(SRC) $(CPPSRC) $(ASRC); do \ - if [ -f $$f ]; then \ - echo "Found Source File: $$f" ; \ - else \ - echo "Source File Not Found: $$f" ; \ - fi; done - - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff doxygen clean \ -clean_list clean_doxygen program debug gdb-config checksource - -- cgit v1.2.3-18-g5258 From 75da79ad7602d1a73e46155a5630f41d91f9bd83 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 8 Mar 2012 14:20:12 -0500 Subject: give Leonardo bootloader 250 ms to finish housekeeping before leaving self-programming mode Earlier approach had bootloader end as soon as it was told to. On Linux this caused problems with avrdude because the microcontroller never had a chance to send an acknowledgement. --- bootloaders/caterina/Caterina.c | 11 +- bootloaders/caterina/Caterina.hex | 266 +++++++++++++++++++------------------- 2 files changed, 142 insertions(+), 135 deletions(-) diff --git a/bootloaders/caterina/Caterina.c b/bootloaders/caterina/Caterina.c index c8e82a9..2b50636 100755 --- a/bootloaders/caterina/Caterina.c +++ b/bootloaders/caterina/Caterina.c @@ -62,6 +62,7 @@ uint16_t TxLEDPulse = 0; // time remaining for Tx LED pulse uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse /* Bootloader timeout timer */ +#define TIMEOUT_PERIOD 8000 uint16_t Timeout = 0; uint16_t bootKey = 0x7777; @@ -133,12 +134,14 @@ int main(void) /* Enable global interrupts so that the USB stack can function */ sei(); + Timeout = 0; + while (RunBootloader) { CDC_Task(); USB_USBTask(); /* Time out and start the sketch if one is present */ - if (Timeout > 8000) + if (Timeout > TIMEOUT_PERIOD) RunBootloader = false; LEDPulse(); @@ -475,7 +478,11 @@ void CDC_Task(void) if (Command == 'E') { - RunBootloader = false; + /* We nearly run out the bootloader timeout clock, + * leaving just a few hundred milliseconds so the + * bootloder has time to respond and service any + * subsequent requests */ + Timeout = TIMEOUT_PERIOD - 250; // Send confirmation byte back to the host WriteNextResponseByte('\r'); diff --git a/bootloaders/caterina/Caterina.hex b/bootloaders/caterina/Caterina.hex index 98cf01a..0975ace 100644 --- a/bootloaders/caterina/Caterina.hex +++ b/bootloaders/caterina/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000ECC400005AC0000058 +:1070200060C000005EC00000F0C400005AC0000054 :1070300058C0000056C0000054C0000052C00000FC :1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C @@ -9,10 +9,10 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E265 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEE25D :1070C000FFE702C005900D92A83AB107D9F711E089 :1070D000A8EAB1E001C01D92AE3BB107E1F78ED343 -:1070E00020C78ECFF89410926F00109281001092FA +:1070E00024C78ECFF89410926F00109281001092F6 :1070F00085001092840081E085BF15BE47985D9A97 :10710000289A0C94000008952091B2013091B301A7 :107110002F5F3F4F3093B3012093B201932F37FF7E @@ -66,7 +66,7 @@ :10741000FF29E4918E2FEBDEDD2081F082E090E009 :10742000A0E0B0E0E80EF91E0A1F1B1FE092AE01BB :10743000F092AF010093B0011093B101DC2418C0A9 -:10744000D801C701B695A7959795879554D5CFDEF6 +:10744000D801C701B695A7959795879558D5CFDEF2 :1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA :10746000E092AE01F092AF010093B0011093B10130 :107470002197209709F0BECF7DC08090AE019090FB @@ -80,7 +80,7 @@ :1074F0000093B0011093B10102C061DE582E7424D4 :1075000023C0E090AE01F090AF010091B001109166 :10751000B10116950795F794E79451DE682FC701DE -:10752000F2D48091AE019091AF01A091B001B091E1 +:10752000F6D48091AE019091AF01A091B001B091DD :10753000B1010296A11DB11D8093AE019093AF01E0 :10754000A093B001B093B101219704C055247724D2 :1075500044244394209709F0A5CF96E4691641F49A @@ -97,12 +97,12 @@ :107600003DCE823551F4E091AE01F091AF0105918C :107610001491812FECDD802F4CC0843421F5E09053 :10762000AE01F090AF010091B0011091B10116953B -:107630000795F794E794C3DD682FC70164D4809160 +:107630000795F794E794C3DD682FC70168D480915C :10764000AE019091AF01A091B001B091B10102964D :10765000A11DB11D8093AE019093AF01A093B00125 :10766000B093B1010BCE843609F5E090AE01F090F5 :10767000AF010091B0011091B101D801C701B695D9 -:10768000A7959795879537D4B2DD82E090E0A0E08A +:10768000A795979587953BD4B2DD82E090E0A0E086 :10769000B0E0E80EF91E0A1F1B1FE092AE01F09247 :1076A000AF010093B0011093B10104C08B3111F010 :1076B0008FE39DDD83E08093E9009091E800809165 @@ -115,142 +115,142 @@ :107720006F905F904F9008959091B601892F8F7759 :10773000813249F58091B7018032A1F0813219F58B :10774000913A09F58091E800877F8093E8008EE008 -:1077500091E067E070E006D28091E8008B7780933B +:1077500091E067E070E00AD28091E8008B77809337 :10776000E8000895913279F48091E800877F809352 -:10777000E8008EE091E067E070E058D28091E80088 -:107780008E778093E800089582E061EC42E0B0D00B -:1077900083E061E842E1ACD084E060E842E1A8C067 +:10777000E8008EE091E067E070E05CD28091E80084 +:107780008E778093E800089582E061EC42E0B4D007 +:1077900083E061E842E1B0D084E060E842E1ACC05F :1077A00084B7877F84BF88E10FB6F8948093600028 :1077B000109260000FBE20E880E090E00FB6F894D1 :1077C00020936100809361000FBE81E085BF92E04D :1077D00095BF3F9A209A559AE1E6F0E02083108207 :1077E00047985D9A289A109289008AEF80938800C2 -:1077F00090936F0083E080938100EBC01F9388E13A +:1077F00090936F0083E080938100EFC01F9388E136 :107800000FB6F89480936000109260000FBE84B7AA :1078100014BE182F10FF08C0E0E0F0E085919491AD :107820008F5F9F4F09F05EDC2091000A3091010AC2 :107830001092010A1092000A13FF0FC080910901F3 :1078400090910A012817390741F0E0E0F0E08591B6 -:1078500094918F5F9F4F09F045DCA2DF78940CC0B4 -:10786000E5DC37D38091AC019091AD0181549F410B -:1078700010F010920D0148DC80910D01882381F7F2 -:107880008091E00081608093E0002CDC80E090E05B -:107890001F910895FA01923049F0933061F09130D0 -:1078A000F9F485E191E022E130E01EC087E291E049 -:1078B0002EE330E019C0882329F485E691E024E026 -:1078C00030E012C0813029F489E691E022E230E014 -:1078D0000BC0823029F48DE891E028E130E004C04B -:1078E00080E090E020E030E091838083C90108953A -:1078F0008093E9008091EB0081608093EB0010920F -:10790000ED006093EC004093ED008091EE00881F45 -:107910008827881F08958091B60188238CF403C0BE -:107920008EB38823B1F08091E80082FFF9CF809177 -:10793000E8008B778093E80008958EB3882349F0A0 -:107940008091E80080FFF9CF8091E8008E778093E6 -:10795000E8000895EF92FF920F931F9345D04CD00B -:1079600008ED10E0F80180818F7780838081806846 -:10797000808380818F7D808319BC1EBA1092B401F0 -:1079800080EEE82EF12CF70180818B7F8083F80157 -:1079900080818160808380E060E042E0A9DFE1EEE9 -:1079A000F0E080818E7F8083E2EEF0E08081816074 -:1079B0008083808188608083F70180818E7F8083CF -:1079C000F8018081806180831F910F91FF90EF907B -:1079D0000895E7EDF0E08081816080838AE482BFD2 -:1079E00081E08093B501B6CFE8EDF0E080818E7F35 -:1079F00080831092E20008951092DA001092E10064 -:107A000008951F920F920FB60F9211242F933F9358 -:107A10004F935F936F937F938F939F93AF93BF9396 -:107A2000EF93FF938091DA0080FF1BC08091D80014 -:107A300080FF17C08091DA008E7F8093DA008091FA -:107A4000D90080FF0BC080E189BD82E189BD09B406 -:107A500000FEFDCF81E08EBB3BD203C019BC1EBA35 -:107A600037D28091E10080FF17C08091E20080FF53 -:107A700013C08091E2008E7F8093E2008091E2004B -:107A800080618093E2008091D80080628093D8006A -:107A900019BC85E08EBB1CD28091E10084FF2CC014 -:107AA0008091E20084FF28C080E189BD82E189BD28 -:107AB00009B400FEFDCF8091D8008F7D8093D8005F -:107AC0008091E1008F7E8093E1008091E2008F7EC3 -:107AD0008093E2008091E20081608093E2008091D7 -:107AE000B401882331F48091E30087FD02C081E076 -:107AF00001C084E08EBBECD18091E10083FF21C006 -:107B00008091E20083FF1DC08091E100877F809318 -:107B1000E10082E08EBB1092B4018091E1008E7F83 -:107B20008093E1008091E2008E7F8093E20080915B -:107B3000E20080618093E20080E060E042E0D8DE15 -:107B4000C7D1FF91EF91BF91AF919F918F917F919D -:107B50006F915F914F913F912F910F900FBE0F90BA -:107B60001F9018959C014091BC015091BD01461792 -:107B7000570718F4F90190E044C06115710511F040 -:107B8000AB01F8CF8091E8008E778093E80040E069 -:107B900050E0F0CF8EB3882309F444C0853009F457 -:107BA00043C08091E80083FF02C081E00895809186 -:107BB000E80082FD31C08091E80080FF22C0809102 -:107BC000F3009091F200782F60E0292F30E0262B0F -:107BD000372B07C081918093F100415050402F5FB7 -:107BE0003F4F4115510519F02830310598F390E0C9 -:107BF0002830310509F491E08091E8008E77809378 -:107C0000E8004115510531F6992321F605C08EB3E0 -:107C1000882341F0853041F08091E80082FFF7CF62 -:107C200080E0089582E0089583E008959C01611545 -:107C3000710529F48091E8008B778093E800F901C1 -:107C400026C08EB3882391F1853091F18091E800B0 -:107C500083FF02C081E008958091E80082FFF1CFA8 -:107C600006C08091F10081936150704059F02091DD -:107C7000F3008091F200322F20E090E0822B932BD2 -:107C8000892B79F78091E8008B778093E800611564 -:107C90007105B9F605C08EB3882341F0853041F0F7 -:107CA0008091E80080FFF7CF80E0089582E008959A -:107CB00083E008950F931F93DF93CF9300D0CDB748 -:107CC000DEB7E6EBF1E08091F100819381E0EE3BDD -:107CD000F807C9F729DD8091E80083FFE4C08091AF -:107CE000B6019091B701953009F46DC0963040F41B -:107CF000913081F1913070F0933009F0D4C02AC0F6 -:107D0000983009F4A3C0993009F4B2C0963009F054 -:107D1000CAC07CC0803809F4C6C0823809F0C3C02C -:107D20008091BA0187708093E9008091EB001092F6 -:107D3000E9002091E800277F2093E80090E025E00B -:107D4000969587952A95E1F781708093F1001092BE -:107D5000F10087C0882319F0823009F0A4C08F7128 -:107D6000823009F0A0C08091B801882331F52091BC -:107D7000BA01277009F497C02093E9008091EB00C5 -:107D800080FF1BC0933021F48091EB00806213C010 -:107D90008091EB0080618093EB0081E090E002C075 -:107DA000880F991F2A95E2F78093EA001092EA0063 -:107DB0008091EB0088608093EB001092E900809145 -:107DC000E800877F51C0882309F06DC01091B80189 -:107DD0001F770FB7F8948091E800877F8093E800C1 -:107DE0009ADD8091E80080FFFCCF8091E3008078ED -:107DF000812B8093E30080688093E300112311F4CA -:107E000082E001C083E08EBB0FBF4DC0805882303E -:107E100008F049C08091B8019091B9016091BA0110 -:107E2000AE014F5F5F4F36DDBC01009709F43BC0E8 -:107E30008091E800877F8093E80089819A8192DEB3 -:107E40008091E8008B778093E8002DC0803859F549 -:107E50008091E800877F8093E8008091B40180934F -:107E6000F1008091E8008E778093E80054DD1BC01C -:107E70008823C9F49091B8019230A8F48091E80069 -:107E8000877F8093E8009093B40145DD8091B40131 -:107E9000882331F48091E30087FD02C081E001C0B6 -:107EA00084E08EBB71DC8091E80083FF0AC0809182 -:107EB000EB0080628093EB008091E800877F8093E5 -:107EC000E8000F900F90CF91DF911F910F910895CF -:107ED00008951F938EB3882361F01091E9001092EA -:107EE000E9008091E80083FF01C0E4DE1770109381 -:107EF000E9001F910895F999FECF92BD81BDF89ACE -:107F0000992780B50895262FF999FECF1FBA92BD03 -:107F100081BD20BD0FB6F894FA9AF99A0FBE01966A -:067F20000895F894FFCF64 -:107F26004341544552494E41007777000A0100000B -:107F360000000000081201100102000008412301A0 -:107F46000701000201000109023E00020100803221 -:107F560009040000010202010005240010010424A6 -:107F660002040524060001070582030800FF090430 -:107F76000100020A000000070504021000010705BF -:107F86008302100001040309042203410072006405 -:107F960000750069006E006F0020004C0065006FE0 -:107FA600006E006100720064006F0000001803415B -:107FB6000072006400750069006E006F0020004CBE -:087FC600004C00430000000024 +:1078500094918F5F9F4F09F045DCA2DF78941092DE +:10786000AD011092AC010CC0E1DC37D38091AC01CA +:107870009091AD0181549F4110F010920D0144DCB4 +:1078800080910D01882381F78091E00081608093D1 +:10789000E00028DC80E090E01F910895FA0192302A +:1078A00049F0933061F09130F9F485E191E022E103 +:1078B00030E01EC087E291E02EE330E019C088235B +:1078C00029F485E691E024E030E012C0813029F40B +:1078D00089E691E022E230E00BC0823029F48DE8A5 +:1078E00091E028E130E004C080E090E020E030E06A +:1078F00091838083C90108958093E9008091EB0012 +:1079000081608093EB001092ED006093EC00409357 +:10791000ED008091EE00881F8827881F08958091D0 +:10792000B60188238CF403C08EB38823B1F0809114 +:10793000E80082FFF9CF8091E8008B778093E80020 +:1079400008958EB3882349F08091E80080FFF9CF35 +:107950008091E8008E778093E8000895EF92FF927F +:107960000F931F9345D04CD008ED10E0F8018081B3 +:107970008F77808380818068808380818F7D808302 +:1079800019BC1EBA1092B40180EEE82EF12CF7015A +:1079900080818B7F8083F80180818160808380E09B +:1079A00060E042E0A9DFE1EEF0E080818E7F80833D +:1079B000E2EEF0E080818160808380818860808356 +:1079C000F70180818E7F8083F801808180618083D0 +:1079D0001F910F91FF90EF900895E7EDF0E0808107 +:1079E000816080838AE482BF81E08093B501B6CF55 +:1079F000E8EDF0E080818E7F80831092E2000895B0 +:107A00001092DA001092E10008951F920F920FB6C3 +:107A10000F9211242F933F934F935F936F937F9314 +:107A20008F939F93AF93BF93EF93FF938091DA006F +:107A300080FF1BC08091D80080FF17C08091DA00C2 +:107A40008E7F8093DA008091D90080FF0BC080E1A7 +:107A500089BD82E189BD09B400FEFDCF81E08EBB06 +:107A60003BD203C019BC1EBA37D28091E10080FF1F +:107A700017C08091E20080FF13C08091E2008E7FEA +:107A80008093E2008091E20080618093E200809127 +:107A9000D80080628093D80019BC85E08EBB1CD2D0 +:107AA0008091E10084FF2CC08091E20084FF28C017 +:107AB00080E189BD82E189BD09B400FEFDCF8091DE +:107AC000D8008F7D8093D8008091E1008F7E8093D5 +:107AD000E1008091E2008F7E8093E2008091E200DD +:107AE00081608093E2008091B401882331F4809119 +:107AF000E30087FD02C081E001C084E08EBBECD1D1 +:107B00008091E10083FF21C08091E20083FF1DC0CE +:107B10008091E100877F8093E10082E08EBB10922C +:107B2000B4018091E1008E7F8093E1008091E200BA +:107B30008E7F8093E2008091E20080618093E2007A +:107B400080E060E042E0D8DEC7D1FF91EF91BF91C5 +:107B5000AF919F918F917F916F915F914F913F91E5 +:107B60002F910F900FBE0F901F9018959C01409180 +:107B7000BC015091BD014617570718F4F90190E078 +:107B800044C06115710511F0AB01F8CF8091E80098 +:107B90008E778093E80040E050E0F0CF8EB38823EA +:107BA00009F444C0853009F443C08091E80083FFA4 +:107BB00002C081E008958091E80082FD31C080918B +:107BC000E80080FF22C08091F3009091F200782FAE +:107BD00060E0292F30E0262B372B07C0819180935E +:107BE000F100415050402F5F3F4F4115510519F0B2 +:107BF0002830310598F390E02830310509F491E000 +:107C00008091E8008E778093E8004115510531F6A8 +:107C1000992321F605C08EB3882341F0853041F0C9 +:107C20008091E80082FFF7CF80E0089582E0089518 +:107C300083E008959C016115710529F48091E800A5 +:107C40008B778093E800F90126C08EB3882391F1E9 +:107C5000853091F18091E80083FF02C081E00895B2 +:107C60008091E80082FFF1CF06C08091F1008193FE +:107C70006150704059F02091F3008091F200322F52 +:107C800020E090E0822B932B892B79F78091E800FC +:107C90008B778093E80061157105B9F605C08EB346 +:107CA000882341F0853041F08091E80080FFF7CFD4 +:107CB00080E0089582E0089583E008950F931F9374 +:107CC000DF93CF9300D0CDB7DEB7E6EBF1E0809144 +:107CD000F100819381E0EE3BF807C9F725DD809143 +:107CE000E80083FFE4C08091B6019091B701953020 +:107CF00009F46DC0963040F4913081F1913070F00C +:107D0000933009F0D4C02AC0983009F4A3C0993048 +:107D100009F4B2C0963009F0CAC07CC0803809F4BA +:107D2000C6C0823809F0C3C08091BA0187708093C1 +:107D3000E9008091EB001092E9002091E800277F94 +:107D40002093E80090E025E0969587952A95E1F745 +:107D500081708093F1001092F10087C0882319F0A0 +:107D6000823009F0A4C08F71823009F0A0C08091E8 +:107D7000B801882331F52091BA01277009F497C022 +:107D80002093E9008091EB0080FF1BC0933021F429 +:107D90008091EB00806213C08091EB008061809342 +:107DA000EB0081E090E002C0880F991F2A95E2F76E +:107DB0008093EA001092EA008091EB008860809343 +:107DC000EB001092E9008091E800877F51C0882382 +:107DD00009F06DC01091B8011F770FB7F89480912A +:107DE000E800877F8093E8009ADD8091E80080FFBB +:107DF000FCCF8091E3008078812B8093E300806842 +:107E00008093E300112311F482E001C083E08EBB74 +:107E10000FBF4DC08058823008F049C08091B80132 +:107E20009091B9016091BA01AE014F5F5F4F36DDAD +:107E3000BC01009709F43BC08091E800877F8093E4 +:107E4000E80089819A8192DE8091E8008B778093A7 +:107E5000E8002DC0803859F58091E800877F809335 +:107E6000E8008091B4018093F1008091E8008E7762 +:107E70008093E80054DD1BC08823C9F49091B801B9 +:107E80009230A8F48091E800877F8093E800909377 +:107E9000B40145DD8091B401882331F48091E30081 +:107EA00087FD02C081E001C084E08EBB6DDC809163 +:107EB000E80083FF0AC08091EB0080628093EB00B2 +:107EC0008091E800877F8093E8000F900F90CF911A +:107ED000DF911F910F91089508951F938EB388230A +:107EE00061F01091E9001092E9008091E80083FFB1 +:107EF00001C0E4DE17701093E9001F910895F9990D +:107F0000FECF92BD81BDF89A992780B50895262F9E +:107F1000F999FECF1FBA92BD81BD20BD0FB6F8946E +:0E7F2000FA9AF99A0FBE01960895F894FFCFD1 +:107F2E004341544552494E41007777000A01000003 +:107F3E000000000008120110010200000841230198 +:107F4E000701000201000109023E00020100803219 +:107F5E00090400000102020100052400100104249E +:107F6E0002040524060001070582030800FF090428 +:107F7E000100020A000000070504021000010705B7 +:107F8E0083021000010403090422034100720064FD +:107F9E0000750069006E006F0020004C0065006FD8 +:107FAE00006E006100720064006F00000018034153 +:107FBE000072006400750069006E006F0020004CB6 +:087FCE00004C0043000000001C :040000030000700089 :00000001FF -- cgit v1.2.3-18-g5258 From cd0db83a6646717ee7fcbb5b4383bc8eac988d69 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 14 Mar 2012 17:07:14 -0400 Subject: changed Caterina timeout after self-programming to 500 ms (from 250 ms) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit attempt to fix bug reported by Dave Mellis: "avrdude: ser_close(): can’t reset attributes for device: Invalid argument" is thrown after attempting an upload in the IDE (though the upload seems to be successful) --- bootloaders/caterina/Caterina.c | 2 +- bootloaders/caterina/Caterina.hex | 443 +++++++++++++++++++------------------- 2 files changed, 223 insertions(+), 222 deletions(-) diff --git a/bootloaders/caterina/Caterina.c b/bootloaders/caterina/Caterina.c index 2b50636..0565b22 100755 --- a/bootloaders/caterina/Caterina.c +++ b/bootloaders/caterina/Caterina.c @@ -482,7 +482,7 @@ void CDC_Task(void) * leaving just a few hundred milliseconds so the * bootloder has time to respond and service any * subsequent requests */ - Timeout = TIMEOUT_PERIOD - 250; + Timeout = TIMEOUT_PERIOD - 500; // Send confirmation byte back to the host WriteNextResponseByte('\r'); diff --git a/bootloaders/caterina/Caterina.hex b/bootloaders/caterina/Caterina.hex index 0975ace..d66992c 100644 --- a/bootloaders/caterina/Caterina.hex +++ b/bootloaders/caterina/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000F0C400005AC0000054 +:1070200060C000005EC00000F4C400005AC0000050 :1070300058C0000056C0000054C0000052C00000FC :1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C @@ -9,10 +9,10 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEE25D +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E364 :1070C000FFE702C005900D92A83AB107D9F711E089 -:1070D000A8EAB1E001C01D92AE3BB107E1F78ED343 -:1070E00024C78ECFF89410926F00109281001092F6 +:1070D000A8EAB1E001C01D92AE3BB107E1F792D33F +:1070E00028C78ECFF89410926F00109281001092F2 :1070F00085001092840081E085BF15BE47985D9A97 :10710000289A0C94000008952091B2013091B301A7 :107110002F5F3F4F3093B3012093B201932F37FF7E @@ -35,222 +35,223 @@ :1072200090E09093A9018093A80108954F925F92F6 :107230006F927F928F929F92AF92BF92CF92DF9286 :10724000EF92FF920F931F93CF93DF9384E080938D -:10725000E9008091E80082FF56C2289884E690E019 -:107260009093AB018093AA01AADF182F853419F4FB -:1072700010920D0103C0843519F4A1DF8DE019C20D -:107280008C34E1F38035D1F3843721F484E4AFDF2B -:1072900080E00FC2813611F489E50BC28134B1F46C -:1072A0008EDF182F8CDF90E0880F991FAA2797FD9B -:1072B000A095BA2F312F330F20E0442737FD40959A -:1072C000542F822B932BA42BB52BC4C1803711F4E0 -:1072D00083E5EFC1833549F4C0E0D1E0899187DFD0 -:1072E00021E0C730D207D1F7E5C1863521F481E32B -:1072F0007EDF80E3DEC1833731F487E878DF85E91C -:1073000076DF8EE1D6C18536B9F4E0E0F0E093E0B7 -:1073100085E090935700E89507B600FCFDCF809379 -:107320005700E89507B600FCFDCFE058FF4FA0E7F7 -:10733000E030FA0771F7A2CF8C3651F440DF809528 -:1073400099E0E1E0F0E0082E90935700E89596CFA1 -:10735000823739F4E1E0F0E089E0809357008491CE -:10736000A8C1863439F4E0E0F0E089E0809357006A -:1073700084919FC18E3439F4E3E0F0E089E080939A -:107380005700849196C1813539F4E2E0F0E089E05C -:107390008093570084918DC1823631F489E527DFCF -:1073A00080E025DF80E885C1823419F0873609F056 -:1073B000E5C01092AD011092AC0101DF082FFFDE95 -:1073C000F82EFDDE682E8554823008F071C1902FB2 -:1073D00080E0CF2DD0E0C82BD92B10926F0017364C -:1073E00009F04BC081E180935700E895DD24CC245F -:1073F000C3943FC0E090AE01F090AF010091B001A6 -:107400001091B101B6E46B16D9F4ED2DF0E0EE2940 -:10741000FF29E4918E2FEBDEDD2081F082E090E009 -:10742000A0E0B0E0E80EF91E0A1F1B1FE092AE01BB -:10743000F092AF010093B0011093B101DC2418C0A9 -:10744000D801C701B695A7959795879558D5CFDEF2 -:1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA -:10746000E092AE01F092AF010093B0011093B10130 -:107470002197209709F0BECF7DC08090AE019090FB -:10748000AF01A090B001B090B10196E4691609F087 -:107490005DC083E0F40180935700E89507B600FCD7 -:1074A000FDCF54C0F6E46F1661F5772031F1E0901E -:1074B000AE01F090AF010091B0011091B1017FDEFB -:1074C000D82ECC24852D90E08C299D29F7010C0124 -:1074D00040925700E895112482E090E0A0E0B0E0EF -:1074E000E80EF91E0A1F1B1FE092AE01F092AF01D9 -:1074F0000093B0011093B10102C061DE582E7424D4 -:1075000023C0E090AE01F090AF010091B001109166 -:10751000B10116950795F794E79451DE682FC701DE -:10752000F6D48091AE019091AF01A091B001B091DD -:10753000B1010296A11DB11D8093AE019093AF01E0 -:10754000A093B001B093B101219704C055247724D2 -:1075500044244394209709F0A5CF96E4691641F49A -:1075600085E0F40180935700E89507B600FCFDCF55 -:107570008DE03DDE82E080936F009CC0833471F427 -:107580000091AE011091AF011ADE90E021E0F80108 -:107590000C0120935700E895112470CE833619F51D -:1075A000E090AE01F090AF010091B0011091B101F7 -:1075B00006DEF701E16090E021E00C012093570026 -:1075C000E895112482E090E0A0E0B0E0E80EF91E1A -:1075D0000A1F1B1FE092AE01F092AF010093B001B1 -:1075E0001093B1014BCE8D3661F4E091AE01F09174 -:1075F000AF0185E080935700E89507B600FCFDCF0A -:107600003DCE823551F4E091AE01F091AF0105918C -:107610001491812FECDD802F4CC0843421F5E09053 -:10762000AE01F090AF010091B0011091B10116953B -:107630000795F794E794C3DD682FC70168D480915C -:10764000AE019091AF01A091B001B091B10102964D -:10765000A11DB11D8093AE019093AF01A093B00125 -:10766000B093B1010BCE843609F5E090AE01F090F5 -:10767000AF010091B0011091B101D801C701B695D9 -:10768000A795979587953BD4B2DD82E090E0A0E086 -:10769000B0E0E80EF91E0A1F1B1FE092AE01F09247 -:1076A000AF010093B0011093B10104C08B3111F010 -:1076B0008FE39DDD83E08093E9009091E800809165 -:1076C000E8008E778093E80095FF04C010C08EB369 -:1076D0008823C9F08091E80080FFF9CF8091E8000D -:1076E0008E778093E80003C08EB3882361F0809189 -:1076F000E80080FFF9CF84E08093E9008091E80002 -:107700008B778093E800DF91CF911F910F91FF90CD -:10771000EF90DF90CF90BF90AF909F908F907F9031 -:107720006F905F904F9008959091B601892F8F7759 -:10773000813249F58091B7018032A1F0813219F58B -:10774000913A09F58091E800877F8093E8008EE008 -:1077500091E067E070E00AD28091E8008B77809337 -:10776000E8000895913279F48091E800877F809352 -:10777000E8008EE091E067E070E05CD28091E80084 -:107780008E778093E800089582E061EC42E0B4D007 -:1077900083E061E842E1B0D084E060E842E1ACC05F -:1077A00084B7877F84BF88E10FB6F8948093600028 -:1077B000109260000FBE20E880E090E00FB6F894D1 -:1077C00020936100809361000FBE81E085BF92E04D -:1077D00095BF3F9A209A559AE1E6F0E02083108207 -:1077E00047985D9A289A109289008AEF80938800C2 -:1077F00090936F0083E080938100EFC01F9388E136 -:107800000FB6F89480936000109260000FBE84B7AA -:1078100014BE182F10FF08C0E0E0F0E085919491AD -:107820008F5F9F4F09F05EDC2091000A3091010AC2 -:107830001092010A1092000A13FF0FC080910901F3 -:1078400090910A012817390741F0E0E0F0E08591B6 -:1078500094918F5F9F4F09F045DCA2DF78941092DE -:10786000AD011092AC010CC0E1DC37D38091AC01CA -:107870009091AD0181549F4110F010920D0144DCB4 -:1078800080910D01882381F78091E00081608093D1 -:10789000E00028DC80E090E01F910895FA0192302A -:1078A00049F0933061F09130F9F485E191E022E103 -:1078B00030E01EC087E291E02EE330E019C088235B -:1078C00029F485E691E024E030E012C0813029F40B -:1078D00089E691E022E230E00BC0823029F48DE8A5 -:1078E00091E028E130E004C080E090E020E030E06A -:1078F00091838083C90108958093E9008091EB0012 -:1079000081608093EB001092ED006093EC00409357 -:10791000ED008091EE00881F8827881F08958091D0 -:10792000B60188238CF403C08EB38823B1F0809114 -:10793000E80082FFF9CF8091E8008B778093E80020 -:1079400008958EB3882349F08091E80080FFF9CF35 -:107950008091E8008E778093E8000895EF92FF927F -:107960000F931F9345D04CD008ED10E0F8018081B3 -:107970008F77808380818068808380818F7D808302 -:1079800019BC1EBA1092B40180EEE82EF12CF7015A -:1079900080818B7F8083F80180818160808380E09B -:1079A00060E042E0A9DFE1EEF0E080818E7F80833D -:1079B000E2EEF0E080818160808380818860808356 -:1079C000F70180818E7F8083F801808180618083D0 -:1079D0001F910F91FF90EF900895E7EDF0E0808107 -:1079E000816080838AE482BF81E08093B501B6CF55 -:1079F000E8EDF0E080818E7F80831092E2000895B0 -:107A00001092DA001092E10008951F920F920FB6C3 -:107A10000F9211242F933F934F935F936F937F9314 -:107A20008F939F93AF93BF93EF93FF938091DA006F -:107A300080FF1BC08091D80080FF17C08091DA00C2 -:107A40008E7F8093DA008091D90080FF0BC080E1A7 -:107A500089BD82E189BD09B400FEFDCF81E08EBB06 -:107A60003BD203C019BC1EBA37D28091E10080FF1F -:107A700017C08091E20080FF13C08091E2008E7FEA -:107A80008093E2008091E20080618093E200809127 -:107A9000D80080628093D80019BC85E08EBB1CD2D0 -:107AA0008091E10084FF2CC08091E20084FF28C017 -:107AB00080E189BD82E189BD09B400FEFDCF8091DE -:107AC000D8008F7D8093D8008091E1008F7E8093D5 -:107AD000E1008091E2008F7E8093E2008091E200DD -:107AE00081608093E2008091B401882331F4809119 -:107AF000E30087FD02C081E001C084E08EBBECD1D1 -:107B00008091E10083FF21C08091E20083FF1DC0CE -:107B10008091E100877F8093E10082E08EBB10922C -:107B2000B4018091E1008E7F8093E1008091E200BA -:107B30008E7F8093E2008091E20080618093E2007A -:107B400080E060E042E0D8DEC7D1FF91EF91BF91C5 -:107B5000AF919F918F917F916F915F914F913F91E5 -:107B60002F910F900FBE0F901F9018959C01409180 -:107B7000BC015091BD014617570718F4F90190E078 -:107B800044C06115710511F0AB01F8CF8091E80098 -:107B90008E778093E80040E050E0F0CF8EB38823EA -:107BA00009F444C0853009F443C08091E80083FFA4 -:107BB00002C081E008958091E80082FD31C080918B -:107BC000E80080FF22C08091F3009091F200782FAE -:107BD00060E0292F30E0262B372B07C0819180935E -:107BE000F100415050402F5F3F4F4115510519F0B2 -:107BF0002830310598F390E02830310509F491E000 -:107C00008091E8008E778093E8004115510531F6A8 -:107C1000992321F605C08EB3882341F0853041F0C9 -:107C20008091E80082FFF7CF80E0089582E0089518 -:107C300083E008959C016115710529F48091E800A5 -:107C40008B778093E800F90126C08EB3882391F1E9 -:107C5000853091F18091E80083FF02C081E00895B2 -:107C60008091E80082FFF1CF06C08091F1008193FE -:107C70006150704059F02091F3008091F200322F52 -:107C800020E090E0822B932B892B79F78091E800FC -:107C90008B778093E80061157105B9F605C08EB346 -:107CA000882341F0853041F08091E80080FFF7CFD4 -:107CB00080E0089582E0089583E008950F931F9374 -:107CC000DF93CF9300D0CDB7DEB7E6EBF1E0809144 -:107CD000F100819381E0EE3BF807C9F725DD809143 -:107CE000E80083FFE4C08091B6019091B701953020 -:107CF00009F46DC0963040F4913081F1913070F00C -:107D0000933009F0D4C02AC0983009F4A3C0993048 -:107D100009F4B2C0963009F0CAC07CC0803809F4BA -:107D2000C6C0823809F0C3C08091BA0187708093C1 -:107D3000E9008091EB001092E9002091E800277F94 -:107D40002093E80090E025E0969587952A95E1F745 -:107D500081708093F1001092F10087C0882319F0A0 -:107D6000823009F0A4C08F71823009F0A0C08091E8 -:107D7000B801882331F52091BA01277009F497C022 -:107D80002093E9008091EB0080FF1BC0933021F429 -:107D90008091EB00806213C08091EB008061809342 -:107DA000EB0081E090E002C0880F991F2A95E2F76E -:107DB0008093EA001092EA008091EB008860809343 -:107DC000EB001092E9008091E800877F51C0882382 -:107DD00009F06DC01091B8011F770FB7F89480912A -:107DE000E800877F8093E8009ADD8091E80080FFBB -:107DF000FCCF8091E3008078812B8093E300806842 -:107E00008093E300112311F482E001C083E08EBB74 -:107E10000FBF4DC08058823008F049C08091B80132 -:107E20009091B9016091BA01AE014F5F5F4F36DDAD -:107E3000BC01009709F43BC08091E800877F8093E4 -:107E4000E80089819A8192DE8091E8008B778093A7 -:107E5000E8002DC0803859F58091E800877F809335 -:107E6000E8008091B4018093F1008091E8008E7762 -:107E70008093E80054DD1BC08823C9F49091B801B9 -:107E80009230A8F48091E800877F8093E800909377 -:107E9000B40145DD8091B401882331F48091E30081 -:107EA00087FD02C081E001C084E08EBB6DDC809163 -:107EB000E80083FF0AC08091EB0080628093EB00B2 -:107EC0008091E800877F8093E8000F900F90CF911A -:107ED000DF911F910F91089508951F938EB388230A -:107EE00061F01091E9001092E9008091E80083FFB1 -:107EF00001C0E4DE17701093E9001F910895F9990D -:107F0000FECF92BD81BDF89A992780B50895262F9E -:107F1000F999FECF1FBA92BD81BD20BD0FB6F8946E -:0E7F2000FA9AF99A0FBE01960895F894FFCFD1 -:107F2E004341544552494E41007777000A01000003 -:107F3E000000000008120110010200000841230198 -:107F4E000701000201000109023E00020100803219 -:107F5E00090400000102020100052400100104249E -:107F6E0002040524060001070582030800FF090428 -:107F7E000100020A000000070504021000010705B7 -:107F8E0083021000010403090422034100720064FD -:107F9E0000750069006E006F0020004C0065006FD8 -:107FAE00006E006100720064006F00000018034153 -:107FBE000072006400750069006E006F0020004CB6 -:087FCE00004C0043000000001C +:10725000E9008091E80082FF5AC2289884E690E015 +:107260009093AB018093AA01AADF182F853439F4DB +:107270008CE49DE19093AD018093AC0103C0843513 +:1072800019F49DDF8DE019C28C34E1F38035D1F320 +:10729000843721F484E4ABDF80E00FC2813611F43F +:1072A00089E50BC28134B1F48ADF182F88DF90E0C2 +:1072B000880F991FAA2797FDA095BA2F312F330F5A +:1072C00020E0442737FD4095542F822B932BA42B8D +:1072D000B52BC4C1803711F483E5EFC1833549F480 +:1072E000C0E0D1E0899183DF21E0C730D207D1F738 +:1072F000E5C1863521F481E37ADF80E3DEC183379F +:1073000031F487E874DF85E972DF8EE1D6C1853616 +:10731000B9F4E0E0F0E093E085E090935700E89561 +:1073200007B600FCFDCF80935700E89507B600FC38 +:10733000FDCFE058FF4FA0E7E030FA0771F7A2CF8A +:107340008C3651F43CDF809599E0E1E0F0E0082EC6 +:1073500090935700E89596CF823739F4E1E0F0E05A +:1073600089E0809357008491A8C1863439F4E0E025 +:10737000F0E089E08093570084919FC18E3439F406 +:10738000E3E0F0E089E080935700849196C1813575 +:1073900039F4E2E0F0E089E08093570084918DC1F8 +:1073A000823631F489E523DF80E021DF80E885C182 +:1073B000823419F0873609F0E5C01092AD011092C1 +:1073C000AC01FDDE082FFBDEF82EF9DE682E8554B9 +:1073D000823008F071C1902F80E0CF2DD0E0C82B13 +:1073E000D92B10926F00173609F04BC081E18093C2 +:1073F0005700E895DD24CC24C3943FC0E090AE0153 +:10740000F090AF010091B0011091B101B6E46B169C +:10741000D9F4ED2DF0E0EE29FF29E4918E2FE7DE7F +:10742000DD2081F082E090E0A0E0B0E0E80EF91EFF +:107430000A1F1B1FE092AE01F092AF010093B00152 +:107440001093B101DC2418C0D801C701B695A795E7 +:107450009795879558D5CBDE82E090E0A0E0B0E02C +:10746000E80EF91E0A1F1B1FE092AE01F092AF0159 +:107470000093B0011093B1012197209709F0BECF7E +:107480007DC08090AE019090AF01A090B001B0900F +:10749000B10196E4691609F05DC083E0F4018093C0 +:1074A0005700E89507B600FCFDCF54C0F6E46F1610 +:1074B00061F5772031F1E090AE01F090AF010091DD +:1074C000B0011091B1017BDED82ECC24852D90E047 +:1074D0008C299D29F7010C0140925700E895112451 +:1074E00082E090E0A0E0B0E0E80EF91E0A1F1B1F4A +:1074F000E092AE01F092AF010093B0011093B101A0 +:1075000002C05DDE582E742423C0E090AE01F090DE +:10751000AF010091B0011091B10116950795F79454 +:10752000E7944DDE682FC701F6D48091AE019091AB +:10753000AF01A091B001B091B1010296A11DB11DA2 +:107540008093AE019093AF01A093B001B093B101CD +:10755000219704C05524772444244394209709F0AC +:10756000A5CF96E4691641F485E0F40180935700B5 +:10757000E89507B600FCFDCF8DE039DE82E0809310 +:107580006F009CC0833471F40091AE011091AF0183 +:1075900016DE90E021E0F8010C0120935700E895F9 +:1075A000112470CE833619F5E090AE01F090AF0152 +:1075B0000091B0011091B10102DEF701E16090E0AD +:1075C00021E00C0120935700E895112482E090E01F +:1075D000A0E0B0E0E80EF91E0A1F1B1FE092AE010A +:1075E000F092AF010093B0011093B1014BCE8D36F4 +:1075F00061F4E091AE01F091AF0185E08093570016 +:10760000E89507B600FCFDCF3DCE823551F4E09100 +:10761000AE01F091AF0105911491812FE8DD802F2B +:107620004CC0843421F5E090AE01F090AF010091A0 +:10763000B0011091B10116950795F794E794BFDD5D +:10764000682FC70168D48091AE019091AF01A091DD +:10765000B001B091B1010296A11DB11D8093AE01A0 +:107660009093AF01A093B001B093B1010BCE8436DB +:1076700009F5E090AE01F090AF010091B0011091DA +:10768000B101D801C701B695A795979587953BD4C9 +:10769000AEDD82E090E0A0E0B0E0E80EF91E0A1F47 +:1076A0001B1FE092AE01F092AF010093B001109366 +:1076B000B10104C08B3111F08FE399DD83E0809339 +:1076C000E9009091E8008091E8008E778093E800CF +:1076D00095FF04C010C08EB38823C9F08091E800E4 +:1076E00080FFF9CF8091E8008E778093E80003C097 +:1076F0008EB3882361F08091E80080FFF9CF84E0A9 +:107700008093E9008091E8008B778093E800DF9117 +:10771000CF911F910F91FF90EF90DF90CF90BF908E +:10772000AF909F908F907F906F905F904F90089553 +:107730009091B601892F8F77813249F58091B701F9 +:107740008032A1F0813219F5913A09F58091E80073 +:10775000877F8093E8008DE091E067E070E00AD2D7 +:107760008091E8008B778093E8000895913279F456 +:107770008091E800877F8093E8008DE091E067E0EA +:1077800070E05CD28091E8008E778093E8000895E5 +:1077900082E061EC42E0B4D083E061E842E1B0D045 +:1077A00084E060E842E1ACC084B7877F84BF88E1B1 +:1077B0000FB6F89480936000109260000FBE20E82E +:1077C00080E090E00FB6F894209361008093610010 +:1077D0000FBE81E085BF92E095BF3F9A209A559AEF +:1077E000E1E6F0E02083108247985D9A289A109293 +:1077F00089008AEF8093880090936F0083E08093E4 +:107800008100EFC01F9388E10FB6F8948093600069 +:10781000109260000FBE84B714BE182F10FF08C06E +:10782000E0E0F0E0859194918F5F9F4F09F05ADC82 +:107830002091000A3091010A1092010A1092000A68 +:1078400013FF0FC08091090190910A012817390791 +:1078500041F0E0E0F0E0859194918F5F9F4F09F057 +:1078600041DCA2DF78941092AD011092AC010CC003 +:10787000DDDC37D38091AC019091AD0181549F4103 +:1078800010F01092140140DC80911401882381F7DC +:107890008091E00081608093E00024DC80E090E053 +:1078A0001F910895FA01923049F0933061F09130C0 +:1078B000F9F485E191E022E130E01EC087E291E039 +:1078C0002EE330E019C0882329F485E691E024E016 +:1078D00030E012C0813029F489E691E022E230E004 +:1078E0000BC0823029F48DE891E028E130E004C03B +:1078F00080E090E020E030E091838083C90108952A +:107900008093E9008091EB0081608093EB001092FE +:10791000ED006093EC004093ED008091EE00881F35 +:107920008827881F08958091B60188238CF403C0AE +:107930008EB38823B1F08091E80082FFF9CF809167 +:10794000E8008B778093E80008958EB3882349F090 +:107950008091E80080FFF9CF8091E8008E778093D6 +:10796000E8000895EF92FF920F931F9345D04CD0FB +:1079700008ED10E0F80180818F7780838081806836 +:10798000808380818F7D808319BC1EBA1092B401E0 +:1079900080EEE82EF12CF70180818B7F8083F80147 +:1079A00080818160808380E060E042E0A9DFE1EED9 +:1079B000F0E080818E7F8083E2EEF0E08081816064 +:1079C0008083808188608083F70180818E7F8083BF +:1079D000F8018081806180831F910F91FF90EF906B +:1079E0000895E7EDF0E08081816080838AE482BFC2 +:1079F00081E08093B501B6CFE8EDF0E080818E7F25 +:107A000080831092E20008951092DA001092E10053 +:107A100008951F920F920FB60F9211242F933F9348 +:107A20004F935F936F937F938F939F93AF93BF9386 +:107A3000EF93FF938091DA0080FF1BC08091D80004 +:107A400080FF17C08091DA008E7F8093DA008091EA +:107A5000D90080FF0BC080E189BD82E189BD09B4F6 +:107A600000FEFDCF81E08EBB3BD203C019BC1EBA25 +:107A700037D28091E10080FF17C08091E20080FF43 +:107A800013C08091E2008E7F8093E2008091E2003B +:107A900080618093E2008091D80080628093D8005A +:107AA00019BC85E08EBB1CD28091E10084FF2CC004 +:107AB0008091E20084FF28C080E189BD82E189BD18 +:107AC00009B400FEFDCF8091D8008F7D8093D8004F +:107AD0008091E1008F7E8093E1008091E2008F7EB3 +:107AE0008093E2008091E20081608093E2008091C7 +:107AF000B401882331F48091E30087FD02C081E066 +:107B000001C084E08EBBECD18091E10083FF21C0F5 +:107B10008091E20083FF1DC08091E100877F809308 +:107B2000E10082E08EBB1092B4018091E1008E7F73 +:107B30008093E1008091E2008E7F8093E20080914B +:107B4000E20080618093E20080E060E042E0D8DE05 +:107B5000C7D1FF91EF91BF91AF919F918F917F918D +:107B60006F915F914F913F912F910F900FBE0F90AA +:107B70001F9018959C014091BC015091BD01461782 +:107B8000570718F4F90190E044C06115710511F030 +:107B9000AB01F8CF8091E8008E778093E80040E059 +:107BA00050E0F0CF8EB3882309F444C0853009F447 +:107BB00043C08091E80083FF02C081E00895809176 +:107BC000E80082FD31C08091E80080FF22C08091F2 +:107BD000F3009091F200782F60E0292F30E0262BFF +:107BE000372B07C081918093F100415050402F5FA7 +:107BF0003F4F4115510519F02830310598F390E0B9 +:107C00002830310509F491E08091E8008E77809367 +:107C1000E8004115510531F6992321F605C08EB3D0 +:107C2000882341F0853041F08091E80082FFF7CF52 +:107C300080E0089582E0089583E008959C01611535 +:107C4000710529F48091E8008B778093E800F901B1 +:107C500026C08EB3882391F1853091F18091E800A0 +:107C600083FF02C081E008958091E80082FFF1CF98 +:107C700006C08091F10081936150704059F02091CD +:107C8000F3008091F200322F20E090E0822B932BC2 +:107C9000892B79F78091E8008B778093E800611554 +:107CA0007105B9F605C08EB3882341F0853041F0E7 +:107CB0008091E80080FFF7CF80E0089582E008958A +:107CC00083E008950F931F93DF93CF9300D0CDB738 +:107CD000DEB7E6EBF1E08091F100819381E0EE3BCD +:107CE000F807C9F725DD8091E80083FFE4C08091A3 +:107CF000B6019091B701953009F46DC0963040F40B +:107D0000913081F1913070F0933009F0D4C02AC0E5 +:107D1000983009F4A3C0993009F4B2C0963009F044 +:107D2000CAC07CC0803809F4C6C0823809F0C3C01C +:107D30008091BA0187708093E9008091EB001092E6 +:107D4000E9002091E800277F2093E80090E025E0FB +:107D5000969587952A95E1F781708093F1001092AE +:107D6000F10087C0882319F0823009F0A4C08F7118 +:107D7000823009F0A0C08091B801882331F52091AC +:107D8000BA01277009F497C02093E9008091EB00B5 +:107D900080FF1BC0933021F48091EB00806213C000 +:107DA0008091EB0080618093EB0081E090E002C065 +:107DB000880F991F2A95E2F78093EA001092EA0053 +:107DC0008091EB0088608093EB001092E900809135 +:107DD000E800877F51C0882309F06DC01091B80179 +:107DE0001F770FB7F8948091E800877F8093E800B1 +:107DF0009ADD8091E80080FFFCCF8091E3008078DD +:107E0000812B8093E30080688093E300112311F4B9 +:107E100082E001C083E08EBB0FBF4DC0805882302E +:107E200008F049C08091B8019091B9016091BA0100 +:107E3000AE014F5F5F4F36DDBC01009709F43BC0D8 +:107E40008091E800877F8093E80089819A8192DEA3 +:107E50008091E8008B778093E8002DC0803859F539 +:107E60008091E800877F8093E8008091B40180933F +:107E7000F1008091E8008E778093E80054DD1BC00C +:107E80008823C9F49091B8019230A8F48091E80059 +:107E9000877F8093E8009093B40145DD8091B40121 +:107EA000882331F48091E30087FD02C081E001C0A6 +:107EB00084E08EBB6DDC8091E80083FF0AC0809176 +:107EC000EB0080628093EB008091E800877F8093D5 +:107ED000E8000F900F90CF91DF911F910F910895BF +:107EE00008951F938EB3882361F01091E9001092DA +:107EF000E9008091E80083FF01C0E4DE1770109371 +:107F0000E9001F910895F999FECF92BD81BDF89ABD +:107F1000992780B50895262FF999FECF1FBA92BDF3 +:107F200081BD20BD0FB6F894FA9AF99A0FBE01965A +:067F30000895F894FFCF54 +:107F36004341544552494E41007777000A000000FC +:107F4600000000080112011001020000084123018F +:107F56000701000201000109023E00020100803211 +:107F66000904000001020201000524001001042496 +:107F760002040524060001070582030800FF090420 +:107F86000100020A000000070504021000010705AF +:107F960083021000010403090422034100720064F5 +:107FA60000750069006E006F0020004C0065006FD0 +:107FB600006E006100720064006F0000001803414B +:107FC6000072006400750069006E006F0020004CAE +:087FD600004C00430000000014 :040000030000700089 :00000001FF -- cgit v1.2.3-18-g5258 From 083f7c88915db70e1c41997dc9dbd94249aca4e7 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 14 Mar 2012 17:48:11 -0400 Subject: bugfix for Caterina not starting sketch if "verify upload" turned off in IDE. Previously, if avrdude skipped the upload step the read while write memory might never be reenabled. This would prevent the bootloader from ending and the sketch from starting - the bootloader just continued to run even after a successful upload. Now enable RWW when we receive the AVR109 "Exit bootloader" 'E' command. Had to disable lock bit changing support in the bootloader to free up flash for the change - will anyone miss it? --- bootloaders/caterina/Caterina.c | 5 + bootloaders/caterina/Caterina.hex | 443 +++++++++++++++++++------------------- bootloaders/caterina/Makefile | 2 +- 3 files changed, 227 insertions(+), 223 deletions(-) diff --git a/bootloaders/caterina/Caterina.c b/bootloaders/caterina/Caterina.c index 0565b22..0cb9590 100755 --- a/bootloaders/caterina/Caterina.c +++ b/bootloaders/caterina/Caterina.c @@ -484,6 +484,10 @@ void CDC_Task(void) * subsequent requests */ Timeout = TIMEOUT_PERIOD - 500; + /* Re-enable RWW section - must be done here in case + * user has disabled verification on upload. */ + boot_rww_enable_safe(); + // Send confirmation byte back to the host WriteNextResponseByte('\r'); } @@ -592,6 +596,7 @@ void CDC_Task(void) } else if ((Command == 'B') || (Command == 'g')) { + // Keep resetting the timeout counter if we're receiving self-programming instructions Timeout = 0; // Delegate the block write/read to a separate function for clarity ReadWriteMemoryBlock(Command); diff --git a/bootloaders/caterina/Caterina.hex b/bootloaders/caterina/Caterina.hex index d66992c..b3e1ed6 100644 --- a/bootloaders/caterina/Caterina.hex +++ b/bootloaders/caterina/Caterina.hex @@ -1,6 +1,6 @@ :1070000055C000006EC000006CC000006AC00000E7 :1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000F4C400005AC0000050 +:1070200060C000005EC00000F1C400005AC0000053 :1070300058C0000056C0000054C0000052C00000FC :1070400050C0000078C000004CC000004AC00000E2 :1070500048C0000046C0000044C0000042C000001C @@ -9,10 +9,10 @@ :1070800030C000002EC000002CC000002AC000004C :1070900028C0000026C0000024C0000022C000005C :1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E6E364 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0E36A :1070C000FFE702C005900D92A83AB107D9F711E089 -:1070D000A8EAB1E001C01D92AE3BB107E1F792D33F -:1070E00028C78ECFF89410926F00109281001092F2 +:1070D000A8EAB1E001C01D92AE3BB107E1F78FD342 +:1070E00025C78ECFF89410926F00109281001092F5 :1070F00085001092840081E085BF15BE47985D9A97 :10710000289A0C94000008952091B2013091B301A7 :107110002F5F3F4F3093B3012093B201932F37FF7E @@ -35,223 +35,222 @@ :1072200090E09093A9018093A80108954F925F92F6 :107230006F927F928F929F92AF92BF92CF92DF9286 :10724000EF92FF920F931F93CF93DF9384E080938D -:10725000E9008091E80082FF5AC2289884E690E015 -:107260009093AB018093AA01AADF182F853439F4DB -:107270008CE49DE19093AD018093AC0103C0843513 -:1072800019F49DDF8DE019C28C34E1F38035D1F320 -:10729000843721F484E4ABDF80E00FC2813611F43F -:1072A00089E50BC28134B1F48ADF182F88DF90E0C2 -:1072B000880F991FAA2797FDA095BA2F312F330F5A -:1072C00020E0442737FD4095542F822B932BA42B8D -:1072D000B52BC4C1803711F483E5EFC1833549F480 -:1072E000C0E0D1E0899183DF21E0C730D207D1F738 -:1072F000E5C1863521F481E37ADF80E3DEC183379F -:1073000031F487E874DF85E972DF8EE1D6C1853616 -:10731000B9F4E0E0F0E093E085E090935700E89561 -:1073200007B600FCFDCF80935700E89507B600FC38 -:10733000FDCFE058FF4FA0E7E030FA0771F7A2CF8A -:107340008C3651F43CDF809599E0E1E0F0E0082EC6 -:1073500090935700E89596CF823739F4E1E0F0E05A -:1073600089E0809357008491A8C1863439F4E0E025 -:10737000F0E089E08093570084919FC18E3439F406 -:10738000E3E0F0E089E080935700849196C1813575 -:1073900039F4E2E0F0E089E08093570084918DC1F8 -:1073A000823631F489E523DF80E021DF80E885C182 -:1073B000823419F0873609F0E5C01092AD011092C1 -:1073C000AC01FDDE082FFBDEF82EF9DE682E8554B9 -:1073D000823008F071C1902F80E0CF2DD0E0C82B13 -:1073E000D92B10926F00173609F04BC081E18093C2 -:1073F0005700E895DD24CC24C3943FC0E090AE0153 -:10740000F090AF010091B0011091B101B6E46B169C -:10741000D9F4ED2DF0E0EE29FF29E4918E2FE7DE7F -:10742000DD2081F082E090E0A0E0B0E0E80EF91EFF -:107430000A1F1B1FE092AE01F092AF010093B00152 -:107440001093B101DC2418C0D801C701B695A795E7 -:107450009795879558D5CBDE82E090E0A0E0B0E02C -:10746000E80EF91E0A1F1B1FE092AE01F092AF0159 -:107470000093B0011093B1012197209709F0BECF7E -:107480007DC08090AE019090AF01A090B001B0900F -:10749000B10196E4691609F05DC083E0F4018093C0 -:1074A0005700E89507B600FCFDCF54C0F6E46F1610 -:1074B00061F5772031F1E090AE01F090AF010091DD -:1074C000B0011091B1017BDED82ECC24852D90E047 -:1074D0008C299D29F7010C0140925700E895112451 -:1074E00082E090E0A0E0B0E0E80EF91E0A1F1B1F4A -:1074F000E092AE01F092AF010093B0011093B101A0 -:1075000002C05DDE582E742423C0E090AE01F090DE -:10751000AF010091B0011091B10116950795F79454 -:10752000E7944DDE682FC701F6D48091AE019091AB -:10753000AF01A091B001B091B1010296A11DB11DA2 -:107540008093AE019093AF01A093B001B093B101CD -:10755000219704C05524772444244394209709F0AC -:10756000A5CF96E4691641F485E0F40180935700B5 -:10757000E89507B600FCFDCF8DE039DE82E0809310 -:107580006F009CC0833471F40091AE011091AF0183 -:1075900016DE90E021E0F8010C0120935700E895F9 -:1075A000112470CE833619F5E090AE01F090AF0152 -:1075B0000091B0011091B10102DEF701E16090E0AD -:1075C00021E00C0120935700E895112482E090E01F -:1075D000A0E0B0E0E80EF91E0A1F1B1FE092AE010A -:1075E000F092AF010093B0011093B1014BCE8D36F4 -:1075F00061F4E091AE01F091AF0185E08093570016 -:10760000E89507B600FCFDCF3DCE823551F4E09100 -:10761000AE01F091AF0105911491812FE8DD802F2B -:107620004CC0843421F5E090AE01F090AF010091A0 -:10763000B0011091B10116950795F794E794BFDD5D -:10764000682FC70168D48091AE019091AF01A091DD -:10765000B001B091B1010296A11DB11D8093AE01A0 -:107660009093AF01A093B001B093B1010BCE8436DB -:1076700009F5E090AE01F090AF010091B0011091DA -:10768000B101D801C701B695A795979587953BD4C9 -:10769000AEDD82E090E0A0E0B0E0E80EF91E0A1F47 -:1076A0001B1FE092AE01F092AF010093B001109366 -:1076B000B10104C08B3111F08FE399DD83E0809339 -:1076C000E9009091E8008091E8008E778093E800CF -:1076D00095FF04C010C08EB38823C9F08091E800E4 -:1076E00080FFF9CF8091E8008E778093E80003C097 -:1076F0008EB3882361F08091E80080FFF9CF84E0A9 -:107700008093E9008091E8008B778093E800DF9117 -:10771000CF911F910F91FF90EF90DF90CF90BF908E -:10772000AF909F908F907F906F905F904F90089553 -:107730009091B601892F8F77813249F58091B701F9 -:107740008032A1F0813219F5913A09F58091E80073 -:10775000877F8093E8008DE091E067E070E00AD2D7 -:107760008091E8008B778093E8000895913279F456 -:107770008091E800877F8093E8008DE091E067E0EA -:1077800070E05CD28091E8008E778093E8000895E5 -:1077900082E061EC42E0B4D083E061E842E1B0D045 -:1077A00084E060E842E1ACC084B7877F84BF88E1B1 -:1077B0000FB6F89480936000109260000FBE20E82E -:1077C00080E090E00FB6F894209361008093610010 -:1077D0000FBE81E085BF92E095BF3F9A209A559AEF -:1077E000E1E6F0E02083108247985D9A289A109293 -:1077F00089008AEF8093880090936F0083E08093E4 -:107800008100EFC01F9388E10FB6F8948093600069 -:10781000109260000FBE84B714BE182F10FF08C06E -:10782000E0E0F0E0859194918F5F9F4F09F05ADC82 -:107830002091000A3091010A1092010A1092000A68 -:1078400013FF0FC08091090190910A012817390791 -:1078500041F0E0E0F0E0859194918F5F9F4F09F057 -:1078600041DCA2DF78941092AD011092AC010CC003 -:10787000DDDC37D38091AC019091AD0181549F4103 -:1078800010F01092140140DC80911401882381F7DC -:107890008091E00081608093E00024DC80E090E053 -:1078A0001F910895FA01923049F0933061F09130C0 -:1078B000F9F485E191E022E130E01EC087E291E039 -:1078C0002EE330E019C0882329F485E691E024E016 -:1078D00030E012C0813029F489E691E022E230E004 -:1078E0000BC0823029F48DE891E028E130E004C03B -:1078F00080E090E020E030E091838083C90108952A -:107900008093E9008091EB0081608093EB001092FE -:10791000ED006093EC004093ED008091EE00881F35 -:107920008827881F08958091B60188238CF403C0AE -:107930008EB38823B1F08091E80082FFF9CF809167 -:10794000E8008B778093E80008958EB3882349F090 -:107950008091E80080FFF9CF8091E8008E778093D6 -:10796000E8000895EF92FF920F931F9345D04CD0FB -:1079700008ED10E0F80180818F7780838081806836 -:10798000808380818F7D808319BC1EBA1092B401E0 -:1079900080EEE82EF12CF70180818B7F8083F80147 -:1079A00080818160808380E060E042E0A9DFE1EED9 -:1079B000F0E080818E7F8083E2EEF0E08081816064 -:1079C0008083808188608083F70180818E7F8083BF -:1079D000F8018081806180831F910F91FF90EF906B -:1079E0000895E7EDF0E08081816080838AE482BFC2 -:1079F00081E08093B501B6CFE8EDF0E080818E7F25 -:107A000080831092E20008951092DA001092E10053 -:107A100008951F920F920FB60F9211242F933F9348 -:107A20004F935F936F937F938F939F93AF93BF9386 -:107A3000EF93FF938091DA0080FF1BC08091D80004 -:107A400080FF17C08091DA008E7F8093DA008091EA -:107A5000D90080FF0BC080E189BD82E189BD09B4F6 -:107A600000FEFDCF81E08EBB3BD203C019BC1EBA25 -:107A700037D28091E10080FF17C08091E20080FF43 -:107A800013C08091E2008E7F8093E2008091E2003B -:107A900080618093E2008091D80080628093D8005A -:107AA00019BC85E08EBB1CD28091E10084FF2CC004 -:107AB0008091E20084FF28C080E189BD82E189BD18 -:107AC00009B400FEFDCF8091D8008F7D8093D8004F -:107AD0008091E1008F7E8093E1008091E2008F7EB3 -:107AE0008093E2008091E20081608093E2008091C7 -:107AF000B401882331F48091E30087FD02C081E066 -:107B000001C084E08EBBECD18091E10083FF21C0F5 -:107B10008091E20083FF1DC08091E100877F809308 -:107B2000E10082E08EBB1092B4018091E1008E7F73 -:107B30008093E1008091E2008E7F8093E20080914B -:107B4000E20080618093E20080E060E042E0D8DE05 -:107B5000C7D1FF91EF91BF91AF919F918F917F918D -:107B60006F915F914F913F912F910F900FBE0F90AA -:107B70001F9018959C014091BC015091BD01461782 -:107B8000570718F4F90190E044C06115710511F030 -:107B9000AB01F8CF8091E8008E778093E80040E059 -:107BA00050E0F0CF8EB3882309F444C0853009F447 -:107BB00043C08091E80083FF02C081E00895809176 -:107BC000E80082FD31C08091E80080FF22C08091F2 -:107BD000F3009091F200782F60E0292F30E0262BFF -:107BE000372B07C081918093F100415050402F5FA7 -:107BF0003F4F4115510519F02830310598F390E0B9 -:107C00002830310509F491E08091E8008E77809367 -:107C1000E8004115510531F6992321F605C08EB3D0 -:107C2000882341F0853041F08091E80082FFF7CF52 -:107C300080E0089582E0089583E008959C01611535 -:107C4000710529F48091E8008B778093E800F901B1 -:107C500026C08EB3882391F1853091F18091E800A0 -:107C600083FF02C081E008958091E80082FFF1CF98 -:107C700006C08091F10081936150704059F02091CD -:107C8000F3008091F200322F20E090E0822B932BC2 -:107C9000892B79F78091E8008B778093E800611554 -:107CA0007105B9F605C08EB3882341F0853041F0E7 -:107CB0008091E80080FFF7CF80E0089582E008958A -:107CC00083E008950F931F93DF93CF9300D0CDB738 -:107CD000DEB7E6EBF1E08091F100819381E0EE3BCD -:107CE000F807C9F725DD8091E80083FFE4C08091A3 -:107CF000B6019091B701953009F46DC0963040F40B -:107D0000913081F1913070F0933009F0D4C02AC0E5 -:107D1000983009F4A3C0993009F4B2C0963009F044 -:107D2000CAC07CC0803809F4C6C0823809F0C3C01C -:107D30008091BA0187708093E9008091EB001092E6 -:107D4000E9002091E800277F2093E80090E025E0FB -:107D5000969587952A95E1F781708093F1001092AE -:107D6000F10087C0882319F0823009F0A4C08F7118 -:107D7000823009F0A0C08091B801882331F52091AC -:107D8000BA01277009F497C02093E9008091EB00B5 -:107D900080FF1BC0933021F48091EB00806213C000 -:107DA0008091EB0080618093EB0081E090E002C065 -:107DB000880F991F2A95E2F78093EA001092EA0053 -:107DC0008091EB0088608093EB001092E900809135 -:107DD000E800877F51C0882309F06DC01091B80179 -:107DE0001F770FB7F8948091E800877F8093E800B1 -:107DF0009ADD8091E80080FFFCCF8091E3008078DD -:107E0000812B8093E30080688093E300112311F4B9 -:107E100082E001C083E08EBB0FBF4DC0805882302E -:107E200008F049C08091B8019091B9016091BA0100 -:107E3000AE014F5F5F4F36DDBC01009709F43BC0D8 -:107E40008091E800877F8093E80089819A8192DEA3 -:107E50008091E8008B778093E8002DC0803859F539 -:107E60008091E800877F8093E8008091B40180933F -:107E7000F1008091E8008E778093E80054DD1BC00C -:107E80008823C9F49091B8019230A8F48091E80059 -:107E9000877F8093E8009093B40145DD8091B40121 -:107EA000882331F48091E30087FD02C081E001C0A6 -:107EB00084E08EBB6DDC8091E80083FF0AC0809176 -:107EC000EB0080628093EB008091E800877F8093D5 -:107ED000E8000F900F90CF91DF911F910F910895BF -:107EE00008951F938EB3882361F01091E9001092DA -:107EF000E9008091E80083FF01C0E4DE1770109371 -:107F0000E9001F910895F999FECF92BD81BDF89ABD -:107F1000992780B50895262FF999FECF1FBA92BDF3 -:107F200081BD20BD0FB6F894FA9AF99A0FBE01965A -:067F30000895F894FFCF54 -:107F36004341544552494E41007777000A000000FC -:107F4600000000080112011001020000084123018F -:107F56000701000201000109023E00020100803211 -:107F66000904000001020201000524001001042496 -:107F760002040524060001070582030800FF090420 -:107F86000100020A000000070504021000010705AF -:107F960083021000010403090422034100720064F5 -:107FA60000750069006E006F0020004C0065006FD0 -:107FB600006E006100720064006F0000001803414B -:107FC6000072006400750069006E006F0020004CAE -:087FD600004C00430000000014 +:10725000E9008091E80082FF57C2289884E690E018 +:107260009093AB018093AA01AADF182F853481F493 +:107270008CE49DE19093AD018093AC0107B600FCD6 +:10728000FDCFF999FECF81E180935700E89503C0C7 +:10729000843519F494DF8DE00DC28C34E1F3803530 +:1072A000D1F3843721F484E4A2DF80E003C2813685 +:1072B00011F489E5FFC18134B1F481DF182F7FDF3C +:1072C00090E0880F991FAA2797FDA095BA2F312F1C +:1072D000330F20E0442737FD4095542F822B932B0A +:1072E000A42BB52BB8C1803711F483E5E3C18335F6 +:1072F00049F4C0E0D1E089917ADF21E0C730D207BC +:10730000D1F7D9C1863521F481E371DF80E3D2C1A1 +:10731000833731F487E86BDF85E969DF8EE1CAC125 +:107320008536B9F4E0E0F0E093E085E09093570013 +:10733000E89507B600FCFDCF80935700E89507B6A7 +:1073400000FCFDCFE058FF4FA0E7E030FA0771F7EF +:10735000A2CF823739F4E1E0F0E089E08093570072 +:107360008491A8C1863439F4E0E0F0E089E08093AC +:10737000570084919FC18E3439F4E3E0F0E089E056 +:1073800080935700849196C1813539F4E2E0F0E0B2 +:1073900089E08093570084918DC1823631F489E56C +:1073A00026DF80E024DF80E885C1823419F087364B +:1073B00009F0E5C01092AD011092AC0100DF082F7A +:1073C000FEDEF82EFCDE682E8554823008F071C196 +:1073D000902F80E0CF2DD0E0C82BD92B10926F00DA +:1073E000173609F04BC081E180935700E895DD2402 +:1073F000CC24C3943FC0E090AE01F090AF01009167 +:10740000B0011091B101B6E46B16D9F4ED2DF0E0A6 +:10741000EE29FF29E4918E2FEADEDD2081F082E063 +:1074200090E0A0E0B0E0E80EF91E0A1F1B1FE092FA +:10743000AE01F092AF010093B0011093B101DC24D2 +:1074400018C0D801C701B695A7959795879558D5C7 +:10745000CEDE82E090E0A0E0B0E0E80EF91E0A1F68 +:107460001B1FE092AE01F092AF010093B0011093A8 +:10747000B1012197209709F0BECF7DC08090AE0169 +:107480009090AF01A090B001B090B10196E4691660 +:1074900009F05DC083E0F40180935700E89507B6DA +:1074A00000FCFDCF54C0F6E46F1661F5772031F192 +:1074B000E090AE01F090AF010091B0011091B101E8 +:1074C0007EDED82ECC24852D90E08C299D29F701D5 +:1074D0000C0140925700E895112482E090E0A0E072 +:1074E000B0E0E80EF91E0A1F1B1FE092AE01F092F9 +:1074F000AF010093B0011093B10102C060DE582EBD +:10750000742423C0E090AE01F090AF010091B0016F +:107510001091B10116950795F794E79450DE682F06 +:10752000C701F6D48091AE019091AF01A091B00156 +:10753000B091B1010296A11DB11D8093AE0190934F +:10754000AF01A093B001B093B101219704C05524BD +:10755000772444244394209709F0A5CF96E4691634 +:1075600041F485E0F40180935700E89507B600FCEC +:10757000FDCF8DE03CDE82E080936F009CC08334C1 +:1075800071F40091AE011091AF0119DE90E021E09D +:10759000F8010C0120935700E89511247CCE833626 +:1075A00019F5E090AE01F090AF010091B00110919B +:1075B000B10105DEF701E16090E021E00C012093CC +:1075C0005700E895112482E090E0A0E0B0E0E80EDA +:1075D000F91E0A1F1B1FE092AE01F092AF0100934B +:1075E000B0011093B10157CE8D3661F4E091AE0138 +:1075F000F091AF0185E080935700E89507B600FC55 +:10760000FDCF49CE823551F4E091AE01F091AF014A +:1076100005911491812FEBDD802F4CC0843421F52E +:10762000E090AE01F090AF010091B0011091B10176 +:1076300016950795F794E794C2DD682FC70168D4C3 +:107640008091AE019091AF01A091B001B091B101D4 +:107650000296A11DB11D8093AE019093AF01A0933E +:10766000B001B093B10117CE843609F5E090AE01B8 +:10767000F090AF010091B0011091B101D801C701A4 +:10768000B695A795979587953BD4B1DD82E090E0BC +:10769000A0E0B0E0E80EF91E0A1F1B1FE092AE0149 +:1076A000F092AF010093B0011093B10104C08B318F +:1076B00011F08FE39CDD83E08093E9009091E80076 +:1076C0008091E8008E778093E80095FF04C010C099 +:1076D0008EB38823C9F08091E80080FFF9CF8091B4 +:1076E000E8008E778093E80003C08EB3882361F0B2 +:1076F0008091E80080FFF9CF84E08093E9008091D9 +:10770000E8008B778093E800DF91CF911F910F9174 +:10771000FF90EF90DF90CF90BF90AF909F908F90B1 +:107720007F906F905F904F9008959091B601892F50 +:107730008F77813249F58091B7018032A1F0813293 +:1077400019F5913A09F58091E800877F8093E80068 +:107750008DE091E067E070E00AD28091E8008B77DD +:107760008093E8000895913279F48091E800877F52 +:107770008093E8008DE091E067E070E05CD280915A +:10778000E8008E778093E800089582E061EC42E0A3 +:10779000B4D083E061E842E1B0D084E060E842E147 +:1077A000ACC084B7877F84BF88E10FB6F89480931C +:1077B0006000109260000FBE20E880E090E00FB6FD +:1077C000F89420936100809361000FBE81E085BF33 +:1077D00092E095BF3F9A209A559AE1E6F0E0208327 +:1077E000108247985D9A289A109289008AEF8093B8 +:1077F000880090936F0083E080938100EFC01F9317 +:1078000088E10FB6F89480936000109260000FBE7C +:1078100084B714BE182F10FF08C0E0E0F0E0859197 +:1078200094918F5F9F4F09F05DDC2091000A3091A9 +:10783000010A1092010A1092000A13FF0FC08091F2 +:10784000090190910A012817390741F0E0E0F0E0C2 +:10785000859194918F5F9F4F09F044DCA2DF78946B +:107860001092AD011092AC010CC0E0DC37D38091D6 +:10787000AC019091AD0181549F4110F01092140120 +:1078800043DC80911401882381F78091E0008160BE +:107890008093E00027DC80E090E01F910895FA01DA +:1078A000923049F0933061F09130F9F485E191E044 +:1078B00022E130E01EC087E291E02EE330E019C003 +:1078C000882329F485E691E024E030E012C081307D +:1078D00029F489E691E022E230E00BC0823029F4FD +:1078E0008DE891E028E130E004C080E090E020E005 +:1078F00030E091838083C90108958093E9008091ED +:10790000EB0081608093EB001092ED006093EC003F +:107910004093ED008091EE00881F8827881F08950E +:107920008091B60188238CF403C08EB38823B1F014 +:107930008091E80082FFF9CF8091E8008B778093F7 +:10794000E80008958EB3882349F08091E80080FF15 +:10795000F9CF8091E8008E778093E8000895EF9248 +:10796000FF920F931F9345D04CD008ED10E0F80123 +:1079700080818F77808380818068808380818F7D04 +:10798000808319BC1EBA1092B40180EEE82EF12C4F +:10799000F70180818B7F8083F80180818160808303 +:1079A00080E060E042E0A9DFE1EEF0E080818E7FE0 +:1079B0008083E2EEF0E08081816080838081886056 +:1079C0008083F70180818E7F8083F80180818061D0 +:1079D00080831F910F91FF90EF900895E7EDF0E005 +:1079E0008081816080838AE482BF81E08093B501D9 +:1079F000B6CFE8EDF0E080818E7F80831092E200C8 +:107A000008951092DA001092E10008951F920F92EB +:107A10000FB60F9211242F933F934F935F936F9361 +:107A20007F938F939F93AF93BF93EF93FF93809137 +:107A3000DA0080FF1BC08091D80080FF17C08091C2 +:107A4000DA008E7F8093DA008091D90080FF0BC02E +:107A500080E189BD82E189BD09B400FEFDCF81E0EE +:107A60008EBB3BD203C019BC1EBA37D28091E10055 +:107A700080FF17C08091E20080FF13C08091E20078 +:107A80008E7F8093E2008091E20080618093E2002B +:107A90008091D80080628093D80019BC85E08EBBAD +:107AA0001CD28091E10084FF2CC08091E20084FF11 +:107AB00028C080E189BD82E189BD09B400FEFDCF07 +:107AC0008091D8008F7D8093D8008091E1008F7ED7 +:107AD0008093E1008091E2008F7E8093E2008091AC +:107AE000E20081608093E2008091B401882331F448 +:107AF0008091E30087FD02C081E001C084E08EBB7D +:107B0000ECD18091E10083FF21C08091E20083FFEE +:107B10001DC08091E100877F8093E10082E08EBBF1 +:107B20001092B4018091E1008E7F8093E1008091FA +:107B3000E2008E7F8093E2008091E200806180937A +:107B4000E20080E060E042E0D8DEC7D1FF91EF9133 +:107B5000BF91AF919F918F917F916F915F914F9165 +:107B60003F912F910F900FBE0F901F9018959C0181 +:107B70004091BC015091BD014617570718F4F90117 +:107B800090E044C06115710511F0AB01F8CF809110 +:107B9000E8008E778093E80040E050E0F0CF8EB3AD +:107BA000882309F444C0853009F443C08091E8007B +:107BB00083FF02C081E008958091E80082FD31C01A +:107BC0008091E80080FF22C08091F3009091F20044 +:107BD000782F60E0292F30E0262B372B07C08191CA +:107BE0008093F100415050402F5F3F4F41155105A8 +:107BF00019F02830310598F390E02830310509F468 +:107C000091E08091E8008E778093E800411551055E +:107C100031F6992321F605C08EB3882341F08530D3 +:107C200041F08091E80082FFF7CF80E0089582E084 +:107C3000089583E008959C016115710529F48091F0 +:107C4000E8008B778093E800F90126C08EB3882383 +:107C500091F1853091F18091E80083FF02C081E0CD +:107C600008958091E80082FFF1CF06C08091F10075 +:107C700081936150704059F02091F3008091F2009F +:107C8000322F20E090E0822B932B892B79F7809183 +:107C9000E8008B778093E80061157105B9F605C09F +:107CA0008EB3882341F0853041F08091E80080FF59 +:107CB000F7CF80E0089582E0089583E008950F9360 +:107CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E0A3 +:107CD0008091F100819381E0EE3BF807C9F725DD43 +:107CE0008091E80083FFE4C08091B6019091B701D4 +:107CF000953009F46DC0963040F4913081F19130A7 +:107D000070F0933009F0D4C02AC0983009F4A3C0B1 +:107D1000993009F4B2C0963009F0CAC07CC08038EE +:107D200009F4C6C0823809F0C3C08091BA018770D7 +:107D30008093E9008091EB001092E9002091E80027 +:107D4000277F2093E80090E025E0969587952A9577 +:107D5000E1F781708093F1001092F10087C08823D1 +:107D600019F0823009F0A4C08F71823009F0A0C0F0 +:107D70008091B801882331F52091BA01277009F468 +:107D800097C02093E9008091EB0080FF1BC09330E7 +:107D900021F48091EB00806213C08091EB00806140 +:107DA0008093EB0081E090E002C0880F991F2A9534 +:107DB000E2F78093EA001092EA008091EB0088607D +:107DC0008093EB001092E9008091E800877F51C01A +:107DD000882309F06DC01091B8011F770FB7F89490 +:107DE0008091E800877F8093E8009ADD8091E80029 +:107DF00080FFFCCF8091E3008078812B8093E300AB +:107E000080688093E300112311F482E001C083E0D5 +:107E10008EBB0FBF4DC08058823008F049C08091A2 +:107E2000B8019091B9016091BA01AE014F5F5F4F07 +:107E300036DDBC01009709F43BC08091E800877FE4 +:107E40008093E80089819A8192DE8091E8008B77A7 +:107E50008093E8002DC0803859F58091E800877F35 +:107E60008093E8008091B4018093F1008091E80054 +:107E70008E778093E80054DD1BC08823C9F490916D +:107E8000B8019230A8F48091E800877F8093E800E1 +:107E90009093B40145DD8091B401882331F4809141 +:107EA000E30087FD02C081E001C084E08EBB6DDC91 +:107EB0008091E80083FF0AC08091EB00806280938C +:107EC000EB008091E800877F8093E8000F900F908F +:107ED000CF91DF911F910F91089508951F938EB355 +:107EE000882361F01091E9001092E9008091E80088 +:107EF00083FF01C0E4DE17701093E9001F9108951D +:107F0000F999FECF92BD81BDF89A992780B5089561 +:107F1000262FF999FECF1FBA92BD81BD20BD0FB6A5 +:107F2000F894FA9AF99A0FBE01960895F894FFCF43 +:107F30004341544552494E41007777000A00000002 +:107F40000000000801120110010200000841230195 +:107F50000701000201000109023E00020100803217 +:107F6000090400000102020100052400100104249C +:107F700002040524060001070582030800FF090426 +:107F80000100020A000000070504021000010705B5 +:107F900083021000010403090422034100720064FB +:107FA00000750069006E006F0020004C0065006FD6 +:107FB000006E006100720064006F00000018034151 +:107FC0000072006400750069006E006F0020004CB4 +:087FD000004C0043000000001A :040000030000700089 :00000001FF diff --git a/bootloaders/caterina/Makefile b/bootloaders/caterina/Makefile index 5439b5b..ef583bc 100755 --- a/bootloaders/caterina/Makefile +++ b/bootloaders/caterina/Makefile @@ -133,7 +133,7 @@ LUFA_OPTS += -D NO_SOF_EVENTS #LUFA_OPTS += -D NO_BLOCK_SUPPORT #LUFA_OPTS += -D NO_EEPROM_BYTE_SUPPORT #LUFA_OPTS += -D NO_FLASH_BYTE_SUPPORT -#LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT +LUFA_OPTS += -D NO_LOCK_BYTE_WRITE_SUPPORT # Create the LUFA source path variables by including the LUFA root makefile -- cgit v1.2.3-18-g5258 From 8c618773b56a302b9fda0a0c14da34e09bba25fa Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 14 Mar 2012 18:17:22 -0400 Subject: reduced delay before starting the Leonardo bootloader Since we use a magic RAM flag to signal to the bootloader there's a risk of the sketch overwriting the magic RAM location before the bootloader starts. By reducing the watchdog timeout we reduce the chance of this happening. --- cores/arduino/CDC.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 94faf2e..7206aa6 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -111,7 +111,7 @@ bool WEAK CDC_Setup(Setup& setup) // Serial1.print(">"); Serial1.println(_usbLineInfo.lineState, HEX); if ((_usbLineInfo.lineState & 0x01) == 0) { *(uint16_t *)0x0A00 = 0x7777; - wdt_enable(WDTO_250MS); + wdt_enable(WDTO_120MS); } else { // Most OSs do some intermediate steps when configuring ports and DTR can // twiggle more than once before stabilizing. -- cgit v1.2.3-18-g5258 From 9c040a8a2bcc7ec8d128df05479b2e741fe192c2 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 26 Mar 2012 16:02:40 -0400 Subject: added stub methods for begin() and end() to Mouse and Keyboard --- cores/arduino/HID.cpp | 20 ++++++++++++++++++-- cores/arduino/USBAPI.h | 8 ++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index 378a157..e7ee249 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -201,7 +201,15 @@ bool WEAK HID_Setup(Setup& setup) //================================================================================ // Mouse -Mouse_::Mouse_() : _buttons(0) +Mouse_::Mouse_(void) : _buttons(0) +{ +} + +void Mouse_::begin(void) +{ +} + +void Mouse_::end(void) { } @@ -253,7 +261,15 @@ bool Mouse_::isPressed(uint8_t b) //================================================================================ // Keyboard -Keyboard_::Keyboard_() +Keyboard_::Keyboard_(void) +{ +} + +void Keyboard_::begin(void) +{ +} + +void Keyboard_::end(void) { } diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 05f7318..c8948c1 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -57,7 +57,9 @@ private: uint8_t _buttons; void buttons(uint8_t b); public: - Mouse_(); + Mouse_(void); + void begin(void); + void end(void); void click(uint8_t b = MOUSE_LEFT); void move(signed char x, signed char y, signed char wheel = 0); void press(uint8_t b = MOUSE_LEFT); // press LEFT by default @@ -121,7 +123,9 @@ private: KeyReport _keyReport; void sendReport(KeyReport* keys); public: - Keyboard_(); + Keyboard_(void); + void begin(void); + void end(void); virtual size_t write(uint8_t k) {return type(k);}; virtual size_t type(uint8_t k); virtual size_t press(uint8_t k); -- cgit v1.2.3-18-g5258 From f646c9186d33b26adeaada088e9549417463cdab Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 26 Mar 2012 17:00:16 -0400 Subject: Keyboard.type() now just presses and releases the key indicated - doesn't releaseAll() --- cores/arduino/HID.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index e7ee249..b0ef6e3 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -523,13 +523,10 @@ void Keyboard_::releaseAll(void) // type() does a press and release of the specified key. size_t Keyboard_::type(uint8_t c) -{ - releaseAll(); - // Keydown - press(c); - // Keyup - releaseAll(); - return 1; +{ + uint8_t p = press(c); // Keydown + uint8_t r = release(c); // Keyup + return (p&r); } #endif -- cgit v1.2.3-18-g5258 From 58c36f76d51d1fe4859140acf5c9c056b4204da5 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 26 Mar 2012 17:28:02 -0400 Subject: added methods to Keyboard to handle multiple simultaneous key presses or releases (up to six each) --- cores/arduino/HID.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++------ cores/arduino/USBAPI.h | 15 ++++++++ 2 files changed, 96 insertions(+), 11 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index b0ef6e3..b556223 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -467,17 +467,6 @@ size_t Keyboard_::press(uint8_t k) // it shouldn't be repeated any more. size_t Keyboard_::release(uint8_t k) { - /* - uint8_t i; - k = pgm_read_byte(_asciimap + k); - if (!k) { - return 0; - } - if (k & 0x80) { - _keyReport.modifiers |= 0x02; // the left shift modifier - k &= 0x7F; - } - */ uint8_t i; if (k >= 136) { // it's a non-printing key (not a modifier) k = k - 136; @@ -509,6 +498,87 @@ size_t Keyboard_::release(uint8_t k) return 1; } +size_t Keyboard_::press(uint8_t k[], uint8_t len) { + uint8_t i; + uint8_t result = 0; + for (i=0; i Date: Wed, 28 Mar 2012 18:35:26 -0400 Subject: eliminated Keyboard.type() - unnecessary duplication of Keyboard.write() (David Mellis). Also edit KeyboardReprogram example which was the only example using type() --- cores/arduino/HID.cpp | 3 +-- cores/arduino/USBAPI.h | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index b556223..dfcbd9d 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -591,8 +591,7 @@ void Keyboard_::releaseAll(void) sendReport(&_keyReport); } -// type() does a press and release of the specified key. -size_t Keyboard_::type(uint8_t c) +size_t Keyboard_::write(uint8_t c) { uint8_t p = press(c); // Keydown uint8_t r = release(c); // Keyup diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index e83089a..ee35af9 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -126,8 +126,7 @@ public: Keyboard_(void); void begin(void); void end(void); - virtual size_t write(uint8_t k) {return type(k);}; - virtual size_t type(uint8_t k); + virtual size_t write(uint8_t k); virtual size_t press(uint8_t k); virtual size_t release(uint8_t k); -- cgit v1.2.3-18-g5258 From 83feb140138d1c7900619ac2a733885e192987a8 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 28 Mar 2012 18:46:10 -0400 Subject: removed horrible multi-key Keyboard.press() and Keyboard.release() methods Saves 924 bytes of Flash --- cores/arduino/HID.cpp | 81 -------------------------------------------------- cores/arduino/USBAPI.h | 15 ---------- 2 files changed, 96 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index dfcbd9d..cdf49bd 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -498,87 +498,6 @@ size_t Keyboard_::release(uint8_t k) return 1; } -size_t Keyboard_::press(uint8_t k[], uint8_t len) { - uint8_t i; - uint8_t result = 0; - for (i=0; i Date: Wed, 28 Mar 2012 19:46:32 -0400 Subject: fixed logic error in Keyboard.release() - now removes every occurrence of a key if it's present more than once --- cores/arduino/HID.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp index cdf49bd..ac63608 100644 --- a/cores/arduino/HID.cpp +++ b/cores/arduino/HID.cpp @@ -435,7 +435,7 @@ size_t Keyboard_::press(uint8_t k) setWriteError(); return 0; } - if (k & 0x80) { + if (k & 0x80) { // it's a capital letter or other character reached with shift _keyReport.modifiers |= 0x02; // the left shift modifier k &= 0x7F; } @@ -478,22 +478,20 @@ size_t Keyboard_::release(uint8_t k) if (!k) { return 0; } - if (k & 0x80) { + if (k & 0x80) { // it's a capital letter or other character reached with shift _keyReport.modifiers &= ~(0x02); // the left shift modifier k &= 0x7F; } } // Test the key report to see if k is present. Clear it if it exists. + // Check all positions in case the key is present more than once (which it shouldn't be) for (i=0; i<6; i++) { - if (_keyReport.keys[i] == k) { + if (0 != k && _keyReport.keys[i] == k) { _keyReport.keys[i] = 0x00; - break; } } - if (i == 6) { - return 0; - } + sendReport(&_keyReport); return 1; } @@ -514,7 +512,7 @@ size_t Keyboard_::write(uint8_t c) { uint8_t p = press(c); // Keydown uint8_t r = release(c); // Keyup - return (p&r); + return (p); // just return the result of press() since release() almost always returns 1 } #endif -- cgit v1.2.3-18-g5258 From a984b581a8ad093b55ec9f2d4677afdd77bf4705 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sun, 1 Apr 2012 12:54:35 -0400 Subject: added Boolean operators to HardwareSerial and CDC to test whether the port is ready to send data. Mostly useful for Leonardo - simple way to test whether the port is actually opened by an application and ready to receive data. For Serial objects attached to real UARTs always returns true. --- cores/arduino/CDC.cpp | 6 ++++++ cores/arduino/HardwareSerial.cpp | 4 ++++ cores/arduino/HardwareSerial.h | 1 + cores/arduino/USBAPI.h | 1 + 4 files changed, 12 insertions(+) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 7206aa6..1275304 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -213,6 +213,12 @@ size_t Serial_::write(uint8_t c) return 0; } +Serial_::operator bool() { + if (_usbLineInfo.lineState > 0) + return true; + return false; +} + Serial_ Serial; #endif diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp index 9985b78..f40ddee 100644 --- a/cores/arduino/HardwareSerial.cpp +++ b/cores/arduino/HardwareSerial.cpp @@ -398,6 +398,10 @@ size_t HardwareSerial::write(uint8_t c) return 1; } +HardwareSerial::operator bool() { + return true; +} + // Preinstantiate Objects ////////////////////////////////////////////////////// #if defined(UBRRH) && defined(UBRRL) diff --git a/cores/arduino/HardwareSerial.h b/cores/arduino/HardwareSerial.h index 176abe1..bf4924c 100644 --- a/cores/arduino/HardwareSerial.h +++ b/cores/arduino/HardwareSerial.h @@ -57,6 +57,7 @@ class HardwareSerial : public Stream virtual void flush(void); virtual size_t write(uint8_t); using Print::write; // pull in write(str) and write(buf, size) from Print + operator bool(); }; #if defined(UBRRH) || defined(UBRR0H) diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 5169e65..f66cb16 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -39,6 +39,7 @@ public: virtual int read(void); virtual void flush(void); virtual size_t write(uint8_t); + operator bool(); }; extern Serial_ Serial; -- cgit v1.2.3-18-g5258 From dd55096901b163b315948e0ddee3706464b3ec26 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 3 Apr 2012 10:52:38 -0400 Subject: added a short delay and comment to boolean operator in CDC Delay fixes problem where the port has been configured but not quite opened. Federico found that 10 ms was the minimum time needed to avoid problems. --- cores/arduino/CDC.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 1275304..c1e646d 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -213,10 +213,19 @@ size_t Serial_::write(uint8_t c) return 0; } +// This operator is a convenient way for a sketch to check whether the +// port has actually been configured and opened by the host (as opposed +// to just being connected to the host). It can be used, for example, in +// setup() before printing to ensure that an application on the host is +// actually ready to receive and display the data. +// We add a short delay before returning to fix a bug observed by Federico +// where the port is configured (lineState != 0) but not quite opened. Serial_::operator bool() { - if (_usbLineInfo.lineState > 0) - return true; - return false; + bool result = false; + if (_usbLineInfo.lineState > 0) + result = true; + delay(10); + return result; } Serial_ Serial; -- cgit v1.2.3-18-g5258 From 02c5849501294f2965051c41e1236899a55f7bfc Mon Sep 17 00:00:00 2001 From: Federico Vanzati Date: Fri, 6 Apr 2012 17:36:09 +0200 Subject: Revert "added a short delay and comment to boolean operator in CDC" This reverts commit ade4893f585e3e94fa6cf683620e1d12afc88ecd. --- cores/arduino/CDC.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index c1e646d..1275304 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -213,19 +213,10 @@ size_t Serial_::write(uint8_t c) return 0; } -// This operator is a convenient way for a sketch to check whether the -// port has actually been configured and opened by the host (as opposed -// to just being connected to the host). It can be used, for example, in -// setup() before printing to ensure that an application on the host is -// actually ready to receive and display the data. -// We add a short delay before returning to fix a bug observed by Federico -// where the port is configured (lineState != 0) but not quite opened. Serial_::operator bool() { - bool result = false; - if (_usbLineInfo.lineState > 0) - result = true; - delay(10); - return result; + if (_usbLineInfo.lineState > 0) + return true; + return false; } Serial_ Serial; -- cgit v1.2.3-18-g5258 From ee611dc194fad72d2db9a901208577857365778f Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Fri, 6 Apr 2012 21:23:17 -0400 Subject: Revert "Revert "added a short delay and comment to boolean operator in CDC"" This reverts commit 200eefb4e2ac7796c5c901e8fd9369c85ec544c5. --- cores/arduino/CDC.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 1275304..c1e646d 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -213,10 +213,19 @@ size_t Serial_::write(uint8_t c) return 0; } +// This operator is a convenient way for a sketch to check whether the +// port has actually been configured and opened by the host (as opposed +// to just being connected to the host). It can be used, for example, in +// setup() before printing to ensure that an application on the host is +// actually ready to receive and display the data. +// We add a short delay before returning to fix a bug observed by Federico +// where the port is configured (lineState != 0) but not quite opened. Serial_::operator bool() { - if (_usbLineInfo.lineState > 0) - return true; - return false; + bool result = false; + if (_usbLineInfo.lineState > 0) + result = true; + delay(10); + return result; } Serial_ Serial; -- cgit v1.2.3-18-g5258 From afedb5a92bac5c7f62a02ba085b4fff2b4f2070a Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 9 Apr 2012 08:03:56 -0400 Subject: PID and VID are no longer hard-coded in bootloader. instead they are passed in at compile-time from makefile. also added and renamed built bootloader images for Micro and Leonardo --- bootloaders/caterina/Caterina-Leonardo.hex | 256 +++++++++++++++++++++++++++++ bootloaders/caterina/Caterina-Micro.hex | 256 +++++++++++++++++++++++++++++ bootloaders/caterina/Caterina.hex | 256 ----------------------------- bootloaders/caterina/Descriptors.c | 12 +- bootloaders/caterina/Makefile | 13 ++ 5 files changed, 534 insertions(+), 259 deletions(-) create mode 100644 bootloaders/caterina/Caterina-Leonardo.hex create mode 100644 bootloaders/caterina/Caterina-Micro.hex delete mode 100644 bootloaders/caterina/Caterina.hex diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex new file mode 100644 index 0000000..d7873af --- /dev/null +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -0,0 +1,256 @@ +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC00000F1C400005AC0000053 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C0000078C000004CC000004AC00000E2 +:1070500048C0000046C0000044C0000042C000001C +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0E36A +:1070C000FFE702C005900D92A83AB107D9F711E089 +:1070D000A8EAB1E001C01D92AE3BB107E1F78FD342 +:1070E00025C78ECFF89410926F00109281001092F5 +:1070F00085001092840081E085BF15BE47985D9A97 +:10710000289A0C94000008952091B2013091B301A7 +:107110002F5F3F4F3093B3012093B201932F37FF7E +:1071200003C08EEF831B982F990F921710F4479886 +:107130000895479A08951F920F920FB60F92112447 +:107140002F938F939F93EF93FF931092850010924C +:1071500084008091A8019091A901009741F00197C6 +:107160009093A9018093A801892B09F45D9A8091DD +:10717000AA019091AB01009741F001979093AB0168 +:107180008093AA01892B09F4289AE0E0F0E0859128 +:1071900094918F5F9F4F49F08091AC019091AD0128 +:1071A00001969093AD018093AC01FF91EF919F9177 +:1071B0008F912F910F900FBE0F901F90189584E024 +:1071C0008093E9000DC08091E8008B778093E80000 +:1071D00003C08EB3882351F08091E80082FFF9CF7D +:1071E0008091E80085FFEFCF8091F1000895982FFE +:1071F00083E08093E9008091E80085FD0DC08091D7 +:10720000E8008E778093E80003C08EB3882369F08E +:107210008091E80080FFF9CF9093F1005D9884E6BB +:1072200090E09093A9018093A80108954F925F92F6 +:107230006F927F928F929F92AF92BF92CF92DF9286 +:10724000EF92FF920F931F93CF93DF9384E080938D +:10725000E9008091E80082FF57C2289884E690E018 +:107260009093AB018093AA01AADF182F853481F493 +:107270008CE49DE19093AD018093AC0107B600FCD6 +:10728000FDCFF999FECF81E180935700E89503C0C7 +:10729000843519F494DF8DE00DC28C34E1F3803530 +:1072A000D1F3843721F484E4A2DF80E003C2813685 +:1072B00011F489E5FFC18134B1F481DF182F7FDF3C +:1072C00090E0880F991FAA2797FDA095BA2F312F1C +:1072D000330F20E0442737FD4095542F822B932B0A +:1072E000A42BB52BB8C1803711F483E5E3C18335F6 +:1072F00049F4C0E0D1E089917ADF21E0C730D207BC +:10730000D1F7D9C1863521F481E371DF80E3D2C1A1 +:10731000833731F487E86BDF85E969DF8EE1CAC125 +:107320008536B9F4E0E0F0E093E085E09093570013 +:10733000E89507B600FCFDCF80935700E89507B6A7 +:1073400000FCFDCFE058FF4FA0E7E030FA0771F7EF +:10735000A2CF823739F4E1E0F0E089E08093570072 +:107360008491A8C1863439F4E0E0F0E089E08093AC +:10737000570084919FC18E3439F4E3E0F0E089E056 +:1073800080935700849196C1813539F4E2E0F0E0B2 +:1073900089E08093570084918DC1823631F489E56C +:1073A00026DF80E024DF80E885C1823419F087364B +:1073B00009F0E5C01092AD011092AC0100DF082F7A +:1073C000FEDEF82EFCDE682E8554823008F071C196 +:1073D000902F80E0CF2DD0E0C82BD92B10926F00DA +:1073E000173609F04BC081E180935700E895DD2402 +:1073F000CC24C3943FC0E090AE01F090AF01009167 +:10740000B0011091B101B6E46B16D9F4ED2DF0E0A6 +:10741000EE29FF29E4918E2FEADEDD2081F082E063 +:1074200090E0A0E0B0E0E80EF91E0A1F1B1FE092FA +:10743000AE01F092AF010093B0011093B101DC24D2 +:1074400018C0D801C701B695A7959795879558D5C7 +:10745000CEDE82E090E0A0E0B0E0E80EF91E0A1F68 +:107460001B1FE092AE01F092AF010093B0011093A8 +:10747000B1012197209709F0BECF7DC08090AE0169 +:107480009090AF01A090B001B090B10196E4691660 +:1074900009F05DC083E0F40180935700E89507B6DA +:1074A00000FCFDCF54C0F6E46F1661F5772031F192 +:1074B000E090AE01F090AF010091B0011091B101E8 +:1074C0007EDED82ECC24852D90E08C299D29F701D5 +:1074D0000C0140925700E895112482E090E0A0E072 +:1074E000B0E0E80EF91E0A1F1B1FE092AE01F092F9 +:1074F000AF010093B0011093B10102C060DE582EBD +:10750000742423C0E090AE01F090AF010091B0016F +:107510001091B10116950795F794E79450DE682F06 +:10752000C701F6D48091AE019091AF01A091B00156 +:10753000B091B1010296A11DB11D8093AE0190934F +:10754000AF01A093B001B093B101219704C05524BD +:10755000772444244394209709F0A5CF96E4691634 +:1075600041F485E0F40180935700E89507B600FCEC +:10757000FDCF8DE03CDE82E080936F009CC08334C1 +:1075800071F40091AE011091AF0119DE90E021E09D +:10759000F8010C0120935700E89511247CCE833626 +:1075A00019F5E090AE01F090AF010091B00110919B +:1075B000B10105DEF701E16090E021E00C012093CC +:1075C0005700E895112482E090E0A0E0B0E0E80EDA +:1075D000F91E0A1F1B1FE092AE01F092AF0100934B +:1075E000B0011093B10157CE8D3661F4E091AE0138 +:1075F000F091AF0185E080935700E89507B600FC55 +:10760000FDCF49CE823551F4E091AE01F091AF014A +:1076100005911491812FEBDD802F4CC0843421F52E +:10762000E090AE01F090AF010091B0011091B10176 +:1076300016950795F794E794C2DD682FC70168D4C3 +:107640008091AE019091AF01A091B001B091B101D4 +:107650000296A11DB11D8093AE019093AF01A0933E +:10766000B001B093B10117CE843609F5E090AE01B8 +:10767000F090AF010091B0011091B101D801C701A4 +:10768000B695A795979587953BD4B1DD82E090E0BC +:10769000A0E0B0E0E80EF91E0A1F1B1FE092AE0149 +:1076A000F092AF010093B0011093B10104C08B318F +:1076B00011F08FE39CDD83E08093E9009091E80076 +:1076C0008091E8008E778093E80095FF04C010C099 +:1076D0008EB38823C9F08091E80080FFF9CF8091B4 +:1076E000E8008E778093E80003C08EB3882361F0B2 +:1076F0008091E80080FFF9CF84E08093E9008091D9 +:10770000E8008B778093E800DF91CF911F910F9174 +:10771000FF90EF90DF90CF90BF90AF909F908F90B1 +:107720007F906F905F904F9008959091B601892F50 +:107730008F77813249F58091B7018032A1F0813293 +:1077400019F5913A09F58091E800877F8093E80068 +:107750008DE091E067E070E00AD28091E8008B77DD +:107760008093E8000895913279F48091E800877F52 +:107770008093E8008DE091E067E070E05CD280915A +:10778000E8008E778093E800089582E061EC42E0A3 +:10779000B4D083E061E842E1B0D084E060E842E147 +:1077A000ACC084B7877F84BF88E10FB6F89480931C +:1077B0006000109260000FBE20E880E090E00FB6FD +:1077C000F89420936100809361000FBE81E085BF33 +:1077D00092E095BF3F9A209A559AE1E6F0E0208327 +:1077E000108247985D9A289A109289008AEF8093B8 +:1077F000880090936F0083E080938100EFC01F9317 +:1078000088E10FB6F89480936000109260000FBE7C +:1078100084B714BE182F10FF08C0E0E0F0E0859197 +:1078200094918F5F9F4F09F05DDC2091000A3091A9 +:10783000010A1092010A1092000A13FF0FC08091F2 +:10784000090190910A012817390741F0E0E0F0E0C2 +:10785000859194918F5F9F4F09F044DCA2DF78946B +:107860001092AD011092AC010CC0E0DC37D38091D6 +:10787000AC019091AD0181549F4110F01092140120 +:1078800043DC80911401882381F78091E0008160BE +:107890008093E00027DC80E090E01F910895FA01DA +:1078A000923049F0933061F09130F9F485E191E044 +:1078B00022E130E01EC087E291E02EE330E019C003 +:1078C000882329F485E691E024E030E012C081307D +:1078D00029F489E691E022E230E00BC0823029F4FD +:1078E0008DE891E028E130E004C080E090E020E005 +:1078F00030E091838083C90108958093E9008091ED +:10790000EB0081608093EB001092ED006093EC003F +:107910004093ED008091EE00881F8827881F08950E +:107920008091B60188238CF403C08EB38823B1F014 +:107930008091E80082FFF9CF8091E8008B778093F7 +:10794000E80008958EB3882349F08091E80080FF15 +:10795000F9CF8091E8008E778093E8000895EF9248 +:10796000FF920F931F9345D04CD008ED10E0F80123 +:1079700080818F77808380818068808380818F7D04 +:10798000808319BC1EBA1092B40180EEE82EF12C4F +:10799000F70180818B7F8083F80180818160808303 +:1079A00080E060E042E0A9DFE1EEF0E080818E7FE0 +:1079B0008083E2EEF0E08081816080838081886056 +:1079C0008083F70180818E7F8083F80180818061D0 +:1079D00080831F910F91FF90EF900895E7EDF0E005 +:1079E0008081816080838AE482BF81E08093B501D9 +:1079F000B6CFE8EDF0E080818E7F80831092E200C8 +:107A000008951092DA001092E10008951F920F92EB +:107A10000FB60F9211242F933F934F935F936F9361 +:107A20007F938F939F93AF93BF93EF93FF93809137 +:107A3000DA0080FF1BC08091D80080FF17C08091C2 +:107A4000DA008E7F8093DA008091D90080FF0BC02E +:107A500080E189BD82E189BD09B400FEFDCF81E0EE +:107A60008EBB3BD203C019BC1EBA37D28091E10055 +:107A700080FF17C08091E20080FF13C08091E20078 +:107A80008E7F8093E2008091E20080618093E2002B +:107A90008091D80080628093D80019BC85E08EBBAD +:107AA0001CD28091E10084FF2CC08091E20084FF11 +:107AB00028C080E189BD82E189BD09B400FEFDCF07 +:107AC0008091D8008F7D8093D8008091E1008F7ED7 +:107AD0008093E1008091E2008F7E8093E2008091AC +:107AE000E20081608093E2008091B401882331F448 +:107AF0008091E30087FD02C081E001C084E08EBB7D +:107B0000ECD18091E10083FF21C08091E20083FFEE +:107B10001DC08091E100877F8093E10082E08EBBF1 +:107B20001092B4018091E1008E7F8093E1008091FA +:107B3000E2008E7F8093E2008091E200806180937A +:107B4000E20080E060E042E0D8DEC7D1FF91EF9133 +:107B5000BF91AF919F918F917F916F915F914F9165 +:107B60003F912F910F900FBE0F901F9018959C0181 +:107B70004091BC015091BD014617570718F4F90117 +:107B800090E044C06115710511F0AB01F8CF809110 +:107B9000E8008E778093E80040E050E0F0CF8EB3AD +:107BA000882309F444C0853009F443C08091E8007B +:107BB00083FF02C081E008958091E80082FD31C01A +:107BC0008091E80080FF22C08091F3009091F20044 +:107BD000782F60E0292F30E0262B372B07C08191CA +:107BE0008093F100415050402F5F3F4F41155105A8 +:107BF00019F02830310598F390E02830310509F468 +:107C000091E08091E8008E778093E800411551055E +:107C100031F6992321F605C08EB3882341F08530D3 +:107C200041F08091E80082FFF7CF80E0089582E084 +:107C3000089583E008959C016115710529F48091F0 +:107C4000E8008B778093E800F90126C08EB3882383 +:107C500091F1853091F18091E80083FF02C081E0CD +:107C600008958091E80082FFF1CF06C08091F10075 +:107C700081936150704059F02091F3008091F2009F +:107C8000322F20E090E0822B932B892B79F7809183 +:107C9000E8008B778093E80061157105B9F605C09F +:107CA0008EB3882341F0853041F08091E80080FF59 +:107CB000F7CF80E0089582E0089583E008950F9360 +:107CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E0A3 +:107CD0008091F100819381E0EE3BF807C9F725DD43 +:107CE0008091E80083FFE4C08091B6019091B701D4 +:107CF000953009F46DC0963040F4913081F19130A7 +:107D000070F0933009F0D4C02AC0983009F4A3C0B1 +:107D1000993009F4B2C0963009F0CAC07CC08038EE +:107D200009F4C6C0823809F0C3C08091BA018770D7 +:107D30008093E9008091EB001092E9002091E80027 +:107D4000277F2093E80090E025E0969587952A9577 +:107D5000E1F781708093F1001092F10087C08823D1 +:107D600019F0823009F0A4C08F71823009F0A0C0F0 +:107D70008091B801882331F52091BA01277009F468 +:107D800097C02093E9008091EB0080FF1BC09330E7 +:107D900021F48091EB00806213C08091EB00806140 +:107DA0008093EB0081E090E002C0880F991F2A9534 +:107DB000E2F78093EA001092EA008091EB0088607D +:107DC0008093EB001092E9008091E800877F51C01A +:107DD000882309F06DC01091B8011F770FB7F89490 +:107DE0008091E800877F8093E8009ADD8091E80029 +:107DF00080FFFCCF8091E3008078812B8093E300AB +:107E000080688093E300112311F482E001C083E0D5 +:107E10008EBB0FBF4DC08058823008F049C08091A2 +:107E2000B8019091B9016091BA01AE014F5F5F4F07 +:107E300036DDBC01009709F43BC08091E800877FE4 +:107E40008093E80089819A8192DE8091E8008B77A7 +:107E50008093E8002DC0803859F58091E800877F35 +:107E60008093E8008091B4018093F1008091E80054 +:107E70008E778093E80054DD1BC08823C9F490916D +:107E8000B8019230A8F48091E800877F8093E800E1 +:107E90009093B40145DD8091B401882331F4809141 +:107EA000E30087FD02C081E001C084E08EBB6DDC91 +:107EB0008091E80083FF0AC08091EB00806280938C +:107EC000EB008091E800877F8093E8000F900F908F +:107ED000CF91DF911F910F91089508951F938EB355 +:107EE000882361F01091E9001092E9008091E80088 +:107EF00083FF01C0E4DE17701093E9001F9108951D +:107F0000F999FECF92BD81BDF89A992780B5089561 +:107F1000262FF999FECF1FBA92BD81BD20BD0FB6A5 +:107F2000F894FA9AF99A0FBE01960895F894FFCF43 +:107F30004341544552494E41007777000A00000002 +:107F40000000000801120110010200000841233462 +:107F50000001000201000109023E0002010080321E +:107F6000090400000102020100052400100104249C +:107F700002040524060001070582030800FF090426 +:107F80000100020A000000070504021000010705B5 +:107F900083021000010403090422034100720064FB +:107FA00000750069006E006F0020004C0065006FD6 +:107FB000006E006100720064006F00000018034151 +:107FC0000072006400750069006E006F0020004CB4 +:087FD000004C0043000000001A +:040000030000700089 +:00000001FF diff --git a/bootloaders/caterina/Caterina-Micro.hex b/bootloaders/caterina/Caterina-Micro.hex new file mode 100644 index 0000000..7479210 --- /dev/null +++ b/bootloaders/caterina/Caterina-Micro.hex @@ -0,0 +1,256 @@ +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC00000F1C400005AC0000053 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C0000078C000004CC000004AC00000E2 +:1070500048C0000046C0000044C0000042C000001C +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0E36A +:1070C000FFE702C005900D92A83AB107D9F711E089 +:1070D000A8EAB1E001C01D92AE3BB107E1F78FD342 +:1070E00025C78ECFF89410926F00109281001092F5 +:1070F00085001092840081E085BF15BE47985D9A97 +:10710000289A0C94000008952091B2013091B301A7 +:107110002F5F3F4F3093B3012093B201932F37FF7E +:1071200003C08EEF831B982F990F921710F4479886 +:107130000895479A08951F920F920FB60F92112447 +:107140002F938F939F93EF93FF931092850010924C +:1071500084008091A8019091A901009741F00197C6 +:107160009093A9018093A801892B09F45D9A8091DD +:10717000AA019091AB01009741F001979093AB0168 +:107180008093AA01892B09F4289AE0E0F0E0859128 +:1071900094918F5F9F4F49F08091AC019091AD0128 +:1071A00001969093AD018093AC01FF91EF919F9177 +:1071B0008F912F910F900FBE0F901F90189584E024 +:1071C0008093E9000DC08091E8008B778093E80000 +:1071D00003C08EB3882351F08091E80082FFF9CF7D +:1071E0008091E80085FFEFCF8091F1000895982FFE +:1071F00083E08093E9008091E80085FD0DC08091D7 +:10720000E8008E778093E80003C08EB3882369F08E +:107210008091E80080FFF9CF9093F1005D9884E6BB +:1072200090E09093A9018093A80108954F925F92F6 +:107230006F927F928F929F92AF92BF92CF92DF9286 +:10724000EF92FF920F931F93CF93DF9384E080938D +:10725000E9008091E80082FF57C2289884E690E018 +:107260009093AB018093AA01AADF182F853481F493 +:107270008CE49DE19093AD018093AC0107B600FCD6 +:10728000FDCFF999FECF81E180935700E89503C0C7 +:10729000843519F494DF8DE00DC28C34E1F3803530 +:1072A000D1F3843721F484E4A2DF80E003C2813685 +:1072B00011F489E5FFC18134B1F481DF182F7FDF3C +:1072C00090E0880F991FAA2797FDA095BA2F312F1C +:1072D000330F20E0442737FD4095542F822B932B0A +:1072E000A42BB52BB8C1803711F483E5E3C18335F6 +:1072F00049F4C0E0D1E089917ADF21E0C730D207BC +:10730000D1F7D9C1863521F481E371DF80E3D2C1A1 +:10731000833731F487E86BDF85E969DF8EE1CAC125 +:107320008536B9F4E0E0F0E093E085E09093570013 +:10733000E89507B600FCFDCF80935700E89507B6A7 +:1073400000FCFDCFE058FF4FA0E7E030FA0771F7EF +:10735000A2CF823739F4E1E0F0E089E08093570072 +:107360008491A8C1863439F4E0E0F0E089E08093AC +:10737000570084919FC18E3439F4E3E0F0E089E056 +:1073800080935700849196C1813539F4E2E0F0E0B2 +:1073900089E08093570084918DC1823631F489E56C +:1073A00026DF80E024DF80E885C1823419F087364B +:1073B00009F0E5C01092AD011092AC0100DF082F7A +:1073C000FEDEF82EFCDE682E8554823008F071C196 +:1073D000902F80E0CF2DD0E0C82BD92B10926F00DA +:1073E000173609F04BC081E180935700E895DD2402 +:1073F000CC24C3943FC0E090AE01F090AF01009167 +:10740000B0011091B101B6E46B16D9F4ED2DF0E0A6 +:10741000EE29FF29E4918E2FEADEDD2081F082E063 +:1074200090E0A0E0B0E0E80EF91E0A1F1B1FE092FA +:10743000AE01F092AF010093B0011093B101DC24D2 +:1074400018C0D801C701B695A7959795879558D5C7 +:10745000CEDE82E090E0A0E0B0E0E80EF91E0A1F68 +:107460001B1FE092AE01F092AF010093B0011093A8 +:10747000B1012197209709F0BECF7DC08090AE0169 +:107480009090AF01A090B001B090B10196E4691660 +:1074900009F05DC083E0F40180935700E89507B6DA +:1074A00000FCFDCF54C0F6E46F1661F5772031F192 +:1074B000E090AE01F090AF010091B0011091B101E8 +:1074C0007EDED82ECC24852D90E08C299D29F701D5 +:1074D0000C0140925700E895112482E090E0A0E072 +:1074E000B0E0E80EF91E0A1F1B1FE092AE01F092F9 +:1074F000AF010093B0011093B10102C060DE582EBD +:10750000742423C0E090AE01F090AF010091B0016F +:107510001091B10116950795F794E79450DE682F06 +:10752000C701F6D48091AE019091AF01A091B00156 +:10753000B091B1010296A11DB11D8093AE0190934F +:10754000AF01A093B001B093B101219704C05524BD +:10755000772444244394209709F0A5CF96E4691634 +:1075600041F485E0F40180935700E89507B600FCEC +:10757000FDCF8DE03CDE82E080936F009CC08334C1 +:1075800071F40091AE011091AF0119DE90E021E09D +:10759000F8010C0120935700E89511247CCE833626 +:1075A00019F5E090AE01F090AF010091B00110919B +:1075B000B10105DEF701E16090E021E00C012093CC +:1075C0005700E895112482E090E0A0E0B0E0E80EDA +:1075D000F91E0A1F1B1FE092AE01F092AF0100934B +:1075E000B0011093B10157CE8D3661F4E091AE0138 +:1075F000F091AF0185E080935700E89507B600FC55 +:10760000FDCF49CE823551F4E091AE01F091AF014A +:1076100005911491812FEBDD802F4CC0843421F52E +:10762000E090AE01F090AF010091B0011091B10176 +:1076300016950795F794E794C2DD682FC70168D4C3 +:107640008091AE019091AF01A091B001B091B101D4 +:107650000296A11DB11D8093AE019093AF01A0933E +:10766000B001B093B10117CE843609F5E090AE01B8 +:10767000F090AF010091B0011091B101D801C701A4 +:10768000B695A795979587953BD4B1DD82E090E0BC +:10769000A0E0B0E0E80EF91E0A1F1B1FE092AE0149 +:1076A000F092AF010093B0011093B10104C08B318F +:1076B00011F08FE39CDD83E08093E9009091E80076 +:1076C0008091E8008E778093E80095FF04C010C099 +:1076D0008EB38823C9F08091E80080FFF9CF8091B4 +:1076E000E8008E778093E80003C08EB3882361F0B2 +:1076F0008091E80080FFF9CF84E08093E9008091D9 +:10770000E8008B778093E800DF91CF911F910F9174 +:10771000FF90EF90DF90CF90BF90AF909F908F90B1 +:107720007F906F905F904F9008959091B601892F50 +:107730008F77813249F58091B7018032A1F0813293 +:1077400019F5913A09F58091E800877F8093E80068 +:107750008DE091E067E070E00AD28091E8008B77DD +:107760008093E8000895913279F48091E800877F52 +:107770008093E8008DE091E067E070E05CD280915A +:10778000E8008E778093E800089582E061EC42E0A3 +:10779000B4D083E061E842E1B0D084E060E842E147 +:1077A000ACC084B7877F84BF88E10FB6F89480931C +:1077B0006000109260000FBE20E880E090E00FB6FD +:1077C000F89420936100809361000FBE81E085BF33 +:1077D00092E095BF3F9A209A559AE1E6F0E0208327 +:1077E000108247985D9A289A109289008AEF8093B8 +:1077F000880090936F0083E080938100EFC01F9317 +:1078000088E10FB6F89480936000109260000FBE7C +:1078100084B714BE182F10FF08C0E0E0F0E0859197 +:1078200094918F5F9F4F09F05DDC2091000A3091A9 +:10783000010A1092010A1092000A13FF0FC08091F2 +:10784000090190910A012817390741F0E0E0F0E0C2 +:10785000859194918F5F9F4F09F044DCA2DF78946B +:107860001092AD011092AC010CC0E0DC37D38091D6 +:10787000AC019091AD0181549F4110F01092140120 +:1078800043DC80911401882381F78091E0008160BE +:107890008093E00027DC80E090E01F910895FA01DA +:1078A000923049F0933061F09130F9F485E191E044 +:1078B00022E130E01EC087E291E02EE330E019C003 +:1078C000882329F485E691E024E030E012C081307D +:1078D00029F489E691E022E230E00BC0823029F4FD +:1078E0008DE891E028E130E004C080E090E020E005 +:1078F00030E091838083C90108958093E9008091ED +:10790000EB0081608093EB001092ED006093EC003F +:107910004093ED008091EE00881F8827881F08950E +:107920008091B60188238CF403C08EB38823B1F014 +:107930008091E80082FFF9CF8091E8008B778093F7 +:10794000E80008958EB3882349F08091E80080FF15 +:10795000F9CF8091E8008E778093E8000895EF9248 +:10796000FF920F931F9345D04CD008ED10E0F80123 +:1079700080818F77808380818068808380818F7D04 +:10798000808319BC1EBA1092B40180EEE82EF12C4F +:10799000F70180818B7F8083F80180818160808303 +:1079A00080E060E042E0A9DFE1EEF0E080818E7FE0 +:1079B0008083E2EEF0E08081816080838081886056 +:1079C0008083F70180818E7F8083F80180818061D0 +:1079D00080831F910F91FF90EF900895E7EDF0E005 +:1079E0008081816080838AE482BF81E08093B501D9 +:1079F000B6CFE8EDF0E080818E7F80831092E200C8 +:107A000008951092DA001092E10008951F920F92EB +:107A10000FB60F9211242F933F934F935F936F9361 +:107A20007F938F939F93AF93BF93EF93FF93809137 +:107A3000DA0080FF1BC08091D80080FF17C08091C2 +:107A4000DA008E7F8093DA008091D90080FF0BC02E +:107A500080E189BD82E189BD09B400FEFDCF81E0EE +:107A60008EBB3BD203C019BC1EBA37D28091E10055 +:107A700080FF17C08091E20080FF13C08091E20078 +:107A80008E7F8093E2008091E20080618093E2002B +:107A90008091D80080628093D80019BC85E08EBBAD +:107AA0001CD28091E10084FF2CC08091E20084FF11 +:107AB00028C080E189BD82E189BD09B400FEFDCF07 +:107AC0008091D8008F7D8093D8008091E1008F7ED7 +:107AD0008093E1008091E2008F7E8093E2008091AC +:107AE000E20081608093E2008091B401882331F448 +:107AF0008091E30087FD02C081E001C084E08EBB7D +:107B0000ECD18091E10083FF21C08091E20083FFEE +:107B10001DC08091E100877F8093E10082E08EBBF1 +:107B20001092B4018091E1008E7F8093E1008091FA +:107B3000E2008E7F8093E2008091E200806180937A +:107B4000E20080E060E042E0D8DEC7D1FF91EF9133 +:107B5000BF91AF919F918F917F916F915F914F9165 +:107B60003F912F910F900FBE0F901F9018959C0181 +:107B70004091BC015091BD014617570718F4F90117 +:107B800090E044C06115710511F0AB01F8CF809110 +:107B9000E8008E778093E80040E050E0F0CF8EB3AD +:107BA000882309F444C0853009F443C08091E8007B +:107BB00083FF02C081E008958091E80082FD31C01A +:107BC0008091E80080FF22C08091F3009091F20044 +:107BD000782F60E0292F30E0262B372B07C08191CA +:107BE0008093F100415050402F5F3F4F41155105A8 +:107BF00019F02830310598F390E02830310509F468 +:107C000091E08091E8008E778093E800411551055E +:107C100031F6992321F605C08EB3882341F08530D3 +:107C200041F08091E80082FFF7CF80E0089582E084 +:107C3000089583E008959C016115710529F48091F0 +:107C4000E8008B778093E800F90126C08EB3882383 +:107C500091F1853091F18091E80083FF02C081E0CD +:107C600008958091E80082FFF1CF06C08091F10075 +:107C700081936150704059F02091F3008091F2009F +:107C8000322F20E090E0822B932B892B79F7809183 +:107C9000E8008B778093E80061157105B9F605C09F +:107CA0008EB3882341F0853041F08091E80080FF59 +:107CB000F7CF80E0089582E0089583E008950F9360 +:107CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E0A3 +:107CD0008091F100819381E0EE3BF807C9F725DD43 +:107CE0008091E80083FFE4C08091B6019091B701D4 +:107CF000953009F46DC0963040F4913081F19130A7 +:107D000070F0933009F0D4C02AC0983009F4A3C0B1 +:107D1000993009F4B2C0963009F0CAC07CC08038EE +:107D200009F4C6C0823809F0C3C08091BA018770D7 +:107D30008093E9008091EB001092E9002091E80027 +:107D4000277F2093E80090E025E0969587952A9577 +:107D5000E1F781708093F1001092F10087C08823D1 +:107D600019F0823009F0A4C08F71823009F0A0C0F0 +:107D70008091B801882331F52091BA01277009F468 +:107D800097C02093E9008091EB0080FF1BC09330E7 +:107D900021F48091EB00806213C08091EB00806140 +:107DA0008093EB0081E090E002C0880F991F2A9534 +:107DB000E2F78093EA001092EA008091EB0088607D +:107DC0008093EB001092E9008091E800877F51C01A +:107DD000882309F06DC01091B8011F770FB7F89490 +:107DE0008091E800877F8093E8009ADD8091E80029 +:107DF00080FFFCCF8091E3008078812B8093E300AB +:107E000080688093E300112311F482E001C083E0D5 +:107E10008EBB0FBF4DC08058823008F049C08091A2 +:107E2000B8019091B9016091BA01AE014F5F5F4F07 +:107E300036DDBC01009709F43BC08091E800877FE4 +:107E40008093E80089819A8192DE8091E8008B77A7 +:107E50008093E8002DC0803859F58091E800877F35 +:107E60008093E8008091B4018093F1008091E80054 +:107E70008E778093E80054DD1BC08823C9F490916D +:107E8000B8019230A8F48091E800877F8093E800E1 +:107E90009093B40145DD8091B401882331F4809141 +:107EA000E30087FD02C081E001C084E08EBB6DDC91 +:107EB0008091E80083FF0AC08091EB00806280938C +:107EC000EB008091E800877F8093E8000F900F908F +:107ED000CF91DF911F910F91089508951F938EB355 +:107EE000882361F01091E9001092E9008091E80088 +:107EF00083FF01C0E4DE17701093E9001F9108951D +:107F0000F999FECF92BD81BDF89A992780B5089561 +:107F1000262FF999FECF1FBA92BD81BD20BD0FB6A5 +:107F2000F894FA9AF99A0FBE01960895F894FFCF43 +:107F30004341544552494E41007777000A00000002 +:107F40000000000801120110010200000841233561 +:107F50000001000201000109023E0002010080321E +:107F6000090400000102020100052400100104249C +:107F700002040524060001070582030800FF090426 +:107F80000100020A000000070504021000010705B5 +:107F900083021000010403090422034100720064FB +:107FA00000750069006E006F0020004D00690063DD +:107FB0000072006F00200020002000000018034124 +:107FC0000072006400750069006E006F0020004CB4 +:087FD000004C0043000000001A +:040000030000700089 +:00000001FF diff --git a/bootloaders/caterina/Caterina.hex b/bootloaders/caterina/Caterina.hex deleted file mode 100644 index b3e1ed6..0000000 --- a/bootloaders/caterina/Caterina.hex +++ /dev/null @@ -1,256 +0,0 @@ -:1070000055C000006EC000006CC000006AC00000E7 -:1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000F1C400005AC0000053 -:1070300058C0000056C0000054C0000052C00000FC -:1070400050C0000078C000004CC000004AC00000E2 -:1070500048C0000046C0000044C0000042C000001C -:1070600040C000003EC000003CC000003AC000002C -:1070700038C0000036C0000034C0000032C000003C -:1070800030C000002EC000002CC000002AC000004C -:1070900028C0000026C0000024C0000022C000005C -:1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0E36A -:1070C000FFE702C005900D92A83AB107D9F711E089 -:1070D000A8EAB1E001C01D92AE3BB107E1F78FD342 -:1070E00025C78ECFF89410926F00109281001092F5 -:1070F00085001092840081E085BF15BE47985D9A97 -:10710000289A0C94000008952091B2013091B301A7 -:107110002F5F3F4F3093B3012093B201932F37FF7E -:1071200003C08EEF831B982F990F921710F4479886 -:107130000895479A08951F920F920FB60F92112447 -:107140002F938F939F93EF93FF931092850010924C -:1071500084008091A8019091A901009741F00197C6 -:107160009093A9018093A801892B09F45D9A8091DD -:10717000AA019091AB01009741F001979093AB0168 -:107180008093AA01892B09F4289AE0E0F0E0859128 -:1071900094918F5F9F4F49F08091AC019091AD0128 -:1071A00001969093AD018093AC01FF91EF919F9177 -:1071B0008F912F910F900FBE0F901F90189584E024 -:1071C0008093E9000DC08091E8008B778093E80000 -:1071D00003C08EB3882351F08091E80082FFF9CF7D -:1071E0008091E80085FFEFCF8091F1000895982FFE -:1071F00083E08093E9008091E80085FD0DC08091D7 -:10720000E8008E778093E80003C08EB3882369F08E -:107210008091E80080FFF9CF9093F1005D9884E6BB -:1072200090E09093A9018093A80108954F925F92F6 -:107230006F927F928F929F92AF92BF92CF92DF9286 -:10724000EF92FF920F931F93CF93DF9384E080938D -:10725000E9008091E80082FF57C2289884E690E018 -:107260009093AB018093AA01AADF182F853481F493 -:107270008CE49DE19093AD018093AC0107B600FCD6 -:10728000FDCFF999FECF81E180935700E89503C0C7 -:10729000843519F494DF8DE00DC28C34E1F3803530 -:1072A000D1F3843721F484E4A2DF80E003C2813685 -:1072B00011F489E5FFC18134B1F481DF182F7FDF3C -:1072C00090E0880F991FAA2797FDA095BA2F312F1C -:1072D000330F20E0442737FD4095542F822B932B0A -:1072E000A42BB52BB8C1803711F483E5E3C18335F6 -:1072F00049F4C0E0D1E089917ADF21E0C730D207BC -:10730000D1F7D9C1863521F481E371DF80E3D2C1A1 -:10731000833731F487E86BDF85E969DF8EE1CAC125 -:107320008536B9F4E0E0F0E093E085E09093570013 -:10733000E89507B600FCFDCF80935700E89507B6A7 -:1073400000FCFDCFE058FF4FA0E7E030FA0771F7EF -:10735000A2CF823739F4E1E0F0E089E08093570072 -:107360008491A8C1863439F4E0E0F0E089E08093AC -:10737000570084919FC18E3439F4E3E0F0E089E056 -:1073800080935700849196C1813539F4E2E0F0E0B2 -:1073900089E08093570084918DC1823631F489E56C -:1073A00026DF80E024DF80E885C1823419F087364B -:1073B00009F0E5C01092AD011092AC0100DF082F7A -:1073C000FEDEF82EFCDE682E8554823008F071C196 -:1073D000902F80E0CF2DD0E0C82BD92B10926F00DA -:1073E000173609F04BC081E180935700E895DD2402 -:1073F000CC24C3943FC0E090AE01F090AF01009167 -:10740000B0011091B101B6E46B16D9F4ED2DF0E0A6 -:10741000EE29FF29E4918E2FEADEDD2081F082E063 -:1074200090E0A0E0B0E0E80EF91E0A1F1B1FE092FA -:10743000AE01F092AF010093B0011093B101DC24D2 -:1074400018C0D801C701B695A7959795879558D5C7 -:10745000CEDE82E090E0A0E0B0E0E80EF91E0A1F68 -:107460001B1FE092AE01F092AF010093B0011093A8 -:10747000B1012197209709F0BECF7DC08090AE0169 -:107480009090AF01A090B001B090B10196E4691660 -:1074900009F05DC083E0F40180935700E89507B6DA -:1074A00000FCFDCF54C0F6E46F1661F5772031F192 -:1074B000E090AE01F090AF010091B0011091B101E8 -:1074C0007EDED82ECC24852D90E08C299D29F701D5 -:1074D0000C0140925700E895112482E090E0A0E072 -:1074E000B0E0E80EF91E0A1F1B1FE092AE01F092F9 -:1074F000AF010093B0011093B10102C060DE582EBD -:10750000742423C0E090AE01F090AF010091B0016F -:107510001091B10116950795F794E79450DE682F06 -:10752000C701F6D48091AE019091AF01A091B00156 -:10753000B091B1010296A11DB11D8093AE0190934F -:10754000AF01A093B001B093B101219704C05524BD -:10755000772444244394209709F0A5CF96E4691634 -:1075600041F485E0F40180935700E89507B600FCEC -:10757000FDCF8DE03CDE82E080936F009CC08334C1 -:1075800071F40091AE011091AF0119DE90E021E09D -:10759000F8010C0120935700E89511247CCE833626 -:1075A00019F5E090AE01F090AF010091B00110919B -:1075B000B10105DEF701E16090E021E00C012093CC -:1075C0005700E895112482E090E0A0E0B0E0E80EDA -:1075D000F91E0A1F1B1FE092AE01F092AF0100934B -:1075E000B0011093B10157CE8D3661F4E091AE0138 -:1075F000F091AF0185E080935700E89507B600FC55 -:10760000FDCF49CE823551F4E091AE01F091AF014A -:1076100005911491812FEBDD802F4CC0843421F52E -:10762000E090AE01F090AF010091B0011091B10176 -:1076300016950795F794E794C2DD682FC70168D4C3 -:107640008091AE019091AF01A091B001B091B101D4 -:107650000296A11DB11D8093AE019093AF01A0933E -:10766000B001B093B10117CE843609F5E090AE01B8 -:10767000F090AF010091B0011091B101D801C701A4 -:10768000B695A795979587953BD4B1DD82E090E0BC -:10769000A0E0B0E0E80EF91E0A1F1B1FE092AE0149 -:1076A000F092AF010093B0011093B10104C08B318F -:1076B00011F08FE39CDD83E08093E9009091E80076 -:1076C0008091E8008E778093E80095FF04C010C099 -:1076D0008EB38823C9F08091E80080FFF9CF8091B4 -:1076E000E8008E778093E80003C08EB3882361F0B2 -:1076F0008091E80080FFF9CF84E08093E9008091D9 -:10770000E8008B778093E800DF91CF911F910F9174 -:10771000FF90EF90DF90CF90BF90AF909F908F90B1 -:107720007F906F905F904F9008959091B601892F50 -:107730008F77813249F58091B7018032A1F0813293 -:1077400019F5913A09F58091E800877F8093E80068 -:107750008DE091E067E070E00AD28091E8008B77DD -:107760008093E8000895913279F48091E800877F52 -:107770008093E8008DE091E067E070E05CD280915A -:10778000E8008E778093E800089582E061EC42E0A3 -:10779000B4D083E061E842E1B0D084E060E842E147 -:1077A000ACC084B7877F84BF88E10FB6F89480931C -:1077B0006000109260000FBE20E880E090E00FB6FD -:1077C000F89420936100809361000FBE81E085BF33 -:1077D00092E095BF3F9A209A559AE1E6F0E0208327 -:1077E000108247985D9A289A109289008AEF8093B8 -:1077F000880090936F0083E080938100EFC01F9317 -:1078000088E10FB6F89480936000109260000FBE7C -:1078100084B714BE182F10FF08C0E0E0F0E0859197 -:1078200094918F5F9F4F09F05DDC2091000A3091A9 -:10783000010A1092010A1092000A13FF0FC08091F2 -:10784000090190910A012817390741F0E0E0F0E0C2 -:10785000859194918F5F9F4F09F044DCA2DF78946B -:107860001092AD011092AC010CC0E0DC37D38091D6 -:10787000AC019091AD0181549F4110F01092140120 -:1078800043DC80911401882381F78091E0008160BE -:107890008093E00027DC80E090E01F910895FA01DA -:1078A000923049F0933061F09130F9F485E191E044 -:1078B00022E130E01EC087E291E02EE330E019C003 -:1078C000882329F485E691E024E030E012C081307D -:1078D00029F489E691E022E230E00BC0823029F4FD -:1078E0008DE891E028E130E004C080E090E020E005 -:1078F00030E091838083C90108958093E9008091ED -:10790000EB0081608093EB001092ED006093EC003F -:107910004093ED008091EE00881F8827881F08950E -:107920008091B60188238CF403C08EB38823B1F014 -:107930008091E80082FFF9CF8091E8008B778093F7 -:10794000E80008958EB3882349F08091E80080FF15 -:10795000F9CF8091E8008E778093E8000895EF9248 -:10796000FF920F931F9345D04CD008ED10E0F80123 -:1079700080818F77808380818068808380818F7D04 -:10798000808319BC1EBA1092B40180EEE82EF12C4F -:10799000F70180818B7F8083F80180818160808303 -:1079A00080E060E042E0A9DFE1EEF0E080818E7FE0 -:1079B0008083E2EEF0E08081816080838081886056 -:1079C0008083F70180818E7F8083F80180818061D0 -:1079D00080831F910F91FF90EF900895E7EDF0E005 -:1079E0008081816080838AE482BF81E08093B501D9 -:1079F000B6CFE8EDF0E080818E7F80831092E200C8 -:107A000008951092DA001092E10008951F920F92EB -:107A10000FB60F9211242F933F934F935F936F9361 -:107A20007F938F939F93AF93BF93EF93FF93809137 -:107A3000DA0080FF1BC08091D80080FF17C08091C2 -:107A4000DA008E7F8093DA008091D90080FF0BC02E -:107A500080E189BD82E189BD09B400FEFDCF81E0EE -:107A60008EBB3BD203C019BC1EBA37D28091E10055 -:107A700080FF17C08091E20080FF13C08091E20078 -:107A80008E7F8093E2008091E20080618093E2002B -:107A90008091D80080628093D80019BC85E08EBBAD -:107AA0001CD28091E10084FF2CC08091E20084FF11 -:107AB00028C080E189BD82E189BD09B400FEFDCF07 -:107AC0008091D8008F7D8093D8008091E1008F7ED7 -:107AD0008093E1008091E2008F7E8093E2008091AC -:107AE000E20081608093E2008091B401882331F448 -:107AF0008091E30087FD02C081E001C084E08EBB7D -:107B0000ECD18091E10083FF21C08091E20083FFEE -:107B10001DC08091E100877F8093E10082E08EBBF1 -:107B20001092B4018091E1008E7F8093E1008091FA -:107B3000E2008E7F8093E2008091E200806180937A -:107B4000E20080E060E042E0D8DEC7D1FF91EF9133 -:107B5000BF91AF919F918F917F916F915F914F9165 -:107B60003F912F910F900FBE0F901F9018959C0181 -:107B70004091BC015091BD014617570718F4F90117 -:107B800090E044C06115710511F0AB01F8CF809110 -:107B9000E8008E778093E80040E050E0F0CF8EB3AD -:107BA000882309F444C0853009F443C08091E8007B -:107BB00083FF02C081E008958091E80082FD31C01A -:107BC0008091E80080FF22C08091F3009091F20044 -:107BD000782F60E0292F30E0262B372B07C08191CA -:107BE0008093F100415050402F5F3F4F41155105A8 -:107BF00019F02830310598F390E02830310509F468 -:107C000091E08091E8008E778093E800411551055E -:107C100031F6992321F605C08EB3882341F08530D3 -:107C200041F08091E80082FFF7CF80E0089582E084 -:107C3000089583E008959C016115710529F48091F0 -:107C4000E8008B778093E800F90126C08EB3882383 -:107C500091F1853091F18091E80083FF02C081E0CD -:107C600008958091E80082FFF1CF06C08091F10075 -:107C700081936150704059F02091F3008091F2009F -:107C8000322F20E090E0822B932B892B79F7809183 -:107C9000E8008B778093E80061157105B9F605C09F -:107CA0008EB3882341F0853041F08091E80080FF59 -:107CB000F7CF80E0089582E0089583E008950F9360 -:107CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E0A3 -:107CD0008091F100819381E0EE3BF807C9F725DD43 -:107CE0008091E80083FFE4C08091B6019091B701D4 -:107CF000953009F46DC0963040F4913081F19130A7 -:107D000070F0933009F0D4C02AC0983009F4A3C0B1 -:107D1000993009F4B2C0963009F0CAC07CC08038EE -:107D200009F4C6C0823809F0C3C08091BA018770D7 -:107D30008093E9008091EB001092E9002091E80027 -:107D4000277F2093E80090E025E0969587952A9577 -:107D5000E1F781708093F1001092F10087C08823D1 -:107D600019F0823009F0A4C08F71823009F0A0C0F0 -:107D70008091B801882331F52091BA01277009F468 -:107D800097C02093E9008091EB0080FF1BC09330E7 -:107D900021F48091EB00806213C08091EB00806140 -:107DA0008093EB0081E090E002C0880F991F2A9534 -:107DB000E2F78093EA001092EA008091EB0088607D -:107DC0008093EB001092E9008091E800877F51C01A -:107DD000882309F06DC01091B8011F770FB7F89490 -:107DE0008091E800877F8093E8009ADD8091E80029 -:107DF00080FFFCCF8091E3008078812B8093E300AB -:107E000080688093E300112311F482E001C083E0D5 -:107E10008EBB0FBF4DC08058823008F049C08091A2 -:107E2000B8019091B9016091BA01AE014F5F5F4F07 -:107E300036DDBC01009709F43BC08091E800877FE4 -:107E40008093E80089819A8192DE8091E8008B77A7 -:107E50008093E8002DC0803859F58091E800877F35 -:107E60008093E8008091B4018093F1008091E80054 -:107E70008E778093E80054DD1BC08823C9F490916D -:107E8000B8019230A8F48091E800877F8093E800E1 -:107E90009093B40145DD8091B401882331F4809141 -:107EA000E30087FD02C081E001C084E08EBB6DDC91 -:107EB0008091E80083FF0AC08091EB00806280938C -:107EC000EB008091E800877F8093E8000F900F908F -:107ED000CF91DF911F910F91089508951F938EB355 -:107EE000882361F01091E9001092E9008091E80088 -:107EF00083FF01C0E4DE17701093E9001F9108951D -:107F0000F999FECF92BD81BDF89A992780B5089561 -:107F1000262FF999FECF1FBA92BD81BD20BD0FB6A5 -:107F2000F894FA9AF99A0FBE01960895F894FFCF43 -:107F30004341544552494E41007777000A00000002 -:107F40000000000801120110010200000841230195 -:107F50000701000201000109023E00020100803217 -:107F6000090400000102020100052400100104249C -:107F700002040524060001070582030800FF090426 -:107F80000100020A000000070504021000010705B5 -:107F900083021000010403090422034100720064FB -:107FA00000750069006E006F0020004C0065006FD6 -:107FB000006E006100720064006F00000018034151 -:107FC0000072006400750069006E006F0020004CB4 -:087FD000004C0043000000001A -:040000030000700089 -:00000001FF diff --git a/bootloaders/caterina/Descriptors.c b/bootloaders/caterina/Descriptors.c index f1756e2..824e0dd 100755 --- a/bootloaders/caterina/Descriptors.c +++ b/bootloaders/caterina/Descriptors.c @@ -53,8 +53,8 @@ const USB_Descriptor_Device_t DeviceDescriptor = .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - .VendorID = 0x2341, - .ProductID = 0x0701, + .VendorID = DEVICE_VID, + .ProductID = DEVICE_PID, .ReleaseNumber = VERSION_BCD(00.01), .ManufacturerStrIndex = 0x02, @@ -193,7 +193,13 @@ const USB_Descriptor_String_t ProductString = { .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, - .UnicodeString = L"Arduino Leonardo" + #if DEVICE_PID == 0x0034 + .UnicodeString = L"Arduino Leonardo" + #elif DEVICE_PID == 0x0035 + .UnicodeString = L"Arduino Micro " + #else + .UnicodeString = L"USB IO board " + #endif }; /* const USB_Descriptor_String_t SerialNumString = diff --git a/bootloaders/caterina/Makefile b/bootloaders/caterina/Makefile index ef583bc..3ec7b14 100755 --- a/bootloaders/caterina/Makefile +++ b/bootloaders/caterina/Makefile @@ -46,6 +46,17 @@ # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- +# USB vendor ID (VID) +# official Arduino LLC VID +VID = 0x2341 + + +# USB product ID (PID) +# official Leonardo PID +#PID = 0x0034 +# official Micro PID +PID = 0x0035 + # MCU name MCU = atmega32u4 @@ -193,6 +204,8 @@ CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += -DF_USB=$(F_USB)UL CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CDEFS += -DDEVICE_VID=$(VID)UL +CDEFS += -DDEVICE_PID=$(PID)UL CDEFS += $(LUFA_OPTS) -- cgit v1.2.3-18-g5258 From ec83f55b626f3b9b5da4a0782b8fa81ca72a8933 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 9 Apr 2012 08:06:35 -0400 Subject: sketch USB VID and PID values are passed in from boards.txt at compile time now. changed sketch PIDs to final values. also uncommented Micro section in boards.txt --- boards.txt | 37 +++++++++++++++++++++---------------- cores/arduino/USBCore.cpp | 4 ++-- cores/arduino/USBDesc.h | 4 ---- variants/leonardo/pins_arduino.h | 2 -- variants/micro/pins_arduino.h | 2 -- 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/boards.txt b/boards.txt index 710ae27..3a94d26 100644 --- a/boards.txt +++ b/boards.txt @@ -155,31 +155,36 @@ leonardo.bootloader.low_fuses=0xff leonardo.bootloader.high_fuses=0xd8 leonardo.bootloader.extended_fuses=0xcb leonardo.bootloader.path=caterina -leonardo.bootloader.file=Caterina.hex +leonardo.bootloader.file=Caterina-Leonardo.hex leonardo.bootloader.unlock_bits=0x3F leonardo.bootloader.lock_bits=0x2F leonardo.build.mcu=atmega32u4 leonardo.build.f_cpu=16000000L +leonardo.build.vid=0x2341 +leonardo.build.pid=0x8034 leonardo.build.core=arduino leonardo.build.variant=leonardo ############################################################## -#micro.name=Arduino Micro -#micro.upload.protocol=arduino -#micro.upload.maximum_size=30720 -#micro.upload.speed=1200 -#micro.bootloader.low_fuses=0xde -#micro.bootloader.high_fuses=0xda -#micro.bootloader.extended_fuses=0xcb -#micro.bootloader.path=caterina -#micro.bootloader.file=Caterina-Micro.hex -#micro.bootloader.unlock_bits=0x3F -#micro.bootloader.lock_bits=0x2F -#micro.build.mcu=atmega32u4 -#micro.build.f_cpu=16000000L -#micro.build.core=arduino -#micro.build.variant=micro +micro.name=Arduino Micro +micro.upload.protocol=avr109 +micro.upload.maximum_size=28672 +micro.upload.speed=57600 +micro.upload.disable_flushing=true +micro.bootloader.low_fuses=0xff +micro.bootloader.high_fuses=0xd8 +micro.bootloader.extended_fuses=0xcb +micro.bootloader.path=caterina +micro.bootloader.file=Caterina-Micro.hex +micro.bootloader.unlock_bits=0x3F +micro.bootloader.lock_bits=0x2F +micro.build.mcu=atmega32u4 +micro.build.f_cpu=16000000L +micro.build.vid=0x2341 +micro.build.pid=0x8035 +micro.build.core=arduino +micro.build.variant=micro ############################################################## diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index c360d26..d1aeace 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -51,9 +51,9 @@ const u16 STRING_LANGUAGE[2] = { const u16 STRING_IPRODUCT[17] = { (3<<8) | (2+2*16), -#if USB_PID == USB_PID_LEONARDO +#if USB_PID == 0x8034 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o' -#elif USB_PID == USB_PID_MICRO +#elif USB_PID == 0x8035 'A','r','d','u','i','n','o',' ','M','i','c','r','o',' ',' ',' ' #endif }; diff --git a/cores/arduino/USBDesc.h b/cores/arduino/USBDesc.h index 5cd90ad..900713e 100644 --- a/cores/arduino/USBDesc.h +++ b/cores/arduino/USBDesc.h @@ -60,8 +60,4 @@ #define IMANUFACTURER 1 #define IPRODUCT 2 -#define USB_PID_LEONARDO 0x0801 -#define USB_PID_MICRO 0x0035 -#define USB_VID 0x2341 // arduino LLC vid -#define USB_PID ARDUINO_MODEL_USB_PID diff --git a/variants/leonardo/pins_arduino.h b/variants/leonardo/pins_arduino.h index 753aa93..ff9e4f9 100644 --- a/variants/leonardo/pins_arduino.h +++ b/variants/leonardo/pins_arduino.h @@ -27,8 +27,6 @@ #include -#define ARDUINO_MODEL_USB_PID 0x0801 - #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) #define TXLED0 PORTD |= (1<<5) #define TXLED1 PORTD &= ~(1<<5) diff --git a/variants/micro/pins_arduino.h b/variants/micro/pins_arduino.h index c9f25eb..06a5858 100644 --- a/variants/micro/pins_arduino.h +++ b/variants/micro/pins_arduino.h @@ -23,5 +23,3 @@ */ #include "../leonardo/pins_arduino.h" -#undef ARDUINO_MODEL_USB_PID -#define ARDUINO_MODEL_USB_PID 0x0035 \ No newline at end of file -- cgit v1.2.3-18-g5258 From f9a4a4362d6457adb598ca7f52e409df9defbee3 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 9 Apr 2012 08:08:34 -0400 Subject: Micro and Leonardo bootloaders for distribution are now merged with Blink sketch --- bootloaders/caterina/Caterina-Leonardo.hex | 1280 ++++++++++++++++++++++------ bootloaders/caterina/Caterina-Micro.hex | 1280 ++++++++++++++++++++++------ 2 files changed, 2048 insertions(+), 512 deletions(-) diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex index d7873af..40a19c6 100644 --- a/bootloaders/caterina/Caterina-Leonardo.hex +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -1,256 +1,1024 @@ -:1070000055C000006EC000006CC000006AC00000E7 -:1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000F1C400005AC0000053 -:1070300058C0000056C0000054C0000052C00000FC -:1070400050C0000078C000004CC000004AC00000E2 -:1070500048C0000046C0000044C0000042C000001C -:1070600040C000003EC000003CC000003AC000002C -:1070700038C0000036C0000034C0000032C000003C -:1070800030C000002EC000002CC000002AC000004C -:1070900028C0000026C0000024C0000022C000005C -:1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0E36A -:1070C000FFE702C005900D92A83AB107D9F711E089 -:1070D000A8EAB1E001C01D92AE3BB107E1F78FD342 -:1070E00025C78ECFF89410926F00109281001092F5 -:1070F00085001092840081E085BF15BE47985D9A97 -:10710000289A0C94000008952091B2013091B301A7 -:107110002F5F3F4F3093B3012093B201932F37FF7E -:1071200003C08EEF831B982F990F921710F4479886 -:107130000895479A08951F920F920FB60F92112447 -:107140002F938F939F93EF93FF931092850010924C -:1071500084008091A8019091A901009741F00197C6 -:107160009093A9018093A801892B09F45D9A8091DD -:10717000AA019091AB01009741F001979093AB0168 -:107180008093AA01892B09F4289AE0E0F0E0859128 -:1071900094918F5F9F4F49F08091AC019091AD0128 -:1071A00001969093AD018093AC01FF91EF919F9177 -:1071B0008F912F910F900FBE0F901F90189584E024 -:1071C0008093E9000DC08091E8008B778093E80000 -:1071D00003C08EB3882351F08091E80082FFF9CF7D -:1071E0008091E80085FFEFCF8091F1000895982FFE -:1071F00083E08093E9008091E80085FD0DC08091D7 -:10720000E8008E778093E80003C08EB3882369F08E -:107210008091E80080FFF9CF9093F1005D9884E6BB -:1072200090E09093A9018093A80108954F925F92F6 -:107230006F927F928F929F92AF92BF92CF92DF9286 -:10724000EF92FF920F931F93CF93DF9384E080938D -:10725000E9008091E80082FF57C2289884E690E018 -:107260009093AB018093AA01AADF182F853481F493 -:107270008CE49DE19093AD018093AC0107B600FCD6 -:10728000FDCFF999FECF81E180935700E89503C0C7 -:10729000843519F494DF8DE00DC28C34E1F3803530 -:1072A000D1F3843721F484E4A2DF80E003C2813685 -:1072B00011F489E5FFC18134B1F481DF182F7FDF3C -:1072C00090E0880F991FAA2797FDA095BA2F312F1C -:1072D000330F20E0442737FD4095542F822B932B0A -:1072E000A42BB52BB8C1803711F483E5E3C18335F6 -:1072F00049F4C0E0D1E089917ADF21E0C730D207BC -:10730000D1F7D9C1863521F481E371DF80E3D2C1A1 -:10731000833731F487E86BDF85E969DF8EE1CAC125 -:107320008536B9F4E0E0F0E093E085E09093570013 -:10733000E89507B600FCFDCF80935700E89507B6A7 -:1073400000FCFDCFE058FF4FA0E7E030FA0771F7EF -:10735000A2CF823739F4E1E0F0E089E08093570072 -:107360008491A8C1863439F4E0E0F0E089E08093AC -:10737000570084919FC18E3439F4E3E0F0E089E056 -:1073800080935700849196C1813539F4E2E0F0E0B2 -:1073900089E08093570084918DC1823631F489E56C -:1073A00026DF80E024DF80E885C1823419F087364B -:1073B00009F0E5C01092AD011092AC0100DF082F7A -:1073C000FEDEF82EFCDE682E8554823008F071C196 -:1073D000902F80E0CF2DD0E0C82BD92B10926F00DA -:1073E000173609F04BC081E180935700E895DD2402 -:1073F000CC24C3943FC0E090AE01F090AF01009167 -:10740000B0011091B101B6E46B16D9F4ED2DF0E0A6 -:10741000EE29FF29E4918E2FEADEDD2081F082E063 -:1074200090E0A0E0B0E0E80EF91E0A1F1B1FE092FA -:10743000AE01F092AF010093B0011093B101DC24D2 -:1074400018C0D801C701B695A7959795879558D5C7 -:10745000CEDE82E090E0A0E0B0E0E80EF91E0A1F68 -:107460001B1FE092AE01F092AF010093B0011093A8 -:10747000B1012197209709F0BECF7DC08090AE0169 -:107480009090AF01A090B001B090B10196E4691660 -:1074900009F05DC083E0F40180935700E89507B6DA -:1074A00000FCFDCF54C0F6E46F1661F5772031F192 -:1074B000E090AE01F090AF010091B0011091B101E8 -:1074C0007EDED82ECC24852D90E08C299D29F701D5 -:1074D0000C0140925700E895112482E090E0A0E072 -:1074E000B0E0E80EF91E0A1F1B1FE092AE01F092F9 -:1074F000AF010093B0011093B10102C060DE582EBD -:10750000742423C0E090AE01F090AF010091B0016F -:107510001091B10116950795F794E79450DE682F06 -:10752000C701F6D48091AE019091AF01A091B00156 -:10753000B091B1010296A11DB11D8093AE0190934F -:10754000AF01A093B001B093B101219704C05524BD -:10755000772444244394209709F0A5CF96E4691634 -:1075600041F485E0F40180935700E89507B600FCEC -:10757000FDCF8DE03CDE82E080936F009CC08334C1 -:1075800071F40091AE011091AF0119DE90E021E09D -:10759000F8010C0120935700E89511247CCE833626 -:1075A00019F5E090AE01F090AF010091B00110919B -:1075B000B10105DEF701E16090E021E00C012093CC -:1075C0005700E895112482E090E0A0E0B0E0E80EDA -:1075D000F91E0A1F1B1FE092AE01F092AF0100934B -:1075E000B0011093B10157CE8D3661F4E091AE0138 -:1075F000F091AF0185E080935700E89507B600FC55 -:10760000FDCF49CE823551F4E091AE01F091AF014A -:1076100005911491812FEBDD802F4CC0843421F52E -:10762000E090AE01F090AF010091B0011091B10176 -:1076300016950795F794E794C2DD682FC70168D4C3 -:107640008091AE019091AF01A091B001B091B101D4 -:107650000296A11DB11D8093AE019093AF01A0933E -:10766000B001B093B10117CE843609F5E090AE01B8 -:10767000F090AF010091B0011091B101D801C701A4 -:10768000B695A795979587953BD4B1DD82E090E0BC -:10769000A0E0B0E0E80EF91E0A1F1B1FE092AE0149 -:1076A000F092AF010093B0011093B10104C08B318F -:1076B00011F08FE39CDD83E08093E9009091E80076 -:1076C0008091E8008E778093E80095FF04C010C099 -:1076D0008EB38823C9F08091E80080FFF9CF8091B4 -:1076E000E8008E778093E80003C08EB3882361F0B2 -:1076F0008091E80080FFF9CF84E08093E9008091D9 -:10770000E8008B778093E800DF91CF911F910F9174 -:10771000FF90EF90DF90CF90BF90AF909F908F90B1 -:107720007F906F905F904F9008959091B601892F50 -:107730008F77813249F58091B7018032A1F0813293 -:1077400019F5913A09F58091E800877F8093E80068 -:107750008DE091E067E070E00AD28091E8008B77DD -:107760008093E8000895913279F48091E800877F52 -:107770008093E8008DE091E067E070E05CD280915A -:10778000E8008E778093E800089582E061EC42E0A3 -:10779000B4D083E061E842E1B0D084E060E842E147 -:1077A000ACC084B7877F84BF88E10FB6F89480931C -:1077B0006000109260000FBE20E880E090E00FB6FD -:1077C000F89420936100809361000FBE81E085BF33 -:1077D00092E095BF3F9A209A559AE1E6F0E0208327 -:1077E000108247985D9A289A109289008AEF8093B8 -:1077F000880090936F0083E080938100EFC01F9317 -:1078000088E10FB6F89480936000109260000FBE7C -:1078100084B714BE182F10FF08C0E0E0F0E0859197 -:1078200094918F5F9F4F09F05DDC2091000A3091A9 -:10783000010A1092010A1092000A13FF0FC08091F2 -:10784000090190910A012817390741F0E0E0F0E0C2 -:10785000859194918F5F9F4F09F044DCA2DF78946B -:107860001092AD011092AC010CC0E0DC37D38091D6 -:10787000AC019091AD0181549F4110F01092140120 -:1078800043DC80911401882381F78091E0008160BE -:107890008093E00027DC80E090E01F910895FA01DA -:1078A000923049F0933061F09130F9F485E191E044 -:1078B00022E130E01EC087E291E02EE330E019C003 -:1078C000882329F485E691E024E030E012C081307D -:1078D00029F489E691E022E230E00BC0823029F4FD -:1078E0008DE891E028E130E004C080E090E020E005 -:1078F00030E091838083C90108958093E9008091ED -:10790000EB0081608093EB001092ED006093EC003F -:107910004093ED008091EE00881F8827881F08950E -:107920008091B60188238CF403C08EB38823B1F014 -:107930008091E80082FFF9CF8091E8008B778093F7 -:10794000E80008958EB3882349F08091E80080FF15 -:10795000F9CF8091E8008E778093E8000895EF9248 -:10796000FF920F931F9345D04CD008ED10E0F80123 -:1079700080818F77808380818068808380818F7D04 -:10798000808319BC1EBA1092B40180EEE82EF12C4F -:10799000F70180818B7F8083F80180818160808303 -:1079A00080E060E042E0A9DFE1EEF0E080818E7FE0 -:1079B0008083E2EEF0E08081816080838081886056 -:1079C0008083F70180818E7F8083F80180818061D0 -:1079D00080831F910F91FF90EF900895E7EDF0E005 -:1079E0008081816080838AE482BF81E08093B501D9 -:1079F000B6CFE8EDF0E080818E7F80831092E200C8 -:107A000008951092DA001092E10008951F920F92EB -:107A10000FB60F9211242F933F934F935F936F9361 -:107A20007F938F939F93AF93BF93EF93FF93809137 -:107A3000DA0080FF1BC08091D80080FF17C08091C2 -:107A4000DA008E7F8093DA008091D90080FF0BC02E -:107A500080E189BD82E189BD09B400FEFDCF81E0EE -:107A60008EBB3BD203C019BC1EBA37D28091E10055 -:107A700080FF17C08091E20080FF13C08091E20078 -:107A80008E7F8093E2008091E20080618093E2002B -:107A90008091D80080628093D80019BC85E08EBBAD -:107AA0001CD28091E10084FF2CC08091E20084FF11 -:107AB00028C080E189BD82E189BD09B400FEFDCF07 -:107AC0008091D8008F7D8093D8008091E1008F7ED7 -:107AD0008093E1008091E2008F7E8093E2008091AC -:107AE000E20081608093E2008091B401882331F448 -:107AF0008091E30087FD02C081E001C084E08EBB7D -:107B0000ECD18091E10083FF21C08091E20083FFEE -:107B10001DC08091E100877F8093E10082E08EBBF1 -:107B20001092B4018091E1008E7F8093E1008091FA -:107B3000E2008E7F8093E2008091E200806180937A -:107B4000E20080E060E042E0D8DEC7D1FF91EF9133 -:107B5000BF91AF919F918F917F916F915F914F9165 -:107B60003F912F910F900FBE0F901F9018959C0181 -:107B70004091BC015091BD014617570718F4F90117 -:107B800090E044C06115710511F0AB01F8CF809110 -:107B9000E8008E778093E80040E050E0F0CF8EB3AD -:107BA000882309F444C0853009F443C08091E8007B -:107BB00083FF02C081E008958091E80082FD31C01A -:107BC0008091E80080FF22C08091F3009091F20044 -:107BD000782F60E0292F30E0262B372B07C08191CA -:107BE0008093F100415050402F5F3F4F41155105A8 -:107BF00019F02830310598F390E02830310509F468 -:107C000091E08091E8008E778093E800411551055E -:107C100031F6992321F605C08EB3882341F08530D3 -:107C200041F08091E80082FFF7CF80E0089582E084 -:107C3000089583E008959C016115710529F48091F0 -:107C4000E8008B778093E800F90126C08EB3882383 -:107C500091F1853091F18091E80083FF02C081E0CD -:107C600008958091E80082FFF1CF06C08091F10075 -:107C700081936150704059F02091F3008091F2009F -:107C8000322F20E090E0822B932B892B79F7809183 -:107C9000E8008B778093E80061157105B9F605C09F -:107CA0008EB3882341F0853041F08091E80080FF59 -:107CB000F7CF80E0089582E0089583E008950F9360 -:107CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E0A3 -:107CD0008091F100819381E0EE3BF807C9F725DD43 -:107CE0008091E80083FFE4C08091B6019091B701D4 -:107CF000953009F46DC0963040F4913081F19130A7 -:107D000070F0933009F0D4C02AC0983009F4A3C0B1 -:107D1000993009F4B2C0963009F0CAC07CC08038EE -:107D200009F4C6C0823809F0C3C08091BA018770D7 -:107D30008093E9008091EB001092E9002091E80027 -:107D4000277F2093E80090E025E0969587952A9577 -:107D5000E1F781708093F1001092F10087C08823D1 -:107D600019F0823009F0A4C08F71823009F0A0C0F0 -:107D70008091B801882331F52091BA01277009F468 -:107D800097C02093E9008091EB0080FF1BC09330E7 -:107D900021F48091EB00806213C08091EB00806140 -:107DA0008093EB0081E090E002C0880F991F2A9534 -:107DB000E2F78093EA001092EA008091EB0088607D -:107DC0008093EB001092E9008091E800877F51C01A -:107DD000882309F06DC01091B8011F770FB7F89490 -:107DE0008091E800877F8093E8009ADD8091E80029 -:107DF00080FFFCCF8091E3008078812B8093E300AB -:107E000080688093E300112311F482E001C083E0D5 -:107E10008EBB0FBF4DC08058823008F049C08091A2 -:107E2000B8019091B9016091BA01AE014F5F5F4F07 -:107E300036DDBC01009709F43BC08091E800877FE4 -:107E40008093E80089819A8192DE8091E8008B77A7 -:107E50008093E8002DC0803859F58091E800877F35 -:107E60008093E8008091B4018093F1008091E80054 -:107E70008E778093E80054DD1BC08823C9F490916D -:107E8000B8019230A8F48091E800877F8093E800E1 -:107E90009093B40145DD8091B401882331F4809141 -:107EA000E30087FD02C081E001C084E08EBB6DDC91 -:107EB0008091E80083FF0AC08091EB00806280938C -:107EC000EB008091E800877F8093E8000F900F908F -:107ED000CF91DF911F910F91089508951F938EB355 -:107EE000882361F01091E9001092E9008091E80088 -:107EF00083FF01C0E4DE17701093E9001F9108951D -:107F0000F999FECF92BD81BDF89A992780B5089561 -:107F1000262FF999FECF1FBA92BD81BD20BD0FB6A5 -:107F2000F894FA9AF99A0FBE01960895F894FFCF43 -:107F30004341544552494E41007777000A00000002 -:107F40000000000801120110010200000841233462 -:107F50000001000201000109023E0002010080321E -:107F6000090400000102020100052400100104249C -:107F700002040524060001070582030800FF090426 -:107F80000100020A000000070504021000010705B5 -:107F900083021000010403090422034100720064FB -:107FA00000750069006E006F0020004C0065006FD6 -:107FB000006E006100720064006F00000018034151 -:107FC0000072006400750069006E006F0020004CB4 -:087FD000004C0043000000001A -:040000030000700089 -:00000001FF +:200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 +:200020000C9496010C9496010C941B050C94A6050C9496010C9496010C9496010C9496016B +:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B201CC +:200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 +:200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 +:2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 +:2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D +:2000E0000202040302020202060606060606040402020204040802011040804010204080A8 +:200100004080080204018040201002011080102040400000000200080E0000030401000BB2 +:200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD +:200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC +:200160006E006F0020004C004C004300120100020000004041233480000101020001120122 +:200180000002020000404123348000010102000100C18081C1080B00020202010009040054 +:2001A000000102020000052400100105240101010424020605240600010705810310004094 +:2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 +:2001E000008501050919012903150025019503750181029501750581030501093009310943 +:20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D +:20022000019508810295017508810395067508150025650507190029658100C0090402004C +:2002400001030000000921010100012265000705840340000100000000000000002A2B2895 +:200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 +:20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 +:2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C +:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000057043907370811241FBE15 +:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EEF2E102C005900D92AA32B107D9F711E06B +:20030000AAE2B1E001C01D92AB39B107E1F712E0CCEDD2E004C02297FE010E946C09C63DE9 +:20032000D107C9F70E9491030C9470090C9400008DE061E00E945E0368EE73E080E090E00C +:200340000E94FA018DE060E00E945E0368EE73E080E090E00E94FA0108958DE061E00E944D +:20036000C10208951F920F920FB60F9211242F933F938F939F93AF93BF9380912E01909153 +:200380002F01A0913001B0913101309132010196A11DB11D232F2D5F2D3720F02D570196D4 +:2003A000A11DB11D2093320180932E0190932F01A0933001B093310180912A0190912B01D4 +:2003C000A0912C01B0912D010196A11DB11D80932A0190932B01A0932C01B0932D01BF917F +:2003E000AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F89480912A012F +:2004000090912B01A0912C01B0912D0166B5A89B05C06F3F19F00196A11DB11D7FBFBA2F9E +:20042000A92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC012DC0FA +:20044000FFB7F89480912A0190912B01A0912C01B0912D01E6B5A89B05C0EF3F19F0019693 +:20046000A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FBB1F70 +:20048000EA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105410538 +:2004A000510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816085BD64 +:2004C000EEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F0E005 +:2004E000808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0808178 +:2005000082608083808181608083E0E9F0E080818160808320EC30E0F90180818068808391 +:2005200080818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E0808184608083A0 +:20054000808182608083808181608083E3ECF0E0808181608083F9018081826080838C914F +:2005600081608C93EAE7F0E08081846080838081826080838081816080838081806880833B +:200580000895CF93DF93482F50E0CA018C509F4FFC0134914A525F4FFA018491882369F18D +:2005A00090E0880F991FFC01E455FF4FA591B491FC01E654FF4FC591D491662351F42FB789 +:2005C000F8948C91932F909589238C93888189230BC0623061F42FB7F8948C91932F9095E3 +:2005E00089238C938881832B88832FBF06C09FB7F8948C91832B8C939FBFDF91CF91089523 +:200600008730C1F1883080F48330F9F0843030F4813029F1823009F050C024C08430C9F0FA +:20062000863009F04AC022C08A3091F18B3030F4883031F1893009F040C026C08C3091F154 +:200640008C3060F18E30C9F533C0809180008F7703C0809180008F7D80938000089584B5BE +:200660008F7702C084B58F7D84BD08958091B0008F7703C08091B0008F7D8093B0000895D8 +:20068000809190008F7707C0809190008F7D03C080919000877F8093900008958091C000C4 +:2006A0008F7703C08091C0008F7D8093C00008958091C200877F8093C2000895FF920F93A6 +:2006C0001F93F62E482F50E0CA018E5E9E4FFC012491CA018C509F4FFC0114914A525F4FC6 +:2006E000FA0104910023C9F0222319F0822F0E940003E02FF0E0EE0FFF1FE654FF4FA59132 +:20070000B4919FB7F894FF2021F48C911095812302C08C91812B8C939FBF1F910F91FF9031 +:200720000895CF93DF930E9453028BE391E00E9458040E94AD01C0E0D0E00E9498012097E2 +:20074000E1F30E940000F9CF282F809135018823C1F057FF1AC015C0289890933401809133 +:20076000F1008193E217F307B9F74115510539F08091F200882319F48BE68093E800AFBF67 +:2007800002C04FEF5FEFCA010895AFB7F89427702093E9008091F200282F30E0241735079D +:2007A0000CF4A901FB019B01240F311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F6A +:2007C00041E050E00E94A403019719F02FEF3FEF03C08981282F30E0C9010F90CF91DF9125 +:2007E0000895FF920F931F93F82E142F052F4091380150913901212F302FC901DC01FB0163 +:200800006EEF29C0F7FE02C0949101C09081209136013091370124173507ACF48091E800F3 +:200820008570E1F38091E80082FF03C02FEF3FEF17C09093F100C90101968F739070892B64 +:2008400011F46093E8002F5F3F4F3093370120933601119731961097A9F6812F902F9C01F6 +:20086000C9011F910F91FF9008959C018091E80082FFFCCFF901260F311D03C08091F1000E +:200880008193E217F307D1F7289884E6809334018BEF8093E800CB0108958093E90080912C +:2008A000F200882319F08AE38093E800089508951092350181E08093D70080EA8093D80078 +:2008C00082E189BD09B400FEFDCF61E070E080E090E00E94FA0180E98093D8008CE0809317 +:2008E000E2001092E000559A209A08955F926F927F928F929F92AF92BF92CF92DF92EF9214 +:20090000FF920F931F93CF93DF93E82E842E752E80913501882371F18B01242F352FC90152 +:20092000EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3FE +:20094000632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FD02C020E0EE +:2009600004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E03E +:2009800090E00E94FA013BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900C0 +:2009A000A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922F10C0C80107 +:2009C000322F06C0FC010196E491E093F10031503323C1F706C081918093F100915099237B +:2009E000D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E8004FBF209790 +:200A000009F0A5CF5D9884E680933301282D372DC9019C01C901DF91CF911F910F91FF902A +:200A2000EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB60F92112406 +:200A40001F932F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E1001092D8 +:200A6000E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED0010923501C8 +:200A800088E08093F00092FF36C083E08093E9008091F200882349F08AE38093E80005C0F1 +:200AA00080E891E00E947C0701C012E09FB7F8941093E9008091F2009FBF882389F780917A +:200AC0003301882351F08091330181508093330180913301882309F45D9A809134018823C4 +:200AE00051F08091340181508093340180913401882309F4289AFF91EF91BF91AF919F91D6 +:200B00008F917F916F915F914F913F912F911F910F900FBE0F901F9018950F931F93DF9368 +:200B2000CF930F92CDB7DEB719828E010F5F1F4FC8010E949B07C8010E943409898190E064 +:200B40000F90CF91DF911F910F9108951F920F920FB60F921124EF92FF921F932F933F93F4 +:200B60004F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB76197DEBF0F +:200B8000CDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C08091F1008193A1 +:200BA000E217F307D1F7289884E68093340182EF8093E800998197FF05C08091E80080FFAF +:200BC000FCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C08A81882329F4E5 +:200BE0001092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F48091E80080FF4E +:200C0000FCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230C1F51092E900A4 +:200C2000109237011092360110923901109238010E948D0599E0FE013996DF01292F1D92E8 +:200C40002A95E9F799871A8791E09E8790E8988B9AEF998B2091360130913701275F3F4F61 +:200C60003C872B878D871092E9001092370110923601F0923901E092380180E0BF0149E0FD +:200C800050E00E94F1030E948D0585C01092E9001092370110923601F0923901E092380170 +:200CA000123241F482E290E00E942C09892B09F476C071C0113079F488E0E816F10419F4E2 +:200CC00081E080933A0180913A01882309F06BC0ECE6F1E013C0133009F061C08B818823C0 +:200CE00019F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F053C0E4E5F1E0449180E8CE +:200D0000BF0150E00E94F10346C0873009F447C0883021F481E08093F1003DC08930D9F5D6 +:200D200023703070232BD9F5E1E9F1E091E031E026E39093E9003093EB0084918093EC0070 +:200D40002093ED009F5F3196953099F78EE78093EA001092EA008B81809335011CC08F819A +:200D600098851092E900109237011092360190933901809338018D81882329F4CE01019633 +:200D80000E94A70706C0823051F4CE0101960E94FD07882321F08EEF8093E80007C081E2DC +:200DA0008093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF91AF919F9195 +:200DC0008F917F916F915F914F913F912F911F91FF90EF900F900FBE0F901F9018952091AD +:200DE0007C0130917D0180917E0190917F01281B390B2F733070C901089520917C013091E7 +:200E00007D0180917E0190917F012817390719F42FEF3FEF09C0E0917E01F0917F01E45C51 +:200E2000FE4F8081282F30E0C901089520917C0130917D0180917E0190917F012817390779 +:200E400019F42FEF3FEF13C0E0917E01F0917F01E45CFE4F208180917E0190917F0101967F +:200E60008F73907090937F0180937E0130E0C9010895109283011092820188EE93E0A0E010 +:200E8000B0E08093840190938501A0938601B09387018EE091E09093810180938001089547 +:200EA0000F931F93DF93CF930F92CDB7DEB78C01698380910701882369F083E0BE016F5FCA +:200EC0007F4F41E050E00E9476041816190614F49C0107C081E090E0F8019383828320E039 +:200EE00030E0C9010F90CF91DF911F910F91089583E00E944D04089582E00E94D803482F73 +:200F000020917C0130917D012F5F3F4F2F73307080917E0190917F012817390759F0E0919C +:200F20007C01F0917D01E45CFE4F408330937D0120937C010895FC0180818E5F808380E881 +:200F400065E971E042E450E00E94F1030895FC0181819081913A59F4813209F04CC080E029 +:200F600060E071E047E050E00E94F10342C0913209F041C0803239F480E091E067E070E0ED +:200F80000E94350436C0823209F035C08281809307018091000190910101A0910201B09116 +:200FA0000301805B9440A040B04019F58091070180FD12C087E797E79093010A8093000A01 +:200FC0002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093B2 +:200FE0006000109260000FBEA8951092010A1092000A81E0089580E00895FC019181808121 +:20100000813A31F4913089F080E0933089F40DC0813269F49B3021F482818093080105C075 +:201020009A3029F482818093090181E0089580E00895EF92FF920F931F938C01E62EDC01CA +:20104000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D0995C9 +:201060008F2D90E01F910F91FF90EF90089510928E01109292011092910180E291E09093B9 +:20108000900180938F010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0178 +:2010A00084E0BE016F5F7F4F41E050E00E94760484E4B801A7010E9476040F90CF91DF91B0 +:2010C0001F910F91FF90EF90089582E048E050E00E9444080895FC01168217821086118675 +:2010E0001286138614823496BF010E9465080895DC01683810F0685829C0E62FF0E067FF82 +:2011000013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314963E +:201120002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9135 +:2011400014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F319678 +:201160009630B1F7CD011496BD010E94650821E030E0C9010895CF93DF93DC01683810F0F3 +:20118000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149641 +:2011A0002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496A0 +:2011C0008C911497826014968C9314976F7716968C9116978617A9F117968C911797861749 +:2011E00081F118968C911897861759F119968C911997861731F11A968C911A97861709F1CC +:201200001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C004 +:201220009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E018 +:2012400007C0CD011496BD010E94650821E030E0C901DF91CF91089580E867ED71E045E602 +:2012600050E00E94F1030895FC0180818F5F808380E86CE372E049E150E00E94F103089586 +:20128000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D91DA +:2012A0006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F764 +:2012C000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994C7 +:2012E000F894FFCF00E100000000000001010000000050074009EF061607FD0678077C07FA +:201300000000000019084009BB0878086B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 +:2070200060C000005EC00000F1C400005AC0000058C0000056C0000054C0000052C00000EF +:2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE +:2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 +:2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 +:2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E0E3BE +:2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B +:2070E00025C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEC +:20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 +:2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E +:207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 +:207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 +:207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 +:2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC +:2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE +:2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 +:20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB +:2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E +:20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 +:207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B +:20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 +:2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 +:2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 +:2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 +:20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 +:207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D +:2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 +:207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 +:2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 +:2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 +:2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 +:2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC +:20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D +:2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 +:2074400018C0D801C701B695A7959795879558D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF3 +:207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 +:207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E +:2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E +:2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B +:2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A +:20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA +:20752000C701F6D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE0190934A +:20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 +:2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 +:2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 +:2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C +:2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A +:2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 +:20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE +:20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70168D4DF +:207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 +:20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 +:20768000B695A795979587953BD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010B +:2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B +:2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 +:2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 +:20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC +:207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A +:2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00AD28091E8008B770C +:207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05CD2809193 +:20778000E8008E778093E800089582E061EC42E0B4D083E061E842E1B0D084E060E842E1F1 +:2077A000ACC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB640 +:2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 +:2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100EFC01F9336 +:2078000088E10FB6F89480936000109260000FBE84B714BE182F10FF08C0E0E0F0E085919B +:2078200094918F5F9F4F09F05DDC2091000A3091010A1092010A1092000A13FF0FC0809143 +:20784000090190910A012817390741F0E0E0F0E0859194918F5F9F4F09F044DCA2DF7894F5 +:207860001092AD011092AC010CC0E0DC37D38091AC019091AD0181549F4110F010921401DE +:2078800043DC80911401882381F78091E00081608093E00027DC80E090E01F910895FA01A0 +:2078A000923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E019C06F +:2078C000882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823029F4C2 +:2078E0008DE891E028E130E004C080E090E020E030E091838083C90108958093E90080915A +:20790000EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F0895D6 +:207920008091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093B4 +:20794000E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E8000895EF9226 +:20796000FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380818F7D10 +:20798000808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816080835B +:2079A00080E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808188605F +:2079C0008083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7EDF0E01E +:2079E0008081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F80831092E2000A +:207A000008951092DA001092E10008951F920F920FB60F9211242F933F934F935F936F93D6 +:207A20007F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C08091A3 +:207A4000DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF81E0E6 +:207A60008EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C08091E200B7 +:207A80008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E08EBBE2 +:207AA0001CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEFDCF42 +:207AC0008091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E2008091CD +:207AE000E20081608093E2008091B401882331F48091E30087FD02C081E001C084E08EBB2F +:207B0000ECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E08EBB6A +:207B20001092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E200806180931F +:207B4000E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F914F9163 +:207B60003F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F4F90183 +:207B800090E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8EB3C8 +:207BA000882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD31C0C0 +:207BC0008091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C0819159 +:207BE0008093F100415050402F5F3F4F4115510519F02830310598F390E02830310509F47B +:207C000091E08091E8008E778093E8004115510531F6992321F605C08EB3882341F08530BD +:207C200041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F4809120 +:207C4000E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C081E01C +:207C600008958091E80082FFF1CF06C08091F10081936150704059F02091F3008091F20000 +:207C8000322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F605C02E +:207CA0008EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E008950F93E5 +:207CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F725DD32 +:207CE0008091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F19130E7 +:207D000070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC080382C +:207D200009F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091E800AB +:207D4000277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0882315 +:207D600019F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277009F445 +:207D800097C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB00806134 +:207DA0008093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB008860DE +:207DC0008093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB7F894F7 +:207DE0008091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B8093E30041 +:207E000080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C0809105 +:207E2000B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E800877F99 +:207E40008093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800877FAA +:207E60008093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F49091AF +:207E8000B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F4809130 +:207EA000E30087FD02C081E001C084E08EBB6DDC8091E80083FF0AC08091EB00806280934B +:207EC000EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F938EB332 +:207EE000882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F91089513 +:207F0000F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BD0FB695 +:207F2000F894FA9AF99A0FBE01960895F894FFCF4341544552494E41007777000A000000F4 +:207F4000000000080112011001020000084123340001000201000109023E0002010080324F +:207F60000904000001020201000524001001042402040524060001070582030800FF0904B1 +:207F80000100020A00000007050402100001070583021000010403090422034100720064BF +:207FA00000750069006E006F0020004C0065006F006E006100720064006F00000018034156 +:187FC0000072006400750069006E006F0020004C004C0043000000001D +:00000001FF diff --git a/bootloaders/caterina/Caterina-Micro.hex b/bootloaders/caterina/Caterina-Micro.hex index 7479210..bcd6723 100644 --- a/bootloaders/caterina/Caterina-Micro.hex +++ b/bootloaders/caterina/Caterina-Micro.hex @@ -1,256 +1,1024 @@ -:1070000055C000006EC000006CC000006AC00000E7 -:1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000F1C400005AC0000053 -:1070300058C0000056C0000054C0000052C00000FC -:1070400050C0000078C000004CC000004AC00000E2 -:1070500048C0000046C0000044C0000042C000001C -:1070600040C000003EC000003CC000003AC000002C -:1070700038C0000036C0000034C0000032C000003C -:1070800030C000002EC000002CC000002AC000004C -:1070900028C0000026C0000024C0000022C000005C -:1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E0E36A -:1070C000FFE702C005900D92A83AB107D9F711E089 -:1070D000A8EAB1E001C01D92AE3BB107E1F78FD342 -:1070E00025C78ECFF89410926F00109281001092F5 -:1070F00085001092840081E085BF15BE47985D9A97 -:10710000289A0C94000008952091B2013091B301A7 -:107110002F5F3F4F3093B3012093B201932F37FF7E -:1071200003C08EEF831B982F990F921710F4479886 -:107130000895479A08951F920F920FB60F92112447 -:107140002F938F939F93EF93FF931092850010924C -:1071500084008091A8019091A901009741F00197C6 -:107160009093A9018093A801892B09F45D9A8091DD -:10717000AA019091AB01009741F001979093AB0168 -:107180008093AA01892B09F4289AE0E0F0E0859128 -:1071900094918F5F9F4F49F08091AC019091AD0128 -:1071A00001969093AD018093AC01FF91EF919F9177 -:1071B0008F912F910F900FBE0F901F90189584E024 -:1071C0008093E9000DC08091E8008B778093E80000 -:1071D00003C08EB3882351F08091E80082FFF9CF7D -:1071E0008091E80085FFEFCF8091F1000895982FFE -:1071F00083E08093E9008091E80085FD0DC08091D7 -:10720000E8008E778093E80003C08EB3882369F08E -:107210008091E80080FFF9CF9093F1005D9884E6BB -:1072200090E09093A9018093A80108954F925F92F6 -:107230006F927F928F929F92AF92BF92CF92DF9286 -:10724000EF92FF920F931F93CF93DF9384E080938D -:10725000E9008091E80082FF57C2289884E690E018 -:107260009093AB018093AA01AADF182F853481F493 -:107270008CE49DE19093AD018093AC0107B600FCD6 -:10728000FDCFF999FECF81E180935700E89503C0C7 -:10729000843519F494DF8DE00DC28C34E1F3803530 -:1072A000D1F3843721F484E4A2DF80E003C2813685 -:1072B00011F489E5FFC18134B1F481DF182F7FDF3C -:1072C00090E0880F991FAA2797FDA095BA2F312F1C -:1072D000330F20E0442737FD4095542F822B932B0A -:1072E000A42BB52BB8C1803711F483E5E3C18335F6 -:1072F00049F4C0E0D1E089917ADF21E0C730D207BC -:10730000D1F7D9C1863521F481E371DF80E3D2C1A1 -:10731000833731F487E86BDF85E969DF8EE1CAC125 -:107320008536B9F4E0E0F0E093E085E09093570013 -:10733000E89507B600FCFDCF80935700E89507B6A7 -:1073400000FCFDCFE058FF4FA0E7E030FA0771F7EF -:10735000A2CF823739F4E1E0F0E089E08093570072 -:107360008491A8C1863439F4E0E0F0E089E08093AC -:10737000570084919FC18E3439F4E3E0F0E089E056 -:1073800080935700849196C1813539F4E2E0F0E0B2 -:1073900089E08093570084918DC1823631F489E56C -:1073A00026DF80E024DF80E885C1823419F087364B -:1073B00009F0E5C01092AD011092AC0100DF082F7A -:1073C000FEDEF82EFCDE682E8554823008F071C196 -:1073D000902F80E0CF2DD0E0C82BD92B10926F00DA -:1073E000173609F04BC081E180935700E895DD2402 -:1073F000CC24C3943FC0E090AE01F090AF01009167 -:10740000B0011091B101B6E46B16D9F4ED2DF0E0A6 -:10741000EE29FF29E4918E2FEADEDD2081F082E063 -:1074200090E0A0E0B0E0E80EF91E0A1F1B1FE092FA -:10743000AE01F092AF010093B0011093B101DC24D2 -:1074400018C0D801C701B695A7959795879558D5C7 -:10745000CEDE82E090E0A0E0B0E0E80EF91E0A1F68 -:107460001B1FE092AE01F092AF010093B0011093A8 -:10747000B1012197209709F0BECF7DC08090AE0169 -:107480009090AF01A090B001B090B10196E4691660 -:1074900009F05DC083E0F40180935700E89507B6DA -:1074A00000FCFDCF54C0F6E46F1661F5772031F192 -:1074B000E090AE01F090AF010091B0011091B101E8 -:1074C0007EDED82ECC24852D90E08C299D29F701D5 -:1074D0000C0140925700E895112482E090E0A0E072 -:1074E000B0E0E80EF91E0A1F1B1FE092AE01F092F9 -:1074F000AF010093B0011093B10102C060DE582EBD -:10750000742423C0E090AE01F090AF010091B0016F -:107510001091B10116950795F794E79450DE682F06 -:10752000C701F6D48091AE019091AF01A091B00156 -:10753000B091B1010296A11DB11D8093AE0190934F -:10754000AF01A093B001B093B101219704C05524BD -:10755000772444244394209709F0A5CF96E4691634 -:1075600041F485E0F40180935700E89507B600FCEC -:10757000FDCF8DE03CDE82E080936F009CC08334C1 -:1075800071F40091AE011091AF0119DE90E021E09D -:10759000F8010C0120935700E89511247CCE833626 -:1075A00019F5E090AE01F090AF010091B00110919B -:1075B000B10105DEF701E16090E021E00C012093CC -:1075C0005700E895112482E090E0A0E0B0E0E80EDA -:1075D000F91E0A1F1B1FE092AE01F092AF0100934B -:1075E000B0011093B10157CE8D3661F4E091AE0138 -:1075F000F091AF0185E080935700E89507B600FC55 -:10760000FDCF49CE823551F4E091AE01F091AF014A -:1076100005911491812FEBDD802F4CC0843421F52E -:10762000E090AE01F090AF010091B0011091B10176 -:1076300016950795F794E794C2DD682FC70168D4C3 -:107640008091AE019091AF01A091B001B091B101D4 -:107650000296A11DB11D8093AE019093AF01A0933E -:10766000B001B093B10117CE843609F5E090AE01B8 -:10767000F090AF010091B0011091B101D801C701A4 -:10768000B695A795979587953BD4B1DD82E090E0BC -:10769000A0E0B0E0E80EF91E0A1F1B1FE092AE0149 -:1076A000F092AF010093B0011093B10104C08B318F -:1076B00011F08FE39CDD83E08093E9009091E80076 -:1076C0008091E8008E778093E80095FF04C010C099 -:1076D0008EB38823C9F08091E80080FFF9CF8091B4 -:1076E000E8008E778093E80003C08EB3882361F0B2 -:1076F0008091E80080FFF9CF84E08093E9008091D9 -:10770000E8008B778093E800DF91CF911F910F9174 -:10771000FF90EF90DF90CF90BF90AF909F908F90B1 -:107720007F906F905F904F9008959091B601892F50 -:107730008F77813249F58091B7018032A1F0813293 -:1077400019F5913A09F58091E800877F8093E80068 -:107750008DE091E067E070E00AD28091E8008B77DD -:107760008093E8000895913279F48091E800877F52 -:107770008093E8008DE091E067E070E05CD280915A -:10778000E8008E778093E800089582E061EC42E0A3 -:10779000B4D083E061E842E1B0D084E060E842E147 -:1077A000ACC084B7877F84BF88E10FB6F89480931C -:1077B0006000109260000FBE20E880E090E00FB6FD -:1077C000F89420936100809361000FBE81E085BF33 -:1077D00092E095BF3F9A209A559AE1E6F0E0208327 -:1077E000108247985D9A289A109289008AEF8093B8 -:1077F000880090936F0083E080938100EFC01F9317 -:1078000088E10FB6F89480936000109260000FBE7C -:1078100084B714BE182F10FF08C0E0E0F0E0859197 -:1078200094918F5F9F4F09F05DDC2091000A3091A9 -:10783000010A1092010A1092000A13FF0FC08091F2 -:10784000090190910A012817390741F0E0E0F0E0C2 -:10785000859194918F5F9F4F09F044DCA2DF78946B -:107860001092AD011092AC010CC0E0DC37D38091D6 -:10787000AC019091AD0181549F4110F01092140120 -:1078800043DC80911401882381F78091E0008160BE -:107890008093E00027DC80E090E01F910895FA01DA -:1078A000923049F0933061F09130F9F485E191E044 -:1078B00022E130E01EC087E291E02EE330E019C003 -:1078C000882329F485E691E024E030E012C081307D -:1078D00029F489E691E022E230E00BC0823029F4FD -:1078E0008DE891E028E130E004C080E090E020E005 -:1078F00030E091838083C90108958093E9008091ED -:10790000EB0081608093EB001092ED006093EC003F -:107910004093ED008091EE00881F8827881F08950E -:107920008091B60188238CF403C08EB38823B1F014 -:107930008091E80082FFF9CF8091E8008B778093F7 -:10794000E80008958EB3882349F08091E80080FF15 -:10795000F9CF8091E8008E778093E8000895EF9248 -:10796000FF920F931F9345D04CD008ED10E0F80123 -:1079700080818F77808380818068808380818F7D04 -:10798000808319BC1EBA1092B40180EEE82EF12C4F -:10799000F70180818B7F8083F80180818160808303 -:1079A00080E060E042E0A9DFE1EEF0E080818E7FE0 -:1079B0008083E2EEF0E08081816080838081886056 -:1079C0008083F70180818E7F8083F80180818061D0 -:1079D00080831F910F91FF90EF900895E7EDF0E005 -:1079E0008081816080838AE482BF81E08093B501D9 -:1079F000B6CFE8EDF0E080818E7F80831092E200C8 -:107A000008951092DA001092E10008951F920F92EB -:107A10000FB60F9211242F933F934F935F936F9361 -:107A20007F938F939F93AF93BF93EF93FF93809137 -:107A3000DA0080FF1BC08091D80080FF17C08091C2 -:107A4000DA008E7F8093DA008091D90080FF0BC02E -:107A500080E189BD82E189BD09B400FEFDCF81E0EE -:107A60008EBB3BD203C019BC1EBA37D28091E10055 -:107A700080FF17C08091E20080FF13C08091E20078 -:107A80008E7F8093E2008091E20080618093E2002B -:107A90008091D80080628093D80019BC85E08EBBAD -:107AA0001CD28091E10084FF2CC08091E20084FF11 -:107AB00028C080E189BD82E189BD09B400FEFDCF07 -:107AC0008091D8008F7D8093D8008091E1008F7ED7 -:107AD0008093E1008091E2008F7E8093E2008091AC -:107AE000E20081608093E2008091B401882331F448 -:107AF0008091E30087FD02C081E001C084E08EBB7D -:107B0000ECD18091E10083FF21C08091E20083FFEE -:107B10001DC08091E100877F8093E10082E08EBBF1 -:107B20001092B4018091E1008E7F8093E1008091FA -:107B3000E2008E7F8093E2008091E200806180937A -:107B4000E20080E060E042E0D8DEC7D1FF91EF9133 -:107B5000BF91AF919F918F917F916F915F914F9165 -:107B60003F912F910F900FBE0F901F9018959C0181 -:107B70004091BC015091BD014617570718F4F90117 -:107B800090E044C06115710511F0AB01F8CF809110 -:107B9000E8008E778093E80040E050E0F0CF8EB3AD -:107BA000882309F444C0853009F443C08091E8007B -:107BB00083FF02C081E008958091E80082FD31C01A -:107BC0008091E80080FF22C08091F3009091F20044 -:107BD000782F60E0292F30E0262B372B07C08191CA -:107BE0008093F100415050402F5F3F4F41155105A8 -:107BF00019F02830310598F390E02830310509F468 -:107C000091E08091E8008E778093E800411551055E -:107C100031F6992321F605C08EB3882341F08530D3 -:107C200041F08091E80082FFF7CF80E0089582E084 -:107C3000089583E008959C016115710529F48091F0 -:107C4000E8008B778093E800F90126C08EB3882383 -:107C500091F1853091F18091E80083FF02C081E0CD -:107C600008958091E80082FFF1CF06C08091F10075 -:107C700081936150704059F02091F3008091F2009F -:107C8000322F20E090E0822B932B892B79F7809183 -:107C9000E8008B778093E80061157105B9F605C09F -:107CA0008EB3882341F0853041F08091E80080FF59 -:107CB000F7CF80E0089582E0089583E008950F9360 -:107CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E0A3 -:107CD0008091F100819381E0EE3BF807C9F725DD43 -:107CE0008091E80083FFE4C08091B6019091B701D4 -:107CF000953009F46DC0963040F4913081F19130A7 -:107D000070F0933009F0D4C02AC0983009F4A3C0B1 -:107D1000993009F4B2C0963009F0CAC07CC08038EE -:107D200009F4C6C0823809F0C3C08091BA018770D7 -:107D30008093E9008091EB001092E9002091E80027 -:107D4000277F2093E80090E025E0969587952A9577 -:107D5000E1F781708093F1001092F10087C08823D1 -:107D600019F0823009F0A4C08F71823009F0A0C0F0 -:107D70008091B801882331F52091BA01277009F468 -:107D800097C02093E9008091EB0080FF1BC09330E7 -:107D900021F48091EB00806213C08091EB00806140 -:107DA0008093EB0081E090E002C0880F991F2A9534 -:107DB000E2F78093EA001092EA008091EB0088607D -:107DC0008093EB001092E9008091E800877F51C01A -:107DD000882309F06DC01091B8011F770FB7F89490 -:107DE0008091E800877F8093E8009ADD8091E80029 -:107DF00080FFFCCF8091E3008078812B8093E300AB -:107E000080688093E300112311F482E001C083E0D5 -:107E10008EBB0FBF4DC08058823008F049C08091A2 -:107E2000B8019091B9016091BA01AE014F5F5F4F07 -:107E300036DDBC01009709F43BC08091E800877FE4 -:107E40008093E80089819A8192DE8091E8008B77A7 -:107E50008093E8002DC0803859F58091E800877F35 -:107E60008093E8008091B4018093F1008091E80054 -:107E70008E778093E80054DD1BC08823C9F490916D -:107E8000B8019230A8F48091E800877F8093E800E1 -:107E90009093B40145DD8091B401882331F4809141 -:107EA000E30087FD02C081E001C084E08EBB6DDC91 -:107EB0008091E80083FF0AC08091EB00806280938C -:107EC000EB008091E800877F8093E8000F900F908F -:107ED000CF91DF911F910F91089508951F938EB355 -:107EE000882361F01091E9001092E9008091E80088 -:107EF00083FF01C0E4DE17701093E9001F9108951D -:107F0000F999FECF92BD81BDF89A992780B5089561 -:107F1000262FF999FECF1FBA92BD81BD20BD0FB6A5 -:107F2000F894FA9AF99A0FBE01960895F894FFCF43 -:107F30004341544552494E41007777000A00000002 -:107F40000000000801120110010200000841233561 -:107F50000001000201000109023E0002010080321E -:107F6000090400000102020100052400100104249C -:107F700002040524060001070582030800FF090426 -:107F80000100020A000000070504021000010705B5 -:107F900083021000010403090422034100720064FB -:107FA00000750069006E006F0020004D00690063DD -:107FB0000072006F00200020002000000018034124 -:107FC0000072006400750069006E006F0020004CB4 -:087FD000004C0043000000001A -:040000030000700089 -:00000001FF +:200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 +:200020000C9496010C9496010C941B050C94A6050C9496010C9496010C9496010C9496016B +:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B201CC +:200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 +:200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 +:2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 +:2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D +:2000E0000202040302020202060606060606040402020204040802011040804010204080A8 +:200100004080080204018040201002011080102040400000000200080E0000030401000BB2 +:200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD +:200140006F0020004D006900630072006F00200020002000180341007200640075006900A6 +:200160006E006F0020004C004C004300120100020000004041233580000101020001120121 +:200180000002020000404123358000010102000100C18081C1080B00020202010009040053 +:2001A000000102020000052400100105240101010424020605240600010705810310004094 +:2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 +:2001E000008501050919012903150025019503750181029501750581030501093009310943 +:20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D +:20022000019508810295017508810395067508150025650507190029658100C0090402004C +:2002400001030000000921010100012265000705840340000100000000000000002A2B2895 +:200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 +:20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 +:2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C +:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000057043907370811241FBE15 +:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EEF2E102C005900D92AA32B107D9F711E06B +:20030000AAE2B1E001C01D92AB39B107E1F712E0CCEDD2E004C02297FE010E946C09C63DE9 +:20032000D107C9F70E9491030C9470090C9400008DE061E00E945E0368EE73E080E090E00C +:200340000E94FA018DE060E00E945E0368EE73E080E090E00E94FA0108958DE061E00E944D +:20036000C10208951F920F920FB60F9211242F933F938F939F93AF93BF9380912E01909153 +:200380002F01A0913001B0913101309132010196A11DB11D232F2D5F2D3720F02D570196D4 +:2003A000A11DB11D2093320180932E0190932F01A0933001B093310180912A0190912B01D4 +:2003C000A0912C01B0912D010196A11DB11D80932A0190932B01A0932C01B0932D01BF917F +:2003E000AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F89480912A012F +:2004000090912B01A0912C01B0912D0166B5A89B05C06F3F19F00196A11DB11D7FBFBA2F9E +:20042000A92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC012DC0FA +:20044000FFB7F89480912A0190912B01A0912C01B0912D01E6B5A89B05C0EF3F19F0019693 +:20046000A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FBB1F70 +:20048000EA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105410538 +:2004A000510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816085BD64 +:2004C000EEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F0E005 +:2004E000808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0808178 +:2005000082608083808181608083E0E9F0E080818160808320EC30E0F90180818068808391 +:2005200080818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E0808184608083A0 +:20054000808182608083808181608083E3ECF0E0808181608083F9018081826080838C914F +:2005600081608C93EAE7F0E08081846080838081826080838081816080838081806880833B +:200580000895CF93DF93482F50E0CA018C509F4FFC0134914A525F4FFA018491882369F18D +:2005A00090E0880F991FFC01E455FF4FA591B491FC01E654FF4FC591D491662351F42FB789 +:2005C000F8948C91932F909589238C93888189230BC0623061F42FB7F8948C91932F9095E3 +:2005E00089238C938881832B88832FBF06C09FB7F8948C91832B8C939FBFDF91CF91089523 +:200600008730C1F1883080F48330F9F0843030F4813029F1823009F050C024C08430C9F0FA +:20062000863009F04AC022C08A3091F18B3030F4883031F1893009F040C026C08C3091F154 +:200640008C3060F18E30C9F533C0809180008F7703C0809180008F7D80938000089584B5BE +:200660008F7702C084B58F7D84BD08958091B0008F7703C08091B0008F7D8093B0000895D8 +:20068000809190008F7707C0809190008F7D03C080919000877F8093900008958091C000C4 +:2006A0008F7703C08091C0008F7D8093C00008958091C200877F8093C2000895FF920F93A6 +:2006C0001F93F62E482F50E0CA018E5E9E4FFC012491CA018C509F4FFC0114914A525F4FC6 +:2006E000FA0104910023C9F0222319F0822F0E940003E02FF0E0EE0FFF1FE654FF4FA59132 +:20070000B4919FB7F894FF2021F48C911095812302C08C91812B8C939FBF1F910F91FF9031 +:200720000895CF93DF930E9453028BE391E00E9458040E94AD01C0E0D0E00E9498012097E2 +:20074000E1F30E940000F9CF282F809135018823C1F057FF1AC015C0289890933401809133 +:20076000F1008193E217F307B9F74115510539F08091F200882319F48BE68093E800AFBF67 +:2007800002C04FEF5FEFCA010895AFB7F89427702093E9008091F200282F30E0241735079D +:2007A0000CF4A901FB019B01240F311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F6A +:2007C00041E050E00E94A403019719F02FEF3FEF03C08981282F30E0C9010F90CF91DF9125 +:2007E0000895FF920F931F93F82E142F052F4091380150913901212F302FC901DC01FB0163 +:200800006EEF29C0F7FE02C0949101C09081209136013091370124173507ACF48091E800F3 +:200820008570E1F38091E80082FF03C02FEF3FEF17C09093F100C90101968F739070892B64 +:2008400011F46093E8002F5F3F4F3093370120933601119731961097A9F6812F902F9C01F6 +:20086000C9011F910F91FF9008959C018091E80082FFFCCFF901260F311D03C08091F1000E +:200880008193E217F307D1F7289884E6809334018BEF8093E800CB0108958093E90080912C +:2008A000F200882319F08AE38093E800089508951092350181E08093D70080EA8093D80078 +:2008C00082E189BD09B400FEFDCF61E070E080E090E00E94FA0180E98093D8008CE0809317 +:2008E000E2001092E000559A209A08955F926F927F928F929F92AF92BF92CF92DF92EF9214 +:20090000FF920F931F93CF93DF93E82E842E752E80913501882371F18B01242F352FC90152 +:20092000EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3FE +:20094000632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FD02C020E0EE +:2009600004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E03E +:2009800090E00E94FA013BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900C0 +:2009A000A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922F10C0C80107 +:2009C000322F06C0FC010196E491E093F10031503323C1F706C081918093F100915099237B +:2009E000D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E8004FBF209790 +:200A000009F0A5CF5D9884E680933301282D372DC9019C01C901DF91CF911F910F91FF902A +:200A2000EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB60F92112406 +:200A40001F932F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E1001092D8 +:200A6000E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED0010923501C8 +:200A800088E08093F00092FF36C083E08093E9008091F200882349F08AE38093E80005C0F1 +:200AA00080E891E00E947C0701C012E09FB7F8941093E9008091F2009FBF882389F780917A +:200AC0003301882351F08091330181508093330180913301882309F45D9A809134018823C4 +:200AE00051F08091340181508093340180913401882309F4289AFF91EF91BF91AF919F91D6 +:200B00008F917F916F915F914F913F912F911F910F900FBE0F901F9018950F931F93DF9368 +:200B2000CF930F92CDB7DEB719828E010F5F1F4FC8010E949B07C8010E943409898190E064 +:200B40000F90CF91DF911F910F9108951F920F920FB60F921124EF92FF921F932F933F93F4 +:200B60004F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB76197DEBF0F +:200B8000CDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C08091F1008193A1 +:200BA000E217F307D1F7289884E68093340182EF8093E800998197FF05C08091E80080FFAF +:200BC000FCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C08A81882329F4E5 +:200BE0001092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F48091E80080FF4E +:200C0000FCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230C1F51092E900A4 +:200C2000109237011092360110923901109238010E948D0599E0FE013996DF01292F1D92E8 +:200C40002A95E9F799871A8791E09E8790E8988B9AEF998B2091360130913701275F3F4F61 +:200C60003C872B878D871092E9001092370110923601F0923901E092380180E0BF0149E0FD +:200C800050E00E94F1030E948D0585C01092E9001092370110923601F0923901E092380170 +:200CA000123241F482E290E00E942C09892B09F476C071C0113079F488E0E816F10419F4E2 +:200CC00081E080933A0180913A01882309F06BC0ECE6F1E013C0133009F061C08B818823C0 +:200CE00019F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F053C0E4E5F1E0449180E8CE +:200D0000BF0150E00E94F10346C0873009F447C0883021F481E08093F1003DC08930D9F5D6 +:200D200023703070232BD9F5E1E9F1E091E031E026E39093E9003093EB0084918093EC0070 +:200D40002093ED009F5F3196953099F78EE78093EA001092EA008B81809335011CC08F819A +:200D600098851092E900109237011092360190933901809338018D81882329F4CE01019633 +:200D80000E94A70706C0823051F4CE0101960E94FD07882321F08EEF8093E80007C081E2DC +:200DA0008093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF91AF919F9195 +:200DC0008F917F916F915F914F913F912F911F91FF90EF900F900FBE0F901F9018952091AD +:200DE0007C0130917D0180917E0190917F01281B390B2F733070C901089520917C013091E7 +:200E00007D0180917E0190917F012817390719F42FEF3FEF09C0E0917E01F0917F01E45C51 +:200E2000FE4F8081282F30E0C901089520917C0130917D0180917E0190917F012817390779 +:200E400019F42FEF3FEF13C0E0917E01F0917F01E45CFE4F208180917E0190917F0101967F +:200E60008F73907090937F0180937E0130E0C9010895109283011092820188EE93E0A0E010 +:200E8000B0E08093840190938501A0938601B09387018EE091E09093810180938001089547 +:200EA0000F931F93DF93CF930F92CDB7DEB78C01698380910701882369F083E0BE016F5FCA +:200EC0007F4F41E050E00E9476041816190614F49C0107C081E090E0F8019383828320E039 +:200EE00030E0C9010F90CF91DF911F910F91089583E00E944D04089582E00E94D803482F73 +:200F000020917C0130917D012F5F3F4F2F73307080917E0190917F012817390759F0E0919C +:200F20007C01F0917D01E45CFE4F408330937D0120937C010895FC0180818E5F808380E881 +:200F400065E971E042E450E00E94F1030895FC0181819081913A59F4813209F04CC080E029 +:200F600060E071E047E050E00E94F10342C0913209F041C0803239F480E091E067E070E0ED +:200F80000E94350436C0823209F035C08281809307018091000190910101A0910201B09116 +:200FA0000301805B9440A040B04019F58091070180FD12C087E797E79093010A8093000A01 +:200FC0002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093B2 +:200FE0006000109260000FBEA8951092010A1092000A81E0089580E00895FC019181808121 +:20100000813A31F4913089F080E0933089F40DC0813269F49B3021F482818093080105C075 +:201020009A3029F482818093090181E0089580E00895EF92FF920F931F938C01E62EDC01CA +:20104000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D0995C9 +:201060008F2D90E01F910F91FF90EF90089510928E01109292011092910180E291E09093B9 +:20108000900180938F010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0178 +:2010A00084E0BE016F5F7F4F41E050E00E94760484E4B801A7010E9476040F90CF91DF91B0 +:2010C0001F910F91FF90EF90089582E048E050E00E9444080895FC01168217821086118675 +:2010E0001286138614823496BF010E9465080895DC01683810F0685829C0E62FF0E067FF82 +:2011000013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314963E +:201120002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9135 +:2011400014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F319678 +:201160009630B1F7CD011496BD010E94650821E030E0C9010895CF93DF93DC01683810F0F3 +:20118000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149641 +:2011A0002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496A0 +:2011C0008C911497826014968C9314976F7716968C9116978617A9F117968C911797861749 +:2011E00081F118968C911897861759F119968C911997861731F11A968C911A97861709F1CC +:201200001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C004 +:201220009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E018 +:2012400007C0CD011496BD010E94650821E030E0C901DF91CF91089580E867ED71E045E602 +:2012600050E00E94F1030895FC0180818F5F808380E86CE372E049E150E00E94F103089586 +:20128000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D91DA +:2012A0006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F764 +:2012C000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994C7 +:2012E000F894FFCF00E100000000000001010000000050074009EF061607FD0678077C07FA +:201300000000000019084009BB0878086B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 +:2070200060C000005EC00000F1C400005AC0000058C0000056C0000054C0000052C00000EF +:2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE +:2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 +:2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 +:2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E0E3BE +:2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B +:2070E00025C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEC +:20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 +:2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E +:207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 +:207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 +:207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 +:2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC +:2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE +:2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 +:20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB +:2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E +:20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 +:207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B +:20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 +:2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 +:2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 +:2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 +:20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 +:207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D +:2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 +:207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 +:2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 +:2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 +:2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 +:2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC +:20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D +:2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 +:2074400018C0D801C701B695A7959795879558D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF3 +:207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 +:207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E +:2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E +:2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B +:2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A +:20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA +:20752000C701F6D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE0190934A +:20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 +:2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 +:2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 +:2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C +:2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A +:2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 +:20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE +:20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70168D4DF +:207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 +:20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 +:20768000B695A795979587953BD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010B +:2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B +:2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 +:2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 +:20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC +:207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A +:2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00AD28091E8008B770C +:207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05CD2809193 +:20778000E8008E778093E800089582E061EC42E0B4D083E061E842E1B0D084E060E842E1F1 +:2077A000ACC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB640 +:2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 +:2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100EFC01F9336 +:2078000088E10FB6F89480936000109260000FBE84B714BE182F10FF08C0E0E0F0E085919B +:2078200094918F5F9F4F09F05DDC2091000A3091010A1092010A1092000A13FF0FC0809143 +:20784000090190910A012817390741F0E0E0F0E0859194918F5F9F4F09F044DCA2DF7894F5 +:207860001092AD011092AC010CC0E0DC37D38091AC019091AD0181549F4110F010921401DE +:2078800043DC80911401882381F78091E00081608093E00027DC80E090E01F910895FA01A0 +:2078A000923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E019C06F +:2078C000882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823029F4C2 +:2078E0008DE891E028E130E004C080E090E020E030E091838083C90108958093E90080915A +:20790000EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F0895D6 +:207920008091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093B4 +:20794000E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E8000895EF9226 +:20796000FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380818F7D10 +:20798000808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816080835B +:2079A00080E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808188605F +:2079C0008083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7EDF0E01E +:2079E0008081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F80831092E2000A +:207A000008951092DA001092E10008951F920F920FB60F9211242F933F934F935F936F93D6 +:207A20007F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C08091A3 +:207A4000DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF81E0E6 +:207A60008EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C08091E200B7 +:207A80008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E08EBBE2 +:207AA0001CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEFDCF42 +:207AC0008091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E2008091CD +:207AE000E20081608093E2008091B401882331F48091E30087FD02C081E001C084E08EBB2F +:207B0000ECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E08EBB6A +:207B20001092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E200806180931F +:207B4000E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F914F9163 +:207B60003F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F4F90183 +:207B800090E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8EB3C8 +:207BA000882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD31C0C0 +:207BC0008091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C0819159 +:207BE0008093F100415050402F5F3F4F4115510519F02830310598F390E02830310509F47B +:207C000091E08091E8008E778093E8004115510531F6992321F605C08EB3882341F08530BD +:207C200041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F4809120 +:207C4000E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C081E01C +:207C600008958091E80082FFF1CF06C08091F10081936150704059F02091F3008091F20000 +:207C8000322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F605C02E +:207CA0008EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E008950F93E5 +:207CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F725DD32 +:207CE0008091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F19130E7 +:207D000070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC080382C +:207D200009F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091E800AB +:207D4000277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0882315 +:207D600019F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277009F445 +:207D800097C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB00806134 +:207DA0008093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB008860DE +:207DC0008093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB7F894F7 +:207DE0008091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B8093E30041 +:207E000080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C0809105 +:207E2000B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E800877F99 +:207E40008093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800877FAA +:207E60008093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F49091AF +:207E8000B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F4809130 +:207EA000E30087FD02C081E001C084E08EBB6DDC8091E80083FF0AC08091EB00806280934B +:207EC000EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F938EB332 +:207EE000882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F91089513 +:207F0000F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BD0FB695 +:207F2000F894FA9AF99A0FBE01960895F894FFCF4341544552494E41007777000A000000F4 +:207F4000000000080112011001020000084123350001000201000109023E0002010080324E +:207F60000904000001020201000524001001042402040524060001070582030800FF0904B1 +:207F80000100020A00000007050402100001070583021000010403090422034100720064BF +:207FA00000750069006E006F0020004D006900630072006F00200020002000000018034130 +:187FC0000072006400750069006E006F0020004C004C0043000000001D +:00000001FF -- cgit v1.2.3-18-g5258 From e2e0260094c762fddf4669b7a957914405ae9f19 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Mon, 9 Apr 2012 10:12:14 -0400 Subject: Micro I hardly knew ye --- boards.txt | 21 - bootloaders/caterina/Caterina-Micro.hex | 1024 ------------------------------- bootloaders/caterina/Descriptors.c | 17 +- bootloaders/caterina/Makefile | 2 - cores/arduino/USBCore.cpp | 8 +- variants/micro/pins_arduino.h | 25 - 6 files changed, 8 insertions(+), 1089 deletions(-) delete mode 100644 bootloaders/caterina/Caterina-Micro.hex delete mode 100644 variants/micro/pins_arduino.h diff --git a/boards.txt b/boards.txt index 3a94d26..26c9477 100644 --- a/boards.txt +++ b/boards.txt @@ -167,27 +167,6 @@ leonardo.build.variant=leonardo ############################################################## -micro.name=Arduino Micro -micro.upload.protocol=avr109 -micro.upload.maximum_size=28672 -micro.upload.speed=57600 -micro.upload.disable_flushing=true -micro.bootloader.low_fuses=0xff -micro.bootloader.high_fuses=0xd8 -micro.bootloader.extended_fuses=0xcb -micro.bootloader.path=caterina -micro.bootloader.file=Caterina-Micro.hex -micro.bootloader.unlock_bits=0x3F -micro.bootloader.lock_bits=0x2F -micro.build.mcu=atmega32u4 -micro.build.f_cpu=16000000L -micro.build.vid=0x2341 -micro.build.pid=0x8035 -micro.build.core=arduino -micro.build.variant=micro - -############################################################## - mini328.name=Arduino Mini w/ ATmega328 mini328.upload.protocol=arduino diff --git a/bootloaders/caterina/Caterina-Micro.hex b/bootloaders/caterina/Caterina-Micro.hex deleted file mode 100644 index bcd6723..0000000 --- a/bootloaders/caterina/Caterina-Micro.hex +++ /dev/null @@ -1,1024 +0,0 @@ -:200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 -:200020000C9496010C9496010C941B050C94A6050C9496010C9496010C9496010C9496016B -:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B201CC -:200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 -:200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 -:2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 -:2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D -:2000E0000202040302020202060606060606040402020204040802011040804010204080A8 -:200100004080080204018040201002011080102040400000000200080E0000030401000BB2 -:200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD -:200140006F0020004D006900630072006F00200020002000180341007200640075006900A6 -:200160006E006F0020004C004C004300120100020000004041233580000101020001120121 -:200180000002020000404123358000010102000100C18081C1080B00020202010009040053 -:2001A000000102020000052400100105240101010424020605240600010705810310004094 -:2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 -:2001E000008501050919012903150025019503750181029501750581030501093009310943 -:20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D -:20022000019508810295017508810395067508150025650507190029658100C0090402004C -:2002400001030000000921010100012265000705840340000100000000000000002A2B2895 -:200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 -:20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 -:2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C -:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000057043907370811241FBE15 -:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EEF2E102C005900D92AA32B107D9F711E06B -:20030000AAE2B1E001C01D92AB39B107E1F712E0CCEDD2E004C02297FE010E946C09C63DE9 -:20032000D107C9F70E9491030C9470090C9400008DE061E00E945E0368EE73E080E090E00C -:200340000E94FA018DE060E00E945E0368EE73E080E090E00E94FA0108958DE061E00E944D -:20036000C10208951F920F920FB60F9211242F933F938F939F93AF93BF9380912E01909153 -:200380002F01A0913001B0913101309132010196A11DB11D232F2D5F2D3720F02D570196D4 -:2003A000A11DB11D2093320180932E0190932F01A0933001B093310180912A0190912B01D4 -:2003C000A0912C01B0912D010196A11DB11D80932A0190932B01A0932C01B0932D01BF917F -:2003E000AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F89480912A012F -:2004000090912B01A0912C01B0912D0166B5A89B05C06F3F19F00196A11DB11D7FBFBA2F9E -:20042000A92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC012DC0FA -:20044000FFB7F89480912A0190912B01A0912C01B0912D01E6B5A89B05C0EF3F19F0019693 -:20046000A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FBB1F70 -:20048000EA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105410538 -:2004A000510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816085BD64 -:2004C000EEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F0E005 -:2004E000808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0808178 -:2005000082608083808181608083E0E9F0E080818160808320EC30E0F90180818068808391 -:2005200080818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E0808184608083A0 -:20054000808182608083808181608083E3ECF0E0808181608083F9018081826080838C914F -:2005600081608C93EAE7F0E08081846080838081826080838081816080838081806880833B -:200580000895CF93DF93482F50E0CA018C509F4FFC0134914A525F4FFA018491882369F18D -:2005A00090E0880F991FFC01E455FF4FA591B491FC01E654FF4FC591D491662351F42FB789 -:2005C000F8948C91932F909589238C93888189230BC0623061F42FB7F8948C91932F9095E3 -:2005E00089238C938881832B88832FBF06C09FB7F8948C91832B8C939FBFDF91CF91089523 -:200600008730C1F1883080F48330F9F0843030F4813029F1823009F050C024C08430C9F0FA -:20062000863009F04AC022C08A3091F18B3030F4883031F1893009F040C026C08C3091F154 -:200640008C3060F18E30C9F533C0809180008F7703C0809180008F7D80938000089584B5BE -:200660008F7702C084B58F7D84BD08958091B0008F7703C08091B0008F7D8093B0000895D8 -:20068000809190008F7707C0809190008F7D03C080919000877F8093900008958091C000C4 -:2006A0008F7703C08091C0008F7D8093C00008958091C200877F8093C2000895FF920F93A6 -:2006C0001F93F62E482F50E0CA018E5E9E4FFC012491CA018C509F4FFC0114914A525F4FC6 -:2006E000FA0104910023C9F0222319F0822F0E940003E02FF0E0EE0FFF1FE654FF4FA59132 -:20070000B4919FB7F894FF2021F48C911095812302C08C91812B8C939FBF1F910F91FF9031 -:200720000895CF93DF930E9453028BE391E00E9458040E94AD01C0E0D0E00E9498012097E2 -:20074000E1F30E940000F9CF282F809135018823C1F057FF1AC015C0289890933401809133 -:20076000F1008193E217F307B9F74115510539F08091F200882319F48BE68093E800AFBF67 -:2007800002C04FEF5FEFCA010895AFB7F89427702093E9008091F200282F30E0241735079D -:2007A0000CF4A901FB019B01240F311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F6A -:2007C00041E050E00E94A403019719F02FEF3FEF03C08981282F30E0C9010F90CF91DF9125 -:2007E0000895FF920F931F93F82E142F052F4091380150913901212F302FC901DC01FB0163 -:200800006EEF29C0F7FE02C0949101C09081209136013091370124173507ACF48091E800F3 -:200820008570E1F38091E80082FF03C02FEF3FEF17C09093F100C90101968F739070892B64 -:2008400011F46093E8002F5F3F4F3093370120933601119731961097A9F6812F902F9C01F6 -:20086000C9011F910F91FF9008959C018091E80082FFFCCFF901260F311D03C08091F1000E -:200880008193E217F307D1F7289884E6809334018BEF8093E800CB0108958093E90080912C -:2008A000F200882319F08AE38093E800089508951092350181E08093D70080EA8093D80078 -:2008C00082E189BD09B400FEFDCF61E070E080E090E00E94FA0180E98093D8008CE0809317 -:2008E000E2001092E000559A209A08955F926F927F928F929F92AF92BF92CF92DF92EF9214 -:20090000FF920F931F93CF93DF93E82E842E752E80913501882371F18B01242F352FC90152 -:20092000EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3FE -:20094000632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FD02C020E0EE -:2009600004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E03E -:2009800090E00E94FA013BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900C0 -:2009A000A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922F10C0C80107 -:2009C000322F06C0FC010196E491E093F10031503323C1F706C081918093F100915099237B -:2009E000D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E8004FBF209790 -:200A000009F0A5CF5D9884E680933301282D372DC9019C01C901DF91CF911F910F91FF902A -:200A2000EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB60F92112406 -:200A40001F932F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E1001092D8 -:200A6000E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED0010923501C8 -:200A800088E08093F00092FF36C083E08093E9008091F200882349F08AE38093E80005C0F1 -:200AA00080E891E00E947C0701C012E09FB7F8941093E9008091F2009FBF882389F780917A -:200AC0003301882351F08091330181508093330180913301882309F45D9A809134018823C4 -:200AE00051F08091340181508093340180913401882309F4289AFF91EF91BF91AF919F91D6 -:200B00008F917F916F915F914F913F912F911F910F900FBE0F901F9018950F931F93DF9368 -:200B2000CF930F92CDB7DEB719828E010F5F1F4FC8010E949B07C8010E943409898190E064 -:200B40000F90CF91DF911F910F9108951F920F920FB60F921124EF92FF921F932F933F93F4 -:200B60004F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB76197DEBF0F -:200B8000CDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C08091F1008193A1 -:200BA000E217F307D1F7289884E68093340182EF8093E800998197FF05C08091E80080FFAF -:200BC000FCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C08A81882329F4E5 -:200BE0001092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F48091E80080FF4E -:200C0000FCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230C1F51092E900A4 -:200C2000109237011092360110923901109238010E948D0599E0FE013996DF01292F1D92E8 -:200C40002A95E9F799871A8791E09E8790E8988B9AEF998B2091360130913701275F3F4F61 -:200C60003C872B878D871092E9001092370110923601F0923901E092380180E0BF0149E0FD -:200C800050E00E94F1030E948D0585C01092E9001092370110923601F0923901E092380170 -:200CA000123241F482E290E00E942C09892B09F476C071C0113079F488E0E816F10419F4E2 -:200CC00081E080933A0180913A01882309F06BC0ECE6F1E013C0133009F061C08B818823C0 -:200CE00019F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F053C0E4E5F1E0449180E8CE -:200D0000BF0150E00E94F10346C0873009F447C0883021F481E08093F1003DC08930D9F5D6 -:200D200023703070232BD9F5E1E9F1E091E031E026E39093E9003093EB0084918093EC0070 -:200D40002093ED009F5F3196953099F78EE78093EA001092EA008B81809335011CC08F819A -:200D600098851092E900109237011092360190933901809338018D81882329F4CE01019633 -:200D80000E94A70706C0823051F4CE0101960E94FD07882321F08EEF8093E80007C081E2DC -:200DA0008093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF91AF919F9195 -:200DC0008F917F916F915F914F913F912F911F91FF90EF900F900FBE0F901F9018952091AD -:200DE0007C0130917D0180917E0190917F01281B390B2F733070C901089520917C013091E7 -:200E00007D0180917E0190917F012817390719F42FEF3FEF09C0E0917E01F0917F01E45C51 -:200E2000FE4F8081282F30E0C901089520917C0130917D0180917E0190917F012817390779 -:200E400019F42FEF3FEF13C0E0917E01F0917F01E45CFE4F208180917E0190917F0101967F -:200E60008F73907090937F0180937E0130E0C9010895109283011092820188EE93E0A0E010 -:200E8000B0E08093840190938501A0938601B09387018EE091E09093810180938001089547 -:200EA0000F931F93DF93CF930F92CDB7DEB78C01698380910701882369F083E0BE016F5FCA -:200EC0007F4F41E050E00E9476041816190614F49C0107C081E090E0F8019383828320E039 -:200EE00030E0C9010F90CF91DF911F910F91089583E00E944D04089582E00E94D803482F73 -:200F000020917C0130917D012F5F3F4F2F73307080917E0190917F012817390759F0E0919C -:200F20007C01F0917D01E45CFE4F408330937D0120937C010895FC0180818E5F808380E881 -:200F400065E971E042E450E00E94F1030895FC0181819081913A59F4813209F04CC080E029 -:200F600060E071E047E050E00E94F10342C0913209F041C0803239F480E091E067E070E0ED -:200F80000E94350436C0823209F035C08281809307018091000190910101A0910201B09116 -:200FA0000301805B9440A040B04019F58091070180FD12C087E797E79093010A8093000A01 -:200FC0002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093B2 -:200FE0006000109260000FBEA8951092010A1092000A81E0089580E00895FC019181808121 -:20100000813A31F4913089F080E0933089F40DC0813269F49B3021F482818093080105C075 -:201020009A3029F482818093090181E0089580E00895EF92FF920F931F938C01E62EDC01CA -:20104000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D0995C9 -:201060008F2D90E01F910F91FF90EF90089510928E01109292011092910180E291E09093B9 -:20108000900180938F010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0178 -:2010A00084E0BE016F5F7F4F41E050E00E94760484E4B801A7010E9476040F90CF91DF91B0 -:2010C0001F910F91FF90EF90089582E048E050E00E9444080895FC01168217821086118675 -:2010E0001286138614823496BF010E9465080895DC01683810F0685829C0E62FF0E067FF82 -:2011000013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314963E -:201120002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9135 -:2011400014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F319678 -:201160009630B1F7CD011496BD010E94650821E030E0C9010895CF93DF93DC01683810F0F3 -:20118000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149641 -:2011A0002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496A0 -:2011C0008C911497826014968C9314976F7716968C9116978617A9F117968C911797861749 -:2011E00081F118968C911897861759F119968C911997861731F11A968C911A97861709F1CC -:201200001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C004 -:201220009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E018 -:2012400007C0CD011496BD010E94650821E030E0C901DF91CF91089580E867ED71E045E602 -:2012600050E00E94F1030895FC0180818F5F808380E86CE372E049E150E00E94F103089586 -:20128000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D91DA -:2012A0006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F764 -:2012C000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994C7 -:2012E000F894FFCF00E100000000000001010000000050074009EF061607FD0678077C07FA -:201300000000000019084009BB0878086B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 -:20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 -:2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 -:2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 -:20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF -:20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF -:20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F -:20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F -:20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F -:2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F -:2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF -:20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E -:20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E -:2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E -:2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E -:2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE -:20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED -:20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 -:20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 -:20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 -:2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 -:2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF -:20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F -:20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F -:20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F -:20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F -:2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF -:2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF -:20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E -:20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E -:20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E -:2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E -:2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE -:2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED -:2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 -:2070200060C000005EC00000F1C400005AC0000058C0000056C0000054C0000052C00000EF -:2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE -:2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 -:2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 -:2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E0E3BE -:2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B -:2070E00025C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEC -:20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 -:2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E -:207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 -:207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 -:207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 -:2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC -:2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE -:2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 -:20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB -:2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E -:20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 -:207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B -:20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 -:2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 -:2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 -:2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 -:20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 -:207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D -:2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 -:207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 -:2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 -:2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 -:2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 -:2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC -:20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D -:2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 -:2074400018C0D801C701B695A7959795879558D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF3 -:207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 -:207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E -:2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E -:2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B -:2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A -:20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA -:20752000C701F6D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE0190934A -:20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 -:2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 -:2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 -:2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C -:2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A -:2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 -:20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE -:20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70168D4DF -:207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 -:20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 -:20768000B695A795979587953BD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010B -:2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B -:2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 -:2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 -:20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC -:207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A -:2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00AD28091E8008B770C -:207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05CD2809193 -:20778000E8008E778093E800089582E061EC42E0B4D083E061E842E1B0D084E060E842E1F1 -:2077A000ACC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB640 -:2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 -:2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100EFC01F9336 -:2078000088E10FB6F89480936000109260000FBE84B714BE182F10FF08C0E0E0F0E085919B -:2078200094918F5F9F4F09F05DDC2091000A3091010A1092010A1092000A13FF0FC0809143 -:20784000090190910A012817390741F0E0E0F0E0859194918F5F9F4F09F044DCA2DF7894F5 -:207860001092AD011092AC010CC0E0DC37D38091AC019091AD0181549F4110F010921401DE -:2078800043DC80911401882381F78091E00081608093E00027DC80E090E01F910895FA01A0 -:2078A000923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E019C06F -:2078C000882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823029F4C2 -:2078E0008DE891E028E130E004C080E090E020E030E091838083C90108958093E90080915A -:20790000EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F0895D6 -:207920008091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093B4 -:20794000E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E8000895EF9226 -:20796000FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380818F7D10 -:20798000808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816080835B -:2079A00080E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808188605F -:2079C0008083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7EDF0E01E -:2079E0008081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F80831092E2000A -:207A000008951092DA001092E10008951F920F920FB60F9211242F933F934F935F936F93D6 -:207A20007F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C08091A3 -:207A4000DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF81E0E6 -:207A60008EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C08091E200B7 -:207A80008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E08EBBE2 -:207AA0001CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEFDCF42 -:207AC0008091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E2008091CD -:207AE000E20081608093E2008091B401882331F48091E30087FD02C081E001C084E08EBB2F -:207B0000ECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E08EBB6A -:207B20001092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E200806180931F -:207B4000E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F914F9163 -:207B60003F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F4F90183 -:207B800090E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8EB3C8 -:207BA000882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD31C0C0 -:207BC0008091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C0819159 -:207BE0008093F100415050402F5F3F4F4115510519F02830310598F390E02830310509F47B -:207C000091E08091E8008E778093E8004115510531F6992321F605C08EB3882341F08530BD -:207C200041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F4809120 -:207C4000E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C081E01C -:207C600008958091E80082FFF1CF06C08091F10081936150704059F02091F3008091F20000 -:207C8000322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F605C02E -:207CA0008EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E008950F93E5 -:207CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F725DD32 -:207CE0008091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F19130E7 -:207D000070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC080382C -:207D200009F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091E800AB -:207D4000277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0882315 -:207D600019F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277009F445 -:207D800097C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB00806134 -:207DA0008093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB008860DE -:207DC0008093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB7F894F7 -:207DE0008091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B8093E30041 -:207E000080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C0809105 -:207E2000B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E800877F99 -:207E40008093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800877FAA -:207E60008093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F49091AF -:207E8000B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F4809130 -:207EA000E30087FD02C081E001C084E08EBB6DDC8091E80083FF0AC08091EB00806280934B -:207EC000EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F938EB332 -:207EE000882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F91089513 -:207F0000F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BD0FB695 -:207F2000F894FA9AF99A0FBE01960895F894FFCF4341544552494E41007777000A000000F4 -:207F4000000000080112011001020000084123350001000201000109023E0002010080324E -:207F60000904000001020201000524001001042402040524060001070582030800FF0904B1 -:207F80000100020A00000007050402100001070583021000010403090422034100720064BF -:207FA00000750069006E006F0020004D006900630072006F00200020002000000018034130 -:187FC0000072006400750069006E006F0020004C004C0043000000001D -:00000001FF diff --git a/bootloaders/caterina/Descriptors.c b/bootloaders/caterina/Descriptors.c index 824e0dd..e0d3304 100755 --- a/bootloaders/caterina/Descriptors.c +++ b/bootloaders/caterina/Descriptors.c @@ -195,20 +195,11 @@ const USB_Descriptor_String_t ProductString = #if DEVICE_PID == 0x0034 .UnicodeString = L"Arduino Leonardo" - #elif DEVICE_PID == 0x0035 - .UnicodeString = L"Arduino Micro " - #else + #else .UnicodeString = L"USB IO board " #endif }; -/* -const USB_Descriptor_String_t SerialNumString = -{ - .Header = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String}, - - .UnicodeString = L"000000001452" -}; -*/ + const USB_Descriptor_String_t ManufNameString = { .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, @@ -252,10 +243,6 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, { Address = &ProductString; Size = ProductString.Header.Size; -// } else if (DescriptorNumber == DeviceDescriptor.SerialNumStrIndex) -// { -// Address = &SerialNumString; -// Size = SerialNumString.Header.Size; } else if (DescriptorNumber == DeviceDescriptor.ManufacturerStrIndex) { Address = &ManufNameString; diff --git a/bootloaders/caterina/Makefile b/bootloaders/caterina/Makefile index 3ec7b14..e460090 100755 --- a/bootloaders/caterina/Makefile +++ b/bootloaders/caterina/Makefile @@ -54,8 +54,6 @@ VID = 0x2341 # USB product ID (PID) # official Leonardo PID #PID = 0x0034 -# official Micro PID -PID = 0x0035 # MCU name diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index d1aeace..34c4372 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -53,14 +53,18 @@ const u16 STRING_IPRODUCT[17] = { (3<<8) | (2+2*16), #if USB_PID == 0x8034 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o' -#elif USB_PID == 0x8035 - 'A','r','d','u','i','n','o',' ','M','i','c','r','o',' ',' ',' ' +#else + 'U','S','B',' ','I','O',' ','B','O','A','R','D',' ',' ',' ',' ' #endif }; const u16 STRING_IMANUFACTURER[12] = { (3<<8) | (2+2*11), +#if USB_VID == 0x2341 'A','r','d','u','i','n','o',' ','L','L','C' +#else + 'U','n','k','n','o','w','n',' ',' ',' ',' ' +#endif }; #ifdef CDC_ENABLED diff --git a/variants/micro/pins_arduino.h b/variants/micro/pins_arduino.h deleted file mode 100644 index 06a5858..0000000 --- a/variants/micro/pins_arduino.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - pins_arduino.h - Pin definition functions for Arduino - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2007 David A. Mellis - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General - Public License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ -*/ - -#include "../leonardo/pins_arduino.h" -- cgit v1.2.3-18-g5258 From 49f7fb00fd7578fe5ecd78d60165fc2570aec1e2 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 11 Apr 2012 23:19:05 -0400 Subject: fixed logic bug in Caterina that could stop the bootloader from entering self-programming mode --- bootloaders/caterina/Caterina-Leonardo.hex | 1280 ++++++---------------------- bootloaders/caterina/Caterina.c | 32 +- cores/arduino/CDC.cpp | 5 +- 3 files changed, 276 insertions(+), 1041 deletions(-) diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex index 40a19c6..19bca60 100644 --- a/bootloaders/caterina/Caterina-Leonardo.hex +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -1,1024 +1,256 @@ -:200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 -:200020000C9496010C9496010C941B050C94A6050C9496010C9496010C9496010C9496016B -:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B201CC -:200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 -:200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 -:2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 -:2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D -:2000E0000202040302020202060606060606040402020204040802011040804010204080A8 -:200100004080080204018040201002011080102040400000000200080E0000030401000BB2 -:200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD -:200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC -:200160006E006F0020004C004C004300120100020000004041233480000101020001120122 -:200180000002020000404123348000010102000100C18081C1080B00020202010009040054 -:2001A000000102020000052400100105240101010424020605240600010705810310004094 -:2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 -:2001E000008501050919012903150025019503750181029501750581030501093009310943 -:20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D -:20022000019508810295017508810395067508150025650507190029658100C0090402004C -:2002400001030000000921010100012265000705840340000100000000000000002A2B2895 -:200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 -:20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 -:2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C -:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000057043907370811241FBE15 -:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EEF2E102C005900D92AA32B107D9F711E06B -:20030000AAE2B1E001C01D92AB39B107E1F712E0CCEDD2E004C02297FE010E946C09C63DE9 -:20032000D107C9F70E9491030C9470090C9400008DE061E00E945E0368EE73E080E090E00C -:200340000E94FA018DE060E00E945E0368EE73E080E090E00E94FA0108958DE061E00E944D -:20036000C10208951F920F920FB60F9211242F933F938F939F93AF93BF9380912E01909153 -:200380002F01A0913001B0913101309132010196A11DB11D232F2D5F2D3720F02D570196D4 -:2003A000A11DB11D2093320180932E0190932F01A0933001B093310180912A0190912B01D4 -:2003C000A0912C01B0912D010196A11DB11D80932A0190932B01A0932C01B0932D01BF917F -:2003E000AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F89480912A012F -:2004000090912B01A0912C01B0912D0166B5A89B05C06F3F19F00196A11DB11D7FBFBA2F9E -:20042000A92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC012DC0FA -:20044000FFB7F89480912A0190912B01A0912C01B0912D01E6B5A89B05C0EF3F19F0019693 -:20046000A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FBB1F70 -:20048000EA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105410538 -:2004A000510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816085BD64 -:2004C000EEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F0E005 -:2004E000808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0808178 -:2005000082608083808181608083E0E9F0E080818160808320EC30E0F90180818068808391 -:2005200080818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E0808184608083A0 -:20054000808182608083808181608083E3ECF0E0808181608083F9018081826080838C914F -:2005600081608C93EAE7F0E08081846080838081826080838081816080838081806880833B -:200580000895CF93DF93482F50E0CA018C509F4FFC0134914A525F4FFA018491882369F18D -:2005A00090E0880F991FFC01E455FF4FA591B491FC01E654FF4FC591D491662351F42FB789 -:2005C000F8948C91932F909589238C93888189230BC0623061F42FB7F8948C91932F9095E3 -:2005E00089238C938881832B88832FBF06C09FB7F8948C91832B8C939FBFDF91CF91089523 -:200600008730C1F1883080F48330F9F0843030F4813029F1823009F050C024C08430C9F0FA -:20062000863009F04AC022C08A3091F18B3030F4883031F1893009F040C026C08C3091F154 -:200640008C3060F18E30C9F533C0809180008F7703C0809180008F7D80938000089584B5BE -:200660008F7702C084B58F7D84BD08958091B0008F7703C08091B0008F7D8093B0000895D8 -:20068000809190008F7707C0809190008F7D03C080919000877F8093900008958091C000C4 -:2006A0008F7703C08091C0008F7D8093C00008958091C200877F8093C2000895FF920F93A6 -:2006C0001F93F62E482F50E0CA018E5E9E4FFC012491CA018C509F4FFC0114914A525F4FC6 -:2006E000FA0104910023C9F0222319F0822F0E940003E02FF0E0EE0FFF1FE654FF4FA59132 -:20070000B4919FB7F894FF2021F48C911095812302C08C91812B8C939FBF1F910F91FF9031 -:200720000895CF93DF930E9453028BE391E00E9458040E94AD01C0E0D0E00E9498012097E2 -:20074000E1F30E940000F9CF282F809135018823C1F057FF1AC015C0289890933401809133 -:20076000F1008193E217F307B9F74115510539F08091F200882319F48BE68093E800AFBF67 -:2007800002C04FEF5FEFCA010895AFB7F89427702093E9008091F200282F30E0241735079D -:2007A0000CF4A901FB019B01240F311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F6A -:2007C00041E050E00E94A403019719F02FEF3FEF03C08981282F30E0C9010F90CF91DF9125 -:2007E0000895FF920F931F93F82E142F052F4091380150913901212F302FC901DC01FB0163 -:200800006EEF29C0F7FE02C0949101C09081209136013091370124173507ACF48091E800F3 -:200820008570E1F38091E80082FF03C02FEF3FEF17C09093F100C90101968F739070892B64 -:2008400011F46093E8002F5F3F4F3093370120933601119731961097A9F6812F902F9C01F6 -:20086000C9011F910F91FF9008959C018091E80082FFFCCFF901260F311D03C08091F1000E -:200880008193E217F307D1F7289884E6809334018BEF8093E800CB0108958093E90080912C -:2008A000F200882319F08AE38093E800089508951092350181E08093D70080EA8093D80078 -:2008C00082E189BD09B400FEFDCF61E070E080E090E00E94FA0180E98093D8008CE0809317 -:2008E000E2001092E000559A209A08955F926F927F928F929F92AF92BF92CF92DF92EF9214 -:20090000FF920F931F93CF93DF93E82E842E752E80913501882371F18B01242F352FC90152 -:20092000EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3FE -:20094000632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FD02C020E0EE -:2009600004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E03E -:2009800090E00E94FA013BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900C0 -:2009A000A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922F10C0C80107 -:2009C000322F06C0FC010196E491E093F10031503323C1F706C081918093F100915099237B -:2009E000D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E8004FBF209790 -:200A000009F0A5CF5D9884E680933301282D372DC9019C01C901DF91CF911F910F91FF902A -:200A2000EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB60F92112406 -:200A40001F932F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E1001092D8 -:200A6000E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED0010923501C8 -:200A800088E08093F00092FF36C083E08093E9008091F200882349F08AE38093E80005C0F1 -:200AA00080E891E00E947C0701C012E09FB7F8941093E9008091F2009FBF882389F780917A -:200AC0003301882351F08091330181508093330180913301882309F45D9A809134018823C4 -:200AE00051F08091340181508093340180913401882309F4289AFF91EF91BF91AF919F91D6 -:200B00008F917F916F915F914F913F912F911F910F900FBE0F901F9018950F931F93DF9368 -:200B2000CF930F92CDB7DEB719828E010F5F1F4FC8010E949B07C8010E943409898190E064 -:200B40000F90CF91DF911F910F9108951F920F920FB60F921124EF92FF921F932F933F93F4 -:200B60004F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB76197DEBF0F -:200B8000CDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C08091F1008193A1 -:200BA000E217F307D1F7289884E68093340182EF8093E800998197FF05C08091E80080FFAF -:200BC000FCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C08A81882329F4E5 -:200BE0001092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F48091E80080FF4E -:200C0000FCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230C1F51092E900A4 -:200C2000109237011092360110923901109238010E948D0599E0FE013996DF01292F1D92E8 -:200C40002A95E9F799871A8791E09E8790E8988B9AEF998B2091360130913701275F3F4F61 -:200C60003C872B878D871092E9001092370110923601F0923901E092380180E0BF0149E0FD -:200C800050E00E94F1030E948D0585C01092E9001092370110923601F0923901E092380170 -:200CA000123241F482E290E00E942C09892B09F476C071C0113079F488E0E816F10419F4E2 -:200CC00081E080933A0180913A01882309F06BC0ECE6F1E013C0133009F061C08B818823C0 -:200CE00019F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F053C0E4E5F1E0449180E8CE -:200D0000BF0150E00E94F10346C0873009F447C0883021F481E08093F1003DC08930D9F5D6 -:200D200023703070232BD9F5E1E9F1E091E031E026E39093E9003093EB0084918093EC0070 -:200D40002093ED009F5F3196953099F78EE78093EA001092EA008B81809335011CC08F819A -:200D600098851092E900109237011092360190933901809338018D81882329F4CE01019633 -:200D80000E94A70706C0823051F4CE0101960E94FD07882321F08EEF8093E80007C081E2DC -:200DA0008093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF91AF919F9195 -:200DC0008F917F916F915F914F913F912F911F91FF90EF900F900FBE0F901F9018952091AD -:200DE0007C0130917D0180917E0190917F01281B390B2F733070C901089520917C013091E7 -:200E00007D0180917E0190917F012817390719F42FEF3FEF09C0E0917E01F0917F01E45C51 -:200E2000FE4F8081282F30E0C901089520917C0130917D0180917E0190917F012817390779 -:200E400019F42FEF3FEF13C0E0917E01F0917F01E45CFE4F208180917E0190917F0101967F -:200E60008F73907090937F0180937E0130E0C9010895109283011092820188EE93E0A0E010 -:200E8000B0E08093840190938501A0938601B09387018EE091E09093810180938001089547 -:200EA0000F931F93DF93CF930F92CDB7DEB78C01698380910701882369F083E0BE016F5FCA -:200EC0007F4F41E050E00E9476041816190614F49C0107C081E090E0F8019383828320E039 -:200EE00030E0C9010F90CF91DF911F910F91089583E00E944D04089582E00E94D803482F73 -:200F000020917C0130917D012F5F3F4F2F73307080917E0190917F012817390759F0E0919C -:200F20007C01F0917D01E45CFE4F408330937D0120937C010895FC0180818E5F808380E881 -:200F400065E971E042E450E00E94F1030895FC0181819081913A59F4813209F04CC080E029 -:200F600060E071E047E050E00E94F10342C0913209F041C0803239F480E091E067E070E0ED -:200F80000E94350436C0823209F035C08281809307018091000190910101A0910201B09116 -:200FA0000301805B9440A040B04019F58091070180FD12C087E797E79093010A8093000A01 -:200FC0002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093B2 -:200FE0006000109260000FBEA8951092010A1092000A81E0089580E00895FC019181808121 -:20100000813A31F4913089F080E0933089F40DC0813269F49B3021F482818093080105C075 -:201020009A3029F482818093090181E0089580E00895EF92FF920F931F938C01E62EDC01CA -:20104000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D0995C9 -:201060008F2D90E01F910F91FF90EF90089510928E01109292011092910180E291E09093B9 -:20108000900180938F010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0178 -:2010A00084E0BE016F5F7F4F41E050E00E94760484E4B801A7010E9476040F90CF91DF91B0 -:2010C0001F910F91FF90EF90089582E048E050E00E9444080895FC01168217821086118675 -:2010E0001286138614823496BF010E9465080895DC01683810F0685829C0E62FF0E067FF82 -:2011000013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314963E -:201120002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9135 -:2011400014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F319678 -:201160009630B1F7CD011496BD010E94650821E030E0C9010895CF93DF93DC01683810F0F3 -:20118000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149641 -:2011A0002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496A0 -:2011C0008C911497826014968C9314976F7716968C9116978617A9F117968C911797861749 -:2011E00081F118968C911897861759F119968C911997861731F11A968C911A97861709F1CC -:201200001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C004 -:201220009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E018 -:2012400007C0CD011496BD010E94650821E030E0C901DF91CF91089580E867ED71E045E602 -:2012600050E00E94F1030895FC0180818F5F808380E86CE372E049E150E00E94F103089586 -:20128000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D91DA -:2012A0006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F764 -:2012C000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994C7 -:2012E000F894FFCF00E100000000000001010000000050074009EF061607FD0678077C07FA -:201300000000000019084009BB0878086B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 -:20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 -:2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 -:2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 -:20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF -:20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF -:20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F -:20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F -:20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F -:2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F -:2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF -:20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E -:20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E -:2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E -:2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E -:2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE -:20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED -:20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 -:20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 -:20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 -:2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 -:2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF -:20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F -:20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F -:20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F -:20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F -:2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF -:2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF -:20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E -:20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E -:20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E -:2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E -:2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE -:2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD -:20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D -:20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D -:20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D -:20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D -:2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED -:2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD -:20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C -:20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C -:2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C -:2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB -:20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B -:20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB -:20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A -:2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 -:20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 -:2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 -:2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 -:2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 -:20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 -:20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 -:20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 -:20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 -:2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 -:2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 -:205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 -:205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 -:205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 -:205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 -:205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 -:205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 -:205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 -:205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 -:205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 -:205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 -:205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 -:205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 -:205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 -:205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 -:205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 -:205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 -:205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 -:205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 -:205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 -:205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 -:205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 -:205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 -:205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 -:205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 -:205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 -:205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 -:205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 -:205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 -:205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 -:205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 -:205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 -:20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 -:2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 -:2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F -:20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F -:20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -:2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF -:2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E -:20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E -:20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E -:20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E -:20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E -:2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE -:2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D -:20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D -:20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D -:20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D -:2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD -:2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD -:2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD -:20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C -:20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C -:2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B -:20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB -:2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB -:2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB -:20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A -:2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 -:2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 -:2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 -:2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 -:20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 -:20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 -:206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 -:206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 -:206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 -:206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 -:206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 -:206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 -:206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 -:206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 -:206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 -:206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 -:206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 -:206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 -:206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 -:206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 -:206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 -:206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 -:206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 -:206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 -:206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 -:206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 -:206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 -:206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 -:206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 -:206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 -:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 -:2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 -:2070200060C000005EC00000F1C400005AC0000058C0000056C0000054C0000052C00000EF -:2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE -:2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 -:2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 -:2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0E0E3BE -:2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B -:2070E00025C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEC -:20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 -:2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E -:207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 -:207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 -:207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 -:2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC -:2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE -:2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 -:20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB -:2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E -:20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 -:207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B -:20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 -:2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 -:2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 -:2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 -:20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 -:207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D -:2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 -:207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 -:2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 -:2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 -:2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 -:2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC -:20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D -:2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 -:2074400018C0D801C701B695A7959795879558D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF3 -:207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 -:207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E -:2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E -:2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B -:2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A -:20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA -:20752000C701F6D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE0190934A -:20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 -:2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 -:2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 -:2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C -:2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A -:2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 -:20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE -:20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70168D4DF -:207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 -:20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 -:20768000B695A795979587953BD4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010B -:2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B -:2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 -:2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 -:20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC -:207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A -:2077400019F5913A09F58091E800877F8093E8008DE091E067E070E00AD28091E8008B770C -:207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E05CD2809193 -:20778000E8008E778093E800089582E061EC42E0B4D083E061E842E1B0D084E060E842E1F1 -:2077A000ACC084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB640 -:2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 -:2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100EFC01F9336 -:2078000088E10FB6F89480936000109260000FBE84B714BE182F10FF08C0E0E0F0E085919B -:2078200094918F5F9F4F09F05DDC2091000A3091010A1092010A1092000A13FF0FC0809143 -:20784000090190910A012817390741F0E0E0F0E0859194918F5F9F4F09F044DCA2DF7894F5 -:207860001092AD011092AC010CC0E0DC37D38091AC019091AD0181549F4110F010921401DE -:2078800043DC80911401882381F78091E00081608093E00027DC80E090E01F910895FA01A0 -:2078A000923049F0933061F09130F9F485E191E022E130E01EC087E291E02EE330E019C06F -:2078C000882329F485E691E024E030E012C0813029F489E691E022E230E00BC0823029F4C2 -:2078E0008DE891E028E130E004C080E090E020E030E091838083C90108958093E90080915A -:20790000EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881F0895D6 -:207920008091B60188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093B4 -:20794000E80008958EB3882349F08091E80080FFF9CF8091E8008E778093E8000895EF9226 -:20796000FF920F931F9345D04CD008ED10E0F80180818F77808380818068808380818F7D10 -:20798000808319BC1EBA1092B40180EEE82EF12CF70180818B7F8083F8018081816080835B -:2079A00080E060E042E0A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808188605F -:2079C0008083F70180818E7F8083F8018081806180831F910F91FF90EF900895E7EDF0E01E -:2079E0008081816080838AE482BF81E08093B501B6CFE8EDF0E080818E7F80831092E2000A -:207A000008951092DA001092E10008951F920F920FB60F9211242F933F934F935F936F93D6 -:207A20007F938F939F93AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C08091A3 -:207A4000DA008E7F8093DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF81E0E6 -:207A60008EBB3BD203C019BC1EBA37D28091E10080FF17C08091E20080FF13C08091E200B7 -:207A80008E7F8093E2008091E20080618093E2008091D80080628093D80019BC85E08EBBE2 -:207AA0001CD28091E10084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEFDCF42 -:207AC0008091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E2008091CD -:207AE000E20081608093E2008091B401882331F48091E30087FD02C081E001C084E08EBB2F -:207B0000ECD18091E10083FF21C08091E20083FF1DC08091E100877F8093E10082E08EBB6A -:207B20001092B4018091E1008E7F8093E1008091E2008E7F8093E2008091E200806180931F -:207B4000E20080E060E042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F914F9163 -:207B60003F912F910F900FBE0F901F9018959C014091BC015091BD014617570718F4F90183 -:207B800090E044C06115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8EB3C8 -:207BA000882309F444C0853009F443C08091E80083FF02C081E008958091E80082FD31C0C0 -:207BC0008091E80080FF22C08091F3009091F200782F60E0292F30E0262B372B07C0819159 -:207BE0008093F100415050402F5F3F4F4115510519F02830310598F390E02830310509F47B -:207C000091E08091E8008E778093E8004115510531F6992321F605C08EB3882341F08530BD -:207C200041F08091E80082FFF7CF80E0089582E0089583E008959C016115710529F4809120 -:207C4000E8008B778093E800F90126C08EB3882391F1853091F18091E80083FF02C081E01C -:207C600008958091E80082FFF1CF06C08091F10081936150704059F02091F3008091F20000 -:207C8000322F20E090E0822B932B892B79F78091E8008B778093E80061157105B9F605C02E -:207CA0008EB3882341F0853041F08091E80080FFF7CF80E0089582E0089583E008950F93E5 -:207CC0001F93DF93CF9300D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F725DD32 -:207CE0008091E80083FFE4C08091B6019091B701953009F46DC0963040F4913081F19130E7 -:207D000070F0933009F0D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC080382C -:207D200009F4C6C0823809F0C3C08091BA0187708093E9008091EB001092E9002091E800AB -:207D4000277F2093E80090E025E0969587952A95E1F781708093F1001092F10087C0882315 -:207D600019F0823009F0A4C08F71823009F0A0C08091B801882331F52091BA01277009F445 -:207D800097C02093E9008091EB0080FF1BC0933021F48091EB00806213C08091EB00806134 -:207DA0008093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091EB008860DE -:207DC0008093EB001092E9008091E800877F51C0882309F06DC01091B8011F770FB7F894F7 -:207DE0008091E800877F8093E8009ADD8091E80080FFFCCF8091E3008078812B8093E30041 -:207E000080688093E300112311F482E001C083E08EBB0FBF4DC08058823008F049C0809105 -:207E2000B8019091B9016091BA01AE014F5F5F4F36DDBC01009709F43BC08091E800877F99 -:207E40008093E80089819A8192DE8091E8008B778093E8002DC0803859F58091E800877FAA -:207E60008093E8008091B4018093F1008091E8008E778093E80054DD1BC08823C9F49091AF -:207E8000B8019230A8F48091E800877F8093E8009093B40145DD8091B401882331F4809130 -:207EA000E30087FD02C081E001C084E08EBB6DDC8091E80083FF0AC08091EB00806280934B -:207EC000EB008091E800877F8093E8000F900F90CF91DF911F910F91089508951F938EB332 -:207EE000882361F01091E9001092E9008091E80083FF01C0E4DE17701093E9001F91089513 -:207F0000F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD20BD0FB695 -:207F2000F894FA9AF99A0FBE01960895F894FFCF4341544552494E41007777000A000000F4 -:207F4000000000080112011001020000084123340001000201000109023E0002010080324F -:207F60000904000001020201000524001001042402040524060001070582030800FF0904B1 -:207F80000100020A00000007050402100001070583021000010403090422034100720064BF -:207FA00000750069006E006F0020004C0065006F006E006100720064006F00000018034156 -:187FC0000072006400750069006E006F0020004C004C0043000000001D -:00000001FF +:1070000055C000006EC000006CC000006AC00000E7 +:1070100068C0000066C0000064C0000062C00000DC +:1070200060C000005EC00000EEC400005AC0000056 +:1070300058C0000056C0000054C0000052C00000FC +:1070400050C0000078C000004CC000004AC00000E2 +:1070500048C0000046C0000044C0000042C000001C +:1070600040C000003EC000003CC000003AC000002C +:1070700038C0000036C0000034C0000032C000003C +:1070800030C000002EC000002CC000002AC000004C +:1070900028C0000026C0000024C0000022C000005C +:1070A00020C000001EC000001CC0000011241FBE34 +:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EAE261 +:1070C000FFE702C005900D92A83AB107D9F711E089 +:1070D000A8EAB1E001C01D92AE3BB107E1F78FD342 +:1070E00022C78ECFF89410926F00109281001092F8 +:1070F00085001092840081E085BF15BE47985D9A97 +:10710000289A0C94000008952091B2013091B301A7 +:107110002F5F3F4F3093B3012093B201932F37FF7E +:1071200003C08EEF831B982F990F921710F4479886 +:107130000895479A08951F920F920FB60F92112447 +:107140002F938F939F93EF93FF931092850010924C +:1071500084008091A8019091A901009741F00197C6 +:107160009093A9018093A801892B09F45D9A8091DD +:10717000AA019091AB01009741F001979093AB0168 +:107180008093AA01892B09F4289AE0E0F0E0859128 +:1071900094918F5F9F4F49F08091AC019091AD0128 +:1071A00001969093AD018093AC01FF91EF919F9177 +:1071B0008F912F910F900FBE0F901F90189584E024 +:1071C0008093E9000DC08091E8008B778093E80000 +:1071D00003C08EB3882351F08091E80082FFF9CF7D +:1071E0008091E80085FFEFCF8091F1000895982FFE +:1071F00083E08093E9008091E80085FD0DC08091D7 +:10720000E8008E778093E80003C08EB3882369F08E +:107210008091E80080FFF9CF9093F1005D9884E6BB +:1072200090E09093A9018093A80108954F925F92F6 +:107230006F927F928F929F92AF92BF92CF92DF9286 +:10724000EF92FF920F931F93CF93DF9384E080938D +:10725000E9008091E80082FF57C2289884E690E018 +:107260009093AB018093AA01AADF182F853481F493 +:107270008CE49DE19093AD018093AC0107B600FCD6 +:10728000FDCFF999FECF81E180935700E89503C0C7 +:10729000843519F494DF8DE00DC28C34E1F3803530 +:1072A000D1F3843721F484E4A2DF80E003C2813685 +:1072B00011F489E5FFC18134B1F481DF182F7FDF3C +:1072C00090E0880F991FAA2797FDA095BA2F312F1C +:1072D000330F20E0442737FD4095542F822B932B0A +:1072E000A42BB52BB8C1803711F483E5E3C18335F6 +:1072F00049F4C0E0D1E089917ADF21E0C730D207BC +:10730000D1F7D9C1863521F481E371DF80E3D2C1A1 +:10731000833731F487E86BDF85E969DF8EE1CAC125 +:107320008536B9F4E0E0F0E093E085E09093570013 +:10733000E89507B600FCFDCF80935700E89507B6A7 +:1073400000FCFDCFE058FF4FA0E7E030FA0771F7EF +:10735000A2CF823739F4E1E0F0E089E08093570072 +:107360008491A8C1863439F4E0E0F0E089E08093AC +:10737000570084919FC18E3439F4E3E0F0E089E056 +:1073800080935700849196C1813539F4E2E0F0E0B2 +:1073900089E08093570084918DC1823631F489E56C +:1073A00026DF80E024DF80E885C1823419F087364B +:1073B00009F0E5C01092AD011092AC0100DF082F7A +:1073C000FEDEF82EFCDE682E8554823008F071C196 +:1073D000902F80E0CF2DD0E0C82BD92B10926F00DA +:1073E000173609F04BC081E180935700E895DD2402 +:1073F000CC24C3943FC0E090AE01F090AF01009167 +:10740000B0011091B101B6E46B16D9F4ED2DF0E0A6 +:10741000EE29FF29E4918E2FEADEDD2081F082E063 +:1074200090E0A0E0B0E0E80EF91E0A1F1B1FE092FA +:10743000AE01F092AF010093B0011093B101DC24D2 +:1074400018C0D801C701B695A7959795879555D5CA +:10745000CEDE82E090E0A0E0B0E0E80EF91E0A1F68 +:107460001B1FE092AE01F092AF010093B0011093A8 +:10747000B1012197209709F0BECF7DC08090AE0169 +:107480009090AF01A090B001B090B10196E4691660 +:1074900009F05DC083E0F40180935700E89507B6DA +:1074A00000FCFDCF54C0F6E46F1661F5772031F192 +:1074B000E090AE01F090AF010091B0011091B101E8 +:1074C0007EDED82ECC24852D90E08C299D29F701D5 +:1074D0000C0140925700E895112482E090E0A0E072 +:1074E000B0E0E80EF91E0A1F1B1FE092AE01F092F9 +:1074F000AF010093B0011093B10102C060DE582EBD +:10750000742423C0E090AE01F090AF010091B0016F +:107510001091B10116950795F794E79450DE682F06 +:10752000C701F3D48091AE019091AF01A091B00159 +:10753000B091B1010296A11DB11D8093AE0190934F +:10754000AF01A093B001B093B101219704C05524BD +:10755000772444244394209709F0A5CF96E4691634 +:1075600041F485E0F40180935700E89507B600FCEC +:10757000FDCF8DE03CDE82E080936F009CC08334C1 +:1075800071F40091AE011091AF0119DE90E021E09D +:10759000F8010C0120935700E89511247CCE833626 +:1075A00019F5E090AE01F090AF010091B00110919B +:1075B000B10105DEF701E16090E021E00C012093CC +:1075C0005700E895112482E090E0A0E0B0E0E80EDA +:1075D000F91E0A1F1B1FE092AE01F092AF0100934B +:1075E000B0011093B10157CE8D3661F4E091AE0138 +:1075F000F091AF0185E080935700E89507B600FC55 +:10760000FDCF49CE823551F4E091AE01F091AF014A +:1076100005911491812FEBDD802F4CC0843421F52E +:10762000E090AE01F090AF010091B0011091B10176 +:1076300016950795F794E794C2DD682FC70165D4C6 +:107640008091AE019091AF01A091B001B091B101D4 +:107650000296A11DB11D8093AE019093AF01A0933E +:10766000B001B093B10117CE843609F5E090AE01B8 +:10767000F090AF010091B0011091B101D801C701A4 +:10768000B695A7959795879538D4B1DD82E090E0BF +:10769000A0E0B0E0E80EF91E0A1F1B1FE092AE0149 +:1076A000F092AF010093B0011093B10104C08B318F +:1076B00011F08FE39CDD83E08093E9009091E80076 +:1076C0008091E8008E778093E80095FF04C010C099 +:1076D0008EB38823C9F08091E80080FFF9CF8091B4 +:1076E000E8008E778093E80003C08EB3882361F0B2 +:1076F0008091E80080FFF9CF84E08093E9008091D9 +:10770000E8008B778093E800DF91CF911F910F9174 +:10771000FF90EF90DF90CF90BF90AF909F908F90B1 +:107720007F906F905F904F9008959091B601892F50 +:107730008F77813249F58091B7018032A1F0813293 +:1077400019F5913A09F58091E800877F8093E80068 +:107750008DE091E067E070E007D28091E8008B77E0 +:107760008093E8000895913279F48091E800877F52 +:107770008093E8008DE091E067E070E059D280915D +:10778000E8008E778093E800089582E061EC42E0A3 +:10779000B1D083E061E842E1ADD084E060E842E14D +:1077A000A9C084B7877F84BF88E10FB6F89480931F +:1077B0006000109260000FBE20E880E090E00FB6FD +:1077C000F89420936100809361000FBE81E085BF33 +:1077D00092E095BF3F9A209A559AE1E6F0E0208327 +:1077E000108247985D9A289A109289008AEF8093B8 +:1077F000880090936F0083E080938100ECC04091FB +:10780000000850910108109201081092000824B756 +:1078100014BE88E10FB6F894809360001092600067 +:107820000FBE822F90E0FC01E270F07021FD14C0C9 +:10783000213019F4859194910BC0283069F480911E +:10784000090190910A014817590731F085919491E7 +:107850008F5F9F4F09F046DCA4DF78941092AD0152 +:107860001092AC010CC0E2DC36D38091AC01909157 +:10787000AD0181549F4110F01092140145DC8091BC +:107880001401882381F78091E00081608093E000FB +:1078900029DC80E090E00895FA01923049F09330BD +:1078A00061F09130F9F485E191E022E130E01EC011 +:1078B00087E291E02EE330E019C0882329F485E6C1 +:1078C00091E024E030E012C0813029F489E691E0B3 +:1078D00022E230E00BC0823029F48DE891E028E10B +:1078E00030E004C080E090E020E030E091838083CD +:1078F000C90108958093E9008091EB008160809335 +:10790000EB001092ED006093EC004093ED0080914D +:10791000EE00881F8827881F08958091B60188236C +:107920008CF403C08EB38823B1F08091E80082FF0D +:10793000F9CF8091E8008B778093E80008958EB3AB +:10794000882349F08091E80080FFF9CF8091E8001A +:107950008E778093E8000895EF92FF920F931F9324 +:1079600045D04CD008ED10E0F80180818F778083FE +:1079700080818068808380818F7D808319BC1EBA5E +:107980001092B40180EEE82EF12CF70180818B7FFC +:107990008083F80180818160808380E060E042E044 +:1079A000A9DFE1EEF0E080818E7F8083E2EEF0E0FF +:1079B000808181608083808188608083F7018081FD +:1079C0008E7F8083F8018081806180831F910F9179 +:1079D000FF90EF900895E7EDF0E080818160808373 +:1079E0008AE482BF81E08093B501B6CFE8EDF0E094 +:1079F00080818E7F80831092E20008951092DA00D9 +:107A00001092E10008951F920F920FB60F92112469 +:107A10002F933F934F935F936F937F938F939F9396 +:107A2000AF93BF93EF93FF938091DA0080FF1BC069 +:107A30008091D80080FF17C08091DA008E7F8093FC +:107A4000DA008091D90080FF0BC080E189BD82E11E +:107A500089BD09B400FEFDCF81E08EBB3BD203C0DF +:107A600019BC1EBA37D28091E10080FF17C0809107 +:107A7000E20080FF13C08091E2008E7F8093E200DD +:107A80008091E20080618093E2008091D800806262 +:107A90008093D80019BC85E08EBB1CD28091E10098 +:107AA00084FF2CC08091E20084FF28C080E189BD62 +:107AB00082E189BD09B400FEFDCF8091D8008F7DA1 +:107AC0008093D8008091E1008F7E8093E1008091C7 +:107AD000E2008F7E8093E2008091E20081608093DB +:107AE000E2008091B401882331F48091E30087FDA6 +:107AF00002C081E001C084E08EBBECD18091E10046 +:107B000083FF21C08091E20083FF1DC08091E100CE +:107B1000877F8093E10082E08EBB1092B401809158 +:107B2000E1008E7F8093E1008091E2008E7F809360 +:107B3000E2008091E20080618093E20080E060E0FA +:107B400042E0D8DEC7D1FF91EF91BF91AF919F91F5 +:107B50008F917F916F915F914F913F912F910F90F6 +:107B60000FBE0F901F9018959C014091BC01509141 +:107B7000BD014617570718F4F90190E044C061159C +:107B8000710511F0AB01F8CF8091E8008E778093FA +:107B9000E80040E050E0F0CF8EB3882309F444C001 +:107BA000853009F443C08091E80083FF02C081E082 +:107BB00008958091E80082FD31C08091E80080FF47 +:107BC00022C08091F3009091F200782F60E0292F7D +:107BD00030E0262B372B07C081918093F100415074 +:107BE00050402F5F3F4F4115510519F028303105A6 +:107BF00098F390E02830310509F491E08091E80095 +:107C00008E778093E8004115510531F6992321F6CE +:107C100005C08EB3882341F0853041F08091E800A3 +:107C200082FFF7CF80E0089582E0089583E0089511 +:107C30009C016115710529F48091E8008B77809390 +:107C4000E800F90126C08EB3882391F1853091F1C7 +:107C50008091E80083FF02C081E008958091E800F0 +:107C600082FFF1CF06C08091F10081936150704096 +:107C700059F02091F3008091F200322F20E090E043 +:107C8000822B932B892B79F78091E8008B77809357 +:107C9000E80061157105B9F605C08EB3882341F07F +:107CA000853041F08091E80080FFF7CF80E00895B3 +:107CB00082E0089583E008950F931F93DF93CF939D +:107CC00000D0CDB7DEB7E6EBF1E08091F100819313 +:107CD00081E0EE3BF807C9F728DD8091E80083FFDB +:107CE000E4C08091B6019091B701953009F46DC060 +:107CF000963040F4913081F1913070F0933009F07A +:107D0000D4C02AC0983009F4A3C0993009F4B2C095 +:107D1000963009F0CAC07CC0803809F4C6C08238E9 +:107D200009F0C3C08091BA0187708093E900809107 +:107D3000EB001092E9002091E800277F2093E800F3 +:107D400090E025E0969587952A95E1F781708093DC +:107D5000F1001092F10087C0882319F0823009F0F9 +:107D6000A4C08F71823009F0A0C08091B80188232F +:107D700031F52091BA01277009F497C02093E900EA +:107D80008091EB0080FF1BC0933021F48091EB00C9 +:107D9000806213C08091EB0080618093EB0081E0F2 +:107DA00090E002C0880F991F2A95E2F78093EA00BD +:107DB0001092EA008091EB0088608093EB001092B3 +:107DC000E9008091E800877F51C0882309F06DC0E9 +:107DD0001091B8011F770FB7F8948091E800877F62 +:107DE0008093E8009ADD8091E80080FFFCCF8091CD +:107DF000E3008078812B8093E30080688093E30028 +:107E0000112311F482E001C083E08EBB0FBF4DC08F +:107E10008058823008F049C08091B8019091B90132 +:107E20006091BA01AE014F5F5F4F36DDBC01009734 +:107E300009F43BC08091E800877F8093E800898146 +:107E40009A8192DE8091E8008B778093E8002DC0C4 +:107E5000803859F58091E800877F8093E800809111 +:107E6000B4018093F1008091E8008E778093E80060 +:107E700054DD1BC08823C9F49091B8019230A8F456 +:107E80008091E800877F8093E8009093B40145DDFE +:107E90008091B401882331F48091E30087FD02C012 +:107EA00081E001C084E08EBB70DC8091E80083FF3C +:107EB0000AC08091EB0080628093EB008091E80023 +:107EC000877F8093E8000F900F90CF91DF911F91F3 +:107ED0000F91089508951F938EB3882361F0109138 +:107EE000E9001092E9008091E80083FF01C0E4DE20 +:107EF00017701093E9001F910895F999FECF92BD74 +:107F000081BDF89A992780B50895262FF999FECF5B +:107F10001FBA92BD81BD20BD0FB6F894FA9AF99AA6 +:0A7F20000FBE01960895F894FFCFFC +:107F2A004341544552494E4100777700080000000A +:107F3A000000000801120110010200000841233468 +:107F4A000001000201000109023E00020100803224 +:107F5A0009040000010202010005240010010424A2 +:107F6A0002040524060001070582030800FF09042C +:107F7A000100020A000000070504021000010705BB +:107F8A008302100001040309042203410072006401 +:107F9A0000750069006E006F0020004C0065006FDC +:107FAA00006E006100720064006F00000018034157 +:107FBA000072006400750069006E006F0020004CBA +:087FCA00004C00430000000020 +:040000030000700089 +:00000001FF diff --git a/bootloaders/caterina/Caterina.c b/bootloaders/caterina/Caterina.c index 0cb9590..abcba2b 100755 --- a/bootloaders/caterina/Caterina.c +++ b/bootloaders/caterina/Caterina.c @@ -66,7 +66,7 @@ uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse uint16_t Timeout = 0; uint16_t bootKey = 0x7777; -volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0A00; +volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0800; void StartSketch(void) { @@ -106,25 +106,29 @@ void LEDPulse(void) } /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously - * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start - * the loaded application code. + * runs the bootloader processing routine until it times out or is instructed to exit. */ int main(void) { - /* Watchdog may be configured with a 15 ms period so must disable it before doing anything else */ - wdt_disable(); - - /* Check the reason for the reset and act accordingly */ + /* Save the value of the boot key memory before it is overwritten */ + uint16_t bootKeyPtrVal = *bootKeyPtr; + *bootKeyPtr = 0; + + /* Check the reason for the reset so we can act accordingly */ uint8_t mcusr_state = MCUSR; // store the initial state of the Status register MCUSR = 0; // clear all reset flags - // After a power-on reset skip the bootloader and jump straight to sketch - // if one exists. - if (mcusr_state & (1<"); Serial1.println(_usbLineInfo.lineState, HEX); if ((_usbLineInfo.lineState & 0x01) == 0) { - *(uint16_t *)0x0A00 = 0x7777; + *(uint16_t *)0x0800 = 0x7777; wdt_enable(WDTO_120MS); } else { // Most OSs do some intermediate steps when configuring ports and DTR can @@ -120,7 +119,7 @@ bool WEAK CDC_Setup(Setup& setup) wdt_disable(); wdt_reset(); - *(uint16_t *)0x0A00 = 0x0; + *(uint16_t *)0x0800 = 0x0; } } return true; -- cgit v1.2.3-18-g5258 From 764f94d0f121df3b2db3faac08097cd3975e1c23 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 11 Apr 2012 23:24:04 -0400 Subject: merged Caterina with Blink --- bootloaders/caterina/Caterina-Leonardo.hex | 1280 ++++++++++++++++++++++------ 1 file changed, 1024 insertions(+), 256 deletions(-) diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex index 19bca60..9ae1391 100644 --- a/bootloaders/caterina/Caterina-Leonardo.hex +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -1,256 +1,1024 @@ -:1070000055C000006EC000006CC000006AC00000E7 -:1070100068C0000066C0000064C0000062C00000DC -:1070200060C000005EC00000EEC400005AC0000056 -:1070300058C0000056C0000054C0000052C00000FC -:1070400050C0000078C000004CC000004AC00000E2 -:1070500048C0000046C0000044C0000042C000001C -:1070600040C000003EC000003CC000003AC000002C -:1070700038C0000036C0000034C0000032C000003C -:1070800030C000002EC000002CC000002AC000004C -:1070900028C0000026C0000024C0000022C000005C -:1070A00020C000001EC000001CC0000011241FBE34 -:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EAE261 -:1070C000FFE702C005900D92A83AB107D9F711E089 -:1070D000A8EAB1E001C01D92AE3BB107E1F78FD342 -:1070E00022C78ECFF89410926F00109281001092F8 -:1070F00085001092840081E085BF15BE47985D9A97 -:10710000289A0C94000008952091B2013091B301A7 -:107110002F5F3F4F3093B3012093B201932F37FF7E -:1071200003C08EEF831B982F990F921710F4479886 -:107130000895479A08951F920F920FB60F92112447 -:107140002F938F939F93EF93FF931092850010924C -:1071500084008091A8019091A901009741F00197C6 -:107160009093A9018093A801892B09F45D9A8091DD -:10717000AA019091AB01009741F001979093AB0168 -:107180008093AA01892B09F4289AE0E0F0E0859128 -:1071900094918F5F9F4F49F08091AC019091AD0128 -:1071A00001969093AD018093AC01FF91EF919F9177 -:1071B0008F912F910F900FBE0F901F90189584E024 -:1071C0008093E9000DC08091E8008B778093E80000 -:1071D00003C08EB3882351F08091E80082FFF9CF7D -:1071E0008091E80085FFEFCF8091F1000895982FFE -:1071F00083E08093E9008091E80085FD0DC08091D7 -:10720000E8008E778093E80003C08EB3882369F08E -:107210008091E80080FFF9CF9093F1005D9884E6BB -:1072200090E09093A9018093A80108954F925F92F6 -:107230006F927F928F929F92AF92BF92CF92DF9286 -:10724000EF92FF920F931F93CF93DF9384E080938D -:10725000E9008091E80082FF57C2289884E690E018 -:107260009093AB018093AA01AADF182F853481F493 -:107270008CE49DE19093AD018093AC0107B600FCD6 -:10728000FDCFF999FECF81E180935700E89503C0C7 -:10729000843519F494DF8DE00DC28C34E1F3803530 -:1072A000D1F3843721F484E4A2DF80E003C2813685 -:1072B00011F489E5FFC18134B1F481DF182F7FDF3C -:1072C00090E0880F991FAA2797FDA095BA2F312F1C -:1072D000330F20E0442737FD4095542F822B932B0A -:1072E000A42BB52BB8C1803711F483E5E3C18335F6 -:1072F00049F4C0E0D1E089917ADF21E0C730D207BC -:10730000D1F7D9C1863521F481E371DF80E3D2C1A1 -:10731000833731F487E86BDF85E969DF8EE1CAC125 -:107320008536B9F4E0E0F0E093E085E09093570013 -:10733000E89507B600FCFDCF80935700E89507B6A7 -:1073400000FCFDCFE058FF4FA0E7E030FA0771F7EF -:10735000A2CF823739F4E1E0F0E089E08093570072 -:107360008491A8C1863439F4E0E0F0E089E08093AC -:10737000570084919FC18E3439F4E3E0F0E089E056 -:1073800080935700849196C1813539F4E2E0F0E0B2 -:1073900089E08093570084918DC1823631F489E56C -:1073A00026DF80E024DF80E885C1823419F087364B -:1073B00009F0E5C01092AD011092AC0100DF082F7A -:1073C000FEDEF82EFCDE682E8554823008F071C196 -:1073D000902F80E0CF2DD0E0C82BD92B10926F00DA -:1073E000173609F04BC081E180935700E895DD2402 -:1073F000CC24C3943FC0E090AE01F090AF01009167 -:10740000B0011091B101B6E46B16D9F4ED2DF0E0A6 -:10741000EE29FF29E4918E2FEADEDD2081F082E063 -:1074200090E0A0E0B0E0E80EF91E0A1F1B1FE092FA -:10743000AE01F092AF010093B0011093B101DC24D2 -:1074400018C0D801C701B695A7959795879555D5CA -:10745000CEDE82E090E0A0E0B0E0E80EF91E0A1F68 -:107460001B1FE092AE01F092AF010093B0011093A8 -:10747000B1012197209709F0BECF7DC08090AE0169 -:107480009090AF01A090B001B090B10196E4691660 -:1074900009F05DC083E0F40180935700E89507B6DA -:1074A00000FCFDCF54C0F6E46F1661F5772031F192 -:1074B000E090AE01F090AF010091B0011091B101E8 -:1074C0007EDED82ECC24852D90E08C299D29F701D5 -:1074D0000C0140925700E895112482E090E0A0E072 -:1074E000B0E0E80EF91E0A1F1B1FE092AE01F092F9 -:1074F000AF010093B0011093B10102C060DE582EBD -:10750000742423C0E090AE01F090AF010091B0016F -:107510001091B10116950795F794E79450DE682F06 -:10752000C701F3D48091AE019091AF01A091B00159 -:10753000B091B1010296A11DB11D8093AE0190934F -:10754000AF01A093B001B093B101219704C05524BD -:10755000772444244394209709F0A5CF96E4691634 -:1075600041F485E0F40180935700E89507B600FCEC -:10757000FDCF8DE03CDE82E080936F009CC08334C1 -:1075800071F40091AE011091AF0119DE90E021E09D -:10759000F8010C0120935700E89511247CCE833626 -:1075A00019F5E090AE01F090AF010091B00110919B -:1075B000B10105DEF701E16090E021E00C012093CC -:1075C0005700E895112482E090E0A0E0B0E0E80EDA -:1075D000F91E0A1F1B1FE092AE01F092AF0100934B -:1075E000B0011093B10157CE8D3661F4E091AE0138 -:1075F000F091AF0185E080935700E89507B600FC55 -:10760000FDCF49CE823551F4E091AE01F091AF014A -:1076100005911491812FEBDD802F4CC0843421F52E -:10762000E090AE01F090AF010091B0011091B10176 -:1076300016950795F794E794C2DD682FC70165D4C6 -:107640008091AE019091AF01A091B001B091B101D4 -:107650000296A11DB11D8093AE019093AF01A0933E -:10766000B001B093B10117CE843609F5E090AE01B8 -:10767000F090AF010091B0011091B101D801C701A4 -:10768000B695A7959795879538D4B1DD82E090E0BF -:10769000A0E0B0E0E80EF91E0A1F1B1FE092AE0149 -:1076A000F092AF010093B0011093B10104C08B318F -:1076B00011F08FE39CDD83E08093E9009091E80076 -:1076C0008091E8008E778093E80095FF04C010C099 -:1076D0008EB38823C9F08091E80080FFF9CF8091B4 -:1076E000E8008E778093E80003C08EB3882361F0B2 -:1076F0008091E80080FFF9CF84E08093E9008091D9 -:10770000E8008B778093E800DF91CF911F910F9174 -:10771000FF90EF90DF90CF90BF90AF909F908F90B1 -:107720007F906F905F904F9008959091B601892F50 -:107730008F77813249F58091B7018032A1F0813293 -:1077400019F5913A09F58091E800877F8093E80068 -:107750008DE091E067E070E007D28091E8008B77E0 -:107760008093E8000895913279F48091E800877F52 -:107770008093E8008DE091E067E070E059D280915D -:10778000E8008E778093E800089582E061EC42E0A3 -:10779000B1D083E061E842E1ADD084E060E842E14D -:1077A000A9C084B7877F84BF88E10FB6F89480931F -:1077B0006000109260000FBE20E880E090E00FB6FD -:1077C000F89420936100809361000FBE81E085BF33 -:1077D00092E095BF3F9A209A559AE1E6F0E0208327 -:1077E000108247985D9A289A109289008AEF8093B8 -:1077F000880090936F0083E080938100ECC04091FB -:10780000000850910108109201081092000824B756 -:1078100014BE88E10FB6F894809360001092600067 -:107820000FBE822F90E0FC01E270F07021FD14C0C9 -:10783000213019F4859194910BC0283069F480911E -:10784000090190910A014817590731F085919491E7 -:107850008F5F9F4F09F046DCA4DF78941092AD0152 -:107860001092AC010CC0E2DC36D38091AC01909157 -:10787000AD0181549F4110F01092140145DC8091BC -:107880001401882381F78091E00081608093E000FB -:1078900029DC80E090E00895FA01923049F09330BD -:1078A00061F09130F9F485E191E022E130E01EC011 -:1078B00087E291E02EE330E019C0882329F485E6C1 -:1078C00091E024E030E012C0813029F489E691E0B3 -:1078D00022E230E00BC0823029F48DE891E028E10B -:1078E00030E004C080E090E020E030E091838083CD -:1078F000C90108958093E9008091EB008160809335 -:10790000EB001092ED006093EC004093ED0080914D -:10791000EE00881F8827881F08958091B60188236C -:107920008CF403C08EB38823B1F08091E80082FF0D -:10793000F9CF8091E8008B778093E80008958EB3AB -:10794000882349F08091E80080FFF9CF8091E8001A -:107950008E778093E8000895EF92FF920F931F9324 -:1079600045D04CD008ED10E0F80180818F778083FE -:1079700080818068808380818F7D808319BC1EBA5E -:107980001092B40180EEE82EF12CF70180818B7FFC -:107990008083F80180818160808380E060E042E044 -:1079A000A9DFE1EEF0E080818E7F8083E2EEF0E0FF -:1079B000808181608083808188608083F7018081FD -:1079C0008E7F8083F8018081806180831F910F9179 -:1079D000FF90EF900895E7EDF0E080818160808373 -:1079E0008AE482BF81E08093B501B6CFE8EDF0E094 -:1079F00080818E7F80831092E20008951092DA00D9 -:107A00001092E10008951F920F920FB60F92112469 -:107A10002F933F934F935F936F937F938F939F9396 -:107A2000AF93BF93EF93FF938091DA0080FF1BC069 -:107A30008091D80080FF17C08091DA008E7F8093FC -:107A4000DA008091D90080FF0BC080E189BD82E11E -:107A500089BD09B400FEFDCF81E08EBB3BD203C0DF -:107A600019BC1EBA37D28091E10080FF17C0809107 -:107A7000E20080FF13C08091E2008E7F8093E200DD -:107A80008091E20080618093E2008091D800806262 -:107A90008093D80019BC85E08EBB1CD28091E10098 -:107AA00084FF2CC08091E20084FF28C080E189BD62 -:107AB00082E189BD09B400FEFDCF8091D8008F7DA1 -:107AC0008093D8008091E1008F7E8093E1008091C7 -:107AD000E2008F7E8093E2008091E20081608093DB -:107AE000E2008091B401882331F48091E30087FDA6 -:107AF00002C081E001C084E08EBBECD18091E10046 -:107B000083FF21C08091E20083FF1DC08091E100CE -:107B1000877F8093E10082E08EBB1092B401809158 -:107B2000E1008E7F8093E1008091E2008E7F809360 -:107B3000E2008091E20080618093E20080E060E0FA -:107B400042E0D8DEC7D1FF91EF91BF91AF919F91F5 -:107B50008F917F916F915F914F913F912F910F90F6 -:107B60000FBE0F901F9018959C014091BC01509141 -:107B7000BD014617570718F4F90190E044C061159C -:107B8000710511F0AB01F8CF8091E8008E778093FA -:107B9000E80040E050E0F0CF8EB3882309F444C001 -:107BA000853009F443C08091E80083FF02C081E082 -:107BB00008958091E80082FD31C08091E80080FF47 -:107BC00022C08091F3009091F200782F60E0292F7D -:107BD00030E0262B372B07C081918093F100415074 -:107BE00050402F5F3F4F4115510519F028303105A6 -:107BF00098F390E02830310509F491E08091E80095 -:107C00008E778093E8004115510531F6992321F6CE -:107C100005C08EB3882341F0853041F08091E800A3 -:107C200082FFF7CF80E0089582E0089583E0089511 -:107C30009C016115710529F48091E8008B77809390 -:107C4000E800F90126C08EB3882391F1853091F1C7 -:107C50008091E80083FF02C081E008958091E800F0 -:107C600082FFF1CF06C08091F10081936150704096 -:107C700059F02091F3008091F200322F20E090E043 -:107C8000822B932B892B79F78091E8008B77809357 -:107C9000E80061157105B9F605C08EB3882341F07F -:107CA000853041F08091E80080FFF7CF80E00895B3 -:107CB00082E0089583E008950F931F93DF93CF939D -:107CC00000D0CDB7DEB7E6EBF1E08091F100819313 -:107CD00081E0EE3BF807C9F728DD8091E80083FFDB -:107CE000E4C08091B6019091B701953009F46DC060 -:107CF000963040F4913081F1913070F0933009F07A -:107D0000D4C02AC0983009F4A3C0993009F4B2C095 -:107D1000963009F0CAC07CC0803809F4C6C08238E9 -:107D200009F0C3C08091BA0187708093E900809107 -:107D3000EB001092E9002091E800277F2093E800F3 -:107D400090E025E0969587952A95E1F781708093DC -:107D5000F1001092F10087C0882319F0823009F0F9 -:107D6000A4C08F71823009F0A0C08091B80188232F -:107D700031F52091BA01277009F497C02093E900EA -:107D80008091EB0080FF1BC0933021F48091EB00C9 -:107D9000806213C08091EB0080618093EB0081E0F2 -:107DA00090E002C0880F991F2A95E2F78093EA00BD -:107DB0001092EA008091EB0088608093EB001092B3 -:107DC000E9008091E800877F51C0882309F06DC0E9 -:107DD0001091B8011F770FB7F8948091E800877F62 -:107DE0008093E8009ADD8091E80080FFFCCF8091CD -:107DF000E3008078812B8093E30080688093E30028 -:107E0000112311F482E001C083E08EBB0FBF4DC08F -:107E10008058823008F049C08091B8019091B90132 -:107E20006091BA01AE014F5F5F4F36DDBC01009734 -:107E300009F43BC08091E800877F8093E800898146 -:107E40009A8192DE8091E8008B778093E8002DC0C4 -:107E5000803859F58091E800877F8093E800809111 -:107E6000B4018093F1008091E8008E778093E80060 -:107E700054DD1BC08823C9F49091B8019230A8F456 -:107E80008091E800877F8093E8009093B40145DDFE -:107E90008091B401882331F48091E30087FD02C012 -:107EA00081E001C084E08EBB70DC8091E80083FF3C -:107EB0000AC08091EB0080628093EB008091E80023 -:107EC000877F8093E8000F900F90CF91DF911F91F3 -:107ED0000F91089508951F938EB3882361F0109138 -:107EE000E9001092E9008091E80083FF01C0E4DE20 -:107EF00017701093E9001F910895F999FECF92BD74 -:107F000081BDF89A992780B50895262FF999FECF5B -:107F10001FBA92BD81BD20BD0FB6F894FA9AF99AA6 -:0A7F20000FBE01960895F894FFCFFC -:107F2A004341544552494E4100777700080000000A -:107F3A000000000801120110010200000841233468 -:107F4A000001000201000109023E00020100803224 -:107F5A0009040000010202010005240010010424A2 -:107F6A0002040524060001070582030800FF09042C -:107F7A000100020A000000070504021000010705BB -:107F8A008302100001040309042203410072006401 -:107F9A0000750069006E006F0020004C0065006FDC -:107FAA00006E006100720064006F00000018034157 -:107FBA000072006400750069006E006F0020004CBA -:087FCA00004C00430000000020 -:040000030000700089 -:00000001FF +:200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 +:200020000C9496010C9496010C941B050C94A6050C9496010C9496010C9496010C9496016B +:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B201CC +:200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 +:200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 +:2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 +:2000C00028002B002E003100000000002300260029002C002F00040404040403040502027D +:2000E0000202040302020202060606060606040402020204040802011040804010204080A8 +:200100004080080204018040201002011080102040400000000200080E0000030401000BB2 +:200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD +:200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC +:200160006E006F0020004C004C004300120100020000004041233480000101020001120122 +:200180000002020000404123348000010102000100C18081C1080B00020202010009040054 +:2001A000000102020000052400100105240101010424020605240600010705810310004094 +:2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 +:2001E000008501050919012903150025019503750181029501750581030501093009310943 +:20020000381581257F750895038106C0C005010906A1018502050719E029E715002501754D +:20022000019508810295017508810395067508150025650507190029658100C0090402004C +:2002400001030000000921010100012265000705840340000100000000000000002A2B2895 +:200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 +:20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 +:2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C +:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000057043907370811241FBE15 +:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EEF2E102C005900D92AA32B107D9F711E06B +:20030000AAE2B1E001C01D92AB39B107E1F712E0CCEDD2E004C02297FE010E946C09C63DE9 +:20032000D107C9F70E9491030C9470090C9400008DE061E00E945E0368EE73E080E090E00C +:200340000E94FA018DE060E00E945E0368EE73E080E090E00E94FA0108958DE061E00E944D +:20036000C10208951F920F920FB60F9211242F933F938F939F93AF93BF9380912E01909153 +:200380002F01A0913001B0913101309132010196A11DB11D232F2D5F2D3720F02D570196D4 +:2003A000A11DB11D2093320180932E0190932F01A0933001B093310180912A0190912B01D4 +:2003C000A0912C01B0912D010196A11DB11D80932A0190932B01A0932C01B0932D01BF917F +:2003E000AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F89480912A012F +:2004000090912B01A0912C01B0912D0166B5A89B05C06F3F19F00196A11DB11D7FBFBA2F9E +:20042000A92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC012DC0FA +:20044000FFB7F89480912A0190912B01A0912C01B0912D01E6B5A89B05C0EF3F19F0019693 +:20046000A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FBB1F70 +:20048000EA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105410538 +:2004A000510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816085BD64 +:2004C000EEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F0E005 +:2004E000808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0808178 +:2005000082608083808181608083E0E9F0E080818160808320EC30E0F90180818068808391 +:2005200080818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E0808184608083A0 +:20054000808182608083808181608083E3ECF0E0808181608083F9018081826080838C914F +:2005600081608C93EAE7F0E08081846080838081826080838081816080838081806880833B +:200580000895CF93DF93482F50E0CA018C509F4FFC0134914A525F4FFA018491882369F18D +:2005A00090E0880F991FFC01E455FF4FA591B491FC01E654FF4FC591D491662351F42FB789 +:2005C000F8948C91932F909589238C93888189230BC0623061F42FB7F8948C91932F9095E3 +:2005E00089238C938881832B88832FBF06C09FB7F8948C91832B8C939FBFDF91CF91089523 +:200600008730C1F1883080F48330F9F0843030F4813029F1823009F050C024C08430C9F0FA +:20062000863009F04AC022C08A3091F18B3030F4883031F1893009F040C026C08C3091F154 +:200640008C3060F18E30C9F533C0809180008F7703C0809180008F7D80938000089584B5BE +:200660008F7702C084B58F7D84BD08958091B0008F7703C08091B0008F7D8093B0000895D8 +:20068000809190008F7707C0809190008F7D03C080919000877F8093900008958091C000C4 +:2006A0008F7703C08091C0008F7D8093C00008958091C200877F8093C2000895FF920F93A6 +:2006C0001F93F62E482F50E0CA018E5E9E4FFC012491CA018C509F4FFC0114914A525F4FC6 +:2006E000FA0104910023C9F0222319F0822F0E940003E02FF0E0EE0FFF1FE654FF4FA59132 +:20070000B4919FB7F894FF2021F48C911095812302C08C91812B8C939FBF1F910F91FF9031 +:200720000895CF93DF930E9453028BE391E00E9458040E94AD01C0E0D0E00E9498012097E2 +:20074000E1F30E940000F9CF282F809135018823C1F057FF1AC015C0289890933401809133 +:20076000F1008193E217F307B9F74115510539F08091F200882319F48BE68093E800AFBF67 +:2007800002C04FEF5FEFCA010895AFB7F89427702093E9008091F200282F30E0241735079D +:2007A0000CF4A901FB019B01240F311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F6A +:2007C00041E050E00E94A403019719F02FEF3FEF03C08981282F30E0C9010F90CF91DF9125 +:2007E0000895FF920F931F93F82E142F052F4091380150913901212F302FC901DC01FB0163 +:200800006EEF29C0F7FE02C0949101C09081209136013091370124173507ACF48091E800F3 +:200820008570E1F38091E80082FF03C02FEF3FEF17C09093F100C90101968F739070892B64 +:2008400011F46093E8002F5F3F4F3093370120933601119731961097A9F6812F902F9C01F6 +:20086000C9011F910F91FF9008959C018091E80082FFFCCFF901260F311D03C08091F1000E +:200880008193E217F307D1F7289884E6809334018BEF8093E800CB0108958093E90080912C +:2008A000F200882319F08AE38093E800089508951092350181E08093D70080EA8093D80078 +:2008C00082E189BD09B400FEFDCF61E070E080E090E00E94FA0180E98093D8008CE0809317 +:2008E000E2001092E000559A209A08955F926F927F928F929F92AF92BF92CF92DF92EF9214 +:20090000FF920F931F93CF93DF93E82E842E752E80913501882371F18B01242F352FC90152 +:20092000EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3FE +:20094000632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FD02C020E0EE +:2009600004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E03E +:2009800090E00E94FA013BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900C0 +:2009A000A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922F10C0C80107 +:2009C000322F06C0FC010196E491E093F10031503323C1F706C081918093F100915099237B +:2009E000D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E8004FBF209790 +:200A000009F0A5CF5D9884E680933301282D372DC9019C01C901DF91CF911F910F91FF902A +:200A2000EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB60F92112406 +:200A40001F932F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E1001092D8 +:200A6000E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED0010923501C8 +:200A800088E08093F00092FF36C083E08093E9008091F200882349F08AE38093E80005C0F1 +:200AA00080E891E00E947C0701C012E09FB7F8941093E9008091F2009FBF882389F780917A +:200AC0003301882351F08091330181508093330180913301882309F45D9A809134018823C4 +:200AE00051F08091340181508093340180913401882309F4289AFF91EF91BF91AF919F91D6 +:200B00008F917F916F915F914F913F912F911F910F900FBE0F901F9018950F931F93DF9368 +:200B2000CF930F92CDB7DEB719828E010F5F1F4FC8010E949B07C8010E943409898190E064 +:200B40000F90CF91DF911F910F9108951F920F920FB60F921124EF92FF921F932F933F93F4 +:200B60004F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB76197DEBF0F +:200B8000CDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C08091F1008193A1 +:200BA000E217F307D1F7289884E68093340182EF8093E800998197FF05C08091E80080FFAF +:200BC000FCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C08A81882329F4E5 +:200BE0001092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F48091E80080FF4E +:200C0000FCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230C1F51092E900A4 +:200C2000109237011092360110923901109238010E948D0599E0FE013996DF01292F1D92E8 +:200C40002A95E9F799871A8791E09E8790E8988B9AEF998B2091360130913701275F3F4F61 +:200C60003C872B878D871092E9001092370110923601F0923901E092380180E0BF0149E0FD +:200C800050E00E94F1030E948D0585C01092E9001092370110923601F0923901E092380170 +:200CA000123241F482E290E00E942C09892B09F476C071C0113079F488E0E816F10419F4E2 +:200CC00081E080933A0180913A01882309F06BC0ECE6F1E013C0133009F061C08B818823C0 +:200CE00019F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F053C0E4E5F1E0449180E8CE +:200D0000BF0150E00E94F10346C0873009F447C0883021F481E08093F1003DC08930D9F5D6 +:200D200023703070232BD9F5E1E9F1E091E031E026E39093E9003093EB0084918093EC0070 +:200D40002093ED009F5F3196953099F78EE78093EA001092EA008B81809335011CC08F819A +:200D600098851092E900109237011092360190933901809338018D81882329F4CE01019633 +:200D80000E94A70706C0823051F4CE0101960E94FD07882321F08EEF8093E80007C081E2DC +:200DA0008093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF91AF919F9195 +:200DC0008F917F916F915F914F913F912F911F91FF90EF900F900FBE0F901F9018952091AD +:200DE0007C0130917D0180917E0190917F01281B390B2F733070C901089520917C013091E7 +:200E00007D0180917E0190917F012817390719F42FEF3FEF09C0E0917E01F0917F01E45C51 +:200E2000FE4F8081282F30E0C901089520917C0130917D0180917E0190917F012817390779 +:200E400019F42FEF3FEF13C0E0917E01F0917F01E45CFE4F208180917E0190917F0101967F +:200E60008F73907090937F0180937E0130E0C9010895109283011092820188EE93E0A0E010 +:200E8000B0E08093840190938501A0938601B09387018EE091E09093810180938001089547 +:200EA0000F931F93DF93CF930F92CDB7DEB78C01698380910701882369F083E0BE016F5FCA +:200EC0007F4F41E050E00E9476041816190614F49C0107C081E090E0F8019383828320E039 +:200EE00030E0C9010F90CF91DF911F910F91089583E00E944D04089582E00E94D803482F73 +:200F000020917C0130917D012F5F3F4F2F73307080917E0190917F012817390759F0E0919C +:200F20007C01F0917D01E45CFE4F408330937D0120937C010895FC0180818E5F808380E881 +:200F400065E971E042E450E00E94F1030895FC0181819081913A59F4813209F04CC080E029 +:200F600060E071E047E050E00E94F10342C0913209F041C0803239F480E091E067E070E0ED +:200F80000E94350436C0823209F035C08281809307018091000190910101A0910201B09116 +:200FA0000301805B9440A040B04019F58091070180FD12C087E797E7909301088093000805 +:200FC0002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093B2 +:200FE0006000109260000FBEA895109201081092000881E0089580E00895FC019181808125 +:20100000813A31F4913089F080E0933089F40DC0813269F49B3021F482818093080105C075 +:201020009A3029F482818093090181E0089580E00895EF92FF920F931F938C01E62EDC01CA +:20104000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D0995C9 +:201060008F2D90E01F910F91FF90EF90089510928E01109292011092910180E291E09093B9 +:20108000900180938F010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0178 +:2010A00084E0BE016F5F7F4F41E050E00E94760484E4B801A7010E9476040F90CF91DF91B0 +:2010C0001F910F91FF90EF90089582E048E050E00E9444080895FC01168217821086118675 +:2010E0001286138614823496BF010E9465080895DC01683810F0685829C0E62FF0E067FF82 +:2011000013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314963E +:201120002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9135 +:2011400014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F319678 +:201160009630B1F7CD011496BD010E94650821E030E0C9010895CF93DF93DC01683810F0F3 +:20118000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149641 +:2011A0002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496A0 +:2011C0008C911497826014968C9314976F7716968C9116978617A9F117968C911797861749 +:2011E00081F118968C911897861759F119968C911997861731F11A968C911A97861709F1CC +:201200001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C004 +:201220009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E018 +:2012400007C0CD011496BD010E94650821E030E0C901DF91CF91089580E867ED71E045E602 +:2012600050E00E94F1030895FC0180818F5F808380E86CE372E049E150E00E94F103089586 +:20128000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D91DA +:2012A0006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F764 +:2012C000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994C7 +:2012E000F894FFCF00E100000000000001010000000050074009EF061607FD0678077C07FA +:201300000000000019084009BB0878086B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20138000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:2013A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:2013C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2013E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:20140000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20142000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20144000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20146000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20148000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:2014A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2014C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2014E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:20150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20152000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20154000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20156000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20158000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:2015A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2015C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2015E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:20160000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20162000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20164000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20166000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20168000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:2016A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:2016C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2016E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:20170000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20172000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20174000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20176000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20178000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:2017A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2017C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2017E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:20180000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20182000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20184000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:2018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:2018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:20190000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:20192000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20194000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20196000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20198000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:2019A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:2019C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:201A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:201A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:201A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:201A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:201A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:201AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:201AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:201AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:201B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:201B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:201B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:201B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:201B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:201BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:201BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:201BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:201C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:201C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:201C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:201C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:201C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:201CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:201CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:201CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:201D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:201D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:201D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:201D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:201D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:201DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:201DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:201DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:201E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:201E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:201E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:201E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:201E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:201EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:201EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:201EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:201F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:201F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:201F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:201F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:201F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:201FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:201FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:201FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:20200000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20202000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20204000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20206000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20208000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:2020A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2020C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2020E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:20210000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20212000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20214000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20216000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20218000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:2021A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2021C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2021E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:20220000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20222000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20224000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20226000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20228000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:2022A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:2022C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2022E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:20230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20232000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20234000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20236000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20238000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:2023A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:2023C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2023E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:20240000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20242000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20244000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20246000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20248000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:2024A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2024C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2024E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:20250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20252000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20254000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20256000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20258000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:2025A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2025C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2025E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:20260000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20264000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20266000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20268000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:2026A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2026C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2026E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:20270000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20272000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20274000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20276000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20278000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:2027A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2027C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2027E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:20280000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20282000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20284000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20286000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20288000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:2028A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:2028C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2028E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:20290000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:20292000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20294000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20296000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20298000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:2029A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:2029C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2029E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:202A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:202A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:202A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:202A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:202A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:202AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:202AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:202AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:202B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:202B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:202B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:202B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:202B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:202BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:202BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:202BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:202C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:202C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:202C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:202C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:202C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:202CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:202CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:202CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:202D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:202D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:202D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:202D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:202D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:202DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:202DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:202DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:202E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:202E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:202E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:20300000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20302000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20304000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20306000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20308000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:2030A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:2030C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2030E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:20310000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20312000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20314000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20316000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20318000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:2031A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2031C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2031E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:20320000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20322000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20324000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20326000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20328000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:2032A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2032C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2032E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:20330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20332000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20334000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20336000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20338000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:2033A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2033C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2033E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:20340000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20342000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20344000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20346000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20348000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:2034A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2034C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2034E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:20350000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20352000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20354000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20356000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20358000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:2035A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2035C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2035E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:20360000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20362000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20364000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20366000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20368000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:2036A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2036C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2036E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:20370000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20372000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20374000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20376000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20378000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:2037A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2037C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2037E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:20380000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20382000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20384000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20388000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:2038A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2038C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:2038E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:20390000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:20392000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20394000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20396000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20398000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:2039A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2039C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:2039E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:203A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:203A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:203A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:203A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:203A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:203AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:203AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:203AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:203B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:203B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:203B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:203B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:203B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:203BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:203BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:203BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:203C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:203C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:203C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:203C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:203C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:203CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:203CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:203CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:203D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:203D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:203D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:203D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:203D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:203DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:203DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:203DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:203E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:203E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:203E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:203E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:203E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:203EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:203EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:203EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:203F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:203F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:203F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:203F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:203F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:203FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:203FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:203FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:20400000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20402000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20404000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20406000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20408000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2040A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2040C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:2040E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:20410000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20412000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20414000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20416000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20418000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2041A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2041C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:2041E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20420000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20422000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20424000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20426000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20428000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:2042A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2042C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:2042E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:20430000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20432000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20434000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20436000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20438000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:2043A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2043C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:2043E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:20440000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20442000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20444000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20446000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20448000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:2044A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2044C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:2044E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:20450000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20452000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20454000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20456000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20458000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:2045A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2045C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:2045E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:20460000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20462000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20464000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20466000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20468000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:2046A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2046C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:2046E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:20470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20472000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20474000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20476000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20478000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:2047A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2047C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:2047E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:20480000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20482000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20484000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20486000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20488000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:2048A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2048C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:2048E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:20490000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:20492000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20494000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20496000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20498000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:2049A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2049C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:2049E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:204A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:204A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:204A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:204A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:204A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:204AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:204AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:204AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:204B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:204B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:204B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:204B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:204B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:204BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:204BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:204BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:204C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:204C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:204C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:204C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:204C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:204CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:204CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:204CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:204D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:204D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:204D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:204D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:204D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:204DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:204DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:204DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:204E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:204E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:204E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:204E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:204E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:204EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:204EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:204EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:204F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:204F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:204F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:204F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:204F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:204FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:204FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:204FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:20500000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:20502000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:20504000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:20506000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:20508000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:2050A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:2050C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:2050E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:20510000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:20512000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:20514000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:20516000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:20518000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:2051A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:2051C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:2051E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:20520000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:20522000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:20524000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:20526000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:20528000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:2052A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:2052C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:2052E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:20530000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:20532000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:20534000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:20536000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:20538000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:2053A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:2053C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:2053E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:20540000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:20542000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:20544000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:20546000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:20548000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:2054A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:2054C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:2054E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:20550000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:20552000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:20554000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:20556000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:20558000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:2055A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:2055C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:2055E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:20560000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:20562000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:20564000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:20566000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:20568000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:2056A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:2056C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:2056E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:20570000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:20572000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:20574000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:20576000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:20578000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:2057A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:2057C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:2057E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:20580000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:20582000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:20584000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:20586000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:20588000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:2058A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:2058C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:2058E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:20590000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:20592000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:20594000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:20596000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:20598000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:2059A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:2059C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:2059E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:205A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:205A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:205A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:205A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:205A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:205AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:205AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:205AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:205B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:205B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:205B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:205B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:205B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:205BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:205BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:205BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:205C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:205C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:205C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:205C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:205C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:205CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:205CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:205CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:205D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:205D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:205D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:205D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:205D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:205DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:205DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:205DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:205E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:205E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:205E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:205E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:205E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:205EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:205EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:205EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:205F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:205F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:205F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:205F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:205F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:205FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:205FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:205FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:20600000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20602000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:20604000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:20606000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:20608000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:2060A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:2060C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:2060E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:20610000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20612000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:20614000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:20616000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:20618000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2061A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:2061C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:2061E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20620000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20622000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:20624000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:20626000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:20628000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:2062A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:2062C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:2062E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:20630000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:20632000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:20634000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:20636000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:20638000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:2063A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:2063C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:2063E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:20640000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:20642000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:20644000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:20646000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:20648000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:2064A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:2064C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:2064E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:20650000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:20652000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:20654000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:20656000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:20658000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:2065A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:2065C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:2065E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:20660000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:20662000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:20664000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:20666000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:20668000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:2066A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:2066C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:2066E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:20670000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:20672000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:20674000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:20676000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:20678000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:2067A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:2067C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:2067E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:20680000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:20682000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:20684000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:20686000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:20688000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:2068A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:2068C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:2068E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:20690000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:20692000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:20694000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:20696000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:20698000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:2069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:2069C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:2069E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:206A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:206A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:206A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:206A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:206A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:206AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:206AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:206AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:206B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:206B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:206B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:206B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:206B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:206BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:206BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:206BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:206C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:206C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:206C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:206C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:206C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:206CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:206CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:206CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:206D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:206D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:206D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:206D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:206D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:206DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:206DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:206DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:206E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:206E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:206E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:206E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:206E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:206EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:206EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:206EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:206F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:206F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:206F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:206F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:206F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:206FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:206FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:206FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:2070000055C000006EC000006CC000006AC0000068C0000066C0000064C0000062C0000043 +:2070200060C000005EC00000EEC400005AC0000058C0000056C0000054C0000052C00000F2 +:2070400050C0000078C000004CC000004AC0000048C0000046C0000044C0000042C00000BE +:2070600040C000003EC000003CC000003AC0000038C0000036C0000034C0000032C0000048 +:2070800030C000002EC000002CC000002AC0000028C0000026C0000024C0000022C00000A8 +:2070A00020C000001EC000001CC0000011241FBECFEFDAE0DEBFCDBF11E0A0E0B1E0EAE2B5 +:2070C000FFE702C005900D92A83AB107D9F711E0A8EAB1E001C01D92AE3BB107E1F78FD30B +:2070E00022C78ECFF89410926F0010928100109285001092840081E085BF15BE47985D9AEF +:20710000289A0C94000008952091B2013091B3012F5F3F4F3093B3012093B201932F37FFA6 +:2071200003C08EEF831B982F990F921710F447980895479A08951F920F920FB60F9211246E +:207140002F938F939F93EF93FF9310928500109284008091A8019091A901009741F00197D3 +:207160009093A9018093A801892B09F45D9A8091AA019091AB01009741F001979093AB0126 +:207180008093AA01892B09F4289AE0E0F0E0859194918F5F9F4F49F08091AC019091AD0151 +:2071A00001969093AD018093AC01FF91EF919F918F912F910F900FBE0F901F90189584E0BC +:2071C0008093E9000DC08091E8008B778093E80003C08EB3882351F08091E80082FFF9CFBE +:2071E0008091E80085FFEFCF8091F1000895982F83E08093E9008091E80085FD0DC0809136 +:20720000E8008E778093E80003C08EB3882369F08091E80080FFF9CF9093F1005D9884E6CB +:2072200090E09093A9018093A80108954F925F926F927F928F929F92AF92BF92CF92DF921E +:20724000EF92FF920F931F93CF93DF9384E08093E9008091E80082FF57C2289884E690E067 +:207260009093AB018093AA01AADF182F853481F48CE49DE19093AD018093AC0107B600FC4B +:20728000FDCFF999FECF81E180935700E89503C0843519F494DF8DE00DC28C34E1F38035F9 +:2072A000D1F3843721F484E4A2DF80E003C2813611F489E5FFC18134B1F481DF182F7FDFE3 +:2072C00090E0880F991FAA2797FDA095BA2F312F330F20E0442737FD4095542F822B932B68 +:2072E000A42BB52BB8C1803711F483E5E3C1833549F4C0E0D1E089917ADF21E0C730D20714 +:20730000D1F7D9C1863521F481E371DF80E3D2C1833731F487E86BDF85E969DF8EE1CAC149 +:207320008536B9F4E0E0F0E093E085E090935700E89507B600FCFDCF80935700E89507B65D +:2073400000FCFDCFE058FF4FA0E7E030FA0771F7A2CF823739F4E1E0F0E089E08093570024 +:207360008491A8C1863439F4E0E0F0E089E08093570084919FC18E3439F4E3E0F0E089E0E5 +:2073800080935700849196C1813539F4E2E0F0E089E08093570084918DC1823631F489E521 +:2073A00026DF80E024DF80E885C1823419F0873609F0E5C01092AD011092AC0100DF082FE8 +:2073C000FEDEF82EFCDE682E8554823008F071C1902F80E0CF2DD0E0C82BD92B10926F00B3 +:2073E000173609F04BC081E180935700E895DD24CC24C3943FC0E090AE01F090AF010091CC +:20740000B0011091B101B6E46B16D9F4ED2DF0E0EE29FF29E4918E2FEADEDD2081F082E08D +:2074200090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B101DC2470 +:2074400018C0D801C701B695A7959795879555D5CEDE82E090E0A0E0B0E0E80EF91E0A1FF6 +:207460001B1FE092AE01F092AF010093B0011093B1012197209709F0BECF7DC08090AE01F5 +:207480009090AF01A090B001B090B10196E4691609F05DC083E0F40180935700E89507B63E +:2074A00000FCFDCF54C0F6E46F1661F5772031F1E090AE01F090AF010091B0011091B1019E +:2074C0007EDED82ECC24852D90E08C299D29F7010C0140925700E895112482E090E0A0E08B +:2074E000B0E0E80EF91E0A1F1B1FE092AE01F092AF010093B0011093B10102C060DE582E1A +:20750000742423C0E090AE01F090AF010091B0011091B10116950795F794E79450DE682FFA +:20752000C701F3D48091AE019091AF01A091B001B091B1010296A11DB11D8093AE0190934D +:20754000AF01A093B001B093B101219704C05524772444244394209709F0A5CF96E46916B6 +:2075600041F485E0F40180935700E89507B600FCFDCF8DE03CDE82E080936F009CC0833492 +:2075800071F40091AE011091AF0119DE90E021E0F8010C0120935700E89511247CCE8336C8 +:2075A00019F5E090AE01F090AF010091B0011091B10105DEF701E16090E021E00C0120938C +:2075C0005700E895112482E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE01F092AF0100936A +:2075E000B0011093B10157CE8D3661F4E091AE01F091AF0185E080935700E89507B600FCF2 +:20760000FDCF49CE823551F4E091AE01F091AF0105911491812FEBDD802F4CC0843421F5FE +:20762000E090AE01F090AF010091B0011091B10116950795F794E794C2DD682FC70165D4E2 +:207640008091AE019091AF01A091B001B091B1010296A11DB11D8093AE019093AF01A093D8 +:20766000B001B093B10117CE843609F5E090AE01F090AF010091B0011091B101D801C70142 +:20768000B695A7959795879538D4B1DD82E090E0A0E0B0E0E80EF91E0A1F1B1FE092AE010E +:2076A000F092AF010093B0011093B10104C08B3111F08FE39CDD83E08093E9009091E8002B +:2076C0008091E8008E778093E80095FF04C010C08EB38823C9F08091E80080FFF9CF809193 +:2076E000E8008E778093E80003C08EB3882361F08091E80080FFF9CF84E08093E9008091F1 +:20770000E8008B778093E800DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F90AC +:207720007F906F905F904F9008959091B601892F8F77813249F58091B7018032A1F081328A +:2077400019F5913A09F58091E800877F8093E8008DE091E067E070E007D28091E8008B770F +:207760008093E8000895913279F48091E800877F8093E8008DE091E067E070E059D2809196 +:20778000E8008E778093E800089582E061EC42E0B1D083E061E842E1ADD084E060E842E1F7 +:2077A000A9C084B7877F84BF88E10FB6F89480936000109260000FBE20E880E090E00FB643 +:2077C000F89420936100809361000FBE81E085BF92E095BF3F9A209A559AE1E6F0E02083A1 +:2077E000108247985D9A289A109289008AEF8093880090936F0083E080938100ECC040911A +:20780000000850910108109201081092000824B714BE88E10FB6F894809360001092600045 +:207820000FBE822F90E0FC01E270F07021FD14C0213019F4859194910BC0283069F480918F +:20784000090190910A014817590731F0859194918F5F9F4F09F046DCA4DF78941092AD0101 +:207860001092AC010CC0E2DC36D38091AC019091AD0181549F4110F01092140145DC8091FB +:207880001401882381F78091E00081608093E00029DC80E090E00895FA01923049F09330C0 +:2078A00061F09130F9F485E191E022E130E01EC087E291E02EE330E019C0882329F485E6FA +:2078C00091E024E030E012C0813029F489E691E022E230E00BC0823029F48DE891E028E106 +:2078E00030E004C080E090E020E030E091838083C90108958093E9008091EB00816080936A +:20790000EB001092ED006093EC004093ED008091EE00881F8827881F08958091B601882342 +:207920008CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093E80008958EB361 +:20794000882349F08091E80080FFF9CF8091E8008E778093E8000895EF92FF920F931F9307 +:2079600045D04CD008ED10E0F80180818F77808380818068808380818F7D808319BC1EBA45 +:207980001092B40180EEE82EF12CF70180818B7F8083F80180818160808380E060E042E049 +:2079A000A9DFE1EEF0E080818E7F8083E2EEF0E0808181608083808188608083F701808125 +:2079C0008E7F8083F8018081806180831F910F91FF90EF900895E7EDF0E080818160808335 +:2079E0008AE482BF81E08093B501B6CFE8EDF0E080818E7F80831092E20008951092DA00D6 +:207A00001092E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F9389 +:207A2000AF93BF93EF93FF938091DA0080FF1BC08091D80080FF17C08091DA008E7F80930F +:207A4000DA008091D90080FF0BC080E189BD82E189BD09B400FEFDCF81E08EBB3BD203C0C7 +:207A600019BC1EBA37D28091E10080FF17C08091E20080FF13C08091E2008E7F8093E200CE +:207A80008091E20080618093E2008091D80080628093D80019BC85E08EBB1CD28091E10004 +:207AA00084FF2CC08091E20084FF28C080E189BD82E189BD09B400FEFDCF8091D8008F7D2D +:207AC0008093D8008091E1008F7E8093E1008091E2008F7E8093E2008091E20081608093EC +:207AE000E2008091B401882331F48091E30087FD02C081E001C084E08EBBECD18091E10056 +:207B000083FF21C08091E20083FF1DC08091E100877F8093E10082E08EBB1092B4018091B1 +:207B2000E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E20080E060E005 +:207B400042E0D8DEC7D1FF91EF91BF91AF919F918F917F916F915F914F913F912F910F90B6 +:207B60000FBE0F901F9018959C014091BC015091BD014617570718F4F90190E044C06115C8 +:207B8000710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8EB3882309F444C006 +:207BA000853009F443C08091E80083FF02C081E008958091E80082FD31C08091E80080FFF4 +:207BC00022C08091F3009091F200782F60E0292F30E0262B372B07C081918093F10041503C +:207BE00050402F5F3F4F4115510519F02830310598F390E02830310509F491E08091E800A6 +:207C00008E778093E8004115510531F6992321F605C08EB3882341F0853041F08091E800FD +:207C200082FFF7CF80E0089582E0089583E008959C016115710529F48091E8008B7780934D +:207C4000E800F90126C08EB3882391F1853091F18091E80083FF02C081E008958091E80083 +:207C600082FFF1CF06C08091F10081936150704059F02091F3008091F200322F20E090E0C5 +:207C8000822B932B892B79F78091E8008B778093E80061157105B9F605C08EB3882341F0E2 +:207CA000853041F08091E80080FFF7CF80E0089582E0089583E008950F931F93DF93CF937C +:207CC00000D0CDB7DEB7E6EBF1E08091F100819381E0EE3BF807C9F728DD8091E80083FF3A +:207CE000E4C08091B6019091B701953009F46DC0963040F4913081F1913070F0933009F046 +:207D0000D4C02AC0983009F4A3C0993009F4B2C0963009F0CAC07CC0803809F4C6C082380B +:207D200009F0C3C08091BA0187708093E9008091EB001092E9002091E800277F2093E800A7 +:207D400090E025E0969587952A95E1F781708093F1001092F10087C0882319F0823009F0A2 +:207D6000A4C08F71823009F0A0C08091B801882331F52091BA01277009F497C02093E90006 +:207D80008091EB0080FF1BC0933021F48091EB00806213C08091EB0080618093EB0081E0C8 +:207DA00090E002C0880F991F2A95E2F78093EA001092EA008091EB0088608093EB0010929D +:207DC000E9008091E800877F51C0882309F06DC01091B8011F770FB7F8948091E800877F98 +:207DE0008093E8009ADD8091E80080FFFCCF8091E3008078812B8093E30080688093E30062 +:207E0000112311F482E001C083E08EBB0FBF4DC08058823008F049C08091B8019091B9014F +:207E20006091BA01AE014F5F5F4F36DDBC01009709F43BC08091E800877F8093E800898128 +:207E40009A8192DE8091E8008B778093E8002DC0803859F58091E800877F8093E8008091A3 +:207E6000B4018093F1008091E8008E778093E80054DD1BC08823C9F49091B8019230A8F4A4 +:207E80008091E800877F8093E8009093B40145DD8091B401882331F48091E30087FD02C01E +:207EA00081E001C084E08EBB70DC8091E80083FF0AC08091EB0080628093EB008091E8008D +:207EC000877F8093E8000F900F90CF91DF911F910F91089508951F938EB3882361F0109179 +:207EE000E9001092E9008091E80083FF01C0E4DE17701093E9001F910895F999FECF92BD02 +:207F000081BDF89A992780B50895262FF999FECF1FBA92BD81BD20BD0FB6F894FA9AF99A90 +:207F20000FBE01960895F894FFCF4341544552494E4100777700080000000000000801128E +:207F4000011001020000084123340001000201000109023E0002010080320904000001025A +:207F60000201000524001001042402040524060001070582030800FF09040100020A0000B4 +:207F8000000705040210000107058302100001040309042203410072006400750069006E80 +:207FA000006F0020004C0065006F006E006100720064006F00000018034100720064007557 +:127FC0000069006E006F0020004C004C0043000000006E +:00000001FF -- cgit v1.2.3-18-g5258 From 56ddc4637de1b8b0e21840519ed0b94966395ff5 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 19 Apr 2012 15:46:32 -0400 Subject: bugfix for boards with a timer 4 but no channel D compilation failed for Mega because the COM4D1 and OCR4D registers are defined for 32U4 but not for Mega --- cores/arduino/wiring_analog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c index 40a3363..c06cad4 100644 --- a/cores/arduino/wiring_analog.c +++ b/cores/arduino/wiring_analog.c @@ -230,7 +230,7 @@ void analogWrite(uint8_t pin, int val) break; #endif - #if defined(TCCR4C) + #if defined(TCCR4C) && defined(COM4D1) case TIMER4D: // connect pwm to pin on timer 4, channel D sbi(TCCR4C, COM4D1); -- cgit v1.2.3-18-g5258 From 6ae1a1723561266767ed1ba39ae61c35ea263162 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Thu, 19 Apr 2012 15:52:16 -0400 Subject: bugfix for configuring PWM on D6 and D13 too early. (thanks to Limor Fried) was starting PWM on these pins too soon - in init() instead of when analogWrite() was called. as a result doing output on port registers directly failed. --- cores/arduino/wiring.c | 4 ---- cores/arduino/wiring_analog.c | 6 ++++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c index fb447eb..ac8bb6f 100644 --- a/cores/arduino/wiring.c +++ b/cores/arduino/wiring.c @@ -280,10 +280,6 @@ void init() #endif #if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */ - sbi(TCCR4A, COM4A1); // clear channel A on output compare match - cbi(TCCR4A, COM4A0); - sbi(TCCR4C, COM4D1); // clear channel D on output compare match - cbi(TCCR4C, COM4D0); sbi(TCCR4B, CS42); // set timer4 prescale factor to 64 sbi(TCCR4B, CS41); sbi(TCCR4B, CS40); diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c index c06cad4..0e9881f 100644 --- a/cores/arduino/wiring_analog.c +++ b/cores/arduino/wiring_analog.c @@ -210,6 +210,9 @@ void analogWrite(uint8_t pin, int val) case TIMER4A: //connect pwm to pin on timer 4, channel A sbi(TCCR4A, COM4A1); + #if defined(COM4A0) // only used on 32U4 + cbi(TCCR4A, COM4A0); + #endif OCR4A = val; // set pwm duty break; #endif @@ -234,6 +237,9 @@ void analogWrite(uint8_t pin, int val) case TIMER4D: // connect pwm to pin on timer 4, channel D sbi(TCCR4C, COM4D1); + #if defined(COM4D0) // only used on 32U4 + cbi(TCCR4C, COM4D0); + #endif OCR4D = val; // set pwm duty break; #endif -- cgit v1.2.3-18-g5258 From d755d0035d4e3a816c127fd8207722bfe6629eee Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Wed, 25 Apr 2012 15:56:18 -0400 Subject: changed PID values for Leonardo bootloader and sketch done to avoid driver problems for users who installed the pre-release bootloader and driver --- boards.txt | 2 +- bootloaders/caterina/Caterina-Leonardo.hex | 272 ++++++++++++++--------------- bootloaders/caterina/Descriptors.c | 6 +- bootloaders/caterina/Makefile | 4 +- cores/arduino/USBCore.cpp | 4 +- 5 files changed, 146 insertions(+), 142 deletions(-) diff --git a/boards.txt b/boards.txt index 26c9477..638eb4a 100644 --- a/boards.txt +++ b/boards.txt @@ -161,7 +161,7 @@ leonardo.bootloader.lock_bits=0x2F leonardo.build.mcu=atmega32u4 leonardo.build.f_cpu=16000000L leonardo.build.vid=0x2341 -leonardo.build.pid=0x8034 +leonardo.build.pid=0x8036 leonardo.build.core=arduino leonardo.build.variant=leonardo diff --git a/bootloaders/caterina/Caterina-Leonardo.hex b/bootloaders/caterina/Caterina-Leonardo.hex index 9ae1391..de7b53c 100644 --- a/bootloaders/caterina/Caterina-Leonardo.hex +++ b/bootloaders/caterina/Caterina-Leonardo.hex @@ -1,6 +1,6 @@ :200000000C946E010C9496010C9496010C9496010C9496010C9496010C9496010C94960150 -:200020000C9496010C9496010C941B050C94A6050C9496010C9496010C9496010C9496016B -:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B201CC +:200020000C9496010C9496010C9410050C949B050C9496010C9496010C9496010C94960181 +:200040000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C94B501C9 :200060000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601C8 :200080000C9496010C9496010C9496010C9496010C9496010C9496010C9496010C949601A8 :2000A0000C9496010C9496010C94960100000000240027002A002D003000000000002500A4 @@ -9,8 +9,8 @@ :200100004080080204018040201002011080102040400000000200080E0000030401000BB2 :200120000000070605040100080A0B0C0D09040309042203410072006400750069006E00CD :200140006F0020004C0065006F006E006100720064006F00180341007200640075006900CC -:200160006E006F0020004C004C004300120100020000004041233480000101020001120122 -:200180000002020000404123348000010102000100C18081C1080B00020202010009040054 +:200160006E006F0020004C004C004300120100020000004041233680000101020001120120 +:200180000002020000404123368000010102000100C18081C1080B00020202010009040052 :2001A000000102020000052400100105240101010424020605240600010705810310004094 :2001C00009040100020A000000070502024000000705830240000005010902A1010901A186 :2001E000008501050919012903150025019503750181029501750581030501093009310943 @@ -20,137 +20,137 @@ :200260000000000000000000000000000000000000000000002C9EB4A0A1A2A434A6A7A553 :20028000AE362D3738271E1F20212223242526B333B62EB7B89F8485868788898A8B8C8D58 :2002A0008E8F909192939495969798999A9B9C9D2F3130A3AD350405060708090A0B0C0D7C -:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B5000057043907370811241FBE15 -:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EEF2E102C005900D92AA32B107D9F711E06B -:20030000AAE2B1E001C01D92AB39B107E1F712E0CCEDD2E004C02297FE010E946C09C63DE9 -:20032000D107C9F70E9491030C9470090C9400008DE061E00E945E0368EE73E080E090E00C -:200340000E94FA018DE060E00E945E0368EE73E080E090E00E94FA0108958DE061E00E944D -:20036000C10208951F920F920FB60F9211242F933F938F939F93AF93BF9380912E01909153 -:200380002F01A0913001B0913101309132010196A11DB11D232F2D5F2D3720F02D570196D4 -:2003A000A11DB11D2093320180932E0190932F01A0933001B093310180912A0190912B01D4 -:2003C000A0912C01B0912D010196A11DB11D80932A0190932B01A0932C01B0932D01BF917F -:2003E000AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB7F89480912A012F -:2004000090912B01A0912C01B0912D0166B5A89B05C06F3F19F00196A11DB11D7FBFBA2F9E -:20042000A92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A95D1F7BC012DC0FA -:20044000FFB7F89480912A0190912B01A0912C01B0912D01E6B5A89B05C0EF3F19F0019693 -:20046000A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880F991FAA1FBB1F70 -:20048000EA95D1F7861B970B885E9340C8F2215030404040504068517C4F21153105410538 -:2004A000510571F60895789484B5826084BD84B5816084BD85B5826085BD85B5816085BD64 -:2004C000EEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F0E005 -:2004E000808181608083E1EBF0E0808184608083E0EBF0E0808181608083E1E9F0E0808178 -:2005000082608083808181608083E0E9F0E080818160808320EC30E0F90180818068808391 -:2005200080818F7B8083A2ECB0E08C9188608C938C918B7F8C93E1ECF0E0808184608083A0 -:20054000808182608083808181608083E3ECF0E0808181608083F9018081826080838C914F -:2005600081608C93EAE7F0E08081846080838081826080838081816080838081806880833B -:200580000895CF93DF93482F50E0CA018C509F4FFC0134914A525F4FFA018491882369F18D -:2005A00090E0880F991FFC01E455FF4FA591B491FC01E654FF4FC591D491662351F42FB789 -:2005C000F8948C91932F909589238C93888189230BC0623061F42FB7F8948C91932F9095E3 -:2005E00089238C938881832B88832FBF06C09FB7F8948C91832B8C939FBFDF91CF91089523 -:200600008730C1F1883080F48330F9F0843030F4813029F1823009F050C024C08430C9F0FA -:20062000863009F04AC022C08A3091F18B3030F4883031F1893009F040C026C08C3091F154 -:200640008C3060F18E30C9F533C0809180008F7703C0809180008F7D80938000089584B5BE -:200660008F7702C084B58F7D84BD08958091B0008F7703C08091B0008F7D8093B0000895D8 -:20068000809190008F7707C0809190008F7D03C080919000877F8093900008958091C000C4 -:2006A0008F7703C08091C0008F7D8093C00008958091C200877F8093C2000895FF920F93A6 -:2006C0001F93F62E482F50E0CA018E5E9E4FFC012491CA018C509F4FFC0114914A525F4FC6 -:2006E000FA0104910023C9F0222319F0822F0E940003E02FF0E0EE0FFF1FE654FF4FA59132 -:20070000B4919FB7F894FF2021F48C911095812302C08C91812B8C939FBF1F910F91FF9031 -:200720000895CF93DF930E9453028BE391E00E9458040E94AD01C0E0D0E00E9498012097E2 -:20074000E1F30E940000F9CF282F809135018823C1F057FF1AC015C0289890933401809133 -:20076000F1008193E217F307B9F74115510539F08091F200882319F48BE68093E800AFBF67 -:2007800002C04FEF5FEFCA010895AFB7F89427702093E9008091F200282F30E0241735079D -:2007A0000CF4A901FB019B01240F311D94E6DACFDF93CF930F92CDB7DEB7BE016F5F7F4F6A -:2007C00041E050E00E94A403019719F02FEF3FEF03C08981282F30E0C9010F90CF91DF9125 -:2007E0000895FF920F931F93F82E142F052F4091380150913901212F302FC901DC01FB0163 -:200800006EEF29C0F7FE02C0949101C09081209136013091370124173507ACF48091E800F3 -:200820008570E1F38091E80082FF03C02FEF3FEF17C09093F100C90101968F739070892B64 -:2008400011F46093E8002F5F3F4F3093370120933601119731961097A9F6812F902F9C01F6 -:20086000C9011F910F91FF9008959C018091E80082FFFCCFF901260F311D03C08091F1000E -:200880008193E217F307D1F7289884E6809334018BEF8093E800CB0108958093E90080912C -:2008A000F200882319F08AE38093E800089508951092350181E08093D70080EA8093D80078 -:2008C00082E189BD09B400FEFDCF61E070E080E090E00E94FA0180E98093D8008CE0809317 -:2008E000E2001092E000559A209A08955F926F927F928F929F92AF92BF92CF92DF92EF9214 -:20090000FF920F931F93CF93DF93E82E842E752E80913501882371F18B01242F352FC90152 -:20092000EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E2A42EB12CA822B9223AE3FE -:20094000632E20E4C22ED12CC822D92258C09FB7F8949092E9008091E80085FD02C020E0EE -:2009600004C08091F200252D281B9FBF222361F4FA9419F42FEF3FEF4DC061E070E080E03E -:2009800090E00E94FA013BC0822F90E0C817D9070CF42C2FC21BD1094FB7F8949092E900C0 -:2009A000A114B10421F406C01092F10021502223D9F719C0E7FC03C0F801922F10C0C80107 -:2009C000322F06C0FC010196E491E093F10031503323C1F706C081918093F100915099237B -:2009E000D1F7020F111D8091E80085FF05C0209729F4C114D10411F06092E8004FBF209790 -:200A000009F0A5CF5D9884E680933301282D372DC9019C01C901DF91CF911F910F91FF902A -:200A2000EF90DF90CF90BF90AF909F908F907F906F905F9008951F920F920FB60F92112406 -:200A40001F932F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E1001092D8 -:200A6000E100982F83FF0FC01092E90081E08093EB001092EC0082E38093ED0010923501C8 -:200A800088E08093F00092FF36C083E08093E9008091F200882349F08AE38093E80005C0F1 -:200AA00080E891E00E947C0701C012E09FB7F8941093E9008091F2009FBF882389F780917A -:200AC0003301882351F08091330181508093330180913301882309F45D9A809134018823C4 -:200AE00051F08091340181508093340180913401882309F4289AFF91EF91BF91AF919F91D6 -:200B00008F917F916F915F914F913F912F911F910F900FBE0F901F9018950F931F93DF9368 -:200B2000CF930F92CDB7DEB719828E010F5F1F4FC8010E949B07C8010E943409898190E064 -:200B40000F90CF91DF911F910F9108951F920F920FB60F921124EF92FF921F932F933F93F4 -:200B60004F935F936F937F938F939F93AF93BF93EF93FF93DF93CF93CDB7DEB76197DEBF0F -:200B8000CDBF1092E9008091E80083FF0FC1FE0131969E01275F3F4F03C08091F1008193A1 -:200BA000E217F307D1F7289884E68093340182EF8093E800998197FF05C08091E80080FFAF -:200BC000FCCF03C08EEF8093E800292F30E0C90180769070892B09F0C2C08A81882329F4E5 -:200BE0001092F1001092F100D6C0813009F4D3C0833009F4D0C0853049F48091E80080FF4E -:200C0000FCCF8B8180688093E300C5C0863009F07CC01C81EF80F8841230C1F51092E900A4 -:200C2000109237011092360110923901109238010E948D0599E0FE013996DF01292F1D92E8 -:200C40002A95E9F799871A8791E09E8790E8988B9AEF998B2091360130913701275F3F4F61 -:200C60003C872B878D871092E9001092370110923601F0923901E092380180E0BF0149E0FD -:200C800050E00E94F1030E948D0585C01092E9001092370110923601F0923901E092380170 -:200CA000123241F482E290E00E942C09892B09F476C071C0113079F488E0E816F10419F4E2 -:200CC00081E080933A0180913A01882309F06BC0ECE6F1E013C0133009F061C08B818823C0 -:200CE00019F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F053C0E4E5F1E0449180E8CE -:200D0000BF0150E00E94F10346C0873009F447C0883021F481E08093F1003DC08930D9F5D6 -:200D200023703070232BD9F5E1E9F1E091E031E026E39093E9003093EB0084918093EC0070 -:200D40002093ED009F5F3196953099F78EE78093EA001092EA008B81809335011CC08F819A -:200D600098851092E900109237011092360190933901809338018D81882329F4CE01019633 -:200D80000E94A70706C0823051F4CE0101960E94FD07882321F08EEF8093E80007C081E2DC -:200DA0008093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91FF91EF91BF91AF919F9195 -:200DC0008F917F916F915F914F913F912F911F91FF90EF900F900FBE0F901F9018952091AD -:200DE0007C0130917D0180917E0190917F01281B390B2F733070C901089520917C013091E7 -:200E00007D0180917E0190917F012817390719F42FEF3FEF09C0E0917E01F0917F01E45C51 -:200E2000FE4F8081282F30E0C901089520917C0130917D0180917E0190917F012817390779 -:200E400019F42FEF3FEF13C0E0917E01F0917F01E45CFE4F208180917E0190917F0101967F -:200E60008F73907090937F0180937E0130E0C9010895109283011092820188EE93E0A0E010 -:200E8000B0E08093840190938501A0938601B09387018EE091E09093810180938001089547 -:200EA0000F931F93DF93CF930F92CDB7DEB78C01698380910701882369F083E0BE016F5FCA -:200EC0007F4F41E050E00E9476041816190614F49C0107C081E090E0F8019383828320E039 -:200EE00030E0C9010F90CF91DF911F910F91089583E00E944D04089582E00E94D803482F73 -:200F000020917C0130917D012F5F3F4F2F73307080917E0190917F012817390759F0E0919C -:200F20007C01F0917D01E45CFE4F408330937D0120937C010895FC0180818E5F808380E881 -:200F400065E971E042E450E00E94F1030895FC0181819081913A59F4813209F04CC080E029 -:200F600060E071E047E050E00E94F10342C0913209F041C0803239F480E091E067E070E0ED -:200F80000E94350436C0823209F035C08281809307018091000190910101A0910201B09116 -:200FA0000301805B9440A040B04019F58091070180FD12C087E797E7909301088093000805 -:200FC0002BE088E190E00FB6F894A895809360000FBE209360000DC088E10FB6F8948093B2 -:200FE0006000109260000FBEA895109201081092000881E0089580E00895FC019181808125 -:20100000813A31F4913089F080E0933089F40DC0813269F49B3021F482818093080105C075 -:201020009A3029F482818093090181E0089580E00895EF92FF920F931F938C01E62EDC01CA -:20104000ED91FC910480F581E02D0995F82ED801ED91FC910680F781E02DC8016E2D0995C9 -:201060008F2D90E01F910F91FF90EF90089510928E01109292011092910180E291E09093B9 -:20108000900180938F010895EF92FF920F931F93DF93CF930F92CDB7DEB789838B017A0178 -:2010A00084E0BE016F5F7F4F41E050E00E94760484E4B801A7010E9476040F90CF91DF91B0 -:2010C0001F910F91FF90EF90089582E048E050E00E9444080895FC01168217821086118675 -:2010E0001286138614823496BF010E9465080895DC01683810F0685829C0E62FF0E067FF82 -:2011000013C0E058F04081E090E002C0880F991FEA95E2F7809514962C911497282314963E -:201120002C93149760E012C0EB5AFD4F6491662319F420E030E01DC067FF08C014968C9135 -:2011400014978D7F14968C9314976F77FD0190E0662321F08681861709F416829F5F319678 -:201160009630B1F7CD011496BD010E94650821E030E0C9010895CF93DF93DC01683810F0F3 -:20118000685825C0E62FF0E067FF12C0E058F04081E090E002C0880F991FEA95E2F7149641 -:2011A0002C911497282B14962C93149760E00FC0EB5AFD4F64916623D9F167FF08C01496A0 -:2011C0008C911497826014968C9314976F7716968C9116978617A9F117968C911797861749 -:2011E00081F118968C911897861759F119968C911997861731F11A968C911A97861709F1CC -:201200001B968C911B978617E1F0ED01E0E0F0E09E2F8E81882321F4EA0FFB1F668306C004 -:201220009F5F31962196E630F10591F7963049F481E090E013969C938E93129720E030E018 -:2012400007C0CD011496BD010E94650821E030E0C901DF91CF91089580E867ED71E045E602 -:2012600050E00E94F1030895FC0180818F5F808380E86CE372E049E150E00E94F103089586 -:20128000CF92DF92EF92FF920F931F93CF93DF937C016B018A01C0E0D0E00FC0D6016D91DA -:2012A0006D01D701ED91FC910190F081E02DC7010995C80FD91F015010400115110571F764 -:2012C000CE01DF91CF911F910F91FF90EF90DF90CF900895EE0FFF1F0590F491E02D0994C7 -:2012E000F894FFCF00E100000000000001010000000050074009EF061607FD0678077C07FA -:201300000000000019084009BB0878086B08FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:2002C0000E0F101112131415161718191A1B1C1DAFB1B0B500004C042E072C0811241FBE36 +:2002E000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEECF2E102C005900D92AC32B107D9F711E061 +:20030000ACE2B1E001C01D92AD39B107E1F712E0CCEDD2E004C02297FE010E946109C63DF0 +:20032000D107C9F70E9486030C9465090C9400008091000161E00E94530364E873E080E002 +:2003400090E00E94FD018091000160E00E9453036CE474E080E090E00E94FD010895809181 +:20036000000161E00E94B60208951F920F920FB60F9211242F933F938F939F93AF93BF93DB +:200380008091300190913101A0913201B0913301309134010196A11DB11D232F2D5F2D3794 +:2003A00020F02D570196A11DB11D209334018093300190933101A0933201B0933301809117 +:2003C0002C0190912D01A0912E01B0912F010196A11DB11D80932C0190932D01A0932E01BA +:2003E000B0932F01BF91AF919F918F913F912F910F900FBE0F901F9018959B01AC017FB734 +:20040000F89480912C0190912D01A0912E01B0912F0166B5A89B05C06F3F19F00196A11DC3 +:20042000B11D7FBFBA2FA92F982F8827860F911DA11DB11D62E0880F991FAA1FBB1F6A9577 +:20044000D1F7BC012DC0FFB7F89480912C0190912D01A0912E01B0912F01E6B5A89B05C0E7 +:20046000EF3F19F00196A11DB11DFFBFBA2FA92F982F88278E0F911DA11DB11DE2E0880FFD +:20048000991FAA1FBB1FEA95D1F7861B970B885E9340C8F2215030404040504068517C4F8F +:2004A000211531054105510571F60895789484B5826084BD84B5816084BD85B5826085BD0F +:2004C00085B5816085BDEEE6F0E0808181608083E1E8F0E010828081826080838081816043 +:2004E0008083E0E8F0E0808181608083E1EBF0E0808184608083E0EBF0E080818160808378 +:20050000E1E9F0E0808182608083808181608083E0E9F0E0808181608083E1ECF0E080815A +:2005200084608083808182608083808181608083E3ECF0E0808181608083E0ECF0E08081E8 +:2005400082608083E2ECF0E0808181608083EAE7F0E08081846080838081826080838081C3 +:20056000816080838081806880830895CF93DF93482F50E0CA018C509F4FFC0134914A52A0 +:200580005F4FFA018491882369F190E0880F991FFC01E455FF4FA591B491FC01E654FF4F55 +:2005A000C591D491662351F42FB7F8948C91932F909589238C93888189230BC0623061F40A +:2005C0002FB7F8948C91932F909589238C938881832B88832FBF06C09FB7F8948C91832BB7 +:2005E0008C939FBFDF91CF9108958730C1F1883080F48330F9F0843030F4813029F182308B +:2006000009F050C024C08430C9F0863009F04AC022C08A3091F18B3030F4883031F1893037 +:2006200009F040C026C08C3091F18C3060F18E30C9F533C0809180008F7703C08091800036 +:200640008F7D80938000089584B58F7702C084B58F7D84BD08958091B0008F7703C080919F +:20066000B0008F7D8093B0000895809190008F7707C0809190008F7D03C080919000877FD9 +:200680008093900008958091C0008F7703C08091C0008F7D8093C00008958091C200877F5A +:2006A0008093C2000895FF920F931F93F62E482F50E0CA018E5E9E4FFC012491CA018C501B +:2006C0009F4FFC0114914A525F4FFA0104910023C9F0222319F0822F0E94F502E02FF0E05D +:2006E000EE0FFF1FE654FF4FA591B4919FB7F894FF2021F48C911095812302C08C91812BD5 +:200700008C939FBF1F910F91FF900895CF93DF930E9456028DE391E00E944D040E94AF01EC +:20072000C0E0D0E00E9498012097E1F30E940000F9CF282F809137018823C1F057FF1AC00D +:2007400015C02898909336018091F1008193E217F307B9F74115510539F08091F20088236E +:2007600019F48BE68093E800AFBF02C04FEF5FEFCA010895AFB7F89427702093E9008091A6 +:20078000F200282F30E0241735070CF4A901FB019B01240F311D94E6DACFDF93CF930F922E +:2007A000CDB7DEB7BE016F5F7F4F41E050E00E949903019719F02FEF3FEF03C08981282F25 +:2007C00030E0C9010F90CF91DF910895FF920F931F93F82E142F052F40913A0150913B0188 +:2007E000212F302FC901DC01FB016EEF29C0F7FE02C0949101C090812091380130913901CE +:2008000024173507ACF48091E8008570E1F38091E80082FF03C02FEF3FEF17C09093F1008B +:20082000C90101968F739070892B11F46093E8002F5F3F4F3093390120933801119731964D +:200840001097A9F6812F902F9C01C9011F910F91FF9008959C018091E80082FFFCCFF90124 +:20086000260F311D03C08091F1008193E217F307D1F7289884E6809336018BEF8093E80078 +:20088000CB0108958093E9008091F200882319F08AE38093E800089508951092370181E05F +:2008A0008093D70080EA8093D80082E189BD09B400FEFDCF61E070E080E090E00E94FD01C8 +:2008C00080E98093D8008CE08093E2001092E000559A209A08955F926F927F928F929F9246 +:2008E000AF92BF92CF92DF92EF92FF920F931F93CF93DF93E82E842E752E809137018823FB +:2009000071F18B01242F352FC901EC017AEFF72E67E0962E9E2050E4552E8E2D90E040E220 +:20092000A42EB12CA822B9223AE3632E20E4C22ED12CC822D92258C09FB7F8949092E900DA +:200940008091E80085FD02C020E004C08091F200252D281B9FBF222361F4FA9419F42FEF4D +:200960003FEF4DC061E070E080E090E00E94FD013BC0822F90E0C817D9070CF42C2FC21B28 +:20098000D1094FB7F8949092E900A114B10421F406C01092F10021502223D9F719C0E7FCC6 +:2009A00003C0F801922F10C0C801322F06C0FC010196E491E093F10031503323C1F706C038 +:2009C00081918093F10091509923D1F7020F111D8091E80085FF05C0209729F4C114D1049D +:2009E00011F06092E8004FBF209709F0A5CF5D9884E680933501282D372DC9019C01C90158 +:200A0000DF91CF911F910F91FF90EF90DF90CF90BF90AF909F908F907F906F905F90089564 +:200A20001F920F920FB60F9211241F932F933F934F935F936F937F938F939F93AF93BF93B3 +:200A4000EF93FF938091E1001092E100982F83FF0FC01092E90081E08093EB001092EC007D +:200A600082E38093ED001092370188E08093F00092FF36C083E08093E9008091F200882338 +:200A800049F08AE38093E80005C082E891E00E94710701C012E09FB7F8941093E9008091C9 +:200AA000F2009FBF882389F780913501882351F08091350181508093350180913501882335 +:200AC00009F45D9A80913601882351F08091360181508093360180913601882309F4289AD9 +:200AE000FF91EF91BF91AF919F918F917F916F915F914F913F912F911F910F900FBE0F90DB +:200B00001F9018950F931F93DF93CF930F92CDB7DEB719828E010F5F1F4FC8010E9490078F +:200B2000C8010E942909898190E00F90CF91DF911F910F9108951F920F920FB60F92112455 +:200B4000EF92FF921F932F933F934F935F936F937F938F939F93AF93BF93EF93FF93DF93E7 +:200B6000CF93CDB7DEB76197DEBFCDBF1092E9008091E80083FF0FC1FE0131969E01275F18 +:200B80003F4F03C08091F1008193E217F307D1F7289884E68093360182EF8093E800998139 +:200BA00097FF05C08091E80080FFFCCF03C08EEF8093E800292F30E0C90180769070892B80 +:200BC00009F0C2C08A81882329F41092F1001092F100D6C0813009F4D3C0833009F4D0C08A +:200BE000853049F48091E80080FFFCCF8B8180688093E300C5C0863009F07CC01C81EF805A +:200C0000F8841230C1F51092E900109239011092380110923B0110923A010E94820599E0C1 +:200C2000FE013996DF01292F1D922A95E9F799871A8791E09E8790E8988B9AEF998B209110 +:200C4000380130913901275F3F4F3C872B878D871092E9001092390110923801F0923B01C3 +:200C6000E0923A0180E0BF0149E050E00E94E6030E94820585C01092E9001092390110924C +:200C80003801F0923B01E0923A01123241F482E290E00E942109892B09F476C071C011303E +:200CA00079F488E0E816F10419F481E080933C0180913C01882309F06BC0ECE6F1E013C01B +:200CC000133009F061C08B81882319F4EEE2F1E00AC0823019F4E2E3F1E005C0813009F0C4 +:200CE00053C0E4E5F1E0449180E8BF0150E00E94E60346C0873009F447C0883021F481E0A0 +:200D00008093F1003DC08930D9F523703070232BD9F5E1E9F1E091E031E026E39093E900CA +:200D20003093EB0084918093EC002093ED009F5F3196953099F78EE78093EA001092EA0039 +:200D40008B81809337011CC08F8198851092E900109239011092380190933B0180933A0144 +:200D60008D81882329F4CE0101960E949C0706C0823051F4CE0101960E94F207882321F078 +:200D80008EEF8093E80007C081E28093EB0003C0EEE7F1E0A8CF6196DEBFCDBFCF91DF91E3 +:200DA000FF91EF91BF91AF919F918F917F916F915F914F913F912F911F91FF90EF900F9076 +:200DC0000FBE0F901F90189520917E0130917F018091800190918101281B390B2F733070DC +:200DE000C901089520917E0130917F0180918001909181012817390719F42FEF3FEF09C045 +:200E0000E0918001F0918101E25CFE4F8081282F30E0C901089520917E0130917F01809101 +:200E20008001909181012817390719F42FEF3FEF13C0E0918001F0918101E25CFE4F2081C2 +:200E4000809180019091810101968F739070909381018093800130E0C901089510928501EC +:200E60001092840188EE93E0A0E0B0E08093860190938701A0938801B093890180E191E0B2 +:200E8000909383018093820108950F931F93DF93CF930F92CDB7DEB78C0169838091090102 +:200EA000882369F083E0BE016F5F7F4F41E050E00E946B041816190614F49C0107C081E0F4 +:200EC00090E0F8019383828320E030E0C9010F90CF91DF911F910F91089583E00E9442040D +:200EE000089582E00E94CD03482F20917E0130917F012F5F3F4F2F73307080918001909188 +:200F000081012817390759F0E0917E01F0917F01E25CFE4F408330937F0120937E01089536 +:200F2000FC0180818E5F808380E865E971E042E450E00E94E6030895FC0181819081913A63 +:200F400059F4813209F04CC080E062E071E047E050E00E94E60342C0913209F041C0803246 +:200F600039F482E091E067E070E00E942A0436C0823209F035C0828180930901809102013E +:200F800090910301A0910401B0910501805B9440A040B04019F58091090180FD12C087E74A +:200FA00097E790930108809300082BE088E190E00FB6F894A895809360000FBE20936000A7 +:200FC0000DC088E10FB6F89480936000109260000FBEA895109201081092000881E00895B8 +:200FE00080E00895FC0191818081813A31F4913089F080E0933089F40DC0813269F49B3082 +:2010000021F4828180930A0105C09A3029F4828180930B0181E0089580E00895EF92FF92BF +:201020000F931F938C01E62EDC01ED91FC910480F581E02D0995F82ED801ED91FC9106809E +:20104000F781E02DC8016E2D09958F2D90E01F910F91FF90EF900895109290011092940178 +:201060001092930182E291E090939201809391010895EF92FF920F931F93DF93CF930F9292 +:20108000CDB7DEB789838B017A0184E0BE016F5F7F4F41E050E00E946B0484E4B801A7013A +:2010A0000E946B040F90CF91DF911F910F91FF90EF90089582E048E050E00E94390808957B +:2010C000FC0116821782108611861286138614823496BF010E945A080895DC01683810F046 +:2010E000685829C0E62FF0E067FF13C0E058F04081E090E002C0880F991FEA95E2F7809572 +:2011000014962C911497282314962C93149760E012C0EB5AFD4F6491662319F420E030E020 +:201120001DC067FF08C014968C9114978D7F14968C9314976F77FD0190E0662321F08681BD +:20114000861709F416829F5F31969630B1F7CD011496BD010E945A0821E030E0C901089578 +:20116000CF93DF93DC01683810F0685825C0E62FF0E067FF12C0E058F04081E090E002C061 +:20118000880F991FEA95E2F714962C911497282B14962C93149760E00FC0EB5AFD4F64919A +:2011A0006623D9F167FF08C014968C911497826014968C9314976F7716968C9116978617ED +:2011C000A9F117968C911797861781F118968C911897861759F119968C911997861731F152 +:2011E0001A968C911A97861709F11B968C911B978617E1F0ED01E0E0F0E09E2F8E818823E7 +:2012000021F4EA0FFB1F668306C09F5F31962196E630F10591F7963049F481E090E013966A +:201220009C938E93129720E030E007C0CD011496BD010E945A0821E030E0C901DF91CF91F9 +:20124000089580E867ED71E045E650E00E94E6030895FC0180818F5F808380E86CE372E069 +:2012600049E150E00E94E6030895CF92DF92EF92FF920F931F93CF93DF937C016B018A016C +:20128000C0E0D0E00FC0D6016D916D01D701ED91FC910190F081E02DC7010995C80FD91FC5 +:2012A000015010400115110571F7CE01DF91CF911F910F91FF90EF90DF90CF900895EE0F94 +:2012C000FF1F0590F491E02D0994F894FFCF0D0000E1000000000000010100000000450796 +:2012E0003509E4060B07F2066D077107000000000E083509B0086D086008FFFFFFFFFFFFED +:20130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :20132000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :20134000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :20136000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D @@ -1016,7 +1016,7 @@ :207EE000E9001092E9008091E80083FF01C0E4DE17701093E9001F910895F999FECF92BD02 :207F000081BDF89A992780B50895262FF999FECF1FBA92BD81BD20BD0FB6F894FA9AF99A90 :207F20000FBE01960895F894FFCF4341544552494E4100777700080000000000000801128E -:207F4000011001020000084123340001000201000109023E0002010080320904000001025A +:207F4000011001020000084123360001000201000109023E00020100803209040000010258 :207F60000201000524001001042402040524060001070582030800FF09040100020A0000B4 :207F8000000705040210000107058302100001040309042203410072006400750069006E80 :207FA000006F0020004C0065006F006E006100720064006F00000018034100720064007557 diff --git a/bootloaders/caterina/Descriptors.c b/bootloaders/caterina/Descriptors.c index e0d3304..c5feaf5 100755 --- a/bootloaders/caterina/Descriptors.c +++ b/bootloaders/caterina/Descriptors.c @@ -193,7 +193,7 @@ const USB_Descriptor_String_t ProductString = { .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String}, - #if DEVICE_PID == 0x0034 + #if DEVICE_PID == 0x0036 .UnicodeString = L"Arduino Leonardo" #else .UnicodeString = L"USB IO board " @@ -204,7 +204,11 @@ const USB_Descriptor_String_t ManufNameString = { .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + #if DEVICE_VID == 0x2341 .UnicodeString = L"Arduino LLC" + #else + .UnicodeString = L"Unknown " + #endif }; /** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors" diff --git a/bootloaders/caterina/Makefile b/bootloaders/caterina/Makefile index e460090..873f8bd 100755 --- a/bootloaders/caterina/Makefile +++ b/bootloaders/caterina/Makefile @@ -48,12 +48,12 @@ # USB vendor ID (VID) # official Arduino LLC VID -VID = 0x2341 +# VID = 0x2341 # USB product ID (PID) # official Leonardo PID -#PID = 0x0034 +# PID = 0x0036 # MCU name diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index 34c4372..9e89fd6 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -51,10 +51,10 @@ const u16 STRING_LANGUAGE[2] = { const u16 STRING_IPRODUCT[17] = { (3<<8) | (2+2*16), -#if USB_PID == 0x8034 +#if USB_PID == 0x8036 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o' #else - 'U','S','B',' ','I','O',' ','B','O','A','R','D',' ',' ',' ',' ' + 'U','S','B',' ','I','O',' ','B','o','a','r','d',' ',' ',' ',' ' #endif }; -- cgit v1.2.3-18-g5258 From 757a77ab67edb9831fe11fe95c80cb08a695e4a1 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 1 May 2012 11:18:15 -0400 Subject: renamed Leonardo USB_ class to USBDevice_ to be unambiguous. renamed "USB" object to "USBDevice" to prevent conflict with USB Host library (thanks Massimo) --- cores/arduino/USBAPI.h | 6 +++--- cores/arduino/USBCore.cpp | 12 ++++++------ cores/arduino/main.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) mode change 100755 => 100644 cores/arduino/main.cpp diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index f66cb16..1c21845 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -9,17 +9,17 @@ //================================================================================ // USB -class USB_ +class USBDevice_ { public: - USB_(); + USBDevice_(); bool configured(); void attach(); void detach(); // Serial port goes down too... void poll(); }; -extern USB_ USB; +extern USBDevice_ USBDevice; //================================================================================ //================================================================================ diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index 9e89fd6..6766be6 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -627,13 +627,13 @@ u8 USBConnected() //======================================================================= //======================================================================= -USB_ USB; +USBDevice_ USBDevice; -USB_::USB_() +USBDevice_::USBDevice_() { } -void USB_::attach() +void USBDevice_::attach() { _usbConfiguration = 0; UHWCON = 0x01; // power internal reg @@ -654,18 +654,18 @@ void USB_::attach() TX_RX_LED_INIT; } -void USB_::detach() +void USBDevice_::detach() { } // Check for interrupts // TODO: VBUS detection -bool USB_::configured() +bool USBDevice_::configured() { return _usbConfiguration; } -void USB_::poll() +void USBDevice_::poll() { } diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp old mode 100755 new mode 100644 index 34450f4..3d4e079 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -5,7 +5,7 @@ int main(void) init(); #if defined(USBCON) - USB.attach(); + USBDevice.attach(); #endif setup(); -- cgit v1.2.3-18-g5258 From efa75937723c2b868ddb7cec93a0a3bf6fa01959 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 15 May 2012 15:48:51 -0400 Subject: Mouse.isPressed() now checks only for left button by default if no argument is given now checks left button by default to be consistent with press() and release() (thanks, David Mellis) --- cores/arduino/USBAPI.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 1c21845..d5abdb6 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -65,7 +65,7 @@ public: void move(signed char x, signed char y, signed char wheel = 0); void press(uint8_t b = MOUSE_LEFT); // press LEFT by default void release(uint8_t b = MOUSE_LEFT); // release LEFT by default - bool isPressed(uint8_t b = MOUSE_ALL); // check all buttons by default + bool isPressed(uint8_t b = MOUSE_LEFT); // check LEFT by default }; extern Mouse_ Mouse; -- cgit v1.2.3-18-g5258 From b495294aa32ca838180af57efdb1f04727487d55 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Wed, 16 May 2012 15:39:34 -0400 Subject: Adding readString() and readStringUntil() to Stream (Adrian McEwen). This isn't necessarily a particularly efficient implementation (it allocates memory one character at a time and so may lead to fragmentation) but it seems to work. http://code.google.com/p/arduino/issues/detail?id=454 --- cores/arduino/Stream.cpp | 24 ++++++++++++++++++++++++ cores/arduino/Stream.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp index 3d5b905..aafb7fc 100644 --- a/cores/arduino/Stream.cpp +++ b/cores/arduino/Stream.cpp @@ -244,3 +244,27 @@ size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length) return index; // return number of characters, not including null terminator } +String Stream::readString() +{ + String ret; + int c = timedRead(); + while (c >= 0) + { + ret += (char)c; + c = timedRead(); + } + return ret; +} + +String Stream::readStringUntil(char terminator) +{ + String ret; + int c = timedRead(); + while (c >= 0 && c != terminator) + { + ret += (char)c; + c = timedRead(); + } + return ret; +} + diff --git a/cores/arduino/Stream.h b/cores/arduino/Stream.h index 13f11be..58bbf75 100644 --- a/cores/arduino/Stream.h +++ b/cores/arduino/Stream.h @@ -82,6 +82,8 @@ class Stream : public Print // returns the number of characters placed in the buffer (0 means no valid data found) // Arduino String functions to be added here + String readString(); + String readStringUntil(char terminator); protected: long parseInt(char skipChar); // as above but the given skipChar is ignored -- cgit v1.2.3-18-g5258 From e346d868b92b431507487b0de57b746477a80bec Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Sat, 19 May 2012 22:05:46 -0400 Subject: added pin change interrupt defines for Leonardo. fix for broken software serial on Leonardo --- variants/leonardo/pins_arduino.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/variants/leonardo/pins_arduino.h b/variants/leonardo/pins_arduino.h index ff9e4f9..d5b32d0 100644 --- a/variants/leonardo/pins_arduino.h +++ b/variants/leonardo/pins_arduino.h @@ -57,6 +57,11 @@ static const uint8_t A9 = 27; // D9 static const uint8_t A10 = 28; // D10 static const uint8_t A11 = 29; // D12 +#define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0)) +#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1)) +#define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0)))) +#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14))) + // __AVR_ATmega32U4__ has an unusual mapping of pins to channels extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; #define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) -- cgit v1.2.3-18-g5258 From 3e68702149cbf938f11bc9410eb7f9a0c811fa28 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Sun, 20 May 2012 15:56:49 -0700 Subject: Updating SoftwareSerial pin mapping (pin change interrupts) for Leonardo. --- variants/leonardo/pins_arduino.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/variants/leonardo/pins_arduino.h b/variants/leonardo/pins_arduino.h index d5b32d0..9f770d6 100644 --- a/variants/leonardo/pins_arduino.h +++ b/variants/leonardo/pins_arduino.h @@ -57,10 +57,10 @@ static const uint8_t A9 = 27; // D9 static const uint8_t A10 = 28; // D10 static const uint8_t A11 = 29; // D12 -#define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0)) -#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1)) -#define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0)))) -#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14))) +#define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0)) +#define digitalPinToPCICRbit(p) 0 +#define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0)) +#define digitalPinToPCMSKbit(p) ( ((p) >= 8 && (p) <= 11) ? (p) - 4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4)))))) // __AVR_ATmega32U4__ has an unusual mapping of pins to channels extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; -- cgit v1.2.3-18-g5258