aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common.mk4
-rw-r--r--keyboard/atomic/extended_keymaps/extended_keymap_default.c2
-rwxr-xr-xkeyboard/atomic/flash-pcb.sh2
-rw-r--r--keyboard/planck/Makefile22
-rw-r--r--keyboard/planck/config.h71
-rw-r--r--keyboard/planck/keymap_midi.c44
-rw-r--r--keyboard/planck/keymaps/keymap_lock.c41
-rwxr-xr-xkeyboard/planck/planck_with_bootloader.hex1796
-rw-r--r--keyboard/preonic/Makefile3
-rw-r--r--keyboard/preonic/beeps.c386
-rw-r--r--keyboard/preonic/beeps.h5
-rw-r--r--keyboard/preonic/extended_keymaps/extended_keymap_lock.c2
-rw-r--r--keyboard/preonic/keymap_midi.c82
-rw-r--r--keyboard/preonic/keymap_midi.h6
-rw-r--r--protocol/bluefruit.mk2
-rw-r--r--protocol/bluefruit/bluefruit.c15
-rw-r--r--protocol/bluefruit/bluefruit.h5
-rw-r--r--protocol/bluefruit/main.c100
-rw-r--r--protocol/lufa/descriptor.c2
-rw-r--r--protocol/lufa/lufa.c4
20 files changed, 2302 insertions, 292 deletions
diff --git a/common.mk b/common.mk
index e61ae69e5..3237e539a 100644
--- a/common.mk
+++ b/common.mk
@@ -68,6 +68,10 @@ ifdef BACKLIGHT_ENABLE
68 OPT_DEFS += -DBACKLIGHT_ENABLE 68 OPT_DEFS += -DBACKLIGHT_ENABLE
69endif 69endif
70 70
71ifdef BLUETOOTH_ENABLE
72 OPT_DEFS += -DBLUETOOTH_ENABLE
73endif
74
71ifdef KEYMAP_SECTION_ENABLE 75ifdef KEYMAP_SECTION_ENABLE
72 OPT_DEFS += -DKEYMAP_SECTION_ENABLE 76 OPT_DEFS += -DKEYMAP_SECTION_ENABLE
73 EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x 77 EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x
diff --git a/keyboard/atomic/extended_keymaps/extended_keymap_default.c b/keyboard/atomic/extended_keymaps/extended_keymap_default.c
index e662c9188..ab08bb6d2 100644
--- a/keyboard/atomic/extended_keymaps/extended_keymap_default.c
+++ b/keyboard/atomic/extended_keymaps/extended_keymap_default.c
@@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
39// ┌─ 2u ────────────┐ 39// ┌─ 2u ────────────┐
40// │ X │ 40// │ X │
41// └─────────────────┘ 41// └─────────────────┘
42 { KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, KC_LCTL, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, 42 { BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_LGUI, KC_SPC, KC_SPC, KC_RGUI, KC_RGUI, KC_RALT, KC_RCTL, BL_STEP, KC_LEFT, KC_DOWN, KC_RGHT },
43// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ 43// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
44// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 44// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
45// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ 45// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
diff --git a/keyboard/atomic/flash-pcb.sh b/keyboard/atomic/flash-pcb.sh
index 2ae15458c..46abc6982 100755
--- a/keyboard/atomic/flash-pcb.sh
+++ b/keyboard/atomic/flash-pcb.sh
@@ -1,3 +1,3 @@
1dfu-programmer atmega32u4 erase --force 1dfu-programmer atmega32u4 erase --force
2dfu-programmer atmega32u4 flash planck_pcb.hex 2dfu-programmer atmega32u4 flash atomic_pcb.hex
3dfu-programmer atmega32u4 reset \ No newline at end of file 3dfu-programmer atmega32u4 reset \ No newline at end of file
diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile
index 2f0ba5ba9..d9e8ce788 100644
--- a/keyboard/planck/Makefile
+++ b/keyboard/planck/Makefile
@@ -121,15 +121,16 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
121CONSOLE_ENABLE = yes # Console for debug(+400) 121CONSOLE_ENABLE = yes # Console for debug(+400)
122COMMAND_ENABLE = yes # Commands for debug and configuration 122COMMAND_ENABLE = yes # Commands for debug and configuration
123# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE 123# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
124#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend 124# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
125# NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA 125# NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
126BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality 126BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
127MIDI_ENABLE = YES # MIDI controls 127# MIDI_ENABLE = YES # MIDI controls
128# UNICODE_ENABLE = YES # Unicode 128# UNICODE_ENABLE = YES # Unicode
129# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
129 130
130ifdef MIDI_ENABLE 131ifdef MIDI_ENABLE
131 SRC += keymap_midi.c \ 132 SRC += keymap_midi.c
132 beeps.c 133 # beeps.c
133endif 134endif
134 135
135ifdef UNICODE_ENABLE 136ifdef UNICODE_ENABLE
@@ -143,7 +144,18 @@ endif
143VPATH += $(TARGET_DIR) 144VPATH += $(TARGET_DIR)
144VPATH += $(TOP_DIR) 145VPATH += $(TOP_DIR)
145 146
146include $(TOP_DIR)/protocol/lufa.mk 147
148
149ifdef BLUETOOTH_ENABLE
150 BLUEFRUIT_TRACE_SERIAL=true
151
152 include $(TOP_DIR)/protocol.mk
153 include $(TOP_DIR)/protocol/bluefruit.mk
154 include $(TOP_DIR)/protocol.mk
155else
156 include $(TOP_DIR)/protocol/lufa.mk
157endif
158
147include $(TOP_DIR)/common.mk 159include $(TOP_DIR)/common.mk
148include $(TOP_DIR)/rules.mk 160include $(TOP_DIR)/rules.mk
149 161
diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h
index e97012770..0a1a6a935 100644
--- a/keyboard/planck/config.h
+++ b/keyboard/planck/config.h
@@ -58,16 +58,83 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
58 keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ 58 keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
59) 59)
60 60
61#ifdef BLUETOOTH_ENABLE
62#ifdef __AVR_ATmega32U4__
63 #define SERIAL_UART_BAUD 9600
64 #define SERIAL_UART_DATA UDR1
65 #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1)
66 #define SERIAL_UART_RXD_VECT USART1_RX_vect
67 #define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
68 #define SERIAL_UART_INIT() do { \
69 UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
70 UBRR1H = (uint8_t) (SERIAL_UART_UBRR>>8); /* baud rate */ \
71 UCSR1B = (1<<TXEN1); /* TX: enable */ \
72 UCSR1C = (0<<UPM11) | (0<<UPM10) | /* parity: none(00), even(01), odd(11) */ \
73 (0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10); /* data-8bit(011) */ \
74 sei(); \
75 } while(0)
76#else
77# error "USART configuration is needed."
78#endif
79
80
81// I'm fairly sure these aren't needed, but oh well - Jack
82
83/*
84 * PS/2 Interrupt configuration
85 */
86#ifdef PS2_USE_INT
87/* uses INT1 for clock line(ATMega32U4) */
88#define PS2_CLOCK_PORT PORTD
89#define PS2_CLOCK_PIN PIND
90#define PS2_CLOCK_DDR DDRD
91#define PS2_CLOCK_BIT 1
92
93#define PS2_DATA_PORT PORTD
94#define PS2_DATA_PIN PIND
95#define PS2_DATA_DDR DDRD
96#define PS2_DATA_BIT 0
97
98#define PS2_INT_INIT() do { \
99 EICRA |= ((1<<ISC11) | \
100 (0<<ISC10)); \
101} while (0)
102#define PS2_INT_ON() do { \
103 EIMSK |= (1<<INT1); \
104} while (0)
105#define PS2_INT_OFF() do { \
106 EIMSK &= ~(1<<INT1); \
107} while (0)
108#define PS2_INT_VECT INT1_vect
109#endif
110
111/*
112 * PS/2 Busywait configuration
113 */
114#ifdef PS2_USE_BUSYWAIT
115#define PS2_CLOCK_PORT PORTD
116#define PS2_CLOCK_PIN PIND
117#define PS2_CLOCK_DDR DDRD
118#define PS2_CLOCK_BIT 1
119
120#define PS2_DATA_PORT PORTD
121#define PS2_DATA_PIN PIND
122#define PS2_DATA_DDR DDRD
123#define PS2_DATA_BIT 0
124#endif
125
126#endif
127
61/* 128/*
62 * Feature disable options 129 * Feature disable options
63 * These options are also useful to firmware size reduction. 130 * These options are also useful to firmware size reduction.
64 */ 131 */
65 132
66/* disable debug print */ 133/* disable debug print */
67#define NO_DEBUG 134// #define NO_DEBUG
68 135
69/* disable print */ 136/* disable print */
70#define NO_PRINT 137// #define NO_PRINT
71 138
72/* disable action features */ 139/* disable action features */
73//#define NO_ACTION_LAYER 140//#define NO_ACTION_LAYER
diff --git a/keyboard/planck/keymap_midi.c b/keyboard/planck/keymap_midi.c
index 748ca4d56..b7eba3ab7 100644
--- a/keyboard/planck/keymap_midi.c
+++ b/keyboard/planck/keymap_midi.c
@@ -35,7 +35,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
35 if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { 35 if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
36 if (record->event.pressed) { 36 if (record->event.pressed) {
37 starting_note++; 37 starting_note++;
38 // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); 38 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
39 midi_send_cc(&midi_device, 0, 0x7B, 0); 39 midi_send_cc(&midi_device, 0, 0x7B, 0);
40 midi_send_cc(&midi_device, 1, 0x7B, 0); 40 midi_send_cc(&midi_device, 1, 0x7B, 0);
41 midi_send_cc(&midi_device, 2, 0x7B, 0); 41 midi_send_cc(&midi_device, 2, 0x7B, 0);
@@ -43,15 +43,15 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
43 midi_send_cc(&midi_device, 4, 0x7B, 0); 43 midi_send_cc(&midi_device, 4, 0x7B, 0);
44 return; 44 return;
45 } else { 45 } else {
46 // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); 46 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
47 // stop_all_notes(); 47 stop_all_notes();
48 return; 48 return;
49 } 49 }
50 } 50 }
51 if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { 51 if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
52 if (record->event.pressed) { 52 if (record->event.pressed) {
53 starting_note--; 53 starting_note--;
54 // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); 54 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
55 midi_send_cc(&midi_device, 0, 0x7B, 0); 55 midi_send_cc(&midi_device, 0, 0x7B, 0);
56 midi_send_cc(&midi_device, 1, 0x7B, 0); 56 midi_send_cc(&midi_device, 1, 0x7B, 0);
57 midi_send_cc(&midi_device, 2, 0x7B, 0); 57 midi_send_cc(&midi_device, 2, 0x7B, 0);
@@ -59,8 +59,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
59 midi_send_cc(&midi_device, 4, 0x7B, 0); 59 midi_send_cc(&midi_device, 4, 0x7B, 0);
60 return; 60 return;
61 } else { 61 } else {
62 // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); 62 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
63 // stop_all_notes(); 63 stop_all_notes();
64 return; 64 return;
65 } 65 }
66 } 66 }
@@ -72,13 +72,13 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
72 midi_send_cc(&midi_device, 2, 0x7B, 0); 72 midi_send_cc(&midi_device, 2, 0x7B, 0);
73 midi_send_cc(&midi_device, 3, 0x7B, 0); 73 midi_send_cc(&midi_device, 3, 0x7B, 0);
74 midi_send_cc(&midi_device, 4, 0x7B, 0); 74 midi_send_cc(&midi_device, 4, 0x7B, 0);
75 // stop_all_notes(); 75 stop_all_notes();
76 // for (int i = 0; i <= 7; i++) { 76 for (int i = 0; i <= 7; i++) {
77 // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); 77 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
78 // _delay_us(80000); 78 _delay_us(80000);
79 // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); 79 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
80 // _delay_us(8000); 80 _delay_us(8000);
81 // } 81 }
82 return; 82 return;
83 } 83 }
84 if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { 84 if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
@@ -88,23 +88,23 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
88 midi_send_cc(&midi_device, 2, 0x7B, 0); 88 midi_send_cc(&midi_device, 2, 0x7B, 0);
89 midi_send_cc(&midi_device, 3, 0x7B, 0); 89 midi_send_cc(&midi_device, 3, 0x7B, 0);
90 midi_send_cc(&midi_device, 4, 0x7B, 0); 90 midi_send_cc(&midi_device, 4, 0x7B, 0);
91 // stop_all_notes(); 91 stop_all_notes();
92 // for (int i = 0; i <= 7; i++) { 92 for (int i = 0; i <= 7; i++) {
93 // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); 93 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
94 // _delay_us(80000); 94 _delay_us(80000);
95 // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); 95 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
96 // _delay_us(8000); 96 _delay_us(8000);
97 // } 97 }
98 return; 98 return;
99 } 99 }
100 100
101 if (record->event.pressed) { 101 if (record->event.pressed) {
102 // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); 102 // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
103 midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); 103 midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
104 // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); 104 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
105 } else { 105 } else {
106 // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); 106 // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
107 midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); 107 midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
108 // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); 108 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
109 } 109 }
110} \ No newline at end of file 110} \ No newline at end of file
diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c
index 4fe2e0a2b..b844d1cda 100644
--- a/keyboard/planck/keymaps/keymap_lock.c
+++ b/keyboard/planck/keymaps/keymap_lock.c
@@ -2,7 +2,7 @@
2#include "backlight.h" 2#include "backlight.h"
3#include "action_layer.h" 3#include "action_layer.h"
4#include "keymap_midi.h" 4#include "keymap_midi.h"
5#include "beeps.h" 5#include <avr/boot.h>
6 6
7const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 7const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
8[0] = { /* Qwerty */ 8[0] = { /* Qwerty */
@@ -53,6 +53,16 @@ const uint16_t PROGMEM fn_actions[] = {
53 53
54}; 54};
55 55
56uint16_t hextokeycode(int hex) {
57 if (hex == 0x0) {
58 return KC_0;
59 } else if (hex < 0xA) {
60 return KC_1 + (hex - 0x1);
61 } else {
62 return KC_A + (hex - 0xA);
63 }
64}
65
56const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) 66const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
57{ 67{
58 // MACRODOWN only works in this function 68 // MACRODOWN only works in this function
@@ -64,6 +74,35 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
64 backlight_set(BACKLIGHT_LEVELS); 74 backlight_set(BACKLIGHT_LEVELS);
65 default_layer_and(0); 75 default_layer_and(0);
66 default_layer_or((1<<5)); 76 default_layer_or((1<<5));
77
78 uint8_t low = boot_lock_fuse_bits_get(0x0000);
79 uint8_t high = boot_lock_fuse_bits_get(0x0003);
80 uint8_t ext = boot_lock_fuse_bits_get(0x0002);
81 uint8_t lock = boot_lock_fuse_bits_get(0x0001);
82
83 register_code(hextokeycode((low & 0xF0) >> 4));
84 unregister_code(hextokeycode((low & 0xF0) >> 4));
85 register_code(hextokeycode((low & 0x0F)));
86 unregister_code(hextokeycode((low & 0x0F)));
87
88
89 register_code(hextokeycode((high & 0xF0) >> 4));
90 unregister_code(hextokeycode((high & 0xF0) >> 4));
91 register_code(hextokeycode((high & 0x0F)));
92 unregister_code(hextokeycode((high & 0x0F)));
93
94
95 register_code(hextokeycode((ext & 0xF0) >> 4));
96 unregister_code(hextokeycode((ext & 0xF0) >> 4));
97 register_code(hextokeycode((ext & 0x0F)));
98 unregister_code(hextokeycode((ext & 0x0F)));
99
100
101 register_code(hextokeycode((lock & 0xF0) >> 4));
102 unregister_code(hextokeycode((lock & 0xF0) >> 4));
103 register_code(hextokeycode((lock & 0x0F)));
104 unregister_code(hextokeycode((lock & 0x0F)));
105
67 // note(0+12, 20); 106 // note(0+12, 20);
68 // note(0+24, 20); 107 // note(0+24, 20);
69 } else { 108 } else {
diff --git a/keyboard/planck/planck_with_bootloader.hex b/keyboard/planck/planck_with_bootloader.hex
new file mode 100755
index 000000000..c61dfb743
--- /dev/null
+++ b/keyboard/planck/planck_with_bootloader.hex
@@ -0,0 +1,1796 @@
1:020000020000FC
2:047000000C948D3E21
3:047028000C94B73DD0
4:10702F0012010002FF010020EB03F42F0000010208
5:10703F00030109021200010100803209040000005F
6:10704F00000000000C03410054004D0045004C00AF
7:10705F001603410054006D00330032005500340018
8:10706F004400460055000C0331002E0030002E0066
9:10707F0030000403090416010C0100000C0000018C
10:02708F006C7F14
11:1070920012BD01BDF89A00B5089501E00895F9996D
12:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929
13:1070B200FECF0C944938F80104910895F8013491F7
14:1070C20031962491890108950091610000930C0189
15:1070D20000E80093610001E00093610005BF02E057
16:1070E20005BF0C9486380091D70001600093D70049
17:1070F200A89507EF04BF0091600000610093600053
18:1071020000E00093600001E008950E94AA3D0E9401
19:10711200B53DFDCF0CD00F7708D0006806D00061D6
20:1071220004D0016028D0789408950093D80000918B
21:10713200D8000895FCDF00621ED04CD009B500FFD4
22:10714200FDCFF5DF0F7D17D00091E0000E7F009399
23:10715200E0000091E000077F0093E0000091E20070
24:1071620001600093E2000091E20008600093E200F7
25:1071720078940C94743B0093D800089500910D010B
26:10718200002359F40091D90000FF07C0D0DF006846
27:10719200F2DF01E000930D01CDDFE0E2F2E00081D9
28:1071A200018100FF0DC0008111811E7F11830083C8
29:1071B20001E00093EA0000E00093EA0000931E025F
30:1071C20000E00093E9000091E80003FF02C00E9482
31:1071D200F23B0895A89539D000E40093600000E0E6
32:1071E200009381000093800010E0009385000093DB
33:1071F200840001E006BB00918100036000938100DE
34:107202000091600007FFFCCF00E80093600010933C
35:107212008100A89507EF04BF18D010936000209159
36:1072220084003091850010938100109380001093A8
37:1072320085001093840001E006BB2D3D354010F01F
38:1072420002E101C002E009BD089500916000006101
39:107252000093600008950E94AD3E239741D100E063
40:1072620000930901B5D104811581012B51F437D165
41:1072720000910701002309F4B9C000E0009307015F
42:10728200B5C058D102FFFDCF37D1068335D1009367
43:107292000F0132D1009310012FD1009311012CD193
44:1072A2000093120129D10093130102852091130149
45:1072B20030911201409111015091100116811A95DD
46:1072C20041F01250A9F01A9599F11A9509F473C078
47:1072D2008BC010910F01113011F411E001C010E0C8
48:1072E200138799D00C3F11F414D17FC077D17DC0A0
49:1072F20092D010910F01112329F01A9549F01A9595
50:10730200A9F073C010E013870C3F09F06EC0ECCFF8
51:1073120056D103C04CD109F468C00D911C9144D1DF
52:107322000F3FC1F305E0009309015FC011E0EBCF0D
53:10733200D2D029F00250E1F10A9541F056C0FDD0B9
54:107342000E94A33F0FEF00930A014FC0552319F08B
55:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE
56:1073620003FFFDCF67D051D04AD008E00093600000
57:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F
58:1073820044D00FEF1FE004C009811A810150104060
59:1073920009831A8309811A81012BB1F700E800934E
60:1073A200610000910C01009361000C940000FFCF7A
61:1073B20001E003871AC08FD019F00A9539F015C081
62:1073C200535098F4BAD002E000870FC0505339F0FE
63:1073D2005A9541F05F52B1F35A95A1F306C002E00B
64:1073E2000883F0CF01E0FCCFA8D079D02396E4E067
65:1073F2000C94BA3E01E005BF00E005BF089500917C
66:10740200D8000F770093D800089509B50D7F09BD04
67:1074120000E009BD08955183408333832283109194
68:10742200E8001B7F1093E8001091E8001F7710938B
69:10743200E80008955DD053D0F8940091E000016017
70:107442000093E000089579D04AC0219749D0009175
71:107452000601035019F00250B9F00BC03CD021F0E4
72:107462000A9559F00A9529F400910A010C3F19F482
73:1074720050D02196089567D0FCCF0091010100936E
74:10748200F100009100010AC01091100124D019F0FE
75:107492000A9549F0EECF135018F400E00093F10082
76:1074A2001ED044D0E6CF105339F01A9539F01F524E
77:1074B20041F01A9541F0F4CF08E5F0CF00E006D094
78:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5
79:1074D20030E00C94113F00910F010023089521C068
80:1074E2000BD008D007D00093040106D00093050109
81:1074F20021D00BC000D008830091F10008950091C3
82:10750200EB0000620093EB0015D0077F0093E800C8
83:107512000895F5DF02E00093080103E000930901FA
84:10752200089559D007D000FFFDCF089503D002FF80
85:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A
86:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD
87:107552002BD00093F1002BD059F43DD0082F092BEA
88:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1
89:10757200042D4394003289F300910B0100230D91F5
90:107582001C9131F311970E945838E3CFD3DF00FFEB
91:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B
92:1075A200CCDFE5E00C94B93E11970C945C380D9158
93:1075B2001C910F5F1F4F1C930E93019708958281B8
94:1075C200938100811181801B910B0196DF01089547
95:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71
96:1075E200F7DF80819181A081B181AF710481158122
97:1075F20000521040048315830AC000910B0100233E
98:1076020031F4A301920103E911E00E943B3F47D00C
99:10761200B8F1662477242C0111C06EDFF301ED5618
100:10762200FE4F008301E0600E00E0701E01960091A3
101:10763200F200002311F033D0B8F47FDF30D0E8F24B
102:10764200F301B096E238F040C0F674DF02FFFDCFDE
103:107652000091F200BDDF24813581201B304024835C
104:107662003583E5CF49DFAA95AA23E1F700910B0103
105:10767200013099F62091F1008C010E945038D6CF4A
106:1076820004811581012B21F055DF02FFFDCF55DF6B
107:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051
108:1076A200F1E0028113810817190708952091EB0078
109:1076B20021602093EB000093EC000091ED0002703A
110:1076C200012B0093ED000091ED0002600093ED00AC
111:1076D2001091EE00012F000F00E0001F0895412FCE
112:1076E2000093E900089500E009D000FD05C000E024
113:1076F200F7DF10E202E0DACF00E00895F1DF009157
114:10770200EB0008950F770132A9F5112369F11A955B
115:1077120059F01A9561F01A9569F01A95F9F01A95CF
116:10772200C1F01A95D9F024C00E942C3920C00E94C1
117:10773200263A1DC029D00091090123D001E01FD0B3
118:1077420020D0009108011BD00E94923A0E94973AE1
119:107752000EC01AD00091080114D007C002E00093B5
120:10776200080100E0009309010FD00E94923A03C081
121:107772000E94803A02C001E0089500E0089501D01D
122:1077820000E00093F10008950091E800077F009364
123:10779200E800089508950350F9F4112339F01A9579
124:1077A20051F01A9581F01A9599F016C004E016D09E
125:1077B20001E810E703C011D003E510E7E7E1F2E0CA
126:1077C20000831183D8CF06E109D00FE510E7F6CF89
127:1077D20004D005E710E7F2CFD0CF0CE000931A02F5
128:1077E200089527D120D100931D02E1D0212F11232A
129:1077F20029F12A95E9F02250F1F0225099F02A95C8
130:1078020049F0225061F02A9581F02A95E1F02A95FB
131:10781200E9F023C0003809F44FC00C94833B0038D0
132:10782200E1F7C8C00023C9F71EC00023B1F72DC07D
133:10783200033098F744C1033080F70BC1003868F376
134:10784200033858F7C9C0013841F77BC1013051F400
135:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA
136:1078620009F41ED008951091E3001078DCD00F7750
137:10787200012B0093E300E9D0ACD000FFFDCF0091D3
138:10788200E30000680093E300089591D0123040F4C1
139:107892000FD010931E02DAD000911E020C94CB3B43
140:1078A2000091EB0001D004C000620093EB00089548
141:1078B2000091E800077FC0C0BA93AA93229700E024
142:1078C2000093190274D0AFD0202F2A9519F02A956F
143:1078D200E9F022C002E100931A020FE210E7E7E1A9
144:1078E200F2E0008311839DD008839DD00983E0DFFD
145:1078F20000911A0210E02881398102171307A8F4B7
146:107902000F7181F401E00093190211C002E10093AA
147:107912001A0201E410E7E3CF0E94CC3B002319F7DF
148:107922008ED040C01093190202C020931A027ED05A
149:10793200A7E1B2E001C08AD000911A02002309F146
150:1079420048D004FD1EC045D000FD03C042D004FF54
151:10795200FACF10E0012F1395003281F0ED91FC91E6
152:107962001197049133D02D913C912F5F3F4F3C935F
153:107972002E93FD0103810A95038361F72AD004FF48
154:10798200DACF00911902013039F423D004FD04C08A
155:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F
156:1079A20018D00B7F49D02296A991B99108951091D0
157:1079B200F10008957DDF00911E0208D047D009D062
158:1079C2000F773AD006D002FFFDCFBFC00093F1007F
159:1079D20008950091E800089524D010911D021058D6
160:1079E20029F01A9589F01A9591F019C061DF00917A
161:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63
162:107A020018D0E7DF0F770CC053DF00E0F2CF51D080
163:107A12000F7710E0F801E55EFD4F0081EACF0FD04D
164:107A22000BC001D000D00091F1000895D2DF0F7E8B
165:107A320003C00091E8000B7F0093E80008950091D5
166:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31
167:107A5200F3CF00911D02002329F00A9509F10A953E
168:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE
169:107A7200B9F4D9DF0F7711F416D01BD00093E900C7
170:107A82001091EB0010FF0BC00ED010E01093E90034
171:107A920021E0F801E55EFD4F20834FD003C042D0C4
172:107AA20045D0CFDFC9CF1091EB0010621093EB00ED
173:107AB20008951091E800177F1093E800089500914F
174:107AC2001D02002311F4AFDF02C0013011F4B7DF51
175:107AD200B3CF023031F52DD019F52091F1002F7777
176:107AE2002093E90023D000FF19C081F01FD000616C
177:107AF200DCDE01E010E0422F0E949F3E0093EA008C
178:107B020000E00093EA0012D00860CFDE0BD030E034
179:107B1200F901E55EFD4F008310D0DACF03D0D7CF55
180:107B2200BFDE089500E00093E90008950091EB00A4
181:107B3200089579DF3CDF00230895BADE4ADF0E7F25
182:107B4200089583DF46DF02FFFDCF73DF42DF0F7749
183:107B520073CF0091D70001600093D7000E948B3849
184:107B620000E000931F0208950C94BF388A93FA93A1
185:107B7200EA933A922A921A920A927A936A935A93BF
186:107B82004A933A932A931A930A938FB70091DA0091
187:107B920000FF24C00091D80000FF20C00EEF009328
188:107BA200DA000091D90000FF11C001E000930D013D
189:107BB200ABD0026096D09AD00860A2D00E949B38C7
190:107BC2000091E0000E7F0093E00008C000E0009307
191:107BD2000D0100931E0298D0046083D07FD002FF73
192:107BE20005C084D002FF02C00BEF75D077D000FF32
193:107BF2001BC07CD000FF18C001E000930E016AD0C8
194:107C020083D000626ED00EEF6FD0006179D06ED05B
195:107C12000F7D76D00091D80000620093D80009B59C
196:107C22000D7F09BD00E009BD59D004FF20C05ED020
197:107C320004FF1DC009B500FD05C00E94EB3809B55F
198:107C420000FFFDCF0091D8000F7D0093D80042D0F5
199:107C520000910E01002359F04CD00FEE45D00F7E5B
200:107C620052D000643ED042D001604AD042D036D0D9
201:107C720005FF0FC03BD005FF0CC000E000930E01D2
202:107C820035D00F7E3DD00FED2FD00F7D3CD0006858
203:107C920028D024D003FF0DC029D003FF0AC000E082
204:107CA20000931F0207EF17D00E94743B2DD0116082
205:107CB20018D08FBF09911991299139914991599100
206:107CC200699179910990199029903990E991F991E6
207:107CD200899118950FEE0093E10008950091E1005B
208:107CE20008951183008308950093E1000091E2005A
209:107CF20008950091E200006203D00091E200086062
210:107D02000093E2000895FCDFE0E2F2E000811181DD
211:107D1200089500008895FECF01E60DBF02E00EBF78
212:107D2200C2EED2E00E947438002311F00E94D33ECA
213:107D32000E9465380E948A3E0C948A3E4A951AF047
214:107D4200000F111FFBCF0895BA92AA929A928A92BB
215:107D52007A926A925A924A92BA93AA939A938A937D
216:107D62000895BB84AA84998488847F806E805D8014
217:107D72004C80BB81AA8199818881F0E00FB6F8948A
218:107D8200CE0FDF1F0FBE089520E006D0E9F7089559
219:107D9200259102D0E9F708952D9301501040202F2C
220:107DA200212B089585E890E7FC0105911491FC01CF
221:107DB2003296A591B491FC01349625913491422FCB
222:107DC200432B19F0F901E4DF01C0DEDF069610E76C
223:107DD2008139910748F308952F930CD02F9101D048
224:107DE20008953CD0F12FE02F45E047BFE89536D00B
225:107DF20012D0089533D0F12FE02F43E047BFE8952A
226:107E02002DD008952BD0F12FE02F43E047BFE89506
227:107E120025D001D0089522D041E147BFE8951EC088
228:107E22001DD0F12FE02F41E247BFC895002D16C0AB
229:107E320015D0F12FE02F49E047BFC895002D0EC0A5
230:107E4200F32FE22F012E102E41E047BFE89506C026
231:107E520005D0002E29E027BFE89500C0022E27B7E3
232:107E620020FDFCCF202D0895022E27B726FDFCCF42
233:107E7200202D08950E94A53E22974801C901DA01EA
234:107E820010C05BD001E0A00E00E0B01E00E4A0161E
235:107E920000E0B00608F440C0830120E030E00E9418
236:107EA200F23E0A2F0B2B09F440C0082F0F7710E087
237:107EB2002C01401A510A320100E4A02E03C00A2FFD
238:107EC2000B2BE1F04816590680F0F40101914F01A5
239:107ED2000983119729F001914F010883119711C06D
240:107EE200F2013196049108830CC0F20104910983D6
241:107EF2003196E817F907A1F7F401EDCF1BD00883FB
242:107F020019839201088119810E94213F16D0AA94F7
243:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE
244:107F220009F4AFCF83011DD0B7CF01E02296ECE078
245:107F32000C94B23E82010C945F3802E0400E00E0E5
246:107F4200501E08959A938A9380E090E08C0109D0A4
247:107F520080589F4F8F3F0FE69007C0F38991999108
248:107F6200089520E030E00C94FB3E00000000000089
249:067F720000000000FC000D
250:107FE4000C94ED3E0C94113F0C94193F0C94213FDA
251:0C7FF4000C94F23E0C94033F0C94293FC7
252:040000030000700089
253:100000000C949D020C94E1020C94E1020C94E10228
254:100010000C94E1020C94E1020C94E1020C94E102D4
255:100020000C94E1020C94E1020C941C120C94EE125C
256:100030000C948D240C94E1020C94E1020C94E102E6
257:100040000C94E1020C94E1020C94E1020C94E102A4
258:100050000C94E1020C94FA240C94E1020C94E10259
259:100060000C94E1020C94E1020C94E1020C94E10284
260:100070000C94E1020C94E1020C94E1020C94E10274
261:100080000C94860A0C94E1020C94E1020C94E102B7
262:100090000C94E1020C94E1020C94E1020C94E10254
263:1000A0000C94E1020C94E1020C94E10207634236E5
264:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9
265:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD
266:1000D0000000803F08000000BE922449123EABAAF7
267:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52
268:1000F000AA3E00000000BF000000803F000000009A
269:1001000000084178D3BB4387D1133D190E3CC3BDD2
270:100110004282AD2B3E68EC8276BED98FE1A93E4C7F
271:1001200080EFFFBE01C4FF7F3F0000000000000021
272:10013000F1A4F1A3018C028C048C2B0014001A0092
273:100140000800150017001C0018000C001200130016
274:100150002A00290004001600070009000A000B000D
275:100160000D000E000F0033003400E1001D001B00E5
276:100170000600190005001100100036003700380095
277:1001800028000030E000E200E30002202C002C00F8
278:1001900001205000510052004F002B0014001A00A3
279:1001A000090013000A000D000F0018001C003300A6
280:1001B0002A002900040015001600170007000B0094
281:1001C000110008000C0012003400E1001D001B00AB
282:1001D0000600190005000E00100036003700380038
283:1001E00028000030E000E200E30002202C002C0098
284:1001F00001205000510052004F002B003400360007
285:10020000370013001C0009000A00060015000F004B
286:100210002A00290004001200080018000C00070042
287:100220000B001700110016003800E1003300140025
288:100230000D000E001B00050010001A0019001D0023
289:1002400028000030E000E200E30002202C002C0037
290:1002500001205000510052004F0035021E021F02C3
291:100260002002210222022302240225022602270262
292:100270002A0001003A003B003C003D003E003F00E8
293:100280002D022E022F0230023102010040004100F7
294:100290004200430044004500032004200520005094
295:1002A0000100010001000100010002200100010025
296:1002B0000100AB00AA00A900AE0035001E001F001F
297:1002C0002000210022002300240025002600270012
298:1002D0002A0001003A003B003C003D003E003F0088
299:1002E0002D002E002F0030003100010040004100A1
300:1002F0004200430044004500032004200520005034
301:1003000001000100010001000100010001000100E5
302:100310000120AB00AA00A900AE0028035400680029
303:100320006500200050006C0061006E0063006B00EF
304:1003300020004B006500790062006F0061007200D0
305:10034000640000002C034F007200740068006F000E
306:100350006C0069006E0065006100720020004B00B7
307:100360006500790062006F00610072006400730034
308:100370000000040309040902D000060100A03209AC
309:100380000400000103010100092111010001223FC5
310:10039000000705810308000A0904010001030102A6
311:1003A00000092111010001224D0007058203080008
312:1003B0000A090402000103000000092111010001E3
313:1003C0002236000705830308000A0904030002031C
314:1003D000000000092111010001222000070584030B
315:1003E00020000107050403200001090404000001A6
316:1003F00001000009240100010900010509040500AC
317:10040000020103000007240100014100062402014B
318:100410000100062402020200092403010301020173
319:10042000000924030204010101000905060240003D
320:1004300005000005250101010905850240000500B0
321:100440000005250101031201100100000008EDFE66
322:1004500060600100010200010631FF0974A1010979
323:1004600075150025FF952075088102097615002570
324:10047000FF952075089102C005010980A101850240
325:1004800016010026B7001A01002AB7007510950161
326:100490008100C0050C0901A1018503160100269CFD
327:1004A000021A01002A9C02751095018100C0050105
328:1004B0000902A1010901A100050919012905150079
329:1004C00025019505750181029501750381010501DD
330:1004D000093009311581257F950275088106093893
331:1004E0001581257F950175088106050C0A380215CE
332:1004F00081257F950175088106C0C005010906A107
333:1005000001050719E029E715002501950875018106
334:1005100002950175088101050819012905950575E0
335:100520000191029501750391010507190029FF1535
336:100530000025FF950675088100C011241FBECFEF6E
337:10054000DAE0DEBFCDBF04B603FE24C0809178039D
338:1005500090917903A0917A03B0917B038730904BFF
339:10056000A740B04BB9F4109278031092790310921F
340:100570007A0310927B0314BE84B7877F84BF88E11F
341:100580000FB6F89480936000109260000FBEE0E018
342:10059000F8E3099511E0A0E0B1E0E2EAFFE502C06E
343:1005A00005900D92A63BB107D9F713E0A6EBB1E099
344:1005B00001C01D92A837B107E1F70E94F90E0C9413
345:1005C000CF2F0C9400000895089561110DC0FC0117
346:1005D0008281882331F085EE0E949D190E94B62BFE
347:1005E00003C085EE0E94651A80E090E008958B3B81
348:1005F000910568F4883A910530F5853A9105C0F483
349:100600008430910598F4019709F06FC071C0803E65
350:10061000910508F46AC0883E910540F09C01205F76
351:1006200031092031310508F060C05CC09C01A1C0D7
352:10063000853A910509F45FC0863A910509F45EC0D8
353:1006400023E830E496C0883A910509F45AC0893A03
354:10065000910509F459C08A3A910509F458C08B3ABA
355:10066000910509F457C08C3A910509F456C08D3AAA
356:10067000910509F455C0803B910509F454C08E3AA8
357:10068000910509F453C08F3A910509F452C0813B9A
358:10069000910509F451C0823B910509F450C0833B98
359:1006A000910509F44FC0843B910509F44EC0853B88
360:1006B000910509F44DC0863B910509F44CC0873B78
361:1006C000910509F44BC0883B910509F44AC0893B68
362:1006D000910509F449C08A3B910509F048C02AE216
363:1006E00036E447C09C01306544C020E030E041C0A2
364:1006F00021E030E03EC021E830E43BC022E830E4B5
365:1007000038C022EE34E435C029EE34E432C02AEE9B
366:1007100034E42FC025EB34E42CC026EB34E429C0AC
367:1007200027EB34E426C02CEC34E423C02DEC34E475
368:1007300020C023E835E41DC02AE835E41AC022E9C8
369:1007400035E417C024E935E414C021E236E411C0D1
370:1007500023E236E40EC024E236E40BC025E236E4A0
371:1007600008C026E236E405C027E236E402C020E0F5
372:1007700034E4C90108959CE0799FF001112490E3CD
373:10078000899FE00DF11D1124E60FF11DEE0FFF1FF3
374:10079000E65CFE4F25913491C9010895880F991F99
375:1007A00082559040FC0125913491C9010895880F2C
376:1007B000991F825D9E4FFC0125913491C9010895D6
377:1007C0000E94BB039C013A9521153F4108F4DFC00C
378:1007D0009C0130522115304120F49F700E94D703B4
379:1007E00008959C0130532115304118F49927906CDD
380:1007F00008959C0130542031310520F48F709927E1
381:10080000946D0895803120E4920719F480E091ED11
382:100810000895813140E4940719F480E090ED089543
383:10082000823120E4920719F480E092ED089583313B
384:1008300040E4940719F480E093ED0895811520E5D4
385:10084000920711F40C941F25813040E5940731F490
386:100850008091680281608093680208959C013056FF
387:100860002115304108F402C097FF02C0906F08952F
388:10087000803E9105E0F4803C910568F58133910557
389:1008800009F474C048F48932910509F46AC08A32C7
390:10089000910509F07AC074C089339105F9F0823866
391:1008A0009105E1F08533910509F06FC050C0833E9A
392:1008B0009105A9F140F4803E9105C9F0823E910571
393:1008C00009F063C01BC0863E910571F1873E91051A
394:1008D00009F05BC037C00E94CE03089520917B02CF
395:1008E00020FD02C021FF51C080EE90E04EC08091FB
396:1008F0007B0280FFF9CF89E390E047C080917B02C3
397:1009000082FF0AC080917B0284FF03C080E090E0F8
398:100910003CC083EE90E039C082EE90E036C080911A
399:100920007B0282FFEFCFF8CF80917B0283FF07C06D
400:1009300080917B0284FDEACF87EE90E026C086EEB0
401:1009400090E023C080917B0283FFF2CFF8CF8091AB
402:100950007B0285FF03C089E290E017C085E390E049
403:1009600014C080917B0285FDF9CFF5CF80917B0289
404:1009700086FF03C08AE290E008C081E390E005C0F2
405:1009800080917B0286FDF9CFF5CF0E94F702089592
406:100990005F926F927F928F929F92AF92BF92CF920F
407:1009A000DF92EF92FF920F931F93CF93DF93CDB718
408:1009B000DEB728970FB6F894DEBF0FBECDBF9E01FD
409:1009C0002F5F3F4F4E0189E0880E911C60E070E080
410:1009D00000E010E0E12CF12CC12CD12CA12CB12C89
411:1009E00088E0782E622E532E41E050E0E3E2F1E001
412:1009F000A62DB52D872D01900D928A95E1F7F9016D
413:100A0000819191919F01FC01E07FFF27E032F10588
414:100A100059F48F709927FA0102C0EE0FFF1F8A95D3
415:100A2000E2F7AE2ABF2A37C0E033F10559F48F70E0
416:100A30009927FA0102C0EE0FFF1F8A95E2F7CE2A2E
417:100A4000DF2A29C0E034F10559F48F709927FA01A3
418:100A500002C0EE0FFF1F8A95E2F7EE2AFF2A1BC0A5
419:100A6000E035F10559F48F709927FA0102C0EE0FB5
420:100A7000FF1F8A95E2F70E2B1F2B0DC0E036F10504
421:100A800051F48F709927FA0102C0EE0FFF1F8A956B
422:100A9000E2F76E2B7F2B2815390509F0A7CF94B10B
423:100AA0008A2D8095892384B985B18A2985B997B122
424:100AB0008C2D8095892387B988B18C2988B99AB102
425:100AC0008E2D809589238AB98BB18E298BB99DB1E2
426:100AD000802F809589238DB98EB1802B8EB990B3EC
427:100AE000862F8095892380BB81B3862B81BB289676
428:100AF0000FB6F894DEBF0FBECDBFDF91CF911F912F
429:100B00000F91FF90EF90DF90CF90BF90AF909F90AC
430:100B10008F907F906F905F9008955F926F927F9219
431:100B20008F929F92AF92BF92CF92DF92EF92FF92FD
432:100B30000F931F93CF93DF93CDB7DEB768970FB6B0
433:100B4000F894DEBF0FBECDBF85B7806885BF85B77F
434:100B5000806885BF0E94CF076E9A769A0E94C8046B
435:100B60009E012F5F3F4F4E0189E1880E911C60E08E
436:100B700070E000E010E0E12CF12CC12CD12CA12C74
437:100B8000B12C98E1792E622E532E41E050E0EBE239
438:100B9000F1E0A62DB52D872D01900D928A95E1F7F4
439:100BA000F901819191919F01FC01E07FFF27E032E3
440:100BB000F10559F48F709927FA0102C0EE0FFF1F5B
441:100BC0008A95E2F7AE2ABF2A37C0E033F10559F41F
442:100BD0008F709927FA0102C0EE0FFF1F8A95E2F786
443:100BE000CE2ADF2A29C0E034F10559F48F70992705
444:100BF000FA0102C0EE0FFF1F8A95E2F7EE2AFF2AE4
445:100C00001BC0E035F10559F48F709927FA0102C035
446:100C1000EE0FFF1F8A95E2F70E2B1F2B0DC0E0365B
447:100C2000F10551F48F709927FA0102C0EE0FFF1FF2
448:100C30008A95E2F76E2B7F2B2815390509F0A7CF8F
449:100C400094B18A2D8095892384B985B18A2985B983
450:100C500097B18C2D8095892387B988B18C2988B963
451:100C60009AB18E2D809589238AB98BB18E298BB943
452:100C70009DB1802F809589238DB98EB1802B8EB93F
453:100C800090B3862F8095892380BB81B3862B81BB4F
454:100C90001092B7011092B6011092BF011092BE01DE
455:100CA0001092B9011092B8011092C1011092C001C6
456:100CB0001092BB011092BA011092C3011092C201AE
457:100CC0001092BD011092BC011092C5011092C40196
458:100CD00068960FB6F894DEBF0FBECDBFDF91CF91FF
459:100CE0001F910F91FF90EF90DF90CF90BF90AF904A
460:100CF0009F908F907F906F905F9008955F926F921A
461:100D00007F928F929F92AF92BF92CF92DF92EF929B
462:100D1000FF920F931F93CF93DF93CDB7DEB7A097CA
463:100D20000FB6F894DEBF0FBECDBF7E0149E1E40EE1
464:100D3000F11C2EEBC22E21E0D22E5E0151E2A50E57
465:100D4000B11C38E0532E470101E010E048E1642E69
466:100D500055E0752EE3E2F1E0D401852D01900D926E
467:100D60008A95E1F7F701819191917F019C01207FA4
468:100D700033272032310589F424B18F709927A801D7
469:100D800002C0440F551F8A95E2F7CA01242B24B9EB
470:100D900095B18095892385B94FC02033310589F4F9
471:100DA00027B18F709927F80102C0EE0FFF1F8A95B7
472:100DB000E2F7CF012E2B27B998B18095892388B906
473:100DC0003BC02034310589F42AB18F709927A801DE
474:100DD00002C0440F551F8A95E2F7CA01242B2AB995
475:100DE0009BB1809589238BB927C02035310589F4C3
476:100DF0002DB18F709927F80102C0EE0FFF1F8A9561
477:100E0000E2F7CF012E2B2DB99EB1809589238EB9A3
478:100E100013C02036310581F420B38F709927A801C3
479:100E200002C0440F551F8A95E2F7CA01242B20BB4C
480:100E300091B38095892381BB50EA5A95F1F7BE01A1
481:100E40006F5F7F4F80E090E020E030E0EBE2F1E088
482:100E5000DE011196462D01900D924A95E1F7FB01B6
483:100E600041915191BF01FA01E07FFF27E032F10586
484:100E700011F4E3B113C0E033F10511F4E6B10EC093
485:100E8000E034F10511F4E9B109C0E035F10511F4E0
486:100E9000ECB104C0E036F105B9F4EFB1F0E04F7009
487:100EA000552702C0F595E7954A95E2F7E0FD08C0A1
488:100EB000A801022E02C0440F551F0A94E2F702C097
489:100EC00040E050E0842B952B2F5F3F4F2C303105B5
490:100ED00009F0BCCFF601208131812817390721F0B4
491:100EE00091838083709200010E94C804F2E0CF0ECB
492:100EF000D11CEA14FB0409F02DCF80910001882356
493:100F000061F1815080930001811121C08091BE0167
494:100F10009091BF019093B7018093B6018091C00179
495:100F20009091C1019093B9018093B8018091C20161
496:100F30009091C3019093BB018093BA018091C40149
497:100F40009091C5019093BD018093BC0106C08FE9CB
498:100F50009FE00197F1F700C0000081E0A0960FB676
499:100F6000F894DEBF0FBECDBFDF91CF911F910F91DF
500:100F7000FF90EF90DF90CF90BF90AF909F908F90B9
501:100F80007F906F905F900895E82FF0E0EE0FFF1FC5
502:100F9000EA54FE4F80819181089508950895279A1B
503:100FA0002F988FEF9FEF90938700809386008AE0C1
504:100FB0008093800089E1809381000C945F2B8111E4
505:100FC0000BC080918000877F8093800010928D00FD
506:100FD00010928C002F9808952F98833041F48091BF
507:100FE00080008860809380008FEF9FEF12C0909107
508:100FF000800098609093800023E030E0281B310946
509:10100000220F331F8FEF9FEF02C0969587952A9589
510:10101000E2F790938D0080938C0008950F931F93B7
511:10102000CF93DF93CDB7DEB7CC58D1090FB6F89484
512:10103000DEBF0FBECDBF8C01862F642F882379F0D1
513:10104000F80192812FE7482F992329F08DE792E04C
514:101050000E94F81404C08DE792E00E940815F80180
515:1010600080818B3061F49181933009F068C0828176
516:10107000882309F4CDC0809103018F5F0EC08A30B0
517:10108000E1F5F8019181933009F059C082818823FC
518:1010900009F4BEC08091030181508093030120E0D8
519:1010A0004BE760E08DE792E00E94E81420E04BE718
520:1010B00061E08DE792E00E94E81420E04BE762E0F7
521:1010C0008DE792E00E94E81420E04BE763E08DE7B3
522:1010D00092E00E94E81420E04BE764E08DE792E0A4
523:1010E000C457DF4F0FB6F894DEBF0FBECDBFDF9100
524:1010F000CF911F910F910C94E814893069F4F80195
525:1011000091819330E1F492819923C9F0809101019A
526:101110009091020101960EC0883089F4F801918106
527:10112000933069F49281992351F08091010190915B
528:10113000020101979093020180930101B0CFF80161
529:10114000928140910301992391F196E4E3E4F1E067
530:10115000DE01A95BBF4F01900D929A95E1F7405DCA
531:10116000F8019181FCE09F9F40191124E091010159
532:10117000F0910201E80FF11DEE0FFF1F87E490E0F0
533:101180008C0F9D1FE80FF91F8081480F2FE760E04B
534:101190008DE792E0C457DF4F0FB6F894DEBF0FBE65
535:1011A000CDBFDF91CF911F910F910C94F81496E46D
536:1011B000E3E4F1E0DE01119601900D929A95E1F7DA
537:1011C000405DF8019181FCE09F9F40191124E0915E
538:1011D0000101F0910201E80FF11DEE0FFF1F81E008
539:1011E00090E08C0F9D1FE80FF91F8081480F2FE7BB
540:1011F00060E08DE792E0C457DF4F0FB6F894DEBF92
541:101200000FBECDBFDF91CF911F910F910C940815A8
542:10121000C457DF4F0FB6F894DEBF0FBECDBFDF91CE
543:10122000CF911F910F910895CF93DF93EA019B0116
544:10123000AC0160E074E284E79BE40E945F2C0E94B2
545:10124000C72C709397006093960020E130E02C1B30
546:101250003D0B02C0759567952A95E2F7709399004A
547:1012600060939800DF91CF9108951092020210923E
548:10127000010210929000109291001092FD011092C4
549:10128000FE011092FF01109200021092FC011092D8
550:10129000FB01E9EDF1E0A9ECB1E01192119211929C
551:1012A00011921D921D9281E0E93FF807B1F7089570
552:1012B000AF92BF92CF92DF92EF92FF920F931F9364
553:1012C000CF93DF936B017C0109EF11E047EDA42E72
554:1012D00041E0B42EC7E0D0E0A7019601F801929159
555:1012E0008291729162918F010E945B2C882349F058
556:1012F0002197F2E0AF1AB108CF3F8FEFD80761F71F
557:1013000034C0F8011082118212821382F501118219
558:101310001082FE01EE0FFF1FEE0FFF1FE752FE4F80
559:10132000DE01AA0FBB1FA753BE4FCE011AC0019604
560:1013300044815581668177814083518362837383C1
561:10134000148215821682178212962D913C91139762
562:1013500011963C932E9313961C921E9212973496DC
563:1013600012968730910519F7C3CF809101029091B1
564:101370000202019797FD05C090930202809301023B
565:1013800004C01092020210920102E0910102F09159
566:101390000202309789F410929000109291001092FE
567:1013A000FD011092FE011092FF01109200021092B6
568:1013B000FC011092FB019EC03197DF01AA0FBB1FF9
569:1013C000AA0FBB1FA752BE4FCD90DD90ED90FC90B1
570:1013D000EE0FFF1FE753FE4FC081D181A090FD01AA
571:1013E000B090FE010091FF0110910002A70196014B
572:1013F0006A2D7B2D802F912F0E945B2C87FF2FC0A1
573:1014000081E08093C801AE016A2D7B2D802F912F42
574:101410000E9414092091FD013091FE014091FF01CD
575:1014200050910002C701B6010E94F62B20E030E087
576:101430004AEF53E40E945F2C9B01AC016A2D7B2D87
577:10144000802F912F0E94F72B5B018C01A701960141
578:101450007B2D912F0E945B2C1816ACF638C0A7018B
579:1014600096016A2D7B2D802F912F0E94AA2D181690
580:1014700084F581E08093C801AE016A2D7B2D802F19
581:10148000912F0E941409A70196016091FD017091AE
582:10149000FE018091FF01909100020E94F62B20E056
583:1014A00030E04AEF53E40E945F2C9B01AC016A2DAF
584:1014B0007B2D802F912F0E94F62B5B018C01A701C1
585:1014C00096017B2D912F0E94AA2D87FFD5CF1092D8
586:1014D000C801AE01C701B6010E941409C092FD0106
587:1014E000D092FE01E092FF01F0920002D093FC0145
588:1014F000C093FB01DF91CF911F910F91FF90EF906F
589:10150000DF90CF90BF90AF90089508951F920F92F3
590:101510000FB60F9211242F933F934F935F936F93C6
591:101520007F938F939F93AF93BF93EF93FF9380919C
592:10153000960090919700892B09F455C08091C801BD
593:10154000811151C08091F9019091FA01813091058A
594:1015500071F082309105C1F0892BC1F52091FD0118
595:101560003091FE014091FF01509100021DC0609139
596:10157000FD017091FE018091FF01909100029B019D
597:10158000AC010E94F72B0EC020E030E040E450E4B4
598:101590006091FD017091FE018091FF019091000228
599:1015A0000E94AE2D9B01AC0160E074E284E79BE4F5
600:1015B0000E945F2C0E94C72C709397006093960046
601:1015C0007595679570939900609398008091F901E3
602:1015D0009091FA01019663E070E00E948A2F909347
603:1015E000FA018093F901FF91EF91BF91AF919F9123
604:1015F0008F917F916F915F914F913F912F910F90BC
605:101600000FBE0F901F901895AF92BF92CF92DF92AE
606:10161000EF92FF920F931F93CF93DF936B017C01A7
607:10162000EA0120E030E0A9010E94AA2D18160CF072
608:10163000B4C03E9A82E8809390008AE18093910042
609:10164000A090FD01B090FE010091FF0110910002F9
610:1016500020E030E0A9016A2D7B2D802F912F0E9480
611:101660005B2C81112DC0AE01C701B6010E94140987
612:10167000C092FD01D092FE01E092FF01F0920002C3
613:10168000D093FC01C093FB01809101029091020272
614:10169000FC01EE0FFF1FEE0FFF1FE752FE4FC0824F
615:1016A000D182E282F382FC01EE0FFF1FE753FE4F6F
616:1016B000D183C083019690930202809301026DC092
617:1016C000A70196016A2D7B2D802F912F0E945B2C04
618:1016D00087FF2CC0AE016A2D7B2D802F912F0E9499
619:1016E00014092091FD013091FE014091FF015091BC
620:1016F0000002C701B6010E94F62B20E030E04AEF5D
621:1017000053E40E945F2C9B01AC016A2D7B2D802F3E
622:10171000912F0E94F72B5B018C01A70196017B2D75
623:10172000912F0E945B2C1816ACF69DCFA701960155
624:101730006A2D7B2D802F912F0E94AA2D18160CF058
625:1017400092CFAE016A2D7B2D802F912F0E9414091C
626:10175000A70196016091FD017091FE018091FF014A
627:10176000909100020E94F62B20E030E04AEF53E413
628:101770000E945F2C9B01AC016A2D7B2D802F912F45
629:101780000E94F62B5B018C01A70196017B2D912F06
630:101790000E94AA2D87FFD5CF66CFDF91CF911F91F1
631:1017A0000F91FF90EF90DF90CF90BF90AF90089592
632:1017B00080910C020895CF93DF9300D01F92CDB794
633:1017C000DEB720916E03243021F523E029839B832B
634:1017D0008A832093E9008FEF06C095ED9A95F1F783
635:1017E0000000882329F09091E800815095FFF5CF03
636:1017F0008091E80085FF0DC040E050E063E070E0BC
637:10180000CE0101960E94BA0F8091E8008E778093F6
638:10181000E8000F900F900F90DF91CF910895CF9334
639:10182000DF9300D01F92CDB7DEB720916E03243036
640:1018300029F522E029839B838A8383E08093E90052
641:101840008FEF06C095ED9A95F1F70000882329F0F7
642:101850009091E800815095FFF5CF8091E80085FFD9
643:101860000DC040E050E063E070E0CE0101960E94C0
644:10187000BA0F8091E8008E778093E8000F900F9068
645:101880000F90DF91CF91089520916E032430F9F4E9
646:1018900022E02093E9002FEF06C035ED3A95F1F7ED
647:1018A0000000222329F03091E800215035FFF5CFC8
648:1018B0002091E80025FF0BC040E050E065E070E0BB
649:1018C0000E94BA0F8091E8008E778093E800089517
650:1018D000CF93DF93EC0180916E03843041F581E07A
651:1018E0008093E9008FEF06C095ED9A95F1F700001F
652:1018F000882329F09091E800815095FFF5CF8091E1
653:10190000E80085FF14C040E050E068E070E0CE01E0
654:101910000E94BA0F8091E8008E778093E80088E0FB
655:10192000FE01A4E0B2E001900D928A95E1F7DF910B
656:10193000CF910895BF92CF92DF92EF92FF920F93D3
657:101940001F93CF93DF937C01B62EE90100E010E0F6
658:10195000C42ED12C0BC04991202F2B0D2F774F7700
659:101960006FE0C7010E94E8140F5F1F4F0C151D05A3
660:1019700094F3DF91CF911F910F91FF90EF90DF9043
661:10198000CF90BF90089570E06F5F7F4F6F707727A3
662:101990000C94E8140F931F93CF93C42F63307105F9
663:1019A00009F04AC0842F807F803849F1803909F0DE
664:1019B00043C0622F6F7770E080E090E00E94FA2CC5
665:1019C00020E030E040E451E40E945F2C9B01AC0138
666:1019D00060E070E080E090E40E94112E0F7710E04C
667:1019E00023E0159507952A95E1F72DEC3CEC42E0B4
668:1019F00053E40E94AE2DA8010E94040B1DC0622F6B
669:101A00006F7770E080E090E00E94FA2C20E030E0F8
670:101A100040E451E40E945F2C9B01AC0160E070E067
671:101A200080E090E40E94112E2DEC3CEC42E053E467
672:101A30000E94AE2D0E945809CC3F29F4CF911F91EE
673:101A40000F910C943509CF911F910F9108950F9329
674:101A50001F93CF93DF93CDB7DEB727970FB6F894D8
675:101A6000DEBF0FBECDBF8C0114C08A810E94C2149C
676:101A70009A819D839B819E839C819F8381111EC03F
677:101A800089818430B1F08730A1F08630A1F08530B3
678:101A9000A1F0BE016F5F7F4F84E091E00E942F189C
679:101AA0008111E3CF84E091E00E9420180E949B14F2
680:101AB0000DC083E003C082E001C081E0AE014B5F56
681:101AC0005F4F682FC8010E945515E3CF27960FB6C8
682:101AD000F894DEBF0FBECDBFDF91CF911F910F9164
683:101AE0000895EF92FF920F93CF93DF9300D000D031
684:101AF00000D0CDB7DEB77B014A832B830C83842FC4
685:101B00002E834D830E94C2142E814D8181111BC0F2
686:101B100082E0E816F10479F083E0E816F10421F0A0
687:101B2000EA94EF2821F50BC0073F11F487E001C0CC
688:101B300084E089830BC0273FD9F786E0FACF473F7F
689:101B4000B9F785E0F6CF42954F704983BE016F5FCC
690:101B50007F4F84E091E00E94E51784E091E00E94CD
691:101B6000031884E091E00E9420180E949B1426969E
692:101B70000FB6F894DEBF0FBECDBFDF91CF910F91AE
693:101B8000FF90EF90089580916D03811109C00E942C
694:101B9000A1110E94FE118091E20084608093E20016
695:101BA000089510926D03089508950C94E4020C9426
696:101BB000892480916E03843049F58091E9008F700B
697:101BC0009091EC0090FF02C090E801C090E0982B4B
698:101BD00084E08093E9008091EB0080FF14C0809145
699:101BE000EE0087FD03C00FC01092F1008091E80065
700:101BF00085FDFACF8091E80080FF05C08091E80064
701:101C00008E778093E8009F709093E900089542E0FA
702:101C100061EC81E00E94171142E061EC82E00E94D9
703:101C2000171142E061EC83E00E94171146E261EC7B
704:101C300084E00E94171142E361E885E00E941711D9
705:101C400042E360E886E00C941711809170038330C2
706:101C500009F454C030F4813071F0823009F0AAC028
707:101C600091C08A3009F47EC08B3009F45FC089309E
708:101C700009F0A0C020C080916F03813A09F09AC09A
709:101C80008091E800877F8093E800809173039091B2
710:101C90007403892B21F060E080E090E003C068E0ED
711:101CA00084E092E070E00E9458108091E8008B7709
712:101CB0008093E800089580916F03813209F07AC023
713:101CC0008091730390917403892B09F073C0809104
714:101CD000E800877F8093E80005C080916E03882329
715:101CE00009F468C08091E80082FFF7CF8091F1008D
716:101CF00080930C028091E8008B7758C080916F032D
717:101D0000813A09F057C08091730390917403892B35
718:101D100009F050C08091E800877F8093E8008091AF
719:101D2000E80080FFFCCF80911A013BC080916F03D7
720:101D3000813209F03FC08091730390917403892B25
721:101D4000C9F58091E800877F8093E8000E944E11DA
722:101D50009091710381E0911101C080E080931A019C
723:101D60000C948C1E80916F03813221F58091E800E4
724:101D7000877F8093E8000E944E11809172038093C8
725:101D80000302089580916F03813AA1F48091E800E5
726:101D9000877F8093E8008091E80080FFFCCF8091EE
727:101DA00003028093F1008091E8008E778093E80031
728:101DB0000C944E11089584B7877F84BF88E10FB6D5
729:101DC000F89480936000109260000FBE90E080E86D
730:101DD0000FB6F89480936100909361000FBE0E944B
731:101DE000A1110E94FE11E2EEF0E080818460808308
732:101DF00008958DE792E00E94241561E77DE08DE76C
733:101E000092E00E947A1567E27DE08DE792E00E9401
734:101E10007E150E94DB0E78946AEC7CE08DE792E000
735:101E20000E94201563EC7CE08DE792E00E9418157B
736:101E30006AE97CE08DE792E00E941C150E94850A09
737:101E40000E949B140E94AC1880E191E00E945418FB
738:101E50000BC00E944E2480916C03882329F00E94BD
739:101E6000742481110E94A40F80916E03853089F340
740:101E70008DE792E00E942D170E94B618F5CF292F0A
741:101E8000332723303105B1F04CF42130310509F40A
742:101E90004DC02230310509F04EC007C02132310556
743:101EA00041F12232310591F146C0E0EDF0E086E7E4
744:101EB00093E045C099278130910569F08230910502
745:101EC00089F0892B09F037C0E2E7F3E0E491F0E014
746:101ED00082E793E034C0E4E4F3E0E491F0E084E4EA
747:101EE00093E02DC0EAE1F3E0E491F0E08AE193E0D1
748:101EF00026C0643000F5E62FF0E0EE0FFF1FE75735
749:101F0000FE4F80819181E9E0F0E019C0643098F4DF
750:101F1000E62FF0E0DF01AA0FBB1FAF56BE4F8D9139
751:101F20009C91E756FE4FE081F0E009C0E2E1F0E06D
752:101F300086E494E004C0E0E0F0E080E090E0DA01C4
753:101F40008D939C93CF01089580E189BD82E189BD85
754:101F500009B400FEFDCF8091D8008F7D8093D8001A
755:101F60008091E00082608093E0008091E00081FD3C
756:101F7000FCCF0895BF92CF92DF92EF92FF920F9322
757:101F80001F93CF93DF937C018B01EA010E946F11B5
758:101F9000B82E811133C0209731F028813981021B7E
759:101FA000130BE20EF31EC12CD12C23C08091E8004C
760:101FB00085FD15C08091E8008E778093E80020971A
761:101FC00049F0888199818C0D9D1D9983888325E036
762:101FD000B22E14C00E946F11882359F00EC0F70171
763:101FE00081917F018093F10001501109FFEFCF1A19
764:101FF000DF0A01151105D1F601C0B82E8B2DDF9136
765:10200000CF911F910F91FF90EF90DF90CF90BF90F5
766:102010000895BF92CF92DF92EF92FF920F931F939A
767:10202000CF93DF937C018B01EA010E946F11B82EE0
768:10203000811133C0209731F028813981021B130BA5
769:10204000E20EF31EC12CD12C23C08091E80085FD47
770:1020500015C08091E8008B778093E800209749F0C5
771:10206000888199818C0D9D1D9983888345E0B42ECC
772:1020700014C00E946F11882359F00EC08091F100A6
773:10208000F70181937F0101501109FFEFCF1ADF0A99
774:1020900001151105D1F601C0B82E8B2DDF91CF911E
775:1020A0001F910F91FF90EF90DF90CF90BF90089518
776:1020B00040917503509176034617570748F0611514
777:1020C000710539F44091E8004E774093E80001C073
778:1020D000BA01FC0140E033C080916E03882309F40B
779:1020E00042C0853009F441C08091E80083FD39C0C9
780:1020F0008091E80082FD2FC08091E80080FF1FC022
781:102100009091F3008091F200392F20E0A901482B33
782:10211000CA0106C041914093F100615071090196D6
783:102120006115710519F088309105A0F341E0089719
784:1021300009F040E08091E8008E778093E800611517
785:10214000710551F64111C8CF06C080916E038823F6
786:1021500051F0853051F08091E80082FFF6CF80E0A9
787:10216000089581E0089582E0089583E00895409104
788:102170007503509176034617570748F061157105AE
789:1021800039F44091E8004E774093E80001C0BA016D
790:10219000FC0140E034C080916E03882309F443C001
791:1021A000853009F442C08091E80083FD3AC08091F7
792:1021B000E80082FD30C08091E80080FF20C090914F
793:1021C000F3008091F200392F20E0A901482BCA01C9
794:1021D00007C044914093F100319661507109019616
795:1021E0006115710519F08830910598F341E0089761
796:1021F00009F040E08091E8008E778093E800611557
797:10220000710549F64111C7CF06C080916E0388233E
798:1022100051F0853051F08091E80082FFF6CF80E0E8
799:10222000089581E0089582E0089583E00895982F4D
800:102230002CC09093E900981739F07091EC00209130
801:10224000ED005091F00003C0242F762F50E021FDC7
802:1022500002C09F5F1AC03091EB003E7F3093EB00CD
803:102260003091ED003D7F3093ED003091EB00316017
804:102270003093EB007093EC002093ED005093F0004E
805:102280002091EE0027FDE5CF07C0973090F28F70C8
806:102290008093E90081E0089580E0089580916F03C4
807:1022A00087FD05C08091E80080FF0EC012C08091BC
808:1022B000E80082FD05C080916E038111F8CF08957A
809:1022C0008091E8008B7708C080916E038111EACF7E
810:1022D00008958091E8008E778093E80008958091BA
811:1022E000E4009091E50045E62091EC0020FD1FC040
812:1022F00023C020916E03222391F0253091F020918C
813:10230000EB0025FD10C02091E4003091E500281776
814:10231000390751F34150C90139F784E0089582E04B
815:10232000089583E0089581E0089580E00895209164
816:10233000E80020FFDECFF9CF2091E80022FFD9CFBF
817:10234000F4CF0E940F120E941712E0EEF0E080819D
818:1023500081608083E8EDF0E080818F77808319BC15
819:10236000A7EDB0E08C918E7F8C9380818F7E8083EF
820:1023700010926D0308950F931F93CF93DF930E94E4
821:102380000F120E941712C8EDD0E088818F778883E2
822:1023900088818068888388818F7D888319BC1092AA
823:1023A0006E0310926A0310926C0310926B0300EE9E
824:1023B00010E0F80180818B7F808388818160888331
825:1023C00042E060E080E00E941711E1EEF0E08081E1
826:1023D0008E7F8083E2EEF0E0808181608083808167
827:1023E00088608083F80180818E7F8083888180610E
828:1023F0008883DF91CF911F910F910895E8EDF0E070
829:1024000080818F7E8083E7EDF0E080818160808332
830:1024100084E082BF81E080936D030C94BB11E8EDF2
831:10242000F0E080818E7F80831092E2000895109208
832:10243000DA001092E10008951F920F920FB60F92EA
833:1024400011242F933F934F935F936F937F938F93B9
834:102450009F93AF93BF93EF93FF938091E10082FF2F
835:102460000BC08091E20082FF07C08091E1008B7F6A
836:102470008093E1000E94D90D8091DA0080FF1FC097
837:102480008091D80080FF1BC08091DA008E7F8093FE
838:10249000DA008091D90080FF0DC080E189BD82E122
839:1024A00089BD09B400FEFDCF81E080936E030E94D8
840:1024B000C30D05C019BC10926E030E94D10D80910E
841:1024C000E10080FF19C08091E20080FF15C080917B
842:1024D000E2008E7F8093E2008091E2008061809331
843:1024E000E2008091D80080628093D80019BC85E01A
844:1024F00080936E030E94D50D8091E10084FF30C06F
845:102500008091E20084FF2CC080E189BD82E189BD19
846:1025100009B400FEFDCF8091D8008F7D8093D80054
847:102520008091E1008F7E8093E1008091E2008F7EB8
848:102530008093E2008091E20081608093E2008091CC
849:102540006A03882311F084E007C08091E30087FFCD
850:1025500002C083E001C081E080936E030E94D70D2A
851:102560008091E10083FF29C08091E20083FF25C0B4
852:102570008091E100877F8093E10082E080936E0389
853:1025800010926A038091E1008E7F8093E100809138
854:10259000E2008E7F8093E2008091E2008061809370
855:1025A000E20042E060E080E00E9417118091F000BC
856:1025B00088608093F0000E94D40DFF91EF91BF914D
857:1025C000AF919F918F917F916F915F914F913F91CB
858:1025D0002F910F900FBE0F901F9018951F920F9282
859:1025E0000FB60F9211242F933F934F935F936F93E6
860:1025F0007F938F939F93AF93BF93CF93EF93FF936B
861:102600008091E9008F709091EC0090FF02C090E8FB
862:1026100001C090E0C92FC82B1092E9008091F00012
863:10262000877F8093F00078940E9432131092E90023
864:102630008091F00088608093F000CF70C093E90033
865:10264000FF91EF91CF91BF91AF919F918F917F912A
866:102650006F915F914F913F912F910F900FBE0F900F
867:102660001F9018951F93CF93DF93CDB7DEB7AC972C
868:102670000FB6F894DEBF0FBECDBFEFE6F3E080915A
869:10268000F100819323E0E737F207C9F70E94250E96
870:102690008091E80083FF37C180916F0390917003B0
871:1026A000953009F488C038F49130B1F170F093306E
872:1026B00009F029C131C0983009F4F8C0993009F403
873:1026C00004C1963009F01FC19DC0803821F08238C6
874:1026D00009F019C108C080916B0390916C03992394
875:1026E00089F082600FC080917303909174038F70A2
876:1026F00099278093E9008091EB0085FB882780F97A
877:102700001092E9009091E800977F9093E800809301
878:10271000F1001092F100D5C0882319F0823009F041
879:10272000F2C08F7121F0823009F0EDC00BC08091B2
880:102730007103813009F0E7C0933009F080E08093A5
881:102740006C032FC08091710381112BC080917303A2
882:10275000909174038F709927009709F4D4C08093E7
883:10276000E9002091EB0020FF1CC020917003233072
884:1027700021F48091EB00806212C09091EB00906197
885:102780009093EB0021E030E001C0220F8A95EAF738
886:102790002093EA001092EA008091EB008860809319
887:1027A000EB001092E9008091E800877F8093E800B9
888:1027B0000E944E11A8C08111A6C080917103909112
889:1027C00072038F779927182F9091E3009078982BB8
890:1027D0009093E3008091E800877F8093E8000E9457
891:1027E0004E118091E80080FFFCCF8091E30080686B
892:1027F0008093E300112311F083E001C082E0809315
893:102800006E0381C08058823008F07DC080917103D2
894:10281000909172038C3D23E0920779F583E08A83DF
895:102820008AE289834FB7F894DE01139620E03EE0F8
896:1028300051E2E32FF0E050935700E49120FF03C0F2
897:10284000E295EF703F5FEF708E2F90E0EA3010F06E
898:10285000C79601C0C0968D939D932F5F243149F791
899:102860004FBF8091E800877F8093E8006AE270E0C4
900:10287000CE0101960E94581013C0AE01455D5F4F16
901:10288000609173030E943F0F0097E9F12091E800E7
902:10289000277F2093E800BC018BA59CA50E94B71060
903:1028A0008091E8008B778093E8002DC0803859F53F
904:1028B0008091E800877F8093E80080916A0380938D
905:1028C000F1008091E8008E7771CF81111CC090914A
906:1028D00071039230C0F48091E800877F8093E80014
907:1028E00090936A030E944E1180916A03811104C083
908:1028F0008091E30087FF02C084E001C081E0809303
909:102900006E030E94070E8091E80083FF0AC0809149
910:10291000E800877F8093E8008091EB0080628093DD
911:10292000EB00AC960FB6F894DEBF0FBECDBFDF91C3
912:10293000CF911F910895CF9380916E038823B1F0BA
913:102940008091E9008F709091EC0090FF02C090E8B8
914:1029500001C090E0C92FC82B1092E9008091E800D7
915:1029600083FD0E943213CF70C093E900CF91089588
916:10297000881F8827881F089591E0883F08F490E019
917:10298000892F0895982F907F903B99F038F49039D3
918:1029900081F0903A71F09038C9F40BC0903DA1F0ED
919:1029A00018F4903C99F410C0903E19F0903F71F4E7
920:1029B00002C083E00895E82FE15FEF3038F4F0E0E3
921:1029C000E356FE4F8081089582E0089580E00895E7
922:1029D0000F932F774F776F70606BDC01ED91FC9157
923:1029E000022F242F462F63E070E009950F91089580
924:1029F0000F932F774F776F706069DC01ED91FC9139
925:102A0000022F242F462F63E070E009950F9108955F
926:102A10000F932F774F776F706068DC01ED91FC9119
927:102A2000022F242F462F63E070E009950F9108953F
928:102A3000FC01738362830895FC01738F628F089594
929:102A4000FC01758F648F0895CF93DF93EC011DA275
930:102A50001FA21EA2BC01685D7F4F40EC88519F4FB2
931:102A60000E9461171B821A821D821C821F821E8295
932:102A7000198618861B861A861D861C861F861E864A
933:102A8000198A188A1B8A1A8A1D8A1C8A1F8A1E8A1A
934:102A9000198E188E1B8E1A8E1D8E1C8E1F8E1E8EEA
935:102AA00019A218A2DF91CF910895CF92DF92FF92E1
936:102AB0000F931F93CF93DF931F92CDB7DEB7F62E00
937:102AC0006A018C0108511F4F08C0F60161916F0126
938:102AD000C80149830E94681749818C2D841B8F157A
939:102AE000A0F30F90DF91CF911F910F91FF90DF9096
940:102AF000CF900895FC01718360830895FC0171A358
941:102B000060A30895AF92BF92CF92DF92EF92FF92AF
942:102B10000F931F93CF93DF9300D01F92CDB7DEB7F3
943:102B20007C016B01142FB22EA02EDC0195968C91A6
944:102B300095978430F1F45A96ED91FC915B9730971C
945:102B400009F4D8C0CB01019763E070E00E94762FB2
946:102B5000DB01AA0FBB1FA60FB71F49832A830B8374
947:102B60004C2D4A1B9E012F5F3F4FBD01C7010995A8
948:102B7000B1C06230710509F453C06330710529F0AA
949:102B80006130710509F09CC083C0842F807F803A3A
950:102B900001F130F48038B9F0803909F0ABC00DC0D4
951:102BA000803EE9F0803F09F1803B09F0A3C0D701E6
952:102BB0001296ED91FC91139723C0D7011496ED91D5
953:102BC000FC9115971DC0D7011696ED91FC911797B2
954:102BD00017C0D7011896ED91FC91199711C0D70134
955:102BE0001A96ED91FC911B970BC0423F09F082C0F1
956:102BF000D7011C96ED91FC911D97309731F47AC066
957:102C0000309709F477C0123F21F42A2D4B2D62EF43
958:102C100004C0612F6F702A2D4B2DC70109955AC032
959:102C2000842F807F803D59F0803F79F0803C09F00F
960:102C300061C0D7011E96ED91FC911F9719C0D70175
961:102C40005096ED91FC91519713C0433F31F4D70159
962:102C50005296ED91FC91539708C0413F09F04AC04C
963:102C6000D7015496ED91FC915597309741F442C0AD
964:102C7000309709F43FC0133F11F0113F19F44B2D69
965:102C8000612F03C0612F6F704B2DC701099522C0C2
966:102C9000842F0E94BC14882331F0D7015696ED9101
967:102CA000FC91579707C0163F29F5D7015896ED912B
968:102CB000FC9159973097F1F0612FC70109950AC02F
969:102CC00064307105A8F416C00A2D2B2D412FB601D2
970:102CD000C7010995D7015E96ED91FC915F973097FA
971:102CE00089F00A2D2B2D412FB601C70109950AC085
972:102CF000C12CD12CD7015C96ED91FC915D9730975A
973:102D000019F7E8CF0F900F900F90DF91CF911F919F
974:102D10000F91FF90EF90DF90CF90BF90AF9008950C
975:102D2000EF92FF920F931F93CF93DF93EC01162F37
976:102D3000862F0E94BC14882369F0FDA081E08DA33A
977:102D400000E020E0412F61E070E0CE010E9482159A
978:102D5000FDA27CC0812F0E94B8144DA1882309F4E4
979:102D600040C0443029F01AA321E030E03FA32EA355
980:102D7000812F0E94C214813031F070F0823051F006
981:102D8000833059F507C08DA300E020E0412F61E0BA
982:102D900070E01EC08DA35AC0103F19F0173FE9F430
983:102DA00004C084E08DA31AA33FC02EA13FA1C90196
984:102DB00063E070E00E94762F8C0F9D1FFC0112A330
985:102DC000B9016F5F7F4F7FA36EA30CA12BA14AA116
986:102DD000CE010E9482151DA239C01DA21FA21EA2F3
987:102DE00035C0442399F12EA13FA1C90163E070E0F1
988:102DF0000E94762F7C01FE01E80FF91F12A3B90192
989:102E00006F5F7F4F7FA36EA38130910591F082E0C9
990:102E1000E816F104D9F40CA12BA14AA1CE010E941D
991:102E200082158DA1843091F081E090E09FA38EA364
992:102E30000DC0423059F400E02BA14AA1CE010E94FE
993:102E400082158DA1843011F0FFA2EEA2DF91CF9107
994:102E50001F910F91FF90EF900895CF92DF92EF9224
995:102E6000FF920F931F93CF93DF93EC01E8A1F9A199
996:102E7000309709F009958E0108511F4FC8010E9433
997:102E80009A17E12CF12CC82ED12C0FC060E0C8019C
998:102E90000E94AE17682FCE010E94901661E0C80113
999:102EA0000E94BF178FEFE81AF80AEC14FD0470F3C4
1000:102EB000DF91CF911F910F91FF90EF90DF90CF9016
1001:102EC0000895FC0142837483638311821082089504
1002:102ED0000F931F93CF93DF93EC01062F0E94E0170F
1003:102EE000182F298130E0C90101966A8170E00E94A3
1004:102EF0008A2F488150E08417950729F4812F0E947A
1005:102F0000E31780E012C0EB81FC81E20FF31F008326
1006:102F10002981822F90E001966A8170E00E948A2FB9
1007:102F20008983812F0E94E31781E0DF91CF911F9168
1008:102F30000F910895CF93DF93EC010E94E017298150
1009:102F40009881291710F0C22F02C0CA81C20FC91B75
1010:102F50000E94E3178C2FDF91CF910895FC0120810F
1011:102F6000862F90E0820F911D628170E00E948A2F6F
1012:102F70000380F481E02DE80FF91F808108950F93FD
1013:102F80001F93CF93DF931F92CDB7DEB78C01698378
1014:102F90000E94E017482FF80180816981262F30E0D8
1015:102FA000280F311D6281C90170E00E948A2F808341
1016:102FB000842F0F90DF91CF911F910F910C94E31705
1017:102FC0008FB7F89408958FBF0895FC01CB0120912D
1018:102FD0006E032430B1F421812F702093E90040E08A
1019:102FE00050E064E070E00E94BA0F81110BC0909134
1020:102FF000E80095FD07C09091E8009E779093E80067
1021:10300000089582E0089520916E032430A9F4FC0114
1022:1030100081818F708093E9003091F3002091F2005C
1023:10302000932F80E0822B892B49F08091E8008E77E6
1024:103030008093E8000C946F1182E0089580E0089579
1025:1030400020916E03243051F4FC0121812F702093D4
1026:10305000E9002091E80020FD0C9403180895FC017C
1027:10306000CB0120916E03243011F080E00895268179
1028:103070002F702093E9002091E80022FFF6CF2091E5
1029:10308000E80025FFF2CF40E050E064E070E00E94ED
1030:1030900009108091E80085FD05C08091E8008B77DC
1031:1030A0008093E80081E0089590930F0280930E02D0
1032:1030B000089580910E0290910F020895E0910E0202
1033:1030C000F0910F02309721F00190F081E02D0994EA
1034:1030D00080E00895E0910E02F0910F02309721F008
1035:1030E0000280F381E02D09940895E0910E02F091A1
1036:1030F0000F02309721F00480F581E02D09940895A6
1037:1031000020911002309111028217930771F0909371
1038:10311000110280931002E0910E02F0910F0230979D
1039:1031200021F00680F781E02D099408952091120284
1040:10313000309113028217930771F0909313028093DA
1041:103140001202E0910E02F0910F02309721F00084FC
1042:10315000F185E02D099408950E94B6240E948D0502
1043:103160000E948A250C945F2B0C94CE075F926F927D
1044:103170007F928F929F92AF92BF92CF92DF92EF9207
1045:10318000FF920F931F93CF93DF93CDB7DEB72A97AC
1046:103190000FB6F894DEBF0FBECDBF0E947E0694E14D
1047:1031A000C92E92E0D92E00E010E0AA24A394B12CFD
1048:1031B000502E802F0E94C4073C01F601E190F1904F
1049:1031C0006F01E826F926E114F10431F40F5F1F4F77
1050:1031D0000430110569F73AC08091680281FD0E94B0
1051:1031E000CD0720E030E04501022E02C0880C991C7A
1052:1031F0000A94E2F7C4018E219F21892B09F12E83C5
1053:103200005F826820792081E0672809F480E0888760
1054:103210000E94BF248160782F9A8789874E815F81C1
1055:1032200068858A850E946F19F801EE0FFF1FEC5E1A
1056:10323000FD4F80819181882599259183808316C0D7
1057:103240002F5F3F4F2C30310571F6C0CF8FEF898350
1058:103250008A831B820E94BF248160782F9D838C8388
1059:1032600049815A816B818D810E946F190E94772854
1060:1032700010911C020E945E181817D9F00E945E1867
1061:1032800080931C022A960FB6F894DEBF0FBECDBF06
1062:10329000DF91CF911F910F91FF90EF90DF90CF9032
1063:1032A000BF90AF909F908F907F906F905F900C94A5
1064:1032B000B4182A960FB6F894DEBF0FBECDBFDF91CB
1065:1032C000CF911F910F91FF90EF90DF90CF90BF9023
1066:1032D000AF909F908F907F906F905F900895CF9365
1067:1032E000DF93CDB7DEB72B970FB6F894DEBF0FBED6
1068:1032F000CDBF4F83588769877A878B87DE01119608
1069:1033000086E0FD0111928A95E9F785E0FE01379686
1070:1033100001900D928A95E1F749815A816B817C81F8
1071:103320008D819E810E9447212B960FB6F894DEBFB7
1072:103330000FBECDBFDF91CF910895CF93C82F8823C3
1073:1033400009F4C1C0823859F40E945E1881FDBBC0E7
1074:1033500089E30E94AC230E94282489E30CC08338AF
1075:1033600079F40E945E1880FDAEC083E50E94AC2314
1076:103370000E94282483E50E94CE23CF910C94282418
1077:10338000843859F40E945E1882FD9DC087E40E9433
1078:10339000AC230E94282487E4EECF8450813A48F47D
1079:1033A0008C2F0E94C72A81118EC08C2F0E94AC23C3
1080:1033B000E4CF8C2F805E883050F4C77081E090E0BD
1081:1033C00001C0880FCA95EAF70E94EF23D6CF8C2F51
1082:1033D000855A833078F4C53A29F0C63A31F482E848
1083:1033E00090E005C081E890E002C083E890E0CF91D2
1084:1033F0000C9480188C2F885A833108F064C0C83A26
1085:1034000039F1C93A41F1CA3A49F1CB3A51F1CC3AD2
1086:1034100059F1CD3A61F1C03B69F1CE3A71F1CF3A41
1087:1034200079F1C13B81F1C23B89F1C33B91F1C43BCE
1088:1034300099F1C53BA1F1C63BA9F1C73BB1F1C83B2E
1089:10344000B9F1C93BC1F1CA3BC9F58AE292E038C083
1090:1034500082EE90E035C089EE90E032C08AEE90E0D6
1091:103460002FC085EB90E02CC086EB90E029C087EB65
1092:1034700090E026C08CEC90E023C08DEC90E020C062
1093:1034800083E891E01DC08AE891E01AC082E991E0EA
1094:1034900017C084E991E014C081E292E011C083E298
1095:1034A00092E00EC084E292E00BC085E292E008C098
1096:1034B00086E292E005C087E292E002C080E090E000
1097:1034C000CF910C949618CF910895882309F44DC09C
1098:1034D000823859F40E945E1881FF47C089E30E9438
1099:1034E000AC230E94282489E30CC0833871F40E9425
1100:1034F0005E1880FF3AC083E50E94AC230E94282416
1101:1035000083E50E94CE230C942824843859F40E9429
1102:103510005E1882FF2AC087E40E94AC230E94282400
1103:1035200087E4EFCF982F9450913A08F4EACF982F80
1104:10353000905E983058F4282F277081E090E001C009
1105:10354000880F2A95EAF70E94F523DDCF982F955A28
1106:10355000933020F480E090E00C948018885A8331F6
1107:1035600020F480E090E00C9496180895882321F0D0
1108:103570000E94EF230C9428240895882321F00E94B0
1109:10358000F5230C9428240895BF92CF92DF92EF92F6
1110:10359000FF920F931F93CF93DF93CDB7DEB727979B
1111:1035A0000FB6F894DEBF0FBECDBF8C0185E0F801E9
1112:1035B000DE01119601900D928A95E1F7F8013081B4
1113:1035C0002181F280558152955F7083819481892B8E
1114:1035D00039F02F3F41F481E090E03F3F31F003C0EC
1115:1035E00081E090E002C080E090E080FD73C3398309
1116:1035F0002A8389819A815E830E946923B92E8F83F1
1117:103600000E9468230E9490222B2D22952F7030E07B
1118:103610005E816F812530310509F4E6C06CF42430F9
1119:1036200031050CF0A2C04B2D407F8B2D8F702230C6
1120:1036300031050CF045C017C02C3031054CF42A3050
1121:1036400031050CF0E7C12830310509F043C3E5C06E
1122:103650002D30310509F4BAC20CF4A2C22F30310565
1123:1036600009F038C323C3182F411101C002C01295BD
1124:10367000107FFF2059F0112309F46BC2812F6F8353
1125:103680000E94FF230E9428246F8163C2862F0E941C
1126:10369000651A112309F41EC3812F0E940524279661
1127:1036A0000FB6F894DEBF0FBECDBFDF91CF911F9153
1128:1036B0000F91FF90EF90DF90CF90BF900C94282453
1129:1036C000403211F08295807F662319F0613071F5E8
1130:1036D00023C0FF20B1F0511101C032C0513081F53B
1131:1036E00027960FB6F894DEBF0FBECDBFDF91CF9106
1132:1036F0001F910F91FF90EF90DF90CF90BF900C94AF
1133:103700000F24511101C003C0513009F4E3C28E836C
1134:103710000E9412248E819AC1FF2021F0563008F0B9
1135:10372000D9C20EC0553008F0D5C290C1FF20C9F0F3
1136:10373000552331F0F801958190FF0BC29F7095835E
1137:1037400027960FB6F894DEBF0FBECDBFDF91CF91A5
1138:103750001F910F91FF90EF90DF90CF90BF900C944E
1139:10376000B61A552309F472C109C22B2D2695269548
1140:10377000237030E02115310529F02130310509F0A1
1141:10378000A9C219C0FF2021F0862F9B2D937002C083
1142:1037900080E090E027960FB6F894DEBF0FBECDBF55
1143:1037A000DF91CF911F910F91FF90EF90DF90CF901D
1144:1037B000BF900C948018FF2021F0862F9B2D9370D2
1145:1037C00002C080E090E027960FB6F894DEBF0FBEEF
1146:1037D000CDBFDF91CF911F910F91FF90EF90DF90C0
1147:1037E000CF90BF900C949618862FFF2019F00E945E
1148:1037F0007D2702C00E94E52727960FB6F894DEBF0A
1149:103800000FBECDBFDF91CF911F910F91FF90EF9031
1150:10381000DF90CF90BF900C946C288B2D837009F0B3
1151:1038200079C0F11057C2262F229526952770220FB6
1152:10383000220F862F8F70C82ED12CE12CF12C022E56
1153:1038400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF4
1154:1038500010C06FE070E080E090E004C0660F771F5A
1155:10386000881F991F2A95D2F760957095809590953D
1156:1038700003C060E070E0CB012B2D269526952370C8
1157:10388000422F50E042305105D9F04330510569F1E3
1158:103890006C297D298E299F294130510551F12796A8
1159:1038A0000FB6F894DEBF0FBECDBFDF91CF911F9151
1160:1038B0000F91FF90EF90DF90CF90BF900C94A522D6
1161:1038C0006C297D298E299F2927960FB6F894DEBF93
1162:1038D0000FBECDBFDF91CF911F910F91FF90EF9061
1163:1038E000DF90CF90BF900C94B7220E94A522C70111
1164:1038F000B60127960FB6F894DEBF0FBECDBFDF919D
1165:10390000CF911F910F91FF90EF90DF90CF90BF90DC
1166:103910000C949322FF2019F08B2D817001C08695A5
1167:10392000882309F4D7C1262F229526952770220FC8
1168:10393000220F862F8F70C82ED12CE12CF12C022E55
1169:1039400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF3
1170:1039500010C06FE070E080E090E004C0660F771F59
1171:10396000881F991F2A95D2F760957095809590953C
1172:1039700003C060E070E0CB012B2D269526952370C7
1173:10398000422F50E042305105D9F04330510569F1E2
1174:103990006C297D298E299F294130510551F12796A7
1175:1039A0000FB6F894DEBF0FBECDBFDF91CF911F9150
1176:1039B0000F91FF90EF90DF90CF90BF900C94442335
1177:1039C0006C297D298E299F2927960FB6F894DEBF92
1178:1039D0000FBECDBFDF91CF911F910F91FF90EF9060
1179:1039E000DF90CF90BF900C9456230E944423C701D0
1180:1039F000B60127960FB6F894DEBF0FBECDBFDF919C
1181:103A0000CF911F910F91FF90EF90DF90CF90BF90DB
1182:103A10000C943223603F59F120F4603E08F494C0C6
1183:103A200008C0623F09F467C0F0F1633F09F08CC041
1184:103A300065C0162F1F708B2D8F71FF2021F00E9403
1185:103A4000DD22812F7DCE0E94F822812F27960FB68E
1186:103A5000F894DEBF0FBECDBFDF91CF911F910F91C4
1187:103A6000FF90EF90DF90CF90BF900C94BD1AFF2095
1188:103A7000B1F0553008F02EC18B2D8F7127960FB6FF
1189:103A8000F894DEBF0FBECDBFDF91CF911F910F9194
1190:103A9000FF90EF90DF90CF90BF900C94172356309B
1191:103AA00008F018C1E9CFFF2099F08B2D8F71279670
1192:103AB0000FB6F894DEBF0FBECDBFDF91CF911F913F
1193:103AC0000F91FF90EF90DF90CF90BF900C94DD228C
1194:103AD0008B2D8F7127960FB6F894DEBF0FBECDBF2A
1195:103AE000DF91CF911F910F91FF90EF90DF90CF90DA
1196:103AF000BF900C94F822F110EBCFD7CFFF2099F0B4
1197:103B00008B2D8F7127960FB6F894DEBF0FBECDBFF9
1198:103B1000DF91CF911F910F91FF90EF90DF90CF90A9
1199:103B2000BF900C94CE2227960FB6F894DEBF0FBE3E
1200:103B3000CDBFDF91CF911F910F91FF90EF90DF905C
1201:103B4000CF90BF900C94C922FF20A9F0552309F40F
1202:103B5000ACCF862F27960FB6F894DEBF0FBECDBF31
1203:103B6000DF91CF911F910F91FF90EF90DF90CF9059
1204:103B7000BF900C949D19552309F4AACF862F279640
1205:103B80000FB6F894DEBF0FBECDBFDF91CF911F916E
1206:103B90000F91FF90EF90DF90CF90BF900C94651A3B
1207:103BA0004B2D4F70C8010E94E50227960FB6F8947E
1208:103BB000DEBF0FBECDBFDF91CF911F910F91FF9060
1209:103BC000EF90DF90CF90BF900C94FD21F11082C058
1210:103BD0009B2D9F70492F50E04230510599F144F4DC
1211:103BE0004115510569F04130510509F073C019C004
1212:103BF00043305105C1F14430510509F06BC044C058
1213:103C000027960FB6F894DEBF0FBECDBFDF91CF91E0
1214:103C10001F910F91FF90EF90DF90CF90BF900C9489
1215:103C2000702B27960FB6F894DEBF0FBECDBFDF9185
1216:103C3000CF911F910F91FF90EF90DF90CF90BF90A9
1217:103C40000C94872B27960FB6F894DEBF0FBECDBF1E
1218:103C5000DF91CF911F910F91FF90EF90DF90CF9068
1219:103C6000BF900C94A32B27960FB6F894DEBF0FBE1F
1220:103C7000CDBFDF91CF911F910F91FF90EF90DF901B
1221:103C8000CF90BF900C94B62B862F27960FB6F89442
1222:103C9000DEBF0FBECDBFDF91CF911F910F91FF907F
1223:103CA000EF90DF90CF90BF900C94DA2B4B2D4F709C
1224:103CB000C80127960FB6F894DEBF0FBECDBFDF91C7
1225:103CC000CF911F910F91FF90EF90DF90CF90BF9019
1226:103CD0000C940E0827960FB6F894DEBF0FBECDBF2A
1227:103CE000DF91CF911F910F91FF90EF90DF90CF90D8
1228:103CF000BF9008950E940C240E94E1230E94282472
1229:103D00000E9418290E946C2880E090E00E94801890
1230:103D100080E090E00C9496180E94FC230C947A1E8C
1231:103D20000E946923292F22952F7030E02C30310515
1232:103D30004CF42A3031056CF422503109223031051F
1233:103D400070F407C02C30310531F02F30310539F4D3
1234:103D500002C081E0089593FB882780F9089580E0F0
1235:103D60000895CF93DF9300D000D01F92CDB7DEB778
1236:103D70000F900F900F900F900F90DF91CF910895BB
1237:103D8000CF93DF9300D000D000D0CDB7DEB726961A
1238:103D90000FB6F894DEBF0FBECDBFDF91CF9108956F
1239:103DA0001F93CF93DF93C091530216E012C0D0E06F
1240:103DB0001C9FF0011D9FF00D1124ED5DFD4F408112
1241:103DC000518162817381848195810E94C01E2196F8
1242:103DD000C77080915402C813EACFDF91CF911F9131
1243:103DE000089540911D0250911E0260911F02709132
1244:103DF000200280912102909122020C94C01E0F9308
1245:103E00001F93CF93DF938091220282958F7009F0E8
1246:103E100069C080911F02882309F464C0A0915302F5
1247:103E2000D0915402B0911D02C0911E0280912002D7
1248:103E30009091210221E030E0BF3F11F020E030E01E
1249:103E4000122FBC016095709506E04AC0009721F0E2
1250:103E5000CF3F29F4212F05C021E030E002C020E04F
1251:103E600030E020FD3BC04A2F50E0049FF001059F49
1252:103E7000F00D1124ED5DFD4F2181C2132FC0208173
1253:103E8000B2132CC02281211129C02381348128172B
1254:103E9000390718F0281B390B02C0260F371F283CA2
1255:103EA0003105E0F4809122028F70806180932202BC
1256:103EB00086E0849FF001859FF00D1124E85DFD4FA1
1257:103EC00080818F70806180838DE192E00E94C41AAE
1258:103ED000DF91CF911F910F910C94D01EAF5FA7700F
1259:103EE000AD13B4CFDF91CF911F910F910895EF9251
1260:103EF000FF920F931F93CF93DF93CDB7DEB76297F7
1261:103F00000FB6F894DEBF0FBECDBF8C0185E0F8017F
1262:103F1000DE011D9601900D928A95E1F7D8014C9132
1263:103F200011965C91119712966C9112971396ED90E1
1264:103F3000FC90149770911D02E0911E028091200266
1265:103F400090912102009739F0EF3F41F421E030E0F9
1266:103F50007F3F31F003C021E030E002C020E030E0DC
1267:103F600020FD5CC120911F02222309F4F1C0E81654
1268:103F7000F90628F09701281B390BC90104C0809568
1269:103F800090958E0D9F1D883C910508F098C08091FA
1270:103F90002202982F907F09F064C0E51314C07413B7
1271:103FA00012C0611110C08F708061809322020E9444
1272:103FB000F11E8DE192E00E94C41A80912202D80184
1273:103FC00015968C9343C1EF2839F05F3F41F481E0AF
1274:103FD00090E04F3F31F003C081E090E002C080E00C
1275:103FE00090E080FD03C081E0862702C080E090E081
1276:103FF00080FF2EC0809153022091540236E013C0FE
1277:1040000090E0389FF001399FF00D1124ED5DFD4FD8
1278:104010007181571306C07081471303C07281671303
1279:1040200017C0019687708213EBCF12C19F7059F0B1
1280:10403000882309F40BC107C09F7029F0F80195810E
1281:10404000907F09F403C1805E883008F4FFC0D2C0BD
1282:10405000662309F4FBC080912202816080932202D2
1283:10406000F5C0E51308C0741306C0611104C0D8017F
1284:1040700015968C939DC04D875E878D859E856A8B36
1285:104080000E94901E6A89882309F4B4C0662309F44B
1286:10409000B1C020912202822F82958F7090E002970A
1287:1040A0000CF4C6C080911D0290911E0298878F83E8
1288:1040B0001986FB86EA862C87CE01079646C080913A
1289:1040C0002202982F907F59F47E2DF98AE88A8989F7
1290:1040D0000E94B11E8DE192E00E94C41A95C0E513C2
1291:1040E00011C074130FC061110DC0F8018583C801A0
1292:1040F0000E94C41AEDE1F2E086E0DF011D928A958C
1293:10410000E9F7A2C04D875E878D859E856A8B0E94E8
1294:10411000901E6A89882309F46DC0662309F46AC079
1295:1041200020912202822F82958F7090E002970CF4EA
1296:104130007FC080911D0290911E029A8389831B8209
1297:10414000FD82EC822E83CE0101960E94C41A70C0BB
1298:10415000E816F90628F09701281B390BC90104C09D
1299:10416000809590958E0D9F1D883C910508F046C066
1300:10417000662309F43FC0E51330C074132EC02091AC
1301:10418000220220FD21C0322F32953F70832F90E014
1302:104190000097D1F0D80115962C9315970F9741F001
1303:1041A000832F8F5F8295807F2F70282B15962C93FD
1304:1041B000C8010E94C41A86E0F801ADE1B2E00190A6
1305:1041C0000D928A95E1F73EC086E0F801ADE1B2E0DC
1306:1041D00001900D928A95E1F737C04D875E878D85F6
1307:1041E0009E850E94901E811123C0809122028160D1
1308:1041F00080932202C8010E94C41A26C07E2DF98A2B
1309:10420000E88A89890E94B11EEDE1F2E086E0DF01D3
1310:104210001D928A95E9F70E94F11E18C0662351F39A
1311:104220004D875E878D859E850E94901E882311F3A1
1312:1042300086E0F801ADE1B2E001900D928A95E1F7D8
1313:104240000E94FF1E0E94F11E81E014C080E012C097
1314:104250004D875E878D859E850E946923292F229533
1315:104260002F7030E0223031050CF4E0CE24303105DF
1316:104270000CF6E2CE62960FB6F894DEBF0FBECDBF4D
1317:10428000DF91CF911F910F91FF90EF9008951F93B1
1318:10429000CF93DF93CDB7DEB72C970FB6F894DEBF80
1319:1042A0000FBECDBF4F83588769877A878B879C87DE
1320:1042B000CE0107960E94771F8823D9F02F81388579
1321:1042C0008A859B85892B39F03F3F19F080E090E08B
1322:1042D00004C02F3FD9F781E090E0892B09F06DC031
1323:1042E0004F81588569857A858B859C850E94C01E83
1324:1042F00064C086E0FE013796DE01119601900D92B2
1325:104300008A95E1F7FF81E8854A855B85411551056E
1326:1043100039F0EF3F41F481E090E0FF3F31F003C01E
1327:1043200081E090E002C080E090E080FD46C02091F6
1328:10433000540230E0C90101968770992760915302B9
1329:1043400070E08617970709F440C0F983EA835D831C
1330:104350004C8396E0929FD001939FB00D1124AD5DE8
1331:10436000BD4FFE01319601900D929A95E1F7809331
1332:1043700054020E94D01E21C0189FC00111248D5DDF
1333:104380009D4F0E94771F882371F1E09153021E9F79
1334:10439000F0011124ED5DFD4F4081518162817381F7
1335:1043A000848195810E94C01E8091530290E0019605
1336:1043B000877099278093530201C016E080915302C1
1337:1043C000909154028913D8CF0EC00E948C1E109277
1338:1043D000540210925302EDE1F2E086E0DF011D92FB
1339:1043E0008A95E9F7EACF2C960FB6F894DEBF0FBE98
1340:1043F000CDBFDF91CF911F910895DF92EF92FF9291
1341:104400000F931F93CF93DF93EC01009709F46CC0D7
1342:10441000D12CEE24E394F12C8E010F5F1F4FFE018F
1343:104420008491843748F4843008F04AC0813071F0B8
1344:10443000823009F059C01EC0853709F43DC070F1C3
1345:10444000982F9458903708F04FC03DC02296F8013D
1346:104450008491982F905E983050F48770FE2D01C0A3
1347:10446000FF0F8A95EAF78F2F0E94FF2330C00E942A
1348:104470009D192DC02296F8018491982F905E983056
1349:1044800050F48770FE2D01C0FF0F8A95EAF78F2F39
1350:104490000E9405241CC00E94651A19C02296F801CA
1351:1044A000049107C08FE99FE00197F1F700C0000079
1352:1044B00001500111F7CF0BC02296F801D49007C02C
1353:1044C0000E949D1903C08F770E94651AE8018D2D07
1354:1044D00007C08150EFE9FFE03197F1F700C000001D
1355:1044E000882309F499CFF5CFDF91CF911F910F91D8
1356:1044F000FF90EF90DF9008956093590270935A02F5
1357:1045000080935B0290935C020C947A1E6093550238
1358:104510007093560280935702909358020C947A1E1F
1359:1045200008950C947C220F931F93009159021091CF
1360:104530005A0220915B0230915C02602B712B822B1E
1361:10454000932B1F910F910C947C220F931F9300913A
1362:10455000590210915A0220915B0230915C02602353
1363:104560007123822393231F910F910C947C220F932C
1364:104570001F930091590210915A0220915B023091D1
1365:104580005C0260277127822793271F910F910C945B
1366:104590007C2260E070E0CB010C94862241E050E088
1367:1045A00060E070E004C0440F551F661F771F8A95B6
1368:1045B000D2F7CB01BA010C94862241E050E060E0D2
1369:1045C00070E004C0440F551F661F771F8A95D2F70D
1370:1045D0008091550290915602A0915702B0915802D5
1371:1045E000482B592B6A2B7B2BCB01BA010C948622CA
1372:1045F00041E050E060E070E004C0440F551F661FCA
1373:10460000771F8A95D2F74095509560957095809167
1374:10461000550290915602A0915702B091580248233A
1375:1046200059236A237B23CB01BA010C94862241E0F3
1376:1046300050E060E070E004C0440F551F661F771F14
1377:104640008A95D2F78091550290915602A091570217
1378:10465000B0915802482759276A277B27CB01BA0116
1379:104660000C9486220F931F930091550210915602CD
1380:104670002091570230915802602B712B822B932B83
1381:104680001F910F910C9486220F931F930091550256
1382:1046900010915602209157023091580260237123E5
1383:1046A000822393231F910F910C9486220F931F93C3
1384:1046B00000915502109156022091570230915802F4
1385:1046C00060277127822793271F910F910C948622D0
1386:1046D0000895CF92DF92EF92FF920F931F93CF93A3
1387:1046E000DF93EC01C0905902D0905A02E0905B0237
1388:1046F000F0905C028091550290915602A091570271
1389:10470000B0915802C82AD92AEA2AFB2A0FE110E000
1390:10471000B701A601002E04C0769567955795479579
1391:104720000A94D2F740FF08C0BE01802F0E94E00328
1392:104730008130910509F007C00150110948F7BE0109
1393:1047400080E00E94E003DF91CF911F910F91FF90D5
1394:10475000EF90DF90CF90089540911B0150911C0184
1395:1047600020E030E09FEFFA01E20FF31F628168174B
1396:10477000A1F09F3F19F4611101C0922F2F5F3F4FAD
1397:104780002630310581F707C0FA01E90FF11D97FDC9
1398:10479000FA95828308959F3FB9F7089540911B01D0
1399:1047A00050911C0120E030E0FA01E20FF31F9281EA
1400:1047B000981301C012822F5F3F4F26303105A1F7B9
1401:1047C000089581E090E0E0911B01F0911C01E80F59
1402:1047D000F91F1082019688309105A9F708959091EC
1403:1047E0005D02982B90935D020895809590915D02F3
1404:1047F000982390935D02089510925D020895909120
1405:104800005E02982B90935E020895809590915E02CF
1406:10481000982390935E02089510925E02089580930B
1407:104820005F02089510925F02089540911B0150911C
1408:104830001C0120E030E080E0FA01E20FF31F9181DB
1409:1048400091118F5F2F5F3F4F27303105A9F70895F2
1410:10485000E0911B01F0911C0180915D028083E09149
1411:104860001B01F0911C01808190915E02892B808355
1412:1048700090915F02992361F0E0911B01F0911C017E
1413:104880008081892B80830E94152481110E9412242B
1414:1048900080911B0190911C010C946A1880916E0309
1415:1048A000843009F11092690220E488E190E00FB6AB
1416:1048B000F894A895809360000FBE2093600083B7A2
1417:1048C000817F846083BF83B7816083BF789488953C
1418:1048D00083B78E7F83BF88E10FB6F8948093600022
1419:1048E000109260000FBE0895CF930E94E3020E94D1
1420:1048F0007E060E94E402C0E08C2F0E94C407892B30
1421:1049000029F4CF5FC430C1F780E001C081E0CF91CE
1422:1049100008950E948C1E0C945F2B1F920F920FB66D
1423:104920000F9211248F939F93AF93BF93809169024D
1424:10493000811113C080916A0290916B02A0916C0268
1425:10494000B0916D024196A11DB11D80936A029093B2
1426:104950006B02A0936C02B0936D02BF91AF919F91D7
1427:104960008F910F900FBE0F901F90189582E084BD1D
1428:1049700093E095BD9AEF97BD80936E0008958FB731
1429:10498000F89440916A0250916B0260916C027091B0
1430:104990006D028FBFCA010895CF92DF92EF92FF920E
1431:1049A0000F931F932FB7F89440916A0250916B02B6
1432:1049B00060916C0270916D022FBF6A017B01EE2441
1433:1049C000FF248C0120E030E0C016D106E206F30699
1434:1049D00020F09A01281B390B05C09C0120953095C9
1435:1049E000240F351FC9011F910F91FF90EF90DF90A9
1436:1049F000CF9008951F920F920FB60F9211248F93AC
1437:104A00009F93AF93BF9380916A0290916B02A091A4
1438:104A10006C02B0916D020196A11DB11D80936A02D6
1439:104A200090936B02A0936C02B0936D02BF91AF9113
1440:104A30009F918F910F900FBE0F901F9018950E941D
1441:104A4000A111F8942FEF87EA91E621508040904021
1442:104A5000E1F700C0000087E090EBDC018093780371
1443:104A600090937903A0937A03B0937B032CE088E1C1
1444:104A700090E00FB6F894A895809360000FBE209345
1445:104A80006000FFCFCF92DF92EF92FF920F931F93C0
1446:104A9000CF93DF93C82ED12C01E010E08D2D0E9422
1447:104AA000C4077C01C0E0D0E098010C2E02C0220FA8
1448:104AB000331F0A94E2F72E213F21232B29F421965C
1449:104AC000CC30D10589F708C06C2F7D2D80E00E9485
1450:104AD000BB03C812F4CF06C0D39484E0D812DECF53
1451:104AE00080E001C081E0DF91CF911F910F91FF9095
1452:104AF000EF90DF90CF900895CF93C82F8CE20E9463
1453:104B00004225882321F08C2FCF910C94422580E000
1454:104B1000CF910895CF930E94CD26811102C00E94AB
1455:104B2000AE26C5E608C00E947E068FE39CE9019789
1456:104B3000F1F700C00000C150B1F789E20E947C2566
1457:104B400081110AC18AE20E947C2581110E94AE2651
1458:104B500085E00E947C2581110E941F250E94D82695
1459:104B60008093680287E00E947C25882399F18BE17D
1460:104B70000E947C25882351F09091680291FB882740
1461:104B800080F921E0822780FB91F922C08EE00E940B
1462:104B90007C25882351F09091680292FB882780F948
1463:104BA00021E0822780FB92F913C080E10E947C25DE
1464:104BB00090916802882341F093FB882780F921E0D7
1465:104BC000822780FB93F904C0892F809580FB90F9A0
1466:104BD00090936802809168020E94DC260E94EA2677
1467:104BE00080937B0280EE0E947C25882341F0809197
1468:104BF0007B02982F909590FB80F980937B0289E34C
1469:104C00000E947C25882359F090917B0291FB882794
1470:104C100080F921E0822780FB91F990937B0282EE5C
1471:104C20000E947C25882359F090917B0292FB882773
1472:104C300080F921E0822780FB92F990937B0286EE37
1473:104C40000E947C25882359F090917B0293FB882752
1474:104C500080F921E0822780FB93F990937B0283EE19
1475:104C60000E947C25882359F090917B0294FB882731
1476:104C700080F921E0822780FB94F990937B0285E301
1477:104C80000E947C25882359F090917B0295FB882710
1478:104C900080F921E0822780FB95F990937B0281E3E4
1479:104CA0000E947C25882359F090917B0296FB8827EF
1480:104CB00080F921E0822780FB96F990937B0281E1C5
1481:104CC0000E947C25882359F090917B0297FB8827CE
1482:104CD00080F921E0822780FB97F990937B028091F5
1483:104CE0007B020E94EE2687E20E947C25C82F8EE17F
1484:104CF0000E947C258111C2608FE10E947C25811178
1485:104D0000C46080E20E947C258111C86081E20E941B
1486:104D10007C258111C06182E20E947C258111C062E4
1487:104D200083E20E947C258111C06484E20E947C257C
1488:104D3000882311F0C06802C0CC2329F08C2F0E9478
1489:104D4000E5266C2F03C00E94E126682F70E080E00A
1490:104D500090E0CF910C949122CF9108956DEE7EEF6B
1491:104D600080E090E00E94BA2F60E082E090E00E9434
1492:104D7000AC2F60E083E090E00E94AC2F60E084E024
1493:104D800090E00E94AC2F60E085E090E00E94AC2FA4
1494:104D900060E086E090E00C94AC2F80E090E00E9410
1495:104DA000A62F21E08D3E9E4F09F020E0822F08952E
1496:104DB00082E090E00C949E2F682F82E090E00C94AB
1497:104DC000AC2F83E090E00C949E2F682F83E090E05E
1498:104DD0000C94AC2F84E090E00C949E2F682F84E01C
1499:104DE00090E00C94AC2F86E090E00C949E2F682FFE
1500:104DF00086E090E00C94AC2F8091760280FF0BC08F
1501:104E00006091200185E0689FB00111247595679538
1502:104E1000759567952AC081FF09C06091200185E0E2
1503:104E2000689FB0011124759567951FC082FF07C068
1504:104E30006091200185E0689FB001112416C0409167
1505:104E400070024423C9F060911F01461788F7209132
1506:104E5000200185E0289F90011124429FC001439FBB
1507:104E6000900D112470E00E948A2F6038710540F483
1508:104E70006115710539F002C065E070E0862F089574
1509:104E80008FE7089581E008958091760280FF08C041
1510:104E900060911E0170E0759567957595679521C0C5
1511:104EA00081FF06C060911E0170E07595679519C07D
1512:104EB00082FF04C060911E0170E010C080917002FA
1513:104EC0008823C1F060911D018617A0F790911E0103
1514:104ED000989FC001112470E00E948A2F60387105EC
1515:104EE00028F46115710521F0862F08958FE7089544
1516:104EF00081E0089561E070E0F4CF803F21F40E94EA
1517:104F0000FC26819504C0813F29F40E94FC268093F1
1518:104F100073020895823F21F40E94FC26819504C00B
1519:104F2000833F29F40E94FC26809372020895893FF2
1520:104F300019F40E94442705C08A3F31F40E94442797
1521:104F400081958093740208958B3F21F40E94442739
1522:104F5000819504C08C3F29F40E94442780937502F8
1523:104F60000895843F21F480917102816017C0853FCC
1524:104F700021F480917102826011C0863F21F48091FA
1525:104F8000710284600BC0873F21F4809171028860B8
1526:104F900005C0883F31F48091710280618093710275
1527:104FA00008958D3F21F48091760281600BC08E3F81
1528:104FB00021F480917602826005C08F3F29F48091B0
1529:104FC00076028460809376020895803F29F4809170
1530:104FD000730287FF6EC007C0813F41F48091730266
1531:104FE00018160CF066C01092730263C090917202A2
1532:104FF000823F19F497FF5DC005C0833F31F4191655
1533:105000000CF057C01092720254C0893F31F4809165
1534:10501000740218160CF04DC006C08A3F39F4809116
1535:10502000740287FF46C01092740243C08B3F29F47C
1536:105030008091750287FF3DC006C08C3F39F4809196
1537:1050400075021816B4F51092750233C0843F21F42E
1538:10505000809171028E7F05C0853F31F4809171028D
1539:105060008D7F8093710225C0863F21F4809171026B
1540:105070008B7FF7CF873F21F480917102877FF1CF3B
1541:10508000883F21F4809171028F7EEBCF8D3F21F418
1542:10509000809176028E7F0BC08E3F21F48091760244
1543:1050A0008D7F05C08F3F29F4809176028B7F80939E
1544:1050B00076028091720281110EC08091730281117B
1545:1050C0000AC080917402811106C08091750281111D
1546:1050D00002C010927002089581E792E00E94751854
1547:1050E0000E94BF2490936F0280936E020895CF9325
1548:1050F00080916E0290916F020E94CC2440917002C8
1549:10510000442321F02091210130E006C020912201AA
1550:105110005AE0259F900111248217930708F486C056
1551:105120008091720281110DC090917302911109C09A
1552:1051300090917402911105C090917502992309F420
1553:1051400075C04F3F19F04F5F40937002181624F45A
1554:105150000E94FC26809372028091720287FF05C034
1555:105160000E94FC268195809372028091730218162A
1556:1051700024F40E94FC26809373028091730287FFBF
1557:1051800005C00E94FC268195809373026091720293
1558:10519000662339F1C0917302CC2319F1772767FD9B
1559:1051A0007095872F972F0E94FA2C23E333E343E374
1560:1051B0005FE30E94AE2D0E94C72C609372026C2F99
1561:1051C000772767FD7095872F972F0E94FA2C23E38E
1562:1051D00033E343E35FE30E94AE2D0E94C72C60934C
1563:1051E000730280917402181624F40E94442780935D
1564:1051F00074028091740287FF05C00E944427819544
1565:105200008093740280917502181624F40E9444273A
1566:10521000809375028091750287FF05C00E94442724
1567:10522000819580937502CF910C946C28CF9108954D
1568:10523000E1E7F2E085E0DF011D928A95E9F710923F
1569:105240007002109276020895833089F130F4813033
1570:1052500061F0823009F06EC019C0853009F449C090
1571:10526000B8F1863009F066C055C020912201862F22
1572:1052700090E0820F911D8F3F910520F4620F6093A3
1573:10528000220108958FEF809322010895209121013A
1574:10529000862F90E0820F911D8F3F910520F4620FC1
1575:1052A0006093210108958FEF80932101089520914B
1576:1052B0002001862F90E0820F911D8F3F910520F4F1
1577:1052C000620F6093200108958FEF8093200108956D
1578:1052D00020911F01862F90E0820F911D8F3F910535
1579:1052E00020F4620F60931F0108958FEF80931F01D8
1580:1052F000089520911E01862F90E0820F911D8F3F0F
1581:10530000910520F4620F60931E0108958FEF809342
1582:105310001E01089520911D01862F90E0820F911D9E
1583:105320008F3F910520F4620F60931D0108958FEF68
1584:1053300080931D010895833021F130F4813059F0BC
1585:10534000823009F049C012C0853089F128F18630D9
1586:1053500009F042C037C080912201681720F4861BF3
1587:1053600080932201089510922201089580912101D5
1588:10537000681720F4861B8093210108951092210163
1589:10538000089580912001681720F4861B80932001E6
1590:10539000089510922001089580911F01681720F44C
1591:1053A000861B80931F01089510921F01089580911C
1592:1053B0001E01681720F4861B80931E010895109229
1593:1053C0001E01089580911D01681720F4861B8093AB
1594:1053D0001D01089510921D01089541E050E060E024
1595:1053E00070E004C0440F551F661F771F8A95D2F7DF
1596:1053F000CB01BA010E9491220C948C1E873208F5D1
1597:105400008E3108F0B9C08E3009F47EC060F4873068
1598:1054100009F465C018F4863059F549C0883051F157
1599:105420008B3031F5AEC0883130F4863108F0A9C038
1600:105430008031F1F473C0893109F4A3C08B31C1F418
1601:1054400059C08933F1F068F4893209F493C018F433
1602:10545000873271F48FC0853309F48CC0883341F4EE
1603:1054600090C0863409F46BC008F488C0883449F1D0
1604:1054700080E008950E94D8260E94EA260E94F32622
1605:1054800080C00E945918892B59F00E945918909396
1606:105490007902809378020E948C1E80E090E004C024
1607:1054A00080917802909179020E9454186AC080918C
1608:1054B0006802817F8E7F8093680281E0809377020B
1609:1054C00008950E948C1E2FEF83ED90E321508040C1
1610:1054D0009040E1F700C000000E941F2552C080915B
1611:1054E000680280FF03C0817F8E7F01C0816080934E
1612:1054F000680247C09091680291FB882780F921E0FB
1613:10550000822780FB91F913C09091680292FB882753
1614:1055100080F921E0822780FB92F909C0909168020E
1615:1055200093FB882780F921E0822780FB93F99093F1
1616:105530006802882331F191609093680222C081E86B
1617:1055400090E00E9480182FEF81EE94E0215080407F
1618:105550009040E1F700C0000080E090E00E948018D9
1619:105560002FEF89E698E1215080409040E1F700C09C
1620:10557000000007C080E003C08D5101C089530E9424
1621:10558000ED2981E0089580E0089580E00895CF93AB
1622:10559000C82F80917702813071F020F0823009F0BD
1623:1055A00083C037C0A0911B01B0911C018C91823245
1624:1055B00009F07CC007C0A0911B01B0911C018C9127
1625:1055C000823249F48C2F0E94C32A81111EC08C2F75
1626:1055D0000E94FE291CC08C2F0E94C52A811115C073
1627:1055E000C43169F030F4CB3081F0C03109F062C0D1
1628:1055F00009C0C93221F0C83309F05CC006C010925E
1629:10560000770258C082E08093770281E090E0817059
1630:1056100054C0C932C1F060F4C431A9F020F4C730DD
1631:1056200009F046C02EC0CE51CA3008F041C011C0AA
1632:10563000CE3409F118F4CB34D9F517C0C13599F03F
1633:10564000C235B1F50EC010927A0281E080937702E4
1634:1056500034C0EC2FF0E0E455FE4F808180937A0255
1635:1056600027C061E003C061E007C06AE080917A0270
1636:105670000E9424291DC06AE080917A020E949B2921
1637:1056800017C08EE18093220182E3809321018AE09A
1638:105690008093200184E180931F0188E080931E01A4
1639:1056A00088E280931D0104C01092770280E005C05B
1640:1056B00081E003C080E090E0AACFCF9108950E94DE
1641:1056C000CD26811102C00E94AE260E94F32680934F
1642:1056D000770380FF02C0869501C080E00C94DF074D
1643:1056E00080917703982F9695292F30E0233031054C
1644:1056F0004CF49F5F990F8170892B816080937703B1
1645:105700000E94F7268091770386950C94DF0780919D
1646:105710007703982F969591F09158990F8170892B66
1647:10572000809377038E7F91E009F490E08091770376
1648:1057300090FB80F9809377030E94F726809177038E
1649:1057400086950C94DF0780917703982F909590FBB6
1650:1057500080F9809377030E94F7268091770380FF7A
1651:1057600002C0869501C080E00C94DF07309177037A
1652:10577000232F26952F5F2F77822F90E0317004978B
1653:105780002CF4220F232B2093770302C0309377034E
1654:1057900080917703282F2E7F91E009F490E090FB11
1655:1057A00080F9809377030E94F7268091770386958E
1656:1057B0000C94DF0720917703922F96959827990FE5
1657:1057C000822F8170892B809377038E7F91E009F47B
1658:1057D00090E08091770390FB80F9809377030E949B
1659:1057E000F7268091770386950C94DF075058BB27E6
1660:1057F000AA270ED075C166D130F06BD120F031F4FC
1661:105800009F3F11F41EF45BC10EF4E095E7FB51C11C
1662:10581000E92F77D180F3BA176207730784079507DA
1663:1058200018F071F49EF58FC10EF4E0950B2EBA2F8F
1664:10583000A02D0B01B90190010C01CA01A001112496
1665:10584000FF27591B99F0593F50F4503E68F11A1642
1666:10585000F040A22F232F342F4427585FF3CF4695D3
1667:1058600037952795A795F0405395C9F77EF41F16F5
1668:10587000BA0B620B730B840BBAF09150A1F0FF0FBF
1669:10588000BB1F661F771F881FC2F70EC0BA0F621FAB
1670:10589000731F841F48F4879577956795B795F7959B
1671:1058A0009E3F08F0B3CF9395880F08F09927EE0F2D
1672:1058B000979587950895D9D008F481E008950CD084
1673:1058C0000FC107D140F0FED030F021F45F3F19F056
1674:1058D000F0C0511139C1F3C014D198F39923C9F321
1675:1058E0005523B1F3951B550BBB27AA2762177307E6
1676:1058F000840738F09F5F5F4F220F331F441FAA1F9A
1677:10590000A9F333D00E2E3AF0E0E830D09150504059
1678:10591000E695001CCAF729D0FE2F27D0660F771F07
1679:10592000881FBB1F261737074807AB07B0E809F0E9
1680:10593000BB0B802DBF01FF2793585F4F2AF09E3F7E
1681:10594000510568F0B6C000C15F3FECF3983EDCF350
1682:10595000869577956795B795F7959F5FC9F7880FF7
1683:10596000911D9695879597F90895E1E0660F771F49
1684:10597000881FBB1F621773078407BA0720F0621BDA
1685:10598000730B840BBA0BEE1F88F7E095089504D0D3
1686:105990006894B111D9C00895BCD088F09F5790F099
1687:1059A000B92F9927B751A0F0D1F0660F771F881F44
1688:1059B000991F1AF0BA95C9F712C0B13081F0C3D05F
1689:1059C000B1E00895C0C0672F782F8827B85F39F0FD
1690:1059D000B93FCCF3869577956795B395D9F73EF4A3
1691:1059E00090958095709561957F4F8F4F9F4F08954B
1692:1059F000E89409C097FB3EF4909580957095619569
1693:105A00007F4F8F4F9F4F9923A9F0F92F96E9BB271E
1694:105A10009395F695879577956795B795F111F8CF9A
1695:105A2000FAF4BB0F11F460FF1BC06F5F7F4F8F4F05
1696:105A30009F4F16C0882311F096E911C0772321F0FB
1697:105A40009EE8872F762F05C0662371F096E8862F93
1698:105A500070E060E02AF09A95660F771F881FDAF7EA
1699:105A6000880F9695879597F90895990F0008550F17
1700:105A7000AA0BE0E8FEEF16161706E807F907C0F0D4
1701:105A800012161306E407F50798F0621B730B840BDC
1702:105A9000950B39F40A2661F0232B242B252B21F4B6
1703:105AA00008950A2609F4A140A6958FEF811D811D56
1704:105AB000089597F99F6780E870E060E008959FEF90
1705:105AC00080EC089500240A94161617061806090695
1706:105AD000089500240A941216130614060506089564
1707:105AE000092E0394000C11F4882352F0BB0F40F4EC
1708:105AF000BF2B11F460FF04C06F5F7F4F8F4F9F4F2C
1709:105B0000089557FD9058440F551F59F05F3F71F0AD
1710:105B10004795880F97FB991F61F09F3F79F0879514
1711:105B20000895121613061406551FF2CF4695F1DF9D
1712:105B300008C0161617061806991FF1CF869571052D
1713:105B4000610508940895E894BB2766277727CB0161
1714:105B500097F908958ADF08F48FEF08950BD0C0CF2E
1715:105B6000B1DF28F0B6DF18F0952309F0A2CFA7CF58
1716:105B70001124EACFC6DFA0F3959FD1F3950F50E033
1717:105B8000551F629FF001729FBB27F00DB11D639FEF
1718:105B9000AA27F00DB11DAA1F649F6627B00DA11D95
1719:105BA000661F829F2227B00DA11D621F739FB00D3B
1720:105BB000A11D621F839FA00D611D221F749F3327AB
1721:105BC000A00D611D231F849F600D211D822F762F44
1722:105BD0006A2F11249F5750408AF0E1F088234AF041
1723:105BE000EE0FFF1FBB1F661F771F881F915050408D
1724:105BF000A9F79E3F510570F05CCFA6CF5F3FECF355
1725:105C0000983EDCF3869577956795B795F795E79578
1726:105C10009F5FC1F7FE2B880F911D9695879597F989
1727:105C20000895FA01EE0FFF1F30962105310599F115
1728:105C30006115710561F48038BFE39B0749F16894F1
1729:105C40009038810561F08038BFEF9B0741F09923C0
1730:105C500042F5FF3FE1053105210511F1E894089473
1731:105C6000E795D901AA2329F4AB2FBE2FF85FD0F313
1732:105C700010C0FF5F70F4A695E0F7F73950F019F007
1733:105C8000FF3A38F49F779F930CD00F9007FC905801
1734:105C900008953EF014CF60E070E080E89FE308953F
1735:105CA0004FE79F775F934F933F932F939ED02F9112
1736:105CB0003F914F915F9152DF05C019F40EF0F9CE7C
1737:105CC00042CFFDCE26DFC8F39638C0F707F80F9213
1738:105CD000E8942BE33AEA48EB5FE74EDF0F920F922E
1739:105CE0000F924DB75EB70F92C0D0ECEAF0E016D03D
1740:105CF0004F915F91EF91FF91E595EE1FFF1F49F0E6
1741:105D0000FE57E0684427EE0F441FFA95E1F74195EE
1742:105D1000550B32D00F9007FE26C00895DF93CF9326
1743:105D20001F930F93FF92EF92DF927B018C01689497
1744:105D300005C0DA2EEF011EDFFE01E894A591259142
1745:105D4000359145915591AEF3EF0162DDFE0197016A
1746:105D5000A801DA9479F7DF90EF90FF900F911F91EF
1747:105D6000CF91DF9108959B01AC0160E070E080E885
1748:105D70009FE3A5CD9ECEACC0CCDEE8F39923D9F34A
1749:105D8000940F511DBBF39150504094F059F088236B
1750:105D900032F0660F771F881F91505040C1F79E3F29
1751:105DA000510544F7880F911D9695879597F90895A9
1752:105DB0005F3FACF0983E9CF0BB2786957795679542
1753:105DC000B79508F4B1609395C1F7BB0F58F711F47C
1754:105DD00060FFE8CF6F5F7F4F8F4F9F4FE3CFB4CE11
1755:105DE0000EF076C06CCE689464CE93DEC8F399232F
1756:105DF000D1F3C6F3DF93CF931F930F93FF92C92F75
1757:105E0000DD2788232AF02197660F771F881FDAF78E
1758:105E100020E030E040E85FEB9FE3883920F0803EEF
1759:105E200030F021968F77E3DCE4EDF0E003C0DFDCB7
1760:105E3000E1E0F1E073DF8B01BE01EC01FB2E6F5757
1761:105E400071097595771F880B990BD4DD28E132E72E
1762:105E500041E35FE38FDEAF2D9801AE01FF900F911C
1763:105E60001F91CF91DF91D4DC3BCEFA01DC01AA0F68
1764:105E7000BB1F9B01AC01BF5728F4222733274427BF
1765:105E800050781FC0B75188F4AB2F00244695379542
1766:105E90002795011CA395D2F3002069F0220F331F30
1767:105EA000441FB395DAF30DD0A1CC61307105A0E8A1
1768:105EB0008A07B94630F49B01AC016627772788270B
1769:105EC0009078309621F02083318342835383089564
1770:105ED0009F3F31F0915020F4879577956795B7955E
1771:105EE000880F911D9695879597F90895AA1BBB1B5E
1772:105EF00051E107C0AA1FBB1FA617B70710F0A61BCA
1773:105F0000B70B881F991F5A95A9F780959095BC01EA
1774:105F1000CD01089597FB072E16F4009407D077FD66
1775:105F200009D00E94762F07FC05D03EF4909581950C
1776:105F30009F4F0895709561957F4F0895F999FECF11
1777:105F400092BD81BDF89A992780B50895A8E1B0E087
1778:105F500042E050E00C94C12F262FF999FECF1FBAD2
1779:105F600092BD81BD20BD0FB6F894FA9AF99A0FBE82
1780:105F7000019608950E94AC2F272F0C94AD2FDC01C1
1781:105F8000CB01FC01F999FECF06C0F2BDE1BDF89A44
1782:105F9000319600B40D9241505040B8F70895F894EE
1783:025FA000FFCF31
1784:105FA2000507000C058540000001064000000100C5
1785:105FB200D80B680C440C0F0CDB0B01600228081490
1786:105FC2000A321E40004500250026006100600020C4
1787:105FD2000037006400650066006700440046002444
1788:105FE2000047000000020004000500070009000B42
1789:105FF200000C000E0010001100130015001700180D
1790:10600200001A001C001D001F00210023002400268E
1791:1060120000280029002B002D002F00300032003410
1792:10602200003500370039003B008803A103BA03D3CF
1793:1060320003FB04AE04780458043F4D3620020302E9
1794:10604200000001000101010101000101010203043C
1795:0660520005060708090025
1796:00000001FF
diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile
index 40bd36aec..0145e44bc 100644
--- a/keyboard/preonic/Makefile
+++ b/keyboard/preonic/Makefile
@@ -127,7 +127,8 @@ MIDI_ENABLE = yes # MIDI controls
127BACKLIGHT_ENABLE = yes 127BACKLIGHT_ENABLE = yes
128 128
129ifdef MIDI_ENABLE 129ifdef MIDI_ENABLE
130 SRC += keymap_midi.c 130 SRC += keymap_midi.c \
131 beeps.c
131endif 132endif
132 133
133# Optimize size but this may cause error "relocation truncated to fit" 134# Optimize size but this may cause error "relocation truncated to fit"
diff --git a/keyboard/preonic/beeps.c b/keyboard/preonic/beeps.c
index 13e46e1da..8ffd70f41 100644
--- a/keyboard/preonic/beeps.c
+++ b/keyboard/preonic/beeps.c
@@ -5,31 +5,6 @@
5#include <avr/io.h> 5#include <avr/io.h>
6 6
7#define PI 3.14159265 7#define PI 3.14159265
8#define CHANNEL OCR1C
9
10volatile uint16_t sample;
11uint16_t lastSample;
12
13const int sounddata_length=200;
14
15const unsigned char sounddata_data[] PROGMEM = {128,
16128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
17128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
18128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
19128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
20128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
21128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
22128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
23128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
24128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
25128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 127, 129, 128, 127, 133,
26117, 109, 125, 121, 116, 132, 140, 126, 114, 114, 116, 120, 114, 93, 73, 66, 76, 116, 142, 129,
27128, 129, 120, 119, 118, 104, 87, 123, 181, 194, 196, 198, 189, 176, 160, 162, 172, 164, 164, 183,
28197, 188, 168, 167, 170, 165, 185, 209, 206, 196, 196, 199, 185, 162, 156, 167, 176, 173, 170, 166,
29151, 142, 140, 134, 130, 127, 113, 86, 67, 66, 69, 75, 73, 75, 86, 90, 91, 84, 65, 48,
3041, 30, 26, 56, 91, 88, 72, 70, 73, 82, 89, 73, 57, 60, 74, 89, 92, 77, 63, 60,
3153, 47, 56, 64, 63, 61, 56, 54, 52, 36, 16, 22, 51, 66, 67, 70, 76, 88, 99, 92,
3277, 74, 85, 100, 106, 97, 83, 85, 96, 108, 133, 160, 164};
33 8
34void delay_us(int count) { 9void delay_us(int count) {
35 while(count--) { 10 while(count--) {
@@ -37,202 +12,235 @@ void delay_us(int count) {
37 } 12 }
38} 13}
39 14
40void beeps() { 15int voices = 0;
41 // DDRB |= (1<<7); 16double frequency = 0;
42 // PORTB &= ~(1<<7); 17int volume = 0;
43 18int position = 0;
44 // // Use full 16-bit resolution. 19
45 // ICR1 = 0xFFFF; 20double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
46 21int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
47 // // I could write a wall of text here to explain... but TL;DW 22bool sliding = false;
48 // // Go read the ATmega32u4 datasheet. 23#define RANGE 1000
49 // // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on 24volatile int i=0; //elements of the wave
50
51 // // Pin PB7 = OCR1C (Timer 1, Channel C)
52 // // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
53 // // (i.e. start high, go low when counter matches.)
54 // // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
55 // // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
56
57 // TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
58 // TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
59
60
61 // // Turn off PWM control on PB7, revert to output low.
62 // // TCCR1A &= ~(_BV(COM1C1));
63 // // CHANNEL = ((1 << level) - 1);
64
65 // // Turn on PWM control of PB7
66 // TCCR1A |= _BV(COM1C1);
67 // // CHANNEL = level << OFFSET | 0x0FFF;
68 // // CHANNEL = 0b1010101010101010;
69
70 // float x = 12;
71 // float y = 24;
72 // float length = 50;
73 // float scale = 1;
74
75 // // int f1 = 1000000/440;
76 // // int f2 = 1000000/880;
77 // // for (uint32_t i = 0; i < length * 1000; i++) {
78 // // // int frequency = 1/((sin(PI*2*i*scale*pow(2, x/12.0))*.5+1 + sin(PI*2*i*scale*pow(2, y/12.0))*.5+1) / 2);
79
80 // // ICR1 = f1; // Set max to the period
81 // // OCR1C = f1 >> 1; // Set compare to half the period
82 // // // _delay_us(10);
83 // // }
84 // int frequency = 1000000/440;
85 // ICR1 = frequency; // Set max to the period
86 // OCR1C = frequency >> 1; // Set compare to half the period
87 // _delay_us(500000);
88
89 // TCCR1A &= ~(_BV(COM1C1));
90 // CHANNEL = 0;
91play_notes();
92
93
94 // play_note(55*pow(2, 0/12.0), 1);
95 // play_note(55*pow(2, 12/12.0), 1);
96 // play_note(55*pow(2, 24/12.0), 1);
97 // play_note(55*pow(2, 0/12.0), 1);
98 // play_note(55*pow(2, 12/12.0), 1);
99 // play_note(55*pow(2, 24/12.0), 1);
100
101 // play_note(0, 4);
102
103 // play_note(55*pow(2, 0/12.0), 8);
104 // play_note(55*pow(2, 12/12.0), 4);
105 // play_note(55*pow(2, 10/12.0), 4);
106 // play_note(55*pow(2, 12/12.0), 8);
107 // play_note(55*pow(2, 10/12.0), 4);
108 // play_note(55*pow(2, 7/12.0), 2);
109 // play_note(55*pow(2, 8/12.0), 2);
110 // play_note(55*pow(2, 7/12.0), 16);
111 // play_note(0, 4);
112 // play_note(55*pow(2, 3/12.0), 8);
113 // play_note(55*pow(2, 5/12.0), 4);
114 // play_note(55*pow(2, 7/12.0), 4);
115 // play_note(55*pow(2, 7/12.0), 8);
116 // play_note(55*pow(2, 5/12.0), 4);
117 // play_note(55*pow(2, 3/12.0), 4);
118 // play_note(55*pow(2, 2/12.0), 16);
119 25
120 26
27void beeps() {
28 play_notes();
121} 29}
122 30
123void play_note(float freq, int length) { 31void send_freq(double freq, int vol) {
124 DDRB |= (1<<7); 32 int duty = (((double)F_CPU) / freq);
125 PORTB &= ~(1<<7); 33 ICR3 = duty; // Set max to the period
34 OCR3A = duty >> (0x10 - vol); // Set compare to half the period
35}
126 36
127 if (freq > 0) { 37void stop_all_notes() {
128 int frequency = 1000000/freq; 38 voices = 0;
129 ICR1 = frequency; // Set max to the period 39 TCCR3A = 0;
130 OCR1C = frequency >> 1; // Set compare to half the period 40 TCCR3B = 0;
41 frequency = 0;
42 volume = 0;
131 43
132 TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; 44 for (int i = 0; i < 8; i++) {
133 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; 45 frequencies[i] = 0;
46 volumes[i] = 0;
134 } 47 }
135
136 for (int i = 0; i < length; i++) {
137 _delay_us(50000);
138 }
139
140 TCCR1A &= ~(_BV(COM1C1));
141} 48}
142 49
143// This is called at 8000 Hz to load the next sample. 50void stop_note(double freq) {
144ISR(TIMER1_COMPA_vect) { 51 for (int i = 7; i >= 0; i--) {
145 if (sample >= sounddata_length) { 52 if (frequencies[i] == freq) {
146 if (sample == sounddata_length + lastSample) { 53 frequencies[i] = 0;
147 TIMSK1 &= ~_BV(OCIE1A); 54 volumes[i] = 0;
148 55 for (int j = i; (j < 7); j++) {
149 // Disable the per-sample timer completely. 56 frequencies[j] = frequencies[j+1];
150 TCCR1B &= ~_BV(CS10); 57 frequencies[j+1] = 0;
151 } 58 volumes[j] = volumes[j+1];
152 else { 59 volumes[j+1] = 0;
153 OCR1C = sounddata_length + lastSample - sample; 60 }
154 } 61 }
155 } 62 }
156 else { 63 voices--;
157 OCR1C = pgm_read_byte(&sounddata_data[sample]); 64 if (voices < 0)
65 voices = 0;
66 if (voices == 0) {
67 TCCR3A = 0;
68 TCCR3B = 0;
69 frequency = 0;
70 volume = 0;
71 } else {
72 double freq = frequencies[voices - 1];
73 int vol = volumes[voices - 1];
74 if (frequency < freq) {
75 sliding = true;
76 for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
77 send_freq(f, vol);
78 }
79 sliding = false;
80 } else if (frequency > freq) {
81 sliding = true;
82 for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
83 send_freq(f, vol);
84 }
85 sliding = false;
86 }
87 send_freq(freq, vol);
88 frequency = freq;
89 volume = vol;
158 } 90 }
159
160 ++sample;
161} 91}
162 92
163void play_notes() { 93void init_notes() {
94 // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (1 << WGM10);
95 // TCCR1B = (1 << COM1B1) | (0 << COM1A0) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
164 96
97 // DDRC |= (1<<6);
165 98
166 // Set up Timer 2 to do pulse width modulation on the speaker 99 // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
167 // pin. 100 // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
168 101
169 DDRB |= (1<<7); 102 // ICR3 = 0xFFFF;
170 PORTB &= ~(1<<7); 103 // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element
171 104
172 // Use internal clock (datasheet p.160)
173 // ASSR &= ~(_BV(EXCLK) | _BV(AS2));
174 105
175 // Set fast PWM mode (p.157) 106 // cli();
176 TCCR1A |= _BV(WGM21) | _BV(WGM20);
177 TCCR1B &= ~_BV(WGM22);
178 107
179 // Do non-inverting PWM on pin OC2A (p.155) 108 // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz,
180 // On the Arduino this is pin 11. 109 // this gives a timer interrupt at 15625Hz. */
181 TCCR1A = (TCCR2A | _BV(COM2A1)) & ~_BV(COM2A0); 110 // TIMSK3 = (1 << OCIE3A);
182 TCCR1A &= ~(_BV(COM2B1) | _BV(COM2B0));
183 // No prescaler (p.158)
184 TCCR1B = (TCCR1B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);
185 111
186 // Set initial pulse width to the first sample. 112 // /* clear/reset timer on match */
187 OCR1A = pgm_read_byte(&sounddata_data[0]); 113 // // TCCR3A = 1<<WGM31 | 0<<WGM30; CTC mode, reset on match
114 // // TCCR3B = 0<<CS32 | 1<<CS31 | 0<<CS30; /* clk, /8 prescaler */
188 115
116 // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
117 // TCCR3B = (0 << WGM33) | (0 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
189 118
190 119
120 // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
121 // TCCR1B = (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
122 // // SPCR = 0x50;
123 // // SPSR = 0x01;
124 // DDRC |= (1<<6);
125 // // ICR3 = 0xFFFF;
126 // // OCR3A=80;
127 // PORTC |= (1<<6);
191 128
192 cli(); 129 // sei();
130}
131
132// #define highByte(c) ((c >> 8) & 0x00FF)
133// #define lowByte(c) (c & 0x00FF)
134
135ISR(TIMER3_COMPA_vect) {
136
137 if (ICR3 > 0 && !sliding) {
138 switch (position) {
139 case 0: {
140 int duty = (((double)F_CPU) / (frequency));
141 ICR3 = duty; // Set max to the period
142 OCR3A = duty >> 1; // Set compare to half the period
143 break;
144 }
145 case 1: {
146 int duty = (((double)F_CPU) / (frequency*2));
147 ICR3 = duty; // Set max to the period
148 OCR3A = duty >> 1; // Set compare to half the period
149 break;
150 }
151 case 2: {
152 int duty = (((double)F_CPU) / (frequency*3));
153 ICR3 = duty; // Set max to the period
154 OCR3A = duty >> 1; // Set compare to half the period
155 break;
156 }
157 }
158 position = (position + 1) % 3;
159 }
160// /* OCR2A has been cleared, per TCCR2A above */
161// // OCR3A = 127;
162
163// // pos1 += incr1;
164// // pos2 += incr2;
165// // pos3 += incr3;
166
167// // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)];
193 168
194 // Set CTC mode (Clear Timer on Compare Match) (p.133) 169// // OCR3A = sample;
195 // Have to set OCR1A *after*, otherwise it gets reset to 0!
196 TCCR2B = (TCCR2B & ~_BV(WGM13)) | _BV(WGM12);
197 TCCR2A = TCCR2A & ~(_BV(WGM11) | _BV(WGM10));
198 170
199 // No prescaler (p.134)
200 TCCR2B = (TCCR2B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);
201 171
202 // Set the compare register (OCR1A). 172// OCR3A=pgm_read_byte(&sinewave[pos1]);
203 // OCR1A is a 16-bit register, so we have to do this with 173// pos1++;
204 // interrupts disabled to be safe. 174// // PORTC &= ~(1<<6);
205 // OCR2A = F_CPU / SAMPLE_RATE; // 16e6 / 8000 = 2000
206 OCR2A = 2000;
207 175
208 // Enable interrupt when TCNT1 == OCR1A (p.136) 176// /* buffered, 1x gain, active mode */
209 TIMSK1 |= _BV(OCIE2A); 177// // SPDR = highByte(sample) | 0x70;
178// // while (!(SPSR & (1<<SPIF)));
210 179
211 sample = 0; 180// // SPDR = lowByte(sample);
212 sei(); 181// // while (!(SPSR & (1<<SPIF)));
182
183// // PORTC |= (1<<6);
213} 184}
214 185
215void note(int x, float length) { 186void play_note(double freq, int vol) {
216 DDRB |= (1<<1); 187
217 int t = (int)(440*pow(2,-x/12.0)); // starting note 188 if (freq > 0) {
218 for (int y = 0; y < length*1000/t; y++) { // note length 189 DDRC |= (1<<6);
219 PORTB |= (1<<1); 190
220 delay_us(t); 191 TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
221 PORTB &= ~(1<<1); 192 TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
222 delay_us(t); 193
194 if (frequency != 0) {
195 if (frequency < freq) {
196 for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
197 send_freq(f, vol);
198 }
199 } else if (frequency > freq) {
200 for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
201 send_freq(f, vol);
202 }
203 }
204 }
205 send_freq(freq, vol);
206 frequency = freq;
207 volume = vol;
208
209 frequencies[voices] = frequency;
210 volumes[voices] = volume;
211 voices++;
223 } 212 }
224 PORTB &= ~(1<<1); 213 // ICR3 = 0xFFFF;
214 // for (int i = 0; i < 10000; i++) {
215 // OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF;
216 // // _delay_us(50);
217 // }
218
219 // TCCR3A = 0;
220 // TCCR3B = 0;
225} 221}
226 222
227void true_note(float x, float y, float length) { 223// void note(int x, float length) {
228 for (uint32_t i = 0; i < length * 50; i++) { 224// DDRC |= (1<<6);
229 uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8)); 225// int t = (int)(440*pow(2,-x/12.0)); // starting note
230 for (int u = 0; u < 8; u++) { 226// for (int y = 0; y < length*1000/t; y++) { // note length
231 if (v & (1 << u) && !(PORTB&(1<<1))) 227// PORTC |= (1<<6);
232 PORTB |= (1<<1); 228// delay_us(t);
233 else if (PORTB&(1<<1)) 229// PORTC &= ~(1<<6);
234 PORTB &= ~(1<<1); 230// delay_us(t);
235 } 231// }
236 } 232// PORTC &= ~(1<<6);
237 PORTB &= ~(1<<1); 233// }
238} \ No newline at end of file 234
235// void true_note(float x, float y, float length) {
236// for (uint32_t i = 0; i < length * 50; i++) {
237// uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8));
238// for (int u = 0; u < 8; u++) {
239// if (v & (1 << u) && !(PORTC&(1<<6)))
240// PORTC |= (1<<6);
241// else if (PORTC&(1<<6))
242// PORTC &= ~(1<<6);
243// }
244// }
245// PORTC &= ~(1<<6);
246// } \ No newline at end of file
diff --git a/keyboard/preonic/beeps.h b/keyboard/preonic/beeps.h
index 3e3c634ff..378983c60 100644
--- a/keyboard/preonic/beeps.h
+++ b/keyboard/preonic/beeps.h
@@ -6,4 +6,7 @@
6void note(int x, float length); 6void note(int x, float length);
7void beeps(); 7void beeps();
8void true_note(float x, float y, float length); 8void true_note(float x, float y, float length);
9void play_note(float freq, int length); \ No newline at end of file 9void play_note(double freq, int vol);
10void stop_note(double freq);
11void stop_all_notes();
12void init_notes(); \ No newline at end of file
diff --git a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
index 8edf8a283..ec7bc776a 100644
--- a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
+++ b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
@@ -1,8 +1,8 @@
1#include "extended_keymap_common.h" 1#include "extended_keymap_common.h"
2#include "backlight.h" 2#include "backlight.h"
3#include "action_layer.h" 3#include "action_layer.h"
4#include "lufa.h"
5#include "keymap_midi.h" 4#include "keymap_midi.h"
5#include "beeps.h"
6 6
7const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 7const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
8[0] = { /* Qwerty */ 8[0] = { /* Qwerty */
diff --git a/keyboard/preonic/keymap_midi.c b/keyboard/preonic/keymap_midi.c
index c7937bb9b..a0fa59990 100644
--- a/keyboard/preonic/keymap_midi.c
+++ b/keyboard/preonic/keymap_midi.c
@@ -20,37 +20,91 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
20#include <lufa.h> 20#include <lufa.h>
21 21
22uint8_t starting_note = 0x0C; 22uint8_t starting_note = 0x0C;
23int offset = 7;
23 24
24void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) 25void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
25{ 26{
26 if (id != 0) { 27 if (id != 0) {
27 if (record->event.pressed) { 28 if (record->event.pressed) {
28 midi_send_noteon(&midi_device, opt, (id & 0xFF), 127); 29 midi_send_noteon(&midi_device, opt, (id & 0xFF), 127);
29 } else { 30 } else {
30 midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127); 31 midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127);
31 } 32 }
32 } 33 }
33 34
34 if (record->event.key.col == 11 && record->event.key.row == 4 && record->event.pressed) { 35 if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
35 starting_note++; 36 if (record->event.pressed) {
37 starting_note++;
38 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
39 midi_send_cc(&midi_device, 0, 0x7B, 0);
40 midi_send_cc(&midi_device, 1, 0x7B, 0);
41 midi_send_cc(&midi_device, 2, 0x7B, 0);
42 midi_send_cc(&midi_device, 3, 0x7B, 0);
43 midi_send_cc(&midi_device, 4, 0x7B, 0);
44 return;
45 } else {
46 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
47 stop_all_notes();
48 return;
49 }
50 }
51 if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
52 if (record->event.pressed) {
53 starting_note--;
54 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
55 midi_send_cc(&midi_device, 0, 0x7B, 0);
56 midi_send_cc(&midi_device, 1, 0x7B, 0);
57 midi_send_cc(&midi_device, 2, 0x7B, 0);
58 midi_send_cc(&midi_device, 3, 0x7B, 0);
59 midi_send_cc(&midi_device, 4, 0x7B, 0);
60 return;
61 } else {
62 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
63 stop_all_notes();
64 return;
65 }
66 }
67
68 if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
69 offset++;
36 midi_send_cc(&midi_device, 0, 0x7B, 0); 70 midi_send_cc(&midi_device, 0, 0x7B, 0);
37 midi_send_cc(&midi_device, 1, 0x7B, 0); 71 midi_send_cc(&midi_device, 1, 0x7B, 0);
38 midi_send_cc(&midi_device, 2, 0x7B, 0); 72 midi_send_cc(&midi_device, 2, 0x7B, 0);
39 midi_send_cc(&midi_device, 3, 0x7B, 0); 73 midi_send_cc(&midi_device, 3, 0x7B, 0);
40 midi_send_cc(&midi_device, 4, 0x7B, 0); 74 midi_send_cc(&midi_device, 4, 0x7B, 0);
75 stop_all_notes();
76 for (int i = 0; i <= 7; i++) {
77 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
78 _delay_us(80000);
79 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
80 _delay_us(8000);
81 }
82 return;
41 } 83 }
42 if (record->event.key.col == 8 && record->event.key.row == 4 && record->event.pressed) { 84 if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
43 starting_note--; 85 offset--;
44 midi_send_cc(&midi_device, 0, 0x7B, 0); 86 midi_send_cc(&midi_device, 0, 0x7B, 0);
45 midi_send_cc(&midi_device, 1, 0x7B, 0); 87 midi_send_cc(&midi_device, 1, 0x7B, 0);
46 midi_send_cc(&midi_device, 2, 0x7B, 0); 88 midi_send_cc(&midi_device, 2, 0x7B, 0);
47 midi_send_cc(&midi_device, 3, 0x7B, 0); 89 midi_send_cc(&midi_device, 3, 0x7B, 0);
48 midi_send_cc(&midi_device, 4, 0x7B, 0); 90 midi_send_cc(&midi_device, 4, 0x7B, 0);
91 stop_all_notes();
92 for (int i = 0; i <= 7; i++) {
93 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
94 _delay_us(80000);
95 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
96 _delay_us(8000);
97 }
98 return;
49 } 99 }
50 100
51 if (record->event.pressed) { 101 if (record->event.pressed) {
52 midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); 102 // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
103 midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
104 play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
53 } else { 105 } else {
54 midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); 106 // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
107 midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
108 stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
55 } 109 }
56} \ No newline at end of file 110} \ No newline at end of file
diff --git a/keyboard/preonic/keymap_midi.h b/keyboard/preonic/keymap_midi.h
index 02bf35c24..c5917f884 100644
--- a/keyboard/preonic/keymap_midi.h
+++ b/keyboard/preonic/keymap_midi.h
@@ -23,7 +23,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
23 23
24#define CHNL(note, channel) (note + (channel << 8)) 24#define CHNL(note, channel) (note + (channel << 8))
25 25
26#define SCALE (int []){ 0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 19, 21, 23, 24, 26, 28, 29, 31, 33, 35, 36} 26#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
27 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
28 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
29 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
30 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
27 31
28#define N_CN1 (0x600C + (12 * -1) + 0 ) 32#define N_CN1 (0x600C + (12 * -1) + 0 )
29#define N_CN1S (0x600C + (12 * -1) + 1 ) 33#define N_CN1S (0x600C + (12 * -1) + 1 )
diff --git a/protocol/bluefruit.mk b/protocol/bluefruit.mk
index 7e6328f6c..473d73e01 100644
--- a/protocol/bluefruit.mk
+++ b/protocol/bluefruit.mk
@@ -3,7 +3,7 @@ PJRC_DIR = protocol/pjrc
3 3
4SRC += $(BLUEFRUIT_DIR)/main.c \ 4SRC += $(BLUEFRUIT_DIR)/main.c \
5 $(BLUEFRUIT_DIR)/bluefruit.c \ 5 $(BLUEFRUIT_DIR)/bluefruit.c \
6 serial_uart.c \ 6 ../serial_uart.c \
7 $(PJRC_DIR)/pjrc.c \ 7 $(PJRC_DIR)/pjrc.c \
8 $(PJRC_DIR)/usb_keyboard.c \ 8 $(PJRC_DIR)/usb_keyboard.c \
9 $(PJRC_DIR)/usb_debug.c \ 9 $(PJRC_DIR)/usb_debug.c \
diff --git a/protocol/bluefruit/bluefruit.c b/protocol/bluefruit/bluefruit.c
index cf26b83df..47c63555c 100644
--- a/protocol/bluefruit/bluefruit.c
+++ b/protocol/bluefruit/bluefruit.c
@@ -2,20 +2,16 @@
2Bluefruit Protocol for TMK firmware 2Bluefruit Protocol for TMK firmware
3Author: Benjamin Gould, 2013 3Author: Benjamin Gould, 2013
4Based on code Copyright 2011 Jun Wako <wakojun@gmail.com> 4Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
5
6This program is free software: you can redistribute it and/or modify 5This program is free software: you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by 6it under the terms of the GNU General Public License as published by
8the Free Software Foundation, either version 2 of the License, or 7the Free Software Foundation, either version 2 of the License, or
9(at your option) any later version. 8(at your option) any later version.
10
11This program is distributed in the hope that it will be useful, 9This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of 10but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details. 12GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License 13You should have received a copy of the GNU General Public License
17along with this program. If not, see <http://www.gnu.org/licenses/>. 14along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19*/ 15*/
20 16
21#include <stdint.h> 17#include <stdint.h>
@@ -76,6 +72,13 @@ static void send_mouse(report_mouse_t *report);
76static void send_system(uint16_t data); 72static void send_system(uint16_t data);
77static void send_consumer(uint16_t data); 73static void send_consumer(uint16_t data);
78 74
75
76void sendString(char string[], int length) {
77 for(int i = 0; i < length; i++) {
78 serial_send(string[i]);
79 }
80}
81
79static host_driver_t driver = { 82static host_driver_t driver = {
80 keyboard_leds, 83 keyboard_leds,
81 send_keyboard, 84 send_keyboard,
@@ -100,6 +103,7 @@ static void send_keyboard(report_keyboard_t *report)
100#endif 103#endif
101 bluefruit_serial_send(0xFD); 104 bluefruit_serial_send(0xFD);
102 for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) { 105 for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) {
106
103 bluefruit_serial_send(report->raw[i]); 107 bluefruit_serial_send(report->raw[i]);
104 } 108 }
105#ifdef BLUEFRUIT_TRACE_SERIAL 109#ifdef BLUEFRUIT_TRACE_SERIAL
@@ -198,5 +202,4 @@ static void send_consumer(uint16_t data)
198#ifdef BLUEFRUIT_TRACE_SERIAL 202#ifdef BLUEFRUIT_TRACE_SERIAL
199 bluefruit_trace_footer(); 203 bluefruit_trace_footer();
200#endif 204#endif
201} 205} \ No newline at end of file
202
diff --git a/protocol/bluefruit/bluefruit.h b/protocol/bluefruit/bluefruit.h
index 4f9b58836..ceacc4a36 100644
--- a/protocol/bluefruit/bluefruit.h
+++ b/protocol/bluefruit/bluefruit.h
@@ -2,17 +2,14 @@
2Bluefruit Protocol for TMK firmware 2Bluefruit Protocol for TMK firmware
3Author: Benjamin Gould, 2013 3Author: Benjamin Gould, 2013
4Based on code Copyright 2011 Jun Wako <wakojun@gmail.com> 4Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
5
6This program is free software: you can redistribute it and/or modify 5This program is free software: you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by 6it under the terms of the GNU General Public License as published by
8the Free Software Foundation, either version 2 of the License, or 7the Free Software Foundation, either version 2 of the License, or
9(at your option) any later version. 8(at your option) any later version.
10
11This program is distributed in the hope that it will be useful, 9This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of 10but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details. 12GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License 13You should have received a copy of the GNU General Public License
17along with this program. If not, see <http://www.gnu.org/licenses/>. 14along with this program. If not, see <http://www.gnu.org/licenses/>.
18*/ 15*/
@@ -25,4 +22,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
25 22
26host_driver_t *bluefruit_driver(void); 23host_driver_t *bluefruit_driver(void);
27 24
28#endif 25#endif \ No newline at end of file
diff --git a/protocol/bluefruit/main.c b/protocol/bluefruit/main.c
index 871062ab1..0dbb637e2 100644
--- a/protocol/bluefruit/main.c
+++ b/protocol/bluefruit/main.c
@@ -22,7 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
22#include <avr/wdt.h> 22#include <avr/wdt.h>
23#include <avr/sleep.h> 23#include <avr/sleep.h>
24#include <util/delay.h> 24#include <util/delay.h>
25#include "serial.h" 25#include "../serial.h"
26#include "keyboard.h" 26#include "keyboard.h"
27#include "usb.h" 27#include "usb.h"
28#include "host.h" 28#include "host.h"
@@ -40,23 +40,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
40#define BLUEFRUIT_HOST_DRIVER 1 40#define BLUEFRUIT_HOST_DRIVER 1
41#define PJRC_HOST_DRIVER 2 41#define PJRC_HOST_DRIVER 2
42 42
43
43int main(void) 44int main(void)
44{ 45{
45 46
46 CPU_PRESCALE(0); 47 CPU_PRESCALE(0);
47 48
48 DDRD = _BV(PD5); 49 // DDRD = _BV(PD5);
49 DDRB = _BV(PB0); 50 // DDRB = _BV(PB0);
50 51
51 PORTD = _BV(PD5); 52 // PORTD = _BV(PD5);
52 PORTB = _BV(PB0); 53 // PORTB = _BV(PB0);
53 54
54 print_set_sendchar(sendchar); 55 print_set_sendchar(sendchar);
55 56
56 usb_init(); 57 // usb_init();
57 _delay_ms(2000); 58 // _delay_ms(2000);
58 // while (!usb_configured()) /* wait */ 59 // while (!usb_configured()) /* wait */
59 60
61
62
60 dprintf("Initializing keyboard...\n"); 63 dprintf("Initializing keyboard...\n");
61 keyboard_init(); 64 keyboard_init();
62 65
@@ -64,53 +67,72 @@ int main(void)
64 // is not configured, choose the Bluefruit, otherwise use USB 67 // is not configured, choose the Bluefruit, otherwise use USB
65 // Definitely would prefer to have this driven by an input pin and make 68 // Definitely would prefer to have this driven by an input pin and make
66 // it switch dynamically - BCG 69 // it switch dynamically - BCG
67 if (!usb_configured()) { 70 // if (!usb_configured()) {
68 71
69 // Send power to Bluefruit... Adafruit says it takes 27 mA, I think 72 // // Send power to Bluefruit... Adafruit says it takes 27 mA, I think
70 // the pins should provide 40 mA, but just in case I switch the 73 // // the pins should provide 40 mA, but just in case I switch the
71 // Bluefruit using a transistor - BCG 74 // // Bluefruit using a transistor - BCG
72 DDRB = _BV(PB6); 75 // DDRB = _BV(PB6);
73 PORTB |= _BV(PB6); 76 // PORTB |= _BV(PB6);
74 77
75 dprintf("Setting host driver to bluefruit...\n"); 78 dprintf("Setting host driver to bluefruit...\n");
76 host_set_driver(bluefruit_driver()); 79 host_set_driver(bluefruit_driver());
77 80
78 dprintf("Initializing serial...\n"); 81 dprintf("Initializing serial...\n");
79 serial_init(); 82 serial_init();
80
81 // wait an extra second for the PC's operating system
82 // to load drivers and do whatever it does to actually
83 // be ready for input
84 _delay_ms(1000);
85 PORTD = ~_BV(PD5);
86 dprintf("Starting main loop");
87 while (1) {
88 keyboard_task();
89 }
90 83
91 } else { 84 // char swpa[] = "+++\r\n";
85 // for (int i = 0; i < 5; i++) {
86 // serial_send(swpa[i]);
87 // }
88
89 // char ble_enable[] = "AT+BLEKEYBOARDEN=1\r\n";
90 // for (int i = 0; i < 20; i++) {
91 // serial_send(ble_enable[i]);
92 // }
93
94 // char reset[] = "ATZ\r\n";
95 // for (int i = 0; i < 5; i++) {
96 // serial_send(reset[i]);
97 // }
98
99 // for (int i = 0; i < 5; i++) {
100 // serial_send(swpa[i]);
101 // }
92 102
93 // I'm not smart enough to get this done with LUFA - BCG
94 dprintf("Setting host driver to PJRC...\n");
95 host_set_driver(pjrc_driver());
96#ifdef SLEEP_LED_ENABLE
97 sleep_led_init();
98#endif
99 // wait an extra second for the PC's operating system 103 // wait an extra second for the PC's operating system
100 // to load drivers and do whatever it does to actually 104 // to load drivers and do whatever it does to actually
101 // be ready for input 105 // be ready for input
102 _delay_ms(1000); 106 _delay_ms(1000);
103 PORTB = ~_BV(PB0); 107 // PORTD = ~_BV(PD5);
104 dprintf("Starting main loop"); 108 dprintf("Starting main loop");
105 while (1) { 109 while (1) {
106 while (suspend) { 110 keyboard_task();
107 suspend_power_down();
108 if (remote_wakeup && suspend_wakeup_condition()) {
109 usb_remote_wakeup();
110 }
111 }
112 keyboard_task();
113 } 111 }
114 } 112
113// } else {
114
115// // I'm not smart enough to get this done with LUFA - BCG
116// dprintf("Setting host driver to PJRC...\n");
117// host_set_driver(pjrc_driver());
118// #ifdef SLEEP_LED_ENABLE
119// sleep_led_init();
120// #endif
121// // wait an extra second for the PC's operating system
122// // to load drivers and do whatever it does to actually
123// // be ready for input
124// _delay_ms(1000);
125// PORTB = ~_BV(PB0);
126// dprintf("Starting main loop");
127// while (1) {
128// while (suspend) {
129// suspend_power_down();
130// if (remote_wakeup && suspend_wakeup_condition()) {
131// usb_remote_wakeup();
132// }
133// }
134// keyboard_task();
135// }
136// }
115 137
116} 138}
diff --git a/protocol/lufa/descriptor.c b/protocol/lufa/descriptor.c
index 5454926b1..b345da27b 100644
--- a/protocol/lufa/descriptor.c
+++ b/protocol/lufa/descriptor.c
@@ -266,7 +266,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
266 266
267 .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP), 267 .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
268 268
269 .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) 269 .MaxPowerConsumption = USB_CONFIG_POWER_MA(500)
270 }, 270 },
271 271
272 /* 272 /*
diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c
index b31f3031e..85c7bf712 100644
--- a/protocol/lufa/lufa.c
+++ b/protocol/lufa/lufa.c
@@ -840,13 +840,13 @@ int main(void)
840 840
841 841
842 /* wait for USB startup & debug output */ 842 /* wait for USB startup & debug output */
843 // while (USB_DeviceState != DEVICE_STATE_Configured) { 843 while (USB_DeviceState != DEVICE_STATE_Configured) {
844// #if defined(INTERRUPT_CONTROL_ENDPOINT) 844// #if defined(INTERRUPT_CONTROL_ENDPOINT)
845 // ; 845 // ;
846// #else 846// #else
847 USB_USBTask(); 847 USB_USBTask();
848// #endif 848// #endif
849 // } 849 }
850 print("USB configured.\n"); 850 print("USB configured.\n");
851 851
852 /* init modules */ 852 /* init modules */