USB Mouse Interface files, Bring IIc shield up to date with IIe

This commit is contained in:
Charles Mangin 2017-04-10 10:09:20 -04:00
parent 1c40fd617b
commit 936a7dd66c
13 changed files with 4605 additions and 645 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -1,8 +1,8 @@
/* requires keypad library by Mark Stanley, Alexander Brevig from:
http://www.arduino.cc/playground/Code/Keypad
http://www.arduino.cc/playground/Code/Keypad
Uses the PJRC Teensy++ 2.0 and Teensyduino libraries, specifically USB HID and Keyboard():
http://www.pjrc.com/teensy/teensyduino.html
Uses the PJRC Teensy++ 2.0 and Teensyduino libraries, specifically USB HID and Keyboard():
http://www.pjrc.com/teensy/teensyduino.html
*/
#include <Keypad.h>
@ -15,31 +15,34 @@ int ColumnsPin = 10;
/*
Declares the matrix rows/cols of the Apple IIc keyboard.
/*
Declares the matrix rows/cols of the Apple IIc keyboard.
*/
// Prevent compiler warning about casts from unsigned ints to chars
#define C(x) ((char) (x))
const byte ROWS = 8; // rows
const byte COLS = 10; // columns
char keys[ROWS][COLS] = {
{ KEY_ESC, KEY_1, KEY_2, KEY_3, KEY_4, KEY_6, KEY_5, KEY_7, KEY_8, KEY_9 },
{ C(KEY_ESC), C(KEY_1), C(KEY_2), C(KEY_3), C(KEY_4), C(KEY_6), C(KEY_5), C(KEY_7), C(KEY_8), C(KEY_9) },
{ KEY_TAB, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_Y, KEY_T, KEY_U, KEY_I, KEY_O},
{ C(KEY_TAB), C(KEY_Q), C(KEY_W), C(KEY_E), C(KEY_R), C(KEY_Y), C(KEY_T), C(KEY_U), C(KEY_I), C(KEY_O)},
{ KEY_A, KEY_D, KEY_S, KEY_H, KEY_F, KEY_G, KEY_J, KEY_K, KEY_SEMICOLON, KEY_L},
{ C(KEY_A), C(KEY_D), C(KEY_S), C(KEY_H), C(KEY_F), C(KEY_G), C(KEY_J), C(KEY_K), C(KEY_SEMICOLON), C(KEY_L)},
{ KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_PERIOD, KEY_SLASH},
{ C(KEY_Z), C(KEY_X), C(KEY_C), C(KEY_V), C(KEY_B), C(KEY_N), C(KEY_M), C(KEY_COMMA), C(KEY_PERIOD), C(KEY_SLASH)},
{ 0, 0, 0, 0, 0, 0, KEY_BACKSLASH, KEY_EQUAL, KEY_0, KEY_MINUS},
{ 0, 0, 0, 0, 0, 0, C(KEY_BACKSLASH), C(KEY_EQUAL), C(KEY_0), C(KEY_MINUS)},
{ 0, 0, 0, 0, 0, 0, KEY_TILDE, KEY_P, KEY_LEFT_BRACE, KEY_RIGHT_BRACE},
{ 0, 0, 0, 0, 0, 0, C(KEY_TILDE), C(KEY_P), C(KEY_LEFT_BRACE), C(KEY_RIGHT_BRACE)},
{ 0, 0, 0 , 0, 0, 0, KEY_ENTER, KEY_UP, KEY_SPACE, KEY_QUOTE},
{ 0, 0, 0 , 0, 0, 0, C(KEY_ENTER), C(KEY_UP), C(KEY_SPACE), C(KEY_QUOTE)},
{ 0, 0, 0, 0, 0, 0, KEY_BACKSPACE, KEY_DOWN, KEY_LEFT, KEY_RIGHT},
{ 0, 0, 0, 0, 0, 0, C(KEY_BACKSPACE), C(KEY_DOWN), C(KEY_LEFT), C(KEY_RIGHT)},
@ -47,109 +50,116 @@ char keys[ROWS][COLS] = {
char Fkeys[2][10] = {
{C(KEY_1), C(KEY_2), C(KEY_3), C(KEY_4), C(KEY_5), C(KEY_6), C(KEY_7), C(KEY_8), C(KEY_9), C(KEY_0)},
{C(KEY_F1), C(KEY_F2), C(KEY_F3), C(KEY_F4), C(KEY_F5), C(KEY_F6), C(KEY_F7), C(KEY_F8), C(KEY_F9), C(KEY_F10)}
};
/*
Keyboard matrix
Keyboard matrix
X0 1 2 3 4 5 6 7 8 9
Y0 ESC 1 2 3 4 6 5 7 8 9
Y0 ESC 1 2 3 4 6 5 7 8 9
1 TAB Q W E R Y T U I O
1 TAB Q W E R Y T U I O
2 A D S H F G J K ; L
2 A D S H F G J K ; L
3 Z X C V B N M < > ?
3 Z X C V B N M < > ?
4 \ + 0 -
4 \ + 0 -
5 ~ P [ ]
5 ~ P [ ]
6 RET UP SPC "
6 RET UP SPC "
7 DEL DN LT RT
7 DEL DN LT RT
Matrix
Matrix
J9 Teensy
X0 31 26
1 24 4
2 22 5
3 8 14
4 14 17
5 6 13
6 10 15
7 1 3
8 4 12
9 2 11
X0 31 26
1 24 4
2 22 5
3 8 14
4 14 17
5 6 13
6 10 15
7 1 3
8 4 12
9 2 11
Y0 12 16
1 33 25
2 18 7
3 20 38
4 3 2
5 5 1
6 7 0
7 9 27
Y0 12 16
1 33 25
2 18 7
3 20 38
4 3 2
5 5 1
6 7 0
7 9 27
NC 13
NC 13
17
30
GND 21
GND 21
SFT 34 24
CTL 32 23
CMD 16 8
CMD 26 20
CAPS 28 21
SFT 34 24
CTL 32 23
CMD 16 8
CMD 26 20
CAPS 28 21
J9 pinout
1 X7
2 X9
3 Y4
4 X8
5 Y5
6 X5
7 Y6
8 X3
9 Y7
10 X6
11 DISK LED (5v)
12 Y0
13 NC
14 X4
15 KEYBOARD SW
16 CLOSED APPLE
17 NC
18 Y2
19 40/80 COL SWITCH
20 Y3
21 GROUND ???
22 X2
23 GROUND ???
24 X1
25 POWER LED (5v)
26 OPEN APPLE
27 LED GROUND ???
28 CAPS LOCK
29 RESET
30 NC
31 X0
32 CONTROL
33 Y1
34 SHIFT
J9 pinout
1 X7
2 X9
3 Y4
4 X8
5 Y5
6 X5
7 Y6
8 X3
9 Y7
10 X6
11 DISK LED (5v)
12 Y0
13 NC
14 X4
15 KEYBOARD SW
16 CLOSED APPLE
17 NC
18 Y2
19 40/80 COL SWITCH
20 Y3
21 GROUND ???
22 X2
23 GROUND ???
24 X1
25 POWER LED (5v)
26 OPEN APPLE
27 LED GROUND ???
28 CAPS LOCK
29 RESET
30 NC
31 X0
32 CONTROL
33 Y1
34 SHIFT
*/
byte rowPins[ROWS] = { // Y0 - Y9
16,25,7,38,2,1,0,27}; //connect to the row pinouts of the keypad
16, 25, 7, 38, 2, 1, 0, 27
}; //connect to the row pinouts of the keypad
byte colPins[COLS] = { // X0 - X7
26,4,5,14,17,13,15,3,12,11 }; //connect to the column pinouts of the keypad
26, 4, 5, 14, 17, 13, 15, 3, 12, 11
}; //connect to the column pinouts of the keypad
Keypad KPD = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
@ -163,11 +173,11 @@ const int CAPSPin = 21;
// these pins are special in that they are dis/connected to ground, instead of to a row/col
/***
/***
open/closed apple are grounded through resistors on the //c. need to detect voltage drop as analogread, not digital.
open/closed apple are grounded through resistors on the //c. need to detect voltage drop as analogread, not digital.
must be on analog pin.
must be on analog pin.
***/
@ -180,16 +190,16 @@ char modifierKeys[4];
#define KEY_CAPS_UNLOCK 0
#define KEY_CAPS_UNLOCK 0
boolean resetCapsLock = false; // Allows one caps unlock signal.
unsigned long dTime = 0;
char CAPSState; // Initialize this to a reasonable value.
boolean resetCapsLock = false; // Allows one caps unlock signal.
unsigned long dTime = 0;
boolean CAPSLock = false; // Initialize this to a reasonable value.
boolean FKEYS = false; // used to set numbers to F-Key equivalent. currently tied to caps lock
boolean FKEYS = false; // used to set numbers to F-Key equivalent. currently tied to caps lock
void setup(){
void setup() {
pinMode(SHIFTPin, INPUT);
pinMode(CTRLPin, INPUT);
@ -198,164 +208,179 @@ void setup(){
digitalWrite(APPLEPin1, HIGH);
digitalWrite(APPLEPin2, HIGH);
digitalWrite(SHIFTPin, HIGH);
digitalWrite(CTRLPin, HIGH);
pinMode(CAPSPin, INPUT);
digitalWrite(CAPSPin, HIGH);
// Turn on the DISK READ LED (rev4 board)
// digitalWrite(LEDPin, HIGH);
// digitalWrite(LEDPin, HIGH);
// This gives time for the keyboard to hook up to the PC.
// Otherwise the caps lock state may be incorrect.
delay(1000);
}
void loop()
{
//probably should be on an interrupt, to catch high->low transition
//probably should be on an interrupt, to catch high->low transition
// Only do something if the pin is different from previous state.
if ( (CAPSState!=digitalRead(CAPSPin)) && !resetCapsLock) {
CAPSState = digitalRead(CAPSPin); // Remember new CAPSState.
Keyboard.set_key6(KEY_CAPS_LOCK); // Send KEY_CAPS_LOCK.
dTime = millis(); // Reset delay timer.
resetCapsLock = true;
}
if ( resetCapsLock && (millis()-dTime) > 10) {
Keyboard.set_key6(KEY_CAPS_UNLOCK);
resetCapsLock = false;
}
// Only do something if the pin is different from previous state.
boolean newCaps = digitalRead(CAPSPin) ? false : true;
FKEYS = !CAPSState;
if ( (CAPSLock != newCaps) && !resetCapsLock)
{
CAPSLock = newCaps; // Remember new CAPSLock.
Keyboard.set_key6((uint8_t) KEY_CAPS_LOCK); // Send KEY_CAPS_LOCK.
dTime = millis(); // Reset delay timer.
resetCapsLock = true;
// Serial.print("Caps = ");
// Serial.println(CAPSLock);
/*char CAPSState = digitalRead(CAPSPin);
if (CAPSState == LOW) {
Keyboard.set_key6(KEY_CAPS_LOCK);
} else {
Keyboard.set_key6(0);
}
// Turn on the LED for caps lock.
// digitalWrite(LED, CAPSLock ? HIGH : LOW);
}
if ( resetCapsLock && (millis() - dTime) > 10)
{
Keyboard.set_key6(KEY_CAPS_UNLOCK);
resetCapsLock = false;
}
// If caps lock is set, then turn number keys into function keys.
FKEYS = CAPSLock;
/*char CAPSState = digitalRead(CAPSPin);
if (CAPSState == LOW) {
Keyboard.set_key6(KEY_CAPS_LOCK);
} else {
Keyboard.set_key6(0);
}
*/
char SHIFTState = digitalRead(SHIFTPin);
if (SHIFTState == LOW) {
modifierKeys[0] = MODIFIERKEY_SHIFT;
digitalWrite(SHIFTPin, HIGH);
} else {
digitalWrite(SHIFTPin, HIGH);
modifierKeys[0] = 0;
char SHIFTState = digitalRead(SHIFTPin);
if (SHIFTState == LOW) {
modifierKeys[0] = MODIFIERKEY_SHIFT;
digitalWrite(SHIFTPin, HIGH);
} else {
digitalWrite(SHIFTPin, HIGH);
modifierKeys[0] = 0;
}
char CTRLState = digitalRead(CTRLPin);
if (CTRLState == LOW) {
modifierKeys[1] = MODIFIERKEY_CTRL;
digitalWrite(CTRLPin, HIGH);
} else {
modifierKeys[1] = 0;
digitalWrite(CTRLPin, HIGH);
}
char OAPPLEState = analogRead(APPLEPin2);
char CAPPLEState = analogRead(APPLEPin1);
// *** NOW USING CLOSED APPLE AS ALT/OPTION
if (OAPPLEState < 20) {
modifierKeys[2] = MODIFIERKEY_GUI;
digitalWrite(APPLEPin1, HIGH);
} else {
modifierKeys[2] = 0;
digitalWrite(APPLEPin1, HIGH);
}
if (CAPPLEState < 20) {
modifierKeys[3] = MODIFIERKEY_ALT;
digitalWrite(APPLEPin2, HIGH);
} else {
modifierKeys[3] = 0;
digitalWrite(APPLEPin2, HIGH);
}
// to use the TILDE key as ALT/OPTION
/* modifierKeys[3] = 0;
if( KPD.isPressed(KEY_TILDE) ) {
modifierKeys[3] = MODIFIERKEY_ALT;
}
*/
// *** NOW USING CLOSED APPLE AS ALT/OPTION
Keyboard.set_modifier( modifierKeys[0] | modifierKeys[1] | modifierKeys[2] | modifierKeys[3] );
KPD.getKeys(); // Scan for all pressed keys. 6 Max, + 4 modifiers. Should be plenty, but can be extended to 10+
// Set keyboard keys to default values.
Keyboard.set_key1(0);
Keyboard.set_key2(0);
Keyboard.set_key3(0);
Keyboard.set_key4(0);
Keyboard.set_key5(0);
//Keyboard.set_key6(0);
/* based on suggestion from Craig Brooks <s.craig.brooks@gmail.com>
uses CAPS LOCK to turn number keys into F-Key equivalent.
*/
// Update keyboard keys to active values.
if ( KPD.key[0].kchar && ( KPD.key[0].kstate == PRESSED || KPD.key[0].kstate == HOLD )) {
//Serial.println(FKEYS);
if (FKEYS) {
// number keys 1 through 0 for f1 - f10
if ((KPD.key[0].kchar >= 0x1E) && (KPD.key[0].kchar <= 0x27)) {
KPD.key[0].kchar += 0x1C;
// Serial.println( KPD.key[0].kchar, HEX );
// - and = for f11 and f12
} else if ( KPD.key[0].kchar == 0x2D || KPD.key[0].kchar == 0x2E ) {
KPD.key[0].kchar += 0x17;
}
}
char CTRLState = digitalRead(CTRLPin);
if (CTRLState == LOW) {
modifierKeys[1] = MODIFIERKEY_CTRL;
digitalWrite(CTRLPin, HIGH);
} else {
modifierKeys[1] = 0;
digitalWrite(CTRLPin, HIGH);
}
Keyboard.set_key1( KPD.key[0].kchar );
}
char OAPPLEState = analogRead(APPLEPin2);
char CAPPLEState = analogRead(APPLEPin1);
if ( KPD.key[1].kchar && ( KPD.key[1].kstate == PRESSED || KPD.key[1].kstate == HOLD ))
Keyboard.set_key2( KPD.key[1].kchar );
if ( KPD.key[2].kchar && ( KPD.key[2].kstate == PRESSED || KPD.key[2].kstate == HOLD ))
Keyboard.set_key3( KPD.key[2].kchar );
// *** NOW USING CLOSED APPLE AS ALT/OPTION
if (OAPPLEState < 20) {
modifierKeys[2] = MODIFIERKEY_GUI;
digitalWrite(APPLEPin1, HIGH);
} else {
modifierKeys[2] = 0;
digitalWrite(APPLEPin1, HIGH);
}
if ( KPD.key[3].kchar && ( KPD.key[3].kstate == PRESSED || KPD.key[3].kstate == HOLD ))
Keyboard.set_key4( KPD.key[3].kchar );
if ( KPD.key[4].kchar && ( KPD.key[4].kstate == PRESSED || KPD.key[4].kstate == HOLD ))
Keyboard.set_key5( KPD.key[4].kchar );
//if( KPD.key[5].kchar && ( KPD.key[5].kstate==PRESSED || KPD.key[5].kstate==HOLD ))
//Keyboard.set_key6( KPD.key[5].kchar );
if (CAPPLEState < 20) {
modifierKeys[3] = MODIFIERKEY_ALT;
digitalWrite(APPLEPin2, HIGH);
} else {
modifierKeys[3] = 0;
digitalWrite(APPLEPin2, HIGH);
}
// to use the TILDE key as ALT/OPTION
/* modifierKeys[3] = 0;
if( KPD.isPressed(KEY_TILDE) ) {
modifierKeys[3] = MODIFIERKEY_ALT;
}
*/
// *** NOW USING CLOSED APPLE AS ALT/OPTION
   Keyboard.set_modifier( modifierKeys[0] | modifierKeys[1] | modifierKeys[2] | modifierKeys[3] );
KPD.getKeys(); // Scan for all pressed keys. 6 Max, + 4 modifiers. Should be plenty, but can be extended to 10+
// Set keyboard keys to default values.
Keyboard.set_key1(0);
Keyboard.set_key2(0);
Keyboard.set_key3(0);
Keyboard.set_key4(0);
Keyboard.set_key5(0);
//Keyboard.set_key6(0);
/* based on suggestion from Craig Brooks <s.craig.brooks@gmail.com>
uses CAPS LOCK to turn number keys into F-Key equivalent.
*/
// Update keyboard keys to active values.
if( KPD.key[0].kchar && ( KPD.key[0].kstate==PRESSED || KPD.key[0].kstate==HOLD )) {
//Serial.println(FKEYS);
if (FKEYS) {
// number keys 1 through 0 for f1 - f10
if((KPD.key[0].kchar >= 0x1E) && (KPD.key[0].kchar <= 0x27)){
KPD.key[0].kchar += 0x1C;
// Serial.println( KPD.key[0].kchar, HEX );
// - and = for f11 and f12
} else if( KPD.key[0].kchar == 0x2D || KPD.key[0].kchar == 0x2E ) {
KPD.key[0].kchar += 0x17;
}
}
Keyboard.set_key1( KPD.key[0].kchar );
}
if( KPD.key[1].kchar && ( KPD.key[1].kstate==PRESSED || KPD.key[1].kstate==HOLD ))
Keyboard.set_key2( KPD.key[1].kchar );
if( KPD.key[2].kchar && ( KPD.key[2].kstate==PRESSED || KPD.key[2].kstate==HOLD ))
Keyboard.set_key3( KPD.key[2].kchar );
if( KPD.key[3].kchar && ( KPD.key[3].kstate==PRESSED || KPD.key[3].kstate==HOLD ))
Keyboard.set_key4( KPD.key[3].kchar );
if( KPD.key[4].kchar && ( KPD.key[4].kstate==PRESSED || KPD.key[4].kstate==HOLD ))
Keyboard.set_key5( KPD.key[4].kchar );
//if( KPD.key[5].kchar && ( KPD.key[5].kstate==PRESSED || KPD.key[5].kstate==HOLD ))
//Keyboard.set_key6( KPD.key[5].kchar );
Keyboard.send_now();
Keyboard.set_modifier(0);
Keyboard.send_now();
Keyboard.set_modifier(0);
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
/*
/*
* Converts Apple M0100 mouse to USB, using Adafruit Trinket Pro 5v.
*
* Accelerated mouse tracking, based on speed. Faster movement
@ -8,7 +8,7 @@
*
*/
#include <cmdline_defs.h>
#include <ProTrinketMouse.h>

View File

@ -0,0 +1,227 @@
#include <hidboot.h>
#include <usbhub.h>
// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif
// pin assignments
int XMOVE = 3;
int XDIR = 1;
int YMOVE = 2;
int YDIR = 0;
int CLICKPIN = 4;
long XDELAY;
long YDELAY;
long MOVEMENTBASE = 50;
int MOVEMENTFACTORX = 0;
int MOVEMENTFACTORY = 0;
int MOVEMENTTHRESHOLD = 1;
int MOVEMENTDENOM = 12;
class MouseRptParser : public MouseReportParser
{
protected:
void OnMouseMove (MOUSEINFO *mi);
void OnLeftButtonUp (MOUSEINFO *mi);
void OnLeftButtonDown (MOUSEINFO *mi);
void OnRightButtonUp (MOUSEINFO *mi);
void OnRightButtonDown (MOUSEINFO *mi);
void OnMiddleButtonUp (MOUSEINFO *mi);
void OnMiddleButtonDown (MOUSEINFO *mi);
};
void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{
// XDELAY = MOVEMENTBASE + (1 - (abs(mi->dX) / 255.000)) * MOVEMENTFACTOR;
// YDELAY = MOVEMENTBASE + (1 - (abs(mi->dY) / 127.000)) * MOVEMENTFACTOR;
// Serial.print("dx=");
// Serial.println(XDELAY);
// Serial.print(" dy=");
// Serial.println(YDELAY);
// delayMicroseconds(XDELAY);
MOVEMENTFACTORX = 1 + (abs(mi->dX)) / MOVEMENTDENOM;
//Serial.println(MOVEMENTFACTOR);
for (int i = 0; i < MOVEMENTFACTORX; i++) {
if (mi->dX > MOVEMENTTHRESHOLD) {
digitalWrite(XMOVE, HIGH);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(XDIR, HIGH);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(XMOVE, LOW);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(XDIR, LOW);
}
if (mi->dX < -1 * MOVEMENTTHRESHOLD) {
digitalWrite(XDIR, HIGH);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(XMOVE, HIGH);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(XDIR, LOW);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(XMOVE, LOW);
}
}
MOVEMENTFACTORY = 1 + (abs(mi->dY)) / MOVEMENTDENOM;
for (int i = 0; i < MOVEMENTFACTORY; i++) {
if (mi->dY > MOVEMENTTHRESHOLD) {
digitalWrite(YMOVE, HIGH);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(YDIR, HIGH);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(YMOVE, LOW);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(YDIR, LOW);
}
if (mi->dY < -1 * MOVEMENTTHRESHOLD) {
digitalWrite(YDIR, HIGH);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(YMOVE, HIGH);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(YDIR, LOW);
delayMicroseconds(MOVEMENTBASE);
digitalWrite(YMOVE, LOW);
}
}
/*
XDIR = XMOVE = LOW
if X > 0
XMOVE HIGH
delay
XDIR HIGH
delay
XMOVE LOW
delay
XDIR LOW
else if X < 0
XDIR HIGH
delay
XMOVE HIGH
delay
XDIR LOW
delay
XMOVE LOW
*/
};
void MouseRptParser::OnLeftButtonUp (MOUSEINFO *mi)
{
// Serial.println("L Butt Up");
digitalWrite(CLICKPIN, HIGH);
};
void MouseRptParser::OnLeftButtonDown (MOUSEINFO *mi)
{
// Serial.println("L Butt Dn");
digitalWrite(CLICKPIN, LOW);
};
void MouseRptParser::OnRightButtonUp (MOUSEINFO *mi)
{
// Serial.println("R Butt Up");
};
void MouseRptParser::OnRightButtonDown (MOUSEINFO *mi)
{
if (MOVEMENTTHRESHOLD == 1) {
MOVEMENTTHRESHOLD = 0;
} else {
MOVEMENTTHRESHOLD = 1;
}
if (MOVEMENTDENOM == 12) {
MOVEMENTDENOM = 8;
} else {
MOVEMENTDENOM = 12;
}
if (MOVEMENTBASE == 50) {
MOVEMENTBASE = 100;
} else {
MOVEMENTBASE = 50;
}
// Serial.println("R Butt Dn");
};
void MouseRptParser::OnMiddleButtonUp (MOUSEINFO *mi)
{
// Serial.println("M Butt Up");
};
void MouseRptParser::OnMiddleButtonDown (MOUSEINFO *mi)
{
// Serial.println("M Butt Dn");
};
USB Usb;
USBHub Hub(&Usb);
HIDBoot<HID_PROTOCOL_MOUSE> HidMouse(&Usb);
uint32_t next_time;
MouseRptParser Prs;
void setup()
{
pinMode(XMOVE, OUTPUT);
pinMode(XDIR, OUTPUT);
pinMode(YMOVE, OUTPUT);
pinMode(YDIR, OUTPUT);
pinMode(CLICKPIN, OUTPUT);
/* Serial.begin( 115200 );
#if !defined(__MIPSEL__)
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
Serial.println("Start");
*/
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
delay( 200 );
next_time = millis() + 5000;
HidMouse.SetReportParser(0, (HIDReportParser*)&Prs);
digitalWrite(XMOVE, LOW);
digitalWrite(XDIR, LOW);
digitalWrite(YMOVE, LOW);
digitalWrite(YDIR, LOW);
digitalWrite(CLICKPIN, HIGH);
}
void loop()
{
Usb.Task();
}

View File

@ -0,0 +1,853 @@
:100000000C945E000C9486000C9486000C94860080
:100010000C9486000C9486000C9486000C94860048
:100020000C9486000C9486000C9486000C94860038
:100030000C9486000C9486000C9486000C94860028
:100040000C948D160C9486000C941E180C94501869
:100050000C9486000C9486000C9486000C94860008
:100060000C9486000C948600000000080002010039
:100070000003040700000000000000000102040863
:100080001020408001020408102001020408102002
:10009000040404040404040402020202020203032E
:1000A0000303030300000000250028002B000000CC
:1000B0000000240027002A00D906801811241FBE42
:1000C000CFEFD8E0DEBFCDBF11E0A0E0B1E0E4E8C3
:1000D000F4E302C005900D92AC3AB107D9F723E0E2
:1000E000ACEAB1E001C01D92AE30B207E1F710E01A
:1000F000CCEBD0E004C02297FE010E94351AC83B29
:10010000D107C9F70E9418190C94401A0C940000EA
:1001100080E00895089580E0089581E008950895AD
:100120008091080190910901019729F41092090129
:100130001092080106C081E090E09093090180933D
:10014000080180910601909107010C9719F488E04D
:1001500090E002C08CE090E090930701809306014C
:1001600080910A0190910B01A0910C01B0910D01B9
:10017000C297A105B10529F484E690E0A0E0B0E0C3
:1001800004C082E390E0A0E0B0E080930A01909385
:100190000B01A0930C01B0930D01089508950895EB
:1001A000860F911D860F911DFC015687458781E0C2
:1001B0000895CF93DF93EC018C819D81DC01ED915B
:1001C000FC910480F581E02D6E8109951F86188AC7
:1001D00081E08A8B1E821B8A1C8A1D8A1E8A1F8AC6
:1001E00080E0DF91CF910895FC018681089581E040
:1001F000633009F080E0089581E0623009F080E02A
:100200000895860F911D860F911DFC0185859685A9
:100210000895FC0187890895EF92FF92CF93DF93B1
:10022000FC01E7012289223029F16787408B8B810D
:1002300083708330F9F48A8187FF1CC08E81908D92
:10024000981708F4808F822F90E0DC01AA0FBB1F63
:10025000A80FB91FAE0FBF1F8A818F7017968C939E
:1002600017978C8118968C93189784E019968C9325
:100270002F5F228BDF91CF91FF90EF900895EF9247
:10028000FF920F9302970E940C010F91FF90EF9045
:100290000895089561E080910E010C94E81760E0E4
:1002A00080910E010C94E8170F931F93CF93DF9367
:1002B000EB018981992787FD909597FF03C0919560
:1002C0008195910960910601709107010E941F1AA2
:1002D0006F5F7F4F70935A026093590200E010E005
:1002E0008091590290915A02081719070CF068C0C2
:1002F0002981332727FD30958091080190910901CC
:100300008217930734F561E0809114010E94E81789
:1003100080910A0190910B010E94401761E0809149
:1003200012010E94E81780910A0190910B010E942E
:10033000401760E0809114010E94E81780910A0143
:1003400090910B010E94401760E0809112010E9481
:10035000E8172981332727FD309580910801909176
:1003600009019195819591092817390734F561E0C4
:10037000809112010E94E81780910A0190910B016F
:100380000E94401761E0809114010E94E81780915B
:100390000A0190910B010E94401760E080911201C8
:1003A0000E94E81780910A0190910B010E9440176A
:1003B00060E0809114010E94E8170F5F1F4F90CFFB
:1003C0008A81992787FD909597FF03C09195819524
:1003D000910960910601709107010E941F1A6F5FD9
:1003E0007F4F709358026093570200E010E08091B5
:1003F000570290915802081719070CF068C02A811B
:10040000332727FD309580910801909109018217CB
:10041000930734F561E0809110010E94E817809104
:100420000A0190910B010E94401761E080915B02EC
:100430000E94E81780910A0190910B010E944017D9
:1004400060E0809110010E94E81780910A0190916C
:100450000B010E94401760E080915B020E94E81748
:100460002A81332727FD3095809108019091090159
:100470009195819591092817390734F561E08091AC
:100480005B020E94E81780910A0190910B010E9483
:10049000401761E0809110010E94E81780910A01E5
:1004A00090910B010E94401760E080915B020E94D6
:1004B000E81780910A0190910B010E94401760E0BB
:1004C000809110010E94E8170F5F1F4F90CFDF91BE
:1004D000CF911F910F9108952F923F924F925F926B
:1004E0006F927F928F929F92AF92BF92CF92DF9244
:1004F000EF92FF920F931F93CF93DF9300D000D022
:10050000CDB7DEB76C017C836B835A8349834C0182
:1005100080E1880E911C5601A7E0AA0EB11C11E0E3
:1005200044E0442E57E0352E3601B2E16B0E711CCB
:1005300063E0262E72E0572E8B819C81892B09F473
:1005400012C1F60180A1823061F128F4882349F0BC
:10055000813079F0F1CF833041F1843009F44BC020
:10056000EBCF54828581968190878783528651860E
:1005700010A3AE014D5F5F4FBE016F5F7F4FC5019E
:100580000E944C12882309F4EEC0D6011596ED9115
:10059000FC911697808191968C9391978181929688
:1005A0008C93F6017682658220A2D60192968C9178
:1005B000843081F018F4823079F014C0853081F0F5
:1005C000813281F4D60191968C9191978250149644
:1005D0008C9308C0F60113A2D60114963C9202C077
:1005E000F6018483F60185819681908787838481D3
:1005F0008287818740A2D60192968C918430B1F097
:10060000853009F442C0823009F06EC0AE014D5F02
:100610005F4FBE016F5F7F4FC5010E944C12882360
:1006200009F4A1C0F601858984A38EC0AE014D5F97
:100630005F4FBE016F5F7F4FC5010E944C12882340
:1006400009F491C0D60155968C915597833009F0E5
:100650007BC056968C915697813009F075C098965C
:100660009C91989757968C91992321F0882309F4AF
:100670006BC003C0823009F067C0F60113A39289F2
:1006800096A3938997A385A35FC0AE014D5F5F4F8B
:10069000BE016F5F7F4FC5010E944C12882309F491
:1006A00062C0D60193968C919397882309F44CC02D
:1006B00012968D919C911397009709F445C0DC0127
:1006C000ED91FC910190F081E02D7401D601959699
:1006D0000C91959797962C91979796964C91969703
:1006E00094966C91099530C0F60181A19585992366
:1006F00019F0913031F023C090E0029797878687F8
:1007000015872B813C8189819A81782F692FD601A9
:100710001E964D915C911F9741155105E9F0019688
:100720002115310541F041505109F601578746879F
:1007300021503109EACF79836A831C821B82F6013A
:1007400086859785892B79F4D60116969C928E9290
:10075000159790961C92F0CE9A8389833C832B83C5
:10076000F6011586ECCF0F900F900F900F90DF9150
:10077000CF911F910F91FF90EF90DF90CF90BF909E
:10078000AF909F908F907F906F905F904F903F9031
:100790002F9008959FB7F89420916602809164028B
:1007A000213019F48DBB9FBF08958FBF0895CF925C
:1007B000DF92EF92FF920F931F93CF93DF93CDB70A
:1007C000DEB762970FB6F894DEBF0FBECDBF6C01E7
:1007D000DC0157968C91882369F00E94D716F601A8
:1007E0000389148925893689601B710B820B930B51
:1007F00097FF02C0F12C39C0F601838590E09A8BF7
:10080000898BE12C8E010F5F1F4F9E012F5E3F4FA2
:1008100042856681848195810E945F0EF82E811148
:1008200018C029893A892330310598F0D6011D96E0
:100830008D919C911E97009761F0DC01ED91FC91E8
:100840000190F081E02D8E010F5F1F4F40E0B60157
:1008500009950E94D716F601208D620F711D811D2A
:10086000911D638B748B858B968B8F2D62960FB643
:10087000F894DEBF0FBECDBFDF91CF911F910F91D6
:10088000FF90EF90DF90CF9008953F924F925F924C
:100890006F927F928F929F92AF92BF92CF92DF9290
:1008A000EF92FF920F931F93CF93DF93CDB7DEB7F5
:1008B000EB970FB6F894DEBF0FBECDBF7C01462E7E
:1008C000342E522EDC011496AD90BC9015971696DE
:1008D0008C911697811111C158961C92D501ED91FA
:1008E000FC910190F081E02D60E0C50109956C015B
:1008F000009711F486ED0BC1FC018080918081147A
:10090000910409F4FCC03701F7E06F0E711CDC01A3
:1009100011967C926E9214965C928E01065D1F4F2A
:1009200028E030E040E060E0F701848195810E949A
:100930005E0D182F8111E7C01AA5D6018D929C92E9
:10094000D501ED91FC910280F381E02D232D40E053
:10095000642DC5010995F7018683882309F4D1C068
:1009600099A99087282F40E060E0848195810E94BA
:100970000B0E982ED501ED91FC91D60114961C9288
:10098000882361F00480F581E02DD70116966C91E3
:10099000C5010995F7011682892DB9C00190F08132
:1009A000E02DD70116966C91C5010995009709F4C1
:1009B000A1CF133108F012E1FC01548211110FC0D4
:1009C0004BAC512CEDE2AE2EE1E0BE2E4701F2E041
:1009D0008F0E911C6E0181E1C80ED11C39C0212FF0
:1009E00030E08E01065D1F4F40E0D70116966C91F6
:1009F000169714968D919C9115970E945E0D182F55
:100A0000811171C0DDCFBA82A9829C828B821E8641
:100A1000188A1F8619A21AA21BA219A6DF82CE82EB
:100A2000D986C8868D818B878A87DD86CC868E01A4
:100A30000F5F1F4F252D40E0F7016681848195816E
:100A40000E94AC0DD70152968C91823019F05394CC
:100A50005410D9CFF7018289823009F043C0930145
:100A600042E06681848195810E94AC0868EE73E063
:100A700080E090E00E940617D7011F962C911F97E7
:100A800040E016966C91169714968D919C9115974F
:100A90000E943A0E182F811126C068EE73E080E0A4
:100AA00090E00E94061740E060E0C7010E94BF117D
:100AB000182F811118C020E040E060E0C7010E94BB
:100AC000951183E391E09A838983AE014F5F5F4F75
:100AD00060E070E0C7010E94521181E0F701878B4E
:100AE00080E015C011EDD701ED91FC910480F581F6
:100AF000E02DC7010995812F0AC089ED08C087ED57
:100B000006C084ED04C0F60191828082ECCFEB96A2
:100B10000FB6F894DEBF0FBECDBFDF91CF911F910E
:100B20000F91FF90EF90DF90CF90BF90AF909F908C
:100B30008F907F906F905F904F903F90089520919D
:100B40006602222399F03FB7F89420916602213083
:100B500059F42DB3209364024DB320916502209582
:100B600024232DBB3FBF02C0309364028CBD9DBDCA
:100B7000089580EE91E00C9459102A9A0895CF932D
:100B8000C82F80E591E00E949F052A98CEBD000005
:100B90000DB407FEFDCF8EB51EBC00000DB407FEE0
:100BA000FDCFCEB50E94BD058091660281110E94E5
:100BB000CA038C2FCF9108951F93CF93DF931F9279
:100BC000CDB7DEB7182F80E591E069830E949F05BD
:100BD0002A98812F82608EBD69810DB407FEFDCFFA
:100BE0008EB56EBD0DB407FEFDCF8EB50E94BD055E
:100BF00080916602882331F00F90DF91CF911F9191
:100C00000C94CA030F90DF91CF911F91089588EF44
:100C10000E94BF05807C8034A1F018F4882301F184
:100C20000895803819F0803CB9F0089588ED0E944D
:100C3000BF0581FD0BC069EC88ED0E94DC0582E0F8
:100C40000CC088ED0E94BF0581FDF5CF6BEC88EDEF
:100C50000E94DC0583E001C081E08093AC0108952F
:100C600061ED88ED0E94DC051092AC0108950F93B0
:100C70001F93CF93DF938C01229A0E94BD050E949F
:100C80005716229A0E94BD05219868E188E80E94C3
:100C9000DC0560E288E70E94DC0560E088E70E94EE
:100CA000DC05C0E0D0E088E60E94BF05219680FD0B
:100CB00006C0CF3F8FEFD807B1F78FEF1DC061ECB3
:100CC00088ED0E94DC0560E680ED0E94DC0564E0B2
:100CD00088EE0E94DC0588EE0E94BF0582FFFBCFF4
:100CE000C8010E94070660E288EC0E94DC0561E012
:100CF00080E80E94DC0580E0DF91CF911F910F9189
:100D0000089561E0809114010E94AF1761E0809125
:100D100012010E94AF1761E0809110010E94AF178D
:100D200061E080915B020E94AF1761E080910E014B
:100D30000E94AF1780EE91E00E9437068F3F31F49A
:100D400066E171E081E792E00E94051968EC70E0CD
:100D500080E090E00E9406170E94D71668577C4EEC
:100D60008F4F9F4F6093B2017093B3018093B40192
:100D70009093B5018DEA91E09093C4018093C301F3
:100D800060E0809114010E94E81760E080911201F8
:100D90000E94E81760E0809110010E94E81760E06F
:100DA00080915B020E94E81761E080910E010C9433
:100DB000E81780EE91E00E946A0760EE71E08FEC28
:100DC00091E00E94E31480EE91E09093BB01809348
:100DD000BA018DE491E09093B7018093B6018BE660
:100DE00091E09093B9018093B8011092C9011092DB
:100DF000CA011092CB011092CC011092CD01109239
:100E0000BD0188E08093BE018CE38093BF01109206
:100E1000C0011092C10184E08093C20181E08093FF
:100E2000C8011092C7011092C5011092C40110921E
:100E3000C301E6E3F2E080E090E021913191232BC1
:100E400051F4FC01EE0FFF1FEA5CFD4F86EB91E0D1
:100E50009183808304C001968031910571F789E305
:100E600091E09093AE018093AD010895FC01208143
:100E70002EBDDC019B012150310951F011965C918E
:100E800011970DB407FEFDCF4EB55EBD4D93F3CF68
:100E9000FB013197E80FF91F0DB407FEFDCF8EB5AA
:100EA000808308958EBD00000DB407FEFDCF8EB582
:100EB000089580916602882361F09FB7F89420918D
:100EC000660280916402213019F48DBB9FBF0895A2
:100ED0008FBF0895FC0181E791E0918380831582A3
:100EE000108681E0818712869F012E5F3F4F3783F6
:100EF0002683128288E083838CE3848380E090E001
:100F000041E0DF01A80FB91F1D961C921D971E9688
:100F10004C931E971F961C921F971C963C932E93E2
:100F20001B9705968B34910561F7EA58FF4F1082A5
:100F300081E1809361020895CF92DF92EF92FF9258
:100F40000F931F93CF93DF931F92CDB7DEB77C0132
:100F50006623B1F18C01C12CD12CF801EA5AFF4F64
:100F600080819181009719F1DC01ED91FC91008461
:100F7000F185E02D698309956981861318C0F60112
:100F8000BB96EE0FFF1FEE0DFF1D80819181DC01EE
:100F9000ED91FC910480F581E02D0F90DF91CF91D0
:100FA0001F910F91FF90EF90DF90CF900994BFEFCA
:100FB000CB1ADB0A0E5F1F4FE0E1CE16D10469F6B3
:100FC00080E00F90DF91CF911F910F91FF90EF90F4
:100FD000DF90CF90089520E030E041E0FC01E20F87
:100FE000F31F5585561739F04F5F2B5F3F4F403148
:100FF000A9F780E00895842F0895EF92FF921F9340
:10100000CF93DF9300D0CDB7DEB77C01162F67FDFD
:101010005FC0283008F05CC0442331F0DC01159635
:101020008C91873009F454C060E0C7012A8349835A
:101030000E94EB072A814981882309F449C0E82FDF
:10104000F0E0111123C085E08E9FD0018F9FB00D7D
:101050001124AE0DBF1D442359F081E418968C93E2
:10106000D70115968C9115978F5F15968C9303C0B9
:1010700081E018968C9385E08E9FD0018F9FB00DF4
:101080001124AE0DBF1D18968C9123C0612F67707F
:10109000660F660F660F442361F06064D7011596F2
:1010A0008C9115978F5F15968C938770687F682B4E
:1010B00003C02770687B622B85E08E9FD0018F9FD5
:1010C000B00D1124AE0DBF1D18966C93862F01C074
:1010D00080E00F900F90DF91CF911F91FF90EF90E4
:1010E0000895CF93DF93EC01662359F00E94EB073C
:1010F000882349F09E0145E0849F200D311D112475
:10110000C901069602C080E090E0DF91CF9108957A
:10111000CF93DF931F92CDB7DEB749830E9471084A
:101120004981009789F0DC01ED91FC91119730978E
:1011300059F013969C9180E0891731F02081241793
:1011400031F033968F5FF8CF80E090E001C0CF019F
:101150000F90DF91CF910895EF92FF921F93CF935D
:10116000DF931F92CDB7DEB7162F79012115310518
:1011700069F049830E947108FC014981009741F0A0
:101180001283F182E082438380E003C088ED01C0D6
:1011900086ED0F90DF91CF911F91FF90EF90089512
:1011A0002A9808951F93CF93DF931F92CDB7DEB790
:1011B000182F80E591E00E949F050E94D008812FA2
:1011C0000E94520780E00E94520789830E94BD0559
:1011D0000E94590789810F90DF91CF911F91089547
:1011E0001F93CF93DF9300D01F92CDB7DEB7182F98
:1011F00080E591E06B830E949F050E94D0081260F9
:1012000019836B816A8362E070E0CE0101960E94CF
:1012100036070E94BD050E9459070F900F900F904E
:10122000DF91CF911F9108958F929F92BF92CF929D
:10123000DF92EF92FF920F931F93CF93DF931F9252
:10124000CDB7DEB74C01B62E690149830E94710803
:101250007C014981009709F443C0FC0180819181A0
:10126000892B09F43FC06B2DC4010E948808F60148
:10127000918380830097C1F1FC01228126952695F8
:10128000822F90E0409764F441E050E060E070E02D
:1012900004C0440F551F661F771F2A95D2F702C05E
:1012A00040E050E841505109F801518340836B2DD3
:1012B00080EE0E94F00888ED0E94D208F701948128
:1012C000992339F0F401EA58FF4F60816260682B7E
:1012D00002C0682F697F88ED0E94F00880E005C099
:1012E00086ED03C087ED01C08BED0F90DF91CF91AC
:1012F0001F910F91FF90EF90DF90CF90BF909F9044
:101300008F9008958F929F92AF92BF92CF92DF926B
:10131000EF92FF920F931F93CF93DF931F92CDB75E
:10132000DEB7A62E890149830E94D7166B017C0186
:1013300088E8C80E83E1D81EE11CF11C812C912C99
:10134000B12C20E04981A42A29830E94D7166C1968
:101350007D098E099F09298197FF2DC06A2D80EF95
:101360000E94F0080E94D7166C197D098E099F090A
:1013700097FF09C088EC0E94D20887FFF3CF60E88E
:1013800088EC0E94F00888EF0E94D208282F2F7066
:10139000243019F02E3059F00EC0EFEF8E1A9E0A4D
:1013A0000115110589F28016910671F604C0B394F7
:1013B000F3E0BF12C9CF822F0F90DF91CF911F9121
:1013C0000F91FF90EF90DF90CF90BF90AF909F90E4
:1013D0008F9008959F92AF92BF92CF92DF92EF923B
:1013E000FF920F931F93CF93DF937C01B42E122FA4
:1013F000AA24A394DC01A60FB11DA60FB11D6D0197
:1014000086E5C80ED11CC42FD0E0AB96CC0FDD1FF3
:10141000CE0DDF1DD6018D919C91DC01ED91FC91EB
:101420000280F381E02D202F412F6B2D0995803E06
:10143000C1F4B1100BC061E088EE0E94F00866E6CE
:1014400070E080E090E00E94061715C088819981C5
:10145000DC01ED91FC910284F385E02D612F09956B
:101460000AC08D3031F48FEF8A0D833008F042C00E
:1014700017C0811142C0F60180819181DC01ED919C
:10148000FC910190F081E02D202F412F6B2D0995CB
:10149000982EBDE08B130CC08FEF8A0D833050F473
:1014A00064E670E080E090E00E940617A394B2CF5B
:1014B000882311F1B1100BC061E088EE0E94F008A2
:1014C00066E670E080E090E00E94061711C0EB2D08
:1014D000F0E0BB96EE0FFF1FEE0DFF1D80819181A6
:1014E000DC01ED91FC910284F385E02D612F0995DB
:1014F000892D03C08DE001C080E0DF91CF911F9165
:101500000F91FF90EF90DF90CF90BF90AF909F90A2
:1015100008950F931F93CF93DF93D82FC62F8A017F
:1015200080E591E00E949F050E94D0088D2F826087
:101530000E945207D0E0209721F0BE01C8010E940E
:101540003607C00FD11F0E94BD050E945907CE016A
:10155000DF91CF911F910F9108952F923F924F925B
:101560005F926F927F928F929F92AF92BF92CF9233
:10157000DF92EF92FF920F931F93CF93DF9300D0F0
:1015800000D01F92CDB7DEB77D836C835A0169010D
:10159000FB0121808FEF820D803408F06FC00E9424
:1015A000D7162B013C01F8E84F0EF3E15F1E611CDA
:1015B000711CEC81FD81828180FF02C060E801C066
:1015C00060E488EE0E94F00820E0312CC114D104C0
:1015D00009F444C076012C143D0408F47101EA8238
:1015E000A8016E2D80E10E94890A6E2D88E30E9479
:1015F000F008EC81FD816081606280EF0E94F0085C
:1016000088EC0E94D20887FFFBCF60E888EC0E943C
:10161000F00888EF0E94D208282F2F70812C912C7F
:101620001982222309F46BC02B830E94D7166419F8
:101630007509860997092B8197FF61C0263001F152
:101640002E3009F456C0243049F4FFEF8F1A9F0A58
:10165000A114B10459F18A149B0441F588EF2B833E
:101660000E94D20885FB882780F9EC81FD81928158
:1016700080FB90F992832B81822F46C08AED44C073
:1016800088EF0E94D20885FB882780F991E089279E
:10169000EC81FD81928180FB90F9928390FF02C0E2
:1016A00060E801C060E488EE0E94F00860E088E332
:1016B0000E94F008F801608180E10E94F0086A81D0
:1016C00088E30E94F008EC81FD816081606280EF18
:1016D0000E94F00888EC0E94D20887FFFBCF60E8E8
:1016E00088EC0E94F00888EF0E94D208282F2F7003
:1016F00098CF89818F5F89838330C1F6AFCFCE18B1
:10170000DF080E0D1F1D62CF0F900F900F900F90EE
:101710000F90DF91CF911F910F91FF90EF90DF908D
:10172000CF90BF90AF909F908F907F906F905F9081
:101730004F903F902F9008952F923F924F925F923B
:101740006F927F928F929F92AF92BF92CF92DF92D1
:10175000EF92FF920F931F93CF93DF93CDB7DEB736
:1017600029970FB6F894DEBF0FBECDBF1C01798755
:1017700068875B834A836901D9018D909C9011979A
:10178000FB01F181F9831D921C92DB0112968C9171
:1017900081FF02C060E201C060E188EE0E94F008B3
:1017A0008E2D90E0A0E0B0E08C839D83AE83BF835C
:1017B000482C2A813B81A885B9854C9160E0C10104
:1017C0000E948209F82EB6E08B1316C088EF0E94A3
:1017D000D2088295817091E08927E885F985928108
:1017E00080FB91F9928391FF02C060E201C060E149
:1017F00088EE0E94F008DDCF811166C088EC0E945F
:10180000D20882FF5FC080E30E94D208582E90E089
:101810008816990608F4542CD6018D919C91652C5C
:10182000712CF401E81BF90BCF01F7FF02C080E037
:1018300090E05301861597050CF45C0180E591E07A
:101840000E949F050E94D00888E00E945207A501CF
:1018500060E070E0C8010E94391AA114B10421F0BF
:10186000B501C8010E9436070A0D1B1D0E94BD0567
:101870000E94590764E088EC0E94F008D6018D911F
:101880009C911197860D971D8D939C93B9815B1642
:1018900018F08815990560F088EF0E94D2088295AB
:1018A0008170E885F985928180FB91F992830CC063
:1018B000EE2009F47ECF6C817D818E819F810E9414
:1018C000061777CF30EFF32E8F2D29960FB6F894A9
:1018D000DEBF0FBECDBFDF91CF911F910F91FF9063
:1018E000EF90DF90CF90BF90AF909F908F907F90C0
:1018F0006F905F904F903F902F9008952F923F925E
:101900004F925F926F927F928F929F92AF92BF920F
:10191000CF92DF92EF92FF920F931F93CF93DF93BB
:10192000CDB7DEB762970FB6F894DEBF0FBECDBF5E
:101930003C01F42E322E202E5C2D4FA058A4C9A4B9
:10194000DAA4188A1F861E861D868E01035F1F4F2C
:101950009E01215F3F4F598B0E94140959898111C3
:1019600094C039822A82EB825C83BE82AD829886E3
:101970008F82AE014F5F5F4F68E080E20E94890A6C
:101980002D853E854F2D60E1C3010E948209182FED
:1019900081117AC0232C221C2224221CC114D104C0
:1019A00009F466C0EF85F8898281222009F453C0CA
:1019B00082608283540133243394A114B10409F466
:1019C00055C05C864B864D855E856F857889E12C98
:1019D00086019E01255F3F4FC3010E949C0B182F7B
:1019E0008630B1F42F85388988EF298B3A8B0E9495
:1019F000D20885FB882780F9832529893A89D9016E
:101A000012969C91129780FB91F912969C93D5CFD8
:101A100081113AC0EBA5FCA53097A1F00190F081AF
:101A2000E02D0190F081E02DC4018A199B099A876D
:101A300089876B857C859E01275F3F4FA6018BA51B
:101A40009CA509958B859C85A81AB90A84159505CE
:101A500008F0B3CF0DC0816082834D855E8586011D
:101A60009201BF01C3010E94AD0A182F11110CC0D1
:101A70002D853E85222011F060EA01C060E84F2DDF
:101A8000C3010E94820901C0812F62960FB6F894AB
:101A9000DEBF0FBECDBFDF91CF911F910F91FF90A1
:101AA000EF90DF90CF90BF90AF909F908F907F90FE
:101AB0006F905F904F903F902F9008958F929F92DC
:101AC000AF92BF92CF92EF920F931F931F921F92EC
:101AD0001F930F933F932F934901A12CB12CCC243A
:101AE000C394E12C06E020E80E947E0C0F900F903A
:101AF0000F900F900F900F901F910F91EF90CF903C
:101B0000BF90AF909F908F9008958F929F92AF92C9
:101B1000BF92CF92EF92FF920F931F921F92FF926C
:101B2000EF923F932F934901A12CB12C52E0C52E87
:101B3000E02E06E020E80E947E0C0F900F900F90A0
:101B40000F900F900F900F91FF90EF90CF90BF905C
:101B5000AF909F908F9008953F924F925F926F92B7
:101B60007F928F929F92AF92BF92CF92DF92EF922D
:101B7000FF920F931F93CF93DF93CDB7DEB7C0547F
:101B8000D1090FB6F894DEBF0FBECDBF3C01562E73
:101B9000442E322EB02ECE0101966C017C01022F14
:101BA00029E030E0C3010E94850D81111BC08B80AC
:101BB0009C801F93BF92DF92CF921F9280E48F93FD
:101BC000A12CB12C62E0C62EE32C06E020E8442DC7
:101BD000652DC3010E947E0C0F900F900F900F9007
:101BE0000F900F90C05CDF4F0FB6F894DEBF0FBEB2
:101BF000CDBFDF91CF911F910F91FF90EF90DF90BC
:101C0000CF90BF90AF909F908F907F906F905F909C
:101C10004F903F9008958F929F92AF92BF92CF9234
:101C2000EF920F93CF931F921F921F921F921F92BA
:101C30001F92812C912CA12CB12CC12CE22E05E0FD
:101C400020E00E947E0CC82F6CE271E080E090E002
:101C50000E9406170F900F900F900F900F900F900B
:101C60008C2FCF910F91EF90CF90BF90AF909F901E
:101C70008F9008958F929F92AF92BF92CF92EF92E2
:101C80000F931F921F921F921F921F921F92812CDF
:101C9000912CA12CB12CC12CE22E09E020E00E9455
:101CA0007E0C0F900F900F900F900F900F900F9150
:101CB000EF90CF90BF90AF909F908F9008958F92AC
:101CC0009F92AF92BF92CF92DF92EF920F931F93AA
:101CD000CF93DF9300D000D0CDB7DEB76C015901B0
:101CE00048011C821B821A8219828E010F5F1F4FCE
:101CF0009E012D5F3F4F0E941409811109C0498147
:101D00005A816B817C8184019501C6010E949C0BE4
:101D10000F900F900F900F90DF91CF911F910F9127
:101D2000EF90DF90CF90BF90AF909F908F900895ED
:101D3000CF92DF92FF920F931F93CF93DF9300D048
:101D4000CDB7DEB76C01662309F442C0062F10E060
:101D500085E0689FB0011124F601E60FF71F80852A
:101D6000282F277086FF19C031E0E5E0FE2EF6012E
:101D7000F39EE00DF11D112480858695869586954C
:101D800087708217E1F03F5F303188F3F60185817B
:101D9000821303C02150F601258385E0809FF00166
:101DA000819FF00D1124EC0DFD1D108681E08187CF
:101DB000128682E0C80ED11CD782C68209C0632F6A
:101DC000C6012A8339830E94980E2A813981CFCF98
:101DD0000F900F90DF91CF911F910F91FF90DF90A7
:101DE000CF900895CF93DF93EC016134A1F4FC010F
:101DF000855B9F4F41E09E012E5F3F4F15864687D2
:101E00001786348723873596E817F907B9F71D82B7
:101E1000DF91CF9108950E94EB07682FCE01DF91EB
:101E2000CF910C94980E0F931F93CF93DF93EC01F7
:101E3000022FCA3F8FEFD80711F486ED29C08E819B
:101E40009F81892B01F12A87242F40E0CE010E9437
:101E5000FD07182F8823C9F0682FCE010E94710852
:101E6000009759F3FC010483212F40E060E0CE018C
:101E70000E940B0E082F882351F0612FCE010E9483
:101E8000F20E802F05C087ED03C084ED01C080E015
:101E9000DF91CF911F910F9108952F923F924F9212
:101EA0005F926F927F928F929F92AF92BF92CF92EA
:101EB000DF92EF92FF920F931F93CF93DF93CDB7F3
:101EC000DEB766970FB6F894DEBF0FBECDBF7C01BC
:101ED000862E742E922E1B8A88E08C8B8CE38D8B41
:101EE000D701ED91FC910190F081E02D60E0C701F8
:101EF00009956C01009709F4ABC0FC01A080B1808A
:101F0000CE0143969183808394828E010F5F1F4F91
:101F100022E130E040E060E0C7010E945E0DD601A2
:101F2000AD92BC928111ACC029843A844B845C840C
:101F3000BD81BE8B1E815701612C6501E6E5CE0E89
:101F4000D11CD6018D919C91009789F1DC01ED9116
:101F5000FC910084F185E02D0995811128C0F601DE
:101F600080819181DC01ED91FC910088F189E02D67
:101F7000612F09958823D9F0F60180819181DC01D8
:101F8000ED91FC910484F585E02DA201B101099544
:101F9000811160C0F60180819181DC01ED91FC919D
:101FA0000684F785E02D6E890995811153C06394ED
:101FB000B2E0AB0EB11CE0E16E12BFCF5701612C55
:101FC0006501F6E5CF0ED11CD6018D919C9100974D
:101FD00089F1DC01ED91FC910084F185E02D0995FA
:101FE000811128C0F60180819181DC01ED91FC9185
:101FF0000088F189E02D612F09958823B1F1F60160
:1020000080819181DC01ED91FC910484F585E02DC6
:10201000A201B101099581110DC0F6018081918164
:10202000DC01ED91FC910684F785E02D6E89099520
:102030008823D9F06394B2E0AB0EB11CE0E16E12DC
:10204000BFCF292D472D682DC7010E94130F18C03F
:1020500086ED16C0092D272D482D662DC7010E943B
:10206000EA09813D09F4A3CF0BC0092D272D482D86
:10207000662DC7010E94EA09982F977F913DD1F202
:1020800066960FB6F894DEBF0FBECDBFDF91CF913D
:102090001F910F91FF90EF90DF90CF90BF90AF9086
:1020A0009F908F907F906F905F904F903F902F9078
:1020B0000895FF920F931F93CF93DF93EC0119992B
:1020C0000EC088EC0E94D20885FF05C0CE010E9498
:1020D000070660E201C060E088EC0E94F008809191
:1020E000AC01813051F058F0823029F0833039F55D
:1020F000FF24F3940DC0F12C0BC083E106C0809146
:102100006102807F8031D9F081E18093610217C044
:1021100080916102807F803199F40E94D7166853C4
:102120007F4F8F4F9F4F60935D0270935E0280934D
:102130005F029093600280E28093610201C0F12C03
:1021400000E010E0FE01E00FF11FEA5AFF4F80812E
:102150009181009739F0DC01ED91FC910680F781C7
:10216000E02D09950E5F1F4F0032110559F7809140
:102170006102803409F446C070F4803269F1803322
:10218000D9F1813109F088C0FE01EA58FF4F108271
:1021900000E010E00AC0813509F45AC0803809F423
:1021A0006AC0803509F078C03CC0FE01E00FF11F25
:1021B000EA5AFF4F80819181009739F0DC01ED915F
:1021C000FC910480F581E02D09950E5F1F4F0032D0
:1021D000110559F782E15EC00E94D71600915D0299
:1021E00010915E0220915F0230916002601B710BC2
:1021F000820B930B97FD50C061E088EE0E94F008BF
:1022000080E448C088EE0E94D20880FD45C088ED79
:102210000E94D208682F686088ED0E94F00880E56F
:1022200039C088EC0E94D20886FF36C081E58093D1
:1022300061020E94D7166C5E7F4F8F4F9F4F609355
:102240005D0270935E0280935F029093600224C0EF
:102250000E94D71600915D0210915E0220915F02EC
:1022600030916002601B710B820B930B97FD14C0C1
:1022700080E8809361022F2D40E060E0CE010E9453
:102280004D0F882331F0823D39F08093620280EA5D
:1022900001C080E980936102DF91CF911F910F917E
:1022A000FF9008958F929F92AF92BF92CF92EF923C
:1022B0000F93CF93DF93CDB7DEB7C054D1090FB6DC
:1022C000F894DEBF0FBECDBF5F934F939E012F5F8B
:1022D0003F4F3F932F931F9220E42F9320E8822EAD
:1022E000912C5B0132E2C32EE12C06E021E840E0B4
:1022F000FC016681848195810E947E0C0F900F9075
:102300000F900F900F900F90C05CDF4F0FB6F894B6
:10231000DEBF0FBECDBFDF91CF910F91EF90CF9079
:10232000BF90AF909F908F9008958F929F92AF92A1
:10233000BF92CF92EF920F93A62EB12C1F921F92B5
:102340001F921F921F921F92812C912CC22EE42E5D
:102350000AE021E240E0FC016681848195810E94CF
:102360007E0C0F900F900F900F900F900F900F9189
:10237000EF90CF90BF90AF909F908F9008958F92E5
:102380009F92AF92BF92CF92EF920F93A62EB12C55
:102390001F921F921F921F921F921F92812C912CAD
:1023A000C12CE42E0BE021E240E0FC016681848137
:1023B00095810E947E0C0F900F900F900F900F90C0
:1023C0000F900F91EF90CF90BF90AF909F908F9014
:1023D00008950F931F93CF93DF93EC012A8121700F
:1023E000F8018081982F9170291771F0E881F981A7
:1023F00080FF04C00680F781E02D03C00480F581D2
:10240000E02DB801CE0109952A8126952170F801A9
:10241000808181FB992790F9291771F0E881F98172
:1024200081FF04C00284F385E02D03C00084F185A0
:10243000E02DB801CE0109952A8122FB222720F93F
:10244000F801808182FB992790F9291771F0E881C2
:10245000F98182FF04C00684F785E02D03C004845F
:10246000F585E02DB801CE010995F8018181811132
:1024700003C08281882341F0E881F9810280F381E1
:10248000E02DB801CE010995F80180818A83DF91A2
:10249000CF911F910F910895CF93DF93FC01EA0133
:1024A00080819181892B21F580E028C088819981E4
:1024B000892BD1F3DB018D919C91DC015C9123810F
:1024C00030E0241B310980819181820F931FDC0150
:1024D0005C9382818150828388819981019799835D
:1024E0008883DB018D919C91119701968D939C932C
:1024F00042814111DBCF8381828381E0DF91CF91E3
:102500000895FC018285089581E0693009F080E03A
:102510000895CF93DF93EC018A819B81DC01ED91DB
:10252000FC910480F581E02D6A8509958A858134C6
:1025300039F4EA81FB81EA58FF4F8081846080830F
:102540001A861B861C861D861E861F86188A80E0BA
:10255000DF91CF9108958F929F92AF92BF92CF92C9
:10256000EF920F93A42EB12CB22A1F921F921F92AA
:102570001F921F921F92812C912CC12CE62E01E0FC
:1025800023E240E0FC016285828193810E947E0CFF
:102590000F900F900F900F900F900F900F91EF9062
:1025A000CF90BF90AF909F908F9008958F929F9201
:1025B000AF92BF92CF92EF920F93A62EB12C1F92A3
:1025C0001F923F932F935F934F934A01C12CE12CAD
:1025D00000E023EA40E0FC016285828193810E9451
:1025E0007E0C0F900F900F900F900F900F900F9107
:1025F000EF90CF90BF90AF909F908F9008958F9263
:102600009F92AF92BF92CF92EF920F93A42EB12CD4
:10261000B22A1F921F921F921F921F921F92812C0B
:10262000912CC12CE62E03E023E240E0FC01628500
:10263000828193810E947E0C0F900F900F900F90DB
:102640000F900F900F91EF90CF90BF90AF909F9011
:102650008F9008952F923F924F925F926F927F9248
:102660008F929F92AF92BF92CF92DF92EF92FF92A2
:102670000F931F93CF93DF93CDB7DEB7E9970FB6D4
:10268000F894DEBF0FBECDBF3C01362E242EDC01F8
:102690001296ED90FC9013971A968C91811103C1BC
:1026A000D701ED91FC910190F081E02D60E0C70130
:1026B00029AF09956C0129AD009709F4F6C0FC011A
:1026C000A080B180A114B10409F4F1C04301F4E089
:1026D0008F0E911CDC0111969C928E9214962C9375
:1026E000FE0131962F018F0128E030E040E060E0EC
:1026F000D30112968D919C9113970E945E0DF60165
:1027000014828111DAC019818D81893009F0D1C01C
:10271000D701ED91FC910280F381E02D222D41E063
:10272000632DC7010995F3018287882309F4C3C08B
:1027300098859583282F40E060E0828193810E94F4
:102740000B0E082F882391F0D601AD92BC92D701D1
:10275000ED91FC910480F581E02DD3011A966C91E6
:10276000C7010995F3011286102FABC0113208F092
:1027700010E2D601AD92BC9211110BC0940142E05F
:10278000F3016285828193810E94AC08811198C017
:1027900011C0212F30E0820140E0D3011A966C91E4
:1027A0001A9712968D919C9113970E945E0D81113C
:1027B00087C0E4CF1F921F925F924F921F9288E0D2
:1027C0008F9388E0882E912CA12CB12C99E2C92EF0
:1027D000E12C06E020EA40E0F301628582819381EA
:1027E0000E947E0C182F0F900F900F900F900F905B
:1027F0000F90811166C08B81D3011B968C931B9720
:10280000720100E028E030E040E01A966C911A97DF
:1028100012968D919C9113970E94850D811150C045
:102820002B813C8140E0F3016285828193810E948B
:10283000850D811145C0298130E0CE0181967C0152
:1028400040E0D3011A966C911A9712968D919C9143
:1028500013970E94850D811133C02E8140E0F30152
:102860006285828193810E943A0E811129C001E024
:10287000D3011B968C911B97801740F020E0402FCE
:1028800068E0C3010E94FF120F5FF2CF1296ED9134
:10289000FC911397EA58FF4F80818460808381E028
:1028A00050968C930EC019ED0CC016ED0AC017EDB2
:1028B00008C011ED06C014ED04C0F601B182A0827B
:1028C000182F812FE9960FB6F894DEBF0FBECDBF4B
:1028D000DF91CF911F910F91FF90EF90DF90CF90FC
:1028E000BF90AF909F908F907F906F905F904F9030
:1028F0003F902F900895BF92CF92DF92EF92FF9278
:102900000F931F93CF93DF9300D000D0CDB7DEB7E6
:102910007C01B62E19821A821B821C8220E0462F6F
:1029200061E10E94AB1220E04B2D60E1C7010E94E3
:10293000AB1220E04B2D64E0C7010E94FF1223E0A0
:10294000C22ED12C9E012F5F3F4F44E050E06B2DF3
:10295000C7010E94D612882301F120E04B2D64E1CB
:10296000C7010E94AB1220E04B2D60E1C7010E941D
:10297000AB1264E170E080E090E00E9406170F90D7
:102980000F900F900F90DF91CF911F910F91FF90BB
:10299000EF90DF90CF90BF90089509811A812B812D
:1029A0003C811D7F0330114020413105B1F264E6C6
:1029B00070E080E090E00E94061781E0C81AD1081C
:1029C00009F0C0CFCACFCF93DF93FC018BE791E032
:1029D000918380837383628312861386148615869F
:1029E00016861786108A148288E085839CE3968376
:1029F00091E09783808784E0818761157105B9F044
:102A0000CB01A0E0B0E0EC01CA5ADF4F2881398148
:102A1000232B41F49B96AA0FBB1FA60FB71FED9364
:102A2000FC9305C011960296A031B10561F7DF91C4
:102A3000CF910895DF92EF92FF920F931F93CF9360
:102A4000DF93EC01D62E7A01FA01008111812281F7
:102A500033810130F3E01F07F1E02F073105D1F09A
:102A600060F40115E1E01E072E07310571F1013018
:102A700011402140310571F062C0033081E0180738
:102A800080E128073105E1F1033013402041310591
:102A9000B9F155C080916302811151C020E04D2DE4
:102AA00061E1CE010E94AB1220E04D2D60E1CE012C
:102AB0000E94AB1220E04D2D64E0CE010E94FF1277
:102AC00081E08093630281EB3BC020E0462F61E10F
:102AD000CE010E94AB1220E04D2D60E1CE010E949C
:102AE000AB12109263026A8567708D2D8770660F36
:102AF000660F660F682B8A819B810E949C071FC00E
:102B000020E04D2D64E1CE010E94AB1220E04D2D5E
:102B100060E1CE010E94AB1264E170E080E090E0E1
:102B20000E9406176A85F70121812695217067703A
:102B30004D2D8A819B810E944D0F1092630280E08F
:102B4000DF91CF911F910F91FF90EF90DF9008954B
:102B5000CF92DF92EF920F931F93CF93DF93CDB776
:102B6000DEB72E970FB6F894DEBF0FBECDBF6C0157
:102B700081E090E09E878D87E12C8E010F5F1F4FD3
:102B80009E01235F3F4F41E0F60162858281938180
:102B90000E945F0E811151C002E011E08981802303
:102BA000D1F019861A861B861C869E01275F3F4F2F
:102BB00044E050E0612FC6010E94D61281110BC083
:102BC000AE01475F5F4F612FC6010E941A15813B1E
:102BD00099F1811132C0000F1F5F1830F9F611E032
:102BE000F6018385811740F119861A861B861C869B
:102BF0009E01275F3F4F44E050E0612FC6010E94D5
:102C0000D612811117C089859A858770917081309D
:102C1000914081F48B859C8581609C878B87AE0178
:102C2000475F5F4F612FC6010E941A15813B21F05B
:102C3000811103C01F5FD4CF80E02E960FB6F894A9
:102C4000DEBF0FBECDBFDF91CF911F910F91EF90EF
:102C5000DF90CF9008950F931F93CF93DF93EC01F4
:102C600088898823F1F00E94D7160C851D852E8552
:102C70003F85601B710B820B930B97FD0FC0CE013C
:102C80000E94A815182F0E94D7166C597F4F8F4F9E
:102C90009F4F6C877D878E879F8701C010E0812FB3
:102CA00001C080E0DF91CF911F910F910895CF93E4
:102CB000CFB7F89480916702811127C0EAE9F0E06C
:102CC0008491E6E8F0E09491E82FF0E0EE0FFF1F2A
:102CD000E255FF4FA591B4918C91892321F461E0D5
:102CE0008AE00E94E81761E08AE00E94AF178CB585
:102CF00080618CBD8CB580648CBD61E08DE00E94EC
:102D0000AF1761E08BE00E94AF17809167028F5F81
:102D100080936702CFBFCF9108951F920F920FB695
:102D20000F9211242F933F938F939F93AF93BF9351
:102D30008091690290916A02A0916B02B0916C023D
:102D40003091680223E0230F2D3720F40196A11D56
:102D5000B11D05C026E8230F0296A11DB11D2093C9
:102D600068028093690290936A02A0936B02B09309
:102D70006C0280916D0290916E02A0916F02B091F1
:102D800070020196A11DB11D80936D0290936E0299
:102D9000A0936F02B0937002BF91AF919F918F91FA
:102DA0003F912F910F900FBE0F901F9018952FB746
:102DB000F8946091690270916A0280916B0290911F
:102DC0006C022FBF08953FB7F89480916D029091E7
:102DD0006E02A0916F02B091700226B5A89B05C04B
:102DE0002F3F19F00196A11DB11D3FBF6627782F17
:102DF000892F9A2F620F711D811D911D42E0660F70
:102E0000771F881F991F4A95D1F708958F929F9237
:102E1000AF92BF92CF92DF92EF92FF926B017C0153
:102E20000E94E3164B015C01C114D104E104F104DA
:102E3000F1F00E9427190E94E316681979098A099E
:102E40009B09683E73408105910570F321E0C21A29
:102E5000D108E108F10888EE880E83E0981EA11CD5
:102E6000B11CC114D104E104F10429F7DDCFFF90B6
:102E7000EF90DF90CF90BF90AF909F908F9008958C
:102E80008230910538F0880F991F880F991F059798
:102E90000197F1F70895789484B5826084BD84B574
:102EA000816084BD85B5826085BD85B5816085BD45
:102EB000EEE6F0E0808181608083E1E8F0E010825E
:102EC000808182608083808181608083E0E8F0E09F
:102ED000808181608083E1EBF0E080818460808389
:102EE000E0EBF0E0808181608083EAE7F0E08081C0
:102EF0008460808380818260808380818160808320
:102F00008081806880831092C1000895833081F0B1
:102F100028F4813099F08230A1F008958730A9F02B
:102F20008830B9F08430D1F4809180008F7D03C067
:102F3000809180008F7780938000089584B58F778B
:102F400002C084B58F7D84BD08958091B0008F77D5
:102F500003C08091B0008F7D8093B0000895CF931F
:102F6000DF9390E0FC01E458FF4F2491FC01E0570F
:102F7000FF4F8491882349F190E0880F991FFC014D
:102F8000E255FF4FA591B4918C559F4FFC01C5911F
:102F9000D4919FB7611108C0F8948C912095822339
:102FA0008C93888182230AC0623051F4F8948C910A
:102FB000322F309583238C938881822B888304C0A1
:102FC000F8948C91822B8C939FBFDF91CF910895C1
:102FD0000F931F93CF93DF931F92CDB7DEB7282FA8
:102FE00030E0F901E859FF4F8491F901E458FF4FAF
:102FF0001491F901E057FF4F04910023C9F0882391
:1030000021F069830E9486176981E02FF0E0EE0FBE
:10301000FF1FEC55FF4FA591B4919FB7F8948C9189
:10302000611103C01095812301C0812B8C939FBF38
:103030000F90DF91CF911F910F9108951F920F92E2
:103040000FB60F9211242F938F939F93EF93FF93BB
:10305000E0918102F09182028081E0918702F091FB
:10306000880282FD12C0908180918A028F5F8F73E7
:1030700020918B02821751F0E0918A02F0E0EF5824
:10308000FD4F958F80938A0201C08081FF91EF915F
:103090009F918F912F910F900FBE0F901F901895B9
:1030A0001F920F920FB60F9211242F933F934F93BD
:1030B0005F936F937F938F939F93AF93BF93EF93A0
:1030C000FF9381E792E00E946319FF91EF91BF9116
:1030D000AF919F918F917F916F915F914F913F91B0
:1030E0002F910F900FBE0F901F90189581E792E0DF
:1030F0000E94281921E0892B09F420E0822F0895ED
:10310000109274021092730288EE93E0A0E0B0E097
:10311000809375029