Christopher Browne 9 years ago
commit f59c4b03fa

4
.gitignore vendored

@ -16,8 +16,8 @@ build/
.vagrant/ .vagrant/
.DS_STORE .DS_STORE
# Eclipse Settings # Eclipse/PyCharm/Other IDE Settings
.cproject .cproject
.project .project
.settings/ .settings/
.idea

@ -1,11 +1,13 @@
# Quantum MK Firmware # Quantum Mechanical Keyboard Firmware
This is a keyboard firmware based on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.co) and the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard. This is a keyboard firmware based on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.co), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/).
QMK is developed and maintained by Jack Humbert of OLKB with contributions from the community, and of course, TMK. QMK is developed and maintained by Jack Humbert of OLKB with contributions from the community, and of course, TMK.
This documentation is edited and maintained by Erez Zukerman of ErgoDox EZ. If you spot any typos or inaccuracies, please [open an issue](https://github.com/jackhumbert/qmk_firmware/issues/new). This documentation is edited and maintained by Erez Zukerman of ErgoDox EZ. If you spot any typos or inaccuracies, please [open an issue](https://github.com/jackhumbert/qmk_firmware/issues/new).
The OLKB product firmwares are maintained by Jack, the Ergodox EZ by Erez, and the Clueboard by [skullydazed](/skullydazed).
## Important background info: TMK documentation ## Important background info: TMK documentation
The documentation below explains QMK customizations and elaborates on some of the more useful features of TMK. To understand the base firmware, and especially what *layers* are and how they work, please see [TMK_README.md](/TMK_README.md). The documentation below explains QMK customizations and elaborates on some of the more useful features of TMK. To understand the base firmware, and especially what *layers* are and how they work, please see [TMK_README.md](/TMK_README.md).
@ -16,13 +18,21 @@ The documentation below explains QMK customizations and elaborates on some of th
* If you're looking to customize a keyboard that currently runs QMK or TMK, find your keyboard's directory under `keyboard/` and run the make commands from there. * If you're looking to customize a keyboard that currently runs QMK or TMK, find your keyboard's directory under `keyboard/` and run the make commands from there.
* If you're looking to apply this firmware to an entirely new hardware project (a new kind of keyboard), you can create your own Quantum-based project by using `./new_project.sh <project_name>`, which will create `/keyboard/<project_name>` with all the necessary components for a Quantum project. * If you're looking to apply this firmware to an entirely new hardware project (a new kind of keyboard), you can create your own Quantum-based project by using `./new_project.sh <project_name>`, which will create `/keyboard/<project_name>` with all the necessary components for a Quantum project.
### Makefile Options
You have access to a bunch of goodies! Check out the Makefile to enable/disable some of the features. Uncomment the `#` to enable them. Setting them to `no` does nothing and will only confuse future you. You have access to a bunch of goodies! Check out the Makefile to enable/disable some of the features. Uncomment the `#` to enable them. Setting them to `no` does nothing and will only confuse future you.
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = yes # MIDI controls MIDI_ENABLE = yes # MIDI controls
# UNICODE_ENABLE = yes # Unicode support - this is commented out, just as an example. You have to use #, not // UNICODE_ENABLE = no # <-- This is how you disable an option, just set it to "no"
BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
### Customizing Makefile options on a per-keymap basis
If your keymap directory has a file called `makefile.mk` (note the lowercase filename, and the `.mk` extension), any Makefile options you set in that file will take precedence over other Makefile options (those set for Quantum as a whole or for your particular keyboard).
So let's say your keyboard's makefile has `CONSOLE_ENABLE = yes` (or maybe doesn't even list the `CONSOLE_ENABLE` option, which would cause it to revert to the global Quantum default). You want your particular keymap to not have the debug console, so you make a file called `makefile.mk` and specify `CONSOLE_ENABLE = no`.
## Quick aliases to common actions ## Quick aliases to common actions
Your keymap can include shortcuts to common operations (called "function actions" in tmk). Your keymap can include shortcuts to common operations (called "function actions" in tmk).
@ -199,6 +209,27 @@ This will clear all mods currently pressed.
This will clear all keys besides the mods currently pressed. This will clear all keys besides the mods currently pressed.
* `update_tri_layer(layer_1, layer_2, layer_3);`
If the user attempts to activate layer 1 AND layer 2 at the same time (for example, by hitting their respective layer keys), layer 3 will be activated. Layers 1 and 2 will _also_ be activated, for the purposes of fallbacks (so a given key will fall back from 3 to 2, to 1 -- and only then to 0).
#### Naming your macros
If you have a bunch of macros you want to refer to from your keymap, while keeping the keymap easily readable, you can just name them like so:
```
#define AUD_OFF M(6)
#define AUD_ON M(7)
#define MUS_OFF M(8)
#define MUS_ON M(9)
#define VC_IN M(10)
#define VC_DE M(11)
#define PLOVER M(12)
#define EXT_PLV M(13)
```
As was done on the [Planck default keymap](/keyboard/planck/keymaps/default/keymap.c#L33-L40)
#### Timer functionality #### Timer functionality
It's possible to start timers and read values for time-specific events - here's an example: It's possible to start timers and read values for time-specific events - here's an example:
@ -215,11 +246,91 @@ if (timer_elapsed(key_timer) < 100) {
It's best to declare the `static uint16_t key_timer;` outside of the macro block (top of file, etc). It's best to declare the `static uint16_t key_timer;` outside of the macro block (top of file, etc).
#### Example 1: Single-key copy/paste (hold to copy, tap to paste)
With QMK, it's easy to make one key do two things, as long as one of those things is being a modifier. :) So if you want a key to act as Ctrl when held and send the letter R when tapped, that's easy: `CTL_T(KC_R)`. But what do you do when you want that key to send Ctrl-V (paste) when tapped, and Ctrl-C (copy) when held?
Here's what you do:
```
static uint16_t key_timer;
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
case 0: {
if (record->event.pressed) {
key_timer = timer_read(); // if the key is being pressed, we start the timer.
}
else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap.
return MACRO( D(LCTL), T(C), U(LCTL), END );
}
else {
return MACRO( D(LCTL), T(V), U(LCTL), END );
}
}
break;
}
}
return MACRO_NONE;
};
```
And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for copy/paste.
#### Example 2: Space Cadet Shift (making it easy to send opening and closing parentheses)
In the [Modern Space Cadet Keyboard](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses), one of cooler features is the Shift Parentheses. To quote Steve Losh:
> When held while pressing other keys, act like Shift.
> When pressed and released on their own, type an opening or closing parenthesis (left and right shift respectively).
```
static uint16_t key_timer;
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
case 0: {
if (record->event.pressed) {
key_timer = timer_read(); // if the key is being pressed, we start the timer.
register_code(KC_LSFT); // we're now holding down Shift.
} else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
if (timer_elapsed(key_timer) < 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap.
register_code(KC_9); // sending 9 while Shift is held down gives us an opening paren
unregister_code(KC_9); // now let's let go of that key
}
unregister_code(KC_LSFT); // let's release the Shift key now.
}
break;
}
case 1: {
if (record->event.pressed) {
key_timer = timer_read(); // Now we're doing the same thing, only for the right shift/close paren key
register_code(KC_RSFT);
} else {
if (timer_elapsed(key_timer) < 150) {
register_code(KC_0);
unregister_code(KC_0);
}
unregister_code(KC_RSFT);
}
break;
}
}
return MACRO_NONE;
};
```
And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for left shift/opening parens, and `M(1)` for right shift/closing parens.
## Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc) ## Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc)
Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap: Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap:
#include <keymap_extras/keymap_colemak.h> #include <keymap_colemak.h>
If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to: If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to:
@ -262,7 +373,7 @@ This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboar
## International Characters on Windows ## International Characters on Windows
[AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys amont others. [AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys among others.
The method does not require Unicode support in the keyboard itself but depends instead of AutoHotkey running in the background. The method does not require Unicode support in the keyboard itself but depends instead of AutoHotkey running in the background.
@ -292,7 +403,7 @@ For this mod, you need an unused pin wiring to DI of WS2812 strip. After wiring
Please note that the underglow is not compatible with audio output. So you cannot enable both of them at the same time. Please note that the underglow is not compatible with audio output. So you cannot enable both of them at the same time.
Please add the following options into your config.h, and set them up according your hardware configuration. Please add the following options into your config.h, and set them up according your hardware configuration. These settings are for the F4 by default:
#define ws2812_PORTREG PORTF #define ws2812_PORTREG PORTF
#define ws2812_DDRREG DDRF #define ws2812_DDRREG DDRF
@ -302,6 +413,12 @@ Please add the following options into your config.h, and set them up according y
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17 #define RGBLIGHT_VAL_STEP 17
You'll need to edit `PORTF`, `DDRF`, and `PF4` on the first three lines to the port/pin you have your LED(s) wired to, eg for B3 change things to:
#define ws2812_PORTREG PORTB
#define ws2812_DDRREG DDRB
#define ws2812_pin PB3
The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. For details, please check this keymap. `keyboard/planck/keymaps/yang/keymap.c` The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. For details, please check this keymap. `keyboard/planck/keymaps/yang/keymap.c`
### WS2812 Wiring ### WS2812 Wiring

@ -27,7 +27,7 @@
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP # make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed). # (must have Atmel FLIP installed).
# #
# make debug = Start either simulavr or avarice as specified for debugging, # make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging. # with avr-gdb or avr-insight as the front end for debugging.
# #
# make filename.s = Just compile filename.c into the assembler code only. # make filename.s = Just compile filename.c into the assembler code only.
@ -41,7 +41,6 @@
# Target file name (without extension). # Target file name (without extension).
TARGET = atomic TARGET = atomic
# Directory common source filess exist # Directory common source filess exist
TOP_DIR = ../.. TOP_DIR = ../..
TMK_DIR = ../../tmk_core TMK_DIR = ../../tmk_core
@ -50,15 +49,42 @@ TMK_DIR = ../../tmk_core
TARGET_DIR = . TARGET_DIR = .
# # project specific files # # project specific files
SRC = atomic.c \ SRC = atomic.c
backlight.c
ifdef keymap
KEYMAP = $(keymap)
endif
ifdef KEYMAP ifdef KEYMAP
SRC := keymaps/$(KEYMAP).c $(SRC) ifneq ("$(wildcard keymaps/$(KEYMAP).c)","")
KEYMAP_FILE = keymaps/$(KEYMAP).c
else
ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","")
KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c
ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
include keymaps/$(KEYMAP)/makefile.mk
endif
else
$(error Keymap file does not exist)
endif
endif
else else
SRC := keymaps/default.c $(SRC)
ifneq ("$(wildcard keymaps/default.c)","")
KEYMAP_FILE = keymaps/default.c
else
KEYMAP_FILE = keymaps/default/keymap.c
endif
ifneq ("$(wildcard keymaps/default/makefile.mk)","")
include keymaps/default/makefile.mk
endif endif
endif
SRC := $(KEYMAP_FILE) $(SRC)
CONFIG_H = config.h CONFIG_H = config.h
# MCU name # MCU name
@ -78,7 +104,6 @@ MCU = atmega32u4
# software delays. # software delays.
F_CPU = 16000000 F_CPU = 16000000
# #
# LUFA specific # LUFA specific
# #
@ -110,23 +135,45 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# USBaspLoader 2048 # USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096 OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options # Build Options
# comment out to disable the options. # change to "no" to disable the options, or define them in the makefile.mk in
# # the appropriate keymap folder that will get included automatically
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) #
MOUSEKEY_ENABLE = yes # Mouse keys(+4700) BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
CONSOLE_ENABLE = yes # Console for debug(+400) EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
COMMAND_ENABLE = yes # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality ifdef KEYMAP
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
include keymaps/$(KEYMAP)/makefile.mk
endif
endif
else
ifneq ("$(wildcard keymaps/default/makefile.mk)","")
include keymaps/default/makefile.mk
endif
endif
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
SRC := backlight.c $(SRC)
endif
# Optimize size but this may cause error "relocation truncated to fit" # Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax #EXTRALDFLAGS = -Wl,--relax
@ -136,5 +183,4 @@ VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR) VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR) VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk include $(TOP_DIR)/quantum/quantum.mk

@ -2,12 +2,22 @@
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_init_user(void) { void matrix_init_user(void) {
// leave these blank // leave this function blank - it can be defined in a keymap file
} };
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_scan_user(void) { void matrix_scan_user(void) {
// leave these blank // leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void process_action_user(keyrecord_t *record) {
// leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
} }
void matrix_init_kb(void) { void matrix_init_kb(void) {
@ -33,4 +43,17 @@ void matrix_scan_kb(void) {
// runs every cycle (a lot) // runs every cycle (a lot)
matrix_scan_user(); matrix_scan_user();
} }
void process_action_kb(keyrecord_t *record) {
// put your per-action keyboard code here
// runs for every action, just before processing by the firmware
process_action_user(record);
}
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
led_set_user(usb_led);
}

@ -26,5 +26,8 @@
void matrix_init_user(void); void matrix_init_user(void);
void matrix_scan_user(void); void matrix_scan_user(void);
void process_action_user(keyrecord_t *record);
void led_set_user(uint8_t usb_led);
void backlight_init_ports(void);
#endif #endif

@ -1,6 +1,8 @@
#include <avr/io.h> #include <avr/io.h>
#include "backlight.h" #include "backlight.h"
#include "atomic.h"
#define CHANNEL OCR1C #define CHANNEL OCR1C

@ -32,36 +32,109 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 5 #define MATRIX_ROWS 5
#define MATRIX_COLS 15 #define MATRIX_COLS 15
// Planck PCB default pin-out /*
// Change this to how you wired your keyboard * Keyboard Matrix Assignments
// COLS: Left to right, ROWS: Top to bottom *
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 } #define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 }
#define ROWS (int []){ D0, D5, B5, B6, C6 } #define ROWS (int []){ D0, D5, B5, B6, C6 }
/* COL2ROW or ROW2COL */ /* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW #define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */ /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST //#define MATRIX_HAS_GHOST
/* number of backlight levels */ /* number of backlight levels */
/* NOTE: this is the max value of 0..BACKLIGHT_LEVELS so really 16 levels. */
#define BACKLIGHT_LEVELS 3 #define BACKLIGHT_LEVELS 3
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE #define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */ /* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE #define LOCKING_RESYNC_ENABLE
/* key combination for command */ /*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
#define IS_COMMAND() ( \ #define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
) )
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
#define MAGIC_KEY_BOOTLOADER B
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/* /*
* Feature disable options * Feature disable options

@ -1,79 +1,234 @@
#include "atomic.h" #include "atomic.h"
// Fillers to make layering more clear
#define _______ KC_TRNS
#define ___T___ KC_TRNS
#define XXXXXXX KC_NO
// Layer shorthand
#define _QW 0
#define _CM 1
#define _DV 2
#define _LW 3
#define _RS 4
#define _FN 5
/* ROW 1 OPTIONS
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* '--------------------------------------------------------------------------------------------------------------------------------------'
* .- 2u ------------.
* | KEY . XXXXXX |
* '-----------------'
*/
/* ROW 2 OPTIONS
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* '--------------------------------------------------------------------------------------------------------------------------------------'
* .- 2u ------------. .- 2u ------------.
* | KEY . XXXXXX | | KEY . XXXXXX |
* '-----------------' '-----------------'
*/
/* ROW 3 OPTIONS
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* '--------------------------------------------------------------------------------------------------------------------------------------'
* .- 2u ------------. .- 2u ------------.
* | KEY . XXXXXX | | X |
* '-----------------' '-----------------'
* .- 2u ------------.
* | X |
* '-----------------'
*/
/* ROW 4 OPTIONS
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* '--------------------------------------------------------------------------------------------------------------------------------------'
* .- 2u ------------.
* | KEY . XXXXXX |
* '-----------------'
* .- 2u ------------. .- 2u ------------.
* | KEY . XXXXXX | | KEY . XXXXXX |
* '-----------------' '-----------------'
* .- 2u ------------.
* | KEY . XXXXXX |
* '-----------------'
*/
/* ROW 5 OPTIONS
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* '--------------------------------------------------------------------------------------------------------------------------------------'
* .- 1.25u --+ 1.25u ------- 1.25u +--- 1.25u --- 2u -------------- 1.25u ---- 1.25u ------ 1.25u +---- 1.25u .
* | X | X | X | X | X | X | X | X | X |
* '-----------------------------------------------------------------------------------------------------------'
* .- 2u ------------.
* | X |
* '-----------------'
* .--------------------- 6.25u ----------------------------.
* | X |
* '--------------------------------------------------------'
* .----------------------- 6.25u ---------------------------- 1.25u ---- 1.25u ---- 1.25u ------ 1.25u +-- 1.25u --.
* | X | X | X | X | X | X |
* '----------------------------------------------------------------------------------------------------------------'
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = { /* Qwerty */
{ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL }, /* QWERTY - MIT ENHANCED / GRID COMPATIBLE
// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
// ┌─ 2u ────────────┐ * | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL |
// │ X │ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
// └─────────────────┘ * | ESC | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | BRITE | LCTRL | LALT | LGUI | RAISE | XXXXXX . SPACE | LOWER | RGUI | RALT | RCTRL | FN | LEFT | DOWN | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_QW] = { /* QWERTY */
{ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
{ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐
// │ X │ │ X │
// └─────────────────┘ └─────────────────┘
{ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP }, { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ { M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_RS), KC_SPC, KC_SPC, MO(_LW), KC_RGUI, KC_RALT, KC_RCTL, MO(_FN), KC_LEFT, KC_DOWN, KC_RGHT },
// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ },
// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐
// │ X │ │ X │ /* COLEMAK - MIT ENHANCED / GRID COMPATIBLE
// └─────────────────┘ └─────────────────┘ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
// ┌─ 2u ────────────┐ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
// │ X │ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
// └─────────────────┘ * | TAB | Q | W | F | P | G | J | L | U | Y | ; | [ | ] | \ | DEL |
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN }, * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ * | ESC | A | R | S | T | D | H | N | E | I | O | ' | XXXXXX . ENTER | PG UP |
// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ * | LSHIFT | Z | X | C | V | B | K | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
// ┌─ 2u ────────────┐ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
// │ X │ * | BRITE | LCTRL | LALT | LGUI | RAISE | XXXXXX . SPACE | LOWER | RGUI | RALT | RCTRL | FN | LEFT | DOWN | RIGHT |
// └─────────────────┘ * '--------------------------------------------------------------------------------------------------------------------------------------'
// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐ */
// │ X │ │ X │
// └─────────────────┘ └─────────────────┘ [_CM] = { /* COLEMAK */
// ┌─ 2u ────────────┐ { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
// │ X │ { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
// └─────────────────┘ { KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
{ 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 }, { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ { M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_RS), KC_SPC, KC_SPC, MO(_LW), KC_RGUI, KC_RALT, KC_RCTL, MO(_FN), KC_LEFT, KC_DOWN, KC_RGHT },
// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ },
// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐ /* DVORAK - MIT ENHANCED / GRID COMPATIBLE
// │ X │ X │ X │ X │ X │ X │ X │ X │ X │ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
// ┌─ 2u ────────────┐ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
// │ X │ * | TAB | ' | , | . | P | Y | F | G | C | R | L | [ | ] | \ | DEL |
// └─────────────────┘ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
// ┌───────────────────── 6.25u ────────────────────────────┐ * | ESC | A | O | E | U | I | D | H | T | N | S | / | XXXXXX . ENTER | PG UP |
// │ X │ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
// └────────────────────────────────────────────────────────┘ * | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | XXXXXX . RSHIFT | UP | PG DN |
// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
// │ X │ X │ X │ X │ X │ X │ * | BRITE | LCTRL | LALT | LGUI | RAISE | XXXXXX . SPACE | LOWER | RGUI | RALT | RCTRL | FN | LEFT | DOWN | RIGHT |
// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘ * '--------------------------------------------------------------------------------------------------------------------------------------'
} */
[_DV] = { /* DVORAK */
{ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
{ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
{ KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, KC_ENT, KC_ENT, KC_PGUP },
{ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
{ M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_RS), KC_SPC, KC_SPC, MO(_LW), KC_RGUI, KC_RALT, KC_RCTL, MO(_FN), KC_LEFT, KC_DOWN, KC_RGHT },
},
/* LOWERED
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | | INS |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
* | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | XXXXXX . | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | XXXXXX . | | |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | | | | | | XXXXXX . | | | | | | | | |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_LW] = { /* LOWERED */
{ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
{ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______, _______, KC_INS },
{ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, ___T___, ___T___, _______ },
{ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
},
/* RAISED
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | | | INS |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
* | | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | XXXXXX . | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | XXXXXX . | | |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | | | | | | XXXXXX . | | | | | | | | |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_RS] = { /* RAISED */
{ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
{ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, _______, KC_INS },
{ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, ___T___, ___T___, _______ },
{ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
},
/* FUNCTION
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | NUM LK | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | SCR LK | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 | PAUSE | PR SCR |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
* | CAP LK | MS BT5 | MS BT4 | MS BT3 | MS BT2 | SLOW M | FAST M | NEXT | VOL+ | VOL- | PLAY | | XXXXXX . | WHEEL+ |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | | | QWERTY | COLEMK | DVORAK | | | | | | | XXXXXX . | MOUS U | WHEEL- |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | | | | | | XXXXXX . MS BT1 | | | | | | MOUS L | MOUS D | MOUS R |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_FN] = { /* FUNCTION */
{ KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
{ KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR },
{ KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U },
{ _______, _______, DF(_QW), DF(_CM), DF(_DV), _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D },
{ _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R },
},
}; };
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_MOMENTARY(2), // to RAISE
[2] = ACTION_LAYER_MOMENTARY(3), // to LOWER
[3] = ACTION_DEFAULT_LAYER_SET(0),
[4] = ACTION_DEFAULT_LAYER_SET(1),
}; };
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{ {
// MACRODOWN only works in this function // MACRODOWN only works in this function
switch(id) { switch(id) {
case 0: case 0:
return MACRODOWN(TYPE(KC_T), END); if (record->event.pressed) {
break; register_code(KC_RSFT);
} #ifdef BACKLIGHT_ENABLE
backlight_step();
#endif
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE; return MACRO_NONE;
}; };

@ -0,0 +1,161 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER Ortholinear Keyboards
#define PRODUCT The Atomic Keyboard
#define DESCRIPTION A compact ortholinear keyboard
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 }
#define ROWS (int []){ D0, D5, B5, B6, B3 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
#define BACKLIGHT_LEVELS 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
// Enable Keyboard Locking via magic key
#define KEYBOARD_LOCK_ENABLE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
#define MAGIC_KEY_BOOTLOADER B
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,517 @@
#include "atomic.h"
#include "action_layer.h"
#include "eeconfig.h"
#include "led.h"
#ifdef AUDIO_ENABLE
#include "audio.h"
#include "song_list.h"
#endif
#define LAYER_QWERTY 0
#define LAYER_COLEMAK 1
#define LAYER_DVORAK 2
#define LAYER_LOWER 3
#define LAYER_RAISE 4
#define LAYER_FUNCTION 5
#define LAYER_MOUSE 6
#define LAYER_MUSIC 7
#define LAYER_ADJUST 8
#define MACRO_QWERTY 0
#define MACRO_COLEMAK 1
#define MACRO_DVORAK 2
#define MACRO_LOWER 3
#define MACRO_RAISE 4
#define MACRO_FUNCTION 5
#define MACRO_MOUSE 6
#define MACRO_TIMBRE_1 7
#define MACRO_TIMBRE_2 8
#define MACRO_TIMBRE_3 9
#define MACRO_TIMBRE_4 10
#define MACRO_TEMPO_U 11
#define MACRO_TEMPO_D 12
#define MACRO_TONE_DEFAULT 13
#define MACRO_MUSIC_ON 14
#define MACRO_MUSIC_OFF 15
#define MACRO_AUDIO_ON 16
#define MACRO_AUDIO_OFF 17
#define MACRO_INC_VOICE 18
#define MACRO_DEC_VOICE 19
#define M_QWRTY M(MACRO_QWERTY)
#define M_COLMK M(MACRO_COLEMAK)
#define M_DVORK M(MACRO_DVORAK)
#define M_LOWER M(MACRO_LOWER)
#define M_RAISE M(MACRO_RAISE)
#define M_FUNCT M(MACRO_FUNCTION)
#define M_MOUSE M(MACRO_MOUSE)
#define TIMBR_1 M(MACRO_TIMBRE_1)
#define TIMBR_2 M(MACRO_TIMBRE_2)
#define TIMBR_3 M(MACRO_TIMBRE_3)
#define TIMBR_4 M(MACRO_TIMBRE_4)
#define TMPO_UP M(MACRO_TEMPO_U)
#define TMPO_DN M(MACRO_TEMPO_D)
#define TMPO_DF M(MACRO_TONE_DEFAULT)
#define MUS_ON M(MACRO_MUSIC_ON)
#define MUS_OFF M(MACRO_MUSIC_OFF)
#define AUD_OFF M(MACRO_AUDIO_OFF)
#define AUD_ON M(MACRO_AUDIO_ON)
#define VC_UP M(MACRO_INC_VOICE)
#define VC_DOWN M(MACRO_DEC_VOICE)
#define SC_UNDO LCTL(KC_Z)
#define SC_REDO LCTL(KC_Y)
#define SC_CUT LCTL(KC_X)
#define SC_COPY LCTL(KC_C)
#define SC_PSTE LCTL(KC_V)
#define SC_SELA LCTL(KC_A)
#define SC_SAVE LCTL(KC_S)
#define SC_OPEN LCTL(KC_O)
#define SC_ACLS LALT(KC_F4)
#define SC_CCLS LCTL(KC_F4)
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define ________________ _______, _______
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
* | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | XXXXXX . SPACE | LOWER | RALT | RWIN | MENU | RCTRL | LEFT | DOWN | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[LAYER_QWERTY] = { /* QWERTY */
{ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
{ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
{ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
},
/* COLEMAK
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | TAB | Q | W | F | P | G | J | L | U | Y | ; | [ | ] | \ | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
* | BACKSP | A | R | S | T | D | H | N | E | I | O | ' | XXXXXX . ENTER | PG UP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | LSHIFT | Z | X | C | V | B | K | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | XXXXXX . SPACE | LOWER | RALT | RWIN | MENU | RCTRL | LEFT | DOWN | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[LAYER_COLEMAK] = { /* COLEMAK */
{ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
{ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
{ KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
},
/* DVORAK
* .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | [ | ] | XXXXXX . BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | TAB | ' | , | . | P | Y | F | G | C | R | L | / | = | \ | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
* | CAPS | A | O | E | U | I | D | H | T | N | S | - | XXXXXX . ENTER | PG UP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
* | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | XXXXXX . RSHIFT | UP | PG DN |
* |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | XXXXXX . SPACE | LOWER | RALT | RWIN | MENU | RCTRL | LEFT | DOWN | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[LAYER_DVORAK] = { /* DVORAK */
{ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_BSPC },
{ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL },
{ KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_ENT, KC_PGUP },
{ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
},
[LAYER_LOWER] = { /* LOWERED */
{ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ },
{ _______, _______, _______, _______, SC_CCLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME },
{ _______, SC_REDO, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END },
{ _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______ },
},
[LAYER_RAISE] = { /* RAISED */
{ KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ },
{ _______, _______, _______, _______, SC_ACLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS },
{ _______, SC_SELA, SC_SAVE, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME },
{ _______, SC_UNDO, SC_CUT, SC_COPY, SC_PSTE, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END },
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ },
},
[LAYER_FUNCTION] = { /* FUNCTION */
{ KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ },
{ KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, KC_PAUS },
{ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_PSCR },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_VOLU, KC_MUTE },
{ _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT },
},
#ifdef MOUSEKEY_ENABLE
[LAYER_MOUSE] = { /* MOUSE */
{ _______, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, KC_WH_U },
{ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_MS_U, KC_WH_D },
{ _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R },
},
#endif
[LAYER_MUSIC] = { /* MUSIC */
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_RAISE, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
},
[LAYER_ADJUST] = { /* ADJUST */
{ _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, MUS_ON, MUS_OFF, AUD_ON, AUD_OFF, ________________ },
{ _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______ },
{ _______, _______, _______, _______, _______, RESET, _______, M_MOUSE, _______, _______, _______, ________________, VC_UP, _______ },
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, VC_DOWN, _______ },
},
/*
[LAYER_EMPTY] = {
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, _______ },
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ },
},
*/
};
#ifdef AUDIO_ENABLE
float tone_my_startup[][2] = SONG(ODE_TO_JOY);
float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE);
float tone_music_on[][2] = SONG(DOE_A_DEER);
float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
float tone_caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
float tone_numlk_on[][2] = SONG(NUM_LOCK_ON_SOUND);
float tone_numlk_off[][2] = SONG(NUM_LOCK_OFF_SOUND);
float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND);
float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
#endif /* AUDIO_ENABLE */
void persistant_default_layer_set(uint16_t default_layer)
{
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id)
{
case MACRO_QWERTY:
if (record->event.pressed)
{
persistant_default_layer_set(1UL<<LAYER_QWERTY);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
case MACRO_COLEMAK:
if (record->event.pressed)
{
persistant_default_layer_set(1UL<<LAYER_COLEMAK);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
case MACRO_DVORAK:
if (record->event.pressed)
{
persistant_default_layer_set(1UL<<LAYER_DVORAK);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
case MACRO_LOWER:
if (record->event.pressed)
{
layer_on(LAYER_LOWER);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
else
{
layer_off(LAYER_LOWER);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
break;
case MACRO_RAISE:
if (record->event.pressed)
{
layer_on(LAYER_RAISE);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
else
{
layer_off(LAYER_RAISE);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
break;
case MACRO_FUNCTION:
if (record->event.pressed)
{
layer_on(LAYER_FUNCTION);
}
else
{
layer_off(LAYER_FUNCTION);
}
break;
#ifdef MOUSEKEY_ENABLE
case MACRO_MOUSE:
if (record->event.pressed)
{
layer_invert(LAYER_MOUSE);
}
break;
#endif /* MOUSEKEY_ENABLE */
#ifdef AUDIO_ENABLE
case MACRO_TIMBRE_1:
if (record->event.pressed) set_timbre(TIMBRE_12);
break;
case MACRO_TIMBRE_2:
if (record->event.pressed) set_timbre(TIMBRE_25);
break;
case MACRO_TIMBRE_3:
if (record->event.pressed) set_timbre(TIMBRE_50);
break;
case MACRO_TIMBRE_4:
if (record->event.pressed) set_timbre(TIMBRE_75);
break;
case MACRO_TEMPO_U:
if (record->event.pressed) increase_tempo(10);
break;
case MACRO_TEMPO_D:
if (record->event.pressed) decrease_tempo(10);
break;
case MACRO_TONE_DEFAULT:
if (record->event.pressed)
{
set_timbre(TIMBRE_DEFAULT);
set_tempo(TEMPO_DEFAULT);
}
break;
case MACRO_AUDIO_OFF:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_off();
#endif
}
break;
case MACRO_AUDIO_ON:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_on();
PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
#endif
}
break;
case MACRO_MUSIC_ON:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);
layer_on(LAYER_MUSIC);
#endif
}
break;
case MACRO_MUSIC_OFF:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
layer_off(LAYER_MUSIC);
stop_all_notes();
#endif
}
break;
case MACRO_INC_VOICE:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
voice_iterate();
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
#endif
}
break;
case MACRO_DEC_VOICE:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
voice_deiterate();
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
#endif
}
break;
#endif /* AUDIO_ENABLE */
default:
break;
}
return MACRO_NONE;
};
#ifdef AUDIO_ENABLE
void process_action_user(keyrecord_t *record)
{
uint8_t starting_note = 0x0C;
int offset = 7;
if (IS_LAYER_ON(LAYER_MUSIC))
{
if (record->event.pressed)
{
play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
}
else
{
stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
}
}
void matrix_init_user(void)
{
set_voice(default_voice);
play_startup_tone();
println("Matrix Init");
}
void led_set_user(uint8_t usb_led)
{
static uint8_t old_usb_led = 0;
_delay_ms(10); // gets rid of tick
if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
{
// If CAPS LK LED is turning on...
PLAY_NOTE_ARRAY(tone_caps_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
{
// If CAPS LK LED is turning off...
PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
}
else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
{
// If NUM LK LED is turning on...
PLAY_NOTE_ARRAY(tone_numlk_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
{
// If NUM LED is turning off...
PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
}
else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
{
// If SCROLL LK LED is turning on...
PLAY_NOTE_ARRAY(tone_scroll_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
{
// If SCROLL LED is turning off...
PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
}
old_usb_led = usb_led;
}
void play_startup_tone()
{
_delay_ms(10); // gets rid of tick
PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
}
void play_goodbye_tone()
{
PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
_delay_ms(1000);
}
#endif /* AUDIO_ENABLE */

@ -0,0 +1,17 @@
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = yes # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
CONFIG_H = keymaps/$(KEYMAP)/config.h

@ -0,0 +1,136 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = clueboard1
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = clueboard1.c \
led.c
ifdef KEYMAP
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
else
SRC := keymaps/keymap_default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
# MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
# RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,23 @@
#include "clueboard1.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// leave these blank
}
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave these blank
}
void matrix_init_kb(void) {
#ifdef RGBLIGHT_ENABLE
rgblight_init();
#endif
matrix_init_user();
}
void matrix_scan_kb(void) {
matrix_scan_user();
}

@ -0,0 +1,52 @@
#ifndef CLUEBOARD1_H
#define CLUEBOARD1_H
#include "matrix.h"
#include "keymap_common.h"
#include <stddef.h>
/* Clueboard matrix layout
* ,-----------------------------------------------------------. ,---.
* | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| | 0F|
* |-----------------------------------------------------------| |---|
* | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| 1D| | 1F|
* |-----------------------------------------------------------| `---'
* | 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 2A| 2B| 2C| 2D|
* |------------------------------------------------------------.
* | 30| 31| 32| 33| 34| 35| 36| 37| 38| 39| 3A| 3B| 3C| 3D|3E|
* |------------------------------------------------------------------.
* | 40| 41| 42| 43| 45| 46| 49| 4A| 4B| 4C| 4D| 4E| 4F|
* `------------------------------------------------------------------'
* ,-----------------------------------------------------------. ,---.
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
* |-----------------------------------------------------------| |---|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
* |-----------------------------------------------------------| `---'
* |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
* |--------------------------------------------------------------.
* |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
* |------------------------------------------------------------------.
* |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
* `------------------------------------------------------------------'
*/
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1F, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E, \
k40, k41, k42, k43, k45, k46, k49, k4A, k4B, k4C, k4D, k4E, k4F \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO, k1F }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E }, \
{ k40, k41, k42, k43, KC_NO, k45, k46, KC_NO, KC_NO, k49, k4A, k4B, k4C, k4D, k4E, k4F } \
}
void matrix_init_user(void);
void matrix_scan_user(void);
#endif

@ -0,0 +1,96 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC1ED
#define PRODUCT_ID 0x2301
#define DEVICE_VER 0x0003
#define MANUFACTURER Clueboard
#define PRODUCT Clueboard
#define DESCRIPTION QMK keyboard firmware for Clueboard
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 16
// COLS: Left to right, ROWS: Top to bottom
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* pin: B3 F1 F4 F5 F6 C7 C6 B6 B5 B4 D7 D6 D4 F7 B0 B1
*/
#define COLS (int []){ B3, F1, F4, F5, F6, C7, C6, B6, B5, B4, D7, D6, D4, F7, B0, B1 }
/* Row pin configuration
* row: 0 1 2 3 4
* pin: D1 D0 D2 D5 D3
*/
#define ROWS (int []){ D1, D0, D2, D5, D3 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* Underlight configuration
*/
#define ws2812_PORTREG PORTB
#define ws2812_DDRREG DDRB
#define ws2812_pin 2
#define RGBLED_NUM 14 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,184 @@
#include "clueboard1.h"
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#endif
// Used for SHIFT_ESC
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,--------------------------------------------------------------------------. ,----.
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
* |--------------------------------------------------------------------------| |----|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
* |--------------------------------------------------------------------------| `----'
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
* |-----------------------------------------------------------------------------.
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
* |------------------------------------------------------------------------|----|----.
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
* `----------------------------------------------------------------------------------'
*/
[_BL] = KEYMAP(
F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,--------------------------------------------------------------------------. ,----.
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
* |--------------------------------------------------------------------------| |----|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | |PGUP|
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL|HOME|PGDN| END|
* `----------------------------------------------------------------------------------'
*/
[_FL] = KEYMAP(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END),
/* Keymap _RS: Reset layer
* ,--------------------------------------------------------------------------. ,----.
* | | | | | | | | | | | | | | | | | |
* |--------------------------------------------------------------------------| |----|
* | | | | |RESET| | | | | | | | | | | |
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL| | | |
* `----------------------------------------------------------------------------------'
*/
[_RS] = KEYMAP(
#ifdef RGBLIGHT_ENABLE
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(5), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(2), F(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(4), F(6), F(3)),
#else
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS),
#endif
};
enum function_id {
SHIFT_ESC,
#ifdef RGBLIGHT_ENABLE
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL
#endif
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(SHIFT_ESC),
#ifdef RGBLIGHT_ENABLE
[1] = ACTION_FUNCTION(RGBLED_TOGGLE),
[2] = ACTION_FUNCTION(RGBLED_STEP_MODE),
[3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
#endif
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
static uint8_t shift_esc_shift_mask;
switch (id) {
case SHIFT_ESC:
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
if (record->event.pressed) {
if (shift_esc_shift_mask) {
add_key(KC_GRV);
send_keyboard_report();
} else {
add_key(KC_ESC);
send_keyboard_report();
}
} else {
if (shift_esc_shift_mask) {
del_key(KC_GRV);
send_keyboard_report();
} else {
del_key(KC_ESC);
send_keyboard_report();
}
}
break;
//led operations
#ifdef RGBLIGHT_ENABLE
case RGBLED_TOGGLE:
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
#endif
}
}

@ -0,0 +1,32 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <avr/io.h>
#include "stdint.h"
#include "led.h"
void led_set_kb(uint8_t usb_led) {
DDRF |= (1<<0);
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// Turn capslock on
PORTF |= (1<<0);
} else {
// Turn capslock off
PORTF &= ~(1<<0);
}
}

@ -0,0 +1,140 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = clueboard2
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = clueboard2.c led.c
ifdef KEYMAP
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
else
SRC := keymaps/keymap_default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
# MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
#ifdef BACKLIGHT_ENABLE
SRC := backlight.c $(SRC)
#endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,41 @@
#include <avr/io.h>
#include "backlight.h"
#include "print.h"
/* Clueboard 2.0 LED locations:
*
* Capslock: B4, pull high to turn on
* LCtrl: Shared with Capslock, DO NOT INSTALL LED'S IN BOTH
* Page Up: B7, pull high to turn on
* Escape: D6, pull high to turn on
* Arrows: D4, pull high to turn on
*/
void init_backlight_pin(void) {
print("init_backlight_pin()\n");
// Set our LED pins as output
DDRD |= (1<<6); // Esc
DDRB |= (1<<7); // Page Up
DDRD |= (1<<4); // Arrows
// Set our LED pins low
PORTD &= ~(1<<6); // Esc
PORTB &= ~(1<<7); // Page Up
PORTD &= ~(1<<4); // Arrows
}
void backlight_set(uint8_t level) {
if ( level == 0 ) {
// Turn off light
PORTD |= (1<<6); // Esc
PORTB |= (1<<7); // Page Up
PORTD |= (1<<4); // Arrows
} else {
// Turn on light
PORTD &= ~(1<<6); // Esc
PORTB &= ~(1<<7); // Page Up
PORTD &= ~(1<<4); // Arrows
}
}

@ -0,0 +1,44 @@
#include "clueboard2.h"
#ifdef BACKLIGHT_ENABLE
#include "backlight.h"
#endif
__attribute__ ((weak))
void matrix_init_user(void) {
// leave these blank
};
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave these blank
};
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
if (matrix_init_user) {
(*matrix_init_user)();
}
led_init_ports();
#ifdef BACKLIGHT_ENABLE
init_backlight_pin();
#endif
#ifdef RGBLIGHT_ENABLE
rgblight_init();
#endif
// JTAG disable for PORT F. write JTD bit twice within four cycles.
MCUCR |= (1<<JTD);
MCUCR |= (1<<JTD);
};
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
if (matrix_scan_user) {
(*matrix_scan_user)();
}
};

@ -0,0 +1,57 @@
#ifndef CLUEBOARD2_H
#define CLUEBOARD2_H
#include "matrix.h"
#include "keymap_common.h"
#include <stddef.h>
/* Clueboard matrix layout
* ,-----------------------------------------------------------. ,---.
* | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 55| 56| | 57|
* |-----------------------------------------------------------| |---|
* | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67|
* |-----------------------------------------------------------| `---'
* | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74| 75|
* |------------------------------------------------------------.
* | 30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84| 85|86|
* |------------------------------------------------------------------.
* | 40| 41| 42| 43| 45| 46| 90| 91| 92| 93| 94| 95| 96|
* `------------------------------------------------------------------'
* ,-----------------------------------------------------------. ,---.
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
* |-----------------------------------------------------------| |---|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
* |-----------------------------------------------------------| `---'
* |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
* |--------------------------------------------------------------.
* |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
* |------------------------------------------------------------------.
* |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
* `------------------------------------------------------------------'
*/
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k56, k57, \
k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \
k40, k41, k42, k43, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07 }, \
{ k10, k11, k12, k13, k14, k15, k16, k17 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37 }, \
{ k40, k41, k42, k43, KC_NO, k45, k46, KC_NO }, \
{ k50, k51, k52, k53, k54, k55, k56, k57 }, \
{ k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
{ k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
{ k80, k81, k82, k83, k84, k85, k86, KC_NO }, \
{ k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
}
void matrix_init_user(void);
void matrix_scan_user(void);
#endif

@ -0,0 +1,100 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC1ED
#define PRODUCT_ID 0x2320
#define DEVICE_VER 0x0001
#define MANUFACTURER Clueboard
#define PRODUCT Clueboard with RGB Underlighting
#define DESCRIPTION QMK keyboard firmware for Clueboard
/* key matrix size */
#define MATRIX_ROWS 10
#define MATRIX_COLS 8
// COLS: Left to right, ROWS: Top to bottom
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7
* pin: F0 F1 F4 F5 F6 F7 E6 B1
*/
#define COLS (int []){ F0, F1, F4, F5, F6, F7, E6, B1 }
/* Row pin configuration
* row: 0 1 2 3 4 5 6 7 8 9
* pin: B2 C7 C6 B6 B5 B0 B3 D5 D3 D2
*/
#define ROWS (int []){ B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* Backlight configuration
*/
#define BACKLIGHT_LEVELS 1
/* Underlight configuration
*/
#define ws2812_PORTREG PORTD
#define ws2812_DDRREG DDRD
#define ws2812_pin 7
#define RGBLED_NUM 14 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,183 @@
#include "clueboard2.h"
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#endif
// Used for SHIFT_ESC
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,--------------------------------------------------------------------------. ,----.
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
* |--------------------------------------------------------------------------| |----|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
* |--------------------------------------------------------------------------| `----'
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
* |-----------------------------------------------------------------------------.
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
* |------------------------------------------------------------------------|----|----.
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
* `----------------------------------------------------------------------------------'
*/
[_BL] = KEYMAP(
F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,--------------------------------------------------------------------------. ,----.
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
* |--------------------------------------------------------------------------| |----|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | |PGUP|
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL|HOME|PGDN| END|
* `----------------------------------------------------------------------------------'
*/
[_FL] = KEYMAP(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END),
/* Keymap _RS: Reset layer
* ,--------------------------------------------------------------------------. ,----.
* | | | | | | | | | | | | | | | | | |
* |--------------------------------------------------------------------------| |----|
* | | | | |RESET| | | | | | | | | | | |
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL| | | |
* `----------------------------------------------------------------------------------'
*/
[_RS] = KEYMAP(
#ifdef RGBLIGHT_ENABLE
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(5), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(2), F(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(4), F(6), F(3)),
#else
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS),
#endif
};
enum function_id {
SHIFT_ESC,
#ifdef RGBLIGHT_ENABLE
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL
#endif
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(SHIFT_ESC),
#ifdef RGBLIGHT_ENABLE
[1] = ACTION_FUNCTION(RGBLED_TOGGLE),
[2] = ACTION_FUNCTION(RGBLED_STEP_MODE),
[3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
#endif
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
static uint8_t shift_esc_shift_mask;
switch (id) {
case SHIFT_ESC:
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
if (record->event.pressed) {
if (shift_esc_shift_mask) {
add_key(KC_GRV);
send_keyboard_report();
} else {
add_key(KC_ESC);
send_keyboard_report();
}
} else {
if (shift_esc_shift_mask) {
del_key(KC_GRV);
send_keyboard_report();
} else {
del_key(KC_ESC);
send_keyboard_report();
}
}
break;
//led operations
#ifdef RGBLIGHT_ENABLE
case RGBLED_TOGGLE:
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
#endif
}
}

@ -0,0 +1,147 @@
#include "clueboard2.h"
#ifdef ENABLE_RGBLIGHT
#include "rgblight.h"
#endif
// Used for SHIFT_ESC
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,--------------------------------------------------------------------------. ,----.
* | Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| ~| BS| |PgUp|
* |--------------------------------------------------------------------------| |----|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PgDn|
* |--------------------------------------------------------------------------| `----'
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
* |-----------------------------------------------------------------------------.
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| Up|
* |------------------------------------------------------------------------|----|----.
* | Ctrl| Alt| Gui| MHen| Space| Space| Hen| Gui| Alt| Ctrl|Left|Down|Rght|
* `----------------------------------------------------------------------------------'
*/
[_BL] = KEYMAP(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \
MO(_FL), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), KC_UP, \
KC_LCTL, KC_LALT, KC_LGUI,KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,--------------------------------------------------------------------------. ,----.
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
* |--------------------------------------------------------------------------| |----|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | |PGUP|
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL|HOME|PGDN| END|
* `----------------------------------------------------------------------------------'
*/
[_FL] = KEYMAP(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_PGUP, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END),
/* Keymap _RS: Reset/Underlight layer
* ,--------------------------------------------------------------------------. ,----.
* | | | | | | | | | | | | | | | | | |
* |--------------------------------------------------------------------------| |----|
* | | | | |RESET| | | | | | | | | | | |
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL| | | |
* `----------------------------------------------------------------------------------'
*/
[_RS] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(0), F(6), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(7), \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(4), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(1), F(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(3), F(5), F(2)),
};
enum function_id {
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL,
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(RGBLED_TOGGLE),
[1] = ACTION_FUNCTION(RGBLED_STEP_MODE),
[2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
switch (id) {
case RGBLED_TOGGLE:
//led operations
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
}
}

@ -0,0 +1,108 @@
#include "clueboard2.h"
// Used for SHIFT_ESC
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,--------------------------------------------------------------------------. ,----.
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
* |--------------------------------------------------------------------------| |----|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
* |--------------------------------------------------------------------------| `----'
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
* |-----------------------------------------------------------------------------.
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
* |------------------------------------------------------------------------|----|----.
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
* `----------------------------------------------------------------------------------'
*/
[_BL] = KEYMAP(
F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \
KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \
KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
KC_LCTL,KC_LALT,KC_LGUI,MO(_FL), KC_SPC, KC_SPC, MO(_FL), KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,--------------------------------------------------------------------------. ,----.
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
* |--------------------------------------------------------------------------| |----|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | |PGUP|
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL|HOME|PGDN| END|
* `----------------------------------------------------------------------------------'
*/
[_FL] = KEYMAP(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,KC_DEL, BL_STEP, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_PGUP, \
KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL), KC_TRNS,KC_TRNS, MO(_FL),KC_TRNS,KC_TRNS,MO(_FL),KC_HOME,KC_PGDN,KC_END),
/* Keymap _RS: Reset layer
* ,--------------------------------------------------------------------------. ,----.
* | | | | | | | | | | | | | | | | | |
* |--------------------------------------------------------------------------| |----|
* | | | | |RESET| | | | | | | | | | | |
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL| | | |
* `----------------------------------------------------------------------------------'
*/
[_RS] = KEYMAP(
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL),KC_TRNS, KC_TRNS, KC_TRNS),
};
enum function_id {
SHIFT_ESC,
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(SHIFT_ESC),
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
static uint8_t shift_esc_shift_mask;
switch (id) {
case SHIFT_ESC:
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
if (record->event.pressed) {
if (shift_esc_shift_mask) {
add_key(KC_GRV);
send_keyboard_report();
} else {
add_key(KC_ESC);
send_keyboard_report();
}
} else {
if (shift_esc_shift_mask) {
del_key(KC_GRV);
send_keyboard_report();
} else {
del_key(KC_ESC);
send_keyboard_report();
}
}
break;
}
}

@ -0,0 +1,36 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <avr/io.h>
#include "stdint.h"
#include "led.h"
void led_init_ports() {
// * Set our LED pins as output
DDRB |= (1<<4);
}
void led_set_kb(uint8_t usb_led) {
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// Turn capslock on
PORTB |= (1<<4);
} else {
// Turn capslock off
PORTB &= ~(1<<4);
}
}

@ -0,0 +1,136 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = cluepad
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = cluepad.c backlight.c
ifdef KEYMAP
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
else
SRC := keymaps/keymap_default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
# MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable numpad's backlight functionality
RGBLIGHT_ENABLE = yes
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,54 @@
#include <avr/io.h>
#include "backlight.h"
#include "led.h"
#include "print.h"
int pwm_level;
void led_set_kb(uint8_t usb_led)
{
print("led_set\n");
}
void init_backlight_pin(void)
{
// Set C7 to output
DDRC |= (1<<7);
// Initialize the timer
TC4H = 0x03;
OCR4C = 0xFF;
TCCR4A = 0b10000010;
TCCR4B = 0b00000001;
}
void backlight_set(uint8_t level)
{
// Determine the PWM level
switch (level)
{
case 0:
// 33%
pwm_level = 0x54;
break;
case 1:
// 66%
pwm_level = 0xA8;
break;
case 2:
// 100%
pwm_level = 0xFF;
break;
case 3:
// 0%
pwm_level = 0x00;
break;
default:
xprintf("Unknown level: %d\n", level);
}
// Write the PWM level to the timer
TC4H = pwm_level >> 8;
OCR4A = 0xFF & pwm_level;
}

@ -0,0 +1,39 @@
#include "cluepad.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// leave these blank
};
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave these blank
};
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
if (matrix_init_user) {
(*matrix_init_user)();
}
#ifdef BACKLIGHT_ENABLE
init_backlight_pin();
#endif
#ifdef RGBLIGHT_ENABLE
rgblight_init();
#endif
// JTAG disable for PORT F. write JTD bit twice within four cycles.
MCUCR |= (1<<JTD);
MCUCR |= (1<<JTD);
};
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
if (matrix_scan_user) {
(*matrix_scan_user)();
}
};

@ -0,0 +1,41 @@
#ifndef CLUEPAD_H
#define CLUEPAD_H
#include "matrix.h"
#include "keymap_common.h"
#include <stddef.h>
/* Cluepad matrix layout
* .-------------------.
* |NLCK| /| *| -|
* |-------------------|
* | 7| 8| 9| |
* |--------------| |
* | 4| 5| 6| +|
* |-------------------|
* | 1| 2| 3| |
* |--------------| |
* | 0| .| Ent|
* '-------------------'
*/
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, \
k10, k11, k12, k13, \
k20, k21, k22, \
k30, k31, k32, k33, \
k40, k42 \
) { \
{ k00, k01, k02, k03, }, \
{ k10, k11, k12, k13, }, \
{ k20, k21, k22, KC_NO, }, \
{ k30, k31, k32, k33, }, \
{ k40, KC_NO, k42, KC_NO } \
}
void matrix_init_user(void);
void matrix_scan_user(void);
#endif

@ -0,0 +1,102 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC1ED
#define PRODUCT_ID 0x2312
#define DEVICE_VER 0x0001
#define MANUFACTURER Clueboard
#define PRODUCT Cluepad with RGB Underlighting
#define DESCRIPTION QMK keyboard firmware for Cluepad
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 4
// COLS: Left to right, ROWS: Top to bottom
/* Column pin configuration
* col: 0 1 2 3
* pin: F4 E6 B1 D2
*/
#define COLS (int []){ F4, E6, B1, D2 }
/* Row pin configuration
* row: 0 1 2 3 4
* pin:
*/
#define ROWS (int []){ B0, D3, D5, D4, D6 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Number of backlighting levels */
#define BACKLIGHT_LEVELS 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* Underlight configuration
*/
#define ws2812_PORTREG PORTF
#define ws2812_DDRREG DDRF
#define ws2812_pin 6
#define RGBLED_NUM 4 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* Debug forcibly enabled */
#define ALWAYS_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,122 @@
#include "cluepad.h"
#include "backlight.h"
#include "rgblight.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* .-------------------.
* |NL F| /| *| -|
* |-------------------|
* | 7| 8| 9| |
* |--------------| |
* | 4| 5| 6| +|
* |-------------------|
* | 1| 2| 3| |
* |--------------| |
* | 0| .| Ent|
* '-------------------'
*/
[_BL] = KEYMAP(
LT(_FL, KC_NLCK), KC_PSLS, KC_PAST, KC_PMNS, \
KC_P7, KC_P8, KC_P9, KC_PPLS, \
KC_P4, KC_P5, KC_P6, \
KC_P1, KC_P2, KC_P3, KC_PENT, \
KC_P0, KC_PDOT),
/* Keymap _FL: Function Layer
* .-------------------.
* |NL F| | | Fn0|
* |-------------------|
* | | Fn4| | |
* |--------------| |
* | Fn3|BL_S| Fn2| Fn6|
* |-------------------|
* | | Fn5| | |
* |--------------| |
* | Fn1| | Fn7|
* '-------------------'
*/
[_FL] = KEYMAP(
LT(_FL, KC_NLCK), KC_TRNS, KC_TRNS, F(0), \
KC_TRNS, F(4), KC_TRNS, F(6), \
F(3), BL_STEP, F(2), \
KC_TRNS, F(5), KC_TRNS, F(7), \
F(1), KC_TRNS)
};
enum function_id {
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL,
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(RGBLED_TOGGLE),
[1] = ACTION_FUNCTION(RGBLED_STEP_MODE),
[2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
switch (id) {
case RGBLED_TOGGLE:
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
}
}

@ -7,6 +7,9 @@
#define SYMB 1 // symbols #define SYMB 1 // symbols
#define MDIA 2 // media keys #define MDIA 2 // media keys
#define LSFTO M(0) // Left shift, open parens when tapped
#define RSFTC M(1) // Right shift, close parens when tapped
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer /* Keymap 0: Basic layer
* *
@ -17,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | BkSp | A | S | D | F | G |------| |------| H | Alt/J| K | L |; / L2| LGui/' | * | BkSp | A | S | D | F | G |------| |------| H | Alt/J| K | L |; / L2| LGui/' |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | * |LShift/(|Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl|RShift/)|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
@ -36,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), LSFTO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT, LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
ALT_T(KC_APP), KC_LGUI, ALT_T(KC_APP), KC_LGUI,
KC_HOME, KC_HOME,
@ -45,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_RGHT, KC_6,KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_RGHT, KC_6,KC_7, KC_8, KC_9, KC_0, KC_MINS,
TG(SYMB), KC_Y,KC_U, KC_I, KC_O, KC_P, KC_BSLS, TG(SYMB), KC_Y,KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H,ALT_T(KC_J),KC_K, KC_L, LT(MDIA,KC_SCLN),GUI_T(KC_QUOT), KC_H,ALT_T(KC_J),KC_K, KC_L, LT(MDIA,KC_SCLN),GUI_T(KC_QUOT),
MEH_T(KC_NO),KC_N,KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, MEH_T(KC_NO),KC_N,KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), RSFTC,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_LALT, CTL_T(KC_ESC), KC_LALT, CTL_T(KC_ESC),
KC_PGUP, KC_PGUP,
@ -140,17 +143,37 @@ const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
}; };
static uint16_t key_timer;
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{ {
// MACRODOWN only works in this function
switch(id) { switch(id) {
case 0: case 0: {
if (record->event.pressed) { if (record->event.pressed) {
register_code(KC_RSFT); key_timer = timer_read(); // if the key is being pressed, we start the timer.
} else { register_code(KC_LSFT); // we're now holding down Shift.
unregister_code(KC_RSFT); } else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
if (timer_elapsed(key_timer) < 70) { // the threshhold we pick for counting something as a tap.
register_code(KC_9); // sending 9 while Shift is held down gives us an opening paren
unregister_code(KC_9); // now let's let go of that key
}
unregister_code(KC_LSFT); // let's release the Shift key now.
}
break;
}
case 1: {
if (record->event.pressed) {
key_timer = timer_read(); // Now we're doing the same thing, only for the right shift/close paren key
register_code(KC_RSFT);
} else {
if (timer_elapsed(key_timer) < 70) {
register_code(KC_0);
unregister_code(KC_0);
}
unregister_code(KC_RSFT);
}
break;
} }
break;
} }
return MACRO_NONE; return MACRO_NONE;
}; };
@ -183,3 +206,5 @@ void matrix_scan_user(void) {
} }
}; };

@ -2,29 +2,31 @@
#include "led.h" #include "led.h"
#include "debug.h" #include "debug.h"
#include "action_layer.h" #include "action_layer.h"
#include "action_util.h"
#define BASE 0 // default layer
#define LOCK 1 // layer lock keys #define BASE 0 // default layer
#define SYMB_MO 2 // symbols momentary layer #define LOCK 1 // shift-lock layer
#define SYMB_TG 3 // symbols lock layer #define SYMB_SH 2 // symbols shift layer
#define SYMB_XX 4 // symbols exit layer #define SYMB_LK 3 // symbols lock layer
#define MDIA_MO 5 // media momentary layer #define SYMB_UN 4 // symbols unlock layer
#define MDIA_TG 6 // media lock layer #define MDIA_SH 5 // media shift layer
#define MDIA_XX 7 // media exit layer #define MDIA_LK 6 // media lock layer
#define UNLOCK 8 // clear to base layer #define MDIA_UN 7 // media unlock layer
#define UNLOCK 8 // clear to base layer
/* /*
* Ordinary Ergodox EZ keyboard layout, v3 * The Ordinary Layout for the Ergodox EZ keyboard, v3.1
* modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com * modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com
* Details: http://nicholas.rinard.us/2016/03/ergodox-ez-layout.html * Details: readme.md
* https://github.com/nrrkeene/qmk_firmware/tree/master/keyboard/ergodox_ez/keymaps/ordinary
*/ */
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer /* Keymap 0: Base Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | LOCK Grv | 1 | 2 | 3 | 4 | 5 | ESC | | - | 6 | 7 | 8 | 9 | 0 | = LOCK | * | LOCK `~ | 1 | 2 | 3 | 4 | 5 | ESC | | - | 6 | 7 | 8 | 9 | 0 | = LOCK |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | Media Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ Media | * | Media Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ Media |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
@ -32,8 +34,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |-----------+------+------+------+------+------|Shift | | Tab |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------|Shift | | Tab |------+------+------+------+------+-----------|
* | LShift | Z | X | C | V | B | -Tab | | | N | M | , | . | / | RShift | * | LShift | Z | X | C | V | B | -Tab | | | N | M | , | . | / | RShift |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* |LCtrl | Meh |Hyper | LAlt | LGui | | RGui | RAlt | Hyper| Meh |RCtrl | * | LCtrl | Meh |Hyper | LAlt | LGui | | RGui | RAlt | Hyper| Meh | RCtrl |
* `----------------------------------' `----------------------------------' * `-----------------------------------' `-----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | Home | End | | Left | Right| * | Home | End | | Left | Right|
* ,------|------|------| |------+------+------. * ,------|------|------| |------+------+------.
@ -44,20 +46,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
[BASE] = KEYMAP( [BASE] = KEYMAP(
// left hand // left hand
LT(LOCK, KC_GRV),KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_ESC LT(LOCK, KC_GRV) ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_ESC
,LT(MDIA_MO, KC_TAB),KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_LBRC ,LT(MDIA_SH, KC_TAB),KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_LBRC
,MO(SYMB_MO) ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,MO(SYMB_SH) ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G
,KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,LSFT(KC_TAB) ,KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,LSFT(KC_TAB)
,KC_LCTL ,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI ,KC_LCTL ,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI
,KC_HOME,KC_END ,KC_HOME,KC_END
,KC_PGUP ,KC_PGUP
,KC_BSPC,KC_DEL ,KC_PGDN ,KC_BSPC,KC_DEL ,KC_PGDN
// right hand // right hand
,KC_MINS ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,LT(LOCK, KC_EQL) ,KC_MINS ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,LT(LOCK, KC_EQL)
,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,LT(MDIA_MO, KC_BSLS) ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,LT(MDIA_SH, KC_BSLS)
,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,LT(SYMB_MO, KC_QUOT) ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,LT(SYMB_SH, KC_QUOT)
,KC_TAB ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,KC_RSFT ,KC_TAB ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,KC_RSFT
,KC_RGUI,KC_RALT,ALL_T(KC_NO),MEH_T(KC_NO),KC_RCTL ,KC_RGUI,KC_RALT,ALL_T(KC_NO),MEH_T(KC_NO),KC_RCTL
@ -68,59 +70,59 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 1: Layer Lock Keys /* Keymap 1: Layer Lock Keys
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-------------------------------------------------------. ,-------------------------------------------------------.
* | | Esc | | | | | | | | | | | | | | * | | Esc | | | | | | | | | | | | Bspc | |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-------------+------+------+------+------+-------------| |------+------+------+------+------+------+-------------|
* | Media LOCK| | | | | | | | | | | | | | Media LOCK| * | Media LOCK | | | | | | | | | | | | | | Media LOCK |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-------------+------+------+------+------+------| | | |------+------+------+------+------+-------------|
* |Symbol LOCK| | | | | |------| |------| | | | | |Symbol LOCK| * | Symbol LOCK | | | | | |------| |------| | | | | | Symbol LOCK |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-------------+------+------+------+------+------| | | |------+------+------+------+------+-------------|
* | Caps LOCK| | | | | | | | | | | | | | Caps LOCK| * | Caps LOCK | | | | | | | | | | | | | | Caps LOCK |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' * `-------------+------+------+------+------+-------------' `-------------+------+------+------+------+-------------'
* | | | | | | | | | | | | * | | | | | | | | | | | |
* `----------------------------------' `----------------------------------' * `------------------------------------' `------------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | | | | | | * | | | | | |
* ,------|------|------| |------+------+------. * ,------|------|------| |------+------+------.
* | | | | | | | | * | | | | | | | |
* | | |------| |------| | | * | | |------| |------| | |
* | | | | | | | | * | | | | | | | |
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
[LOCK] = KEYMAP( [LOCK] = KEYMAP(
// left hand // left hand
KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_FN3 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN3 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_FN2 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN2 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS,KC_TRNS ,KC_TRNS ,KC_TRNS,KC_TRNS ,KC_TRNS
// right hand // right hand
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN3 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN3
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN2 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN2
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
), ),
/* Keymap 2: Symbol Momentary Layer /* Keymap 2: Symbol Shift Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | | * | LOCK | F1 | F2 | F3 | F4 | F5 | | | - | F6 | F7 | F8 | F9 | F10 | LOCK |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | Media | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | Media | * | Media | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | Media |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | Symbol | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | Symbol | * | Symbol | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | Symbol |
* |-----------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+-----------|
* | Shift | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | Shift | * | LShift | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | RShift |
* `-----------+------+------+------+------+-------------' `------------+------+------+------+------+------------' * `-----------+------+------+------+------+-------------' `------------+------+------+------+------+------------'
* | | | | | | | 0 | . | = | + | Entr | * | | | | | | | 0 | . | = | + | Entr |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
@ -132,22 +134,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | Down | | PgDn | | | * | | | Down | | PgDn | | |
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
[SYMB_MO] = KEYMAP( [SYMB_SH] = KEYMAP(
// left hand // left hand
KC_FN2 ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_TRNS KC_FN2 ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_TRNS
,MO(MDIA_MO) ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM) ,MO(MDIA_SH) ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
,MO(SYMB_MO) ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV ,MO(SYMB_SH) ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV
,KC_LSFT ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB ,KC_LSFT ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_LEFT ,KC_RGHT ,KC_LEFT ,KC_RGHT
,KC_UP ,KC_UP
,KC_SPC ,KC_ENT ,KC_DOWN ,KC_SPC ,KC_ENT ,KC_DOWN
// right hand // right hand
,KC_TRNS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_FN2 ,KC_MINS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_FN2
,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,MO(MDIA_MO) ,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,MO(MDIA_SH)
,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,MO(SYMB_MO) ,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,MO(SYMB_SH)
,LSFT(KC_TAB),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_RSFT ,LSFT(KC_TAB),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_RSFT
,KC_0 ,KC_DOT ,KC_EQL,KC_PLUS ,KC_ENT ,GUI_T(KC_0),ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
,KC_HOME ,KC_END ,KC_HOME ,KC_END
,KC_PGUP ,KC_PGUP
,KC_PGDN ,KC_BSPC ,KC_DEL ,KC_PGDN ,KC_BSPC ,KC_DEL
@ -156,13 +158,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 3: Symbol Lock Layer /* Keymap 3: Symbol Lock Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | Lock | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | Lock | * | LOCK | F1 | F2 | F3 | F4 | F5 | | | - | F6 | F7 | F8 | F9 | F10 | LOCK |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | Media | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | Media | * | Media | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | Media |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | | * | Symbol | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | Symbol |
* |-----------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+-----------|
* | Shift | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | Shift | * | LShift | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | RShift |
* `-----------+------+------+------+------+-------------' `------------+------+------+------+------+------------' * `-----------+------+------+------+------+-------------' `------------+------+------+------+------+------------'
* | | | | | | | 0 | . | = | + | Entr | * | | | | | | | 0 | . | = | + | Entr |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
@ -174,22 +176,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | Down | | PgDn | | | * | | | Down | | PgDn | | |
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
[SYMB_TG] = KEYMAP( // layer 3 : return key for symbol lock layer [SYMB_LK] = KEYMAP(
// left hand // left hand
MO(SYMB_XX) ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_TRNS MO(SYMB_UN) ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_TRNS
,MO(MDIA_MO) ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM) ,MO(MDIA_SH) ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
,MO(UNLOCK) ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV ,MO(UNLOCK) ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV
,KC_LSFT ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB ,KC_LSFT ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_LEFT ,KC_RGHT ,KC_LEFT ,KC_RGHT
,KC_UP ,KC_UP
,KC_SPC ,KC_ENT ,KC_DOWN ,KC_SPC ,KC_ENT ,KC_DOWN
// right hand // right hand
,KC_TRNS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,MO(SYMB_XX) ,KC_MINS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,MO(SYMB_UN)
,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,MO(MDIA_MO) ,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,MO(MDIA_SH)
,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,MO(UNLOCK) ,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,MO(UNLOCK)
,LSFT(KC_TAB),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_RSFT ,LSFT(KC_TAB),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_RSFT
,KC_0 ,KC_DOT ,KC_EQL,KC_PLUS ,KC_ENT ,GUI_T(KC_0),ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
,KC_HOME ,KC_END ,KC_HOME ,KC_END
,KC_PGUP ,KC_PGUP
,KC_PGDN ,KC_BSPC ,KC_DEL ,KC_PGDN ,KC_BSPC ,KC_DEL
@ -197,58 +199,58 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 4: Symbol Unlock Layer /* Keymap 4: Symbol Unlock Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,------------------------------------------------------. ,------------------------------------------------------.
* | | Esc | | | | | | | | | | | | | | * | | Esc | | | | | | | | | | | | Bspc | |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |------------+------+------+------+------+-------------| |------+------+------+------+------+------+------------|
* | Unlock | | | | | | | | | | | | | | Unlock | * | Media LOCK | | | | | | | | | | | | | | Media LOCK |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |------------+------+------+------+------+------| | | |------+------+------+------+------+------------|
* | | | | | | |------| |------| | | | | | | * | UNLOCK | | | | | |------| |------| | | | | | UNLOCK |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |------------+------+------+------+------+------| | | |------+------+------+------+------+------------|
* | Caps LOCK | | | | | | | | | | | | | | Caps LOCK | * | Caps LOCK | | | | | | | | | | | | | | Caps LOCK |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' * `------------+------+------+------+------+-------------' `-------------+------+------+------+------+------------'
* | | | | | | | | | | | | * | | | | | | | | | | | |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | | | | | | * | | | | | |
* ,------|------|------| |------+------+------. * ,------|------|------| |------+------+------.
* | | | | | | | | * | | | | | | | |
* | | |------| |------| | | * | | |------| |------| | |
* | | | | | | | | * | | | | | | | |
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
[SYMB_XX] = KEYMAP( [SYMB_UN] = KEYMAP(
// left hand // left hand
KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,TG(MDIA_TG) ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,TG(MDIA_LK) ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_FN1 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS,KC_TRNS ,KC_TRNS ,KC_TRNS,KC_TRNS ,KC_TRNS
// right hand // right hand
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,TG(MDIA_TG) ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,TG(MDIA_LK)
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
), ),
/* Keymap 5: Media Momentary Layer /* Keymap 5: Media Shift Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | F11 | F12 | F13 | F14 | F15 | | | | F16 | F17 | F18 | F19 | F20 | | * | LOCK | F11 | F12 | F13 | F14 | F15 | | | | F16 | F17 | F18 | F19 | F20 | LOCK |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | |ShutDn| | MsUp | | |ScrlUp| |ScrlUp|PrtScr| Home | Up | PgUp | Mail | | * | Media |ShutDn|LClick| MsUp |RClick|Vol Up|ScrlUp| |ScrlUp|PrtScr| Home | Up | PgUp | Mail | Media |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | Sleep|MsLeft|MsDown|MsRght| |------| |------|NumLok| Left | Down | Right|MyComp| | * | Symbol | Sleep|MsLeft|MsDown|MsRght|Vol Dn|------| |------|NumLok| Left | Down | Right|MyComp| Symbol |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | |MsDown| | |ScrlDn| |ScrlDn| | End | Down | PgDn | | | * | LShift | | |MsDown| | Mute |ScrlDn| |ScrlDn| | End | Down | PgDn | | RShift |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | Mute |Vol Dn|Vol Up| Lclk | Rclk | |Insert|Delete| | | | * | LCtrl| Meh |Hyper | LAlt | LGui | |Insert|Delete| Hyper| LAlt | LGui |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | Stop |Refrsh| | Prev | Next | * | Stop |Refrsh| | Prev | Next |
@ -258,22 +260,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | Home | |VolDn | | Pause| * | | | Home | |VolDn | | Pause|
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
[MDIA_MO] = KEYMAP( [MDIA_SH] = KEYMAP(
// left hand // left hand
KC_FN3 ,KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_TRNS KC_FN3 ,KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_NO
,MO(MDIA_MO) ,KC_POWER,KC_TRNS ,KC_MS_U ,KC_TRNS ,KC_TRNS ,KC_WH_U ,MO(MDIA_SH) ,KC_POWER ,KC_BTN1 ,KC_MS_U ,KC_BTN2 ,KC_VOLU ,KC_WH_U
,MO(SYMB_MO) ,KC_SLEP ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_TRNS ,MO(SYMB_SH) ,KC_SLEP ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD
,KC_LSFT ,KC_TRNS ,KC_TRNS ,KC_MS_D ,KC_TRNS ,KC_TRNS ,KC_WH_D ,KC_LSFT ,KC_NO ,KC_NO ,KC_MS_D ,KC_NO ,KC_MUTE ,KC_WH_D
,KC_MUTE ,KC_VOLD ,KC_VOLU ,KC_BTN1 ,KC_BTN2 ,KC_LCTL ,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI
,KC_WSTP ,KC_WREF ,KC_WSTP ,KC_WREF
,KC_WSCH ,KC_WSCH
,KC_WBAK ,KC_TRNS ,KC_WHOM ,KC_WBAK ,KC_NO ,KC_WHOM
// right hand // right hand
,KC_TRNS ,KC_F16 ,KC_F17 ,KC_F18 ,KC_F19 ,KC_F20 ,KC_FN3 ,KC_NO ,KC_F16 ,KC_F17 ,KC_F18 ,KC_F19 ,KC_F20 ,KC_FN3
,KC_WH_U ,KC_PSCR ,KC_HOME,KC_UP ,KC_PGUP ,KC_MAIL ,MO(MDIA_MO) ,KC_WH_U ,KC_PSCR ,KC_HOME,KC_UP ,KC_PGUP ,KC_MAIL ,MO(MDIA_SH)
,KC_NLCK ,KC_LEFT,KC_DOWN ,KC_RIGHT,KC_MYCM ,MO(SYMB_MO) ,KC_NLCK ,KC_LEFT,KC_DOWN ,KC_RIGHT,KC_MYCM ,MO(SYMB_SH)
,KC_WH_D ,KC_TRNS ,KC_END ,KC_DOWN ,KC_PGDN ,KC_TRNS ,KC_RSFT ,KC_WH_D ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_RSFT
,KC_INS ,KC_DEL ,KC_TRNS ,KC_TRNS ,KC_TRNS ,GUI_T(KC_INS),ALT_T(KC_DEL),ALL_T(KC_NO),MEH_T(KC_NO),KC_RCTL
,KC_MPRV ,KC_MNXT ,KC_MPRV ,KC_MNXT
,KC_VOLU ,KC_VOLU
,KC_VOLD ,KC_MSTP ,KC_MPLY ,KC_VOLD ,KC_MSTP ,KC_MPLY
@ -282,15 +284,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 6: Media Lock Layer /* Keymap 6: Media Lock Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | F11 | F12 | F13 | F14 | F15 | | | | F16 | F17 | F18 | F19 | F20 | | * | LOCK | F11 | F12 | F13 | F14 | F15 | | | | F16 | F17 | F18 | F19 | F20 | LOCK |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | |ShutDn| | MsUp | | |ScrlUp| |ScrlUp|PrtScr| Home | Up | PgUp | Mail | | * | Media |ShutDn|LClick| MsUp |RClick|Vol Up|ScrlUp| |ScrlUp|PrtScr| Home | Up | PgUp | Mail | Media |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | Sleep|MsLeft|MsDown|MsRght| |------| |------|NumLok| Left | Down | Right|MyComp| | * | | Sleep|MsLeft|MsDown|MsRght|Vol Dn|------| |------|NumLok| Left | Down | Right|MyComp| |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | |MsDown| | |ScrlDn| |ScrlDn| | End | Down | PgDn | | | * | LShift | | |MsDown| | Mute |ScrlDn| |ScrlDn| | End | Down | PgDn | | RShift |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | Mute |Vol Dn|Vol Up| Lclk | Rclk | |Insert|Delete| | | | * | LCtrl| Meh |Hyper | LAlt | LGui | |Insert|Delete| Hyper| LAlt | LGui |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | Stop |Refrsh| | Prev | Next | * | Stop |Refrsh| | Prev | Next |
@ -300,22 +302,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | Home | |VolDn | | Pause| * | | | Home | |VolDn | | Pause|
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
[MDIA_TG] = KEYMAP( [MDIA_LK] = KEYMAP(
// left hand // left hand
MO(MDIA_XX) ,KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_TRNS MO(MDIA_UN),KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_NO
,MO(UNLOCK) ,KC_POWER,KC_TRNS ,KC_MS_U ,KC_TRNS ,KC_TRNS ,KC_WH_U ,MO(UNLOCK) ,KC_POWER ,KC_BTN1 ,KC_MS_U ,KC_BTN2 ,KC_VOLU ,KC_WH_U
,KC_NO ,KC_SLEP ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_TRNS ,KC_NO ,KC_SLEP ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD
,KC_LSFT ,KC_TRNS ,KC_TRNS ,KC_MS_D ,KC_TRNS ,KC_TRNS ,KC_WH_D ,KC_LSFT ,KC_NO ,KC_NO ,KC_MS_D ,KC_NO ,KC_MUTE ,KC_WH_D
,KC_MUTE ,KC_VOLD ,KC_VOLU ,KC_BTN1 ,KC_BTN2 ,KC_LCTL ,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI
,KC_WSTP ,KC_WREF ,KC_WSTP ,KC_WREF
,KC_WSCH ,KC_WSCH
,KC_WBAK ,KC_TRNS ,KC_WHOM ,KC_WBAK ,KC_NO ,KC_WHOM
// right hand // right hand
,KC_TRNS ,KC_F16 ,KC_F17 ,KC_F18 ,KC_F19 ,KC_F20 ,MO(MDIA_XX) ,KC_NO ,KC_F16 ,KC_F17 ,KC_F18 ,KC_F19 ,KC_F20 ,MO(MDIA_UN)
,KC_WH_U ,KC_PSCR ,KC_HOME,KC_UP ,KC_PGUP ,KC_MAIL ,MO(UNLOCK) ,KC_WH_U ,KC_PSCR ,KC_HOME,KC_UP ,KC_PGUP ,KC_MAIL ,MO(UNLOCK)
,KC_NLCK ,KC_LEFT,KC_DOWN ,KC_RIGHT,KC_MYCM ,KC_NO ,KC_NLCK ,KC_LEFT,KC_DOWN ,KC_RIGHT,KC_MYCM ,KC_NO
,KC_WH_D ,KC_TRNS ,KC_END ,KC_DOWN ,KC_PGDN ,KC_TRNS ,KC_RSFT ,KC_WH_D ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_RSFT
,KC_INS ,KC_DEL ,KC_TRNS ,KC_TRNS ,KC_TRNS ,GUI_T(KC_INS),ALT_T(KC_DEL),ALL_T(KC_NO),MEH_T(KC_NO),KC_RCTL
,KC_MPRV ,KC_MNXT ,KC_MPRV ,KC_MNXT
,KC_VOLU ,KC_VOLU
,KC_VOLD ,KC_MSTP ,KC_MPLY ,KC_VOLD ,KC_MSTP ,KC_MPLY
@ -324,9 +326,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 7: Media Unlock Layer /* Keymap 7: Media Unlock Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | Esc | | | | | | | | | | | | | | * | | Esc | | | | | | | | | | | | Bspc | |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | Unlock | | | | | | | | | | | | | | Unlock | * | UNLOCK | | | | | | | | | | | | | | UNLOCK |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | | | |------| |------| | | | | | | * | | | | | | |------| |------| | | | | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
@ -342,34 +344,34 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | * | | | | | | | |
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
[MDIA_XX] = KEYMAP( [MDIA_UN] = KEYMAP(
// left hand // left hand
KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_FN1 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
// right hand // right hand
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
), ),
/* Keymap 8: Unlock Layer /* Keymap 8: Unlock Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | Unlock | | | | | | | | | | | | | | Unlock | * | UNLOCK | | | | | | | | | | | | | | UNLOCK |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | | | | | | | | | | | | | | | | * | | | | | | | | | | | | | | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
@ -389,22 +391,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
[UNLOCK] = KEYMAP( [UNLOCK] = KEYMAP(
// left hand // left hand
KC_FN1 ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS KC_FN1 ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
// right hand // right hand
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
@ -413,9 +415,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
}; };
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_CLEAR(ON_PRESS) // FN1 - clear to base layer [1] = ACTION_LAYER_CLEAR(ON_PRESS) // FN1 - clear to base layer
,[2] = ACTION_LAYER_INVERT(SYMB_TG, ON_PRESS) // FN2 - toggle to Symbols on press ,[2] = ACTION_LAYER_INVERT(SYMB_LK, ON_PRESS) // FN2 - toggle to Symbols on press
,[3] = ACTION_LAYER_INVERT(MDIA_TG, ON_PRESS) // FN3 - toggle to Media on press ,[3] = ACTION_LAYER_INVERT(MDIA_LK, ON_PRESS) // FN3 - toggle to Media on press
}; };
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
@ -440,31 +442,34 @@ void matrix_init_user(void) {
// Runs constantly in the background, in a loop. // Runs constantly in the background, in a loop.
void matrix_scan_user(void) { void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state); uint8_t layer = biton32(layer_state);
// do not change lights for locking and unlocking // shift or caps lock turns on red light
if(layer == UNLOCK || layer == LOCK || layer == SYMB_XX || layer == MDIA_XX) { if((keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT))) || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) {
return; ergodox_right_led_1_on();
} else {
ergodox_right_led_1_off();
} }
ergodox_board_led_off(); // do not change lights while locking and unlocking
ergodox_right_led_1_off(); if(layer == LOCK || layer == SYMB_UN || layer == MDIA_UN || layer == UNLOCK) {
ergodox_right_led_2_off(); return;
ergodox_right_led_3_off();
// caps lock turns on red light
if(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
ergodox_right_led_1_on();
} }
// symbol lock turns on green light //ergodox_board_led_off();
if(layer == SYMB_MO || layer == SYMB_TG) {
// symbol turns on green light
if(layer == SYMB_SH || layer == SYMB_LK) {
ergodox_right_led_2_on(); ergodox_right_led_2_on();
} else {
ergodox_right_led_2_off();
} }
// media lock turns on blue light // media turns on blue light
if(layer == MDIA_MO || layer == MDIA_TG) { if(layer == MDIA_SH || layer == MDIA_LK) {
ergodox_right_led_3_on(); ergodox_right_led_3_on();
} else {
ergodox_right_led_3_off();
} }
}; };

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 118 KiB

@ -3,25 +3,25 @@
[{y:-0.875,x:5.5},"F15",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",{c:"#99de2a",a:4},"F16"], [{y:-0.875,x:5.5},"F15",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",{c:"#99de2a",a:4},"F16"],
[{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F11",{x:14.5},"F20",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"], [{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F11",{x:14.5},"F20",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"],
[{y:-0.375,x:3.5,c:"#ff8500"},"Mouse\n\n\n\n\n\nUp",{x:10.5},"Cursor\n\n\n\n\n\nUp"], [{y:-0.375,x:3.5,c:"#ff8500"},"Mouse\n\n\n\n\n\nUp",{x:10.5},"Cursor\n\n\n\n\n\nUp"],
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#ffb063",a:4},"Scroll\n\n\n\n\n\nUp",{x:8.5},"Home",{x:1},"Page\n\n\n\n\n\nUp"], [{y:-0.875,x:2.5},"Left\n\n\n\n\n\nClick",{x:1},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#ffb063"},"Home",{x:1},"Page\n\n\n\n\n\nUp"],
[{y:-0.875,x:5.5,c:"#cccccc",a:7},"",{c:"#ffb063",a:4,h:1.5},"Scroll\n\n\n\n\n\nUp",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nUp",{c:"#e6e067"},"Print\n\n\n\n\n\nScreen"], [{y:-0.875,x:5.5,c:"#e6e067"},"Vol\n\n\n\n\n\nUp",{c:"#ffb063",h:1.5},"Scroll\n\n\n\n\n\nUp",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nUp",{c:"#e6e067"},"Print\n\n\n\n\n\nScreen"],
[{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Media\n\n\n\n\n\nShift",{c:"#e6e067",t:"#000000"},"Shut\n\n\n\n\n\nDown",{x:14.5},"Mail",{c:"#000000",t:"#ff0000",w:1.5},"\n\nMedia\n\n\n\n\nShift"], [{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Media\n\n\n\n\n\nShift",{c:"#e6e067",t:"#000000"},"Shut\n\n\n\n\n\nDown",{x:14.5},"Mail",{c:"#000000",t:"#ff0000",w:1.5},"\n\nMedia\n\n\n\n\nShift"],
[{y:-0.375,x:3.5,c:"#ff8500",t:"#000000"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"], [{y:-0.375,x:3.5,c:"#ff8500",t:"#000000"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"],
[{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nLeft",{x:1},"Mouse\n\n\n\n\n\nRight",{x:8.5},"Cursor\n\n\n\n\n\nLeft",{x:1},"Cursor\n\n\n\n\n\nRight"], [{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nLeft",{x:1},"Mouse\n\n\n\n\n\nRight",{x:8.5},"Cursor\n\n\n\n\n\nLeft",{x:1},"Cursor\n\n\n\n\n\nRight"],
[{y:-0.875,x:5.5,c:"#cccccc",a:7},"",{x:6.5,c:"#e6e067",a:4},"Num\n\n\n\n\n\nLock"], [{y:-0.875,x:5.5,c:"#e6e067"},"Vol\n\n\n\n\n\nDown",{x:6.5},"Num\n\n\n\n\n\nLock"],
[{y:-0.875,c:"#cccccc",a:7,w:1.5},"",{c:"#e6e067",a:4},"Sleep",{x:14.5},"My\n\n\n\n\n\nComp",{c:"#cccccc",a:7,w:1.5},""], [{y:-0.875,c:"#cccccc",a:7,w:1.5},"",{c:"#e6e067",a:4},"Sleep",{x:14.5},"My\n\n\n\n\n\nComp",{c:"#cccccc",a:7,w:1.5},""],
[{y:-0.625,x:6.5,c:"#ffb063",a:4,h:1.5},"Scroll\n\n\n\n\n\nDown",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nDown"], [{y:-0.625,x:6.5,c:"#ffb063",a:4,h:1.5},"Scroll\n\n\n\n\n\nDown",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nDown"],
[{y:-0.75,x:3.5,c:"#ff8500"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"], [{y:-0.75,x:3.5,c:"#ff8500"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"],
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#ffb063",a:4},"Scroll\n\n\n\n\n\nDown",{x:8.5},"End",{x:1},"Page\n\n\n\n\n\nDown"], [{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1},"",{x:8.5,c:"#ffb063",a:4},"End",{x:1},"Page\n\n\n\n\n\nDown"],
[{y:-0.875,x:5.5,c:"#cccccc",a:7},"",{x:6.5},""], [{y:-0.875,x:5.5,c:"#e6e067"},"Mute",{x:6.5,c:"#cccccc",a:7},""],
[{y:-0.875,c:"#2277ff",a:4,fa:[0,1,0,0,0,0,0],w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#cccccc",a:7},"",{x:14.5},"",{c:"#2277ff",a:4,fa:[0,1,0,1],w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"], [{y:-0.875,c:"#2277ff",a:4,f2:1,w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#cccccc",a:7},"",{x:14.5},"",{c:"#2277ff",a:4,fa:[0,1,0,1],w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"],
[{y:-0.375,x:3.5,c:"#ff8500"},"Left\n\n\n\n\n\nClick",{x:10.5,c:"#ffb063"},"Delete"], [{y:-0.375,x:3.5,c:"#77aaff"},"Option\n\n\nLAlt",{x:10.5,c:"#ffb063"},"Delete\n\n\nOption"],
[{y:-0.875,x:2.5,c:"#e6e067"},"Vol\n\n\n\n\n\nUp",{x:1,c:"#ff8500"},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#ffb063"},"Insert",{x:1,c:"#cccccc",a:7},""], [{y:-0.875,x:2.5,c:"#77aaff"},"Hyper",{x:1},"Cmd\n\n\nSuper",{x:8.5,c:"#ffb063"},"Insert\n\n\nCmd",{x:1,c:"#77aaff"},"Hyper"],
[{y:-0.75,x:0.5,c:"#e6e067",a:4},"Mute","Vol\n\n\n\n\n\nDown",{x:14.5,c:"#cccccc",a:7},"",""], [{y:-0.75,x:0.5},"Ctrl\n\n\nLCtrl","Meh",{x:14.5},"Meh","Crtl\n\n\nRCtrl"],
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#cfc82b",a:4},"Stop\n\n\nBrowser","Reload\n\n\nBrowser"], [{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#ccbb00"},"Stop\n\n\nBrowser","Reload\n\n\nBrowser"],
[{h:2},"< Web\n\n\nBrowser",{h:2},"Web >\n\n\nBrowser","Search\n\n\nBrowser"], [{h:2},"< Web\n\n\nBrowser",{h:2},"Web >\n\n\nBrowser","Search\n\n\nBrowser"],
[{x:2},"Home\n\n\nBrowser"], [{x:2},"Home\n\n\nBrowser"],
[{r:-30,rx:13,y:-1,x:-3},"Prev\n\n\nAudio\n\n\nTrack","Next\n\n\nAudio\n\n\nTrack"], [{r:-30,rx:13,y:-1,x:-3},"Prev\n\n\nAudio\n\n\nTrack","Next\n\n\nAudio\n\n\nTrack"],
[{x:-3,c:"#e6e067"},"Vol\n\n\n\n\n\nUp",{c:"#cfc82b",h:2},"Stop\n\n\nAudio",{h:2},"Play\n\n\nAudio\n\n\nPause"], [{x:-3,c:"#e6e067"},"Vol\n\n\n\n\n\nUp",{c:"#ccbb00",h:2},"Stop\n\n\nAudio",{h:2},"Play\n\n\nAudio\n\n\nPause"],
[{x:-3,c:"#e6e067"},"Vol\n\n\n\n\n\nDown"] [{x:-3,c:"#e6e067"},"Vol\n\n\n\n\n\nDown"]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 101 KiB

@ -1,27 +1,27 @@
[{x:3.5,c:"#99de2a"},"F3",{x:10.5},"F8"], [{x:3.5,c:"#99de2a"},"F3",{x:10.5},"F8"],
[{y:-0.875,x:2.5},"F2",{x:1},"F4",{x:8.5},"F7",{x:1},"F9"], [{y:-0.875,x:2.5},"F2",{x:1},"F4",{x:8.5},"F7",{x:1},"F9"],
[{y:-0.875,x:5.5},"F5",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",{c:"#99de2a",a:4},"F6"], [{y:-0.875,x:5.5},"F5",{c:"#ff4444"},"Esc",{x:4.5,c:"#bbddbb"},"_\n\n\n\n\n\n-",{c:"#99de2a"},"F6"],
[{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F1",{x:14.5},"F10",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"], [{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F1",{x:14.5},"F10",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"],
[{y:-0.375,x:3.5,c:"#c4e0bf"},"{",{x:10.5,c:"#89b087"},"8"], [{y:-0.375,x:3.5,c:"#bbddbb"},"{",{x:10.5,c:"#89b087"},"8"],
[{y:-0.875,x:2.5,c:"#c4e0bf"},"@",{x:1},"}",{x:8.5,c:"#89b087"},"7",{x:1},"9"], [{y:-0.875,x:2.5,c:"#bbddbb"},"@",{x:1},"}",{x:8.5,c:"#89b087"},"7",{x:1},"9"],
[{y:-0.875,x:5.5,c:"#c4e0bf"},"&",{h:1.5},"<",{x:4.5,h:1.5},">","|"], [{y:-0.875,x:5.5,c:"#bbddbb"},"&",{h:1.5},"<",{x:4.5,h:1.5},">","|"],
[{y:-0.875,c:"#2277ff",w:1.5},"Media\n\n\n\n\n\nShift",{c:"#c4e0bf"},"!",{x:14.5,c:"#89b087"},"/",{c:"#2277ff",w:1.5},"\n\nMedia\n\n\n\n\nShift"], [{y:-0.875,c:"#2277ff",w:1.5},"Media\n\n\n\n\n\nShift",{c:"#bbddbb"},"!",{x:14.5,c:"#89b087"},"/",{c:"#2277ff",w:1.5},"\n\nMedia\n\n\n\n\nShift"],
[{y:-0.375,x:3.5,c:"#c4e0bf"},"(",{x:10.5,c:"#89b087"},"5"], [{y:-0.375,x:3.5,c:"#bbddbb"},"(",{x:10.5,c:"#89b087"},"5"],
[{y:-0.875,x:2.5,c:"#c4e0bf"},"$",{x:1},")",{x:8.5,c:"#89b087"},"4",{x:1},"6"], [{y:-0.875,x:2.5,c:"#bbddbb"},"$",{x:1},")",{x:8.5,c:"#89b087"},"4",{x:1},"6"],
[{y:-0.875,x:5.5,c:"#c4e0bf"},"`",{x:6.5},"/"], [{y:-0.875,x:5.5,c:"#bbddbb"},"`",{x:6.5},"/"],
[{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Symbols\n\n\n\n\n\nShift",{c:"#c4e0bf",t:"#000000"},"#",{x:14.5,c:"#89b087"},"*",{c:"#000000",t:"#ff0000",w:1.5},"\n\nSymbols\n\n\n\n\nShift"], [{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Symbols\n\n\n\n\n\nShift",{c:"#bbddbb",t:"#000000"},"#",{x:14.5,c:"#89b087"},"*",{c:"#000000",t:"#ff0000",w:1.5},"\n\nSymbols\n\n\n\n\nShift"],
[{y:-0.625,x:6.5,c:"#54d6de",t:"#000000",fa:[0,0,0,1],h:1.5},"Tab >\n\n\nTab",{x:4.5,h:1.5},"< Tab\n\n\nShift Tab"], [{y:-0.625,x:6.5,c:"#54d6de",t:"#000000",fa:[0,0,0,1],h:1.5},"Tab >\n\n\nTab",{x:4.5,h:1.5},"< Tab\n\n\nShift Tab"],
[{y:-0.75,x:3.5,c:"#c4e0bf"},"[",{x:10.5,c:"#89b087"},"2"], [{y:-0.75,x:3.5,c:"#bbddbb"},"[",{x:10.5,c:"#89b087"},"2"],
[{y:-0.875,x:2.5,c:"#c4e0bf"},"^",{x:1},"]",{x:8.5,c:"#89b087"},"1",{x:1},"3"], [{y:-0.875,x:2.5,c:"#bbddbb"},"^",{x:1},"]",{x:8.5,c:"#89b087"},"1",{x:1},"3"],
[{y:-0.875,x:5.5,c:"#c4e0bf"},"~",{x:6.5},"\\"], [{y:-0.875,x:5.5,c:"#bbddbb"},"~",{x:6.5},"\\"],
[{y:-0.875,c:"#2277ff",f2:1,w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#c4e0bf"},"%",{x:14.5,c:"#89b087"},"-",{c:"#2277ff",fa:[0,1,0,1],w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"], [{y:-0.875,c:"#2277ff",fa:[0,1,0,1,0,0,1],w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#bbddbb"},"%",{x:14.5,c:"#89b087"},"-",{c:"#2277ff",w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"],
[{y:-0.375,x:3.5,c:"#cccccc",a:7},"",{x:10.5,c:"#89b087",a:4},"."], [{y:-0.375,x:3.5,c:"#77aaff"},"Option\n\n\nLAlt",{x:10.5,c:"#89b087"},".\n\n\nOption"],
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1},"",{x:8.5,c:"#89b087",a:4},"0",{x:1},"="], [{y:-0.875,x:2.5,c:"#77aaff"},"Hyper",{x:1},"Cmd\n\n\nSuper",{x:8.5,c:"#89b087"},"0\n\n\nCmd",{x:1},"=\n\n\nHyper"],
[{y:-0.75,x:0.5,c:"#cccccc",a:7},"","",{x:14.5,c:"#89b087",a:4},"+","Enter"], [{y:-0.75,x:0.5,c:"#77aaff"},"Ctrl\n\n\nLCtrl","Meh",{x:14.5,c:"#89b087"},"+\n\n\nMeh","Enter\n\n\nCtrl"],
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#54d6de"},"Left","Right"], [{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#54d6de"},"Left","Right"],
[{h:2},"Space",{h:2},"Enter","Up"], [{h:2},"Space",{h:2},"Enter","Up"],
[{x:2},"Down"], [{x:2},"Down"],
[{r:-30,rx:13,y:-1,x:-3},"Home","End"], [{r:-30,rx:13,y:-1,x:-3},"Home","End"],
[{x:-3},"Page\n\n\n\n\n\nUp",{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete"], [{x:-3,f:3},"Page\n\n\n\n\n\nUp",{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete"],
[{x:-3},"Page\n\n\n\n\n\nDown"] [{x:-3,f:3},"Page\n\n\n\n\n\nDown"]

File diff suppressed because it is too large Load Diff

@ -18,7 +18,7 @@ no rights reserved, use for any purposes, credit me if you are a nice person
![Ordinary base layout](ordinary-base.png) ![Ordinary base layout](ordinary-base.png)
This layout puts the modifier keys along the bottom of the keyboard where they are on most keyboards. They are in the regular order, with the addition of Hyper and Meh keys. On the outside edges are the Shift keys. The traditional shift key is called Capitals Shift and it is in the normal location. Above that are Symbols Shift and Media Shift. Each Shift key momentarily switches the layout to that layer, and if you use the Shift Lock button you can lock the layout to that layer. This layout puts the modifier keys along the bottom of the keyboard where they are on most keyboards. They are in the regular order, with the addition of Hyper and Meh keys. The modifier keys are all in the same place on all layers, although some layers also assign symbols on those buttons. On the outside edges are the Shift keys. The traditional shift key is called Capitals Shift and it is in the normal location. Above that are Symbols Shift and Media Shift. Each Shift key momentarily switches the layout to that layer, and if you use the Shift Lock button you can lock the layout to that layer.
Touch typists will also find tilde, tab, equals/plus, slash/pipe, and quote/double-quote sharing space on those Shift keys where they would probably be on a common keyboard. Other than the turquoise keys the only buttons which move to new locations are the Brackets and Dash and Escape. Most touch typists dont touch-type brackets or dash anyway so only Escape really requires retraining of muscle memory, and see below for the Special Escape Sequence. Touch typists will also find tilde, tab, equals/plus, slash/pipe, and quote/double-quote sharing space on those Shift keys where they would probably be on a common keyboard. Other than the turquoise keys the only buttons which move to new locations are the Brackets and Dash and Escape. Most touch typists dont touch-type brackets or dash anyway so only Escape really requires retraining of muscle memory, and see below for the Special Escape Sequence.
@ -45,7 +45,7 @@ The symbol keys are mostly the same as on the default layout, which did a good j
The number pad area here, in green, includes all four arithmetic operations in the same order found on most number pads and features an Enter key. The keycodes emitted here are normal numeric keycodes, not the number-pad specific keycodes emitted by most number pads, because this layout does not use a Num Lock key to switch the buttons between numeric keycodes and navigational keycodes. See the explanation in The Media Layout section about navigation using these same buttons. The number pad area here, in green, includes all four arithmetic operations in the same order found on most number pads and features an Enter key. The keycodes emitted here are normal numeric keycodes, not the number-pad specific keycodes emitted by most number pads, because this layout does not use a Num Lock key to switch the buttons between numeric keycodes and navigational keycodes. See the explanation in The Media Layout section about navigation using these same buttons.
Finally, consider the turquoise text-nav keys. Here in the Symbols layer, these are *reversed* from the base layer, with most keys mirrored, but the Delete keys shifted to maintain the directional significance of their arrangement. This is powerful! Often I find myself using the mouse with my right hand, and the left hand needs to press Enter. Instead of reaching the left hand over to the right side of the keyboard, now I simply tap Symbols to reverse the yellow keys, and Enter is right where it should be. Finally, consider the turquoise text-nav keys. Here in the Symbols layer, these are *reversed* from the base layer, with the keys either mirrored or shifted. This is powerful! Often I find myself using the mouse with my right hand, and the left hand needs to press Enter. Instead of reaching the left hand over to the right side of the keyboard, now I simply tap Symbols to reverse the turquoise keys, and Enter is right where it should be.
## The Media Layer ## ## The Media Layer ##
@ -55,6 +55,7 @@ Finally, consider the turquoise text-nav keys. Here in the Symbols layer, these
* The bright green keys are more F-keys * The bright green keys are more F-keys
* The dark yellow keys signal Web and Audio applications * The dark yellow keys signal Web and Audio applications
* The light yellow keys signal the operating system * The light yellow keys signal the operating system
* The uncolored keys do nothing in case you bump them by accident
![Ordinary media layout](ordinary-media.png) ![Ordinary media layout](ordinary-media.png)
@ -62,14 +63,18 @@ This layer was inspired by the Media layer on the Ergodox EZ but takes it farthe
Moreover, the orange keys on the right overlay the numberpad from the Symbols Layer, such that in the Media Layer the same keys can be used as if they were a number pad in navigational mode (Num Lock off). For instance, in traditional number pads the '3' key became 'Page Down', and so it is here. This means a user can do text navigation without moving either hand. Moreover, the orange keys on the right overlay the numberpad from the Symbols Layer, such that in the Media Layer the same keys can be used as if they were a number pad in navigational mode (Num Lock off). For instance, in traditional number pads the '3' key became 'Page Down', and so it is here. This means a user can do text navigation without moving either hand.
Alas, the yellow keys have at best spotty success with common software. Good luck with those but don't expect too much.
## Switching Between Layers ## ## Switching Between Layers ##
The three Shift keys correspond to three logical layers on top of the ever-present base layer, and are represented in the three LEDs on the keyboard: Capitals (red), Symbols (green), Media (blue). The color of a layer illuminates when the layer is active. Shift keys work in the expected way: press them and the keys shift to that layer; release them and the keys shift back to the base layer. The Ordinary Layout also features a Shift Lock key to keep a layer active indefinitely. Hold down the Shift Lock key then press any Shift key to lock to that layer. Or, hold down the Shift key and press the Shift Lock key; either way works. To revert to the base layer, use the Shift Lock key again in combination with the Shift key. The three Shift keys correspond to three logical layers on top of the ever-present base layer, and are represented in the three LEDs on the keyboard: Capitals (red), Symbols (green), Media (blue). The color of a layer illuminates when the layer is active. Shift keys work in the expected way: press them and the keys shift to that layer; release them and the keys shift back to the base layer. The Ordinary Layout also features a Shift Lock key to keep a layer active indefinitely. Hold down the Shift Lock key then press any Shift key to lock to that layer. Or, hold down the Shift key and press the Shift Lock key; it works either way. To revert to the base layer, use the Shift Lock key again in combination with the Shift key.
This layout attempts to treat the Capitals Shift layer the same as the other two Shift layers, but internally they are different which causes some inconsistencies. For instance, it is possible to switch from any layer to any other layer, and to lock to any layer, *except* it is not possible to go from Media to Symbols. You must exit the Media layer before engaging the Symbols layer. Also, the Caps Lock feature must be triggered by first pressing the Shift Lock key then a Capitals Shift key; it doesn't work if you press the Shift key first (instead you get the secondary symbol associated with the Shift Lock button). This layout attempts to treat the Capitals Shift layer the same as the other two Shift layers, but internally they are different which causes some inconsistencies. For instance, it is possible to switch from any layer to any other layer, and to lock to any layer, *except* it is not possible to go from Media to Symbols. You must exit the Media layer before engaging the Symbols layer. Also, the Caps Lock feature must be triggered by first pressing the Shift Lock key then a Capitals Shift key; it doesn't work if you press the Shift key first (instead you get the secondary symbol character associated with the Shift Lock button).
## Special Escape Sequence ## ## Special Escape & Backspace Sequences ##
In the Ordinary Layout, the most unsatisfying key location is the Escape key which rightly belongs segregated on its own way up on the top left of the keyboard. The Ergodox does not have a physical button in such a location and the nearest one, in the top left corner, was assigned to the tilde button which is traditionally found in that location. The Escape key is important so it features prominently on the other top corner on the left side of the keyboard, and is always there in all layers. Nevertheless, alas, it isn't Ordinary to put the escape in that different corner! In the Ordinary Layout, the most unsatisfying key location is the Escape key which rightly belongs segregated on its own way up on the top left of the keyboard. The Ergodox does not have a physical button in such a location and the nearest one, in the top left corner, is home to the tilde (er, grave) which is commonly found there. The Escape key is important so it features prominently on the other top corner on the left side of the keyboard, and is always there in all layers. Nevertheless, alas, it isn't Ordinary to put the escape in that different corner!
That tilde key has a second function as the Shift Lock key and that makes possible a special feature. To make this layout as Ordinary as possible, the Escape key can *also* be accessed by pressing Shift Lock then the 1 button right next to it. This easy gesture is a way to partially maintain the ease of flicking your wrist to the left and tapping Escape. This gesture works in all layers. That tilde key has a second function as the Shift Lock key and that makes possible a special feature. To make this layout as Ordinary as possible, the Escape key can *also* be accessed by pressing Shift Lock then the 1 button right next to it. This easy gesture is a way to partially maintain the ease of flicking your wrist to the left and tapping Escape. This gesture works in all layers.
Finally, because the special Escape sequence is so natural and useful, on the top right corner of the Ergodox EZ you can do the same gesture with the 0 key to produce a Backspace. Users of this keyboard and this layout are well advised to learn to use their thumbs for deleting text, but sometimes you are doing other computery things and just want to flick your digits up to the right and press backspace a bunch times. These special sequences should feel unremarkably mundane but might prove to be remarkably useful.

@ -1,413 +1,329 @@
#include "ergodox_ez.h" #include "ergodox_ez.h"
#include "debug.h" #include "debug.h"
#include "action_layer.h" #include "action_layer.h"
#include "keymap_extras/keymap_french.h"
#include "keymap_extras/keymap_neo2.h"
#include "keymap_extras/keymap_uk.h"
#include "keymap_extras/keymap_colemak.h"
#include "keymap_extras/keymap_french_osx.h"
#include "keymap_extras/keymap_nordic.h"
#include "keymap_extras/keymap_dvorak.h"
#include "keymap_extras/keymap_german.h"
#include "keymap_extras/keymap_norwegian.c"
#include "keymap_extras/keymap_fr_ch.h"
#include "keymap_extras/keymap_german_osx.h" #include "keymap_extras/keymap_german_osx.h"
#include "keymap_extras/keymap_spanish.h"
#include "keymap_extras/keymap_bepo.h"
#define BASE 0 // default layer #define BASE 0
#define SYMB 1 // symbols #define SYMB 1
#define MDIA 2 // media keys #define MDIA 2
#define SMLY 3 // media keys #define SMLY 3
#define NUMB 4 // number keys #define NUMB 4
#define EGOS 5 // Egoshooter layer #define EGOS 5
#define M_CTRL_CMDV 1
#define M_CTRL_CMDC 2
#define M_MEH_SH_ACUT 3
#define M_DE_OSX_PLUS_CTRLALT 12
#define M_DE_OSX_CIRC_CTRLCMD 13
#define M_TOGGLE_5 14
#define M_CTL_SFT_HASH 15
#define M_LGUI_SHFT 16
#define SM_SMILE 4
#define SM_SMIRK 5
#define SM_FROWN 6
#define SM_CRY 7
#define SM_KISS 8
#define SM_HEART 9
#define SM_LAUGH 10
#define SM_SAD 11
#define M_CTRL_CMDV 0
#define M_CTRL_CMDC 1
#define M_MEH_SH_ACUT 2
#define M_LGUI_SHFT 3
#define M_CTL_SFT_HASH 4
#define M_DE_OSX_CIRC_CTRLCMD 5
#define M_DE_OSX_PLUS_CTRLALT 6
#define SM_SMILE 7
#define SM_SMIRK 8
#define SM_CRY 9
#define SM_SAD 10
#define SM_HEART 11
#define SM_LAUGH 12
#define SM_KISS 13
#define SM_FROWN 14
#define M_TOGGLE_5 15
//Layout keymap.c generated with ErgodoxLayoutGenerator V1.0BETA1
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer [BASE]=KEYMAP(
* //left half
* ,-----------------------------------------------------. ,--------------------------------------------------. KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, M(M_CTL_SFT_HASH),
* | ESC | 1 | 2 | 3 | 4 | 5 |CTL_SFT/#| |CTL_SFT/#| 6 | 7 | 8 | 9 | 0 | ß | KC_TAB, DE_OSX_Q, DE_OSX_W, DE_OSX_E, DE_OSX_R, DE_OSX_T, KC_LGUI,
* |--------+------+------+------+------+----------------| |---------+------+------+------+------+------+--------| KC_LALT, DE_OSX_A, DE_OSX_S, DE_OSX_D, DE_OSX_F, DE_OSX_G,
* | TAB | Q | W | E | R | T | CMD | | CMD | Z | U | I | O | P | ü | KC_LSFT, CTL_T(DE_OSX_Y), DE_OSX_X, DE_OSX_C, DE_OSX_V, DE_OSX_B, KC_LALT,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| LT(SYMB,DE_OSX_LESS), M(M_DE_OSX_CIRC_CTRLCMD), M(M_DE_OSX_PLUS_CTRLALT), KC_UP, KC_DOWN,
* | LALT | A | S | D | F | G |---------| |---------| H | J | K | L | ö | ä/RALT| M(M_MEH_SH_ACUT), TG(MDIA),
* |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------| KC_HOME,
* | LShift |Y/Ctrl| X | C | V | B | | | | N | M | , | . |-/Ctrl| RShift | KC_BSPC, KC_DEL, LT(SMLY,KC_END),
* `--------+------+------+------+------+----------------' `-------------+------+------+------+------+--------' //right half
* |</L1| ^°/CTRL_CMD | +/CTRL_ALT | UP | DOWN| | Left | Right | CMD-SHFT| ALT-SHIFT | +/L1 | M(M_CTL_SFT_HASH), DE_OSX_6, DE_OSX_7, DE_OSX_8, DE_OSX_9, DE_OSX_0, DE_OSX_SS,
* `------------------------------------------' `---------------------------------------------' KC_RGUI, DE_OSX_Z, DE_OSX_U, DE_OSX_I, DE_OSX_O, DE_OSX_P, DE_OSX_UE,
* ,-------------. ,---------------. DE_OSX_H, DE_OSX_J, DE_OSX_K, DE_OSX_L, DE_OSX_OE, ALT_T(DE_OSX_AE),
* |`/Meh | Media| | NUM | ´/Hyper | KC_RALT, DE_OSX_N, DE_OSX_M, DE_OSX_COMM, DE_OSX_DOT, CTL_T(DE_OSX_MINS), KC_RSFT,
* ,------|------|------| |------+--------+------. KC_LEFT, KC_RIGHT, LGUI(KC_LSFT), LALT(KC_LSFT), LT(SYMB,DE_OSX_PLUS),
* | | | Home | | PgUp | | | TG(NUMB), ALL_T(DE_OSX_ACUT),
* | Back-| Del |------| |------| Enter | Space| KC_PGUP,
* | Space| | End | | PgDn | | | KC_PGDN, KC_ENT, KC_SPC),
* `--------------------' `----------------------' [SYMB]=KEYMAP(
*/ //left half
// If it accepts an argument (i.e, is a function), it doesn't need KC_. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
// Otherwise, it needs KC_* KC_TRNS, DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, DE_OSX_QST, KC_TRNS, KC_TRNS,
[BASE] = KEYMAP( // layer 0 : default KC_TRNS, DE_OSX_HASH, DE_OSX_DLR, DE_OSX_BSLS, DE_OSX_SLSH, KC_DOT,
// left hand KC_TRNS, KC_TRNS, DE_OSX_LESS, DE_OSX_PERC, DE_OSX_PIPE, DE_OSX_TILD, KC_TRNS,
KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, M(M_CTL_SFT_HASH), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TAB, DE_OSX_Q, DE_OSX_W, DE_OSX_E, DE_OSX_R, DE_OSX_T, KC_LGUI, KC_TRNS, KC_TRNS,
KC_LALT, DE_OSX_A, DE_OSX_S, DE_OSX_D, DE_OSX_F, DE_OSX_G, KC_TRNS,
KC_LSFT, CTL_T(DE_OSX_Y), DE_OSX_X, DE_OSX_C, DE_OSX_V, DE_OSX_B, KC_LALT, KC_TRNS, KC_DEL, KC_TRNS,
LT(SYMB,DE_OSX_LESS), M(M_DE_OSX_CIRC_CTRLCMD), M(M_DE_OSX_PLUS_CTRLALT), KC_UP, KC_DOWN, //right half
M(M_MEH_SH_ACUT), TG(MDIA), M(M_TOGGLE_5), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_HOME, KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM,
KC_BSPC,KC_DEL, LT(SMLY,KC_END), DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, LALT(KC_8), LALT(KC_9), DE_OSX_HASH,
// right hand KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, DE_OSX_CIRC, KC_UP, DE_OSX_MINS, LSFT(KC_4),
M(M_CTL_SFT_HASH), DE_OSX_6, DE_OSX_7, DE_OSX_8, DE_OSX_9, DE_OSX_0, DE_OSX_SS, DE_OSX_QUOT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS,
KC_RGUI, DE_OSX_Z, DE_OSX_U, DE_OSX_I, DE_OSX_O, DE_OSX_P, DE_OSX_UE, KC_F13, KC_F12,
DE_OSX_H, DE_OSX_J, DE_OSX_K, DE_OSX_L, DE_OSX_OE, ALT_T(DE_OSX_AE), KC_F14,
KC_RALT, DE_OSX_N, DE_OSX_M, DE_OSX_COMM,DE_OSX_DOT, CTL_T(DE_OSX_MINS), KC_RSFT, KC_F15, KC_TRNS, KC_TRNS),
KC_LEFT, KC_RIGHT,LGUI(KC_LSFT),LALT(KC_LSFT), LT(SYMB,DE_OSX_PLUS), [MDIA]=KEYMAP(
TG(NUMB), ALL_T(DE_OSX_ACUT), //left half
KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_PGDN,KC_ENT, KC_SPC KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS,
), KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D,
/* Keymap 1: Symbol Layer KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS,
* KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* ,--------------------------------------------------. ,--------------------------------------------------. KC_TRNS, KC_TRNS,
* | | F1 | F2 | F3 | F4 | F5 | | | L5 | F6 | F7 | F8 | F9 | F10 | F11 | KC_TRNS,
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| KC_TRNS, KC_TRNS, KC_TRNS,
* | | < | > | ! | ? | | | | | \ | [ | ] | < | > | ! | //right half
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
* | | # | $ | \ | / | . |------| |------| / | ( | ) | { | } | # | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* | | | ^ | % | | | ~ | | | | | | ~ | ^ | UP | | $ | KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS,
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT,
* | | | | | | | ' | LEFT| DOWN | RIGHT | | KC_TRNS, KC_TRNS,
* `----------------------------------' `----------------------------------' KC_TRNS,
* ,-------------. ,-------------. KC_TRNS, KC_TRNS, KC_WBAK),
* | | | | F13 | F12 | [SMLY]=KEYMAP(
* ,------|------|------| |------+------+------. //left half
* | | | | | F14 | | | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* | | |------| |------| | | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* | | | | | F15 | | | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* `--------------------' `--------------------' KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
// SYMBOLS KC_TRNS, KC_TRNS,
[SYMB] = KEYMAP( KC_TRNS,
// left hand KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, //right half
KC_TRNS,DE_OSX_LESS,DE_OSX_MORE,DE_OSX_EXLM,DE_OSX_QST, KC_TRNS,KC_TRNS, M(SM_SMILE), M(SM_SMIRK), M(SM_LAUGH), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,DE_OSX_HASH,DE_OSX_DLR, DE_OSX_BSLS,DE_OSX_SLSH,KC_DOT, KC_TRNS, M(SM_FROWN), M(SM_SAD), M(SM_CRY), KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,KC_TRNS,DE_OSX_LESS,DE_OSX_PERC,DE_OSX_PIPE,DE_OSX_TILD,KC_TRNS, M(SM_HEART), M(SM_KISS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,KC_DEL,KC_TRNS, KC_TRNS,
// right hand KC_TRNS, KC_TRNS, KC_TRNS),
M(M_TOGGLE_5), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, [NUMB]=KEYMAP(
KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, //left half
DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, LALT(KC_8), LALT(KC_9), DE_OSX_HASH, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, DE_OSX_CIRC, KC_UP, DE_OSX_MINS, LSFT(KC_4), KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
DE_OSX_QUOT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
KC_F13, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_F14, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_F15, KC_TRNS, KC_TRNS KC_TRNS, KC_TRNS,
), KC_TRNS,
/* Keymap 2: Media and mouse keys KC_TRNS, KC_TRNS, KC_TRNS,
* //right half
* ,--------------------------------------------------. ,--------------------------------------------------. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
* | | | | | | | | | Mute | | | | | | EGOS | KC_TRNS, KC_UP, KC_7, KC_8, KC_9, LSFT(KC_RBRC), KC_F12,
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, DE_OSX_MINS,
* | | | Lclk | MsUp | Rclk | WlUp | | | | | | | | | | KC_TRNS, LSFT(KC_6), KC_1, KC_2, KC_3, LSFT(KC_7), KC_TRNS,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| KC_0, KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS,
* | | |MsLeft|MsDown|MsRght| WlDw |------| |------|VolUp | | | | | | KC_TRNS, KC_TRNS,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| KC_TRNS,
* | | | | | | MClk | | | |VolDn | | Prev | Next | Up | | KC_TRNS, KC_TRNS, KC_TRNS),
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' [EGOS]=KEYMAP(
* | | | | | | | | | Left | Down | Right | //left half
* `----------------------------------' `----------------------------------' KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* ,-------------. ,-------------. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* | | | | | | KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* ,------|------|------| |------+------+------. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* | | | | | | |Brwser| KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* | | |------| |------| |Back | KC_F1, KC_F2,
* | | | | | | | | KC_F3,
* `--------------------' `--------------------' KC_SPC, KC_LCTL, KC_F4,
*/ //right half
// MEDIA AND MOUSE M(M_TOGGLE_5), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
[MDIA] = KEYMAP( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS,
KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
/* Keymap 3: Smiley layer
* making it easier to type smileys... tipp: on osx you can easily replace those smileys with the UTF-8 character using
* keyboard short commands...
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | :-) | ;-) | :-D | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | :-{ | :-( | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| <3 | :-* | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | r|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+--------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `----------------------'
*/
[SMLY] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
M(SM_SMILE), M(SM_SMIRK), M(SM_LAUGH), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, M(SM_FROWN), M(SM_SAD), M(SM_CRY), KC_TRNS, KC_TRNS, KC_TRNS,
M(SM_HEART), M(SM_KISS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
//number pad
[NUMB] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, LSFT(KC_RBRC), KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, DE_OSX_MINS,
KC_TRNS, LSFT(KC_6), KC_1, KC_2, KC_3, LSFT(KC_7), KC_TRNS,
KC_0,KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 3: Egoshooter layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | L5 | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | SHIFT | | | | | |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | CTRL | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | F1 | F2 | | | |
* ,------|------|------| |------+--------+------.
* | | | F3 | | | | |
* | SPACE| CTRL|------| |------| | |
* | | | F4 | | | | |
* `--------------------' `----------------------'
*/
[EGOS] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_F1, KC_F2,
KC_F3,
KC_SPC, KC_LCTL, KC_F4,
// right hand
M(M_TOGGLE_5), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
}; };
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols)
[2] = ACTION_LAYER_TAP_TOGGLE(SMLY) // FN2 - Momentary Layer 2 (Smiley)
}; };
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{ {
static uint16_t start; static uint16_t start;
// MACRODOWN only works in this function switch(id) {
switch(id) { case M_TOGGLE_5:
case 0: //Macro: M_TOGGLE_5//-----------------------
if (record->event.pressed) { if (record->event.pressed){
register_code(KC_RSFT); layer_state ^= (1<<5);
} else { layer_state &= (1<<5);
unregister_code(KC_RSFT); }
}
break; break;
case 1: case M_CTRL_CMDC:
if (record->event.pressed) { //Macro: M_CTRL_CMDC//-----------------------
start = timer_read(); if (record->event.pressed) {
return MACRO(D(LCTRL), END);
} else {
if (timer_elapsed(start) > 150) {
return MACRO(U(LCTRL), END);
} else {
return MACRO(U(LCTRL), D(LGUI), T(V), U(LGUI), END);
}
}
break;
case 2:
if (record->event.pressed) {
start = timer_read(); start = timer_read();
return MACRO(D(LCTRL),END); return MACRO(D(LCTRL),END);
} else { } else {
if (timer_elapsed(start) > 150){ if (timer_elapsed(start) >150) {
return MACRO(U(LCTRL),END); return MACRO(U(LCTRL),END);
} else { } else {
return MACRO(U(LCTRL),D(LGUI),T(C),U(LGUI),END); return MACRO(U(LCTRL),D(LGUI),T(C),U(LGUI),END);
} }
} }
break;
case 3: break;
if (record->event.pressed) { case M_DE_OSX_PLUS_CTRLALT:
//Macro: M_DE_OSX_PLUS_CTRLALT//-----------------------
if (record->event.pressed) {
start = timer_read(); start = timer_read();
return MACRO(D(LCTRL),D(LSFT),D(LALT),END); return MACRO(D(LCTRL),D(LALT),END);
} else { } else {
if (timer_elapsed(start) > 150){ if (timer_elapsed(start) >150) {
return MACRO(U(LCTRL),U(LSFT),U(LALT),END); return MACRO(U(LCTRL),U(LALT),END);
} else { } else {
return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_OSX_ACUT here, as macro needs KC_ prefix return MACRO(U(LCTRL),U(LALT),T(RBRC),END);
} }
} }
break;
case M_LGUI_SHFT: break;
if (record->event.pressed){ case SM_KISS:
//Macro: SM_KISS//-----------------------
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(RBRC),U(LSFT),END);
}
break;
case SM_FROWN:
//Macro: SM_FROWN//-----------------------
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LALT),T(8),U(LALT),END);
}
break;
case SM_CRY:
//Macro: SM_CRY//-----------------------
if (record->event.pressed) {
return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END);
}
break;
case SM_SMILE:
//Macro: SM_SMILE//-----------------------
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END);
}
break;
case SM_SMIRK:
//Macro: SM_SMIRK//-----------------------
if (record->event.pressed) {
return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END);
}
break;
case M_LGUI_SHFT:
//Macro: M_LGUI_SHFT//-----------------------
if (record->event.pressed){
return MACRO(D(LGUI),D(LSFT),END); return MACRO(D(LGUI),D(LSFT),END);
}else{ }else{
return MACRO(U(LGUI),U(LSFT),END); return MACRO(U(LGUI),U(LSFT),END);
} }
break;
case M_CTL_SFT_HASH: break;
if (record->event.pressed) { case SM_HEART:
start=timer_read(); //Macro: SM_HEART//-----------------------
return MACRO(D(LCTRL),D(LSFT),END); if (record->event.pressed) {
return MACRO(T(GRV),T(3),END);
}
break;
case SM_LAUGH:
//Macro: SM_LAUGH//-----------------------
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(D),U(LSFT),END);
}
break;
case M_CTL_SFT_HASH:
//Macro: M_CTL_SFT_HASH//-----------------------
if (record->event.pressed) {
start = timer_read();
return MACRO(D(LCTRL),D(LSFT),END);
} else { } else {
if (timer_elapsed(start) > 150){ if (timer_elapsed(start) >150) {
return MACRO(U(LCTRL),U(LSFT),END); return MACRO(U(LCTRL),U(LSFT),END);
} else { } else {
return MACRO(U(LCTRL),U(LSFT),T(BSLS),END); return MACRO(U(LCTRL),U(LSFT),T(BSLS),END);
} }
} }
break;
case M_DE_OSX_CIRC_CTRLCMD: break;
if (record->event.pressed) { case SM_SAD:
//Macro: SM_SAD//-----------------------
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END);
}
break;
case M_DE_OSX_CIRC_CTRLCMD:
//Macro: M_DE_OSX_CIRC_CTRLCMD//-----------------------
if (record->event.pressed) {
start = timer_read(); start = timer_read();
return MACRO(D(LCTRL),D(LGUI),END); return MACRO(D(LCTRL),D(LGUI),END);
} else { } else {
if (timer_elapsed(start) > 150){ if (timer_elapsed(start) >150) {
return MACRO(U(LCTRL),U(LGUI),END); return MACRO(U(LCTRL),U(LGUI),END);
} else { } else {
return MACRO(U(LCTRL),U(LGUI),T(NUBS),END); return MACRO(U(LCTRL),U(LGUI),T(NUBS),END);
} }
} }
break;
case M_DE_OSX_PLUS_CTRLALT: break;
if (record->event.pressed) { case M_CTRL_CMDV:
//Macro: M_CTRL_CMDV//-----------------------
if (record->event.pressed) {
start = timer_read(); start = timer_read();
return MACRO(D(LCTRL),D(LALT),END); return MACRO(D(LCTRL),END);
} else { } else {
if (timer_elapsed(start) > 150){ if (timer_elapsed(start) >150) {
return MACRO(U(LCTRL),U(LALT),END); return MACRO(U(LCTRL),END);
} else { } else {
return MACRO(U(LCTRL),U(LALT),T(RBRC),END); return MACRO(U(LCTRL),D(LGUI),T(V),U(LGUI),END);
} }
} }
break;
case SM_SMILE:
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END);
}
break;
case SM_SMIRK: break;
if (record->event.pressed) { case M_MEH_SH_ACUT:
return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(9),U(LSFT),END); //Macro: M_MEH_SH_ACUT//-----------------------
} if (record->event.pressed) {
break; start = timer_read();
case SM_CRY: return MACRO(D(LCTRL),D(LSFT),D(LALT),END);
if (record->event.pressed) { } else {
return MACRO(D(LSFT),T(COMM),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END); if (timer_elapsed(start) >150) {
} return MACRO(U(LCTRL),U(LSFT),U(LALT),END);
break; } else {
return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END);
case SM_SAD: }
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(8),U(LSFT),END);
}
break;
case SM_HEART:
if (record->event.pressed) {
return MACRO(T(GRV),T(3),END);
}
break;
case SM_LAUGH:
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(D),U(LSFT),END);
}
break;
case SM_KISS:
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LSFT),T(RBRC),U(LSFT),END);
}
break;
case SM_FROWN:
if (record->event.pressed) {
return MACRO(D(LSFT),T(DOT),U(LSFT),T(SLSH),D(LALT),T(8),U(LALT),END);
} }
break;
case M_TOGGLE_5: break;
if (record->event.pressed){ }
layer_state ^= (1<<5); return MACRO_NONE;
layer_state &= (1<<5);
}
break;
}
return MACRO_NONE;
}; };
// Runs just one time when the keyboard initializes. // Runs just one time when the keyboard initializes.
@ -418,36 +334,43 @@ void matrix_init_user(void) {
// Runs constantly in the background, in a loop. // Runs constantly in the background, in a loop.
void matrix_scan_user(void) { void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state); uint8_t layer = biton32(layer_state);
ergodox_board_led_off(); ergodox_board_led_off();
ergodox_right_led_1_off(); ergodox_right_led_1_off();
ergodox_right_led_2_off(); ergodox_right_led_2_off();
ergodox_right_led_3_off(); ergodox_right_led_3_off();
switch (layer) { switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1: case SYMB:
ergodox_right_led_1_on(); ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on(); break;
break; case MDIA:
case 3:
ergodox_right_led_3_on(); ergodox_right_led_2_on();
break;
case 4: break;
ergodox_right_led_1_on(); case SMLY:
ergodox_right_led_3_on();
//ergodox_board_led_on();
break; ergodox_right_led_3_on();
case 5: break;
ergodox_right_led_1_on(); case NUMB:
ergodox_right_led_2_on(); ergodox_right_led_1_on();
ergodox_right_led_3_on();
break; ergodox_right_led_3_on();
default: break;
// none case EGOS:
break; ergodox_right_led_1_on();
} ergodox_right_led_2_on();
ergodox_right_led_3_on();
break;
default:
// none
break;
}
}; };

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 669 KiB

After

Width:  |  Height:  |  Size: 292 KiB

@ -11,6 +11,12 @@ Dies ist nur ein kleiner Tweak der bestehenden firmware für das ErgoDox-EZ-Keyb
- der Zehnerblock wurde in eine eigene Layer umgezogen - der Zehnerblock wurde in eine eigene Layer umgezogen
- die Meh und Hyper-Tasten wurden in die Daumenblöcke umgezogen - die Meh und Hyper-Tasten wurden in die Daumenblöcke umgezogen
# Erstellt Mit Dem ErgodoxLayoutGenerator
Der ErgodoxLayoutGenerator ist ein kleines Werkzeug, welches die Erstellung und Pflege der eigenen Keymaps erleichtern soll. Es ist in java geschrieben und kann [hier](https://github.com/sboesebeck/ErgodoxLayoutGenerator/releases) heruntergeladen werden. Damit das Tool funktioniert sollte das offizielle Oracle JDK in aktueller Version installiert sein.
Die Dokumentation für den ELG kann man [hier](https://boesebeck.name/2016/04/16/ergodoxlayoutgenerator-documentation/) nachlesen (momentan leider nur in Englisch verfügbar).
------------------------------ ------------------------------
@ -26,3 +32,10 @@ This is only a little tweak of the existing default layout for the ErgoDox keyb
- the symbollayer now has only symbols - the symbollayer now has only symbols
- the number block was moved to a special layer - the number block was moved to a special layer
- meh and hyper went down to the thumb block - meh and hyper went down to the thumb block
# Created Using the ErgodoxLayoutGenerator
The ErgodoxLayoutGenerator (ELG) is a little tool, which makes the creation and maintenance of keycaps a lot easier. It was written in Java and can be downloaded [here](https://github.com/sboesebeck/ErgodoxLayoutGenerator/releases). To use the tool, you need to have a current version of Oracles JDK installed.
The documentation of the ELG can be viewed [here](https://boesebeck.name/2016/04/16/ergodoxlayoutgenerator-documentation/).

@ -1,229 +1,153 @@
// Netable differences vs. the default firmware for the ErgoDox EZ:
// 1. The Cmd key is now on the right side, making Cmd+Space easier.
// 2. The media keys work on OSX (But not on Windows).
#include "ergodox_ez.h" #include "ergodox_ez.h"
#include "debug.h" #include "debug.h"
#include "action_layer.h" #include "action_layer.h"
#include "keymap_extras/keymap_french.h"
#include "keymap_extras/keymap_neo2.h"
#include "keymap_extras/keymap_uk.h"
#include "keymap_extras/keymap_colemak.h"
#include "keymap_extras/keymap_french_osx.h"
#include "keymap_extras/keymap_nordic.h"
#include "keymap_extras/keymap_dvorak.h"
#include "keymap_extras/keymap_german.h" #include "keymap_extras/keymap_german.h"
#include "keymap_extras/keymap_norwegian.c"
#include "keymap_extras/keymap_fr_ch.h"
#include "keymap_extras/keymap_german_osx.h"
#include "keymap_extras/keymap_spanish.h"
#include "keymap_extras/keymap_bepo.h"
#define BASE 0 // default layer #define BASE 0
#define SYMB 1 // symbols #define SYMB 1
#define MDIA 2 // media keys #define MDIA 2
#define ADNW 3 // media keys #define QWERTZ 3
#define NUMB 4 // number keys #define NUMB 4
#define UNUSED 0
//Layout keymap.c generated with ErgodoxLayoutGenerator V1.0BETA1
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// If it accepts an argument (i.e, is a function), it doesn't need KC_. [BASE]=KEYMAP(
// Otherwise, it needs KC_* //left half
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LCTL,
/* Keymap 0: ADNW-Koy layer KC_TAB, KC_K, KC_DOT, KC_O, KC_COMM, KC_Z, KC_LGUI,
* ADNW-Koy is a special layout designed to be ergonomic. Was created using software to determine the most ergonomic way to type German and English texts. TG(QWERTZ), KC_H, KC_A, KC_E, KC_I, KC_U,
* KC_LSFT, CTL_T(KC_X), KC_Q, DE_AE, DE_UE, DE_OE, KC_LALT,
* ,--------------------------------------------------. ,--------------------------------------------------. LT(SYMB,KC_GRV), DE_LESS, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
* | ESC | 1 | 2 | 3 | 4 | 5 |Lctrl | |Rctrl | 6 | 7 | 8 | 9 | 0 | - | TG(MDIA), MEH_T(LSFT(DE_ACUT)),
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| KC_HOME,
* | TAB | K | . | O | , | Y | CMD | | CMD | V | G | C | L | ß | Z | KC_BSPC, KC_DEL, KC_END,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| //right half
* | ADNW | H | A | E | I | U |------| |------| D | T | R | N | S | F/L2 | KC_RCTL, KC_6, KC_7, KC_8, KC_9, KC_0, DE_OSX_MINS,
* |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------| KC_RGUI, KC_V, KC_G, KC_C, KC_L, KC_MINS, KC_Y,
* | LShift |X/Ctrl| Q | Ä | Ü | Ö | | | | B | P | W | M |J/Ctrl| RShift | KC_D, KC_T, KC_R, KC_N, KC_S, LT(MDIA,KC_F),
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' KC_RALT, KC_B, KC_P, KC_W, KC_M, CTL_T(KC_J), KC_RSFT,
* |</L1| ^ |AltShf| Left | Right| | Up | Down | CMD-SHIFT | ´ | //L1 | KC_UP, KC_DOWN, LGUI(KC_LSFT), KC_RBRC, LT(SYMB,KC_BSLS),
* `----------------------------------' `----------------------------------' ALL_T(DE_ACUT), TG(NUMB),
* ,-------------. ,-------------. KC_PGUP,
* | L1 | LGui | | Alt |Ctrl/Esc| KC_PGDN, KC_ENT, KC_SPC),
* ,------|------|------| |------+--------+------. [SYMB]=KEYMAP(
* | | | Home | | PgUp | | | //left half
* | Space|Backsp|------| |------| Enter | Space| KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
* | |ace | End | | PgDn | | | KC_TRNS, KC_GRV, LSFT(KC_GRV), DE_EXLM, DE_QST, KC_TRNS, KC_TRNS,
* `--------------------' `----------------------' KC_TRNS, DE_HASH, DE_DLR, LALT(LSFT(KC_7)), DE_SLSH, KC_DOT,
*/ KC_TRNS, KC_TRNS, DE_LESS, DE_PERC, LALT(KC_7), LALT(KC_N), KC_TRNS,
KEYMAP( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_K, KC_DOT, KC_O, KC_COMM, KC_Z, KC_TRNS, KC_TRNS,
KC_TRNS, KC_H, KC_A, KC_E, KC_I, KC_U, KC_TRNS, KC_DEL, KC_TRNS,
KC_TRNS, CTL_T(KC_X),KC_Q, DE_AE, DE_UE, DE_OE, KC_TRNS, //right half
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_TRNS, KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), LALT(KC_7), DE_HASH, KC_F12,
KC_TRNS, DE_SLSH, DE_LPRN, DE_RPRN, LALT(KC_8), LALT(KC_9), KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_AMPR, KC_GRV, LSFT(KC_GRV), DE_DQOT, DE_QUOT, DE_QST,
// right hand KC_TRNS, KC_DOT, KC_EXLM, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLSH, KC_TRNS, KC_TRNS,
KC_TRNS, KC_V, KC_G, KC_C, KC_L, KC_MINS, KC_Y, KC_TRNS,
KC_D, KC_T, KC_R, KC_N, KC_S, LT(MDIA,KC_F), KC_TRNS, KC_TRNS, KC_TRNS),
KC_TRNS, KC_B, KC_P, KC_W, KC_M, CTL_T(KC_J), KC_TRNS, [MDIA]=KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //left half
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
), KC_TRNS, KC_WH_L, KC_WH_U, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS,
/* Keymap 1: Symbol Layer KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
* KC_TRNS, KC_TRNS,
* ,--------------------------------------------------. ,--------------------------------------------------. KC_TRNS,
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | KC_TRNS, KC_TRNS, KC_TRNS,
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| //right half
* | | | | ! | ? | | | | | \ | [ | ] | | | # | F12 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* | | # | $ | \ | / | . |------| |------| / | ( | ) | { | } | | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| KC_TRNS, KC_TRNS, KC_MUTE, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS,
* | | | ^ | % | | | ~ | | | | & | < | > | " | ' | ? | KC_VOLU, KC_VOLD, KC_LEFT, KC_DOWN, KC_RIGHT,
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' KC_TRNS, KC_TRNS,
* | | | | | | | | | . | ! | | KC_TRNS,
* `----------------------------------' `----------------------------------' KC_TRNS, KC_TRNS, KC_WBAK),
* ,-------------. ,-------------. [QWERTZ]=KEYMAP(
* | | | | | | //left half
* ,------|------|------| |------+------+------. KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LGUI(KC_V),
* | | | | | | | | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LGUI,
* | | |------| |------| | | KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G,
* | | | | | | | | KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LALT,
* `--------------------' `--------------------' LT(SYMB,KC_GRV), DE_LESS, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
*/ KC_TRNS, MEH_T(LSFT(DE_ACUT)),
// SYMBOLS KC_HOME,
[SYMB] = KEYMAP( KC_BSPC, KC_DEL, KC_END,
// left hand //right half
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, LGUI(KC_C), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_TRNS,KC_GRV,LSFT(KC_GRV),DE_EXLM,DE_QST,KC_TRNS,KC_TRNS, KC_RGUI, KC_Y, KC_U, KC_I, KC_O, KC_P, DE_UE,
KC_TRNS,DE_HASH,DE_DLR, LALT(LSFT(KC_7)),DE_SLSH,KC_DOT, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(MDIA,DE_AE),
KC_TRNS,KC_TRNS,DE_LESS,DE_PERC,LALT(KC_7),LALT(KC_N),KC_TRNS, KC_RALT, KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_UP, KC_DOWN, LGUI(KC_LSFT), KC_RBRC, LT(SYMB,KC_BSLS),
KC_TRNS,KC_TRNS, ALL_T(DE_ACUT), KC_TRNS,
KC_TRNS, KC_PGUP,
KC_TRNS,KC_DEL,KC_TRNS, KC_PGDN, KC_ENT, KC_SPC),
// right hand [NUMB]=KEYMAP(
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, //left half
KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), LALT(KC_7), DE_HASH, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
DE_SLSH, DE_LPRN, DE_RPRN, LALT(KC_8), LALT(KC_9), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, DE_AMPR, KC_GRV, LSFT(KC_GRV), DE_DQOT, DE_QUOT, DE_QST, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
KC_TRNS,KC_DOT, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS KC_TRNS,
), KC_TRNS, KC_TRNS, KC_TRNS,
/* Keymap 2: Media and mouse keys //right half
* KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
* ,--------------------------------------------------. ,--------------------------------------------------. KC_TRNS, KC_UP, KC_7, KC_8, KC_9, LSFT(KC_RBRC), KC_F12,
* | | | | | | | | | | | | | | | Play | KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, KC_TRNS,
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| KC_TRNS, LSFT(KC_6), KC_1, KC_2, KC_3, LSFT(KC_7), KC_TRNS,
* | | | | MsUp | | | | | | | | | | | | KC_0, KC_DOT, KC_0, KC_EQL, KC_TRNS,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| KC_TRNS, KC_TRNS,
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | | KC_TRNS,
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| KC_TRNS, KC_TRNS, KC_TRNS),
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_WH_L, KC_WH_U, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MUTE, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS,
KC_VOLU, KC_VOLD, KC_LEFT, KC_DOWN, KC_RIGHT,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
/* Keymap 3: qwertz layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 |CMD-V | |CMD-C | 6 | 7 | 8 | 9 | 0 | ß |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TAB | Q | W | E | R | T | CMD | | CMD | Z | U | I | O | P | ü |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | ADNW | A | S | D | F | G |------| |------| H | J | K | L | ö | ä/L2 |
* |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------|
* | LShift |Y/Ctrl| X | C | V | B | | | | N | M | , | . |-/Ctrl| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |</L1| ^° |AltShf| Left | Right| | Up | Down | CMD-SHIFT | + | #/L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,---------------.
* | MDIA | Meh | | Hyper| NUM |
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Back-| Del |------| |------| Enter | Space|
* | Space| | End | | PgDn | | |
* `--------------------' `----------------------'
*/
[BASE] = KEYMAP( // layer 3 : default qwertz layout
// left hand
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LGUI(KC_V),
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LGUI,
TG(3), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LALT,
LT(SYMB,KC_GRV), DE_LESS, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
TG(2), MEH_T(LSFT(DE_ACUT)),
KC_HOME,
KC_BSPC,KC_DEL,KC_END,
// right hand
LGUI(KC_C), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_RGUI, KC_Y, KC_U, KC_I, KC_O, KC_P, DE_UE,
KC_H, KC_J, KC_K, KC_L, KC_SCLN,LT(MDIA,DE_AE),
KC_RALT,KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
KC_UP, KC_DOWN,LGUI(KC_LSFT),KC_RBRC, LT(SYMB,KC_BSLS),
ALL_T(DE_ACUT), TG(4),
KC_PGUP,
KC_PGDN,KC_ENT, KC_SPC
),
//numblock
KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, LSFT(KC_RBRC), KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, KC_TRNS,
KC_TRNS, LSFT(KC_6), KC_1, KC_2, KC_3, LSFT(KC_7), KC_TRNS,
KC_0,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
}; };
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols)
[2] = ACTION_LAYER_TAP_TOGGLE(ADNW) // FN2 - Momentary Layer 2 (ADNW)
}; };
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{ {
// MACRODOWN only works in this function static uint16_t start;
switch(id) { switch(id) {
case 0: case UNUSED:
//Macro: UNUSED//-----------------------
if (record->event.pressed) { if (record->event.pressed) {
register_code(KC_RSFT); register_code(KC_RSFT);
} else { } else {
unregister_code(KC_RSFT); unregister_code(KC_RSFT);
} }
break;
}
return MACRO_NONE;
break;
}
return MACRO_NONE;
}; };
// Runs just one time when the keyboard initializes. // Runs just one time when the keyboard initializes.
@ -234,31 +158,18 @@ void matrix_init_user(void) {
// Runs constantly in the background, in a loop. // Runs constantly in the background, in a loop.
void matrix_scan_user(void) { void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state); uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
ergodox_board_led_off(); default:
ergodox_right_led_1_off(); // none
ergodox_right_led_2_off(); break;
ergodox_right_led_3_off(); }
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_3_on();
break;
case 4:
ergodox_right_led_1_on();
ergodox_right_led_3_on();
//ergodox_board_led_on();
break;
default:
// none
break;
}
}; };

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

@ -0,0 +1,376 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
#include "keymap_extras/keymap_french.h"
#include "keymap_extras/keymap_neo2.h"
#include "keymap_extras/keymap_uk.h"
#include "keymap_extras/keymap_colemak.h"
#include "keymap_extras/keymap_french_osx.h"
#include "keymap_extras/keymap_nordic.h"
#include "keymap_extras/keymap_dvorak.h"
#include "keymap_extras/keymap_german.h"
#include "keymap_extras/keymap_norwegian.c"
#include "keymap_extras/keymap_fr_ch.h"
#include "keymap_extras/keymap_german_osx.h"
#include "keymap_extras/keymap_spanish.h"
#include "keymap_extras/keymap_bepo.h"
#define BASE 0
#define SYMB 1
#define MDIA 2
#define SMLY 3
#define NUMB 4
#define EGOS 5
#define SMLY_TOG_QUOT 0
#define M_TOGGLE_5 1
#define TGH_NUM 2
#define M_DE_OSX_PLUS_CTRLALT 3
#define SM_KISS 4
#define SM_FROWN 5
#define SM_CRY 6
#define SM_SMILE 7
#define SM_SMIRK 8
#define M_LGUI_SHFT 9
#define SM_HEART 10
#define TOG_HLD_MDIA 11
#define SM_LAUGH 12
#define SM_SAD 13
#define M_DE_OSX_CIRC_CTRLCMD 14
#define M_MEH_SH_ACUT 15
//Layout keymap.c generated with ErgodoxLayoutGenerator V1.0BETA1
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE]=KEYMAP(
//left half
KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, M(TGH_NUM),
KC_TAB, DE_OSX_Q, DE_OSX_W, DE_OSX_E, DE_OSX_R, DE_OSX_T, KC_LGUI,
KC_LALT, DE_OSX_A, DE_OSX_S, DE_OSX_D, DE_OSX_F, DE_OSX_G,
KC_LSFT, CTL_T(DE_OSX_Y), DE_OSX_X, DE_OSX_C, DE_OSX_V, DE_OSX_B, KC_LALT,
LT(SYMB,DE_OSX_LESS), M(M_DE_OSX_CIRC_CTRLCMD), M(M_DE_OSX_PLUS_CTRLALT), LSFT(KC_LCTRL), M(SMLY_TOG_QUOT),
KC_HOME, KC_END,
KC_PGUP,
KC_BSPC, KC_DEL, KC_PGDN,
//right half
M(TOG_HLD_MDIA), DE_OSX_6, DE_OSX_7, DE_OSX_8, DE_OSX_9, DE_OSX_0, DE_OSX_SS,
KC_RGUI, DE_OSX_Z, DE_OSX_U, DE_OSX_I, DE_OSX_O, DE_OSX_P, DE_OSX_UE,
DE_OSX_H, DE_OSX_J, DE_OSX_K, DE_OSX_L, DE_OSX_OE, ALT_T(DE_OSX_AE),
KC_RALT, DE_OSX_N, DE_OSX_M, DE_OSX_COMM, DE_OSX_DOT, CTL_T(DE_OSX_MINS), KC_RSFT,
MEH_T(DE_OSX_HASH), ALL_T(DE_OSX_ACUT), LGUI(KC_LSFT), LALT(KC_LSFT), LT(SYMB,DE_OSX_PLUS),
KC_LEFT, KC_RIGHT,
KC_UP,
KC_DOWN, KC_ENT, KC_SPC),
[SYMB]=KEYMAP(
//left half
KC_APPLICATION, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F5,
KC_TRNS, DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM, DE_OSX_QST, KC_TRNS, KC_TRNS,
KC_TRNS, DE_OSX_HASH, DE_OSX_DLR, DE_OSX_BSLS, DE_OSX_SLSH, KC_DOT,
KC_TRNS, KC_TRNS, DE_OSX_LESS, DE_OSX_PERC, DE_OSX_PIPE, DE_OSX_TILD, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_DEL, KC_TRNS,
//right half
KC_F6, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, DE_OSX_BSLS, DE_OSX_LBRC, DE_OSX_RBRC, DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM,
DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, DE_OSX_LCBR, DE_OSX_RCBR, DE_OSX_HASH,
KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
DE_OSX_QUOT, DE_OSX_DQOT, KC_TRNS, M(M_TOGGLE_5), KC_TRNS,
KC_F13, KC_F12,
KC_F14,
KC_F15, KC_TRNS, KC_TRNS),
[MDIA]=KEYMAP(
//left half
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D,
KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
//right half
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS,
KC_MUTE, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK),
[SMLY]=KEYMAP(
//left half
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
//right half
M(SM_SMILE), M(SM_SMIRK), M(SM_LAUGH), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, M(SM_FROWN), M(SM_SAD), M(SM_CRY), KC_TRNS, KC_TRNS, KC_TRNS,
M(SM_HEART), M(SM_KISS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS),
[NUMB]=KEYMAP(
//left half
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
//right half
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, DE_OSX_SLSH, KC_7, KC_8, KC_9, DE_OSX_ASTR, KC_F12,
DE_OSX_SLSH, KC_4, KC_5, KC_6, DE_OSX_PLUS, DE_OSX_MINS,
KC_TRNS, DE_OSX_PERC, KC_1, KC_2, KC_3, KC_TRNS, KC_TRNS,
KC_0, KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS),
[EGOS]=KEYMAP(
//left half
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_F1, KC_F2,
KC_F3,
KC_SPC, KC_LCTL, KC_F4,
//right half
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, M(M_TOGGLE_5), KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS),
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
static uint16_t start;
switch(id) {
case SMLY_TOG_QUOT:
//Macro: SMLY_TOG_QUOT//-----------------------
if (record->event.pressed) {
start = timer_read();
layer_state ^= (1<<SMLY);
layer_state &= (1<<SMLY);
return MACRO_NONE; } else {
layer_state ^= (1<<SMLY);
layer_state &= (1<<SMLY);
if (timer_elapsed(start) >150) {
return MACRO_NONE;
} else {
return MACRO(DOWN(KC_LSFT),TYPE(DE_OSX_HASH),UP(KC_LSFT),END);
}
}
break;
case M_TOGGLE_5:
//Macro: M_TOGGLE_5//-----------------------
if (record->event.pressed){
layer_state ^= (1<<5);
layer_state &= (1<<5);
}
break;
case TGH_NUM:
//Macro: TGH_NUM//-----------------------
if (record->event.pressed){
start = timer_read();
layer_state ^=(1<<NUMB);
layer_state &=(1<<NUMB);
} else {
if (timer_elapsed(start) > 150) {
layer_state^=(1<<NUMB);
layer_state&=(1<<NUMB);
}
}
return MACRO_NONE;
break;
case M_DE_OSX_PLUS_CTRLALT:
//Macro: M_DE_OSX_PLUS_CTRLALT//-----------------------
if (record->event.pressed) {
start = timer_read();
return MACRO(DOWN(KC_LCTRL),DOWN(KC_LALT),END);
} else {
if (timer_elapsed(start) >150) {
return MACRO(U(LCTRL),U(LALT),END);
} else {
return MACRO(UP(KC_LCTRL),UP(KC_LALT),TYPE(KC_RBRC),END);
}
}
break;
case SM_KISS:
//Macro: SM_KISS//-----------------------
if (record->event.pressed) {
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_RBRC),UP(KC_LSFT),END);
}
break;
case SM_FROWN:
//Macro: SM_FROWN//-----------------------
if (record->event.pressed) {
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LALT),TYPE(KC_8),UP(KC_LALT),END);
}
break;
case SM_CRY:
//Macro: SM_CRY//-----------------------
if (record->event.pressed) {
return MACRO(DOWN(KC_LSFT),TYPE(KC_COMM),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_8),UP(KC_LSFT),END);
}
break;
case SM_SMILE:
//Macro: SM_SMILE//-----------------------
if (record->event.pressed) {
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_9),UP(KC_LSFT),END);
}
break;
case SM_SMIRK:
//Macro: SM_SMIRK//-----------------------
if (record->event.pressed) {
return MACRO(DOWN(KC_LSFT),TYPE(KC_COMM),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_9),UP(KC_LSFT),END);
}
break;
case M_LGUI_SHFT:
//Macro: M_LGUI_SHFT//-----------------------
if (record->event.pressed){
return MACRO(DOWN(KC_LGUI),DOWN(KC_LSFT),END);
}else{
return MACRO(UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),U(LGUI),U(LSFT),END);
}
break;
case SM_HEART:
//Macro: SM_HEART//-----------------------
if (record->event.pressed) {
return MACRO(TYPE(KC_GRV),TYPE(KC_3),END);
}
break;
case TOG_HLD_MDIA:
//Macro: TOG_HLD_MDIA//-----------------------
if (record->event.pressed){
start = timer_read();
layer_state ^=(1<<MDIA);
layer_state &=(1<<MDIA);
} else {
if (timer_elapsed(start) > 150) {
layer_state^=(1<<MDIA);
layer_state&=(1<<MDIA);
}
}
return MACRO_NONE;
break;
case SM_LAUGH:
//Macro: SM_LAUGH//-----------------------
if (record->event.pressed) {
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_D),UP(KC_LSFT),END);
}
break;
case SM_SAD:
//Macro: SM_SAD//-----------------------
if (record->event.pressed) {
return MACRO(DOWN(KC_LSFT),TYPE(KC_DOT),UP(KC_LSFT),TYPE(KC_SLSH),DOWN(KC_LSFT),TYPE(KC_8),UP(KC_LSFT),END);
}
break;
case M_DE_OSX_CIRC_CTRLCMD:
//Macro: M_DE_OSX_CIRC_CTRLCMD//-----------------------
if (record->event.pressed) {
start = timer_read();
return MACRO(DOWN(KC_LCTRL),DOWN(KC_LGUI),END);
} else {
if (timer_elapsed(start) >150) {
return MACRO(U(LCTRL),U(LGUI),END);
} else {
return MACRO(UP(KC_LCTRL),UP(KC_LGUI),TYPE(KC_NUBS),END);
}
}
break;
case M_MEH_SH_ACUT:
//Macro: M_MEH_SH_ACUT//-----------------------
if (record->event.pressed) {
start = timer_read();
return MACRO(DOWN(KC_LCTRL),DOWN(KC_LSFT),DOWN(KC_LALT),END);
} else {
if (timer_elapsed(start) >150) {
return MACRO(U(LCTRL),U(LSFT),U(LALT),END);
} else {
return MACRO(UP(KC_LCTRL),UP(KC_LALT),TYPE(DE_OSX_ACUT),UP(KC_LSFT),END);
}
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case SYMB:
ergodox_right_led_1_on();
break;
case MDIA:
ergodox_right_led_2_on();
break;
case NUMB:
ergodox_right_led_3_on();
break;
case EGOS:
ergodox_right_led_1_on();
ergodox_right_led_2_on();
ergodox_right_led_3_on();
break;
default:
// none
break;
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

@ -0,0 +1,229 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | F5 | |Hypr+M| 6 | 7 | 8 | 9 | 0 | Mute |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LGui | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| SYMB | | MDIA |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Ca/Ctl| { | ( | | | : | | - | = | ) | } |C`/Ctl|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | LGA | LAlt | | RAlt | Play |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* |Backsp| Esc |------| |------|Enter |Space |
* |ace | | End | | PgDn | | |
* `--------------------' `--------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = KEYMAP( // layer 0 : default
// left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
KC_LGUI, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, TG(SYMB),
F(0), KC_LCBR, KC_LPRN,KC_PIPE,KC_COLN,
LGUI(KC_LALT), KC_LALT,
KC_HOME,
KC_BSPC, KC_ESC, KC_END,
// right hand
HYPR(KC_M), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MUTE,
KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
TG(MDIA), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_MINS, KC_EQL, KC_RPRN, KC_RCBR, F(1),
KC_RALT, KC_MPLY,
KC_PGUP,
KC_PGDN, KC_ENT, KC_SPC
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | | | | | | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Left | Down | Up | Right| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = KEYMAP(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------|MsLeft|MsDown| MsUp |MsRght| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |VolUp |VolDn | Prev | Next | | | LClk | RClk | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_MACRO_TAP(0), // FN0 - Ctrl + a (For screen/tmux)
[1] = ACTION_MACRO_TAP(1) // FN1 - Ctrl + ` (For quake style console)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is.
{
switch(id) {
case 0:
if (record->event.pressed) {
if (record->tap.count) {
if (record->tap.interrupted) {
record->tap.count = 0;
// hold press action
register_code(KC_LCTL);
} else {
// tap press action
return MACRO( D(LCTL), T(A), U(LCTL), END );
}
} else {
// hold press action
register_code(KC_LCTL);
}
} else {
if (record->tap.count) {
// tap release action
} else {
// hold release action
unregister_code(KC_LCTL);
}
record->tap.count = 0;
}
break;
case 1:
if (record->event.pressed) {
if (record->tap.count) {
if (record->tap.interrupted) {
record->tap.count = 0;
// hold press action
register_code(KC_RCTL);
} else {
// tap press action
return MACRO( DOWN(KC_RCTL), TYPE(KC_GRV), UP(KC_RCTL), END );
}
} else {
// hold press action
register_code(KC_RCTL);
}
} else {
if (record->tap.count) {
// tap release action
} else {
// hold release action
unregister_code(KC_RCTL);
}
record->tap.count = 0;
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

@ -0,0 +1,1159 @@
:100000000C946E020C94B2020C94B2020C94B202E4
:100010000C94B2020C94B2020C94B2020C94B20290
:100020000C94B2020C94B2020C94A60C0C94780DB1
:100030000C94B2020C94B2020C94B2020C94B20270
:100040000C94B2020C9442220C94B2020C94B202B0
:100050000C94B2020C94D11B0C94B2020C94B20218
:100060000C94B2020C94B2020C94B2020C94B20240
:100070000C94B2020C94B2020C94B2020C94B20230
:100080000C94B2020C94B2020C94B2020C94B20220
:100090000C94B2020C94B2020C94B2020C94B20210
:1000A0000C94B2020C94B2020C94B202E50D070E4D
:1000B000F50E070EF50E4C0E6F0EF50EC40ED70E94
:1000C000C311C31100120012431281129A149A1420
:1000D0009A129A149B139B136E149A149A148514F3
:1000E00001E40135023502E40001E00104020402EA
:1000F000E00000C801C835002B00E300E10000204B
:1001000000001E00140004001D002F024D001F00FF
:100110001A0016001B002602290020000800070014
:10012000060031022A0021001500090019003302DF
:100130004A00220017000A0005000000E2083E0005
:100140002F00000001540000E200100F30000000FA
:1001500002540000E60023001C000B001100000008
:10016000AE00240018000D0010002D004B002500EB
:100170000C000E0036002E002C00260012000F008E
:100180003700270228002700130033003800300210
:100190004E00A80031003400E500012000000100FD
:1001A000010001000100010000003A001E022002CF
:1001B0002202010001003B001F0221022302010074
:1001C00001003C002F0226022F00010001003D002B
:1001D000300227023000010001003E0031023500EC
:1001E00035020000010001000100000001000000D4
:1001F00001000100010000000100000001003F00BB
:100200000100500001000000010040000100510009
:100210000100010001004100010052000100010045
:100220000100420001004F000100010001004300F5
:10023000010001000100010001004400450001002F
:100240000100010000000100010001000100A900FF
:1002500000000100010001000100AA0001000100EE
:10026000010001000100AC000100010001000100DB
:100270000100AB00010001000100010001000100CC
:100280000100010001000100010000000100010067
:100290000100000001000000010001000100000059
:1002A00001000000010001000100F2000100000057
:1002B000010001000100F1000100F4000100010053
:1002C0000100F0000100F500B60001000100F3009C
:1002D0000100010001000100010001000100010016
:1002E00001000100010001000100010000001603EF
:1002F0004500720067006F0044006F007800200026
:1003000045005A00000016034500720067006F00A8
:1003100044006F007800200045005A0000000403EC
:10032000090409026D00040100A0FA09040000019B
:1003300003010100092111010001223F000705818D
:100340000308000A09040100010301020009211148
:10035000010001224D000705820308000A0904027A
:1003600000010300000009211101000122360007ED
:1003700005830308000A09040300010300000009C3
:100380002111010001223900070584031000011228
:1003900001100100000008EDFE071301000102003A
:1003A0000105010906A101050719E029E715002546
:1003B0000195087501810205081901290595057542
:1003C000019102950175039101050719002977151F
:1003D000002501957875018102C005010980A10100
:1003E000850216010026B7001A01002AB700751011
:1003F00095018100C0050C0901A1018503160100CA
:10040000269C021A01002A9C02751095018100C0E9
:1004100005010902A1010901A10005091901290528
:10042000150025019505750181029501750381016E
:100430000501093009311581257F9502750881066E
:1004400009381581257F950175088106050C0A3844
:10045000021581257F950175088106C0C005010937
:1004600006A101050719E029E71500250195087582
:100470000181029501750881010508190129059579
:100480000575019102950175039101050719002970
:10049000FF150025FF950675088100C000000000CB
:1004A00000000000000000010204060A0F17202CC3
:1004B0003A4A5D71879DB3C7DAE9F5FCFFFCF5E9BF
:1004C000DAC7B39D87715D4A3A2C20170F0A0604DC
:1004D00002010000000000000000000011241FBE07
:1004E000CFEFDAE0DEBFCDBF04B603FE24C08091BB
:1004F000EE019091EF01A091F001B091F1018730F0
:10050000904BA740B04BB9F41092EE011092EF015E
:100510001092F0011092F10114BE84B7877F84BF5E
:1005200088E10FB6F89480936000109260000FBECF
:10053000E0E0FFE3099511E0A0E0B1E0E2E1F8E4DA
:1005400002C005900D92A433B107D9F711E0A4E3DE
:10055000B1E001C01D92AE3EB107E1F70E94EA0989
:100560000C9407240C940000CF93DF93EC016623D6
:1005700019F06130C9F015C09A818D81992349F035
:10058000982F907F21F080FF22C08F708D8380EEA6
:1005900017C0807F19F480EE0E941F118D818F702B
:1005A0008D8380E090E018C09A818D81992359F065
:1005B000982F907F21F080FF0DC08F708D8384EE87
:1005C0000E945710EECF807F49F784EEE5CF89EE89
:1005D00090E002C080EE90E0DF91CF910895089501
:1005E0006091B1017091B2018091B3019091B40119
:1005F0000E94FD1A56985E9825982D9826982E9858
:1006000027982F98813019F0823021F00895259A8B
:100610002D9A0895269A2E9A08950C94F0025698D1
:100620005E9825982D9826982E9827982F988FEFCA
:1006300090E0909389008093880090938B00809342
:100640008A0090938D0080938C00259A2D9A2FEF2D
:1006500080E792E0215080409040E1F700C0000028
:10066000269A2E9A2FEF80E792E02150804090400A
:10067000E1F700C00000279A2F9A2FEF80E792E061
:10068000215080409040E1F700C0000025982D984F
:100690002FEF80E792E0215080409040E1F700C0CA
:1006A000000026982E982FEF80E792E0215080409E
:1006B0009040E1F700C0000027982F9856985E9868
:1006C00025982D9826982E9827982F98089589EA8E
:1006D0008093800089E08093810024982C983F9833
:1006E0008AB18F748AB96E98479A8BB1806B8BB937
:1006F000769A0E940F030C94EF0280E2809300012F
:100700008091340181110EC00E94CC0381E080935E
:1007100034012FEF83ED90E3215080409040E1F7CA
:1007200000C0000080E40E94D20380930001811188
:100730002EC00E94FC0380930001811128C00E94FA
:10074000FC0380930001811122C08FE30E94FC030F
:100750008093000181111BC00E94F40380E40E9479
:10076000D20380930001811112C08CE00E94FC032F
:100770008093000181110BC00E94FC038093000153
:10078000811105C08FE30E94FC03809300010E9449
:10079000F4038091000108951092B9008AE08093DB
:1007A000B800089594EA9093BC009091BC0097FF24
:1007B000FCCF9091B900987F983021F0903111F0E2
:1007C00081E008958093BB0084E88093BC00809111
:1007D000BC0087FFFCCF8091B900887F883111F081
:1007E000803471F780E0089584E98093BC008091A3
:1007F000BC0084FDFCCF08958093BB0084E8809307
:10080000BC008091BC0087FFFCCF9091B900987F1D
:1008100081E0983209F480E0089584E88093BC0078
:100820008091BC0087FFFCCF8091BB000895809130
:100830000001811115C080E40E94D2038093000161
:1008400081110CC082E10E94FC03809300018111A0
:1008500005C08FEF0E94FC03809300010E94F40307
:1008600084B1807F84B985B1807F85B98AB1837F67
:100870008AB98BB1837F8BB93E98469808950E94C0
:100880007D03809300010E94170480B38C7080BBAD
:1008900081B3836F81BBA6E3B1E0E4E4F1E08EE0D5
:1008A0008E0F11921D928E13FCCF0C946703BF9292
:1008B000CF92DF92EF92FF920F931F93CF93DF932C
:1008C00080910001882379F0809135018F5F8093BA
:1008D0003501811108C00E947D03809300018111C0
:1008E00002C00E940F0306E311E0C0E0D0E0DD2467
:1008F000D39482E0C82EEE24E394F12CC730D105C6
:1009000000F580910001811164C080E40E94D2034F
:1009100080930001811112C082E10E94FC03809348
:10092000000181110BC0C7010C2E01C0880F0A9471
:10093000EAF780950E94FC03809300010E94F40373
:1009400048C0CA30A1F028F4C83059F0C93061F06D
:1009500005C0CC3089F070F0CD3089F0209A28980D
:1009600010C0219A29980DC0229A2A980AC0239A69
:100970002B9807C0529A01C0539A5B9802C03E9AC6
:10098000469890EA9A95F1F79FB1799902C082E072
:1009900001C080E091709D25982B7C9902C084E075
:1009A00001C080E0892B7D9902C038E001C030E0B1
:1009B000832B7E9902C020E101C020E0822B9FB1F1
:1009C0009095991F9927991F9295990F907E892B41
:1009D0000FC080910001811149C080E40E94D203C0
:1009E00080930001882379F1B12C0E94F4038B2DB0
:1009F000F8019081981719F08083C09201010E943C
:100A0000170421960F5F1F4FCE30D10509F076CF26
:100A100080910101882361F1815080930101882335
:100A200039F08FE99FE00197F1F700C0000020C086
:100A3000A4E4B1E0E6E3F1E0CF01825F91919D9300
:100A40008E13FCCF15C083E10E94FC03809300014C
:100A50008111CACF81E40E94D203809300018111E9
:100A6000C3CF0E940D04B82EB094BFCF80E0C0CF9A
:100A70000E940D0381E0DF91CF911F910F91FF90B4
:100A8000EF90DF90CF90BF900895E82FF0E0EC5BFF
:100A9000FE4F808108950895089596E0799FF001B2
:100AA000112494E5899FE00DF11D1124E60FF11D3D
:100AB000EE0FFF1FEA50FF4F859194910895880F24
:100AC000991FFC01EE58F040859194910895880F8C
:100AD000991FFC01EE50FF4F8591949108950F935B
:100AE0001F93CF93DF93EC018115904350F5C1150F
:100AF00080E2D80708F0B3C0CB3BD10590F4C83AE8
:100B0000D10508F05AC0C53AD10508F04BC0C43031
:100B1000D10508F0BBC1219709F0B5C101E010E093
:100B2000F5C1CF3FD10511F008F0B0C1C03FD105EC
:100B300008F092C0CE01805E9109089708F4A6C122
:100B4000A2C1C11591E5D907A8F4C23020E5D207AA
:100B500008F09EC0C11580E5D80709F485C008F0EB
:100B600091C0C11520E4D20708F08DC1DD278E01A8
:100B7000106CCCC1C11580E8D80758F4C11590E7B6
:100B8000D90708F07CC1C11520E6D20708F422C1BC
:100B90007AC1C11580E9D80708F075C1DF708E01F0
:100BA000106AB4C1C53AD10509F472C1C63AD1057B
:100BB00009F071C102E810E4A9C1C83AD10509F4ED
:100BC0006DC1C93AD10509F46CC1CA3AD10509F41D
:100BD0006BC1CB3AD10509F46AC1CC3AD10509F40D
:100BE00069C1CD3AD10509F468C1C03BD10509F40A
:100BF00067C1CE3AD10509F466C1CF3AD10509F4EF
:100C000065C1C13BD10509F464C1C23BD10509F4FA
:100C100063C1C33BD10509F462C1C43BD10509F4EA
:100C200061C1C53BD10509F460C1C63BD10509F4DA
:100C30005FC1C73BD10509F45EC1C83BD10509F4CA
:100C40005DC1C93BD10509F45CC1CA3BD10509F4BA
:100C50005BC100E014E45AC18E01106557C1CE019A
:100C60009F700E94670553C10E94BE149FEF24E34A
:100C70008CE0915020408040E1F700C000000E94CD
:100C8000F61B44C18091CD0181608093CD013EC1AE
:100C90000E949F1D811102C00E94851D0E94BC1DE3
:100CA00090E09093EE018093ED01C23090E5D9077A
:100CB00021F48091ED01816086C0C43020E5D20727
:100CC00021F48091ED0182607EC0C63080E5D807B6
:100CD00021F48091ED01846076C0C83090E5D90799
:100CE00019F48091ED0127C0CA3020E5D20721F424
:100CF0008091ED01806167C0CC3080E5D80721F498
:100D00008091ED0180625FC0CE3090E5D90721F47B
:100D10008091ED01806457C0C03120E5D20721F4F5
:100D20008091ED0180684FC0C23180E5D80729F479
:100D30008091ED018460886046C0C33090E5D9079A
:100D400021F48091ED018E7F3EC0C53020E5D207B1
:100D500021F48091ED018D7F36C0C73080E5D80742
:100D600021F48091ED018B7F2EC0C93090E5D90729
:100D700019F48091ED0126C0CB3020E5D20721F493
:100D80008091ED018F7E1FC0CD3080E5D80721F422
:100D90008091ED018F7D17C0CF3090E5D90721F408
:100DA0008091ED018F7B0FC0C13120E5D20721F486
:100DB0008091ED018F7707C0C331D04531F4809128
:100DC000ED018B7F877F8093ED018091ED010E9483
:100DD000C01D9CC08D2F99278F7099278130910558
:100DE000D9F49E012370332702C0880F991F2A95DA
:100DF000E2F79C688E0144E0000F111F4A95E1F76D
:100E000000271370802B912B53E0CC0FDD1F5A95D8
:100E1000E1F7C076DD272FC08230910531F4DC2F59
:100E2000CC278E01016F106A71C08330910569F47F
:100E3000CE018370992701E010E002C0000F111F5E
:100E40008A95E2F7C8019C680FC0049709F05EC05C
:100E5000CE018370992701E010E002C0000F111F3E
:100E60008A95E2F7C8019A6823E0CC0FDD1F2A9526
:100E7000E1F7C07ED7708C010C2B1D2B47C0DF70B3
:100E80008E01106243C000E010E040C08E013EC001
:100E900001E810E43BC003E810E438C002EE14E4BB
:100EA00035C009EE14E432C00AEE14E42FC005EB9D
:100EB00014E42CC006EB14E429C007EB14E426C0AC
:100EC0000CEC14E423C00DEC14E420C003E815E49A
:100ED0001DC00AE815E41AC002E915E417C004E9C8
:100EE00015E414C001E216E411C003E216E40EC0DA
:100EF00004E216E40BC005E216E408C006E216E4BC
:100F000005C007E216E402C00AE216E4C801DF9158
:100F1000CF911F910F91089596E0799FF0011124D0
:100F200094E5899FE00DF11D1124E60FF11DEE0FF0
:100F3000FF1FEA50FF4F85919491803E9105E0F4A8
:100F4000803C910558F58133910509F46FC048F450
:100F50008932910509F463C08A32910509F46DC0A4
:100F600072C089339105E9F082389105D1F085335B
:100F7000910509F44DC067C0833E910581F138F4B5
:100F8000803E9105B9F0823E9105D9F05CC0863E65
:100F9000910561F1873E9105A1F155C00E945F0561
:100FA00008952091ED0120FD02C021FF4CC080EE8C
:100FB00090E049C08091ED0180FFF9CF89E390E096
:100FC00042C08091ED0182FF0EC08091ED0184FF4F
:100FD00003C080E090E037C083EE90E034C08091A1
:100FE000ED0182FFF2CF82EE90E02DC08091ED0105
:100FF00083FF0BC08091ED0184FDEBCF87EE90E085
:1010000022C08091ED0183FFF5CF86EE90E01BC0FA
:101010008091ED0185FF07C089E290E014C08091C6
:10102000ED0185FFF9CF85E390E00DC08091ED01E2
:1010300086FF07C08AE290E006C08091ED0186FF3E
:10104000F9CF81E390E00E946F05089508950C9414
:101050002608809162010895CF93DF9300D01F92FC
:10106000CDB7DEB79C018091E401843019F593E09F
:1010700099833B832A839093E9008FEF9091E80056
:10108000815095FD06C095ED9A95F1F7000081110C
:10109000F5CF8091E80085FF0DC040E050E063E0AF
:1010A00070E0CE0101960E94960A8091E8008E774A
:1010B0008093E8000F900F900F90DF91CF910895EB
:1010C000CF93DF9300D01F92CDB7DEB72091E4011C
:1010D000243021F522E029839B838A8383E0809357
:1010E000E9008FEF9091E800815095FD06C095EDE5
:1010F0009A95F1F700008111F5CF8091E80085FF06
:101100000DC040E050E063E070E0CE0101960E9427
:10111000960A8091E8008E778093E8000F900F90F8
:101120000F90DF91CF9108952091E4012430F1F4E4
:1011300022E02093E9002FEF3091E800215035FDA7
:1011400006C035ED3A95F1F700002111F5CF209159
:10115000E80025FF0BC040E050E065E070E00E9431
:10116000960A8091E8008E778093E8000895CF93E7
:10117000DF93EC019091E401943009F046C0809136
:101180000C018823D9F080910D018823B9F0909348
:10119000E9008FEF9091E800815095FD06C095E140
:1011A0009A95F1F700008111F5CF8091E80085FF55
:1011B0002CC040E050E060E170E017C081E0809317
:1011C000E9008FEF9091E800815095FD06C095ED04
:1011D0009A95F1F700008111F5CF8091E80085FF25
:1011E00014C040E050E068E070E0CE010E94960A32
:1011F0008091E8008E778093E80080E1FE01A2E50F
:10120000B1E001900D928A95E1F7DF91CF910895B9
:101210008091E301811109C00E942B0C0E94880C6F
:101220008091E20084608093E20008951092E301CF
:10123000089508950C942F220E948C1B0E94352241
:101240000E942E0F0C94270842E061EC81E00E947E
:10125000A50B42E061EC82E00E94A50B42E061EC4C
:1012600083E00E94A50B42E161EC84E00C94A50BA5
:101270008091E601833009F455C030F4813071F07B
:10128000823009F48EC008958A3009F47AC08B3018
:1012900009F460C0893009F09CC020C08091E5014C
:1012A000813A09F096C08091E800877F8093E8003A
:1012B0008091E9019091EA01892B21F460E182E5B6
:1012C00091E003C060E080E090E070E00E94E10AFD
:1012D0008091E8008B778093E80008958091E50184
:1012E000813209F076C08091E9019091EA0100977E
:1012F00019F0039709F06DC08091E800877F809313
:10130000E8008091E80082FD05C08091E401811130
:10131000F8CF5FC08091F100809362018091E80076
:101320008B7753C08091E501813A09F052C08091DA
:10133000E9019091EA01892B09F04BC08091E80006
:10134000877F8093E8008091E80080FFFCCF809148
:101350000C0136C08091E5018132D9F58091E90117
:101360009091EA01892BA9F58091E800877F80930D
:10137000E8000E94DA0B8091E70180930C010C9445
:10138000BE148091E501813221F58091E800877FCC
:101390008093E8000E94DA0B8091E801809363015A
:1013A00008958091E501813AA1F48091E800877F5A
:1013B0008093E8008091E80080FFFCCF809163017A
:1013C0008093F1008091E8008E778093E8000C9480
:1013D000DA0B089584B7877F84BF88E10FB6F8944D
:1013E00080936000109260000FBE90E080E80FB61E
:1013F000F89480936100909361000FBE0E947D0F6E
:101400000E942B0C0E94880C8091E20084608093E3
:10141000E20078940E940E0F0E947F0F82E091E01C
:101420000E94290F0E941D228091E401853069F4F9
:101430000E944D1B8091E2018823B1F30E94781B2A
:10144000882391F30E94800AEFCF0E94850FECCF92
:10145000292F332723303105C9F064F421303105B9
:1014600081F02230310509F043C08DE690E022E2A0
:1014700033E042C021323105F1F02232310541F131
:1014800037C082E190E02FE833E036C09927813001
:10149000910541F08230910541F0892B49F5EEE14B
:1014A000F3E005C0E6E0F3E002C0EEEEF2E0849186
:1014B00090E09F0121C06430D8F4E62FF0E0EE0FF9
:1014C000FF1FEE5DFE4F2081318189E090E014C066
:1014D000643070F470E0FB01EE0FFF1FE65EFE4F1C
:1014E00020813181FB01EA5EFE4F808190E004C0E3
:1014F00080E090E020E030E0FA013183208308951D
:1015000080E189BD82E189BD09B400FEFDCF8091F3
:10151000D8008F7D8093D8008091E0008260809316
:10152000E0008091E00081FDFCCF0895CF92DF9232
:10153000EF92FF920F931F93CF93DF93EC018B01F8
:101540006A010E94F90B811133C0C114D10439F032
:10155000F60180819181081B190BC80FD91FE12C5E
:10156000F12C0115110519F18091E80085FD16C0D7
:101570008091E8008E778093E800C114D10449F08F
:10158000F60180819181E80EF91EF182E08285E00A
:101590000FC00E94F90B882321F30AC08991809320
:1015A000F10001501109FFEFEF1AFF0ADACF80E0D6
:1015B000DF91CF911F910F91FF90EF90DF90CF902F
:1015C00008952091EB013091EC012617370748F080
:1015D0006115710539F42091E8002E772093E80019
:1015E00001C0B90140E061157105A9F12091E40144
:1015F000222309F443C0253009F442C02091E800B9
:1016000023FD40C02091E80022FD32C02091E80077
:1016100020FFE9CF4091F3002091F20030E0342B1D
:10162000FC01CF016115710559F02830310540F4F6
:1016300081918093F100615071092F5F3F4FF1CF8D
:1016400041E02830310509F040E02091E8002E7794
:101650002093E800C8CF4111C9CF0AC08091E401AE
:10166000882361F0853061F08091E80083FD0AC035
:101670008091E80082FFF2CF80E0089582E0089533
:1016800083E0089581E008952091EB013091EC0111
:101690002617370748F06115710539F42091E800E5
:1016A0002E772093E80001C0B901FC0120E061150C
:1016B000710591F18091E401882309F440C08530DF
:1016C00009F43FC08091E80083FD3DC08091E800AF
:1016D00082FD2FC08091E80080FFE9CF2091F300C8
:1016E0008091F20090E0922B6115710559F08830DD
:1016F000910540F424912093F100319661507109D5
:101700000196F2CF21E0089709F020E08091E800EF
:101710008E778093E800CBCF2111CCCF0AC0809187
:10172000E401882361F0853061F08091E80083FD59
:101730000AC08091E80082FFF2CF80E0089582E045
:10174000089583E0089581E00895982F973058F523
:101750009093E900981739F07091EC002091ED001A
:101760005091F00003C0242F762F50E021FF19C0C4
:101770003091EB003E7F3093EB003091ED003D7FE8
:101780003093ED003091EB0031603093EB007093BB
:10179000EC002093ED005093F0002091EE0027FF25
:1017A00007C09F5FD3CF8F708093E90081E00895D9
:1017B00080E008958091E50187FF11C08091E800E5
:1017C00082FD05C08091E4018111F8CF11C08091A4
:1017D000E8008B770BC08091E401882349F0809169
:1017E000E80080FFF8CF8091E8008E778093E800D2
:1017F00008952091E4003091E50095E64091EC00D9
:10180000842F817040FF22C08091E80080FD1CC0C1
:101810008091E401882391F0853091F08091EB0074
:1018200085FD10C04091E4005091E5004217530738
:1018300029F39A01915011F784E0089582E0089508
:1018400083E0089581E0089580E008954091E800E4
:1018500042FFDECF08950E94990C0E94A10CE0EE99
:10186000F0E0808181608083E8EDF0E080818F7717
:10187000808319BCA7EDB0E08C918E7F8C93808122
:101880008F7E80831092E30108950F931F93CF936F
:10189000DF930E94990C0E94A10CC8EDD0E08881D2
:1018A0008F77888388818068888388818F7D88830B
:1018B00019BC1092E4011092E0011092E201109222
:1018C000E10100EE10E0F80180818B7F8083888148
:1018D0008160888342E060E080E00E94A50BE1EE39
:1018E000F0E080818E7F8083E2EEF0E08081816095
:1018F0008083808188608083F80180818E7F8083EF
:10190000888180618883DF91CF911F910F91089525
:10191000E8EDF0E080818F7E8083E7EDF0E080816C
:101920008160808384E082BF81E08093E3010C9436
:10193000450CE8EDF0E080818E7F80831092E2001C
:1019400008951092DA001092E10008951F920F920C
:101950000FB60F9211242F933F934F935F936F9382
:101960007F938F939F93AF93BF93EF93FF93809158
:10197000E10082FF0BC08091E20082FF07C08091EE
:10198000E1008B7F8093E1000E940D0F8091DA00CF
:1019900080FF1FC08091D80080FF1BC08091DA00BB
:1019A0008E7F8093DA008091D90080FF0DC080E1A6
:1019B00089BD82E189BD09B400FEFDCF81E080933D
:1019C000E4010E94080905C019BC1092E4010E94BC
:1019D00016098091E10080FF19C08091E20080FF2C
:1019E00015C08091E2008E7F8093E2008091E2003A
:1019F00080618093E2008091D80080628093D8005B
:101A000019BC85E08093E4010E941A098091E100ED
:101A100084FF30C08091E20084FF2CC080E189BD4A
:101A200082E189BD09B400FEFDCF8091D8008F7D91
:101A30008093D8008091E1008F7E8093E1008091B7
:101A4000E2008F7E8093E2008091E20081608093CB
:101A5000E2008091E001882311F084E007C08091CA
:101A6000E30087FD02C081E001C083E08093E401D0
:101A70000E941C098091E10083FF29C08091E2004F
:101A800083FF25C08091E100877F8093E10082E0A1
:101A90008093E4011092E0018091E1008E7F8093B9
:101AA000E1008091E2008E7F8093E2008091E2006D
:101AB00080618093E20042E060E080E00E94A50B3C
:101AC0008091F00088608093F0000E941909FF91D6
:101AD000EF91BF91AF919F918F917F916F915F91A6
:101AE0004F913F912F910F900FBE0F901F9018951F
:101AF0001F920F920FB60F9211242F933F934F9383
:101B00005F936F937F938F939F93AF93BF93CF9385
:101B1000DF93EF93FF93C091E900CF708091EC00C9
:101B2000D82FD17080FDD0E81092E9008091F000AC
:101B3000877F8093F00078940E94BC0D1092E9009A
:101B40008091F00088608093F000CD2BCF70C0931F
:101B5000E900FF91EF91DF91CF91BF91AF919F91FC
:101B60008F917F916F915F914F913F912F910F9046
:101B70000FBE0F901F9018951F93CF93DF93CDB793
:101B8000DEB7AA970FB6F894DEBF0FBECDBFE5EE65
:101B9000F1E088E08E0F9091F10091938E13FBCFCE
:101BA0000E9438098091E80083FF1FC18091E50100
:101BB0009091E601492F50E04A30510508F015C1D7
:101BC000FA01EA5AFF4F0C94B723803881F082382B
:101BD00009F00BC18091E9018F708093E900809139
:101BE000EB0085FB882780F91092E90006C0809100
:101BF000E1019091E201911182609091E800977F5C
:101C00009093E8008093F1001092F100C8C0282F53
:101C10002D7F09F0EAC0882319F0823061F0E5C019
:101C20008091E701813009F0E0C0933009F080E055
:101C30008093E2012BC08091E701811127C0809140
:101C4000E9018F7009F4D1C08093E9002091EB0085
:101C500020FF1CC0933021F48091EB00806214C0FF
:101C60009091EB0090619093EB0021E030E0A901AE
:101C700002C0440F551F8A95E2F74093EA00109284
:101C8000EA008091EB0088608093EB001092E900FD
:101C90008091E800877F86C08111A7C01091E7017D
:101CA0001F778091E3008078812B8093E3008091FF
:101CB000E800877F8093E8000E94DA0B8091E800BB
:101CC00080FFFCCF8091E30080688093E3001111D6
:101CD00002C082E001C083E08093E40186C08058A6
:101CE000823008F082C08091E7019091E8018C3D3C
:101CF00053E0950779F583E08A838AE289834FB7B9
:101D0000F894DE01139620E03EE051E2E32FF0E08C
:101D100050935700E49120FF03C0E295EF703F5FBE
:101D2000EF708E2F90E0EA3010F0C79601C0C09699
:101D30008D939D932F5F243149F74FBF8091E80029
:101D4000877F8093E8006AE270E0CE0101960E94EE
:101D5000E10A14C0AE014F5F5F4F6091E9010E943C
:101D6000280ABC01892B09F440C09091E800977FB4
:101D70009093E80089819A810E94440B8091E80049
:101D80008B778093E80031C0803879F58091E80046
:101D9000877F8093E8008091E0018093F10080913B
:101DA000E8008E778093E8000E94DA0B1EC0811154
:101DB0001CC09091E7019230C0F48091E800877FC9
:101DC0008093E8009093E0010E94DA0B8091E0019B
:101DD000811106C08091E30087FD02C081E001C04F
:101DE00084E08093E4010E9424098091E80083FF4D
:101DF0000AC08091E800877F8093E8008091EB0023
:101E000080628093EB00AA960FB6F894DEBF0FBEF7
:101E1000CDBFDF91CF911F9108950895CF93809109
:101E2000E4018823A1F0C091E900CF709091EC000B
:101E3000892F817090FD80E8C82B1092E900809175
:101E4000E80083FD0E94BC0DCF70C093E900CF91E4
:101E5000089590936901809368010895E091680165
:101E6000F0916901309721F00190F081E02D099403
:101E700080E00895E0916801F0916901309721F0C8
:101E80000280F381E02D09940895E0916801F091BA
:101E90006901309721F00480F581E02D09940895BF
:101EA00020916601309167018217930771F090933A
:101EB000670180936601E0916801F09169013097B4
:101EC00021F00680F781E02D0994089520916401A6
:101ED000309165018217930771F0909365018093AB
:101EE0006401E0916801F0916901309721F000846C
:101EF000F185E02D0994089508950C947C0F0E94BB
:101F0000921B0E943F040C94581CCF92DF92EF92D8
:101F1000FF920F931F93CF93DF93CDB7DEB72B972D
:101F20000FB6F894DEBF0FBECDBF0E9457048BE6FC
:101F3000C82E81E0D82E00E010E0E02E802F0E9415
:101F40004505F60141916F01F42EF826B1F40F5FBB
:101F50001F4F0E30110589F78FEF89838A831B820B
:101F60000E949B1B8160782F9D838C8349815A81BD
:101F70006B818D810E94281040C09091CD0191FF0E
:101F800004C08B870E944B058B8520E030E04F2DED
:101F900050E0922FBA01022E02C0759567950A94FF
:101FA000E2F760FF24C02E83EF8221E030E0690178
:101FB00002C0CC0CDD1C9A95E2F790E08C219D21AB
:101FC000892B09F420E028870E949B1B8160782FD1
:101FD0009A8789874E815F8168858A850E9428104B
:101FE000F801E559FE4F8081C826C08206C02F5FE8
:101FF0003F4F2630310569F6AACF0E943F1F10914E
:102000006A010E942E0F1817A1F00E942E0F8093D4
:102010006A012B960FB6F894DEBF0FBECDBFDF91DD
:10202000CF911F910F91FF90EF90DF90CF900C9484
:1020300027082B960FB6F894DEBF0FBECDBFDF91F9
:10204000CF911F910F91FF90EF90DF90CF90089567
:10205000CF93DF93CDB7DEB72B970FB6F894DEBFE3
:102060000FBECDBF4F83588769877A878B87DE0184
:10207000119686E0FD0111928A95E9F785E0FE014F
:10208000379601900D928A95E1F749815A816B81CB
:102090007C818D819E810E9458172B960FB6F894F3
:1020A000DEBF0FBECDBFDF91CF9108950895CF93CE
:1020B000882309F4C2C0C82F823859F40E942E0F19
:1020C00081FDBBC089E30E94011A0E94CE1A89E3F8
:1020D0000CC0833879F40E942E0F80FDAEC083E5DA
:1020E0000E94011A0E94CE1A83E50E94431ACF91E2
:1020F0000C94CE1A843859F40E942E0F82FD9DC094
:1021000087E40E94011A0E94CE1A87E4EECF8CEF7A
:102110008C0F813A48F48C2F0E94822181118DC04E
:102120008C2F0E94011AE3CF80E28C0F883048F494
:10213000C77081E001C0880FCA95EAF70E94871A2C
:10214000D6CF8BE58C0F833078F4C53A29F0C63AA8
:1021500031F083E890E005C081E890E002C082E8B9
:1021600090E0CF910C94500F88E58C0F833108F0EC
:1021700064C0C83A39F1C93A41F1CA3A49F1CB3A97
:1021800051F1CC3A59F1CD3A61F1C03B69F1CE3A07
:1021900071F1CF3A79F1C13B81F1C23B89F1C33B87
:1021A00091F1C43B99F1C53BA1F1C63BA9F1C73BF5
:1021B000B1F1C83BB9F1C93BC1F1CA3BC9F180E0FB
:1021C00090E038C082EE90E035C089EE90E032C0F9
:1021D0008AEE90E02FC085EB90E02CC086EB90E07B
:1021E00029C087EB90E026C08CEC90E023C08DECFA
:1021F00090E020C083E891E01DC08AE891E01AC019
:1022000082E991E017C084E991E014C081E292E094
:1022100011C083E292E00EC084E292E00BC085E23E
:1022200092E008C086E292E005C087E292E002C038
:102230008AE292E0CF910C94660FCF9108958823A3
:1022400009F44BC0823859F40E942E0F81FF45C01B
:1022500089E30E94011A0E94CE1A89E30CC08338D8
:1022600071F40E942E0F80FF38C083E50E94011A8E
:102270000E94CE1A83E50E94431A0C94CE1A843829
:1022800059F40E942E0F82FF28C087E40E94011A91
:102290000E94CE1A87E4EFCF9CEF980F913A58F343
:1022A00090E2980F983050F4877091E001C0990F38
:1022B0008A95EAF7892F0E948D1ADFCF9BE5980F48
:1022C000933020F480E090E00C94500F885A8331D2
:1022D00020F480E090E00C94660F0895882321F0AC
:1022E0000E94871A0C94CE1A0895882321F00E9428
:1022F0008D1A0C94CE1A0895BF92CF92DF92EF926E
:10230000FF920F931F93CF93DF9300D000D000D0A4
:10231000CDB7DEB725E0FC01DE01119601900D92EC
:102320002A95E1F7FC01D080118102812581229557
:102330002F7043815481452B09F4FCC21F3F21F4C7
:10234000FFEFDF1609F4F6C27C012E830E945610BF
:10235000D9821A8369817A81802F0E94FD19182FF2
:10236000B92E0E94B2190E9479182E81002319F00B
:102370000E94A41A2E81EB2DE295EF70F0E0E05A56
:10238000FF4F0C94B7238B2D807F9B2D9F70F92ED0
:10239000882319F0F29480EFF822002389F0FF20BF
:1023A00009F475C280E2810F883020F48F2D0E94DD
:1023B000871A03C08F2D0E94971A0E94CE1A67C2F7
:1023C000812F0E941F11FF2009F4B4C2105E8F2DCF
:1023D000183018F40E948D1A02C00E949D1A269689
:1023E0000FB6F894DEBF0FBECDBFDF91CF911F9126
:1023F0000F91FF90EF90DF90CF90BF900C94CE1A8A
:102400003B2D307F8B2D8F70303211F08295807F85
:10241000112319F0113021F12CC00023B9F022232F
:1024200009F4A0C1213009F09DC126960FB6F89499
:10243000DEBF0FBECDBFDF91CF911F910F91FF90F7
:10244000EF90DF90CF90BF900C94B71A222319F031
:10245000213009F46FC28E830E94BA1A8E8196C110
:10246000002321F0223008F065C27CC1211162C234
:102470008DC1002321F0222309F474C108C2222354
:1024800009F484C119C22B2D26952695237030E0BE
:102490002115310521F021303105D1F04BC2002347
:1024A00021F0812F9B2D937002C080E090E0269652
:1024B0000FB6F894DEBF0FBECDBFDF91CF911F9155
:1024C0000F91FF90EF90DF90CF90BF900C94500F42
:1024D000002321F0812F9B2D937002C080E090E0BB
:1024E00026960FB6F894DEBF0FBECDBFDF91CF9119
:1024F0001F910F91FF90EF90DF90CF90BF900C94C1
:10250000660F812F002319F00E94471E02C00E940F
:10251000AF1E26960FB6F894DEBF0FBECDBFDF917B
:10252000CF911F910F91FF90EF90DF90CF90BF90D0
:102530000C94341F8B2D837009F07BC00111FAC1FC
:10254000812F829586958770880F880F912F9F70B5
:10255000C92ED12CE12CF12C082E04C0CC0CDD1C92
:10256000EE1CFF1C0A94D2F714FF12C04FE050E09B
:1025700060E070E004C0440F551F661F771F8A9506
:10258000D2F7CB01BA01609570958095909503C004
:1025900060E070E0CB012B2D269526952370422F0D
:1025A00050E042305105D9F04330510569F16C29B2
:1025B0007D298E299F294130510551F126960FB66C
:1025C000F894DEBF0FBECDBFDF91CF911F910F9169
:1025D000FF90EF90DF90CF90BF900C94A0186C29E3
:1025E0007D298E299F2926960FB6F894DEBF0FBE4F
:1025F000CDBFDF91CF911F910F91FF90EF90DF90B2
:10260000CF90BF900C94BC180E94A018C701B601CF
:1026100026960FB6F894DEBF0FBECDBFDF91CF91E7
:102620001F910F91FF90EF90DF90CF90BF900C948F
:102630008418002319F08B2D817001C086958823A2
:1026400009F478C1812F829586958770880F880F4D
:10265000912F9F70C92ED12CE12CF12C082E04C093
:10266000CC0CDD1CEE1CFF1C0A94D2F714FF12C028
:102670004FE050E060E070E004C0440F551F661F5B
:10268000771F8A95D2F7CB01BA0160957095809536
:10269000909503C060E070E0CB012B2D2695269528
:1026A0002370422F50E042305105D9F0433051059C
:1026B00069F16C297D298E299F294130510551F1FD
:1026C00026960FB6F894DEBF0FBECDBFDF91CF9137
:1026D0001F910F91FF90EF90DF90CF90BF900C94DF
:1026E0007A196C297D298E299F2926960FB6F89490
:1026F000DEBF0FBECDBFDF91CF911F910F91FF9035
:10270000EF90DF90CF90BF900C9496190E947A19A9
:10271000C701B60126960FB6F894DEBF0FBECDBF37
:10272000DF91CF911F910F91FF90EF90DF90CF90AD
:10273000BF900C945E19103FD1F118F4103E50F484
:10274000A1C0123F09F463C008F44CC0133F09F460
:1027500073C098C01F708B2D8F710023A1F00E9451
:10276000F718812F26960FB6F894DEBF0FBECDBFA7
:10277000DF91CF911F910F91FF90EF90DF90CF905D
:10278000BF900C946E110E941819812F26960FB6D7
:10279000F894DEBF0FBECDBFDF91CF911F910F9197
:1027A000FF90EF90DF90CF90BF900C9475110023B5
:1027B000A9F02111BFC08B2D8F7126960FB6F8940A
:1027C000DEBF0FBECDBFDF91CF911F910F91FF9064
:1027D000EF90DF90CF90BF900C943D19223008F01D
:1027E000A9C0E9CF0023A9F08B2D8F7126960FB6D3
:1027F000F894DEBF0FBECDBFDF91CF911F910F9137
:10280000FF90EF90DF90CF90BF900C94F7180023CB
:1028100059F38B2D8F7126960FB6F894DEBF0FBE3D
:10282000CDBFDF91CF911F910F91FF90EF90DF907F
:10283000CF90BF900C941819002399F08B2D8F71B5
:1028400026960FB6F894DEBF0FBECDBFDF91CF91B5
:102850001F910F91FF90EF90DF90CF90BF900C945D
:10286000E21826960FB6F894DEBF0FBECDBFDF91FB
:10287000CF911F910F91FF90EF90DF90CF90BF907D
:102880000C94D8180023A9F0222309F4ADCF812F8E
:1028900026960FB6F894DEBF0FBECDBFDF91CF9165
:1028A0001F910F91FF90EF90DF90CF90BF900C940D
:1028B0005710222309F4ADCF812F26960FB6F89436
:1028C000DEBF0FBECDBFDF91CF911F910F91FF9063
:1028D000EF90DF90CF90BF900C941F114B2D4F7055
:1028E000612FC7010E94B40226960FB6F894DEBF8E
:1028F0000FBECDBFDF91CF911F910F91FF90EF9051
:10290000DF90CF90BF900C94FC174B2D4F70612F30
:10291000C70126960FB6F894DEBF0FBECDBFDF917C
:10292000CF911F910F91FF90EF90DF90CF90BF90CC
:102930000C944C0526960FB6F894DEBF0FBECDBFA3
:10294000DF91CF911F910F91FF90EF90DF90CF908B
:10295000BF9008950E94A41A0E94B41A0E94791A86
:102960000E94CE1A0E94E51F0E94341F80E090E072
:102970000E94500F80E090E00C94660F0E94941A21
:102980000C94AA140E94F219292F22952F7030E07E
:102990002C3031054CF42A3031056CF422503109C9
:1029A0002230310588F407C02C30310549F02F3032
:1029B000310531F009C0803E48F0803F29F406C05F
:1029C00093FB882780F9089580E0089581E00895B9
:1029D000CF93DF9300D000D01F92CDB7DEB70F901A
:1029E0000F900F900F900F90DF91CF910895CF939C
:1029F000DF9300D000D000D0CDB7DEB726960FB65B
:102A0000F894DEBF0FBECDBFDF91CF9108951F9325
:102A1000CF93DF93C091790116E080917A01C817B6
:102A200099F0D0E01C9FF0011D9FF00D1124E55896
:102A3000FE4F4081518162817381848195810E9422
:102A4000F7142196C770E9CFDF91CF911F910895B8
:102A50004091AB015091AC016091AD017091AE011C
:102A60008091AF019091B0010C94F7148091B00166
:102A700082958F7009F054C08091AD01882309F4CC
:102A80004FC080917901A0917A016091AB01709162
:102A9000AC014091AE015091AF01B6E08A1709F444
:102AA0003FC090E041155105C1F17F3F11F46F3FE8
:102AB000A1F1B89FF001B99FF00D1124E558FE4F28
:102AC000218172132AC02081621327C02281211123
:102AD00024C0238134812417350710F42150310993
:102AE000241B350B283C3105C0F42091B0012F7018
:102AF00020612093B00126E0289FF001299FF00D6E
:102B00001124E058FE4F80818F70806180838BEAB2
:102B100091E00E947C110C94071501968770BECF3E
:102B20000895CF92DF92EF92FF920F931F93CF936E
:102B3000DF93CDB7DEB762970FB6F894DEBF0FBE56
:102B4000CDBF8C0185E0F801DE011D9601900D924C
:102B50008A95E1F7D8014C9111965C9111971296E4
:102B60006C9112971396CD90DC9014973091AB0135
:102B70007091AC018091AE019091AF01009709F482
:102B80006BC17F3F19F43F3F09F466C1E090AD018E
:102B9000EE2009F4C0C02091B001C816D90628F073
:102BA000F601E81BF90BCF0104C0809590958C0DC0
:102BB0009D1DFF24F394883C910578F0F12C207F33
:102BC00009F0C6C07C2DD98AC88A89890E94E81478
:102BD0008BEA91E00E947C11B1C0822F807F09F0C6
:102BE00046C0751314C0341312C0611110C02F7089
:102BF00020612093B0010E9428158BEA91E00E9489
:102C00007C118091B001D80115968C932EC0CD28EF
:102C100019F15F3F11F44F3FF9F0F62E61111CC01E
:102C20008091790120917A0136E0821709F45AC027
:102C300090E0389FF001399FF00D1124E558FE4FC8
:102C40007181571306C07081471303C072817111DF
:102C500003C001968770E9CFF62E662309F418C1E8
:102C60008091B00181608093B001F12C11C1751386
:102C700008C0341306C0611104C08091B001D801AE
:102C8000C3C04D875E878D859E856A8B0E94C21466
:102C90006A898823E1F16623D1F12091B001822F66
:102CA00082958F7090E0029774F08091AB019091C3
:102CB000AC0198878F831986DB86CA862C87CE0164
:102CC00007960E947C1186E0F801ABEAB1E0019022
:102CD0000D928A95E1F70E9436150E942815FF246F
:102CE000F394D6C04D875E878D859E850E94F2192C
:102CF000292F22952F7030E0223031050CF0BCC016
:102D00009F7009F0B6C0805E883008F4C1C0C80169
:102D10000E947C11E4CFC816D90608F453C0F6010E
:102D2000E81BF90BCF01883C910508F450C0F12C49
:102D30007C2DD98AC88A89890E94E814EBEAF1E0DF
:102D400086E0DF011D928A95E9F70E942815A0C050
:102D5000751314C0341312C0611110C08091B001FA
:102D6000F8018583C8010E947C1186E0EBEAF1E05E
:102D7000DF011D928A95E9F7FE2C8AC04D875E8798
:102D80008D859E856A8B0E94C2146A89882309F406
:102D9000BECF662309F4BBCF2091B001822F82956C
:102DA0008F7090E002970CF48ECF8091AB019091E0
:102DB000AC019A8389831B82DD82CC822E83CE0173
:102DC00001967FCF809590958C0D9D1DACCFF62EF2
:102DD000662309F49CCF75132EC034132CC02091A8
:102DE000B00120FD1FC0822F82958F70D9F0D801CD
:102DF00015962C9315978F3049F08F5F982F9295E9
:102E0000907F822F8F70892B15968C93C8010E941A
:102E10007C1186E0F801ABEAB1E001900D928A9551
:102E2000E1F793CF86E0F801ABEAB1E001900D92B3
:102E30008A95E1F72DC04D875E878D859E850E941E
:102E4000C214811140CF8091B00181608093B001A4
:102E5000C8010E947C111CC0662309F458CF4D871D
:102E60005E878D859E850E94C214882309F44FCF0A
:102E70002ACF811148CF0CC0243031050CF047CF48
:102E80009F7009F440CFF8019581907F09F03BCF06
:102E90008F2D62960FB6F894DEBF0FBECDBFDF91C7
:102EA000CF911F910F91FF90EF90DF90CF900895F9
:102EB0001F93CF93DF93CDB7DEB72C970FB6F8945F
:102EC000DEBF0FBECDBF4F83588769877A878B8758
:102ED0009C87CE0107960E949115882369F08F8107
:102EE00098852A853B85232BF1F19F3F09F063C02C
:102EF0008F3F09F060C037C086E0FE013796DE01E3
:102F0000119601900D928A95E1F76F817885EA8597
:102F1000FB85309741F17F3F11F46F3F21F1209104
:102F20007A0130E0C90101968770992740917901B3
:102F300050E08417950709F447C069837A83FD83BD
:102F4000EC8396E0929FD001939FB00D1124A55879
:102F5000BE4FFE01319601900D929A95E1F7809354
:102F60007A010E94071516E08091790190917A010B
:102F70008917C1F1189FC001112485589E4F0E94E6
:102F80009115882379F1E09179011E9FF0011124B8
:102F9000E558FE4F40815181628173818481958122
:102FA0000E94F7148091790190E00196877099272B
:102FB00080937901D9CF4F81588569857A858B8532
:102FC0009C850E94F714CFCF0E94BE1410927A0104
:102FD00010927901EBEAF1E086E0DF011D928A951B
:102FE000E9F7C1CF2C960FB6F894DEBF0FBECDBF68
:102FF000DF91CF911F910895EF92FF920F931F934E
:10300000CF93DF938C01892B09F46CC0F12CEE2453
:10301000E394E8012196F8018491843740F48430E8
:1030200008F051C0813081F0823019F15BC08537E2
:1030300009F444C0A8F19CE7980F903708F052C0FB
:103040008F770E941F1141C00E5F1F4FFE01C49178
:1030500080E28C0F883048F4C7708E2D01C0880F35
:10306000CA95EAF70E94A71A14C08C2F0E94571025
:103070002DC00E5F1F4FFE01C49180E28C0F88307F
:1030800058F4C7708E2D01C0880FCA95EAF70E94C8
:10309000AD1A0E94CE1A1AC08C2F0E941F1116C0A2
:1030A0000E5F1F4FFE01C491CC2381F08FE99FE09A
:1030B0000197F1F700C00000C150F6CF0E5F1F4F1F
:1030C000FE01F49003C00E9457108E018F2D8823BB
:1030D00009F49FCFEFE9FFE03197F1F700C000005E
:1030E0008150F5CFDF91CF911F910F91FF90EF901D
:1030F000089508956093B5017093B6018093B70168
:103100009093B8010C94AA140F931F930091B501EA
:103110001091B6012091B7013091B801DC01CB01CB
:10312000802B912BA22BB32B8093B5019093B601EA
:10313000A093B701B093B8011F910F910C94AA14FA
:103140000F931F930091B5011091B6012091B70123
:103150003091B801DC01CB0180239123A223B3235A
:103160008093B5019093B601A093B701B093B801D5
:103170001F910F910C94AA140F931F930091B50106
:103180001091B6012091B7013091B801DC01CB015B
:1031900080279127A227B3278093B5019093B6018A
:1031A000A093B701B093B8011F910F910C94AA148A
:1031B0001092B1011092B2011092B3011092B401B9
:1031C0000C94AA1441E050E060E070E004C0440FA9
:1031D000551F661F771F8A95D2F74093B101509310
:1031E000B2016093B3017093B4010C94AA1441E04E
:1031F00050E060E070E004C0440F551F661F771F69
:103200008A95D2F78091B1019091B201A091B3015A
:10321000B091B401482B592B6A2B7B2B4093B10101
:103220005093B2016093B3017093B4010C94AA144B
:1032300041E050E060E070E004C0440F551F661F9D
:10324000771F8A95D2F7409550956095709580913B
:10325000B1019091B201A091B301B091B4014823A2
:1032600059236A237B234093B1015093B2016093A9
:10327000B3017093B4010C94AA1441E050E060E0F3
:1032800070E004C0440F551F661F771F8A95D2F760
:103290008091B1019091B201A091B301B091B401BC
:1032A000482759276A277B274093B1015093B201E1
:1032B0006093B3017093B4010C94AA140F931F93FD
:1032C0000091B1011091B2012091B3013091B4018C
:1032D000DC01CB01802B912BA22BB32B8093B1016E
:1032E0009093B201A093B301B093B4011F910F91D9
:1032F0000C94AA140F931F930091B1011091B20185
:103300002091B3013091B401DC01CB0180239123E2
:10331000A223B3238093B1019093B201A093B30190
:10332000B093B4011F910F910C94AA140F931F93A3
:103330000091B1011091B2012091B3013091B4011B
:10334000DC01CB0180279127A227B3278093B1010D
:103350009093B201A093B301B093B4011F910F9168
:103360000C94AA140895CF92DF92EF92FF920F93DC
:103370001F93CF93DF938C01C090B501D090B6011D
:10338000E090B701F090B8018091B1019091B20145
:10339000A091B301B091B401C82AD92AEA2AFB2A24
:1033A000CFE1D0E0D701C6010C2E04C0B695A79599
:1033B000979587950A94D2F780FF06C0B8018C2FA5
:1033C0000E948C07019721F4219760F780E001C0EB
:1033D0008C2FDF91CF911F910F91FF90EF90DF9095
:1033E000CF900895CF93DF93EC010E94B319BE01F3
:1033F0000E948C07DF91CF910895CB010E94F219B2
:10340000089590910C01992321F090910D01911153
:1034100009C020910E0130910F01F90132969FEF02
:1034200040E01FC0982F9695969596959F3050F541
:10343000E0910E01F0910F01E90FF11D877021E07D
:1034400030E0A90102C0440F551F8A95E2F7CA0176
:103450009181892B818308959F3F39F04F5F4E30D2
:1034600041F051915813F8CF0DC05111F7CF942F5F
:10347000F5CF9F3F39F0F901E90FF11D97FDFA955E
:1034800082830895089590910C01992321F09091E1
:103490000D01911109C020910E0130910F01F90128
:1034A0003296205F3F4F1FC0982F96959695969520
:1034B0009F30F0F4E0910E01F0910F01E90FF11D42
:1034C000877021E030E0A90102C0440F551F8A95A2
:1034D000E2F7CA018095918189238183089531960D
:1034E000E217F30729F090819813F9CF1082F7CFF4
:1034F000089581E090E0E0910E01F0910F01E80F56
:10350000F91F1082019680319105A9F708959091D5
:10351000CC01892B8093CC01089580959091CC01AA
:1035200089238093CC0108951092CC010895909145
:10353000CB01892B8093CB01089580959091CB018D
:1035400089238093CB0108951092CB010895909127
:10355000CA01892B8093CA01089580959091CA0170
:1035600089238093CA0108951092CA010895809317
:10357000B90108951092B901089580910E019091BA
:103580000F01FC0131969C01205F3F4F80E091913B
:1035900091118F5FE217F307D1F70895E0910E01C3
:1035A000F0910F018091CC018083E0910E01F091A8
:1035B0000F0190818091CB01892B8083E0910E01D6
:1035C000F0910F0190818091CA01892B80838091B5
:1035D000B901882361F0E0910E01F0910F01908113
:1035E000892B80830E94BD1A81111092B9018091AC
:1035F0000E0190910F010C943A0FCF92DF92EF924F
:10360000FF926C01EE24FF24C114D104E104F10403
:1036100021F0C701B60120E101C020E0C72ED82E5D
:10362000E92EFF24C114D104E104F10419F0285F4C
:10363000C701B6016B017C0154E0F694E794D7947E
:10364000C7945A95D1F7C114D104E104F10419F0DB
:103650002C5FC701B6016B017C0142E0F694E79450
:10366000D794C7944A95D1F7C114D104E104F10469
:1036700019F02E5FC701B601DC01CB01B695A79505
:1036800097958795892B8A2B8B2B09F02F5F822F9B
:10369000FF90EF90DF90CF9008958091E401843007
:1036A00021F11092CE0120E488E190E00FB6F89469
:1036B000A895809360000FBE2093600080E00E9478
:1036C000270883B7817F846083BF83B7816083BF0E
:1036D0007894889583B78E7F83BF88E10FB6F8947E
:1036E00080936000109260000FBE089508950895C1
:1036F000CF930E94761B0E9457040E94771BC0E064
:103700008C2F0E944505811104C0CF5FCE30C1F7D8
:1037100001C081E0CF9108950E94BE140E942E0F37
:103720000C94270882E084BD93E095BD9AEF97BD85
:1037300080936E0008952FB7F8948091CF019091F7
:10374000D001A091D101B091D2012FBF0895CF92A5
:10375000DF92EF92FF920F931F932FB7F89440914F
:10376000CF015091D0016091D1017091D2012FBF52
:103770006A017B01EE24FF248C0120E030E0C016BA
:10378000D106E206F30610F4415051099A01281BB4
:10379000390BC9011F910F91FF90EF90DF90CF90EF
:1037A00008951F920F920FB60F9211248F939F933B
:1037B000AF93BF938091CF019091D001A091D1019F
:1037C000B091D2010196A11DB11D8093CF019093BC
:1037D000D001A093D101B093D201BF91AF919F913D
:1037E0008F910F900FBE0F901F9018950E942B0C79
:1037F000F8942FEF87EA91E6215080409040E1F75E
:1038000000C0000087E090EBDC018093EE01909314
:10381000EF01A093F001B093F1019CE088E10FB6B5
:10382000F894A895809360000FBE90936000FFCF3E
:10383000EF92FF920F931F93CF93DF93D82FC0E0A7
:103840008C2F0E94450500E010E0E82EF12CC70106
:10385000002E02C0959587950A94E2F780FD06C078
:103860000F5F1F4F0630110591F709C0602F7C2FA5
:1038700080E00E944D05D813F3CF81E004C0CF5FF4
:10388000CE30F1F680E0DF91CF911F910F91FF9044
:10389000EF900895CF93C82F8CE20E94181C8823C4
:1038A00021F08C2FCF910C94181C80E0CF910895BB
:1038B000CF930E949F1D811102C00E94851DC5E605
:1038C000C15049F00E9457048FE39CE90197F1F73A
:1038D00000C00000F5CF89E20E944A1C811113C18B
:1038E0008AE20E944A1C81110E94851D85E00E9487
:1038F0004A1C81110E94F61B0E94AA1D8093CD01D3
:1039000087E00E944A1C8823A9F18BE10E944A1C8F
:10391000882351F08091CD0181FB222720F991E08D
:10392000922790FB81F90EC08EE00E944A1C8823EA
:1039300061F08091CD0182FB222720F991E092274E
:1039400090FB82F98093CD0115C080E10E944A1C52
:103950009091CD01882341F093FB222720F981E04B
:10396000822780FB93F904C0892F809580FB90F912
:103970009093CD018091CD010E94AE1D0E94BC1D8F
:103980008093ED0180EE0E944A1C882341F08091D3
:10399000ED01982F909590FB80F98093ED0189E3DC
:1039A0000E944A1C882359F08091ED0181FB222757
:1039B00020F991E0922790FB81F98093ED0182EE4E
:1039C0000E944A1C882359F08091ED0182FB222736
:1039D00020F991E0922790FB82F98093ED0186EE29
:1039E0000E944A1C882359F08091ED0183FB222715
:1039F00020F991E0922790FB83F98093ED0183EE0B
:103A00000E944A1C882359F08091ED0184FB2227F3
:103A100020F991E0922790FB84F98093ED0185E3F2
:103A20000E944A1C882359F08091ED0185FB2227D2
:103A300020F991E0922790FB85F98093ED0181E3D5
:103A40000E944A1C882359F08091ED0186FB2227B1
:103A500020F991E0922790FB86F98093ED0181E1B6
:103A60000E944A1C882359F08091ED0187FB222790
:103A700020F991E0922790FB87F98093ED018091E6
:103A8000ED010E94C01D8091ED0187FB882780F920
:103A900080930D0187E20E944A1CC82F8EE10E948C
:103AA0004A1C8111C2608FE10E944A1C8111C460CE
:103AB00080E20E944A1C8111C86081E20E944A1C77
:103AC0008111C06182E20E944A1C8111C06283E2BE
:103AD0000E944A1C8111C06484E20E944A1C88230F
:103AE00011F0C06802C0CC2329F08C2F0E94B71DB2
:103AF0006C2F03C00E94B31D682F70E080E090E03F
:103B0000CF910C947A18CF9108956DEE7EEF80E0FE
:103B100090E00E94F12360E082E090E00E94DF23C9
:103B200060E083E090E00E94DF2360E084E090E0CA
:103B30000E94DF2360E085E090E00C94DF2380E0CA
:103B400090E00E94D92321E08D3E9E4F09F020E0B5
:103B5000822F089582E090E00C94D123682F82E0B8
:103B600090E00C94DF2383E090E00C94D123682F45
:103B700083E090E00C94DF2384E090E00C94D12368
:103B8000682F84E090E00C94DF238091D50180FFC2
:103B90000BC06091130185E0689FB00111247595F9
:103BA0006795759567952BC081FF09C060911301DA
:103BB00085E0689FB00111247595679520C082FF4C
:103BC00007C06091130185E0689FB001112417C000
:103BD0009091D6019923D1F060911201961788F740
:103BE0002091130185E0289F90011124929FA0014C
:103BF000939F500D112470E0CA010E94A3236038E6
:103C0000710540F46115710539F002C065E070E09E
:103C1000862F08958FE7089581E008958091D5015A
:103C200080FF08C06091110170E0759567957595EA
:103C3000679521C081FF06C06091110170E0759504
:103C4000679519C082FF04C06091110170E010C037
:103C50009091D6019923C1F0609110019617A0F7B9
:103C600080911101899FC001112470E00E94A3235B
:103C70006038710528F46115710521F0862F0895CB
:103C80008FE7089581E0089561E070E0F4CF803F10
:103C900021F40E94C51D819504C0813F29F40E9432
:103CA000C51D8093D9010895823F21F40E94C51D4E
:103CB000819504C0833F29F40E94C51D8093D801DB
:103CC0000895893F19F40E940E1E05C08A3F31F401
:103CD0000E940E1E81958093DA0108958B3F21F496
:103CE0000E940E1E819504C08C3F29F40E940E1E76
:103CF0008093DB010895843F21F48091D701816096
:103D000017C0853F21F48091D701826011C0863FA2
:103D100021F48091D70184600BC0873F21F480910A
:103D2000D701886005C0883F31F48091D701806158
:103D30008093D70108958D3F21F48091D501816052
:103D40000BC08E3F21F48091D501826005C08F3F6A
:103D500029F48091D50184608093D5010895803F36
:103D600039F48091D90187FF6CC01092D90169C0E4
:103D7000813F29F48091D9011816BCF362C090915B
:103D8000D801823F29F497FF5CC01092D80159C036
:103D9000833F19F41916CCF354C0893F41F4809144
:103DA000DA0118160CF04DC01092DA014AC08A3FB1
:103DB00029F48091DA0187FF44C0F6CF8B3F39F4B4
:103DC0008091DB0187FF3DC01092DB013AC08C3F40
:103DD00029F48091DB011816BCF333C0843F21F431
:103DE0008091D7018E7F17C0853F21F48091D70144
:103DF0008D7F11C0863F21F48091D7018B7F0BC04E
:103E0000873F21F48091D701877F05C0883F31F437
:103E10008091D7018F7E8093D70113C08D3F21F40D
:103E20008091D5018E7F0BC08E3F21F48091D5010A
:103E30008D7F05C08F3F29F48091D5018B7F8093C2
:103E4000D5018091D80181110EC08091D9018111D5
:103E50000AC08091DA01811106C08091DB018111D5
:103E600002C01092D601089587ED91E00E94450F9F
:103E70000E949B1B9093D4018093D30108951F93BC
:103E8000CF93DF938091D3019091D4010E94A71B1F
:103E9000AC019091D601992321F02091140130E0DA
:103EA00006C0209115018AE0289F90011124421735
:103EB000530708F486C08091D801C091D901D091F0
:103EC000DA011091DB01811107C0C11176C0D11157
:103ED00074C0111172C075C09F3F19F09F5F90931D
:103EE000D601181624F40E94C51D8093D801809134
:103EF000D80187FF05C00E94C51D81958093D80118
:103F00001C1624F40E94C51D8093D9018091D9010B
:103F100087FF05C00E94C51D81958093D9016091DE
:103F2000D801662339F1C091D901CC2319F1772743
:103F300067FD7095872F972F0E94B42223E333E308
:103F400043E35FE30E9418230E9481226093D8011B
:103F50006C2F772767FD7095872F972F0E94B422CB
:103F600023E333E343E35FE30E9418230E948122AB
:103F70006093D9011D1624F40E940E1E8093DA016D
:103F80008091DA0187FF05C00E940E1E8195809303
:103F9000DA01111624F40E940E1E8093DB01809139
:103FA000DB0187FF05C00E940E1E81958093DB0117
:103FB000DF91CF911F910C94341F9F3F09F08ECF5A
:103FC00096CFDF91CF911F910895E7EDF1E085E065
:103FD000DF011D928A95E9F71092D6011092D50162
:103FE0000895833081F128F4813059F08230D1F086
:103FF0000895853009F449C0B8F1863009F456C0F7
:10400000089580911501262F30E0280F311D2F3F94
:10401000310524F4680F6093150108958FEF8093A4
:104020001501089580911401262F30E0280F311DCD
:104030002F3F310524F4680F6093140108958FEF2A
:1040400080931401089580911301262F30E0280FEA
:10405000311D2F3F310524F4680F6093130108953B
:104060008FEF80931301089580911201262F30E085
:10407000280F311D2F3F310524F4680F6093120182
:1040800008958FEF80931201089580911101262FDA
:1040900030E0280F311D2F3F310524F4680F609365
:1040A000110108958FEF80931101089580911001FF
:1040B000262F30E0280F311D2F3F310524F4680FE3
:1040C0006093100108958FEF80931001089583305D
:1040D00011F128F4813049F0823091F00895853053
:1040E00081F120F18630C1F10895809115016817A2
:1040F00020F4861B809315010895109215010895F0
:1041000080911401681720F4861B80931401089590
:1041100010921401089580911301681720F4861BF2
:104120008093130108951092130108958091120154
:10413000681720F4861B80931201089510921201D3
:10414000089580911101681720F4861B8093110156
:10415000089510921101089580911001681720F4BC
:10416000861B8093100108951092100108950F93FB
:104170001F938D3109F46BC008F03FC08E3009F4F5
:104180007FC0C0F4873009F469C068F4863009F054
:10419000B1C08091CD01817F8E7F8093CD0181E080
:1041A0008093DD01A8C0883009F4A2C08B3009F4E7
:1041B0009FC0A0C0863109F49BC078F4803109F417
:1041C00072C0813109F096C00E94BE1490910D0119
:1041D00081E0892780930D018BC0893109F488C063
:1041E0008B3109F087C08091CD0181FB222720F916
:1041F00091E0922790FB81F94CC0853309F470C09F
:1042000048F4873209F46CC008F459C0893209F4C3
:1042100067C070C0833438F48A3308F04EC08833E6
:1042200009F466C067C0833409F45AC0883409F0C1
:1042300061C00E94BE140FEF13ED20E30150104047
:104240002040E1F700C000000E94F61B51C00E9410
:104250003B220E942E0F0E9427084AC09091CD0158
:10426000892F8095817080FB90F929F09660986085
:104270009093CD0140C0997F977F9093CD0138C036
:104280008091CD0182FB222720F991E0922790FBBB
:1042900082F98093CD01992359F18091CD018160FC
:1042A0008093CD0125C08091CD0183FB222720F989
:1042B00091E0922790FB83F9ECCF895301C08D5197
:1042C00041E050E060E070E08A019B0104C0000F13
:1042D000111F221F331F8A95D2F7C901B80104C0EC
:1042E00061E070E080E090E00E947A180E94BE14C5
:1042F00081E001C080E01F910F91089580E0089552
:1043000080E00895CF93C82F8091DD01813079F04E
:1043100018F08230E9F187C0E0910E01F0910F01B1
:104320008081813169F0823209F07FC009C0E0915B
:104330000E01F0910F018081813111F0823261F420
:104340008C2F0E947E21811104C08C2F0E94B720E7
:104350001DC081E090E01AC08C2F0E948021811145
:1043600014C0C43179F048F4CB3079F0C03109F091
:1043700060C082E08093DD0108C0C93219F0C83303
:1043800021F057C01092DD0154C081E0817053C00C
:10439000C93289F118F5C43171F1A8F4C73009F0B8
:1043A00046C08AE08093150194E19093140193E054
:1043B000909313018093120188E08093110188E2A9
:1043C0008093100134C0CE51C63088F5EC2FF0E058
:1043D000E65DFE4F80818093DC0129C0CE34E9F098
:1043E00020F4CB3421F56AE013C0C13579F0C23531
:1043F000F1F461E00DC08091DC01882319F0109286
:10440000DC0115C081E08093DD0115C061E006C0CC
:104410008091DC010E94F11F0AC06AE08091DC01FA
:104420000E94672004C01092DD0180E004C081E09A
:1044300002C080E0ABCFCF910895E1E8F0E0808149
:10444000886080838081816080838FB7F89493E057
:104450009093890090ED909388008FBF0895EFE6C8
:10446000F0E08081826080830895EFE6F0E0808153
:104470008D7F80830895EFE6F0E0908182E08927C8
:10448000808308951F920F920FB60F9211242F93DD
:104490003F934F935F936F937F938F939F93AF93CC
:1044A000BF93EF93FF938091DE019091DF0101961E
:1044B0009093DF018093DE01811103C082E00E94AE
:1044C0002708E091DF01E695E695F0E0E456FB4F22
:1044D000E4918091DE018E1303C080E00E942708E2
:1044E000FF91EF91BF91AF919F918F917F916F91CC
:1044F0005F914F913F912F910F900FBE0F901F90A2
:10450000189504D06894B1118DC0089570D088F0CA
:104510009F5790F0B92F9927B751A0F0D1F0660FAF
:10452000771F881F991F1AF0BA95C9F712C0B130CA
:1045300081F077D0B1E0089574C0672F782F882775
:10454000B85F39F0B93FCCF3869577956795B39509
:10455000D9F73EF490958095709561957F4F8F4F78
:104560009F4F0895E89409C097FB3EF4909580957D
:10457000709561957F4F8F4F9F4F9923A9F0F92F29
:1045800096E9BB279395F695879577956795B795A7
:10459000F111F8CFFAF4BB0F11F460FF1BC06F5F8D
:1045A0007F4F8F4F9F4F16C0882311F096E911C09F
:1045B000772321F09EE8872F762F05C0662371F0C0
:1045C00096E8862F70E060E02AF09A95660F771FD4
:1045D000881FDAF7880F9695879597F9089557FD04
:1045E0009058440F551F59F05F3F71F04795880F61
:1045F00097FB991F61F09F3F79F0879508951216F8
:1046000013061406551FF2CF4695F1DF08C01616A3
:1046100017061806991FF1CF869571056105089454
:104620000895E894BB2766277727CB0197F908956B
:104630000BD078C069D028F06ED018F0952309F01F
:104640005AC05FC01124EECFCADFA0F3959FD1F30B
:10465000950F50E0551F629FF001729FBB27F00D30
:10466000B11D639FAA27F00DB11DAA1F649F662785
:10467000B00DA11D661F829F2227B00DA11D621FD4
:10468000739FB00DA11D621F839FA00D611D221F8E
:10469000749F3327A00D611D231F849F600D211D72
:1046A000822F762F6A2F11249F5750408AF0E1F015
:1046B00088234AF0EE0FFF1FBB1F661F771F881F5E
:1046C00091505040A9F79E3F510570F014C0AACFF9
:1046D0005F3FECF3983EDCF3869577956795B79549
:1046E000F795E7959F5FC1F7FE2B880F911D969573
:1046F000879597F9089597F99F6780E870E060E0E3
:1047000008959FEF80EC089500240A94161617066A
:1047100018060906089500240A94121613061406B2
:1047200005060895092E0394000C11F4882352F015
:10473000BB0F40F4BF2B11F460FF04C06F5F7F4FCD
:104740008F4F9F4F089597FB072E16F4009407D0C4
:1047500077FD09D00E94BD2307FC05D03EF490955B
:1047600081959F4F0895709561957F4F0895EE0F45
:10477000FF1F0590F491E02D0994AA1BBB1B51E18A
:1047800007C0AA1FBB1FA617B70710F0A61BB70BC1
:10479000881F991F5A95A9F780959095BC01CD0166
:1047A0000895F999FECF92BD81BDF89A992780B5F9
:1047B0000895A8E1B0E042E050E00C94F923262FE0
:1047C000F999FECF92BD81BDF89A019700B4021607
:1047D00039F01FBA20BD0FB6F894FA9AF99A0FBEB5
:1047E00008950196272F0E94E0230C94DF23DC011B
:1047F000CB01FC01F999FECF06C0F2BDE1BDF89AEC
:10480000319600B40D9241505040B8F70895F89495
:02481000FFCFD8
:1048120020022908B708940860082C080101BA018F
:1048220028080A03140A3F4D36395D041004DA03DE
:10483200A10334034D0366037F030102030405064B
:04484200070809005A
:00000001FF

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

@ -0,0 +1,11 @@
# ErgoDox EZ Plums Configuration
## Changelog
* Apr 23, 2016 (v0.1.0):
* Shortcut for iTerm2 quake style dropdown (Ctrl+`)
* Shortcut for screen/tmux (Ctrl+a)
* Shortcut for shush (Hyper+m)
* Combo modifier for LGUI + LALT
![Plums](plums.png)

@ -0,0 +1,225 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
#include "keymap_plover.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
#define STEN 3 // steno
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,---------------------------------------------------. ,---------------------------------------------------.
* | = | 1 | 2 | 3 | 4 | 5 | STEN | | NONE | 6 | 7 | 8 | 9 | 0 | \ |
* |--------+------+------+------+-------+-------------| |-------+------+------+------+------+------+--------|
* | Del | ' | , | . | P | Y | Esc | | Caps | F | G | C | R | L | / |
* |--------+------+------+------+-------+------| | | |------+------+------+------+------+--------|
* | BkSp | A | O | E | U | I |------| |-------| D | H | T | N |S / L2|- / Cmd |
* |--------+------+------+------+-------+------| Tab | | Enter |------+------+------+------+------+--------|
* | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift |
* `--------+------+------+------+-------+-------------' `--------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right | | Up | Down | [ | ] | ~L1 |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,---------------.
* | PgUp | PgDn | | Home | End |
* ,------|------|------| |-------+-------+------.
* | | | NONE | | NONE | | |
* | Alt | NONE |------| |-------| Space | Ctrl |
* | | | Supr | | AltGr | | |
* `--------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = KEYMAP( // layer 0 : default
// left hand
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, M(0),
KC_DELT, KC_QUOT, KC_COMM,KC_DOT, KC_P, KC_Y, KC_ESC,
KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_TAB,
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
KC_PGUP,KC_PGDN,
KC_NO,
KC_LALT,KC_ENT ,KC_LGUI,
// right hand
KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
KC_CAPS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, LT(MDIA, KC_S), GUI_T(KC_MINS),
KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z , KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_HOME,KC_END,
KC_NO,
KC_RALT,KC_SPC,KC_RCTL
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = KEYMAP(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | |Brwser|
* | | |------| |------| |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
[STEN] = KEYMAP( // layout: layer 4: Steno for Plover
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
KC_NO, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_STAR,
KC_NO, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR,
KC_NO, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR,
KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS,
KC_NO, KC_NO,
KC_NO,
PV_A, PV_O, KC_NO,
// right hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
PV_STAR, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD,
PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ,
KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO,
KC_NO,
KC_NO, PV_E, PV_U
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
void toggle_steno(int pressed)
{
uint8_t layer = biton32(layer_state);
if (pressed) {
if (layer != STEN) layer_on(STEN); else layer_off(STEN);
register_code(PV_LS);
register_code(PV_LH);
register_code(PV_RF);
register_code(PV_RT);
} else {
unregister_code(PV_LS);
unregister_code(PV_LH);
unregister_code(PV_RF);
unregister_code(PV_RT);
}
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
toggle_steno(record->event.pressed);
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_3_on();
break;
default:
// none
break;
}
};

@ -0,0 +1,19 @@
# Twey's Home Configuration
## Layers
- Layer 0: Non-ANSI Dvorak layout, with modified modifiers — all
modifiers on thumb keys, as well as return and space.
- Layer 1: Default symbol layout.
- Layer 2: Default media/mouse layout.
- Layer 3: Plover-oriented stenography layer.
## Unusual features
The Plover key (top right key on the left half) also sends my Plover
toggle chord (SH-FT) when pressed, as well as toggling the steno
layer, so you can toggle between steno and typing modes with a single
keypress.
If you want to use this feature, you'll need to add:
"SH-FT": "{PLOVER:TOGGLE}"
to your Plover dictionary.

@ -0,0 +1,1122 @@
:100000000C9465020C94A9020C94A9020C94A90208
:100010000C94A9020C94A9020C94A9020C94A902B4
:100020000C94A9020C94A9020C94C50B0C94970C87
:100030000C94A9020C94A9020C94A9020C94A90294
:100040000C94A9020C9422210C94A9020C94A902EC
:100050000C94A9020C94C41A0C94A9020C94A90241
:100060000C94A9020C94A9020C94A9020C94A90264
:100070000C94A9020C94A9020C94A9020C94A90254
:100080000C94A9020C94A9020C94A9020C94A90244
:100090000C94A9020C94A9020C94A9020C94A90234
:1000A0000C94A9020C94A9020C94A902FC0C1E0D3C
:1000B000090E1E0D090E600D830D090ED80DEB0DF6
:1000C000D810D81006110611481184118413841316
:1000D0009C118413931293125E138413841372136E
:1000E0000000F0A12E004C002A00E1003581000044
:1000F0001E00140004001D7134004D001F001A0082
:1001000016001B00E1042A0020000800070006007A
:1001100050002C0021001500090019004F004A0072
:10012000220017000A000500000065745000015409
:100130000000007F0000E3004F0001540000007742
:100140000000E20023001C000B00110000002971D8
:10015000240018000D00100052004B0025000C0078
:100160000E00360051002800260012000F00370054
:100170002F002B00270013003382387130004E000F
:100180002D0031003478E500C100000001000100BD
:1001900001000100010000003A001E0220022202BC
:1001A000010001003B001F022102230201000100A7
:1001B0003C002F0226022F00010001003D0030020A
:1001C00027023000010001003E00310235003502F7
:1001D000000001000100010000000100000001001A
:1001E0000100010000000100000001003F0052007A
:1001F00051002402000001004000240021001E00E4
:10020000010001004100250022001F00370001000D
:1002100042002600230020002700010043002502A1
:100220002E0231002E0001004400450001000100B3
:1002300001000000010001000100010001000000B8
:1002400001000100010001000100010001000100A6
:10025000F2000100010001000100F000F1000100C6
:10026000F400010001000100F3000100F5000100AD
:100270000100010001000100000001000100010077
:100280000000010000000100010001000000010069
:100290000000010001000100010001000000010058
:1002A0000100010001000100A9000100010001009E
:1002B0000100AC00AA00B600010001000100AB0083
:1002C000A80001000100010001000100010001007F
:1002D00001000100AE00010001000000160345000E
:1002E000720067006F0044006F0078002000450036
:1002F0005A00000016034500720067006F004400BA
:100300006F007800200045005A0000000403090433
:1003100009026D00040100A0FA09040000010301B4
:100320000100092111010001223F00070581030896
:10033000000A090401000103010200092111010062
:1003400001224D000705820308000A09040200018A
:100350000300000009211101000122360007058376
:100360000308000A09040300010300000009211129
:100370000100012239000705840310000112011059
:100380000100000008EDFE07130100010200010555
:10039000010906A101050719E029E71500250195C6
:1003A0000875018102050819012905950575019156
:1003B000029501750391010507190029771500259C
:1003C00001957875018102C005010980A1018502AE
:1003D00016010026B7001A01002AB7007510950112
:1003E0008100C0050C0901A1018503160100269CAE
:1003F000021A01002A9C02751095018100C00501B6
:100400000902A1010901A100050919012905150029
:10041000250195057501810295017503810105018D
:10042000093009311581257F950275088106093843
:100430001581257F950175088106050C0A3802157E
:1004400081257F950175088106C0C005010906A1B7
:1004500001050719E029E7150025019508750181B7
:100460000295017508810105081901290595057591
:100470000191029501750391010507190029FF15E6
:100480000025FF950675088100C0000000000000EF
:100490000000000000010204060A0F17202C3A4A4F
:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2
:1004B000B39D87715D4A3A2C20170F0A060402018A
:1004C0000000000000000000000011241FBECFEF5C
:1004D000DAE0DEBFCDBF04B603FE24C08091EE019A
:1004E0009091EF01A091F001B091F1018730904B14
:1004F000A740B04BB9F41092EE011092EF011092A8
:10050000F0011092F10114BE84B7877F84BF88E1A7
:100510000FB6F89480936000109260000FBEE0E088
:10052000FFE3099511E0A0E0B1E0E8ECF5E402C0DA
:1005300005900D92A433B107D9F711E0A4E3B1E01F
:1005400001C01D92AE3EB107E1F70E940B090C9469
:10055000E2220C94000061110BC0FC01828188230F
:1005600021F085EE0E946C0F03C085EE0E943410CE
:1005700080E090E0089508956091B1017091B2011A
:100580008091B3019091B4010E94F01956985E9841
:1005900025982D9826982E9827982F98813019F015
:1005A000823021F00895259A2D9A0895269A2E9A40
:1005B00008958CEB92E0892B11F00E94BC0280E040
:1005C00090E0089556985E9825982D9826982E9834
:1005D00027982F988FEF90E0909389008093880060
:1005E00090938B0080938A0090938D0080938C0071
:1005F000259A2D9A2FEF80E792E02150804090407D
:10060000E1F700C00000269A2E9A2FEF80E792E0D3
:10061000215080409040E1F700C00000279A2F9AB7
:100620002FEF80E792E0215080409040E1F700C03A
:10063000000025982D982FEF80E792E02150804010
:100640009040E1F700C0000026982E982FEF80E739
:1006500092E0215080409040E1F700C000002798D0
:100660002F9856985E9825982D9826982E9827981A
:100670002F98089589EA8093800089E08093810013
:1006800024982C983F988AB18F748AB96E98479AAB
:100690008BB1806B8BB9769A0E94E2028BEB92E071
:1006A000892B11F00E94BB0280E090E0089580E267
:1006B000809300018091340181110EC00E94A60335
:1006C00081E0809334012FEF83ED90E3215080404F
:1006D0009040E1F700C0000080E40E94AC038093EA
:1006E000000181112EC00E94D60380930001811168
:1006F00028C00E94D60380930001811122C08FE39D
:100700000E94D6038093000181111BC00E94CE037A
:1007100080E40E94AC0380930001811112C08CE040
:100720000E94D6038093000181110BC00E94D60362
:1007300080930001811105C08FE30E94D60380934E
:1007400000010E94CE038091000108951092B9002B
:100750008AE08093B800089594EA9093BC00909149
:10076000BC0097FFFCCF9091B900987F983021F0A2
:10077000903111F081E008958093BB0084E880936C
:10078000BC008091BC0087FFFCCF8091B900887FBE
:10079000883111F0803471F780E0089584E9809306
:1007A000BC008091BC0084FDFCCF08958093BB0009
:1007B00084E88093BC008091BC0087FFFCCF9091BF
:1007C000B900987F81E0983209F480E0089584E8C8
:1007D0008093BC008091BC0087FFFCCF8091BB0060
:1007E000089580910001811115C080E40E94AC033E
:1007F0008093000181110CC082E10E94D603809396
:100800000001811105C08FEF0E94D6038093000183
:100810000E94CE0384B1807F84B985B1807F85B981
:100820008AB1837F8AB98BB1837F8BB93E98469812
:1008300008950E945703809300010E94F10380B342
:100840008C7080BB81B3836F81BBE4E4F1E0A6E3ED
:10085000B1E011921D9281E0E235F807D1F78AE309
:1008600093E0892B11F00C943A030895BF92CF9234
:10087000DF92EF92FF920F931F93CF93DF938091BC
:100880000001882379F0809135018F5F80933501D5
:10089000811108C00E94570380930001811102C09A
:1008A0000E94E20206E311E0C0E0D0E0DD24D39430
:1008B00082E0C82EEE24E394F12CC73000F580913D
:1008C0000001811162C080E40E94AC0380930001AA
:1008D000811112C082E10E94D60380930001811130
:1008E0000BC0C7010C2E01C0880F0A94EAF780954F
:1008F0000E94D603809300010E94CE0346C0CA30F6
:10090000A1F028F4C83059F0C93061F005C0CC30EE
:1009100089F070F0CD3089F0209A289810C0219A83
:1009200029980DC0229A2A980AC0239A2B9807C0AA
:10093000529A01C0539A5B9802C03E9A4698E0EAE8
:10094000EA95F1F78FB1799960C092E081708D25B9
:10095000892B7C9B02C090E001C094E0892B7D9B99
:1009600002C090E001C098E0892B7E9B02C090E01D
:1009700001C090E1892B9FB19095991F9927991FEC
:100980009295990F907E892B0FC080910001811163
:1009900051C080E40E94AC03809300018823B9F128
:1009A000B12C0E94CE038B2DF8019081981719F07D
:1009B0008083C09201010E94F10321960F5F1F4FB7
:1009C000CE30D10509F079CF809101018823B1F0B3
:1009D000815080930101882339F08FE99FE00197CE
:1009E000F1F700C000000AC0A4E4B1E0E6E3F1E0E2
:1009F00081918D9391E0E434F907D1F789ED92E08C
:100A0000892BD1F00E94D90217C090E09FCF83E1DB
:100A10000E94D603809300018111C2CF81E40E941D
:100A2000AC03809300018111BBCF0E94E703B82E75
:100A3000B094B7CF80E0B8CF81E0DF91CF911F9124
:100A40000F91FF90EF90DF90CF90BF900895E82F27
:100A5000F0E0EC5BFE4F8081089508958B3B91059B
:100A600078F4883A910540F5853A9105D0F48430C0
:100A7000910508F0B1C08130910509F4ADC06BC09B
:100A8000803E910508F467C0883E910508F4A4C033
:100A90009C01205F31092031310508F05CC0906570
:100AA0000895853A910509F459C0863A910509F4EB
:100AB00058C083E890E40895883A910509F454C039
:100AC000893A910509F453C08A3A910509F452C054
:100AD0008B3A910509F451C08C3A910509F450C044
:100AE0008D3A910509F44FC0803B910509F44EC041
:100AF0008E3A910509F44DC08F3A910509F44CC026
:100B0000813B910509F44BC0823B910509F44AC031
:100B1000833B910509F449C0843B910509F448C021
:100B2000853B910509F447C0863B910509F446C011
:100B3000873B910509F445C0883B910509F444C001
:100B4000893B910509F443C08A3B910509F042C0F5
:100B50008AE296E4089580E090E0089581E890E4C8
:100B6000089582E890E4089582EE94E4089589EE71
:100B700094E408958AEE94E4089585EB94E408954E
:100B800086EB94E4089587EB94E408958CEC94E468
:100B900008958DEC94E4089583E895E408958AE837
:100BA00095E4089582E995E4089584E995E408952B
:100BB00081E296E4089583E296E4089584E296E45F
:100BC000089585E296E4089586E296E4089587E222
:100BD00096E4089580E094E40895089596E0799F5E
:100BE000F001112494E5899FE00DF11D1124E60F19
:100BF000F11DEE0FFF1FEC51FF4F85919491089569
:100C0000880F991F805A9040FC0185919491089516
:100C1000880F991F80529F4FFC01859194910895F0
:100C200026E0729FF001112444E5849FE00DF11D40
:100C30001124E60FF11DEE0FFF1FEC51FF4F259120
:100C40003491C9019A9581159F4110F4C901089505
:100C5000C90190528115904128F4C9019F700E94EA
:100C600008060895C90190538115904120F4C901E7
:100C70009927906C0895211580E5380769F40E9442
:100C8000A5139FEF24E34CE0915020404040E1F752
:100C900000C000000C94E91A213080E5380731F4D7
:100CA0008091CC0181608093CC010895C901905559
:100CB0008115904108F050C0832F99278F70992794
:100CC00081309105D9F4A9014370552702C0880FDE
:100CD000991F4A95E2F79C68A90164E0440F551FEB
:100CE0006A95E1F744275370842B952B73E0220F0C
:100CF000331F7A95E1F7207633271DC082309105A6
:100D000029F4922F8827816F906A08958330910586
:100D1000A9F4A9014370552781E090E002C0880F33
:100D2000991F4A95E2F79C6843E0220F331F4A95CA
:100D3000E1F7207E3770822B932B08950497F1F40E
:100D4000A9014370552781E090E002C0880F991FE8
:100D50004A95E2F79A68E8CFC9019057811590410A
:100D600020F4C9019F7090620895C90190588115BF
:100D7000904120F4C9019F70906A0895203E31058A
:100D8000E0F4203C310558F52133310509F470C0F9
:100D900048F42932310509F464C02A32310509F4D6
:100DA0006EC074C029333105F1F022383105D9F015
:100DB0002533310509F44EC069C0233E310589F160
:100DC00038F4203E3105C1F0223E3105E1F05EC02D
:100DD000263E310569F1273E3105A9F157C0C90109
:100DE0000E94000608958091DF0180FD02C081FF0E
:100DF0004DC080EE90E04BC08091DF0180FFF9CFC5
:100E000089E390E044C08091DF0182FF0EC08091B1
:100E1000DF0184FF03C080E090E039C083EE90E002
:100E200036C08091DF0182FFF2CF82EE90E02FC0CA
:100E30008091DF0183FF0BC08091DF0184FDEBCF48
:100E400087EE90E024C08091DF0183FFF5CF86EE2E
:100E500090E01DC08091DF0185FF07C089E290E02E
:100E600016C08091DF0185FFF9CF85E390E00FC0C8
:100E70008091DF0186FF07C08AE290E008C0809180
:100E8000DF0186FFF9CF81E390E001C0C9010E9434
:100E90002E0508950895809162010895CF93DF9300
:100EA00000D01F92CDB7DEB72091E501243019F5AF
:100EB00023E029839B838A832093E9008FEF90911D
:100EC000E800815095FD06C095ED9A95F1F7000078
:100ED0008111F5CF8091E80085FF0DC040E050E022
:100EE00063E070E0CE0101960E94B8098091E800AD
:100EF0008E778093E8000F900F900F90DF91CF9145
:100F00000895CF93DF9300D01F92CDB7DEB7209125
:100F1000E501243021F522E029839B838A8383E045
:100F20008093E9008FEF9091E800815095FD06C015
:100F300095ED9A95F1F700008111F5CF8091E800C9
:100F400085FF0DC040E050E063E070E0CE01019607
:100F50000E94B8098091E8008E778093E8000F9096
:100F60000F900F90DF91CF9108952091E5012430EB
:100F7000F1F422E02093E9002FEF3091E8002150B6
:100F800035FD06C035ED3A95F1F700002111F5CF9A
:100F90002091E80025FF0BC040E050E065E070E0E4
:100FA0000E94B8098091E8008E778093E800089548
:100FB000CF93DF93EC018091E501843009F046C0C6
:100FC00090910C019923D9F090910D019923B9F0DA
:100FD0008093E9008FEF9091E800815095FD06C065
:100FE00095E19A95F1F700008111F5CF8091E80025
:100FF00085FF2CC040E050E060E170E017C081E068
:101000008093E9008FEF9091E800815095FD06C034
:1010100095ED9A95F1F700008111F5CF8091E800E8
:1010200085FF14C040E050E068E070E0CE010E940F
:10103000B8098091E8008E778093E80080E1FE0196
:10104000A2E5B1E001900D928A95E1F7DF91CF9191
:1010500008958091E401811109C00E944A0B0E9409
:10106000A70B8091E20084608093E20008951092C3
:10107000E401089508950C940F210E94801A0E94A3
:1010800015210E94440E0C944A0742E061EC81E075
:101090000E94C40A42E061EC82E00E94C40A42E07D
:1010A00061EC83E00E94C40A42E161EC84E00C94AC
:1010B000C40A8091E701833009F455C030F48130CF
:1010C00071F0823009F48EC008958A3009F47AC034
:1010D0008B3009F460C0893009F09CC020C0809139
:1010E000E601813A09F096C08091E800877F8093FD
:1010F000E8008091EA019091EB01892B21F060E0FA
:1011000080E090E003C060E182E591E070E00E9441
:10111000010A8091E8008B778093E8000895809120
:10112000E601813209F076C08091EA019091EB01ED
:10113000009719F0039709F06DC08091E800877F50
:101140008093E8008091E80082FD05C08091E50170
:101150008111F8CF5FC08091F1008093620180918E
:10116000E8008B7753C08091E601813A09F052C0C4
:101170008091EA019091EB01892B09F04BC080919D
:10118000E800877F8093E8008091E80080FFFCCF33
:1011900080910C0136C08091E6018132D9F58091B1
:1011A000EA019091EB01892BA9F58091E800877FF6
:1011B0008093E8000E94F90A8091E80180930C0175
:1011C0000C94A5138091E601813221F58091E8000D
:1011D000877F8093E8000E94F90A8091E90180935B
:1011E000630108958091E601813AA1F48091E800BD
:1011F000877F8093E8008091E80080FFFCCF80919A
:1012000063018093F1008091E8008E778093E8007D
:101210000C94F90A089584B7877F84BF88E10FB6DC
:10122000F89480936000109260000FBE90E080E818
:101230000FB6F89480936100909361000FBE0E94F6
:10124000930E0E944A0B0E94A70B8091E2008460DB
:101250008093E20078940E94220E0E94950E82E014
:1012600091E00E943F0E0E94FD208091E5018530B3
:1012700069F40E94431A8091E3018823B1F30E942C
:101280006B1A882391F30E94A209EFCF0E949B0E54
:10129000ECCF292F332723303105A9F06CF421300E
:1012A000310509F442C02230310509F043C08DE612
:1012B00090E020E133E042C021323105C9F0223212
:1012C000310519F137C099278130910541F08230FD
:1012D000910541F0892B71F5ECE0F3E005C0E4EFF6
:1012E000F2E002C0ECEDF2E0849190E09F0126C0B4
:1012F000643000F5E62FF0E0EE0FFF1FEE5DFE4FCD
:101300002081318189E090E019C0643098F4E62FA3
:10131000F0E0DF01AA0FBB1FA65EBE4F2D913C91EE
:10132000EA5EFE4F808190E009C082E190E02DE707
:1013300033E004C080E090E020E030E0FA01318347
:101340002083089580E189BD82E189BD09B400FE52
:10135000FDCF8091D8008F7D8093D8008091E000F0
:1013600082608093E0008091E00081FDFCCF0895D1
:10137000CF92DF92EF92FF920F931F93CF93DF9361
:101380007C018B01EA010E941A0B811131C0209768
:1013900031F088819981081B190BE80EF91EC12CC8
:1013A000D12C0115110519F18091E80085FD14C0BB
:1013B0008091E8008E778093E800209741F0888143
:1013C00099818C0D9D1D9983888385E011C00E94B1
:1013D0001A0B882331F30CC0F70181917F018093B0
:1013E000F10001501109FFEFCF1ADF0ADACF80E0D8
:1013F000DF91CF911F910F91FF90EF90DF90CF90F1
:1014000008952091EC013091ED012617370748F03F
:101410006115710539F42091E8002E772093E800DA
:1014200001C0B901FC0120E061157105B9F180919D
:10143000E501882309F440C0853009F43FC080915C
:10144000E80083FD3DC08091E80082FF06C08091E6
:10145000E80082FF26C080E008958091E80080FFC8
:10146000E3CF2091F3008091F20090E0922B611580
:10147000710551F08830910538F421912093F100E5
:10148000615071090196F3CF21E0089709F020E03F
:101490008091E8008E778093E800C6CF2111C7CFF6
:1014A000D6CF8091E501882339F0853039F08091DD
:1014B000E80083FFCCCF04C082E0089583E0089564
:1014C00081E008952091EC013091ED012617370756
:1014D00048F06115710539F42091E8002E772093CA
:1014E000E80001C0B901FC0120E061157105C1F1FE
:1014F0008091E501882309F441C0853009F440C09A
:101500008091E80083FD3EC08091E80082FF06C024
:101510008091E80082FF27C080E008958091E80074
:1015200080FFE3CF2091F3008091F20090E0922BB6
:101530006115710559F08830910540F4249120938C
:10154000F1003196615071090196F2CF21E00897C0
:1015500009F020E08091E8008E778093E800C5CF05
:101560002111C6CFD5CF8091E501882339F0853090
:1015700039F08091E80083FFCBCF04C082E008956A
:1015800083E0089581E00895982F973058F590935F
:10159000E900981739F07091EC002091ED0050911E
:1015A000F00003C0242F762F50E021FF19C03091A6
:1015B000EB003E7F3093EB003091ED003D7F3093A8
:1015C000ED003091EB0031603093EB007093EC0054
:1015D0002093ED005093F0002091EE0027FF07C00C
:1015E0009F5FD3CF8F708093E90081E0089580E002
:1015F00008958091E60187FD05C08091E80080FF95
:101600000EC012C08091E80082FD05C08091E50106
:101610008111F8CF08958091E8008B7708C0809100
:10162000E5018111EACF08958091E8008E778093DB
:10163000E80008958091E4009091E50045E620914E
:10164000EC0020FF21C02091E80020FD21C0209166
:10165000E501222389F0253089F02091EB0025FD5A
:101660000FC02091E4003091E5002817390739F3C5
:10167000415041F0C901E3CF82E0089583E008952D
:1016800081E0089584E008952091E80022FFDFCFF3
:1016900080E008950E94B80B0E94C00BE0EEF0E0DD
:1016A000808181608083E8EDF0E080818F778083A6
:1016B00019BCA7EDB0E08C918E7F8C9380818F7EDA
:1016C00080831092E40108950F931F93CF93DF93CB
:1016D0000E94B80B0E94C00BC8EDD0E088818F77C4
:1016E000888388818068888388818F7D888319BCFE
:1016F0001092E5011092E1011092E3011092E201D3
:1017000000EE10E0F80180818B7F8083888181600A
:10171000888342E060E080E00E94C40AE1EEF0E0ED
:1017200080818E7F8083E2EEF0E080818160808323
:10173000808188608083F80180818E7F80838881AA
:1017400080618883DF91CF911F910F910895E8ED1B
:10175000F0E080818F7E8083E7EDF0E08081816022
:10176000808384E082BF81E08093E4010C94640B69
:10177000E8EDF0E080818E7F80831092E200089592
:101780001092DA001092E10008951F920F920FB6A6
:101790000F9211242F933F934F935F936F937F93F7
:1017A0008F939F93AF93BF93EF93FF938091E1004B
:1017B00082FF0BC08091E20082FF07C08091E100B0
:1017C0008B7F8093E1000E94210E8091DA0080FFE0
:1017D0001FC08091D80080FF1BC08091DA008E7FEF
:1017E0008093DA008091D90080FF0DC080E189BD2F
:1017F00082E189BD09B400FEFDCF81E08093E5015F
:101800000E94290805C019BC1092E5010E94370802
:101810008091E10080FF19C08091E20080FF15C037
:101820008091E2008E7F8093E2008091E2008061EF
:101830008093E2008091D80080628093D80019BC28
:1018400085E08093E5010E943B088091E10084FFE0
:1018500030C08091E20084FF2CC080E189BD82E12C
:1018600089BD09B400FEFDCF8091D8008F7D8093A3
:10187000D8008091E1008F7E8093E1008091E200AA
:101880008F7E8093E2008091E20081608093E2008D
:101890008091E101882311F084E007C08091E3008A
:1018A00087FF02C083E001C081E08093E5010E94D0
:1018B0003D088091E10083FF29C08091E20083FF11
:1018C00025C08091E100877F8093E10082E08093D2
:1018D000E5011092E1018091E1008E7F8093E100AB
:1018E0008091E2008E7F8093E2008091E20080612F
:1018F0008093E20042E060E080E00E94C40A8091B0
:10190000F00088608093F0000E943A08FF91EF9108
:10191000BF91AF919F918F917F916F915F914F9107
:101920003F912F910F900FBE0F901F9018951F920F
:101930000F920FB60F9211242F933F934F935F9303
:101940006F937F938F939F93AF93BF93CF93EF93B7
:10195000FF93C091E900CF708091EC001092E900F4
:101960008091F000877F8093F00078940E94D30CE0
:101970001092E9008091F00088608093F000C0939D
:10198000E900FF91EF91CF91BF91AF919F918F911E
:101990007F916F915F914F913F912F910F900FBE6B
:1019A0000F901F9018951F93CF93DF93CDB7DEB79D
:1019B000AA970FB6F894DEBF0FBECDBFE6EEF1E0FA
:1019C0008091F100819321E0EE3EF207C9F70E9479
:1019D00059088091E80083FF1CC12091E6013091F5
:1019E000E701832F90E08A30910508F012C1FC01D5
:1019F000EA5AFF4F0C949722203881F0223809F0E0
:101A000008C18091EA018F708093E9008091EB001A
:101A100085FB882780F91092E90006C08091E201D9
:101A20009091E301911182609091E800977F9093EB
:101A3000E8008093F1001092F100C5C0822F8D7FE5
:101A400009F0E7C0222319F0223061F0E2C0809152
:101A5000E801813009F0DDC0333009F080E0809387
:101A6000E30128C08091E801811124C02091EA019E
:101A70002F7009F4CEC02093E9008091EB0080FF25
:101A800019C08091EB00333011F4806211C0806185
:101A90008093EB0081E090E0022E01C0880F0A9451
:101AA000EAF78093EA001092EA008091EB008860E8
:101AB0008093EB001092E9008091E800877F86C058
:101AC0002111A7C01091E8011F778091E300807871
:101AD000812B8093E3008091E800877F8093E8006A
:101AE0000E94F90A8091E80080FFFCCF8091E3001A
:101AF00080688093E300112311F083E001C082E04D
:101B00008093E50186C02058223008F082C0809181
:101B1000E8019091E9018C3D23E0920779F583E09B
:101B20008A838AE289834FB7F894DE01139620E016
:101B30003EE051E2E32FF0E050935700E49120FFA4
:101B400003C0E295EF703F5FEF708E2F90E0EA30B8
:101B500010F0C79601C0C0968D939D932F5F2431DE
:101B600049F74FBF8091E800877F8093E8006AE2E1
:101B700070E0CE0101960E94010A14C0AE014F5FD1
:101B80005F4F6091EA010E944909009709F441C042
:101B90002091E800277F2093E800BC0189819A8189
:101BA0000E94620A8091E8008B778093E80031C040
:101BB000203879F58091E800877F8093E800809154
:101BC000E1018093F1008091E8008E778093E80036
:101BD0000E94F90A1EC021111CC09091E8019230A8
:101BE000C0F48091E800877F8093E8009093E10142
:101BF0000E94F90A8091E101811104C08091E30003
:101C000087FF02C084E001C081E08093E5010E946B
:101C100045088091E80083FF0AC08091E800877F33
:101C20008093E8008091EB0080628093EB00AA969D
:101C30000FB6F894DEBF0FBECDBFDF91CF911F91DD
:101C400008950895CF938091E5018823B1F08091A4
:101C5000E9008F709091EC0090FF02C090E801C005
:101C600090E0C92FC82B1092E9008091E80083FD15
:101C70000E94D30CCF70C093E900CF910895909348
:101C80006901809368010895E0916801F09169010C
:101C9000309721F00190F081E02D099480E00895C3
:101CA000E0916801F0916901309721F00280F381A1
:101CB000E02D09940895E0916801F0916901309751
:101CC00021F00480F581E02D0994089520916601AA
:101CD000309167018217930771F0909367018093A9
:101CE0006601E0916801F0916901309721F006806A
:101CF000F781E02D099408952091640130916501E8
:101D00008217930771F09093650180936401E091CD
:101D10006801F0916901309721F00084F185E02D90
:101D20000994089508950C94920E0E94861A0E94B8
:101D300019040C944C1BCF92DF92EF92FF920F93F9
:101D40001F93CF93DF93CDB7DEB72B970FB6F894E1
:101D5000DEBF0FBECDBF0E9436043BE6E32E31E06E
:101D6000F32E00E010E0C02E802F0E942705F7011F
:101D7000D1907F01D826B1F40F5F1F4F0E301105AF
:101D800091F78FEF89838A831B820E948F1A81606B
:101D9000782F9D838C8349815A816B818D810E942C
:101DA0003E0F41C09091CC0191FF04C08B870E94EF
:101DB0002D058B8520E030E04D2D50E0922FBA01AB
:101DC000022E02C0759567950A94E2F760FF25C060
:101DD0002E83CF82EE24E394F12C02C0EE0CFF1C84
:101DE0009A95E2F790E08E219F2121E0892B09F45A
:101DF00020E028870E948F1A8160782F9A87898730
:101E00004E815F8168858A850E943E0FF801E55901
:101E1000FE4F80818E25808306C02F5F3F4F263086
:101E2000310561F6A9CF0E94301E10916A010E940F
:101E3000440E1817A1F00E94440E80936A012B965D
:101E40000FB6F894DEBF0FBECDBFDF91CF911F91CB
:101E50000F91FF90EF90DF90CF900C944A072B9654
:101E60000FB6F894DEBF0FBECDBFDF91CF911F91AB
:101E70000F91FF90EF90DF90CF900895CF93DF9375
:101E8000CDB7DEB72B970FB6F894DEBF0FBECDBF30
:101E90004F83588769877A878B87DE01119686E0A2
:101EA000FD0111928A95E9F785E0FE0137960190D0
:101EB0000D928A95E1F749815A816B817C818D81F0
:101EC0009E810E9471162B960FB6F894DEBF0FBE4E
:101ED000CDBFDF91CF910895CF93C82F882309F408
:101EE000C1C0823859F40E94440E81FDBBC089E311
:101EF0000E9410190E94CA1989E30CC0833879F432
:101F00000E94440E80FDAEC083E50E9410190E941D
:101F1000CA1983E50E945019CF910C94CA198438CC
:101F200059F40E94440E82FD9DC087E40E9410195E
:101F30000E94CA1987E4EECF8CEF8C0F813A48F4E7
:101F40008C2F0E94652081118DC08C2F0E9410194A
:101F5000E3CF80E28C0F883048F4C77081E001C085
:101F6000880FCA95EAF70E949119D6CF8BE58C0F9E
:101F7000833078F4C53A29F0C63A31F482E890E02B
:101F800005C081E890E002C083E890E0CF910C9416
:101F9000660E88E58C0F833108F064C0C83A39F1C9
:101FA000C93A41F1CA3A49F1CB3A51F1CC3A59F127
:101FB000CD3A61F1C03B69F1CE3A71F1CF3A79F196
:101FC000C13B81F1C23B89F1C33B91F1C43B99F123
:101FD000C53BA1F1C63BA9F1C73BB1F1C83BB9F183
:101FE000C93BC1F1CA3BC9F58AE292E038C082EE32
:101FF00090E035C089EE90E032C08AEE90E02FC0CC
:1020000085EB90E02CC086EB90E029C087EB90E058
:1020100026C08CEC90E023C08DEC90E020C083E8DB
:1020200091E01DC08AE891E01AC082E991E017C0F2
:1020300084E991E014C081E292E011C083E292E071
:102040000EC084E292E00BC085E292E008C086E216
:1020500092E005C087E292E002C080E090E0CF917C
:102060000C947C0ECF910895882309F44BC08238DC
:1020700059F40E94440E81FF45C089E30E94101963
:102080000E94CA1989E30CC0833871F40E94440E7F
:1020900080FF38C083E50E9410190E94CA1983E5A9
:1020A0000E9450190C94CA19843859F40E94440EA5
:1020B00082FF28C087E40E9410190E94CA1987E491
:1020C000EFCF9CEF980F913A58F390E2980F983029
:1020D00050F4877091E001C0990F8A95EAF7892F33
:1020E0000E949719DFCF9BE5980F933020F480E092
:1020F00090E00C94660E885A833120F480E090E0E2
:102100000C947C0E0895882321F00E9491190C9460
:10211000CA190895882321F00E9497190C94CA19AE
:102120000895CF92DF92EF92FF920F931F93CF9378
:10213000DF93CDB7DEB728970FB6F894DEBF0FBE9A
:10214000CDBF8C0185E0F801DE01119601900D9262
:102150008A95E1F7F80140813181F280258122954D
:102160002F7083819481892B31F03F3F31F481E0DE
:102170004F3F19F403C081E001C080E080FDC4C27C
:1021800049833A8389819A812F830E94CE189E8346
:1021900088870E94CD180E94A0174E81E42FE295F7
:1021A000EF70F0E0E05AFF4F2F8168850C94972282
:1021B000842F807F142F1F70882311F01295107FB9
:1021C000FF2059F0112309F454C2812F68870E941F
:1021D000A1190E94CA1968854CC2862F0E9434102A
:1021E000112309F491C2812F0E94A71928960FB6D6
:1021F000F894DEBF0FBECDBFDF91CF911F910F913D
:10220000FF90EF90DF90CF900C94CA19342F307F5D
:10221000842F8F70303211F08295807F662319F001
:10222000613019F12BC0FF20B1F0222309F493C1D2
:10223000213009F090C128960FB6F894DEBF0FBE8A
:10224000CDBFDF91CF911F910F91FF90EF90DF9065
:10225000CF900C94B119222319F0213009F454C203
:102260008E830E94B4198E8189C1FF2021F0223013
:1022700008F04AC270C1211147C280C1FF2021F07D
:10228000222309F468C1F5C1222309F477C105C2EC
:10229000242F26952695237030E02115310521F055
:1022A00021303105C9F030C2FF2021F0862F942F54
:1022B000937002C080E090E028960FB6F894DEBFDD
:1022C0000FBECDBFDF91CF911F910F91FF90EF9087
:1022D000DF90CF900C94660EFF2021F0862F942F74
:1022E000937002C080E090E028960FB6F894DEBFAD
:1022F0000FBECDBFDF91CF911F910F91FF90EF9057
:10230000DF90CF900C947C0E862FFF2019F00E9456
:10231000381D02C00E94A01D28960FB6F894DEBF9B
:102320000FBECDBFDF91CF911F910F91FF90EF9026
:10233000DF90CF900C94251E842F837009F076C017
:10234000F110E2C1262F229526952770220F220F29
:10235000862F8F70C82ED12CE12CF12C022E04C0B8
:10236000CC0CDD1CEE1CFF1C0A94D2F764FF10C0DD
:102370006FE070E080E090E004C0660F771F881F78
:10238000991F2A95D2F7609570958095909503C016
:1023900060E070E0CB01242F269526952370422F14
:1023A00050E042305105D1F04330510559F16C29CC
:1023B0007D298E299F294130510541F128960FB67C
:1023C000F894DEBF0FBECDBFDF91CF911F910F916B
:1023D000FF90EF90DF90CF900C94C5176C297D296A
:1023E0008E299F2928960FB6F894DEBF0FBECDBF69
:1023F000DF91CF911F910F91FF90EF90DF90CF90E1
:102400000C94DF170E94C517C701B60128960FB6B6
:10241000F894DEBF0FBECDBFDF91CF911F910F911A
:10242000FF90EF90DF90CF900C94AB17FF2019F046
:10243000842F817001C08695882309F465C1262FF9
:10244000229526952770220F220F862F8F70C82E77
:10245000D12CE12CF12C022E04C0CC0CDD1CEE1C86
:10246000FF1C0A94D2F764FF10C06FE070E080E0B8
:1024700090E004C0660F771F881F991F2A95D2F736
:10248000609570958095909503C060E070E0CB01F9
:10249000242F269526952370422F50E04230510577
:1024A000D1F04330510559F16C297D298E299F299E
:1024B0004130510541F128960FB6F894DEBF0FBEAA
:1024C000CDBFDF91CF911F910F91FF90EF90DF90E3
:1024D000CF900C9499186C297D298E299F292896D4
:1024E0000FB6F894DEBF0FBECDBFDF91CF911F9125
:1024F0000F91FF90EF90DF90CF900C94B3180E9453
:102500009918C701B60128960FB6F894DEBF0FBE22
:10251000CDBFDF91CF911F910F91FF90EF90DF9092
:10252000CF900C947F18603FC9F118F4603E50F4CE
:102530009BC0623F09F460C008F44AC0633F09F4DD
:102540006FC092C0162F1F70842F8F71FF2099F0DB
:102550000E941818812F28960FB6F894DEBF0FBE80
:10256000CDBFDF91CF911F910F91FF90EF90DF9042
:10257000CF900C9483100E943918812F28960FB6A3
:10258000F894DEBF0FBECDBFDF91CF911F910F91A9
:10259000FF90EF90DF90CF900C948A10FF20A1F075
:1025A0002111B2C0842F8F7128960FB6F894DEBF28
:1025B0000FBECDBFDF91CF911F910F91FF90EF9094
:1025C000DF90CF900C945E18223008F09DC0EACFC7
:1025D000FF20A1F0842F8F7128960FB6F894DEBFEC
:1025E0000FBECDBFDF91CF911F910F91FF90EF9064
:1025F000DF90CF900C941818FF2061F3842F8F7117
:1026000028960FB6F894DEBF0FBECDBFDF91CF91F5
:102610001F910F91FF90EF90DF90CF900C9439189D
:10262000FF2091F0842F8F7128960FB6F894DEBFAB
:102630000FBECDBFDF91CF911F910F91FF90EF9013
:10264000DF90CF900C94031828960FB6F894DEBF55
:102650000FBECDBFDF91CF911F910F91FF90EF90F3
:10266000DF90CF900C94F917FF20A1F0222309F4FA
:10267000B1CF862F28960FB6F894DEBF0FBECDBF20
:10268000DF91CF911F910F91FF90EF90DF90CF904E
:102690000C946C0F222309F4B1CF862F28960FB625
:1026A000F894DEBF0FBECDBFDF91CF911F910F9188
:1026B000FF90EF90DF90CF900C9434104F70C801D2
:1026C0000E94AB0228960FB6F894DEBF0FBECDBFB6
:1026D000DF91CF911F910F91FF90EF90DF90CF90FE
:1026E0000C941E174F70C80128960FB6F894DEBFE1
:1026F0000FBECDBFDF91CF911F910F91FF90EF9053
:10270000DF90CF900C94ED0528960FB6F894DEBFBD
:102710000FBECDBFDF91CF911F910F91FF90EF9032
:10272000DF90CF9008950E94AE190E9483190E94F5
:10273000CA190E94D11E0E94251E80E090E00E94CE
:10274000660E80E090E00C947C0E0E949E190C9422
:1027500093130E94CE18292F22952F7030E02C3031
:1027600031054CF42A3031056CF422503109223005
:10277000310590F407C02C30310551F02F30310570
:1027800039F00AC0803E10F0803F31F481E00895B6
:1027900093FB882780F9089580E00895CF93DF9315
:1027A00000D000D01F92CDB7DEB70F900F900F90E2
:1027B0000F900F90DF91CF910895CF93DF9300D0CA
:1027C00000D000D0CDB7DEB726960FB6F894DEBFA6
:1027D0000FBECDBFDF91CF9108951F93CF93DF93AD
:1027E000C091790116E080917A01C81799F0D0E084
:1027F0001C9FF0011D9FF00D1124E558FE4F4081F4
:10280000518162817381848195810E94DD132196BB
:10281000C770E9CFDF91CF911F9108954091AB012F
:102820005091AC016091AD017091AE018091AF010A
:102830009091B0010C94DD13CF938091B0018295FB
:102840008F7009F05FC08091AD01882309F45AC0F0
:1028500020917901A0917A016091AB017091AC0156
:102860008091AE019091AF0131E06F3F09F030E00F
:10287000B32FC6E02A1709F445C0009721F07F3F27
:1028800021F44B2F03C041E001C040E030E040FDA7
:1028900035C0C29FF001C39FF00D1124E558FE4FD3
:1028A000418174132BC04081641328C042814111BF
:1028B00025C0438154814817590710F441505109EC
:1028C000481B590B483C5105C8F48091B0018F70EA
:1028D00080618093B00186E0829FF001839FF00DBC
:1028E0001124E058FE4F80818F70806180838BEAD5
:1028F00091E00E949110CF910C94ED132F5F3F4F08
:102900002770B8CFCF910895CF92DF92EF92FF92C8
:102910000F931F93CF93DF93CDB7DEB762970FB6B8
:10292000F894DEBF0FBECDBF8C0185E0F801DE015B
:102930001D9601900D928A95E1F7D8014C91119660
:102940005C91119712966C9112971396ED90FC90F2
:1029500014977091AB01E091AC012091AE013091E0
:10296000AF012115310531F0EF3F31F481E07F3FB8
:1029700019F403C081E001C080E0B82FB170CB2E04
:1029800080FD6CC1D090AD01DD2009F4F5C0F0915F
:10299000B001E216F30638F0C701821B930B883CA6
:1029A000910548F09BC0209530952E0D3F1D283C89
:1029B000310508F093C08F2F807F09F052C0E513D6
:1029C00014C0741312C0D62E61110FC0FF70F061D5
:1029D000F093B0010E940E148BEA91E00E949110D6
:1029E0008091B001F80185836CC1EF2831F05F3F21
:1029F00031F481E04F3F19F403C081E001C080E071
:102A000080FD03C081E0862701C080E0F82FF170CF
:102A1000FF2E80FF1CC08091790120917A0136E061
:102A2000821709F428C190E0389FF001399FF00D1A
:102A30001124E558FE4F7181571306C0708147136A
:102A400003C07281671303C001968770E9CFD62E49
:102A5000662309F436C18091B00181608093B00192
:102A600053C0E51308C0741306C0611104C0D80137
:102A70001596FC93AEC04D875E878D859E856A8BCB
:102A80000E94A9136A89882329F1D62E662311F1A1
:102A90002091B001822F82958F7090E002970CF404
:102AA00060C08091AB019091AC0198878F831986AB
:102AB000FB86EA862C87CE01079651C0E51731F1D7
:102AC0004D875E878D859E856A8B0E94A9136A89D2
:102AD00081112EC0C8010E949110A4C08F2F807F49
:102AE00069F77E2DF98AE88A89890E94CE138BEADC
:102AF00091E00E949110EBEAF1E086E0DF011D9287
:102B00008A95E9F70E940E14D12CDBC07413D8CF3C
:102B10006111D6CFD8011596FC93C8010E9491107F
:102B2000EBEAF1E086E0DF011D928A95E9F7C9C082
:102B3000D62E662379F22091B001822F82958F7074
:102B400090E0029774F08091AB019091AC019A8370
:102B500089831B82FD82EC822E83CE0101960E9426
:102B6000911086E0F801ABEAB1E001900D928A95F0
:102B7000E1F70E941C146FC0E216F30628F0C701AB
:102B8000821B930B9C0104C0209530952E0D3F1D98
:102B9000283C310508F052C0D62E662309F49ACF9E
:102BA000E5132CC074132AC08091B00180FD1DC0B4
:102BB000982F92959F70C9F0D80115968C93159710
:102BC0009F3039F09F5F9295907F8F70892B15967B
:102BD0008C93C8010E94911086E0F801ABEAB1E045
:102BE00001900D928A95E1F736C086E0F801ABEAD4
:102BF000B1E001900D928A95E1F763C04D875E8741
:102C00008D859E850E94A913882379F086E0F801BE
:102C1000ABEAB1E001900D928A95E1F70E941C1495
:102C20000E940E14DD24D3944CC08091B0018160C9
:102C30008093B001C8010E94911043C07E2DF98A93
:102C4000E88A89890E94CE13EBEAF1E086E0DF0191
:102C50001D928A95E9F70E940E1433C0662309F489
:102C600039CF4D875E878D859E850E94A913882365
:102C700009F430CFCBCF4D875E878D859E850E942E
:102C8000CE18292F22952F7030E0223031052CF4F8
:102C90009F7041F0811106C00CC0243031052CF426
:102CA0009F7049F4805E883020F0C8010E94911026
:102CB000CF2CDC2C06C0D80115969C91907F91F703
:102CC000F8CF8D2D62960FB6F894DEBF0FBECDBF44
:102CD000DF91CF911F910F91FF90EF90DF90CF90F8
:102CE00008951F93CF93DF93CDB7DEB72C970FB620
:102CF000F894DEBF0FBECDBF4F83588769877A87B0
:102D00008B879C87CE0107960E9484148823C1F08C
:102D10002F8138858A859B85892B31F03F3F11F0C3
:102D200080E003C02F3FE1F781E0811147C04F8170
:102D3000588569857A858B859C850E94DD133EC008
:102D400086E0FE013796DE01119601900D928A957C
:102D5000E1F7FF81E8854A855B854115510531F032
:102D6000EF3F31F481E0FF3F19F403C081E001C07F
:102D700080E080FD23C020917A0130E0C9010196F6
:102D8000877099276091790170E086179707F1F1B4
:102D9000F983EA835D834C8396E0929FD001939FF1
:102DA000B00D1124A558BE4FFE01319601900D9231
:102DB0009A95E1F780937A010E94ED1316E08091D5
:102DC000790190917A01891779F1189FC001112436
:102DD00085589E4F0E948414882331F1E091790137
:102DE0001E9FF0011124E558FE4F40815181628100
:102DF0007381848195810E94DD138091790190E037
:102E000001968770992780937901D9CF0E94A513E5
:102E100010927A0110927901EBEAF1E086E0DF018D
:102E20001D928A95E9F7CACF2C960FB6F894DEBFAB
:102E30000FBECDBFDF91CF911F910895EF92FF920A
:102E40000F931F93CF93DF939C01009709F471C0F8
:102E5000F12CEE24E394E9012196F9018491843761
:102E600040F4843008F056C0813081F0823021F186
:102E700060C0853709F449C0C0F19CE7980F9037CE
:102E800008F057C08F770E94341046C089010E5F4A
:102E90001F4FFE01849190E2980F983050F4877094
:102EA000FE2D01C0FF0F8A95EAF78F2F0E94A1190E
:102EB00015C00E946C0F14C089010E5F1F4FFE01E8
:102EC000849190E2980F983068F48770FE2D01C0CD
:102ED000FF0F8A95EAF78F2F0E94A7190E94CA193F
:102EE000E8011AC00E943410FBCF2E5F3F4FFE0155
:102EF000C491CC2341F08FE99FE00197F1F700C026
:102F00000000C150F6CFE90107C0FE01F490E901CD
:102F1000229602C00E946C0F8F2D882341F0EFE9AA
:102F2000FFE03197F1F700C000008150F6CF9E011D
:102F300092CFDF91CF911F910F91FF90EF90089565
:102F400008956093B5017093B6018093B701909393
:102F5000B8010C9493130F931F930091B501109136
:102F6000B6012091B7013091B801062B172B282B01
:102F7000392B0093B5011093B6012093B70130931C
:102F8000B8011F910F910C9493130F931F9300910D
:102F9000B5011091B6012091B7013091B801062317
:102FA0001723282339230093B5011093B6012093EA
:102FB000B7013093B8011F910F910C9493130F93A5
:102FC0001F930091B5011091B6012091B701309186
:102FD000B80106271727282739270093B501109332
:102FE000B6012093B7013093B8011F910F910C9453
:102FF00093131092B1011092B2011092B30110928A
:10300000B4010C94931341E050E060E070E004C020
:10301000440F551F661F771F8A95D2F74093B10161
:103020005093B2016093B3017093B4010C94931365
:1030300041E050E060E070E004C0440F551F661F9F
:10304000771F8A95D2F78091B1019091B201A0913A
:10305000B301B091B401842B952BA62BB72B809391
:10306000B1019093B201A093B301B093B4010C9459
:10307000931341E050E060E070E004C0440F551F3E
:10308000661F771F8A95D2F7409550956095709589
:103090008091B1019091B201A091B301B091B401BE
:1030A00084239523A623B7238093B1019093B20183
:1030B000A093B301B093B4010C94931341E050E09A
:1030C00060E070E004C0440F551F661F771F8A95AB
:1030D000D2F78091B1019091B201A091B301B0916A
:1030E000B40184279527A627B7278093B101909331
:1030F000B201A093B301B093B4010C9493130F9356
:103100001F930091B1011091B2012091B301309150
:10311000B401062B172B282B392B0093B1011093E8
:10312000B2012093B3013093B4011F910F910C941D
:1031300093130F931F930091B1011091B20120914D
:10314000B3013091B40106231723282339230093B8
:10315000B1011093B2012093B3013093B4011F91D8
:103160000F910C9493130F931F930091B101109141
:10317000B2012091B3013091B40106271727282707
:1031800039270093B1011093B2012093B30130931A
:10319000B4011F910F910C9493130895CF92DF9275
:1031A000EF92FF920F931F93CF93DF93EC01C090A8
:1031B000B501D090B601E090B701F090B8018091D0
:1031C000B1019091B201A091B301B091B401C82AAC
:1031D000D92AEA2AFB2A0FE110E0B701A601002E46
:1031E00004C076956795579547950A94D2F740FFA6
:1031F00007C0BE01802F0E9410068130910539F46E
:103200000150110950F7BE0180E00E941006DF91C5
:10321000CF911F910F91FF90EF90DF90CF90089585
:1032200090910C019923D9F090910D019923B9F057
:10323000982F9695969596959F3088F5E0910E017A
:10324000F0910F01E90FF11D877021E030E001C01E
:10325000220F8A95EAF78181822B8183089540911C
:103260000E0150910F0120E030E09FEFFA01E20FD4
:10327000F31F6281681799F09F3F19F4611101C033
:10328000922F2F5F3F4F2E30310581F79F3F39F04E
:10329000FA01E90FF11D97FDFA95828308950895CB
:1032A00090910C019923E1F090910D019923C1F0C7
:1032B000982F9695969596959F3020F5E0910E0162
:1032C000F0910F01E90FF11D877021E030E001C09E
:1032D000220F8A95EAF7209581812823218308957A
:1032E00040910E0150910F0120E030E0FA01E20F11
:1032F000F31F9281981301C012822F5F3F4F2E302F
:103300003105A1F7089581E090E0E0910E01F09180
:103310000F01E80FF91F1082019680319105A9F77E
:1033200008959091CB01982B9093CB0108958095AF
:103330009091CB0198239093CB0108951092CB01EB
:1033400008959091CA01982B9093CA010895809591
:103350009091CA0198239093CA0108951092CA01CE
:1033600008958093B90108951092B901089540918C
:103370000E0150910F0120E030E080E0FA01E20FF1
:10338000F31F918191118F5F2F5F3F4F2F303105D8
:10339000A9F70895E0910E01F0910F018091CB0102
:1033A0008083E0910E01F0910F0180819091CA011C
:1033B000892B80839091B901992361F0E0910E01EE
:1033C000F0910F018081892B80830E94B7198111B0
:1033D0001092B90180910E0190910F010C94500E42
:1033E000CF92DF92EF92FF920F931F936C01EE2426
:1033F000FF24C114D104E104F10421F46B017C0128
:1034000080E001C080E133272F2D1E2D0D2D0115E9
:1034100011052105310519F0885F680179019701CF
:103420008601A4E03695279517950795AA95D1F7BB
:10343000011511052105310519F08C5F680179012D
:1034400097018601F2E03695279517950795FA952D
:10345000D1F7011511052105310519F08E5F6801BD
:103460007901B701A6017695679557954795452B44
:10347000462B472B09F08F5F1F910F91FF90EF9024
:10348000DF90CF9008958091E501843009F110928A
:10349000CD0120E488E190E00FB6F894A8958093E0
:1034A00060000FBE2093600083B7817F846083BF7C
:1034B00083B7816083BF7894889583B78E7F83BFFD
:1034C00088E10FB6F89480936000109260000FBE00
:1034D000089508950895CF930E94691A0E943604B2
:1034E0000E946A1AC0E08C2F0E942705811105C036
:1034F000CF5FCE30C1F780E001C081E0CF91089569
:103500000E94A5130E94440E0C944A0782E084BDD9
:1035100093E095BD9AEF97BD80936E0008952FB705
:10352000F8948091CE019091CF01A091D001B091FB
:10353000D1012FBF0895CF92DF92EF92FF920F93A8
:103540001F932FB7F8944091CE015091CF01609115
:10355000D0017091D1012FBF6A017B01EE24FF24BD
:103560008C0120E030E0C016D106E206F30610F42C
:1035700041505109481B590BCA011F910F91FF90EF
:10358000EF90DF90CF9008951F920F920FB60F9299
:1035900011248F939F93AF93BF938091CE0190910D
:1035A000CF01A091D001B091D1010196A11DB11D13
:1035B0008093CE019093CF01A093D001B093D1011D
:1035C000BF91AF919F918F910F900FBE0F901F9061
:1035D00018950E944A0BF8942FEF87EA91E6215044
:1035E00080409040E1F700C0000087E090EBDC01F4
:1035F0008093EE019093EF01A093F001B093F1015D
:103600002CE088E190E00FB6F894A89580936000D4
:103610000FBE20936000FFCFEF92FF920F931F9396
:10362000CF93DF93E82EF12C8F2D0E942705C0E069
:10363000D0E0082F10E098010C2E02C03595279598
:103640000A94E2F720FD05C02196C630D10599F70E
:1036500009C06C2F7F2D80E00E94EE05E812F4CFA8
:1036600081E005C0F3948EE0F812DECF80E0DF91B8
:10367000CF911F910F91FF90EF900895CF93C82F96
:103680008CE20E940C1B882321F08C2FCF910C948C
:103690000C1B80E0CF910895CF930E94911C811163
:1036A00002C00E94771CC5E6C15049F00E94360452
:1036B0008FE39CE90197F1F700C00000F5CF89E2A4
:1036C0000E943E1B811111C18AE20E943E1B8111A2
:1036D0000E94771C85E00E943E1B81110E94E91A1E
:1036E0000E949C1C8093CC0187E00E943E1B882393
:1036F00099F18BE10E943E1B882351F09091CC01FF
:1037000091FB882780F921E0822780FB91F922C074
:103710008EE00E943E1B882351F09091CC0192FBD9
:10372000882780F921E0822780FB92F913C080E18D
:103730000E943E1B9091CC01882341F093FB882787
:1037400080F921E0822780FB93F904C0892F8095BE
:1037500080FB90F99093CC018091CC010E94A01C39
:103760000E94AE1C8093DF0180EE0E943E1B8823E6
:1037700041F08091DF01982F909590FB80F9809324
:10378000DF0189E30E943E1B882359F09091DF01FD
:1037900091FB882780F921E0822780FB91F99093A3
:1037A000DF0182EE0E943E1B882359F09091DF01D9
:1037B00092FB882780F921E0822780FB92F9909381
:1037C000DF0186EE0E943E1B882359F09091DF01B5
:1037D00093FB882780F921E0822780FB93F990935F
:1037E000DF0183EE0E943E1B882359F09091DF0198
:1037F00094FB882780F921E0822780FB94F990933D
:10380000DF0185E30E943E1B882359F09091DF0180
:1038100095FB882780F921E0822780FB95F990931A
:10382000DF0181E30E943E1B882359F09091DF0164
:1038300096FB882780F921E0822780FB96F99093F8
:10384000DF0181E10E943E1B882359F09091DF0146
:1038500097FB882780F921E0822780FB97F99093D6
:10386000DF018091DF010E94B21C8091DF0187FBA4
:10387000882780F980930D0187E20E943E1BC82FA4
:103880008EE10E943E1B8111C2608FE10E943E1BAF
:103890008111C46080E20E943E1B8111C86081E2F8
:1038A0000E943E1B8111C06182E20E943E1B811179
:1038B000C06283E20E943E1B8111C06484E20E94C8
:1038C0003E1B882311F0C06802C0CC2329F08C2F46
:1038D0000E94A91C6C2F03C00E94A51C682F70E0D9
:1038E00080E090E0CF910C94A117CF9108956DEEF8
:1038F0007EEF80E090E00E94CD2260E082E090E0E8
:103900000E94BF2260E083E090E00E94BF2260E05E
:1039100084E090E00E94BF2260E085E090E00C949B
:10392000BF2280E090E00E94B92221E08D3E9E4FB0
:1039300009F020E0822F089582E090E00C94B122FB
:10394000682F82E090E00C94BF2283E090E00C941A
:10395000B122682F83E090E00C94BF2284E090E0D5
:103960000C94B122682F84E090E00C94BF228091E7
:10397000D40180FF0BC06091130185E0689FB00106
:10398000112475956795759567952AC081FF09C0C3
:103990006091130185E0689FB001112475956795CA
:1039A0001FC082FF07C06091130185E0689FB001CE
:1039B000112416C04091D5014423C9F06091120131
:1039C000461788F72091130185E0289F9001112464
:1039D000429FC001439F900D112470E00E948322FA
:1039E0006038710540F46115710539F002C065E079
:1039F00070E0862F08958FE7089581E00895809103
:103A0000D40180FF08C06091110170E07595679541
:103A10007595679521C081FF06C06091110170E026
:103A20007595679519C082FF04C06091110170E01F
:103A300010C08091D5018823C1F0609110018617D4
:103A4000A0F790911101989FC001112470E00E948D
:103A500083226038710528F46115710521F0862FE5
:103A600008958FE7089581E0089561E070E0F4CF54
:103A7000803F21F40E94B71C819504C0813F29F446
:103A80000E94B71C8093D8010895823F21F40E94C0
:103A9000B71C819504C0833F29F40E94B71C809312
:103AA000D7010895893F19F40E94FF1C05C08A3F81
:103AB00031F40E94FF1C81958093D90108958B3FBA
:103AC00021F40E94FF1C819504C08C3F29F40E94C0
:103AD000FF1C8093DA010895843F21F48091D60180
:103AE000816017C0853F21F48091D601826011C0AA
:103AF000863F21F48091D60184600BC0873F21F47A
:103B00008091D601886005C0883F31F48091D6014C
:103B100080618093D60108958D3F21F48091D40176
:103B200081600BC08E3F21F48091D401826005C07A
:103B30008F3F29F48091D40184608093D40108954B
:103B4000803F39F48091D80187FF6CC01092D80172
:103B500069C0813F29F48091D8011816BCF362C076
:103B60009091D701823F29F497FF5CC01092D70152
:103B700059C0833F19F41916CCF354C0893F41F45E
:103B80008091D90118160CF04DC01092D9014AC08D
:103B90008A3F29F48091D90187FF44C0F6CF8B3F3B
:103BA00039F48091DA0187FF3DC01092DA013AC002
:103BB0008C3F29F48091DA011816BCF333C0843F9E
:103BC00021F48091D6018E7F17C0853F21F480912A
:103BD000D6018D7F11C0863F21F48091D6018B7F65
:103BE0000BC0873F21F48091D601877F05C0883FB5
:103BF00031F48091D6018F7E8093D60113C08D3F22
:103C000021F48091D4018E7F0BC08E3F21F48091EE
:103C1000D4018D7F05C08F3F29F48091D4018B7F23
:103C20008093D4018091D70181110EC08091D80179
:103C300081110AC08091D901811106C08091DA01F9
:103C4000811102C01092D501089586ED91E00E9485
:103C50005B0E0E948F1A9093D3018093D201089536
:103C60001F93CF93DF938091D2019091D3010E9453
:103C70009B1A4091D501442321F02091140130E09A
:103C800006C0209115015AE0259F9001112482174A
:103C9000930708F482C08091D7011091D801D09188
:103CA000D901C091DA01811107C0111105C0D111EC
:103CB00003C0CC2309F471C04F3F19F04F5F40930C
:103CC000D501181624F40E94B71C8093D701809167
:103CD000D70187FF05C00E94B71C81958093D7014B
:103CE000111624F40E94B71C8093D8018091D8014A
:103CF00087FF05C00E94B71C81958093D801609111
:103D0000D701662339F11091D801112319F17727D2
:103D100067FD7095872F972F0E94942123E333E34B
:103D200043E35FE30E94F8210E9461216093D70181
:103D3000612F772767FD7095872F972F0E94942119
:103D400023E333E343E35FE30E94F8210E94612110
:103D50006093D8011D1624F40E94FF1C8093D901A2
:103D60008091D90187FF05C00E94FF1C8195809337
:103D7000D9011C1624F40E94FF1C8093DA01809163
:103D8000DA0187FF05C00E94FF1C81958093DA014C
:103D9000DF91CF911F910C94251EDF91CF911F9140
:103DA0000895E6EDF1E085E0DF011D928A95E9F7DF
:103DB0001092D5011092D4010895833081F128F436
:103DC000813059F08230D1F00895853009F449C02E
:103DD000B8F1863009F456C0089520911501862F58
:103DE00090E0820F911D8F3F910520F4620F609348
:103DF000150108958FEF8093150108952091140106
:103E0000862F90E0820F911D8F3F910520F4620F65
:103E10006093140108958FEF809314010895209109
:103E20001301862F90E0820F911D8F3F910520F4A2
:103E3000620F6093130108958FEF8093130108952B
:103E400020911201862F90E0820F911D8F3F9105E6
:103E500020F4620F6093120108958FEF8093120196
:103E6000089520911101862F90E0820F911D8F3FC0
:103E7000910520F4620F6093110108958FEF8093F4
:103E80001101089520911001862F90E0820F911D5D
:103E90008F3F910520F4620F6093100108958FEF1A
:103EA000809310010895833011F128F4813049F096
:103EB000823091F00895853081F120F18630C1F192
:103EC000089580911501681720F4861B80931501D1
:103ED000089510921501089580911401681720F437
:103EE000861B809314010895109214010895809107
:103EF0001301681720F4861B809313010895109214
:103F00001301089580911201681720F4861B809395
:103F100012010895109212010895809111016817FD
:103F200020F4861B809311010895109211010895C9
:103F300080911001681720F4861B8093100108956A
:103F40001092100108958D3109F442C020F58E3091
:103F500009F479C070F4873009F45EC020F486302B
:103F600009F442C033C08830D1F18B3009F4A7C0C6
:103F70002DC0863109F4A3C038F4803109F46DC036
:103F8000813109F47BC022C0893109F498C08B319A
:103F900009F44FC01BC0853309F479C048F4873257
:103FA00009F475C008F478C0893209F470C00EC0F5
:103FB000833438F48A3308F071C0883309F47FC041
:103FC00005C0833409F463C08834C1F080E00895EB
:103FD0000E941B210E94440E0E944A0770C00E944A
:103FE0009C1C0E94AE1C6BC08091CC01817F8E7F97
:103FF0008093CC0181E08093DC0108950E94A51399
:104000002FEF83ED90E3215080409040E1F700C016
:1040100000000E94E91A53C09091CC01892F817051
:1040200090FF03C0917F9E7F26C091609093CC014A
:1040300046C09091CC0191FB882780F921E082272E
:1040400080FB91F913C09091CC0192FB882780F9F5
:1040500021E0822780FB92F909C09091CC0193FB6B
:10406000882780F921E0822780FB93F99093CC0187
:10407000882329F191609093CC0108950E94A513A3
:1040800080910D0191E0892780930D0118C061E0B6
:1040900070E080E090E00FC023EE01C027EC280F15
:1040A00061E070E080E090E004C0660F771F881F39
:1040B000991F2A95D2F70E94A1170E94A51381E0AB
:1040C000089580E0089580E00895CF93C82F8091EF
:1040D000DC01813079F018F08230D1F184C0A091F8
:1040E0000E01B0910F018C91813169F0823209F09B
:1040F0007CC009C0A0910E01B0910F018C9181315B
:1041000011F0823249F48C2F0E94612081111DC070
:104110008C2F0E94A31F1AC08C2F0E946320811134
:1041200014C0C43179F048F4CB3079F0C03109F0D3
:1041300060C082E08093DC0108C0C93219F0C83346
:1041400021F057C01092DC0154C081E0817053C04F
:10415000C93289F118F5C43171F1A8F4C73009F0FA
:1041600046C08AE08093150194E19093140193E096
:10417000909313018093120188E08093110188E2EB
:104180008093100134C0CE51C63088F5EC2FF0E09A
:10419000E65DFE4F80818093DB0129C0CE34E9F0DB
:1041A00020F4CB3421F56AE013C0C13579F0C23573
:1041B000F1F461E00DC08091DB01882319F01092C9
:1041C000DB0115C081E08093DC0115C061E006C011
:1041D0008091DB010E94DD1E0AC06AE08091DB0154
:1041E0000E94531F04C01092DC0180E004C081E0F3
:1041F00002C080E0ABCFCF910895E1E8F0E080818C
:10420000886080838081816080838FB7F89493E099
:104210009093890090ED909388008FBF0895EFE60A
:10422000F0E08081826080830895EFE6F0E0808195
:104230008D7F80830895EFE6F0E0808192E089270A
:10424000808308951F920F920FB60F9211242F931F
:104250003F934F935F936F937F938F939F93AF930E
:10426000BF93EF93FF938091DD019091DE01019662
:104270009093DE018093DD01811103C082E00E94F2
:104280004A07E091DE01E695E695F0E0E657FB4F40
:10429000E4918091DD018E1303C080E00E944A0703
:1042A000FF91EF91BF91AF919F918F917F916F910E
:1042B0005F914F913F912F910F900FBE0F901F90E4
:1042C000189504D06894B1118DC0089570D088F00D
:1042D0009F5790F0B92F9927B751A0F0D1F0660FF2
:1042E000771F881F991F1AF0BA95C9F712C0B1300D
:1042F00081F077D0B1E0089574C0672F782F8827B8
:10430000B85F39F0B93FCCF3869577956795B3954B
:10431000D9F73EF490958095709561957F4F8F4FBA
:104320009F4F0895E89409C097FB3EF490958095BF
:10433000709561957F4F8F4F9F4F9923A9F0F92F6B
:1043400096E9BB279395F695879577956795B795E9
:10435000F111F8CFFAF4BB0F11F460FF1BC06F5FCF
:104360007F4F8F4F9F4F16C0882311F096E911C0E1
:10437000772321F09EE8872F762F05C0662371F002
:1043800096E8862F70E060E02AF09A95660F771F16
:10439000881FDAF7880F9695879597F9089557FD46
:1043A0009058440F551F59F05F3F71F04795880FA3
:1043B00097FB991F61F09F3F79F08795089512163A
:1043C00013061406551FF2CF4695F1DF08C01616E6
:1043D00017061806991FF1CF869571056105089497
:1043E0000895E894BB2766277727CB0197F90895AE
:1043F0000BD078C069D028F06ED018F0952309F062
:104400005AC05FC01124EECFCADFA0F3959FD1F34D
:10441000950F50E0551F629FF001729FBB27F00D72
:10442000B11D639FAA27F00DB11DAA1F649F6627C7
:10443000B00DA11D661F829F2227B00DA11D621F16
:10444000739FB00DA11D621F839FA00D611D221FD0
:10445000749F3327A00D611D231F849F600D211DB4
:10446000822F762F6A2F11249F5750408AF0E1F057
:1044700088234AF0EE0FFF1FBB1F661F771F881FA0
:1044800091505040A9F79E3F510570F014C0AACF3B
:104490005F3FECF3983EDCF3869577956795B7958B
:1044A000F795E7959F5FC1F7FE2B880F911D9695B5
:1044B000879597F9089597F99F6780E870E060E025
:1044C00008959FEF80EC089500240A9416161706AD
:1044D00018060906089500240A94121613061406F5
:1044E00005060895092E0394000C11F4882352F058
:1044F000BB0F40F4BF2B11F460FF04C06F5F7F4F10
:104500008F4F9F4F089597FB072E16F4009407D006
:1045100077FD09D00E949D2207FC05D03EF49095BE
:1045200081959F4F0895709561957F4F0895EE0F87
:10453000FF1F0590F491E02D0994AA1BBB1B51E1CC
:1045400007C0AA1FBB1FA617B70710F0A61BB70B03
:10455000881F991F5A95A9F780959095BC01CD01A8
:104560000895F999FECF92BD81BDF89A992780B53B
:104570000895A8E1B0E042E050E00C94D422262F48
:10458000F999FECF1FBA92BD81BD20BD0FB6F89438
:10459000FA9AF99A0FBE019608950E94BF22272F1A
:1045A0000C94C022DC01CB01FC01F999FECF06C0BE
:1045B000F2BDE1BDF89A319600B40D9241505040E1
:0845C000B8F70895F894FFCF4D
:1045C80020024B07D807B50781074E070101BA013A
:1045D80028080A03140A3F4D36394B04FE03C80362
:1045E8008F0322033B0354036D03010203040506F2
:0445F80007080900A7
:00000001FF

@ -0,0 +1,140 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = gh60
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = gh60.c
ifdef KEYMAP
SRC := keymaps/$(KEYMAP).c $(SRC)
else
SRC := keymaps/default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
# CONSOLE_ENABLE = yes # Console for debug(+400)
# COMMAND_ENABLE = yes # Commands for debug and configuration
KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,60 @@
## gh60 Rev C keyboard firmware
![gh60 Rev C PCB](gh60revc.jpg)
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
* pin: F0 F1 E6 C7 C6 B6 D4 B1 B7 B5 B4 D7 D6 B3 (Rev.C)
*/
/* Row pin configuration
* row: 0 1 2 3 4
* pin: D0 D1 D2 D3 D5
*/
GPIO pads
0 F7 WASD LEDs
1 F6 ESC LED
2 F5 FN LED
3 F4 POKER Arrow LEDs
B2 Capslock LED
B0 not connected
Functions to controls LED clusters
gh60_caps_led_on()
gh60_poker_leds_on()
gh60_fn_led_on()
gh60_esc_led_on()
gh60_wasd_leds_on()
gh60_caps_led_off()
gh60_poker_leds_off()
gh60_fn_led_off()
gh60_esc_led_off()
gh60_wasd_leds_off()
======================
## Quantum MK Firmware
For the full Quantum feature list, see [the parent README.md](/README.md).
## Building
Download or clone the whole firmware and navigate to the keyboard/gh60_rev_c folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.

@ -0,0 +1,157 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER You
#define PRODUCT gh60
#define DESCRIPTION A custom keyboard
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 14
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define COLS (int []){ F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
#define ROWS (int []){ D0, D1, D2, D3, D5 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
#define BACKLIGHT_LEVELS 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER PAUSE
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,67 @@
#include "gh60.h"
#include "led.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// leave this function blank - it can be defined in a keymap file
};
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void process_action_user(keyrecord_t *record) {
// leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
}
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}
void process_action_kb(keyrecord_t *record) {
// put your per-action keyboard code here
// runs for every action, just before processing by the firmware
process_action_user(record);
}
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
gh60_caps_led_on();
} else {
gh60_caps_led_off();
}
// if (usb_led & (1<<USB_LED_NUM_LOCK)) {
// gh60_esc_led_on();
// } else {
// gh60_esc_led_off();
// }
// if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
// gh60_fn_led_on();
// } else {
// gh60_fn_led_off();
// }
led_set_user(usb_led);
}

@ -0,0 +1,81 @@
#ifndef GH60_H
#define GH60_H
#include "matrix.h"
#include "keymap_common.h"
#include "backlight.h"
#include <stddef.h>
/* GH60 LEDs
* GPIO pads
* 0 F7 WASD LEDs
* 1 F6 ESC LED
* 2 F5 FN LED
* 3 F4 POKER Arrow LEDs
* B2 Capslock LED
* B0 not connected
*/
inline void gh60_caps_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); }
inline void gh60_poker_leds_on(void) { DDRF |= (1<<4); PORTF &= ~(1<<4); }
inline void gh60_fn_led_on(void) { DDRF |= (1<<5); PORTF &= ~(1<<5); }
inline void gh60_esc_led_on(void) { DDRF |= (1<<6); PORTF &= ~(1<<6); }
inline void gh60_wasd_leds_on(void) { DDRF |= (1<<7); PORTF &= ~(1<<7); }
inline void gh60_caps_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
inline void gh60_poker_leds_off(void) { DDRF &= ~(1<<4); PORTF &= ~(1<<4); }
inline void gh60_fn_led_off(void) { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }
inline void gh60_esc_led_off(void) { DDRF &= ~(1<<6); PORTF &= ~(1<<6); }
inline void gh60_wasd_leds_off(void) { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
/* GH60 keymap definition macro
* K2C, K31 and K3C are extra keys for ISO
*/
#define KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
) { \
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
{ KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D } \
}
/* ANSI valiant. No extra keys for ISO */
#define KEYMAP_ANSI( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
) KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO, K3D, \
K40, K41, K42, K45, NO, K4A, K4B, K4C, K4D \
)
#define KEYMAP_HHKB( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
) KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
)
void matrix_init_user(void);
void matrix_scan_user(void);
void process_action_user(keyrecord_t *record);
void led_set_user(uint8_t usb_led);
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

@ -0,0 +1,69 @@
#include "gh60.h"
#include "action_layer.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP(
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NO, ENT, \
LSFT,FN1, Z, X, C, V, B, N, M, COMM,DOT, SLSH,FN0, RSFT, \
LCTL,LGUI,LALT, SPC, BSLS,RALT,RGUI,APP, RCTL),
/* 1: fn */
KEYMAP(
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \
TRNS,TRNS,UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS),
/* 2: arrows */
KEYMAP(
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,UP, \
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,LEFT,DOWN,RGHT),
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay
[1] = ACTION_LAYER_TOGGLE(2), // toggle arrow overlay
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
void matrix_scan_user(void) {
//Layer LED indicators
uint32_t layer = layer_state;
if (layer & (1<<1)) {
gh60_wasd_leds_on();
gh60_fn_led_on();
} else {
gh60_wasd_leds_off();
gh60_fn_led_off();
}
if (layer & (1<<2)) {
gh60_poker_leds_on();
gh60_esc_led_on();
} else {
gh60_poker_leds_off();
gh60_esc_led_off();
}
};

@ -0,0 +1,18 @@
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
* pin: F0 F1 E6 C7 C6 B6 D4 B1 B7 B5 B4 D7 D6 B3 (Rev.C)
*/
/* Row pin configuration
* row: 0 1 2 3 4
* pin: D0 D1 D2 D3 D5
*/
GPIO pads
0 F7 WASD LEDs
1 F6 ESC LED
2 F5 FN LED
3 F4 POKER Arrow LEDs
B2 Capslock LED
B0 not connected

@ -219,7 +219,7 @@ static void store_link(uint8_t *eeaddr)
xprintf("%s(%d)\r\n", s, strlen(s)); xprintf("%s(%d)\r\n", s, strlen(s));
if (strlen(s) == 12) { if (strlen(s) == 12) {
for (int i = 0; i < 12; i++) { for (int i = 0; i < 12; i++) {
eeprom_write_byte(eeaddr+i, *(s+i)); eeprom_update_byte(eeaddr+i, *(s+i));
dprintf("%c ", *(s+i)); dprintf("%c ", *(s+i));
} }
dprint("\r\n"); dprint("\r\n");

@ -41,7 +41,6 @@
# Target file name (without extension). # Target file name (without extension).
TARGET = planck TARGET = planck
# Directory common source filess exist # Directory common source filess exist
TOP_DIR = ../.. TOP_DIR = ../..
TMK_DIR = ../../tmk_core TMK_DIR = ../../tmk_core
@ -62,17 +61,28 @@ ifneq ("$(wildcard keymaps/$(KEYMAP).c)","")
else else
ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","") ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","")
KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c
ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
include keymaps/$(KEYMAP)/makefile.mk
endif
else else
$(error Keymap file does not exist) $(error Keymap file does not exist)
endif
endif endif
endif
else else
ifneq ("$(wildcard keymaps/default.c)","") ifneq ("$(wildcard keymaps/default.c)","")
KEYMAP_FILE = keymaps/default.c KEYMAP_FILE = keymaps/default.c
else else
KEYMAP_FILE = keymaps/default/keymap.c KEYMAP_FILE = keymaps/default/keymap.c
endif endif
ifneq ("$(wildcard keymaps/default/makefile.mk)","")
include keymaps/default/makefile.mk
endif
endif endif
SRC := $(KEYMAP_FILE) $(SRC) SRC := $(KEYMAP_FILE) $(SRC)
CONFIG_H = config.h CONFIG_H = config.h
@ -94,7 +104,6 @@ MCU = atmega32u4
# software delays. # software delays.
F_CPU = 16000000 F_CPU = 16000000
# #
# LUFA specific # LUFA specific
# #
@ -126,29 +135,45 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# USBaspLoader 2048 # USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096 OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options # Build Options
# comment out to disable the options. # change to "no" to disable the options, or define them in the makefile.mk in
# # the appropriate keymap folder that will get included automatically
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) #
MOUSEKEY_ENABLE = yes # Mouse keys(+4700) BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
CONSOLE_ENABLE = yes # Console for debug(+400) EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
COMMAND_ENABLE = yes # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality ifdef KEYMAP
# MIDI_ENABLE = YES # MIDI controls
# AUDIO_ENABLE = YES # Audio output on port C6 ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
# UNICODE_ENABLE = YES # Unicode ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID include keymaps/$(KEYMAP)/makefile.mk
# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. endif
ifdef BACKLIGHT_ENABLE
SRC += backlight.c
endif endif
else
ifneq ("$(wildcard keymaps/default/makefile.mk)","")
include keymaps/default/makefile.mk
endif
endif
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
SRC := backlight.c $(SRC)
endif
# Optimize size but this may cause error "relocation truncated to fit" # Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax #EXTRALDFLAGS = -Wl,--relax
@ -158,4 +183,4 @@ VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR) VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR) VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk include $(TOP_DIR)/quantum/quantum.mk

@ -73,10 +73,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* disable debug print */ /* disable debug print */
#define NO_DEBUG //#define NO_DEBUG
/* disable print */ /* disable print */
#define NO_PRINT //#define NO_PRINT
/* disable action features */ /* disable action features */
//#define NO_ACTION_LAYER //#define NO_ACTION_LAYER

@ -0,0 +1,112 @@

#include "planck.h"
#ifdef BACKLIGHT_ENABLE
#include "backlight.h"
#endif
#include "..\..\quantum\keymap_extras\keymap_german.h"
/* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
It has Umlauts and "ß" as it is optimized for a mix of German & English.
My favourite features are the placement of the special characters often used for programming right on the home row
and the number & navigation block combo, so you never have to move your hands from their home position.
Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Bone2
* ,-----------------------------------------------------------------------------------.
* | Q | J | D | U | A | X | P | H | L | M | W | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | M1 | C | T | I | E | O | B | N | R | S | G | M1 |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F | V | Ü | Ä | Ö | Y | Z | , | . | K |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter |
* `-----------------------------------------------------------------------------------'
*/
[0] = {
{ DE_Q, DE_J, DE_D, DE_U, DE_A, DE_X, DE_P, DE_H, DE_L, DE_M, DE_W, DE_SS },
{ MO(1), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, MO(1) },
{ DE_S, DE_F, DE_V, DE_UE, DE_AE, DE_OE, DE_Y, DE_Z, DE_COMM, DE_DOT, DE_K, DE_S },
{ KC_LCTL, KC_LGUI, KC_LALT, MO(3), MO(2), KC_SPC, KC_SPC, MO(2), MO(3), KC_ESC, KC_TAB, KC_ENT }
},
/* M1 Special Characters
* ,-----------------------------------------------------------------------------------.
* | ° | @ | _ | [ | ] | ^ | ! | < | > | = | & | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | M1 | \ | / | { | } | * | ? | ( | ) | - | : | M1 |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | # | $ | | | ~ | | + | % | " | ' | ; | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter |
* `-----------------------------------------------------------------------------------'
*/
[1] = {
{ DE_RING, DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL, DE_AMPR, KC_NO },
{ KC_TRNS, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, KC_TRNS },
{ KC_NO , DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, KC_NO },
{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
},
/* Navigation & Number Blocks
* ,-----------------------------------------------------------------------------------.
* | | PgUp | Bksp | Up | DEL | PgDn | | 7 | 8 | 9 | | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | Home | Lft | Down | Right| End | . | 4 | 5 | 6 | , | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| | Tab | Ins | Enter| | 0 | 1 | 2 | 3 | ; |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter |
* `-----------------------------------------------------------------------------------'
*/
[2] = {
{ KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO, DE_7, DE_8, DE_9, KC_NO, KC_NO },
{ KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_NO },
{ DE_S, KC_NO, KC_TAB, KC_INS, KC_ENT, KC_NO, KC_0, DE_1, DE_2, DE_3, DE_SCLN, DE_S },
{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
},
/* Function & Media Keys
* ,-----------------------------------------------------------------------------------.
* | | | Print|Scroll|Pause | | | F7 | F8 | F9 | F12 | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | Mute | Vol- | Vol+ | | ³ | F4 | F5 | F6 | F11 | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| | Prev | Play | Next | | ² | F1 | F2 | F3 | F10 |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | | Space | | M3 | Esc | Tab |Enter |
* `-----------------------------------------------------------------------------------'
*/
[3] = {
{ KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F12, KC_NO },
{ KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_NO },
{ KC_TRNS, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, KC_TRNS},
{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
}
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch (id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE
backlight_step();
#endif
}
else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};

@ -1,34 +1,2 @@
# The Default Planck Layout # The Default Planck Layout
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = { /* Qwerty */
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
[_CM] = { /* Colemak */
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
[_DV] = { /* Dvorak */
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
[_RS] = { /* RAISE */
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},
[_LW] = { /* LOWER */
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
}
};

@ -2,19 +2,46 @@
// this is the style you want to emulate. // this is the style you want to emulate.
#include "planck.h" #include "planck.h"
#ifdef BACKLIGHT_ENABLE #include "action_layer.h"
#include "backlight.h" #ifdef AUDIO_ENABLE
#include "audio.h"
#endif #endif
#include "eeconfig.h"
extern keymap_config_t keymap_config;
// Each layer gets a name for readability, which is then used in the keymap matrix below. // Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them // Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers. // entirely and just use numbers.
#define _QW 0 #define _QWERTY 0
#define _CM 1 #define _COLEMAK 1
#define _DV 2 #define _DVORAK 2
#define _LW 3 #define _LOWER 3
#define _RS 4 #define _RAISE 4
#define _MUSIC 5
#define _PLOVER 6
#define _ADJUST 16
// Macro name shortcuts
#define QWERTY M(_QWERTY)
#define COLEMAK M(_COLEMAK)
#define DVORAK M(_DVORAK)
#define LOWER M(_LOWER)
#define RAISE M(_RAISE)
#define M_BL 5
#define AUD_OFF M(6)
#define AUD_ON M(7)
#define MUS_OFF M(8)
#define MUS_ON M(9)
#define VC_IN M(10)
#define VC_DE M(11)
#define PLOVER M(12)
#define EXT_PLV M(13)
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@ -29,11 +56,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[_QW] = { [_QWERTY] = {
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
}, },
/* Colemak /* Colemak
@ -47,11 +74,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[_CM] = { [_COLEMAK] = {
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
}, },
/* Dvorak /* Dvorak
@ -65,59 +92,174 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[_DV] = { [_DVORAK] = {
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
/* Lower
* ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_LOWER] = {
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
{KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
{_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
}, },
/* Raise /* Raise
* ,-----------------------------------------------------------------------------------. * ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter | * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Next | Vol- | Vol+ | Play | * | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[_RS] = { [_RAISE] = {
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
}, },
/* Lower /* Music (reserved for process_action_user)
*
*/
[_MUSIC] = {
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
},
/* Plover layer (http://opensteno.org)
* ,-----------------------------------------------------------------------------------. * ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | * | # | # | # | # | # | # | # | # | # | # | # | # |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | * | | S | T | P | H | * | * | F | P | L | T | D |
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter | * | | S | K | W | R | * | * | R | B | G | S | Z |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Next | Vol- | Vol+ | Play | * | Exit | | | A | O | | E | U | | | |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[_LW] = {
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, [_PLOVER] = {
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 },
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX}
},
/* Adjust (Lower + Raise)
* ,-----------------------------------------------------------------------------------.
* | | Reset| | | | | | | | | | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | |Voice-|Voice+|Mus on|Musoff| | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_ADJUST] = {
{_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
{_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______},
{_______, VC_DE, VC_IN, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
} }
}; };
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
}; };
#ifdef AUDIO_ENABLE
float tone_startup[][2] = {
{440.0*pow(2.0,(31)/12.0), 12},
{440.0*pow(2.0,(28)/12.0), 8},
{440.0*pow(2.0,(19)/12.0), 8},
{440.0*pow(2.0,(24)/12.0), 8},
{440.0*pow(2.0,(28)/12.0), 20}
};
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
float tone_plover[][2] = SONG(PLOVER_SOUND);
float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
float goodbye[][2] = SONG(GOODBYE_SOUND);
#endif
void persistant_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{ {
// MACRODOWN only works in this function
switch(id) { switch(id) {
case 0: case _QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
break;
case _COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, 0);
#endif
persistant_default_layer_set(1UL<<_COLEMAK);
}
break;
case _DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
#endif
persistant_default_layer_set(1UL<<_DVORAK);
}
break;
case _LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
break;
case _RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
break;
case M_BL:
if (record->event.pressed) { if (record->event.pressed) {
register_code(KC_RSFT); register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
@ -127,6 +269,111 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
unregister_code(KC_RSFT); unregister_code(KC_RSFT);
} }
break; break;
case 6:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
audio_off();
#endif
}
break;
case 7:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
audio_on();
PLAY_NOTE_ARRAY(tone_startup, false, 0);
#endif
}
break;
case 8:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
layer_off(_MUSIC);
stop_all_notes();
#endif
}
break;
case 9:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(music_scale, false, 0);
layer_on(_MUSIC);
#endif
}
break;
case 10:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
voice_iterate();
PLAY_NOTE_ARRAY(music_scale, false, 0);
#endif
}
break;
case 11:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
voice_deiterate();
PLAY_NOTE_ARRAY(music_scale, false, 0);
#endif
}
break;
case 12:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_plover, false, 0);
#endif
layer_off(_RAISE);
layer_off(_LOWER);
layer_off(_ADJUST);
layer_off(_MUSIC);
stop_all_notes();
layer_on(_PLOVER);
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
keymap_config.raw = eeconfig_read_keymap();
keymap_config.nkro = 1;
eeconfig_update_keymap(keymap_config.raw);
}
break;
case 13:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
#endif
layer_off(_PLOVER);
}
break;
} }
return MACRO_NONE; return MACRO_NONE;
}; };
void matrix_init_user(void) {
#ifdef AUDIO_ENABLE
_delay_ms(20); // stops the tick
PLAY_NOTE_ARRAY(tone_startup, false, 0);
#endif
}
#ifdef AUDIO_ENABLE
void play_goodbye_tone()
{
PLAY_NOTE_ARRAY(goodbye, false, 0);
_delay_ms(150);
}
uint8_t starting_note = 0x0C;
int offset = 7;
void process_action_user(keyrecord_t *record) {
if (IS_LAYER_ON(_MUSIC)) {
if (record->event.pressed) {
play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
} else {
stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
}
}
#endif

@ -0,0 +1,2 @@
AUDIO_ENABLE = yes
NKRO_ENABLE = yes

@ -0,0 +1,88 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER Ortholinear Keyboards
#define PRODUCT The Planck Keyboard
#define DESCRIPTION A compact ortholinear keyboard
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 12
/* Planck PCB default pin-out */
#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }
#define ROWS (int []){ D0, D5, B5, B6 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
#define BACKLIGHT_LEVELS 3
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* ws2812 RGB LED */
#define ws2812_PORTREG PORTD
#define ws2812_DDRREG DDRD
#define ws2812_pin PD1
#define RGBLED_NUM 28 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,536 @@
#include "planck.h"
#include "action_layer.h"
#include "eeconfig.h"
#include "led.h"
#ifdef AUDIO_ENABLE
#include "audio.h"
#include "song_list.h"
#endif
#define LAYER_QWERTY 0
#define LAYER_COLEMAK 1
#define LAYER_DVORAK 2
#define LAYER_LOWER 3
#define LAYER_RAISE 4
#define LAYER_FUNCTION 5
#define LAYER_MOUSE 6
#define LAYER_MUSIC 7
#define LAYER_ADJUST 8
#define MACRO_QWERTY 0
#define MACRO_COLEMAK 1
#define MACRO_DVORAK 2
#define MACRO_LOWER 3
#define MACRO_RAISE 4
#define MACRO_FUNCTION 5
#define MACRO_MOUSE 6
#define MACRO_TIMBRE_1 7
#define MACRO_TIMBRE_2 8
#define MACRO_TIMBRE_3 9
#define MACRO_TIMBRE_4 10
#define MACRO_TEMPO_U 11
#define MACRO_TEMPO_D 12
#define MACRO_TONE_DEFAULT 13
#define MACRO_MUSIC_ON 14
#define MACRO_MUSIC_OFF 15
#define MACRO_AUDIO_ON 16
#define MACRO_AUDIO_OFF 17
#define MACRO_INC_VOICE 18
#define MACRO_DEC_VOICE 19
#define M_QWRTY M(MACRO_QWERTY)
#define M_COLMK M(MACRO_COLEMAK)
#define M_DVORK M(MACRO_DVORAK)
#define M_LOWER M(MACRO_LOWER)
#define M_RAISE M(MACRO_RAISE)
#define M_FUNCT M(MACRO_FUNCTION)
#define M_MOUSE M(MACRO_MOUSE)
#define TIMBR_1 M(MACRO_TIMBRE_1)
#define TIMBR_2 M(MACRO_TIMBRE_2)
#define TIMBR_3 M(MACRO_TIMBRE_3)
#define TIMBR_4 M(MACRO_TIMBRE_4)
#define TMPO_UP M(MACRO_TEMPO_U)
#define TMPO_DN M(MACRO_TEMPO_D)
#define TMPO_DF M(MACRO_TONE_DEFAULT)
#define MUS_ON M(MACRO_MUSIC_ON)
#define MUS_OFF M(MACRO_MUSIC_OFF)
#define AUD_OFF M(MACRO_AUDIO_OFF)
#define AUD_ON M(MACRO_AUDIO_ON)
#define VC_UP M(MACRO_INC_VOICE)
#define VC_DOWN M(MACRO_DEC_VOICE)
#define SC_UNDO LCTL(KC_Z)
#define SC_REDO LCTL(KC_Y)
#define SC_CUT LCTL(KC_X)
#define SC_COPY LCTL(KC_C)
#define SC_PSTE LCTL(KC_V)
#define SC_SELA LCTL(KC_A)
#define SC_SAVE LCTL(KC_S)
#define SC_OPEN LCTL(KC_O)
#define SC_ACLS LALT(KC_F4)
#define SC_CCLS LCTL(KC_F4)
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define ________________ _______, _______
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY
* .-----------------------------------------------------------------------------------------------------------.
* | TAB | Q | W | E | R | T | Y | U | I | O | P | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | ESC | A | S | D | F | G | H | J | K | L | ; | ' |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | Z | X | C | V | B | N | M | , | . | / | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_QWERTY] = { /* QWERTY */
{ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC },
{ KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT },
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT },
},
/* COLEMAK
* .-----------------------------------------------------------------------------------------------------------.
* | TAB | Q | W | F | P | G | J | L | U | Y | ; | ESC |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | BACKSP | A | R | S | T | D | H | N | E | I | O | ' |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | Z | X | C | V | B | K | M | , | . | / | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_COLEMAK] = { /* COLEMAK */
{ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_ESC },
{ KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT },
{ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT },
},
/* DVORAK
* .-----------------------------------------------------------------------------------------------------------.
* | TAB | ' | , | . | P | Y | F | G | C | R | L | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | ESC | A | O | E | U | I | D | H | T | N | S | ' |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_DVORAK] = { /* DVORAK */
{ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC },
{ KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH },
{ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT },
},
/* Raise
* .-----------------------------------------------------------------------------------------------------------.
* | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | XXXXXX | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | [ | ] | \ |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | BACKSP | BACKSP | LOWER | PG UP | PG DN | HOME | END |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_RAISE] = { /* RAISED */
{ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL },
{ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS },
{ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_PGUP, KC_PGDN, KC_HOME, KC_END },
},
/* LOWERED
* .-----------------------------------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | INS |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | XXXXXX | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | BACKSP | BACKSP | LOWER | PG UP | PG DN | HOME | END |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_LOWER] = { /* LOWERED */
{ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_INS },
{ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS },
{ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_PGUP, KC_PGDN, KC_HOME, KC_END },
},
/* FUNCTION
* .-----------------------------------------------------------------------------------------------------------.
* | NUM LK | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | PAUSE |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | CAP LK | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | PRINT |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | SCR LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MUTE |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | PLAY | PLAY | LOWER | VOL UP | VOL DN | NEXT | PREV |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_FUNCTION] = { /* FUNCTION */
{ KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_PAUS },
{ KC_CAPS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_PSCR },
{ KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE },
{ _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT },
},
#ifdef MOUSEKEY_ENABLE
[LAYER_MOUSE] = { /* MOUSE */
{ KC_ESC, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ _______, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_U, KC_WH_D },
{ _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, KC_MS_U, KC_MS_D, KC_MS_L, KC_MS_R },
},
#endif
[LAYER_MUSIC] = { /* MUSIC */
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_RAISE, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
},
[LAYER_ADJUST] = { /* ADJUST */
{ _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, MUS_ON, MUS_OFF, AUD_ON, AUD_OFF },
{ _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, RESET, _______, M_MOUSE, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, VC_UP, VC_DOWN, _______, _______ },
},
/*
[LAYER_EMPTY] = {
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, },
},
*/
};
#ifdef AUDIO_ENABLE
float tone_my_startup[][2] = SONG(ODE_TO_JOY);
float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE);
float tone_music_on[][2] = SONG(DOE_A_DEER);
float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
float tone_caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
float tone_numlk_on[][2] = SONG(NUM_LOCK_ON_SOUND);
float tone_numlk_off[][2] = SONG(NUM_LOCK_OFF_SOUND);
float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND);
float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
#endif /* AUDIO_ENABLE */
void persistant_default_layer_set(uint16_t default_layer)
{
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id)
{
case MACRO_QWERTY:
if (record->event.pressed)
{
persistant_default_layer_set(1UL<<LAYER_QWERTY);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
case MACRO_COLEMAK:
if (record->event.pressed)
{
persistant_default_layer_set(1UL<<LAYER_COLEMAK);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
case MACRO_DVORAK:
if (record->event.pressed)
{
persistant_default_layer_set(1UL<<LAYER_DVORAK);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
case MACRO_LOWER:
if (record->event.pressed)
{
layer_on(LAYER_LOWER);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
else
{
layer_off(LAYER_LOWER);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
break;
case MACRO_RAISE:
if (record->event.pressed)
{
layer_on(LAYER_RAISE);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
else
{
layer_off(LAYER_RAISE);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
break;
case MACRO_FUNCTION:
if (record->event.pressed)
{
layer_on(LAYER_FUNCTION);
}
else
{
layer_off(LAYER_FUNCTION);
}
break;
#ifdef MOUSEKEY_ENABLE
case MACRO_MOUSE:
if (record->event.pressed)
{
layer_invert(LAYER_MOUSE);
}
break;
#endif /* MOUSEKEY_ENABLE */
#ifdef AUDIO_ENABLE
case MACRO_TIMBRE_1:
if (record->event.pressed) set_timbre(TIMBRE_12);
break;
case MACRO_TIMBRE_2:
if (record->event.pressed) set_timbre(TIMBRE_25);
break;
case MACRO_TIMBRE_3:
if (record->event.pressed) set_timbre(TIMBRE_50);
break;
case MACRO_TIMBRE_4:
if (record->event.pressed) set_timbre(TIMBRE_75);
break;
case MACRO_TEMPO_U:
if (record->event.pressed) increase_tempo(10);
break;
case MACRO_TEMPO_D:
if (record->event.pressed) decrease_tempo(10);
break;
case MACRO_TONE_DEFAULT:
if (record->event.pressed)
{
set_timbre(TIMBRE_DEFAULT);
set_tempo(TEMPO_DEFAULT);
}
break;
case MACRO_AUDIO_OFF:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_off();
#endif
}
break;
case MACRO_AUDIO_ON:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_on();
PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
#endif
}
break;
case MACRO_MUSIC_ON:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);
layer_on(LAYER_MUSIC);
#endif
}
break;
case MACRO_MUSIC_OFF:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
layer_off(LAYER_MUSIC);
stop_all_notes();
#endif
}
break;
case MACRO_INC_VOICE:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
voice_iterate();
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
#endif
}
break;
case MACRO_DEC_VOICE:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
voice_deiterate();
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
#endif
}
break;
#endif /* AUDIO_ENABLE */
default:
break;
}
return MACRO_NONE;
};
#ifdef AUDIO_ENABLE
void process_action_user(keyrecord_t *record)
{
uint8_t starting_note = 0x0C;
int offset = 7;
if (IS_LAYER_ON(LAYER_MUSIC))
{
if (record->event.pressed)
{
play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
}
else
{
stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
}
}
void matrix_init_user(void)
{
set_voice(default_voice);
play_startup_tone();
println("Matrix Init");
}
void led_set_user(uint8_t usb_led)
{
static uint8_t old_usb_led = 0;
_delay_ms(10); // gets rid of tick
if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
{
// If CAPS LK LED is turning on...
PLAY_NOTE_ARRAY(tone_caps_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
{
// If CAPS LK LED is turning off...
PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
}
else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
{
// If NUM LK LED is turning on...
PLAY_NOTE_ARRAY(tone_numlk_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
{
// If NUM LED is turning off...
PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
}
else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
{
// If SCROLL LK LED is turning on...
PLAY_NOTE_ARRAY(tone_scroll_on, false, LEGATO);
}
else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
{
// If SCROLL LED is turning off...
PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
}
old_usb_led = usb_led;
}
void play_startup_tone()
{
_delay_ms(10); // gets rid of tick
PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
}
void play_goodbye_tone()
{
PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
_delay_ms(1000);
}
#endif /* AUDIO_ENABLE */

@ -0,0 +1,16 @@
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
CONFIG_H = keymaps/$(KEYMAP)/config.h

@ -0,0 +1,1628 @@
:100000000C94FE040C9442050C9442050C94420599
:100010000C9442050C9442050C9442050C94420544
:100020000C9442050C9442050C94A6180C94781973
:100030000C94DB270C9442050C9442050C94420569
:100040000C9442050C9442050C9442050C94420514
:100050000C9442050C9443280C9442050C944205E0
:100060000C9442050C9442050C9442050C944205F4
:100070000C9442050C9442050C9442050C944205E4
:100080000C94D10E0C9442050C9442050C9442053C
:100090000C9442050C9442050C9442050C944205C4
:1000A0000C9442050C9442050C9442059D05AD0547
:1000B000BF05CF05D505E405F005F60504060D06D8
:1000C0001E062E06340664069013901390139013A8
:1000D000901390139013901390139013A713A713DA
:1000E000A713A713A713A713A713A713A713A71340
:1000F00090139013901390139013A713A713A713A3
:10010000A713A713901390139013A713A713A71364
:10011000E519071AF51A071AF51A4C1A6F1AF51A83
:10012000C41AD71ADA1DDA1D171E171E711EAF1E4C
:1001300027212721C81E2721C91FC91F8C20A320C2
:100140002721122107634236B79BD8A71A39685670
:1001500018AEBAAB558C1D3CB7CC5763BD6DEDFDE9
:10016000753EF6177231BF000000803F08000000A6
:10017000BE922449123EABAAAA2ABECDCCCC4C3E9C
:1001800000000080BEABAAAAAA3E00000000BF008B
:100190000000803F0000000000084178D3BB438787
:1001A000D1133D190E3CC3BD4282AD2B3E68EC829B
:1001B00076BED98FE1A93E4C80EFFFBE01C4FF7F20
:1001C0003F00000000002B0014001A00080015007A
:1001D00017001C0018000C00120013002A00290050
:1001E00004001600070009000A000B000D000E00B5
:1001F0000F0033003400E1001D001B000600190051
:1002000005001100100036003700380028000530C6
:10021000E000E200E30003302C002C00043050002A
:10022000510052004F002B0014001A000900130067
:100230000A000D000F0018001C0033002A002900DE
:10024000040015001600170007000B00110008003D
:100250000C0012003400E1001D001B000600190014
:1002600005000E0010003600370038002800053069
:10027000E000E200E30003302C002C0004305000CA
:10028000510052004F002B0034003600370013009D
:100290001C0009000A00060015000F002A002900B2
:1002A00004001200080018000C0007000B001700E3
:1002B000110016003800E100330014000D000E009C
:1002C0001B00050010001A0019001D002800053051
:1002D000E000E200E30003302C002C00043050006A
:1002E000510052004F0035021E021F02200221025F
:1002F0002202230224022502260227022A004C00A1
:100300003A003B003C003D003E003F002D022E0223
:100310002F02300231020100400041004200430040
:10032000440045000100010001000100010001003E
:100330000100010001000100010001000100AB000B
:10034000AA00A900AE0035001E001F0020002100F9
:100350002200230024002500260027002A004C004C
:100360003A003B003C003D003E003F002D002E00C7
:100370002F003000310001004000410042004300E6
:1003800044004500010001000100010001000100DE
:100390000100010001000100010001000100AB00AB
:1003A000AA00A900AE00000000000000000000004C
:1003B000000000000000000000000000000000003D
:1003C000000000000000000000000000000000002D
:1003D000000000000000000000000000000000001D
:1003E000000000000000000000000000000000000D
:1003F0000000000000000330000000000430000096
:100400000000000000001E001E001E001E001E0056
:100410001E001E001E001E001E001E001E0000000A
:1004200014001A000800150017001C0018000C002A
:10043000120013002F00000004001600070009003E
:100440000A000B000D000E000F00330034000D30C9
:10045000000000000600190000000000110010005C
:10046000000000000000000000000000000000008C
:10047000000000000000000000000000000000007C
:10048000000000000000000000000000000000006C
:10049000000000000000000000000000000000005C
:1004A000000000000000000000000000000000004C
:1004B000000000000000000000000000000000003C
:1004C000000000000000000000000000000000002C
:1004D000000000000000000000000000000000001C
:1004E000000000000000000000000000000000000C
:1004F00000000000000000000000000000000000FC
:1005000000000000000000000000000000000000EB
:1005100000000000000000000000000000000000DB
:1005200000000000000000000000000000000000CB
:1005300000000000000000000000000000000000BB
:1005400000000000000000000000000000000000AB
:10055000000000000000000000000000000000009B
:10056000000000000000000000000000000000008B
:10057000000000000000000000000000000000007B
:10058000000000000000000000000000000000006B
:10059000000000000000000000000000000000005B
:1005A000000000000000000000000000000000004B
:1005B000000000000000000000000000000000003B
:1005C000000000000000000000000000000000002B
:1005D000000000000000000000000000000000001B
:1005E000000000000000000000000000000000000B
:1005F00000000000000000000000000000000000FB
:1006000000000000000000000000000000000000EA
:1006100000000000000000000000000000000000DA
:1006200000000000000000000000000000000000CA
:1006300000000000000000000000000000000000BA
:1006400000000000000000000000000000000000AA
:10065000000000000000000000000000000000009A
:10066000000000000000000000000000000000008A
:10067000000000000000000000000000000000007A
:10068000000000000000000000000000000000006A
:10069000000000000000000000000000000000005A
:1006A000000000000000000000000000000000004A
:1006B000000000000000000000000000000000003A
:1006C000000000000000000000000000000000002A
:1006D000000000000000000000000000000000001A
:1006E000000000000000000000000000000000000A
:1006F00000000000000000000000000000000000FA
:1007000000000000000000000000000000000000E9
:1007100000000000000000000000000000000000D9
:1007200000000000000000000000000000000000C9
:1007300000000000000000000000000000000000B9
:1007400000000000000000000000000000000000A9
:100750000000000000000000000000000000000099
:100760000000000000000000000000000000000089
:100770000000000000000000000000000000000079
:100780000000000000000000000000000000000069
:100790000000000000000000000000000000000059
:1007A0000000000000000000000000000000000049
:1007B0000000000000000000000000000000000039
:1007C00000000000000001000050010001000100D5
:1007D0000100010001000100010001004C000100C6
:1007E0000100010007300630135012500030013074
:1007F00002300C30010001000B300A3009300830A3
:1008000001000100010001000100010001000100E0
:1008100001000100010001000100010001000100D0
:100820000100010001002803540068006500200059
:1008300050006C0061006E0063006B0020004B00F4
:100840006500790062006F006100720064000000C2
:100850002C034F007200740068006F006C00690088
:100860006E0065006100720020004B006500790099
:1008700062006F00610072006400730000000403F6
:10088000090409026D00040100A0FA090400000136
:1008900003010100092111010001223F0007058128
:1008A0000308000A090401000103010200092111E3
:1008B000010001224D000705820308000A09040215
:1008C0000001030000000921110100012236000788
:1008D00005830308000A090403000103000000095E
:1008E00021110100012239000705840310000112C3
:1008F00001100100000008EDFE606001000102002F
:100900000105010906A101050719E029E7150025E0
:1009100001950875018102050819012905950575DC
:1009200001910295017503910105071900297715B9
:10093000002501957875018102C005010980A1019A
:10094000850216010026B7001A01002AB7007510AB
:1009500095018100C0050C0901A101850316010064
:10096000269C021A01002A9C02751095018100C084
:1009700005010902A1010901A100050919012905C3
:100980001500250195057501810295017503810109
:100990000501093009311581257F95027508810609
:1009A00009381581257F950175088106050C0A38DF
:1009B000021581257F950175088106C0C0050109D2
:1009C00006A101050719E029E7150025019508751D
:1009D0000181029501750881010508190129059514
:1009E000057501910295017503910105071900290B
:1009F000FF150025FF950675088100C011241FBE54
:100A0000CFEFDAE0DEBFCDBF04B603FE24C0809195
:100A1000190490911A04A0911B04B0911C04873012
:100A2000904BA740B04BB9F41092190410921A04DD
:100A300010921B0410921C0414BE84B7877F84BFDD
:100A400088E10FB6F89480936000109260000FBEAA
:100A5000E0E0F8E3099513E0A0E0B1E0E4E8F3E6B4
:100A600002C005900D92A431B107D9F714E0A4E1BA
:100A7000B3E001C01D92A931B107E1F70E94EC1566
:100A80000C94C0310C940000279A2F988FEF9FEFA1
:100A900090938700809386008AE08093800089E1AC
:100AA000809381000C94452D282F81110BC08091DB
:100AB0008000877F8093800010928D0010928C00C0
:100AC0002F9808952F9880918000886080938000EF
:100AD000233019F48FEF9FEF0FC083E090E0821B6B
:100AE0009109880F991F2FEF3FEFA90102C056957A
:100AF00047958A95E2F7CA0190938D0080938C0008
:100B00000895CF93DF93EC010E94DC28BE0180E0C2
:100B100090E0DF91CF910C9407250F931F93462F00
:100B200050E04E30510508F0DEC0DC01FA01EA5A0F
:100B3000FF4F12968C910C948431882309F4D3C012
:100B400000E010E0980140E064E070E08BE292E0A9
:100B50000E944F1281E090E00FC0882309F4C3C0C7
:100B600000E010E0980140E066E070E08BEB91E07F
:100B70000E944F1282E090E00E948105B4C0882359
:100B800009F4B1C000E010E0980140E068E070E0D6
:100B90008BEE91E00E944F1284E090E0EDCF88232D
:100BA00011F083E005C083E00CC0882349F084E0A5
:100BB0000E94842540E164E083E00E94910A93C092
:100BC00084E00E94A525F6CF882331F085EE0E94AF
:100BD0006E1C0E949C2D87C085EE0E94361D83C02E
:100BE000882309F480C00E94E30D7DC0882309F4A6
:100BF0007AC00E94DC0D00E010E0980140E065E062
:100C000070E08BE492E027C0882309F46CC085E093
:100C10000E94A5250E94040E66C0882309F463C0C3
:100C200000E010E0980140E068E070E08BE191E0C6
:100C30000E944F1285E00E94842555C0882309F444
:100C400052C00E94E21200E010E0980140E068E02B
:100C500070E08BE191E00E944F1245C0882309F4B7
:100C600042C00E94ED12EFCF8823E9F100E010E0CE
:100C7000980140E066E070E08BE891E00E944F123E
:100C800084E00E94A52583E00E94A52580E10E94C2
:100C9000A52585E00E94A5250E94040E86E00E94FD
:100CA00084250E94C928811102C00E94A5280E94A3
:100CB000E12890E090931804809317048068809353
:100CC00017040E94E5280FC0882369F000E010E0B7
:100CD000980140E066E070E08BE591E00E944F12E1
:100CE00086E00E94A52580E090E01F910F91089575
:100CF0000F931F932FEF89EF90E021508040904099
:100D0000E1F700C0000000E010E0980140E065E07D
:100D100070E08BE492E00E944F121F910F910895B2
:100D20000F931F9300E010E0980140E063E070E053
:100D300083E091E00E944F122FEF82E597E021506F
:100D400080409040E1F700C000001F910F9108958E
:100D5000CF92DF92EF92FF920F931F93CF93DF9387
:100D6000CDB7DEB7CC58D1090FB6F894DEBF0FBEB1
:100D7000CDBF2091D10325FFC5C08C01FC0192811C
:100D800080910201992309F460C096E4E0E9F2E061
:100D9000DE01A95BBF4F01900D929A95E1F7F80132
:100DA0009081E0910001F0910101E90FF11DEE0F3A
:100DB000FF1F27E430E02C0F3D1FE20FF31F60817F
:100DC0007181680F711D882777FD8095982F0E948B
:100DD000E02E20E030E040E451E40E94452E6B011B
:100DE0007C01F801218184E090E0821B9109BC0123
:100DF000882777FD8095982F0E94E02E9B01AC01FB
:100E0000C701B6010E94DD2D9B01AC0160E070E0DE
:100E100080E090E40E94F72F20E030E04CE551E4C0
:100E20000E94942F4FE050E0C457DF4F0FB6F89464
:100E3000DEBF0FBECDBFDF91CF911F910F91FF900D
:100E4000EF90DF90CF900C94EF1196E4E0E9F2E0A0
:100E5000DE01119601900D929A95E1F7F8019081CB
:100E6000E0910001F0910101E90FF11DEE0FFF1F6C
:100E700021E030E02C0F3D1FE20FF31F60817181F4
:100E8000680F711D882777FD8095982F0E94E02EAE
:100E900020E030E040E451E40E94452E6B017C01EB
:100EA000F801218184E090E0821B9109BC01882730
:100EB00077FD8095982F0E94E02E9B01AC01C70121
:100EC000B6010E94DD2D9B01AC0160E070E080E086
:100ED00090E40E94F72F20E030E04CE551E40E94BE
:100EE000942FC457DF4F0FB6F894DEBF0FBECDBFAF
:100EF000DF91CF911F910F91FF90EF90DF90CF90F6
:100F00000C94370EC457DF4F0FB6F894DEBF0FBEF8
:100F1000CDBFDF91CF911F910F91FF90EF90DF90A8
:100F2000CF90089508950E9444056E9A769A0C9485
:100F300078060C9492070C94A8060895880F991FC0
:100F4000FC01EA5BFF4F859194910895880F991FEA
:100F5000FC01EA53FE4F8591949108950F931F93DE
:100F6000CF93DF93EC01811520E49207A0F5C11522
:100F700080E3D80708F0E1C0C83ED105D8F4C03EF0
:100F8000D10508F0EEC1C83AD10578F4C53AD105CB
:100F900008F074C0C130D10509F46DC008F4DEC199
:100FA000C430D10508F0DDC1D9C1CB3BD10508F46F
:100FB00070C0D4C1C11590E2D90708F0B9C0C115FD
:100FC00021E0D20708F0CDC1C03FD10508F4C6C169
:100FD0008E01106506C2C13080E5D80709F4BDC096
:100FE00068F5C13120E4D20709F4AEC050F4C03135
:100FF00090E4D90708F0A5C0CF70DD278E01146DED
:10100000F0C1C33120E4D20709F4A4C008F49FC0A2
:10101000C115D04509F0A2C10E944B210E94040EC7
:101020000E9490069FEF24E38CE091502040804086
:10103000E1F700C000000E946828D3C1C11520E676
:10104000D20730F4C11581E5D80708F48CC02DC152
:10105000C11590E7D90708F481C1C11520E8D2076E
:1010600008F478C1C11580E9D80708F077C1DF70AE
:101070008E01106AB6C101E010E0B3C1C53AD105D6
:1010800009F471C1C63AD10509F070C102E810E453
:10109000A8C1C83AD10509F46CC1C93AD10509F40F
:1010A0006BC1CA3AD10509F46AC1CB3AD10509F43A
:1010B00069C1CC3AD10509F468C1CD3AD10509F42A
:1010C00067C1C03BD10509F466C1CE3AD10509F428
:1010D00065C1CF3AD10509F464C1C13BD10509F41A
:1010E00063C1C23BD10509F462C1C33BD10509F418
:1010F00061C1C43BD10509F460C1C53BD10509F408
:101100005FC1C63BD10509F45EC1C73BD10509F4F7
:101110005DC1C83BD10509F45CC1C93BD10509F4E7
:101120005BC1CA3BD10509F45AC100E014E459C1BE
:10113000CE019F700E94A60755C1DD278E01106C5D
:1011400050C100E011ED4DC100E010ED4AC100E0DA
:1011500012ED47C100E013ED44C18091ED038160C1
:101160008093ED033EC10E94C928811102C00E94F4
:10117000A5280E94E12890E090931804809317041A
:10118000C23090E5D90721F480911704816086C0B0
:10119000C43020E5D20721F48091170482607EC01C
:1011A000C63080E5D80721F480911704846076C0AA
:1011B000C83090E5D90719F48091170427C0CA30C8
:1011C00020E5D20721F480911704806167C0CC30FC
:1011D00080E5D80721F48091170480625FC0CE308B
:1011E00090E5D90721F480911704806457C0C0317D
:1011F00020E5D20721F48091170480684FC0C231E6
:1012000080E5D80729F4809117048460886046C07F
:10121000C33090E5D90721F4809117048E7F3EC03A
:10122000C53020E5D20721F4809117048D7F36C0A8
:10123000C73080E5D80721F4809117048B7F2EC03A
:10124000C93090E5D90719F48091170426C0CB3036
:1012500020E5D20721F4809117048F7E1FC0CD3086
:1012600080E5D80721F4809117048F7D17C0CF3017
:1012700090E5D90721F4809117048F7B0FC0C1310D
:1012800020E5D20721F4809117048F7707C0C3317E
:10129000D04531F4809117048B7F877F80931704AA
:1012A000809117040E94E5289CC08D2F99278F708C
:1012B000992781309105D9F49E012370332702C00C
:1012C000880F991F2A95E2F79C688E0144E0000F71
:1012D000111F4A95E1F700271370802B912B53E0E3
:1012E000CC0FDD1F5A95E1F7C076DD272FC0823085
:1012F000910531F4DC2FCC278E01016F106A71C08B
:101300008330910569F4CE018370992701E010E0E4
:1013100002C0000F111F8A95E2F7C8019C680FC038
:10132000049709F05EC0CE018370992701E010E0B8
:1013300002C0000F111F8A95E2F7C8019A6823E0E6
:10134000CC0FDD1F2A95E1F7C07ED7708C010C2BE6
:101350001D2B47C0DF708E01106243C000E010E01B
:1013600040C08E013EC001E810E43BC003E810E439
:1013700038C002EE14E435C009EE14E432C00AEEBF
:1013800014E42FC005EB14E42CC006EB14E429C0D0
:1013900007EB14E426C00CEC14E423C00DEC14E4B9
:1013A00020C003E815E41DC00AE815E41AC002E9EC
:1013B00015E417C004E915E414C001E216E411C0F5
:1013C00003E216E40EC004E216E40BC005E216E4E4
:1013D00008C006E216E405C007E216E402C00AE20D
:1013E00016E4C801DF91CF911F910F9108959CE001
:1013F000799FF001112490E3899FE00DF11D1124E4
:10140000E60FF11DEE0FFF1FEA53FE4F85919491F9
:10141000803E9105E0F4803C910558F581339105BB
:1014200009F46FC048F48932910509F463C08A3227
:10143000910509F46DC072C089339105E9F08238D5
:101440009105D1F08533910509F44DC067C0833E05
:10145000910581F138F4803E9105B9F0823E910505
:10146000D9F05CC0863E910561F1873E9105A1F1FE
:1014700055C00E949E0708952091170420FD02C0C8
:1014800021FF4CC080EE90E049C08091170480FF9E
:10149000F9CF89E390E042C08091170482FF0EC02B
:1014A0008091170484FF03C080E090E037C083EE92
:1014B00090E034C08091170482FFF2CF82EE90E07A
:1014C0002DC08091170483FF0BC08091170484FD09
:1014D000EBCF87EE90E022C08091170483FFF5CF19
:1014E00086EE90E01BC08091170485FF07C089E25B
:1014F00090E014C08091170485FFF9CF85E390E058
:101500000DC08091170486FF07C08AE290E006C0F4
:101510008091170486FFF9CF81E390E00E94AE0727
:101520000895CF92DF92EF92FF920F931F9301E005
:1015300010E020E030E06801790104C0CC0CDD1C33
:10154000EE1CFF1C8A95D2F704C0000F111F221F4A
:10155000331F6A95D2F70C291D292E293F29C090E7
:10156000D103D090D203E090D303F090D403C022F3
:10157000D122E222F322842FC016D106E206F3061E
:1015800041F41F910F91FF90EF90DF90CF900C945A
:1015900084251F910F91FF90EF90DF90CF900C94D6
:1015A000A52508950C94D10A5F926F927F928F9235
:1015B0009F92AF92BF92CF92DF92EF92FF920F93E2
:1015C0001F93CF93DF93CDB7DEB728970FB6F8946C
:1015D000DEBF0FBECDBFCE0101966C014E0199E07A
:1015E000890E911C20E030E040E050E060E070E0C7
:1015F00000E010E0E12CF12C6C2C5D2C88E0782EC2
:10160000AA24A394B12CE6EDF2E0A62DB52D872DEA
:1016100001900D928A95E1F7F601819191916F0108
:10162000FC01E07FFF27E032F10559F48F70992724
:10163000F50102C0EE0FFF1F8A95E2F7EE2AFF2A9E
:1016400037C0E033F10559F48F709927F50102C0D6
:10165000EE0FFF1F8A95E2F70E2B1F2B29C0E034F7
:10166000F10559F48F709927F50102C0EE0FFF1FA5
:101670008A95E2F76E2B7F2B1BC0E035F10559F4FC
:101680008F709927F50102C0EE0FFF1F8A95E2F7D0
:101690004E2B5F2B0DC0E036F10551F48F7099276A
:1016A000F50102C0EE0FFF1F8A95E2F72E2B3F2BAC
:1016B000C814D90409F0A7CF84B19E2D9095892331
:1016C00084B985B1E82AE5B887B1902F9095892330
:1016D00087B988B1082B08B98AB1962F90958923CC
:1016E0008AB98BB1682B6BB98DB1942F90958923F2
:1016F0008DB98EB1482B4EB980B3922F9095892326
:1017000080BB81B3282B21BB28960FB6F894DEBF8F
:101710000FBECDBFDF91CF911F910F91FF90EF9042
:10172000DF90CF90BF90AF909F908F907F906F9001
:101730005F9008955F926F927F928F929F92AF9287
:10174000BF92CF92DF92EF92FF920F931F93CF93AE
:10175000DF93CDB7DEB768970FB6F894DEBF0FBE44
:10176000CDBF85B7806885BF85B7806885BF0E947B
:10177000D40ACE0101966C014E0199E1890E911CAB
:1017800020E030E040E050E060E070E000E010E099
:10179000E12CF12C6C2C5D2C88E1782EAA24A394EA
:1017A000B12CEEEDF2E0A62DB52D872D01900D9216
:1017B0008A95E1F7F601819191916F01FC01E07F3B
:1017C000FF27E032F10559F48F709927F50102C027
:1017D000EE0FFF1F8A95E2F7EE2AFF2A37C0E033AB
:1017E000F10559F48F709927F50102C0EE0FFF1F24
:1017F0008A95E2F70E2B1F2B29C0E034F10559F42E
:101800008F709927F50102C0EE0FFF1F8A95E2F74E
:101810006E2B7F2B1BC0E035F10559F48F70992793
:10182000F50102C0EE0FFF1F8A95E2F74E2B5F2BEA
:101830000DC0E036F10551F48F709927F50102C013
:10184000EE0FFF1F8A95E2F72E2B3F2BC814D90409
:1018500009F0A7CF84B19E2D9095892384B985B1D5
:10186000E82AE5B887B1902F9095892387B988B188
:10187000082B08B98AB1962F909589238AB98BB124
:10188000682B6BB98DB1942F909589238DB98EB14A
:10189000482B4EB980B3922F9095892380BB81B39A
:1018A000282B21BB10921D0310921C0310921503CC
:1018B0001092140310921F0310921E03109217032C
:1018C0001092160310922103109220031092190314
:1018D00010921803109223031092220310921B03FC
:1018E00010921A0368960FB6F894DEBF0FBECDBFF4
:1018F000DF91CF911F910F91FF90EF90DF90CF90EC
:10190000BF90AF909F908F907F906F905F900C945E
:1019100093077F928F929F92AF92BF92CF92DF9266
:10192000EF92FF920F931F93CF93DF93CDB7DEB764
:10193000A0970FB6F894DEBF0FBECDBF6E0149E190
:10194000C40ED11C84E1E82E83E0F82E98E0792EB5
:10195000BC2CAD2C01E010E028E1822E35E0932E66
:10196000E6EDF2E0AB2DBA2D872D01900D928A9510
:10197000E1F7F601819191916F019C01207F33275E
:101980002032310591F424B18F709927A80102C04B
:10199000440F551F8A95E2F7CA01922F982B94B9EC
:1019A00095B18095892385B953C02033310591F4D1
:1019B00027B18F709927F80102C0EE0FFF1F8A959B
:1019C000E2F7CF01922F982B97B998B18095892390
:1019D00088B93EC02034310591F42AB18F7099271F
:1019E000A80102C0440F551F8A95E2F7CA01922F41
:1019F000982B9AB99BB1809589238BB929C0203542
:101A0000310591F42DB18F709927F80102C0EE0FC6
:101A1000FF1F8A95E2F7CF01922F982B9DB99EB1B7
:101A2000809589238EB914C02036310589F420B3FE
:101A30008F709927A80102C0440F551F8A95E2F7BD
:101A4000CA01922F982B90BB91B38095892381BBBB
:101A500050EA5A95F1F7BE016F5F7F4F20E030E00A
:101A600040E050E0EEEDF2E0DE011196882D0190AD
:101A70000D928A95E1F7FB0181919191BF01FC01E3
:101A8000E07FFF27E032F10511F4E3B113C0E0334A
:101A9000F10511F4E6B10EC0E034F10511F4E9B13D
:101AA00009C0E035F10511F4ECB104C0E036F105F0
:101AB000B9F4EFB1F0E08F70992702C0F595E79582
:101AC0008A95E2F7E0FD08C0C801042E02C0880F25
:101AD000991F0A94E2F702C080E090E0282B392B8E
:101AE0004F5F5F4F4C30510509F0BCCFF70180814B
:101AF00091818217930721F03183208390927302A2
:101B00000E94D40AF2E0EF0EF11C4CE1E41643E02F
:101B1000F40609F025CF80917302882361F181508A
:101B200080937302882339F08FE99FE00197F1F7E2
:101B300000C0000020C08091140390911503909381
:101B40001D0380931C0380911603909117039093BB
:101B50001F0380931E0380911803909119039093A3
:101B600021038093200380911A0390911B0390938B
:101B70002303809322030E94990781E0A0960FB669
:101B8000F894DEBF0FBECDBFDF91CF911F910F91B3
:101B9000FF90EF90DF90CF90BF90AF909F908F908D
:101BA0007F900895E82FF0E0EE0FFF1FE45EFC4FFA
:101BB00080819181089508958091020481608093CD
:101BC00002040C94F728809102048E7F8093020413
:101BD0000C94F7280E94C928811102C00E94A528F0
:101BE0000E94F328809302043E9A809171008D7FB9
:101BF0008093710082E0809390008AE1809391004D
:101C000081E080932603089580912603811102C00C
:101C10000E94EA0D10927603109275038091710074
:101C20008D7F80937100809190008F7780939000DA
:101C3000109238031092370310926F0310927003C2
:101C4000109271031092720310926E0310926D0342
:101C5000EDE4F3E0ADE3B3E0119211921192119231
:101C60001D921D9283E0ED36F807B1F70895CF92EB
:101C7000DF92EF92FF920F931F93CF93DF93209108
:101C80003703222309F484C06B017C018091260371
:101C9000811102C00E94EA0D0DE613E0C7E0D0E01A
:101CA000A7019601F80192918291729162918F0140
:101CB0000E94412E811131C0FE01EE0FFF1FEE0F79
:101CC000FF1FE35BFC4F1082118212821382DE0140
:101CD000AA0FBB1FA35CBC4F11961C921E92C7306B
:101CE000D105E9F021964481558166817781408351
:101CF000518362837383148215821682178212962F
:101D00008D919C91139711969C938E9313961C9290
:101D10001E92129734961296E2CF219708F6809180
:101D2000750390917603019797FD05C09093760314
:101D30008093750304C0109276031092750380910E
:101D400075039091760320917303309174032817E3
:101D5000390724F01092740310927303892BC1F495
:101D6000809171008D7F80937100809190008F77BA
:101D70008093900010926F03109270031092710381
:101D80001092720310926E0310926D03109237033B
:101D9000DF91CF911F910F91FF90EF90DF90CF9047
:101DA00008951F920F920FB60F9211244F925F92D7
:101DB0006F927F928F929F92AF92BF92CF92DF925B
:101DC000EF92FF922F933F934F935F936F937F9385
:101DD0008F939F93AF93BF93CF93DF93EF93FF9333
:101DE00080913703882309F49BC1C0917503D0917A
:101DF00076031C161D060CF093C1409027035090EB
:101E000028036090290370902A0320E030E0A901A4
:101E1000C301B2010E94902F18160CF065C0C130AA
:101E2000D10509F452C08091730390917403BE01EF
:101E30000E9470317C0190937403809373038090AF
:101E4000390390903A03A0903B03B0903C0320E00C
:101E500030E040E85FE3C501B4010E94DD2D6093EE
:101E6000390370933A0380933B0390933C03F7014B
:101E7000EE0FFF1FEE0FFF1FE35BFC4FA30192016C
:101E800060817181828193810E94452E20E030E043
:101E900040E05EE30E94942F9B01AC01C501B401B8
:101EA0000E94902F18168CF4C7010196BE010E9463
:101EB00070319093740380937303109239031092DE
:101EC0003A0310923B0310923C03E0917303F091AC
:101ED0007403EE0FFF1FEE0FFF1FE35BFC4F6081EB
:101EE000718182819381D0C0C0906F03D0907003C4
:101EF000E0907103F090720320E030E0A901C70187
:101F0000B6010E94412E2197882309F4A2C0FE0148
:101F1000EE0FFF1FEE0FFF1FE35BFC4F80809180F1
:101F2000A280B380A5019401C701B6010E94412E91
:101F300087FF31C0A501940160E070E08CED93EC67
:101F40000E94452E20E030E040E451E40E94452EFE
:101F500020E030E040E05FE30E94942F9B01AC0161
:101F600060E070E080E090E40E94F72F9B01AC01FC
:101F7000C501B4010E94942F9B01AC01C701B601B9
:101F80000E94412E87FF07C0A701960160E070E024
:101F90008CED93E439C0A5019401C701B6010E94FC
:101FA000902F18160CF055C0A501940160E070E068
:101FB0008CED93E40E94452E20E030E040E451E4B3
:101FC0000E94452E20E030E040E05FE30E94942F25
:101FD0009B01AC0160E070E080E090E40E94F72F8C
:101FE0009B01AC01C501B4010E94942F9B01AC017F
:101FF000C701B6010E94902F18165CF5A701960143
:1020000060E070E08CED93EC0E94452E20E030E023
:1020100040E451E40E94452E20E030E040E05FE3E0
:102020000E94942F9B01AC0160E070E080E090E49E
:102030000E94F72F9B01AC01C701B6010E94942FAB
:1020400060936F0370937003809371039093720396
:1020500013C0FE01EE0FFF1FEE0FFF1FE35BFC4FEF
:1020600080819181A281B38180936F0390937003EB
:10207000A0937103B093720360916F03709170032A
:102080008091710390917203209124033091250374
:102090002F3F4FEF340731F02F5F3F4F3093250331
:1020A000209324030E94F8126B017C0120E034E2AB
:1020B00044EF51E40E94412E87FF08C086EFC82EEE
:1020C00088E2D82E84EFE82E81E4F82E20E030E07C
:1020D00040E051E4C701B6010E94942F9B01AC017E
:1020E00060E074E284E79BE40E94452E6B017C0172
:1020F0000E94AD2E70939700609396002091740219
:10210000309175024091760250917702C701B60175
:102110000E94942F0E94AD2E7093990060939800B6
:1021200080913803882309F433C1C0903303D090E1
:102130003403E0903503F090360320E030E0A9014D
:10214000C701B6010E94902F1816D4F58091240380
:10215000909125038F3F2FEF920729F001969093DE
:10216000250380932403C701B6010E94F81220E0E2
:1021700030E040E051E40E94942F9B01AC0160E00C
:1021800074E284E79BE40E94452E6B017C010E946F
:10219000AD2E709397006093960020917402309159
:1021A00075024091760250917702C701B6010E94F4
:1021B000942F0E94AD2E709399006093980008C0F0
:1021C0001092970010929600109299001092980029
:1021D00060912D0370912E036F5F7F4F70932E03DC
:1021E00060932D03209196003091970080E090E05D
:1021F000232BF1F0C0919600D09197000E94DE2E23
:102200006B017C01BE0180E090E00E94DE2E9B010C
:10221000AC0160912F037091300380913103909154
:1022200032030E94452E20E03FEF4FE757E410C0F5
:102230000E94DE2E6B017C0120E030EE4FEF54E473
:1022400060912F037091300380913103909132039C
:102250000E94942F9B01AC01C701B6010E94902FF0
:1022600087FD96C080912B038F5F80932B0390E0B6
:102270002091FE033091FF0382179307A0F0809115
:102280000904882319F010922B030DC0809171006E
:102290008D7F80937100809190008F778093900064
:1022A000109238037DC080912C03C0912B038111C3
:1022B00028C0C0900304D0900404E0900504F0907E
:1022C000060420E030E0A901C701B6010E94902F6A
:1022D0001816BCF481E080932C0310923303109203
:1022E00034031092350310923603C0922F03D0921C
:1022F0003003E0923103F0923203C150C0932B03BC
:1023000043C010922C031092250310922403E091F5
:102310000004F091010448E0C49FE00DF11D112478
:1023200080819181A281B3818093330390933403A0
:10233000A0933503B093360320E030E040E85EE33D
:1023400064817581868197810E94942F6B017C0145
:1023500020E030E048EC52E460917802709179021C
:1023600080917A0290917B020E94452E9B01AC01E4
:10237000C701B6010E94942F60932F03709330031E
:10238000809331039093320310922E0310922D0309
:102390008091020480FD04C010923803109237032C
:1023A000FF91EF91DF91CF91BF91AF919F918F916D
:1023B0007F916F915F914F913F912F91FF90EF909F
:1023C000DF90CF90BF90AF909F908F907F906F9055
:1023D0005F904F900F900FBE0F901F901895CF9267
:1023E000DF92EF92FF92CF93DF936B017C01EA01C2
:1023F00080912603811102C00E94EA0D809102049F
:1024000080FF46C0809175039091760308970CF089
:102410003FC0809171008D7F80937100809138035F
:1024200081110E94040E81E08093370310922503EE
:102430001092240320E030E0A901C701B6010E94F8
:10244000902F1816DCF48091750390917603FC01AF
:10245000EE0FFF1FEE0FFF1FE35BFC4FC082D18228
:10246000E282F382FC01EE0FFF1FE35CFC4FD1839D
:10247000C0830196909376038093750380917100D9
:1024800082608093710080919000806880939000BA
:10249000DF91CF91FF90EF90DF90CF9008958F92D2
:1024A0009F92AF92BF92CF92DF92EF92FF920F93E3
:1024B0001F93CF93DF93EC017B01D42E4801590188
:1024C00080912603811102C00E94EA0D80910204CE
:1024D00080FF6BC0809171008D7F8093710080912F
:1024E000370381110E94040E81E080933803D0935A
:1024F0000104C0930004F092FF03E092FE03D09227
:1025000009048092030490920404A0920504B092FE
:1025100006041092390310923A0310923B03109272
:102520003C0310922B0388819981AA81BB818093FF
:10253000330390933403A0933503B093360320E024
:1025400030E040E85EE36C817D818E819F810E9456
:10255000942F6B017C0120E030E048EC52E4609164
:1025600078027091790280917A0290917B020E94A8
:10257000452E9B01AC01C701B6010E94942F6093C8
:102580002F037093300380933103909332031092A2
:102590002E0310922D038091710082608093710050
:1025A00080919000806880939000DF91CF911F917F
:1025B0000F91FF90EF90DF90CF90BF90AF909F90E2
:1025C0008F9008958091770390E0019665E070E028
:1025D0000E9470318093770308958091770390E093
:1025E000019765E070E00E94703180937703089551
:1025F0008F929F92AF92BF92CF92DF92EF92FF9213
:10260000CF93DF936B017C01C0912403D09125030C
:10261000BE0180E090E00E94DE2E4B015C01A7012C
:10262000960160E070E08CE594E40E94452E9B01E9
:10263000AC01C501B4010E94942F0E94B22E4091BA
:102640007703423009F45CC028F4442351F0413050
:10265000E9F0FBC0433009F481C0443009F4B4C050
:10266000F4C080E090E0A0E0BFE380937402909318
:102670007502A0937602B09377021092270310920E
:1026800028031092290310922A03DFC01092270317
:10269000109228031092290310922A0364317105C5
:1026A00040F46A307105E0F520E030E040E85EE398
:1026B0003BC0693C710508F0C0C080E090E00E941A
:1026C000DE2E20E030E040EA51E40E94DC2D20E0E4
:1026D00030E044E353E40E94452E9B01AC010E948C
:1026E000942F20E030E040E05EE30E94942F9B01B5
:1026F000AC0160E070E080E09EE30E94DC2D5BC0F6
:1027000010922703109228031092290310922A0393
:102710006432710578F4FB01EC59FF4F0C9484315D
:1027200020E030E040E05FE3C701B6010E94942F53
:102730006B017C0180E090E0A0E0BEE38093740236
:1027400090937502A0937602B09377027EC0A701A2
:102750009601C701B6010E94DD2DEACF1092270332
:10276000109228031092290310922A032AE0269F30
:10277000A001279F500D1124CA0168EB7BE00E9445
:102780005C31BC016C5D754077FF03C0719561954C
:102790007109882777FD8095982F0E94E02E2EE3FF
:1027A00033EC4EE259E30E94942F20E030E040ECFD
:1027B0005EE30E94DD2D6093740270937502809336
:1027C00076029093770241C010922703109228035B
:1027D0001092290310922A03CE0183709927892B26
:1027E000E1F0BE016170772780E090E00E94DE2E6C
:1027F00020E030E040E05EE30E94942F20E030E0F3
:1028000040E45FE30E94DD2D6093740270937502D3
:1028100080937602909377020CC080E090E0A0E075
:10282000BFE38093740290937502A0937602B093F5
:102830007702C770DD27CD2B41F4109274021092FD
:1028400075021092760210927702C701B601DF91ED
:10285000CF91FF90EF90DF90CF90BF90AF909F907F
:102860008F900895809188030895CF93DF9300D0CF
:102870001F92CDB7DEB79C0180910E04843019F50C
:1028800093E099833B832A839093E9008FEF9091A3
:10289000E800815095FD06C095ED9A95F1F700008E
:1028A0008111F5CF8091E80085FF0DC040E050E038
:1028B00063E070E0CE0101960E9496168091E800D8
:1028C0008E778093E8000F900F900F90DF91CF915B
:1028D0000895CF93DF9300D01F92CDB7DEB720913C
:1028E0000E04243021F522E029839B838A8383E030
:1028F0008093E9008FEF9091E800815095FD06C02C
:1029000095ED9A95F1F700008111F5CF8091E800DF
:1029100085FF0DC040E050E063E070E0CE0101961D
:102920000E9496168091E8008E778093E8000F90C1
:102930000F900F90DF91CF91089520910E042430D5
:10294000F1F422E02093E9002FEF3091E8002150CC
:1029500035FD06C035ED3A95F1F700002111F5CFB0
:102960002091E80025FF0BC040E050E065E070E0FA
:102970000E9496168091E8008E778093E800089573
:10298000CF93DF93EC0190910E04943009F046C090
:10299000809186028823D9F0809187028823B9F03C
:1029A0009093E9008FEF9091E800815095FD06C06B
:1029B00095E19A95F1F700008111F5CF8091E8003B
:1029C00085FF2CC040E050E060E170E017C081E07E
:1029D0008093E9008FEF9091E800815095FD06C04B
:1029E00095ED9A95F1F700008111F5CF8091E800FF
:1029F00085FF14C040E050E068E070E0CE010E9426
:102A000096168091E8008E778093E80080E1FE01C1
:102A1000A8E7B3E001900D928A95E1F7DF91CF919D
:102A2000089580910D04811109C00E942B180E9405
:102A300088188091E20084608093E20008951092EB
:102A40000D040895089508950C94D02742E061EC98
:102A500081E00E94A51742E061EC82E00E94A51788
:102A600042E061EC83E00E94A51742E161EC84E062
:102A70000C94A51780911004833009F455C030F4EC
:102A8000813071F0823009F48EC008958A3009F4E3
:102A90007AC08B3009F460C0893009F09CC020C036
:102AA00080910F04813A09F096C08091E800877FF9
:102AB0008093E8008091130490911404892B21F4F1
:102AC00060E188E793E003C060E080E090E070E0C0
:102AD0000E94E1168091E8008B778093E8000895CA
:102AE00080910F04813209F076C080911304909197
:102AF0001404009719F0039709F06DC08091E80065
:102B0000877F8093E8008091E80082FD05C0809176
:102B10000E048111F8CF5FC08091F100809388038B
:102B20008091E8008B7753C080910F04813A09F0BF
:102B300052C08091130490911404892B09F04BC06A
:102B40008091E800877F8093E8008091E80080FF13
:102B5000FCCF8091860236C080910F048132D9F576
:102B60008091130490911404892BA9F58091E800B9
:102B7000877F8093E8000E94DA1780911104809388
:102B800086020C944B2180910F04813221F58091B3
:102B9000E800877F8093E8000E94DA178091120492
:102BA00080938903089580910F04813AA1F4809164
:102BB000E800877F8093E8008091E80080FFFCCFE9
:102BC000809189038093F1008091E8008E77809353
:102BD000E8000C94DA17089584B7877F84BF88E1F2
:102BE0000FB6F89480936000109260000FBE90E0E2
:102BF00080E80FB6F89480936100909361000FBE57
:102C00000E947D1B0E942B180E9488188091E20070
:102C100084608093E20078940E940E1B0E947F1BC8
:102C20008CE792E00E94291B80910E04853069F4A4
:102C30000E948A2780910C048823B1F30E94B82750
:102C4000882391F30E948016EFCF0E94871BECCF60
:102C5000292F332723303105C9F064F421303105A1
:102C600081F02230310509F043C08DE690E022E882
:102C700038E042C021323105F1F02232310541F114
:102C800037C082E190E02FEE38E036C099278130DE
:102C9000910541F08230910541F0892B49F5EEE72D
:102CA000F8E005C0E0E5F8E002C0E6E2F8E0849173
:102CB00090E09F0121C06430D8F4E62FF0E0EE0FE1
:102CC000FF1FEE5FFC4F2081318189E090E014C04E
:102CD000643070F470E0FB01EE0FFF1FE650FD4F13
:102CE00020813181FB01EA50FD4F808190E004C0DA
:102CF00080E090E020E030E0FA0131832083089505
:102D000080E189BD82E189BD09B400FEFDCF8091DB
:102D1000D8008F7D8093D8008091E00082608093FE
:102D2000E0008091E00081FDFCCF0895CF92DF921A
:102D3000EF92FF920F931F93CF93DF93EC018B01E0
:102D40006A010E94F917811133C0C114D10439F00E
:102D5000F60180819181081B190BC80FD91FE12C46
:102D6000F12C0115110519F18091E80085FD16C0BF
:102D70008091E8008E778093E800C114D10449F077
:102D8000F60180819181E80EF91EF182E08285E0F2
:102D90000FC00E94F917882321F30AC089918093FC
:102DA000F10001501109FFEFEF1AFF0ADACF80E0BE
:102DB000DF91CF911F910F91FF90EF90DF90CF9017
:102DC000089520911504309116042617370748F00E
:102DD0006115710539F42091E8002E772093E80001
:102DE00001C0B90140E061157105A9F120910E04FF
:102DF000222309F443C0253009F442C02091E800A1
:102E000023FD40C02091E80022FD32C02091E8005F
:102E100020FFE9CF4091F3002091F20030E0342B05
:102E2000FC01CF016115710559F02830310540F4DE
:102E300081918093F100615071092F5F3F4FF1CF75
:102E400041E02830310509F040E02091E8002E777C
:102E50002093E800C8CF4111C9CF0AC080910E0469
:102E6000882361F0853061F08091E80083FD0AC01D
:102E70008091E80082FFF2CF80E0089582E008951B
:102E800083E0089581E0089520911504309116049F
:102E90002617370748F06115710539F42091E800CD
:102EA0002E772093E80001C0B901FC0120E06115F4
:102EB000710591F180910E04882309F440C085309A
:102EC00009F43FC08091E80083FD3DC08091E80097
:102ED00082FD2FC08091E80080FFE9CF2091F300B0
:102EE0008091F20090E0922B6115710559F08830C5
:102EF000910540F424912093F100319661507109BD
:102F00000196F2CF21E0089709F020E08091E800D7
:102F10008E778093E800CBCF2111CCCF0AC080916F
:102F20000E04882361F0853061F08091E80083FD14
:102F30000AC08091E80082FFF2CF80E0089582E02D
:102F4000089583E0089581E00895982F973058F50B
:102F50009093E900981739F07091EC002091ED0002
:102F60005091F00003C0242F762F50E021FF19C0AC
:102F70003091EB003E7F3093EB003091ED003D7FD0
:102F80003093ED003091EB0031603093EB007093A3
:102F9000EC002093ED005093F0002091EE0027FF0D
:102FA00007C09F5FD3CF8F708093E90081E00895C1
:102FB00080E0089580910F0487FF11C08091E800A0
:102FC00082FD05C080910E048111F8CF11C080915F
:102FD000E8008B770BC080910E04882349F0809124
:102FE000E80080FFF8CF8091E8008E778093E800BA
:102FF00008952091E4003091E50095E64091EC00C1
:10300000842F817040FF22C08091E80080FD1CC0A9
:1030100080910E04882391F0853091F08091EB002F
:1030200085FD10C04091E4005091E5004217530720
:1030300029F39A01915011F784E0089582E00895F0
:1030400083E0089581E0089580E008954091E800CC
:1030500042FFDECF08950E9499180E94A118E0EE69
:10306000F0E0808181608083E8EDF0E080818F77FF
:10307000808319BCA7EDB0E08C918E7F8C9380810A
:103080008F7E808310920D0408950F931F93CF932A
:10309000DF930E9499180E94A118C8EDD0E08881A2
:1030A0008F77888388818068888388818F7D8883F3
:1030B00019BC10920E0410920A0410920C04109283
:1030C0000B0400EE10E0F80180818B7F8083888103
:1030D0008160888342E060E080E00E94A517E1EE15
:1030E000F0E080818E7F8083E2EEF0E0808181607D
:1030F0008083808188608083F80180818E7F8083D7
:10310000888180618883DF91CF911F910F9108950D
:10311000E8EDF0E080818F7E8083E7EDF0E0808154
:103120008160808384E082BF81E080930D040C94F1
:103130004518E8EDF0E080818E7F80831092E200F8
:1031400008951092DA001092E10008951F920F92F4
:103150000FB60F9211242F933F934F935F936F936A
:103160007F938F939F93AF93BF93EF93FF93809140
:10317000E10082FF0BC08091E20082FF07C08091D6
:10318000E1008B7F8093E1000E940D1B8091DA00AB
:1031900080FF1FC08091D80080FF1BC08091DA00A3
:1031A0008E7F8093DA008091D90080FF0DC080E18E
:1031B00089BD82E189BD09B400FEFDCF81E0809325
:1031C0000E040E94111505C019BC10920E040E9435
:1031D0001F158091E10080FF19C08091E20080FFFF
:1031E00015C08091E2008E7F8093E2008091E20022
:1031F00080618093E2008091D80080628093D80043
:1032000019BC85E080930E040E9423158091E10093
:1032100084FF30C08091E20084FF2CC080E189BD32
:1032200082E189BD09B400FEFDCF8091D8008F7D79
:103230008093D8008091E1008F7E8093E10080919F
:10324000E2008F7E8093E2008091E20081608093B3
:10325000E20080910A04882311F084E007C0809185
:10326000E30087FD02C081E001C083E080930E048B
:103270000E9424158091E10083FF29C08091E20023
:1032800083FF25C08091E100877F8093E10082E089
:1032900080930E0410920A048091E1008E7F809347
:1032A000E1008091E2008E7F8093E2008091E20055
:1032B00080618093E20042E060E080E00E94A51718
:1032C0008091F00088608093F0000E942215FF91A9
:1032D000EF91BF91AF919F918F917F916F915F918E
:1032E0004F913F912F910F900FBE0F901F90189507
:1032F0001F920F920FB60F9211242F933F934F936B
:103300005F936F937F938F939F93AF93BF93CF936D
:10331000DF93EF93FF93C091E900CF708091EC00B1
:10332000D82FD17080FDD0E81092E9008091F00094
:10333000877F8093F00078940E94BC191092E90076
:103340008091F00088608093F000CD2BCF70C09307
:10335000E900FF91EF91DF91CF91BF91AF919F91E4
:103360008F917F916F915F914F913F912F910F902E
:103370000FBE0F901F9018951F93CF93DF93CDB77B
:10338000DEB7AA970FB6F894DEBF0FBECDBFEFE051
:10339000F4E088E08E0F9091F10091938E13FBCFB3
:1033A0000E943A158091E80083FF1FC180910F04AD
:1033B00090911004492F50E04A30510508F015C192
:1033C000FA01E857FF4F0C948431803881F082383D
:1033D00009F00BC1809113048F708093E9008091F4
:1033E000EB0085FB882780F91092E90006C08091E8
:1033F0000B0490910C04911182609091E800977FEA
:103400009093E8008093F1001092F100C8C0282F3B
:103410002D7F09F0EAC0882319F0823061F0E5C001
:1034200080911104813009F0E0C0933009F080E010
:1034300080930C042BC080911104811127C08091CE
:1034400013048F7009F4D1C08093E9002091EB0040
:1034500020FF1CC0933021F48091EB00806214C0E7
:103460009091EB0090619093EB0021E030E0A90196
:1034700002C0440F551F8A95E2F74093EA0010926C
:10348000EA008091EB0088608093EB001092E900E5
:103490008091E800877F86C08111A7C01091110438
:1034A0001F778091E3008078812B8093E3008091E7
:1034B000E800877F8093E8000E94DA178091E80097
:1034C00080FFFCCF8091E30080688093E3001111BE
:1034D00002C082E001C083E080930E0486C0805861
:1034E000823008F082C080911104909112048C3DCA
:1034F00053E0950779F583E08A838AE289834FB7A1
:10350000F894DE01139620E03EE051E2E32FF0E074
:1035100050935700E49120FF03C0E295EF703F5FA6
:10352000EF708E2F90E0EA3010F0C79601C0C09681
:103530008D939D932F5F243149F74FBF8091E80011
:10354000877F8093E8006AE270E0CE0101960E94D6
:10355000E11614C0AE014F5F5F4F609113040E94EB
:103560002816BC01009709F440C09091E800977FAD
:103570009093E80089819A810E9444178091E80025
:103580008B778093E80031C0803879F58091E8002E
:10359000877F8093E80080910A048093F1008091F6
:1035A000E8008E778093E8000E94DA171EC0811130
:1035B0001CC0909111049230C0F48091E800877F84
:1035C0008093E80090930A040E94DA1780910A041D
:1035D000811106C08091E30087FD02C081E001C037
:1035E00084E080930E040E9426158091E80083FFFA
:1035F0000AC08091E800877F8093E8008091EB000B
:1036000080628093EB00AA960FB6F894DEBF0FBEDF
:10361000CDBFDF91CF911F9108950895CF938091F1
:103620000E048823A1F0C091E900CF709091EC00C6
:10363000892F817090FD80E8C82B1092E90080915D
:10364000E80083FD0E94BC19CF70C093E900CF91C0
:10365000089590938F0380938E030895E0918E03D5
:10366000F0918F03309721F00190F081E02D0994C3
:1036700080E00895E0918E03F0918F03309721F060
:103680000280F381E02D09940895E0918E03F0917A
:103690008F03309721F00480F581E02D099408957F
:1036A00020918C0330918D038217930771F09093D2
:1036B0008D0380938C03E0918E03F0918F033097FC
:1036C00021F00680F781E02D0994089520918A0366
:1036D00030918B038217930771F090938B03809343
:1036E0008A03E0918E03F0918F03309721F00084DC
:1036F000F185E02D0994089508950C947C1B0E9497
:1037000004280E949A0B0E948A280C94452D4F92FF
:103710005F927F928F929F92AF92BF92CF92DF92F1
:10372000EF92FF920F931F93CF93DF93CDB7DEB746
:103730002A970FB6F894DEBF0FBECDBF0E94890C4A
:1037400091E9C92E93E0D92E00E010E0AA24A394B9
:10375000B12C702E802F0E94D20D4C01F6014190A9
:1037600051906F014826592641145104B1F40F5F5E
:103770001F4F0430110569F78FEF89838A831B82FD
:103780000E940D288160782F9D838C8349815A8106
:103790006B818D810E94401C3AC08091ED0381FDB8
:1037A0000E94DB0D20E030E07501022E02C0EE0C1D
:1037B000FF1C0A94E2F7C70184219521892B09F1A6
:1037C0002E837F828E209F2091E0892809F490E04B
:1037D00098870E940D288160782F9A8789874E816B
:1037E0005F8168858A850E94401C000F111FF801C7
:1037F000EF56FC4F80819181E826F926F182E08224
:1038000006C02F5F3F4F2C30310571F6B0CF0E94BC
:10381000762A109190030E942E1B1817D9F00E944F
:103820002E1B809390032A960FB6F894DEBF0FBE2E
:10383000CDBFDF91CF911F910F91FF90EF90DF905F
:10384000CF90BF90AF909F908F907F905F904F9060
:103850000C94D20A2A960FB6F894DEBF0FBECDBFE5
:10386000DF91CF911F910F91FF90EF90DF90CF905C
:10387000BF90AF909F908F907F905F904F900895F2
:10388000CF93DF93CDB7DEB72B970FB6F894DEBF9B
:103890000FBECDBF4F83588769877A878B87DE013C
:1038A000119686E0FD0111928A95E9F785E0FE0107
:1038B000379601900D928A95E1F749815A816B8183
:1038C0007C818D819E810E94E5232B960FB6F89412
:1038D000DEBF0FBECDBFDF91CF910895CF93882378
:1038E00009F4C2C0C82F823859F40E942E1B81FDF2
:1038F000BBC089E30E948E260E945B2789E30CC02F
:10390000833879F40E942E1B80FDAEC083E50E94AF
:103910008E260E945B2783E50E94D026CF910C94CF
:103920005B27843859F40E942E1B82FD9DC087E4DA
:103930000E948E260E945B2787E4EECF8CEF8C0FCF
:10394000813A48F48C2F0E94AD2C81118DC08C2FB0
:103950000E948E26E3CF80E28C0F883048F4C77037
:1039600081E001C0880FCA95EAF70E941427D6CFDC
:103970008BE58C0F833078F4C53A29F0C63A31F0E4
:1039800083E890E005C081E890E002C082E890E022
:10399000CF910C94501B88E58C0F833108F064C0E4
:1039A000C83A39F1C93A41F1CA3A49F1CB3A51F131
:1039B000CC3A59F1CD3A61F1C03B69F1CE3A71F19F
:1039C000CF3A79F1C13B81F1C23B89F1C33B91F11F
:1039D000C43B99F1C53BA1F1C63BA9F1C73BB1F18D
:1039E000C83BB9F1C93BC1F1CA3BC9F180E090E0E5
:1039F00038C082EE90E035C089EE90E032C08AEEA9
:103A000090E02FC085EB90E02CC086EB90E029C0C1
:103A100087EB90E026C08CEC90E023C08DEC90E02A
:103A200020C083E891E01DC08AE891E01AC082E9D5
:103A300091E017C084E991E014C081E292E011C0E6
:103A400083E292E00EC084E292E00BC085E292E055
:103A500008C086E292E005C087E292E002C08AE2F6
:103A600092E0CF910C94661BCF910895882309F4BE
:103A70004BC0823859F40E942E1B81FF45C089E358
:103A80000E948E260E945B2789E30CC0833871F464
:103A90000E942E1B80FF38C083E50E948E260E9464
:103AA0005B2783E50E94D0260C945B27843859F469
:103AB0000E942E1B82FF28C087E40E948E260E944F
:103AC0005B2787E4EFCF9CEF980F913A58F390E291
:103AD000980F983050F4877091E001C0990F8A9543
:103AE000EAF7892F0E941A27DFCF9BE5980F9330C2
:103AF00020F480E090E00C94501B885A833120F42D
:103B000080E090E00C94661B0895882321F00E94C9
:103B100014270C945B270895882321F00E941A270C
:103B20000C945B270895BF92CF92DF92EF92FF92A1
:103B30000F931F93CF93DF9300D000D000D0CDB769
:103B4000DEB725E0FC01DE01119601900D922A9569
:103B5000E1F7FC01D08011810281258122952F702F
:103B600043815481452B09F472C31F3F21F4FFEFB9
:103B7000DF1609F46CC37C012E830E949B07D98257
:103B80001A8369817A81802F0E948A26182FB92E84
:103B90000E943F260E9406252E81002319F00E94D4
:103BA00031272E81EB2DE295EF70F0E0EE56FF4FBE
:103BB0000C9484318B2D807F9B2D9F70F92E882350
:103BC00019F0F29480EFF822002389F0FF2009F425
:103BD0007CC280E2810F883020F48F2D0E94142750
:103BE00003C08F2D0E9424270E945B276EC2812F65
:103BF0000E94361DFF2009F42AC3105E8F2D183055
:103C000018F40E941A2702C00E942A2726960FB68F
:103C1000F894DEBF0FBECDBFDF91CF911F910F9102
:103C2000FF90EF90DF90CF90BF900C945B278B2D8F
:103C3000807F9B2D9F70803211F4892F03C0892FC4
:103C40008295807F112319F0113011F12BC00023D0
:103C5000A9F0222389F1213079F526960FB6F89440
:103C6000DEBF0FBECDBFDF91CF911F910F91FF90AF
:103C7000EF90DF90CF90BF900C944427222319F04F
:103C8000213009F4E4C28E830E9447278E819BC1B4
:103C9000002321F0263008F0DAC20EC0253008F0EB
:103CA000D6C291C10023C9F0222331F0F7019581DA
:103CB00090FF0BC29F70958326960FB6F894DEBFD7
:103CC0000FBECDBFDF91CF911F910F91FF90EF906D
:103CD000DF90CF90BF900C94851D222309F473C10F
:103CE00009C22B2D26952695237030E0211531052C
:103CF00021F021303105D1F0AAC2002321F0812F1B
:103D00009B2D937002C080E090E026960FB6F89449
:103D1000DEBF0FBECDBFDF91CF911F910F91FF90FE
:103D2000EF90DF90CF90BF900C94501B002321F0B8
:103D3000812F9B2D937002C080E090E026960FB6F5
:103D4000F894DEBF0FBECDBFDF91CF911F910F91D1
:103D5000FF90EF90DF90CF90BF900C94661B812F67
:103D6000002319F00E947E2902C00E94E6292696AF
:103D70000FB6F894DEBF0FBECDBFDF91CF911F917C
:103D80000F91FF90EF90DF90CF90BF900C946B2A33
:103D90008B2D837009F07BC0011159C2812F829550
:103DA00086958770880F880F912F9F70C92ED12C10
:103DB000E12CF12C082E04C0CC0CDD1CEE1CFF1CE9
:103DC0000A94D2F714FF12C04FE050E060E070E0B8
:103DD00004C0440F551F661F771F8A95D2F7CB0189
:103DE000BA01609570958095909503C060E070E091
:103DF000CB012B2D269526952370422F50E0423083
:103E00005105D9F04330510569F16C297D298E297E
:103E10009F294130510551F126960FB6F894DEBF27
:103E20000FBECDBFDF91CF911F910F91FF90EF900B
:103E3000DF90CF90BF900C942D256C297D298E2981
:103E40009F2926960FB6F894DEBF0FBECDBFDF9137
:103E5000CF911F910F91FF90EF90DF90CF90BF9087
:103E60000C9449250E942D25C701B60126960FB650
:103E7000F894DEBF0FBECDBFDF91CF911F910F91A0
:103E8000FF90EF90DF90CF90BF900C94112500230E
:103E900019F08B2D817001C08695882309F4D7C154
:103EA000812F829586958770880F880F912F9F703C
:103EB000C92ED12CE12CF12C082E04C0CC0CDD1C19
:103EC000EE1CFF1C0A94D2F714FF12C04FE050E022
:103ED00060E070E004C0440F551F661F771F8A958D
:103EE000D2F7CB01BA01609570958095909503C08B
:103EF00060E070E0CB012B2D269526952370422F94
:103F000050E042305105D9F04330510569F16C2938
:103F10007D298E299F294130510551F126960FB6F2
:103F2000F894DEBF0FBECDBFDF91CF911F910F91EF
:103F3000FF90EF90DF90CF90BF900C9407266C29F4
:103F40007D298E299F2926960FB6F894DEBF0FBED5
:103F5000CDBFDF91CF911F910F91FF90EF90DF9038
:103F6000CF90BF900C9423260E940726C701B6016C
:103F700026960FB6F894DEBF0FBECDBFDF91CF916E
:103F80001F910F91FF90EF90DF90CF90BF900C9416
:103F9000EB25103F49F118F4103E48F491C0123F50
:103FA00009F453C0E8F1133F09F464C089C01F70DD
:103FB0008B2D8F71002321F00E948425812F7CCED0
:103FC0000E94A525812F26960FB6F894DEBF0FBE5E
:103FD000CDBFDF91CF911F910F91FF90EF90DF90B8
:103FE000CF90BF900C948C1D0023B1F0253008F0C9
:103FF0002EC18B2D8F7126960FB6F894DEBF0FBEA3
:10400000CDBFDF91CF911F910F91FF90EF90DF9087
:10401000CF90BF900C94CA25263008F018C1E9CF84
:104020000023A9F08B2D8F7126960FB6F894DEBF72
:104030000FBECDBFDF91CF911F910F91FF90EF90F9
:10404000DF90CF90BF900C948425002359F38B2DE3
:104050008F7126960FB6F894DEBF0FBECDBFDF91ED
:10406000CF911F910F91FF90EF90DF90CF90BF9075
:104070000C94A525002399F08B2D8F7126960FB6F1
:10408000F894DEBF0FBECDBFDF91CF911F910F918E
:10409000FF90EF90DF90CF90BF900C946F25269605
:1040A0000FB6F894DEBF0FBECDBFDF91CF911F9149
:1040B0000F91FF90EF90DF90CF90BF900C9465250B
:1040C0000023A9F0222309F4ADCF812F26960FB645
:1040D000F894DEBF0FBECDBFDF91CF911F910F913E
:1040E000FF90EF90DF90CF90BF900C946E1C222336
:1040F00009F4ADCF812F26960FB6F894DEBF0FBE20
:10410000CDBFDF91CF911F910F91FF90EF90DF9086
:10411000CF90BF900C94361D4B2D4F70612FC7016F
:104120000E948D0526960FB6F894DEBF0FBECDBF58
:10413000DF91CF911F910F91FF90EF90DF90CF9083
:10414000BF900C948924011182C09B2D9F70492F30
:1041500050E04230510509F443C0C4F44115510503
:1041600071F14130510509F072C026960FB6F894EE
:10417000DEBF0FBECDBFDF91CF911F910F91FF909A
:10418000EF90DF90CF90BF900C946D2D4330510590
:10419000C1F14430510509F05AC0812F26960FB65F
:1041A000F894DEBF0FBECDBFDF91CF911F910F916D
:1041B000FF90EF90DF90CF90BF900C94BF2D26968C
:1041C0000FB6F894DEBF0FBECDBFDF91CF911F9128
:1041D0000F91FF90EF90DF90CF90BF900C94562DF1
:1041E00026960FB6F894DEBF0FBECDBFDF91CF91FC
:1041F0001F910F91FF90EF90DF90CF90BF900C94A4
:10420000892D26960FB6F894DEBF0FBECDBFDF9185
:10421000CF911F910F91FF90EF90DF90CF90BF90C3
:104220000C949C2D4B2D4F70612FC70126960FB615
:10423000F894DEBF0FBECDBFDF91CF911F910F91DC
:10424000FF90EF90DF90CF90BF900C949D07269643
:104250000FB6F894DEBF0FBECDBFDF91CF911F9197
:104260000F91FF90EF90DF90CF90BF9008950E9444
:1042700031270E9441270E9406270E945B270E9447
:104280001C2B0E946B2A80E090E00E94501B80E073
:1042900090E00C94661B0E9421270C9437210E9409
:1042A0007F26292F22952F7030E02C3031054CF4D9
:1042B0002A3031056CF4225031092230310588F45E
:1042C00007C02C30310549F02F30310531F009C0DD
:1042D000803E48F0803F29F406C093FB882780F990
:1042E000089580E0089581E00895CF93DF9300D092
:1042F00000D01F92CDB7DEB70F900F900F900F90A8
:104300000F90DF91CF910895CF93DF9300D000D02D
:1043100000D0CDB7DEB726960FB6F894DEBF0FBE3D
:10432000CDBFDF91CF9108951F93CF93DF93C091BD
:10433000990316E080919A03C81799F0D0E01C9F6A
:10434000F0011D9FF00D1124E556FC4F4081518175
:1043500062817381848195810E9484212196C77036
:10436000E9CFDF91CF911F9108954091CB035091F8
:10437000CC036091CD037091CE038091CF039091D7
:10438000D0030C9484218091D00382958F7009F022
:1043900054C08091CD03882309F44FC080919903C4
:1043A000A0919A036091CB037091CC034091CE030E
:1043B0005091CF03B6E08A1709F43FC090E0411551
:1043C0005105C1F17F3F11F46F3FA1F1B89FF0019A
:1043D000B99FF00D1124E556FC4F218172132AC0BC
:1043E0002081621327C02281211124C023813481BE
:1043F0002417350710F421503109241B350B283CB4
:104400003105C0F42091D0032F7020612093D00398
:1044100026E0289FF001299FF00D1124E056FC4F63
:1044200080818F70806180838BEC93E00E94931D6C
:104430000C94942101968770BECF0895CF92DF929D
:10444000EF92FF920F931F93CF93DF93CDB7DEB719
:1044500062970FB6F894DEBF0FBECDBF8C0185E02A
:10446000F801DE011D9601900D928A95E1F7D801C1
:104470004C9111965C91119712966C91129713962C
:10448000CD90DC9014973091CB037091CC03809148
:10449000CE039091CF03009709F46BC17F3F19F4CD
:1044A0003F3F09F466C1E090CD03EE2009F4C0C09F
:1044B0002091D003C816D90628F0F601E81BF90BA5
:1044C000CF0104C0809590958C0D9D1DFF24F39421
:1044D000883C910578F0F12C207F09F0C6C07C2D36
:1044E000D98AC88A89890E9475218BEC93E00E9441
:1044F000931DB1C0822F807F09F046C0751314C090
:10450000341312C0611110C02F7020612093D003AA
:104510000E94B5218BEC93E00E94931D8091D00303
:10452000D80115968C932EC0CD2819F15F3F11F458
:104530004F3FF9F0F62E61111CC080919903209134
:104540009A0336E0821709F45AC090E0389FF001D0
:10455000399FF00D1124E556FC4F7181571306C0A9
:104560007081471303C07281711103C00196877077
:10457000E9CFF62E662309F418C18091D00381603B
:104580008093D003F12C11C1751308C0341306C0F9
:10459000611104C08091D003D801C3C04D875E87EC
:1045A0008D859E856A8B0E944F216A898823E1F15F
:1045B0006623D1F12091D003822F82958F7090E0F5
:1045C000029774F08091CB039091CC0398878F83EE
:1045D0001986DB86CA862C87CE0107960E94931D1A
:1045E00086E0F801ABECB3E001900D928A95E1F71B
:1045F0000E94C3210E94B521FF24F394D6C04D87A9
:104600005E878D859E850E947F26292F22952F709B
:1046100030E0223031050CF0BCC09F7009F0B6C00C
:10462000805E883008F4C1C0C8010E94931DE4CFA9
:10463000C816D90608F453C0F601E81BF90BCF01E0
:10464000883C910508F450C0F12C7C2DD98AC88A89
:1046500089890E947521EBECF3E086E0DF011D9271
:104660008A95E9F70E94B521A0C0751314C03413D0
:1046700012C0611110C08091D003F8018583C80178
:104680000E94931D86E0EBECF3E0DF011D928A951A
:10469000E9F7FE2C8AC04D875E878D859E856A8BE3
:1046A0000E944F216A89882309F4BECF662309F44A
:1046B000BBCF2091D003822F82958F7090E002971C
:1046C0000CF48ECF8091CB039091CC039A83898395
:1046D0001B82DD82CC822E83CE0101967FCF809516
:1046E00090958C0D9D1DACCFF62E662309F49CCFC2
:1046F00075132EC034132CC02091D00320FD1FC091
:10470000822F82958F70D9F0D80115962C9315972A
:104710008F3049F08F5F982F9295907F822F8F7006
:10472000892B15968C93C8010E94931D86E0F80191
:10473000ABECB3E001900D928A95E1F793CF86E060
:10474000F801ABECB3E001900D928A95E1F72DC032
:104750004D875E878D859E850E944F21811140CFB8
:104760008091D00381608093D003C8010E94931D83
:104770001CC0662309F458CF4D875E878D859E85C2
:104780000E944F21882309F44FCF2ACF811148CFAF
:104790000CC0243031050CF047CF9F7009F440CF96
:1047A000F8019581907F09F03BCF8F2D62960FB66F
:1047B000F894DEBF0FBECDBFDF91CF911F910F9157
:1047C000FF90EF90DF90CF9008951F93CF93DF93EA
:1047D000CDB7DEB72C970FB6F894DEBF0FBECDBFB6
:1047E0004F83588769877A878B879C87CE01079686
:1047F0000E941E22882369F08F8198852A853B8537
:10480000232BF1F19F3F09F063C08F3F09F060C097
:1048100037C086E0FE013796DE01119601900D92B9
:104820008A95E1F76F817885EA85FB85309741F1BC
:104830007F3F11F46F3F21F120919A0330E0C901CD
:104840000196877099274091990350E08417950746
:1048500009F447C069837A83FD83EC8396E0929FD5
:10486000D001939FB00D1124A556BC4FFE01319687
:1048700001900D929A95E1F780939A030E949421FA
:1048800016E08091990390919A038917C1F1189FBE
:10489000C001112485569C4F0E941E22882379F165
:1048A000E09199031E9FF0011124E556FC4F4081D1
:1048B000518162817381848195810E9484218091DC
:1048C000990390E001968770992780939903D9CF37
:1048D0004F81588569857A858B859C850E948421C6
:1048E000CFCF0E944B2110929A0310929903EBECC8
:1048F000F3E086E0DF011D928A95E9F7C1CF2C969F
:104900000FB6F894DEBF0FBECDBFDF91CF911F91E0
:104910000895EF92FF920F931F93CF93DF938C0133
:10492000009709F46CC0F12CEE24E394E801219681
:10493000F8018491843740F4843008F051C081300C
:1049400081F0823019F15BC0853709F444C0A8F1C9
:104950009CE7980F903708F052C08F770E94361D61
:1049600041C00E5F1F4FFE01C49180E28C0F883062
:1049700048F4C7708E2D01C0880FCA95EAF70E94CF
:10498000342714C08C2F0E946E1C2DC00E5F1F4F49
:10499000FE01C49180E28C0F883058F4C7708E2DD0
:1049A00001C0880FCA95EAF70E943A270E945B2748
:1049B0001AC08C2F0E94361D16C00E5F1F4FFE01BD
:1049C000C491CC2381F08FE99FE00197F1F700C0FB
:1049D0000000C150F6CF0E5F1F4FFE01F49003C0E0
:1049E0000E946E1C8E018F2D882309F49FCFEFE962
:1049F000FFE03197F1F700C000008150F5CFDF9163
:104A0000CF911F910F91FF90EF90089508956093BB
:104A1000D5037093D6038093D7039093D8030C9457
:104A200037210F931F930091D5031091D603209146
:104A3000D7033091D803DC01CB01802B912BA22B23
:104A4000B32B8093D5039093D603A093D703B09351
:104A5000D8031F910F910C9437210F931F9300914E
:104A6000D5031091D6032091D7033091D803DC01F0
:104A7000CB0180239123A223B3238093D50390936A
:104A8000D603A093D703B093D8031F910F910C9432
:104A900037210F931F930091D5031091D6032091D6
:104AA000D7033091D803DC01CB0180279127A227BF
:104AB000B3278093D5039093D603A093D703B093E5
:104AC000D8031F910F910C9437211092D1031092AB
:104AD000D2031092D3031092D4030C94372141E0F7
:104AE00050E060E070E004C0440F551F661F771F60
:104AF0008A95D2F74093D1035093D2036093D303A6
:104B00007093D4030C94372141E050E060E070E0F2
:104B100004C0440F551F661F771F8A95D2F78091F6
:104B2000D1039091D203A091D303B091D403482B29
:104B3000592B6A2B7B2B4093D1035093D203609364
:104B4000D3037093D4030C94372141E050E060E02C
:104B500070E004C0440F551F661F771F8A95D2F777
:104B600040955095609570958091D1039091D203B6
:104B7000A091D303B091D403482359236A237B2304
:104B80004093D1035093D2036093D3037093D40323
:104B90000C94372141E050E060E070E004C0440F25
:104BA000551F661F771F8A95D2F78091D103909188
:104BB000D203A091D303B091D403482759276A2781
:104BC0007B274093D1035093D2036093D303709318
:104BD000D4030C9437210F931F930091D1031091AC
:104BE000D2032091D3033091D403DC01CB01802B7D
:104BF000912BA22BB32B8093D1039093D203A0933C
:104C0000D303B093D4031F910F910C9437210F93CA
:104C10001F930091D1031091D2032091D3033091BF
:104C2000D403DC01CB0180239123A223B3238093FF
:104C3000D1039093D203A093D303B093D4031F91D5
:104C40000F910C9437210F931F930091D103109172
:104C5000D2032091D3033091D403DC01CB01802710
:104C60009127A227B3278093D1039093D203A093D7
:104C7000D303B093D4031F910F910C94372108955F
:104C8000CF92DF92EF92FF920F931F93CF93DF9318
:104C90008C01C090D503D090D603E090D703F0905C
:104CA000D8038091D1039091D203A091D303B09106
:104CB000D403C82AD92AEA2AFB2ACFE1D0E0D701B7
:104CC000C6010C2E04C0B695A795979587950A94B2
:104CD000D2F780FF06C0B8018C2F0E94F709019718
:104CE00021F4219760F780E001C08C2FDF91CF91F4
:104CF0001F910F91FF90EF90DF90CF900895CF9389
:104D0000DF93EC010E944026BE010E94F709DF916B
:104D1000CF910895CB010E947F260895909186023D
:104D2000992321F090918702911109C02091880266
:104D300030918902F90132969FEF40E01FC0982F11
:104D40009695969596959F3050F5E0918802F09152
:104D50008902E90FF11D877021E030E0A90102C04E
:104D6000440F551F8A95E2F7CA019181892B8183EF
:104D700008959F3F39F04F5F4E3041F051915813E5
:104D8000F8CF0DC05111F7CF942FF5CF9F3F39F0D9
:104D9000F901E90FF11D97FDFA95828308950895B1
:104DA00090918602992321F090918702911109C078
:104DB0002091880230918902F9013296205F3F4F9D
:104DC0001FC0982F9695969596959F30F0F4E09198
:104DD0008802F0918902E90FF11D877021E030E02F
:104DE000A90102C0440F551F8A95E2F7CA018095B8
:104DF00091818923818308953196E217F30729F081
:104E000090819813F9CF1082F7CF089581E090E058
:104E1000E0918802F0918902E80FF91F1082019653
:104E200080319105A9F708959091EC03892B809327
:104E3000EC03089580959091EC0389238093EC0313
:104E400008951092EC0308959091EB03892B8093C1
:104E5000EB03089580959091EB0389238093EB03F6
:104E600008951092EB0308959091EA03892B8093A3
:104E7000EA03089580959091EA0389238093EA03D9
:104E800008951092EA0308958093D903089510922B
:104E9000D90308958091880290918902FC0131968E
:104EA0009C01205F3F4F80E0919191118F5FE2174D
:104EB000F307D1F70895E0918802F091890280917B
:104EC000EC038083E0918802F091890290818091C7
:104ED000EB03892B8083E0918802F0918902908115
:104EE0008091EA03892B80838091D903882361F024
:104EF000E0918802F09189029081892B80830E9441
:104F00004A2781111092D9038091880290918902D9
:104F10000C943A1B80910E04843039F11092EE0308
:104F200020E488E190E00FB6F894A89580936000A3
:104F30000FBE2093600080E00E94540580E00E9434
:104F4000D20A83B7817F846083BF83B7816083BFC8
:104F50007894889583B78E7F83BF88E10FB6F894E5
:104F600080936000109260000FBE08950895089528
:104F7000CF9380E00E9454050E94B6270E94890CBE
:104F80000E94B727C0E08C2F0E94D20D892B29F4F4
:104F9000CF5FC430C1F780E001C081E0CF910895B8
:104FA0000E944B2180E00E9454050E94452D0E94E2
:104FB0002E1B0C94D20A1F920F920FB60F9211243F
:104FC0008F939F93AF93BF938091EE03811113C092
:104FD0008091EF039091F003A091F103B091F2035F
:104FE0004196A11DB11D8093EF039093F003A09310
:104FF000F103B093F203BF91AF919F918F910F9006
:105000000FBE0F901F90189582E084BD93E095BD70
:105010009AEF97BD80936E0008952FB7F894809112
:10502000EF039091F003A091F103B091F2032FBF31
:105030000895CF92DF92EF92FF920F931F932FB7B5
:10504000F8944091EF035091F0036091F103709157
:10505000F2032FBF6A017B01EE24FF248C0120E0C4
:1050600030E0C016D106E206F30610F441505109B3
:105070009A01281B390BC9011F910F91FF90EF90E6
:10508000DF90CF9008951F920F920FB60F921124C8
:105090008F939F93AF93BF938091EF039091F00311
:1050A000A091F103B091F2030196A11DB11D80936F
:1050B000EF039093F003A093F103B093F203BF9139
:1050C000AF919F918F910F900FBE0F901F901895E9
:1050D0000E942B18F8942FEF87EA91E62150804028
:1050E0009040E1F700C0000087E090EBDC01809386
:1050F000190490931A04A0931B04B0931C049CE021
:1051000088E10FB6F894A895809360000FBE909345
:105110006000FFCF0E94C928811102C00E94A5280B
:105120000E94D4288093ED030E94E1288093170405
:1051300087FB882780F9809387020E94D828682FF0
:1051400070E080E090E00C9407256DEE7EEF80E04B
:1051500090E00E94AA3160E082E090E00E949831E5
:1051600060E083E090E00E94983160E084E090E0AD
:105170000E94983160E085E090E00E94983160E004
:1051800086E090E00E9498316FEF87E090E00C9409
:10519000983180E090E00E94923121E08D3E9E4F58
:1051A00009F020E0822F089582E090E00C948A318B
:1051B00083E090E00C948A31682F83E090E00C94B7
:1051C000983184E090E00C948A31682F84E090E07C
:1051D0000C94983186E090E00C948A31682F86E038
:1051E00090E00C94983187E090E00C948A31682F1D
:1051F00087E090E00C9498318091F50380FF0BC01C
:1052000060918D0285E0689FB001112475956795C6
:10521000759567952BC081FF09C060918D0285E06F
:10522000689FB00111247595679520C082FF07C063
:1052300060918D0285E0689FB001112417C09091A4
:10524000F6039923D1F060918C02961788F720918C
:105250008D0285E0289F90011124929FA001939FC9
:10526000500D112470E0CA010E9470316038710540
:1052700040F46115710539F002C065E070E0862FD9
:1052800008958FE7089581E008958091F50380FFE8
:1052900008C060918B0270E075956795759567956C
:1052A00021C081FF06C060918B0270E07595679503
:1052B00019C082FF04C060918B0270E010C0909111
:1052C000F6039923C1F060918A029617A0F78091A6
:1052D0008B02899FC001112470E00E9470316038F8
:1052E000710528F46115710521F0862F08958FE767
:1052F000089581E0089561E070E0F4CF803F21F4EB
:105300000E94FC28819504C0813F29F40E94FC285A
:105310008093F9030895823F21F40E94FC2881952F
:1053200004C0833F29F40E94FC288093F803089569
:10533000893F19F40E94452905C08A3F31F40E9433
:10534000452981958093FA0308958B3F21F40E94AB
:105350004529819504C08C3F29F40E9445298093FA
:10536000FB030895843F21F48091F703816017C007
:10537000853F21F48091F703826011C0863F21F4BC
:105380008091F70384600BC0873F21F48091F7037D
:10539000886005C0883F31F48091F7038061809375
:1053A000F70308958D3F21F48091F50381600BC0D0
:1053B0008E3F21F48091F503826005C08F3F29F470
:1053C0008091F50384608093F5030895803F39F45C
:1053D0008091F90387FF6CC01092F90369C0813F87
:1053E00029F48091F9031816BCF362C09091F80378
:1053F000823F29F497FF5CC01092F80359C0833FA5
:1054000019F41916CCF354C0893F41F48091FA0382
:1054100018160CF04DC01092FA034AC08A3F29F4C6
:105420008091FA0387FF44C0F6CF8B3F39F4809117
:10543000FB0387FF3DC01092FB033AC08C3F29F469
:105440008091FB031816BCF333C0843F21F4809194
:10545000F7038E7F17C0853F21F48091F7038D7F7E
:1054600011C0863F21F48091F7038B7F0BC0873FEB
:1054700021F48091F703877F05C0883F31F4809144
:10548000F7038F7E8093F70313C08D3F21F4809143
:10549000F5038E7F0BC08E3F21F48091F5038D7F45
:1054A00005C08F3F29F48091F5038B7F8093F5032E
:1054B0008091F80381110EC08091F90381110AC017
:1054C0008091FA03811106C08091FB03811102C013
:1054D0001092F603089587EF93E00E94451B0E9407
:1054E0000D289093F4038093F30308951F93CF93B3
:1054F000DF938091F3039091F4030E941928AC018B
:105500009091F603992321F020918E0230E006C09D
:1055100020918F028AE0289F90011124421753079F
:1055200008F486C08091F803C091F903D091FA0382
:105530001091FB03811107C0C11176C0D11174C055
:10554000111172C075C09F3F19F09F5F9093F603D1
:10555000181624F40E94FC288093F8038091F80325
:1055600087FF05C00E94FC2881958093F8031C16D4
:1055700024F40E94FC288093F9038091F90387FFAB
:1055800005C00E94FC2881958093F9036091F8037F
:10559000662339F1C091F903CC2319F1772767FD10
:1055A0007095872F972F0E94E02E23E333E343E388
:1055B0005FE30E94942F0E94AD2E6093F8036C2F3E
:1055C000772767FD7095872F972F0E94E02E23E3A2
:1055D00033E343E35FE30E94942F0E94AD2E609378
:1055E000F9031D1624F40E9445298093FA03809143
:1055F000FA0387FF05C00E94452981958093FA032D
:10560000111624F40E9445298093FB038091FB032B
:1056100087FF05C00E94452981958093FB03DF9198
:10562000CF911F910C946B2A9F3F09F08ECF96CF9C
:10563000DF91CF911F910895E7EFF3E085E0DF015F
:105640001D928A95E9F71092F6031092F5030895DA
:10565000833081F128F4813059F08230D1F00895FF
:10566000853009F449C0B8F1863009F456C0089570
:1056700080918F02262F30E0280F311D2F3F3105FA
:1056800024F4680F60938F0208958FEF80938F0248
:10569000089580918E02262F30E0280F311D2F3F74
:1056A000310524F4680F60938E0208958FEF809384
:1056B0008E02089580918D02262F30E0280F311D33
:1056C0002F3F310524F4680F60938D0208958FEF0A
:1056D00080938D02089580918C02262F30E0280F50
:1056E000311D2F3F310524F4680F60938C0208951B
:1056F0008FEF80938C02089580918B02262F30E0EB
:10570000280F311D2F3F310524F4680F60938B0261
:1057100008958FEF80938B02089580918A02262F3F
:1057200030E0280F311D2F3F310524F4680F6093BE
:105730008A0208958FEF80938A020895833011F1D1
:1057400028F4813049F0823091F00895853081F15C
:1057500020F18630C1F1089580918F02681720F4FE
:10576000861B80938F02089510928F020895809176
:105770008E02681720F4861B80938E020895109283
:105780008E02089580918D02681720F4861B809305
:105790008D02089510928D02089580918C026817F1
:1057A00020F4861B80938C02089510928C02089539
:1057B00080918B02681720F4861B80938B020895DA
:1057C00010928B02089580918A02681720F4861B3C
:1057D00080938A02089510928A0208950F931F936E
:1057E000873208F048C08E3108F094C0803109F447
:1057F0007EC008F5873009F468C068F4863009F087
:10580000A4C08091ED03817F8E7F8093ED0381E0C2
:105810008093FD039BC08B3009F490C08E3009F05B
:1058200094C08091ED0382FB222720F991E092271A
:1058300090FB82F965C0863109F480C060F4813143
:1058400009F083C00E944B219091870281E0892753
:105850008093870273C0893109F470C08B3109F0DD
:1058600074C08091ED0381FB222720F991E09227FB
:1058700090FB81F945C0883309F460C050F4893247
:1058800009F45EC0853309F45BC0873209F458C05F
:105890005CC0833409F454C028F48A3308F455C03A
:1058A000895339C0883409F050C00E944B210E94AE
:1058B00090060FEF13ED20E3015010402040E1F778
:1058C00000C000000E94682839C09091ED03892F24
:1058D0008095817080FB90F929F096609860909394
:1058E000ED0334C0997F977F9093ED0327C080919B
:1058F000ED0383FB222720F991E0922790FB83F9A7
:105900008093ED039923D1F08091ED038160809322
:10591000ED0314C08D5141E050E060E070E08A0179
:105920009B0104C0000F111F221F331F8A95D2F75D
:10593000C901B8010E9407250E944B2181E006C0E1
:1059400061E070E080E090E0F5CF80E01F910F9182
:10595000089580E0089580E00895CF93C82F809146
:10596000FD03813069F018F08230C9F184C0E09104
:105970008802F09189028081823209F07EC007C0DE
:10598000E0918802F09189028081823261F48C2F4B
:105990000E94A92C811104C08C2F0E94EE2B1DC0E7
:1059A00081E090E01AC08C2F0E94AB2C811114C0B2
:1059B000C43179F048F4CB3079F0C03109F061C0DE
:1059C00082E08093FD0308C0C93219F0C83321F08A
:1059D00058C01092FD0355C081E0817054C0C93297
:1059E00091F120F5C43179F1B0F4C73009F047C026
:1059F0008EE180938F0282E380938E028AE080930F
:105A00008D0284E180938C0288E080938B0288E28F
:105A100080938A0234C0CE51C63088F5EC2FF0E076
:105A2000E65FFC4F80818093FC0329C0CE34E9F00F
:105A300020F4CB3421F56AE013C0C13579F0C235CA
:105A4000F1F461E00DC08091FC03882319F01092FD
:105A5000FC0315C081E08093FD0315C061E006C022
:105A60008091FC030E94282B0AC06AE08091FC030D
:105A70000E949E2B04C01092FD0380E004C081E0D0
:105A800002C080E0AACFCF9108950E94C928811159
:105A900002C00E94A5280E94EA288093180480FF73
:105AA00002C0869501C080E00C94540580911804D2
:105AB000982F9695292F30E0233031054CF49F5FC5
:105AC000990F8170892B8160809318040E94EE28C1
:105AD0008091180486950C94540580911804982F91
:105AE000969591F09158990F8170892B80931804A5
:105AF0008E7F91E009F490E08091180490FB80F98A
:105B0000809318040E94EE288091180486950C94C6
:105B1000540580911804982F909590FB80F98093FC
:105B200018040E94EE288091180480FF02C0869518
:105B300001C080E00C94540590911804892F86953B
:105B40008F5F8F779170843028F4880F892B809332
:105B5000180402C090931804809118048E7F91E07D
:105B600009F490E08091180490FB80F98093180468
:105B70000E94EE288091180486950C94540520917B
:105B80001804922F96958927982F990F822F81704C
:105B9000892B809318048E7F91E009F490E0809126
:105BA000180490FB80F9809318040E94EE288091DD
:105BB000180486950C9454055058BB27AA270ED07C
:105BC00075C166D130F06BD120F031F49F3F11F4F4
:105BD0001EF45BC10EF4E095E7FB51C1E92F77D1CC
:105BE00080F3BA17620773078407950718F071F4FA
:105BF0009EF58FC10EF4E0950B2EBA2FA02D0B0150
:105C0000B90190010C01CA01A0011124FF27591B01
:105C100099F0593F50F4503E68F11A16F040A22F07
:105C2000232F342F4427585FF3CF46953795279578
:105C3000A795F0405395C9F77EF41F16BA0B620B77
:105C4000730B840BBAF09150A1F0FF0FBB1F661FBE
:105C5000771F881FC2F70EC0BA0F621F731F841F01
:105C600048F4879577956795B795F7959E3F08F027
:105C7000B3CF9395880F08F09927EE0F97958795E6
:105C80000895D9D008F481E008950CD00FC107D150
:105C900040F0FED030F021F45F3F19F0F0C0511118
:105CA00039C1F3C014D198F39923C9F35523B1F343
:105CB000951B550BBB27AA2762177307840738F07B
:105CC0009F5F5F4F220F331F441FAA1FA9F333D0DA
:105CD0000E2E3AF0E0E830D091505040E695001C8E
:105CE000CAF729D0FE2F27D0660F771F881FBB1F4A
:105CF000261737074807AB07B0E809F0BB0B802D24
:105D0000BF01FF2793585F4F2AF09E3F510568F06F
:105D1000B6C000C15F3FECF3983EDCF38695779503
:105D20006795B795F7959F5FC9F7880F911D969571
:105D3000879597F90895E1E0660F771F881FBB1FCD
:105D4000621773078407BA0720F0621B730B840B7A
:105D5000BA0BEE1F88F7E095089504D06894B1114E
:105D6000D9C00895BCD088F09F5790F0B92F9927DB
:105D7000B751A0F0D1F0660F771F881F991F1AF056
:105D8000BA95C9F712C0B13081F0C3D0B1E008951F
:105D9000C0C0672F782F8827B85F39F0B93FCCF3A0
:105DA000869577956795B395D9F73EF4909580954C
:105DB000709561957F4F8F4F9F4F0895E89409C06C
:105DC00097FB3EF490958095709561957F4F8F4F2E
:105DD0009F4F9923A9F0F92F96E9BB279395F69544
:105DE000879577956795B795F111F8CFFAF4BB0FC2
:105DF00011F460FF1BC06F5F7F4F8F4F9F4F16C026
:105E0000882311F096E911C0772321F09EE8872FAF
:105E1000762F05C0662371F096E8862F70E060E06B
:105E20002AF09A95660F771F881FDAF7880F9695E4
:105E3000879597F90895990F0008550FAA0BE0E888
:105E4000FEEF16161706E807F907C0F0121613063C
:105E5000E407F50798F0621B730B840B950B39F47C
:105E60000A2661F0232B242B252B21F408950A26E2
:105E700009F4A140A6958FEF811D811D089597F922
:105E80009F6780E870E060E008959FEF80EC0895E0
:105E900000240A9416161706180609060895002409
:105EA0000A9412161306140605060895092E039483
:105EB000000C11F4882352F0BB0F40F4BF2B11F4F7
:105EC00060FF04C06F5F7F4F8F4F9F4F089557FD56
:105ED0009058440F551F59F05F3F71F04795880F58
:105EE00097FB991F61F09F3F79F0879508951216EF
:105EF00013061406551FF2CF4695F1DF08C016169B
:105F000017061806991FF1CF86957105610508944B
:105F10000895E894BB2766277727CB0197F9089562
:105F20008ADF08F48FEF08950BD0C0CFB1DF28F0DF
:105F3000B6DF18F0952309F0A2CFA7CF1124EACF3E
:105F4000C6DFA0F3959FD1F3950F50E0551F629FD8
:105F5000F001729FBB27F00DB11D639FAA27F00DC2
:105F6000B11DAA1F649F6627B00DA11D661F829FE9
:105F70002227B00DA11D621F739FB00DA11D621FCE
:105F8000839FA00D611D221F749F3327A00D611DEB
:105F9000231F849F600D211D822F762F6A2F1124CD
:105FA0009F5750408AF0E1F088234AF0EE0FFF1F20
:105FB000BB1F661F771F881F91505040A9F79E3F57
:105FC000510570F05CCFA6CF5F3FECF3983EDCF359
:105FD000869577956795B795F795E7959F5FC1F794
:105FE000FE2B880F911D9695879597F90895FA01D4
:105FF000EE0FFF1F30962105310599F161157105EE
:1060000061F48038BFE39B0749F1689490388105BB
:1060100061F08038BFEF9B0741F0992342F5FF3FC5
:10602000E1053105210511F1E8940894E795D901BE
:10603000AA2329F4AB2FBE2FF85FD0F310C0FF5F67
:1060400070F4A695E0F7F73950F019F0FF3A38F4FC
:106050009F779F930CD00F9007FC905808953EF0C7
:1060600014CF60E070E080E89FE308954FE79F77EA
:106070005F934F933F932F939ED02F913F914F91DA
:106080005F9152DF05C019F40EF0F9CE42CFFDCE7C
:1060900026DFC8F39638C0F707F80F92E8942BE391
:1060A0003AEA48EB5FE74EDF0F920F920F924DB73F
:1060B0005EB70F92C0D0E4E4F1E016D04F915F914B
:1060C000EF91FF91E595EE1FFF1F49F0FE57E06845
:1060D0004427EE0F441FFA95E1F74195550B32D056
:1060E0000F9007FE26C00895DF93CF931F930F9361
:1060F000FF92EF92DF927B018C01689405C0DA2E4B
:10610000EF011EDFFE01E894A5912591359145919F
:106110005591AEF3EF0162DDFE019701A801DA941B
:1061200079F7DF90EF90FF900F911F91CF91DF9162
:1061300008959B01AC0160E070E080E89FE3A5CD8D
:106140009ECEACC0CCDEE8F39923D9F3940F511D59
:10615000BBF39150504094F059F0882332F0660F11
:10616000771F881F91505040C1F79E3F510544F75B
:10617000880F911D9695879597F908955F3FACF02C
:10618000983E9CF0BB27869577956795B79508F460
:10619000B1609395C1F7BB0F58F711F460FFE8CFDA
:1061A0006F5F7F4F8F4F9F4FE3CFB4CE0EF076C01F
:1061B0006CCE689464CE93DEC8F39923D1F3C6F312
:1061C000DF93CF931F930F93FF92C92FDD2788236F
:1061D0002AF02197660F771F881FDAF720E030E05A
:1061E00040E85FEB9FE3883920F0803E30F0219655
:1061F0008F77E3DCECE6F1E003C0DFDCE9E9F1E016
:1062000073DF8B01BE01EC01FB2E6F577109759591
:10621000771F880B990BD4DD28E132E741E35FE378
:106220008FDEAF2D9801AE01FF900F911F91CF919E
:10623000DF91D4DC3BCEFA01DC01AA0FBB1F9B012E
:10624000AC01BF5728F422273327442750781FC0BA
:10625000B75188F4AB2F0024469537952795011C3C
:10626000A395D2F3002069F0220F331F441FB3958A
:10627000DAF30DD0A1CC61307105A0E88A07B946E8
:1062800030F49B01AC0166277727882790783096F9
:1062900021F0208331834283538308959F3F31F05F
:1062A000915020F4879577956795B795880F911D44
:1062B0009695879597F90895AA1BBB1B51E107C0D6
:1062C000AA1FBB1FA617B70710F0A61BB70B881F86
:1062D000991F5A95A9F780959095BC01CD01089515
:1062E00097FB072E16F4009407D077FD09D00E9483
:1062F0005C3107FC05D03EF4909581959F4F089541
:10630000709561957F4F0895EE0FFF1F0590F491F2
:10631000E02D0994F999FECF92BD81BDF89A992795
:1063200080B50895A8E1B0E042E050E00C94B231AD
:10633000262FF999FECF92BD81BDF89A019700B43E
:10634000021639F01FBA20BD0FB6F894FA9AF99ADE
:106350000FBE08950196272F0E9499310C94983111
:10636000DC01CB01FC01F999FECF06C0F2BDE1BD15
:10637000F89A319600B40D9241505040B8F7089504
:04638000F894FFCFBF
:1063840007000C52D02445000000410000DC44000A
:1063940000004152D0A4440000404100005C44008D
:1063A40000004148F17644000000415C978A4400B3
:1063B4000000411FD592440000004152D0A4440083
:1063C4000000415CFFB844000000410AA7CF44002C
:1063D4000000410000DC44000000410AA7CF440053
:1063E4000000410000DC4400000041000000000007
:1063F40000804000005C45000040410000000000B7
:1064040000804052D02445000040410AA7CF4400F8
:106414000000410000DC44000000410000000000D6
:1064240000804052D024450000404100000000009C
:1064340000804000005C45000040410AA7CF4400B2
:106444000000410000DC44000000410000000000A6
:1064540000804052D024450000404100000000006C
:106464000080400AA74F45000040410AA7CF4400DE
:106474000000410000DC4400000041000000000076
:1064840000804052D024450000004100000000007C
:106494000080405CFF38450000004100000000001F
:1064A40000804052D02445000000410AA7CF440098
:1064B4000000410000DC4400000041000000000036
:1064C40000804052D024450000804153D024450030
:1064D40000404160970A450000004154D0A44400A4
:1064E4000000410000DC440000004160970A4500C0
:1064F40000A041050000003F0000C8423214C0144F
:106504009D14691435140101DA032808140A321E93
:106514000000020004000500070009000B000C0045
:106524000E001000110013001500170018001A00C7
:106534001C001D001F002100230024002600280049
:1065440029002B002D002F003000320034003500CC
:10655400370039003B00400045002500260061005B
:106564006000200037006400650066006700440096
:106574004600240047003F4D3639BD0970093A09E9
:1065840001099408AD08C608DF08010203040506E2
:0465940007080900EB
:00000001FF

@ -0,0 +1,1880 @@
:020000020000FC
:047000000C948D3E21
:047028000C94B73DD0
:10702F0012010002FF010020EB03F42F0000010208
:10703F00030109021200010100803209040000005F
:10704F00000000000C03410054004D0045004C00AF
:10705F001603410054006D00330032005500340018
:10706F004400460055000C0331002E0030002E0066
:10707F0030000403090416010C0100000C0000018C
:02708F006C7F14
:1070920012BD01BDF89A00B5089501E00895F9996D
:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929
:1070B200FECF0C944938F80104910895F8013491F7
:1070C20031962491890108950091610000930C0189
:1070D20000E80093610001E00093610005BF02E057
:1070E20005BF0C9486380091D70001600093D70049
:1070F200A89507EF04BF0091600000610093600053
:1071020000E00093600001E008950E94AA3D0E9401
:10711200B53DFDCF0CD00F7708D0006806D00061D6
:1071220004D0016028D0789408950093D80000918B
:10713200D8000895FCDF00621ED04CD009B500FFD4
:10714200FDCFF5DF0F7D17D00091E0000E7F009399
:10715200E0000091E000077F0093E0000091E20070
:1071620001600093E2000091E20008600093E200F7
:1071720078940C94743B0093D800089500910D010B
:10718200002359F40091D90000FF07C0D0DF006846
:10719200F2DF01E000930D01CDDFE0E2F2E00081D9
:1071A200018100FF0DC0008111811E7F11830083C8
:1071B20001E00093EA0000E00093EA0000931E025F
:1071C20000E00093E9000091E80003FF02C00E9482
:1071D200F23B0895A89539D000E40093600000E0E6
:1071E200009381000093800010E0009385000093DB
:1071F200840001E006BB00918100036000938100DE
:107202000091600007FFFCCF00E80093600010933C
:107212008100A89507EF04BF18D010936000209159
:1072220084003091850010938100109380001093A8
:1072320085001093840001E006BB2D3D354010F01F
:1072420002E101C002E009BD089500916000006101
:107252000093600008950E94AD3E239741D100E063
:1072620000930901B5D104811581012B51F437D165
:1072720000910701002309F4B9C000E0009307015F
:10728200B5C058D102FFFDCF37D1068335D1009367
:107292000F0132D1009310012FD1009311012CD193
:1072A2000093120129D10093130102852091130149
:1072B20030911201409111015091100116811A95DD
:1072C20041F01250A9F01A9599F11A9509F473C078
:1072D2008BC010910F01113011F411E001C010E0C8
:1072E200138799D00C3F11F414D17FC077D17DC0A0
:1072F20092D010910F01112329F01A9549F01A9595
:10730200A9F073C010E013870C3F09F06EC0ECCFF8
:1073120056D103C04CD109F468C00D911C9144D1DF
:107322000F3FC1F305E0009309015FC011E0EBCF0D
:10733200D2D029F00250E1F10A9541F056C0FDD0B9
:107342000E94A33F0FEF00930A014FC0552319F08B
:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE
:1073620003FFFDCF67D051D04AD008E00093600000
:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F
:1073820044D00FEF1FE004C009811A810150104060
:1073920009831A8309811A81012BB1F700E800934E
:1073A200610000910C01009361000C940000FFCF7A
:1073B20001E003871AC08FD019F00A9539F015C081
:1073C200535098F4BAD002E000870FC0505339F0FE
:1073D2005A9541F05F52B1F35A95A1F306C002E00B
:1073E2000883F0CF01E0FCCFA8D079D02396E4E067
:1073F2000C94BA3E01E005BF00E005BF089500917C
:10740200D8000F770093D800089509B50D7F09BD04
:1074120000E009BD08955183408333832283109194
:10742200E8001B7F1093E8001091E8001F7710938B
:10743200E80008955DD053D0F8940091E000016017
:107442000093E000089579D04AC0219749D0009175
:107452000601035019F00250B9F00BC03CD021F0E4
:107462000A9559F00A9529F400910A010C3F19F482
:1074720050D02196089567D0FCCF0091010100936E
:10748200F100009100010AC01091100124D019F0FE
:107492000A9549F0EECF135018F400E00093F10082
:1074A2001ED044D0E6CF105339F01A9539F01F524E
:1074B20041F01A9541F0F4CF08E5F0CF00E006D094
:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5
:1074D20030E00C94113F00910F010023089521C068
:1074E2000BD008D007D00093040106D00093050109
:1074F20021D00BC000D008830091F10008950091C3
:10750200EB0000620093EB0015D0077F0093E800C8
:107512000895F5DF02E00093080103E000930901FA
:10752200089559D007D000FFFDCF089503D002FF80
:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A
:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD
:107552002BD00093F1002BD059F43DD0082F092BEA
:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1
:10757200042D4394003289F300910B0100230D91F5
:107582001C9131F311970E945838E3CFD3DF00FFEB
:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B
:1075A200CCDFE5E00C94B93E11970C945C380D9158
:1075B2001C910F5F1F4F1C930E93019708958281B8
:1075C200938100811181801B910B0196DF01089547
:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71
:1075E200F7DF80819181A081B181AF710481158122
:1075F20000521040048315830AC000910B0100233E
:1076020031F4A301920103E911E00E943B3F47D00C
:10761200B8F1662477242C0111C06EDFF301ED5618
:10762200FE4F008301E0600E00E0701E01960091A3
:10763200F200002311F033D0B8F47FDF30D0E8F24B
:10764200F301B096E238F040C0F674DF02FFFDCFDE
:107652000091F200BDDF24813581201B304024835C
:107662003583E5CF49DFAA95AA23E1F700910B0103
:10767200013099F62091F1008C010E945038D6CF4A
:1076820004811581012B21F055DF02FFFDCF55DF6B
:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051
:1076A200F1E0028113810817190708952091EB0078
:1076B20021602093EB000093EC000091ED0002703A
:1076C200012B0093ED000091ED0002600093ED00AC
:1076D2001091EE00012F000F00E0001F0895412FCE
:1076E2000093E900089500E009D000FD05C000E024
:1076F200F7DF10E202E0DACF00E00895F1DF009157
:10770200EB0008950F770132A9F5112369F11A955B
:1077120059F01A9561F01A9569F01A95F9F01A95CF
:10772200C1F01A95D9F024C00E942C3920C00E94C1
:10773200263A1DC029D00091090123D001E01FD0B3
:1077420020D0009108011BD00E94923A0E94973AE1
:107752000EC01AD00091080114D007C002E00093B5
:10776200080100E0009309010FD00E94923A03C081
:107772000E94803A02C001E0089500E0089501D01D
:1077820000E00093F10008950091E800077F009364
:10779200E800089508950350F9F4112339F01A9579
:1077A20051F01A9581F01A9599F016C004E016D09E
:1077B20001E810E703C011D003E510E7E7E1F2E0CA
:1077C20000831183D8CF06E109D00FE510E7F6CF89
:1077D20004D005E710E7F2CFD0CF0CE000931A02F5
:1077E200089527D120D100931D02E1D0212F11232A
:1077F20029F12A95E9F02250F1F0225099F02A95C8
:1078020049F0225061F02A9581F02A95E1F02A95FB
:10781200E9F023C0003809F44FC00C94833B0038D0
:10782200E1F7C8C00023C9F71EC00023B1F72DC07D
:10783200033098F744C1033080F70BC1003868F376
:10784200033858F7C9C0013841F77BC1013051F400
:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA
:1078620009F41ED008951091E3001078DCD00F7750
:10787200012B0093E300E9D0ACD000FFFDCF0091D3
:10788200E30000680093E300089591D0123040F4C1
:107892000FD010931E02DAD000911E020C94CB3B43
:1078A2000091EB0001D004C000620093EB00089548
:1078B2000091E800077FC0C0BA93AA93229700E024
:1078C2000093190274D0AFD0202F2A9519F02A956F
:1078D200E9F022C002E100931A020FE210E7E7E1A9
:1078E200F2E0008311839DD008839DD00983E0DFFD
:1078F20000911A0210E02881398102171307A8F4B7
:107902000F7181F401E00093190211C002E10093AA
:107912001A0201E410E7E3CF0E94CC3B002319F7DF
:107922008ED040C01093190202C020931A027ED05A
:10793200A7E1B2E001C08AD000911A02002309F146
:1079420048D004FD1EC045D000FD03C042D004FF54
:10795200FACF10E0012F1395003281F0ED91FC91E6
:107962001197049133D02D913C912F5F3F4F3C935F
:107972002E93FD0103810A95038361F72AD004FF48
:10798200DACF00911902013039F423D004FD04C08A
:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F
:1079A20018D00B7F49D02296A991B99108951091D0
:1079B200F10008957DDF00911E0208D047D009D062
:1079C2000F773AD006D002FFFDCFBFC00093F1007F
:1079D20008950091E800089524D010911D021058D6
:1079E20029F01A9589F01A9591F019C061DF00917A
:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63
:107A020018D0E7DF0F770CC053DF00E0F2CF51D080
:107A12000F7710E0F801E55EFD4F0081EACF0FD04D
:107A22000BC001D000D00091F1000895D2DF0F7E8B
:107A320003C00091E8000B7F0093E80008950091D5
:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31
:107A5200F3CF00911D02002329F00A9509F10A953E
:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE
:107A7200B9F4D9DF0F7711F416D01BD00093E900C7
:107A82001091EB0010FF0BC00ED010E01093E90034
:107A920021E0F801E55EFD4F20834FD003C042D0C4
:107AA20045D0CFDFC9CF1091EB0010621093EB00ED
:107AB20008951091E800177F1093E800089500914F
:107AC2001D02002311F4AFDF02C0013011F4B7DF51
:107AD200B3CF023031F52DD019F52091F1002F7777
:107AE2002093E90023D000FF19C081F01FD000616C
:107AF200DCDE01E010E0422F0E949F3E0093EA008C
:107B020000E00093EA0012D00860CFDE0BD030E034
:107B1200F901E55EFD4F008310D0DACF03D0D7CF55
:107B2200BFDE089500E00093E90008950091EB00A4
:107B3200089579DF3CDF00230895BADE4ADF0E7F25
:107B4200089583DF46DF02FFFDCF73DF42DF0F7749
:107B520073CF0091D70001600093D7000E948B3849
:107B620000E000931F0208950C94BF388A93FA93A1
:107B7200EA933A922A921A920A927A936A935A93BF
:107B82004A933A932A931A930A938FB70091DA0091
:107B920000FF24C00091D80000FF20C00EEF009328
:107BA200DA000091D90000FF11C001E000930D013D
:107BB200ABD0026096D09AD00860A2D00E949B38C7
:107BC2000091E0000E7F0093E00008C000E0009307
:107BD2000D0100931E0298D0046083D07FD002FF73
:107BE20005C084D002FF02C00BEF75D077D000FF32
:107BF2001BC07CD000FF18C001E000930E016AD0C8
:107C020083D000626ED00EEF6FD0006179D06ED05B
:107C12000F7D76D00091D80000620093D80009B59C
:107C22000D7F09BD00E009BD59D004FF20C05ED020
:107C320004FF1DC009B500FD05C00E94EB3809B55F
:107C420000FFFDCF0091D8000F7D0093D80042D0F5
:107C520000910E01002359F04CD00FEE45D00F7E5B
:107C620052D000643ED042D001604AD042D036D0D9
:107C720005FF0FC03BD005FF0CC000E000930E01D2
:107C820035D00F7E3DD00FED2FD00F7D3CD0006858
:107C920028D024D003FF0DC029D003FF0AC000E082
:107CA20000931F0207EF17D00E94743B2DD0116082
:107CB20018D08FBF09911991299139914991599100
:107CC200699179910990199029903990E991F991E6
:107CD200899118950FEE0093E10008950091E1005B
:107CE20008951183008308950093E1000091E2005A
:107CF20008950091E200006203D00091E200086062
:107D02000093E2000895FCDFE0E2F2E000811181DD
:107D1200089500008895FECF01E60DBF02E00EBF78
:107D2200C2EED2E00E947438002311F00E94D33ECA
:107D32000E9465380E948A3E0C948A3E4A951AF047
:107D4200000F111FFBCF0895BA92AA929A928A92BB
:107D52007A926A925A924A92BA93AA939A938A937D
:107D62000895BB84AA84998488847F806E805D8014
:107D72004C80BB81AA8199818881F0E00FB6F8948A
:107D8200CE0FDF1F0FBE089520E006D0E9F7089559
:107D9200259102D0E9F708952D9301501040202F2C
:107DA200212B089585E890E7FC0105911491FC01CF
:107DB2003296A591B491FC01349625913491422FCB
:107DC200432B19F0F901E4DF01C0DEDF069610E76C
:107DD2008139910748F308952F930CD02F9101D048
:107DE20008953CD0F12FE02F45E047BFE89536D00B
:107DF20012D0089533D0F12FE02F43E047BFE8952A
:107E02002DD008952BD0F12FE02F43E047BFE89506
:107E120025D001D0089522D041E147BFE8951EC088
:107E22001DD0F12FE02F41E247BFC895002D16C0AB
:107E320015D0F12FE02F49E047BFC895002D0EC0A5
:107E4200F32FE22F012E102E41E047BFE89506C026
:107E520005D0002E29E027BFE89500C0022E27B7E3
:107E620020FDFCCF202D0895022E27B726FDFCCF42
:107E7200202D08950E94A53E22974801C901DA01EA
:107E820010C05BD001E0A00E00E0B01E00E4A0161E
:107E920000E0B00608F440C0830120E030E00E9418
:107EA200F23E0A2F0B2B09F440C0082F0F7710E087
:107EB2002C01401A510A320100E4A02E03C00A2FFD
:107EC2000B2BE1F04816590680F0F40101914F01A5
:107ED2000983119729F001914F010883119711C06D
:107EE200F2013196049108830CC0F20104910983D6
:107EF2003196E817F907A1F7F401EDCF1BD00883FB
:107F020019839201088119810E94213F16D0AA94F7
:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE
:107F220009F4AFCF83011DD0B7CF01E02296ECE078
:107F32000C94B23E82010C945F3802E0400E00E0E5
:107F4200501E08959A938A9380E090E08C0109D0A4
:107F520080589F4F8F3F0FE69007C0F38991999108
:107F6200089520E030E00C94FB3E00000000000089
:067F720000000000FC000D
:107FE4000C94ED3E0C94113F0C94193F0C94213FDA
:0C7FF4000C94F23E0C94033F0C94293FC7
:040000030000700089
:100000000C94FE040C9442050C9442050C94420599
:100010000C9442050C9442050C9442050C94420544
:100020000C9442050C9442050C94A6180C94781973
:100030000C94DB270C9442050C9442050C94420569
:100040000C9442050C9442050C9442050C94420514
:100050000C9442050C9443280C9442050C944205E0
:100060000C9442050C9442050C9442050C944205F4
:100070000C9442050C9442050C9442050C944205E4
:100080000C94D10E0C9442050C9442050C9442053C
:100090000C9442050C9442050C9442050C944205C4
:1000A0000C9442050C9442050C9442059D05AD0547
:1000B000BF05CF05D505E405F005F60504060D06D8
:1000C0001E062E06340664069013901390139013A8
:1000D000901390139013901390139013A713A713DA
:1000E000A713A713A713A713A713A713A713A71340
:1000F00090139013901390139013A713A713A713A3
:10010000A713A713901390139013A713A713A71364
:10011000E519071AF51A071AF51A4C1A6F1AF51A83
:10012000C41AD71ADA1DDA1D171E171E711EAF1E4C
:1001300027212721C81E2721C91FC91F8C20A320C2
:100140002721122107634236B79BD8A71A39685670
:1001500018AEBAAB558C1D3CB7CC5763BD6DEDFDE9
:10016000753EF6177231BF000000803F08000000A6
:10017000BE922449123EABAAAA2ABECDCCCC4C3E9C
:1001800000000080BEABAAAAAA3E00000000BF008B
:100190000000803F0000000000084178D3BB438787
:1001A000D1133D190E3CC3BD4282AD2B3E68EC829B
:1001B00076BED98FE1A93E4C80EFFFBE01C4FF7F20
:1001C0003F00000000002B0014001A00080015007A
:1001D00017001C0018000C00120013002A00290050
:1001E00004001600070009000A000B000D000E00B5
:1001F0000F0033003400E1001D001B000600190051
:1002000005001100100036003700380028000530C6
:10021000E000E200E30003302C002C00043050002A
:10022000510052004F002B0014001A000900130067
:100230000A000D000F0018001C0033002A002900DE
:10024000040015001600170007000B00110008003D
:100250000C0012003400E1001D001B000600190014
:1002600005000E0010003600370038002800053069
:10027000E000E200E30003302C002C0004305000CA
:10028000510052004F002B0034003600370013009D
:100290001C0009000A00060015000F002A002900B2
:1002A00004001200080018000C0007000B001700E3
:1002B000110016003800E100330014000D000E009C
:1002C0001B00050010001A0019001D002800053051
:1002D000E000E200E30003302C002C00043050006A
:1002E000510052004F0035021E021F02200221025F
:1002F0002202230224022502260227022A004C00A1
:100300003A003B003C003D003E003F002D022E0223
:100310002F02300231020100400041004200430040
:10032000440045000100010001000100010001003E
:100330000100010001000100010001000100AB000B
:10034000AA00A900AE0035001E001F0020002100F9
:100350002200230024002500260027002A004C004C
:100360003A003B003C003D003E003F002D002E00C7
:100370002F003000310001004000410042004300E6
:1003800044004500010001000100010001000100DE
:100390000100010001000100010001000100AB00AB
:1003A000AA00A900AE00000000000000000000004C
:1003B000000000000000000000000000000000003D
:1003C000000000000000000000000000000000002D
:1003D000000000000000000000000000000000001D
:1003E000000000000000000000000000000000000D
:1003F0000000000000000330000000000430000096
:100400000000000000001E001E001E001E001E0056
:100410001E001E001E001E001E001E001E0000000A
:1004200014001A000800150017001C0018000C002A
:10043000120013002F00000004001600070009003E
:100440000A000B000D000E000F00330034000D30C9
:10045000000000000600190000000000110010005C
:10046000000000000000000000000000000000008C
:10047000000000000000000000000000000000007C
:10048000000000000000000000000000000000006C
:10049000000000000000000000000000000000005C
:1004A000000000000000000000000000000000004C
:1004B000000000000000000000000000000000003C
:1004C000000000000000000000000000000000002C
:1004D000000000000000000000000000000000001C
:1004E000000000000000000000000000000000000C
:1004F00000000000000000000000000000000000FC
:1005000000000000000000000000000000000000EB
:1005100000000000000000000000000000000000DB
:1005200000000000000000000000000000000000CB
:1005300000000000000000000000000000000000BB
:1005400000000000000000000000000000000000AB
:10055000000000000000000000000000000000009B
:10056000000000000000000000000000000000008B
:10057000000000000000000000000000000000007B
:10058000000000000000000000000000000000006B
:10059000000000000000000000000000000000005B
:1005A000000000000000000000000000000000004B
:1005B000000000000000000000000000000000003B
:1005C000000000000000000000000000000000002B
:1005D000000000000000000000000000000000001B
:1005E000000000000000000000000000000000000B
:1005F00000000000000000000000000000000000FB
:1006000000000000000000000000000000000000EA
:1006100000000000000000000000000000000000DA
:1006200000000000000000000000000000000000CA
:1006300000000000000000000000000000000000BA
:1006400000000000000000000000000000000000AA
:10065000000000000000000000000000000000009A
:10066000000000000000000000000000000000008A
:10067000000000000000000000000000000000007A
:10068000000000000000000000000000000000006A
:10069000000000000000000000000000000000005A
:1006A000000000000000000000000000000000004A
:1006B000000000000000000000000000000000003A
:1006C000000000000000000000000000000000002A
:1006D000000000000000000000000000000000001A
:1006E000000000000000000000000000000000000A
:1006F00000000000000000000000000000000000FA
:1007000000000000000000000000000000000000E9
:1007100000000000000000000000000000000000D9
:1007200000000000000000000000000000000000C9
:1007300000000000000000000000000000000000B9
:1007400000000000000000000000000000000000A9
:100750000000000000000000000000000000000099
:100760000000000000000000000000000000000089
:100770000000000000000000000000000000000079
:100780000000000000000000000000000000000069
:100790000000000000000000000000000000000059
:1007A0000000000000000000000000000000000049
:1007B0000000000000000000000000000000000039
:1007C00000000000000001000050010001000100D5
:1007D0000100010001000100010001004C000100C6
:1007E0000100010007300630135012500030013074
:1007F00002300C30010001000B300A3009300830A3
:1008000001000100010001000100010001000100E0
:1008100001000100010001000100010001000100D0
:100820000100010001002803540068006500200059
:1008300050006C0061006E0063006B0020004B00F4
:100840006500790062006F006100720064000000C2
:100850002C034F007200740068006F006C00690088
:100860006E0065006100720020004B006500790099
:1008700062006F00610072006400730000000403F6
:10088000090409026D00040100A0FA090400000136
:1008900003010100092111010001223F0007058128
:1008A0000308000A090401000103010200092111E3
:1008B000010001224D000705820308000A09040215
:1008C0000001030000000921110100012236000788
:1008D00005830308000A090403000103000000095E
:1008E00021110100012239000705840310000112C3
:1008F00001100100000008EDFE606001000102002F
:100900000105010906A101050719E029E7150025E0
:1009100001950875018102050819012905950575DC
:1009200001910295017503910105071900297715B9
:10093000002501957875018102C005010980A1019A
:10094000850216010026B7001A01002AB7007510AB
:1009500095018100C0050C0901A101850316010064
:10096000269C021A01002A9C02751095018100C084
:1009700005010902A1010901A100050919012905C3
:100980001500250195057501810295017503810109
:100990000501093009311581257F95027508810609
:1009A00009381581257F950175088106050C0A38DF
:1009B000021581257F950175088106C0C0050109D2
:1009C00006A101050719E029E7150025019508751D
:1009D0000181029501750881010508190129059514
:1009E000057501910295017503910105071900290B
:1009F000FF150025FF950675088100C011241FBE54
:100A0000CFEFDAE0DEBFCDBF04B603FE24C0809195
:100A1000190490911A04A0911B04B0911C04873012
:100A2000904BA740B04BB9F41092190410921A04DD
:100A300010921B0410921C0414BE84B7877F84BFDD
:100A400088E10FB6F89480936000109260000FBEAA
:100A5000E0E0F8E3099513E0A0E0B1E0E4E8F3E6B4
:100A600002C005900D92A431B107D9F714E0A4E1BA
:100A7000B3E001C01D92A931B107E1F70E94EC1566
:100A80000C94C0310C940000279A2F988FEF9FEFA1
:100A900090938700809386008AE08093800089E1AC
:100AA000809381000C94452D282F81110BC08091DB
:100AB0008000877F8093800010928D0010928C00C0
:100AC0002F9808952F9880918000886080938000EF
:100AD000233019F48FEF9FEF0FC083E090E0821B6B
:100AE0009109880F991F2FEF3FEFA90102C056957A
:100AF00047958A95E2F7CA0190938D0080938C0008
:100B00000895CF93DF93EC010E94DC28BE0180E0C2
:100B100090E0DF91CF910C9407250F931F93462F00
:100B200050E04E30510508F0DEC0DC01FA01EA5A0F
:100B3000FF4F12968C910C948431882309F4D3C012
:100B400000E010E0980140E064E070E08BE292E0A9
:100B50000E944F1281E090E00FC0882309F4C3C0C7
:100B600000E010E0980140E066E070E08BEB91E07F
:100B70000E944F1282E090E00E948105B4C0882359
:100B800009F4B1C000E010E0980140E068E070E0D6
:100B90008BEE91E00E944F1284E090E0EDCF88232D
:100BA00011F083E005C083E00CC0882349F084E0A5
:100BB0000E94842540E164E083E00E94910A93C092
:100BC00084E00E94A525F6CF882331F085EE0E94AF
:100BD0006E1C0E949C2D87C085EE0E94361D83C02E
:100BE000882309F480C00E94E30D7DC0882309F4A6
:100BF0007AC00E94DC0D00E010E0980140E065E062
:100C000070E08BE492E027C0882309F46CC085E093
:100C10000E94A5250E94040E66C0882309F463C0C3
:100C200000E010E0980140E068E070E08BE191E0C6
:100C30000E944F1285E00E94842555C0882309F444
:100C400052C00E94E21200E010E0980140E068E02B
:100C500070E08BE191E00E944F1245C0882309F4B7
:100C600042C00E94ED12EFCF8823E9F100E010E0CE
:100C7000980140E066E070E08BE891E00E944F123E
:100C800084E00E94A52583E00E94A52580E10E94C2
:100C9000A52585E00E94A5250E94040E86E00E94FD
:100CA00084250E94C928811102C00E94A5280E94A3
:100CB000E12890E090931804809317048068809353
:100CC00017040E94E5280FC0882369F000E010E0B7
:100CD000980140E066E070E08BE591E00E944F12E1
:100CE00086E00E94A52580E090E01F910F91089575
:100CF0000F931F932FEF89EF90E021508040904099
:100D0000E1F700C0000000E010E0980140E065E07D
:100D100070E08BE492E00E944F121F910F910895B2
:100D20000F931F9300E010E0980140E063E070E053
:100D300083E091E00E944F122FEF82E597E021506F
:100D400080409040E1F700C000001F910F9108958E
:100D5000CF92DF92EF92FF920F931F93CF93DF9387
:100D6000CDB7DEB7CC58D1090FB6F894DEBF0FBEB1
:100D7000CDBF2091D10325FFC5C08C01FC0192811C
:100D800080910201992309F460C096E4E0E9F2E061
:100D9000DE01A95BBF4F01900D929A95E1F7F80132
:100DA0009081E0910001F0910101E90FF11DEE0F3A
:100DB000FF1F27E430E02C0F3D1FE20FF31F60817F
:100DC0007181680F711D882777FD8095982F0E948B
:100DD000E02E20E030E040E451E40E94452E6B011B
:100DE0007C01F801218184E090E0821B9109BC0123
:100DF000882777FD8095982F0E94E02E9B01AC01FB
:100E0000C701B6010E94DD2D9B01AC0160E070E0DE
:100E100080E090E40E94F72F20E030E04CE551E4C0
:100E20000E94942F4FE050E0C457DF4F0FB6F89464
:100E3000DEBF0FBECDBFDF91CF911F910F91FF900D
:100E4000EF90DF90CF900C94EF1196E4E0E9F2E0A0
:100E5000DE01119601900D929A95E1F7F8019081CB
:100E6000E0910001F0910101E90FF11DEE0FFF1F6C
:100E700021E030E02C0F3D1FE20FF31F60817181F4
:100E8000680F711D882777FD8095982F0E94E02EAE
:100E900020E030E040E451E40E94452E6B017C01EB
:100EA000F801218184E090E0821B9109BC01882730
:100EB00077FD8095982F0E94E02E9B01AC01C70121
:100EC000B6010E94DD2D9B01AC0160E070E080E086
:100ED00090E40E94F72F20E030E04CE551E40E94BE
:100EE000942FC457DF4F0FB6F894DEBF0FBECDBFAF
:100EF000DF91CF911F910F91FF90EF90DF90CF90F6
:100F00000C94370EC457DF4F0FB6F894DEBF0FBEF8
:100F1000CDBFDF91CF911F910F91FF90EF90DF90A8
:100F2000CF90089508950E9444056E9A769A0C9485
:100F300078060C9492070C94A8060895880F991FC0
:100F4000FC01EA5BFF4F859194910895880F991FEA
:100F5000FC01EA53FE4F8591949108950F931F93DE
:100F6000CF93DF93EC01811520E49207A0F5C11522
:100F700080E3D80708F0E1C0C83ED105D8F4C03EF0
:100F8000D10508F0EEC1C83AD10578F4C53AD105CB
:100F900008F074C0C130D10509F46DC008F4DEC199
:100FA000C430D10508F0DDC1D9C1CB3BD10508F46F
:100FB00070C0D4C1C11590E2D90708F0B9C0C115FD
:100FC00021E0D20708F0CDC1C03FD10508F4C6C169
:100FD0008E01106506C2C13080E5D80709F4BDC096
:100FE00068F5C13120E4D20709F4AEC050F4C03135
:100FF00090E4D90708F0A5C0CF70DD278E01146DED
:10100000F0C1C33120E4D20709F4A4C008F49FC0A2
:10101000C115D04509F0A2C10E944B210E94040EC7
:101020000E9490069FEF24E38CE091502040804086
:10103000E1F700C000000E946828D3C1C11520E676
:10104000D20730F4C11581E5D80708F48CC02DC152
:10105000C11590E7D90708F481C1C11520E8D2076E
:1010600008F478C1C11580E9D80708F077C1DF70AE
:101070008E01106AB6C101E010E0B3C1C53AD105D6
:1010800009F471C1C63AD10509F070C102E810E453
:10109000A8C1C83AD10509F46CC1C93AD10509F40F
:1010A0006BC1CA3AD10509F46AC1CB3AD10509F43A
:1010B00069C1CC3AD10509F468C1CD3AD10509F42A
:1010C00067C1C03BD10509F466C1CE3AD10509F428
:1010D00065C1CF3AD10509F464C1C13BD10509F41A
:1010E00063C1C23BD10509F462C1C33BD10509F418
:1010F00061C1C43BD10509F460C1C53BD10509F408
:101100005FC1C63BD10509F45EC1C73BD10509F4F7
:101110005DC1C83BD10509F45CC1C93BD10509F4E7
:101120005BC1CA3BD10509F45AC100E014E459C1BE
:10113000CE019F700E94A60755C1DD278E01106C5D
:1011400050C100E011ED4DC100E010ED4AC100E0DA
:1011500012ED47C100E013ED44C18091ED038160C1
:101160008093ED033EC10E94C928811102C00E94F4
:10117000A5280E94E12890E090931804809317041A
:10118000C23090E5D90721F480911704816086C0B0
:10119000C43020E5D20721F48091170482607EC01C
:1011A000C63080E5D80721F480911704846076C0AA
:1011B000C83090E5D90719F48091170427C0CA30C8
:1011C00020E5D20721F480911704806167C0CC30FC
:1011D00080E5D80721F48091170480625FC0CE308B
:1011E00090E5D90721F480911704806457C0C0317D
:1011F00020E5D20721F48091170480684FC0C231E6
:1012000080E5D80729F4809117048460886046C07F
:10121000C33090E5D90721F4809117048E7F3EC03A
:10122000C53020E5D20721F4809117048D7F36C0A8
:10123000C73080E5D80721F4809117048B7F2EC03A
:10124000C93090E5D90719F48091170426C0CB3036
:1012500020E5D20721F4809117048F7E1FC0CD3086
:1012600080E5D80721F4809117048F7D17C0CF3017
:1012700090E5D90721F4809117048F7B0FC0C1310D
:1012800020E5D20721F4809117048F7707C0C3317E
:10129000D04531F4809117048B7F877F80931704AA
:1012A000809117040E94E5289CC08D2F99278F708C
:1012B000992781309105D9F49E012370332702C00C
:1012C000880F991F2A95E2F79C688E0144E0000F71
:1012D000111F4A95E1F700271370802B912B53E0E3
:1012E000CC0FDD1F5A95E1F7C076DD272FC0823085
:1012F000910531F4DC2FCC278E01016F106A71C08B
:101300008330910569F4CE018370992701E010E0E4
:1013100002C0000F111F8A95E2F7C8019C680FC038
:10132000049709F05EC0CE018370992701E010E0B8
:1013300002C0000F111F8A95E2F7C8019A6823E0E6
:10134000CC0FDD1F2A95E1F7C07ED7708C010C2BE6
:101350001D2B47C0DF708E01106243C000E010E01B
:1013600040C08E013EC001E810E43BC003E810E439
:1013700038C002EE14E435C009EE14E432C00AEEBF
:1013800014E42FC005EB14E42CC006EB14E429C0D0
:1013900007EB14E426C00CEC14E423C00DEC14E4B9
:1013A00020C003E815E41DC00AE815E41AC002E9EC
:1013B00015E417C004E915E414C001E216E411C0F5
:1013C00003E216E40EC004E216E40BC005E216E4E4
:1013D00008C006E216E405C007E216E402C00AE20D
:1013E00016E4C801DF91CF911F910F9108959CE001
:1013F000799FF001112490E3899FE00DF11D1124E4
:10140000E60FF11DEE0FFF1FEA53FE4F85919491F9
:10141000803E9105E0F4803C910558F581339105BB
:1014200009F46FC048F48932910509F463C08A3227
:10143000910509F46DC072C089339105E9F08238D5
:101440009105D1F08533910509F44DC067C0833E05
:10145000910581F138F4803E9105B9F0823E910505
:10146000D9F05CC0863E910561F1873E9105A1F1FE
:1014700055C00E949E0708952091170420FD02C0C8
:1014800021FF4CC080EE90E049C08091170480FF9E
:10149000F9CF89E390E042C08091170482FF0EC02B
:1014A0008091170484FF03C080E090E037C083EE92
:1014B00090E034C08091170482FFF2CF82EE90E07A
:1014C0002DC08091170483FF0BC08091170484FD09
:1014D000EBCF87EE90E022C08091170483FFF5CF19
:1014E00086EE90E01BC08091170485FF07C089E25B
:1014F00090E014C08091170485FFF9CF85E390E058
:101500000DC08091170486FF07C08AE290E006C0F4
:101510008091170486FFF9CF81E390E00E94AE0727
:101520000895CF92DF92EF92FF920F931F9301E005
:1015300010E020E030E06801790104C0CC0CDD1C33
:10154000EE1CFF1C8A95D2F704C0000F111F221F4A
:10155000331F6A95D2F70C291D292E293F29C090E7
:10156000D103D090D203E090D303F090D403C022F3
:10157000D122E222F322842FC016D106E206F3061E
:1015800041F41F910F91FF90EF90DF90CF900C945A
:1015900084251F910F91FF90EF90DF90CF900C94D6
:1015A000A52508950C94D10A5F926F927F928F9235
:1015B0009F92AF92BF92CF92DF92EF92FF920F93E2
:1015C0001F93CF93DF93CDB7DEB728970FB6F8946C
:1015D000DEBF0FBECDBFCE0101966C014E0199E07A
:1015E000890E911C20E030E040E050E060E070E0C7
:1015F00000E010E0E12CF12C6C2C5D2C88E0782EC2
:10160000AA24A394B12CE6EDF2E0A62DB52D872DEA
:1016100001900D928A95E1F7F601819191916F0108
:10162000FC01E07FFF27E032F10559F48F70992724
:10163000F50102C0EE0FFF1F8A95E2F7EE2AFF2A9E
:1016400037C0E033F10559F48F709927F50102C0D6
:10165000EE0FFF1F8A95E2F70E2B1F2B29C0E034F7
:10166000F10559F48F709927F50102C0EE0FFF1FA5
:101670008A95E2F76E2B7F2B1BC0E035F10559F4FC
:101680008F709927F50102C0EE0FFF1F8A95E2F7D0
:101690004E2B5F2B0DC0E036F10551F48F7099276A
:1016A000F50102C0EE0FFF1F8A95E2F72E2B3F2BAC
:1016B000C814D90409F0A7CF84B19E2D9095892331
:1016C00084B985B1E82AE5B887B1902F9095892330
:1016D00087B988B1082B08B98AB1962F90958923CC
:1016E0008AB98BB1682B6BB98DB1942F90958923F2
:1016F0008DB98EB1482B4EB980B3922F9095892326
:1017000080BB81B3282B21BB28960FB6F894DEBF8F
:101710000FBECDBFDF91CF911F910F91FF90EF9042
:10172000DF90CF90BF90AF909F908F907F906F9001
:101730005F9008955F926F927F928F929F92AF9287
:10174000BF92CF92DF92EF92FF920F931F93CF93AE
:10175000DF93CDB7DEB768970FB6F894DEBF0FBE44
:10176000CDBF85B7806885BF85B7806885BF0E947B
:10177000D40ACE0101966C014E0199E1890E911CAB
:1017800020E030E040E050E060E070E000E010E099
:10179000E12CF12C6C2C5D2C88E1782EAA24A394EA
:1017A000B12CEEEDF2E0A62DB52D872D01900D9216
:1017B0008A95E1F7F601819191916F01FC01E07F3B
:1017C000FF27E032F10559F48F709927F50102C027
:1017D000EE0FFF1F8A95E2F7EE2AFF2A37C0E033AB
:1017E000F10559F48F709927F50102C0EE0FFF1F24
:1017F0008A95E2F70E2B1F2B29C0E034F10559F42E
:101800008F709927F50102C0EE0FFF1F8A95E2F74E
:101810006E2B7F2B1BC0E035F10559F48F70992793
:10182000F50102C0EE0FFF1F8A95E2F74E2B5F2BEA
:101830000DC0E036F10551F48F709927F50102C013
:10184000EE0FFF1F8A95E2F72E2B3F2BC814D90409
:1018500009F0A7CF84B19E2D9095892384B985B1D5
:10186000E82AE5B887B1902F9095892387B988B188
:10187000082B08B98AB1962F909589238AB98BB124
:10188000682B6BB98DB1942F909589238DB98EB14A
:10189000482B4EB980B3922F9095892380BB81B39A
:1018A000282B21BB10921D0310921C0310921503CC
:1018B0001092140310921F0310921E03109217032C
:1018C0001092160310922103109220031092190314
:1018D00010921803109223031092220310921B03FC
:1018E00010921A0368960FB6F894DEBF0FBECDBFF4
:1018F000DF91CF911F910F91FF90EF90DF90CF90EC
:10190000BF90AF909F908F907F906F905F900C945E
:1019100093077F928F929F92AF92BF92CF92DF9266
:10192000EF92FF920F931F93CF93DF93CDB7DEB764
:10193000A0970FB6F894DEBF0FBECDBF6E0149E190
:10194000C40ED11C84E1E82E83E0F82E98E0792EB5
:10195000BC2CAD2C01E010E028E1822E35E0932E66
:10196000E6EDF2E0AB2DBA2D872D01900D928A9510
:10197000E1F7F601819191916F019C01207F33275E
:101980002032310591F424B18F709927A80102C04B
:10199000440F551F8A95E2F7CA01922F982B94B9EC
:1019A00095B18095892385B953C02033310591F4D1
:1019B00027B18F709927F80102C0EE0FFF1F8A959B
:1019C000E2F7CF01922F982B97B998B18095892390
:1019D00088B93EC02034310591F42AB18F7099271F
:1019E000A80102C0440F551F8A95E2F7CA01922F41
:1019F000982B9AB99BB1809589238BB929C0203542
:101A0000310591F42DB18F709927F80102C0EE0FC6
:101A1000FF1F8A95E2F7CF01922F982B9DB99EB1B7
:101A2000809589238EB914C02036310589F420B3FE
:101A30008F709927A80102C0440F551F8A95E2F7BD
:101A4000CA01922F982B90BB91B38095892381BBBB
:101A500050EA5A95F1F7BE016F5F7F4F20E030E00A
:101A600040E050E0EEEDF2E0DE011196882D0190AD
:101A70000D928A95E1F7FB0181919191BF01FC01E3
:101A8000E07FFF27E032F10511F4E3B113C0E0334A
:101A9000F10511F4E6B10EC0E034F10511F4E9B13D
:101AA00009C0E035F10511F4ECB104C0E036F105F0
:101AB000B9F4EFB1F0E08F70992702C0F595E79582
:101AC0008A95E2F7E0FD08C0C801042E02C0880F25
:101AD000991F0A94E2F702C080E090E0282B392B8E
:101AE0004F5F5F4F4C30510509F0BCCFF70180814B
:101AF00091818217930721F03183208390927302A2
:101B00000E94D40AF2E0EF0EF11C4CE1E41643E02F
:101B1000F40609F025CF80917302882361F181508A
:101B200080937302882339F08FE99FE00197F1F7E2
:101B300000C0000020C08091140390911503909381
:101B40001D0380931C0380911603909117039093BB
:101B50001F0380931E0380911803909119039093A3
:101B600021038093200380911A0390911B0390938B
:101B70002303809322030E94990781E0A0960FB669
:101B8000F894DEBF0FBECDBFDF91CF911F910F91B3
:101B9000FF90EF90DF90CF90BF90AF909F908F908D
:101BA0007F900895E82FF0E0EE0FFF1FE45EFC4FFA
:101BB00080819181089508958091020481608093CD
:101BC00002040C94F728809102048E7F8093020413
:101BD0000C94F7280E94C928811102C00E94A528F0
:101BE0000E94F328809302043E9A809171008D7FB9
:101BF0008093710082E0809390008AE1809391004D
:101C000081E080932603089580912603811102C00C
:101C10000E94EA0D10927603109275038091710074
:101C20008D7F80937100809190008F7780939000DA
:101C3000109238031092370310926F0310927003C2
:101C4000109271031092720310926E0310926D0342
:101C5000EDE4F3E0ADE3B3E0119211921192119231
:101C60001D921D9283E0ED36F807B1F70895CF92EB
:101C7000DF92EF92FF920F931F93CF93DF93209108
:101C80003703222309F484C06B017C018091260371
:101C9000811102C00E94EA0D0DE613E0C7E0D0E01A
:101CA000A7019601F80192918291729162918F0140
:101CB0000E94412E811131C0FE01EE0FFF1FEE0F79
:101CC000FF1FE35BFC4F1082118212821382DE0140
:101CD000AA0FBB1FA35CBC4F11961C921E92C7306B
:101CE000D105E9F021964481558166817781408351
:101CF000518362837383148215821682178212962F
:101D00008D919C91139711969C938E9313961C9290
:101D10001E92129734961296E2CF219708F6809180
:101D2000750390917603019797FD05C09093760314
:101D30008093750304C0109276031092750380910E
:101D400075039091760320917303309174032817E3
:101D5000390724F01092740310927303892BC1F495
:101D6000809171008D7F80937100809190008F77BA
:101D70008093900010926F03109270031092710381
:101D80001092720310926E0310926D03109237033B
:101D9000DF91CF911F910F91FF90EF90DF90CF9047
:101DA00008951F920F920FB60F9211244F925F92D7
:101DB0006F927F928F929F92AF92BF92CF92DF925B
:101DC000EF92FF922F933F934F935F936F937F9385
:101DD0008F939F93AF93BF93CF93DF93EF93FF9333
:101DE00080913703882309F49BC1C0917503D0917A
:101DF00076031C161D060CF093C1409027035090EB
:101E000028036090290370902A0320E030E0A901A4
:101E1000C301B2010E94902F18160CF065C0C130AA
:101E2000D10509F452C08091730390917403BE01EF
:101E30000E9470317C0190937403809373038090AF
:101E4000390390903A03A0903B03B0903C0320E00C
:101E500030E040E85FE3C501B4010E94DD2D6093EE
:101E6000390370933A0380933B0390933C03F7014B
:101E7000EE0FFF1FEE0FFF1FE35BFC4FA30192016C
:101E800060817181828193810E94452E20E030E043
:101E900040E05EE30E94942F9B01AC01C501B401B8
:101EA0000E94902F18168CF4C7010196BE010E9463
:101EB00070319093740380937303109239031092DE
:101EC0003A0310923B0310923C03E0917303F091AC
:101ED0007403EE0FFF1FEE0FFF1FE35BFC4F6081EB
:101EE000718182819381D0C0C0906F03D0907003C4
:101EF000E0907103F090720320E030E0A901C70187
:101F0000B6010E94412E2197882309F4A2C0FE0148
:101F1000EE0FFF1FEE0FFF1FE35BFC4F80809180F1
:101F2000A280B380A5019401C701B6010E94412E91
:101F300087FF31C0A501940160E070E08CED93EC67
:101F40000E94452E20E030E040E451E40E94452EFE
:101F500020E030E040E05FE30E94942F9B01AC0161
:101F600060E070E080E090E40E94F72F9B01AC01FC
:101F7000C501B4010E94942F9B01AC01C701B601B9
:101F80000E94412E87FF07C0A701960160E070E024
:101F90008CED93E439C0A5019401C701B6010E94FC
:101FA000902F18160CF055C0A501940160E070E068
:101FB0008CED93E40E94452E20E030E040E451E4B3
:101FC0000E94452E20E030E040E05FE30E94942F25
:101FD0009B01AC0160E070E080E090E40E94F72F8C
:101FE0009B01AC01C501B4010E94942F9B01AC017F
:101FF000C701B6010E94902F18165CF5A701960143
:1020000060E070E08CED93EC0E94452E20E030E023
:1020100040E451E40E94452E20E030E040E05FE3E0
:102020000E94942F9B01AC0160E070E080E090E49E
:102030000E94F72F9B01AC01C701B6010E94942FAB
:1020400060936F0370937003809371039093720396
:1020500013C0FE01EE0FFF1FEE0FFF1FE35BFC4FEF
:1020600080819181A281B38180936F0390937003EB
:10207000A0937103B093720360916F03709170032A
:102080008091710390917203209124033091250374
:102090002F3F4FEF340731F02F5F3F4F3093250331
:1020A000209324030E94F8126B017C0120E034E2AB
:1020B00044EF51E40E94412E87FF08C086EFC82EEE
:1020C00088E2D82E84EFE82E81E4F82E20E030E07C
:1020D00040E051E4C701B6010E94942F9B01AC017E
:1020E00060E074E284E79BE40E94452E6B017C0172
:1020F0000E94AD2E70939700609396002091740219
:10210000309175024091760250917702C701B60175
:102110000E94942F0E94AD2E7093990060939800B6
:1021200080913803882309F433C1C0903303D090E1
:102130003403E0903503F090360320E030E0A9014D
:10214000C701B6010E94902F1816D4F58091240380
:10215000909125038F3F2FEF920729F001969093DE
:10216000250380932403C701B6010E94F81220E0E2
:1021700030E040E051E40E94942F9B01AC0160E00C
:1021800074E284E79BE40E94452E6B017C010E946F
:10219000AD2E709397006093960020917402309159
:1021A00075024091760250917702C701B6010E94F4
:1021B000942F0E94AD2E709399006093980008C0F0
:1021C0001092970010929600109299001092980029
:1021D00060912D0370912E036F5F7F4F70932E03DC
:1021E00060932D03209196003091970080E090E05D
:1021F000232BF1F0C0919600D09197000E94DE2E23
:102200006B017C01BE0180E090E00E94DE2E9B010C
:10221000AC0160912F037091300380913103909154
:1022200032030E94452E20E03FEF4FE757E410C0F5
:102230000E94DE2E6B017C0120E030EE4FEF54E473
:1022400060912F037091300380913103909132039C
:102250000E94942F9B01AC01C701B6010E94902FF0
:1022600087FD96C080912B038F5F80932B0390E0B6
:102270002091FE033091FF0382179307A0F0809115
:102280000904882319F010922B030DC0809171006E
:102290008D7F80937100809190008F778093900064
:1022A000109238037DC080912C03C0912B038111C3
:1022B00028C0C0900304D0900404E0900504F0907E
:1022C000060420E030E0A901C701B6010E94902F6A
:1022D0001816BCF481E080932C0310923303109203
:1022E00034031092350310923603C0922F03D0921C
:1022F0003003E0923103F0923203C150C0932B03BC
:1023000043C010922C031092250310922403E091F5
:102310000004F091010448E0C49FE00DF11D112478
:1023200080819181A281B3818093330390933403A0
:10233000A0933503B093360320E030E040E85EE33D
:1023400064817581868197810E94942F6B017C0145
:1023500020E030E048EC52E460917802709179021C
:1023600080917A0290917B020E94452E9B01AC01E4
:10237000C701B6010E94942F60932F03709330031E
:10238000809331039093320310922E0310922D0309
:102390008091020480FD04C010923803109237032C
:1023A000FF91EF91DF91CF91BF91AF919F918F916D
:1023B0007F916F915F914F913F912F91FF90EF909F
:1023C000DF90CF90BF90AF909F908F907F906F9055
:1023D0005F904F900F900FBE0F901F901895CF9267
:1023E000DF92EF92FF92CF93DF936B017C01EA01C2
:1023F00080912603811102C00E94EA0D809102049F
:1024000080FF46C0809175039091760308970CF089
:102410003FC0809171008D7F80937100809138035F
:1024200081110E94040E81E08093370310922503EE
:102430001092240320E030E0A901C701B6010E94F8
:10244000902F1816DCF48091750390917603FC01AF
:10245000EE0FFF1FEE0FFF1FE35BFC4FC082D18228
:10246000E282F382FC01EE0FFF1FE35CFC4FD1839D
:10247000C0830196909376038093750380917100D9
:1024800082608093710080919000806880939000BA
:10249000DF91CF91FF90EF90DF90CF9008958F92D2
:1024A0009F92AF92BF92CF92DF92EF92FF920F93E3
:1024B0001F93CF93DF93EC017B01D42E4801590188
:1024C00080912603811102C00E94EA0D80910204CE
:1024D00080FF6BC0809171008D7F8093710080912F
:1024E000370381110E94040E81E080933803D0935A
:1024F0000104C0930004F092FF03E092FE03D09227
:1025000009048092030490920404A0920504B092FE
:1025100006041092390310923A0310923B03109272
:102520003C0310922B0388819981AA81BB818093FF
:10253000330390933403A0933503B093360320E024
:1025400030E040E85EE36C817D818E819F810E9456
:10255000942F6B017C0120E030E048EC52E4609164
:1025600078027091790280917A0290917B020E94A8
:10257000452E9B01AC01C701B6010E94942F6093C8
:102580002F037093300380933103909332031092A2
:102590002E0310922D038091710082608093710050
:1025A00080919000806880939000DF91CF911F917F
:1025B0000F91FF90EF90DF90CF90BF90AF909F90E2
:1025C0008F9008958091770390E0019665E070E028
:1025D0000E9470318093770308958091770390E093
:1025E000019765E070E00E94703180937703089551
:1025F0008F929F92AF92BF92CF92DF92EF92FF9213
:10260000CF93DF936B017C01C0912403D09125030C
:10261000BE0180E090E00E94DE2E4B015C01A7012C
:10262000960160E070E08CE594E40E94452E9B01E9
:10263000AC01C501B4010E94942F0E94B22E4091BA
:102640007703423009F45CC028F4442351F0413050
:10265000E9F0FBC0433009F481C0443009F4B4C050
:10266000F4C080E090E0A0E0BFE380937402909318
:102670007502A0937602B09377021092270310920E
:1026800028031092290310922A03DFC01092270317
:10269000109228031092290310922A0364317105C5
:1026A00040F46A307105E0F520E030E040E85EE398
:1026B0003BC0693C710508F0C0C080E090E00E941A
:1026C000DE2E20E030E040EA51E40E94DC2D20E0E4
:1026D00030E044E353E40E94452E9B01AC010E948C
:1026E000942F20E030E040E05EE30E94942F9B01B5
:1026F000AC0160E070E080E09EE30E94DC2D5BC0F6
:1027000010922703109228031092290310922A0393
:102710006432710578F4FB01EC59FF4F0C9484315D
:1027200020E030E040E05FE3C701B6010E94942F53
:102730006B017C0180E090E0A0E0BEE38093740236
:1027400090937502A0937602B09377027EC0A701A2
:102750009601C701B6010E94DD2DEACF1092270332
:10276000109228031092290310922A032AE0269F30
:10277000A001279F500D1124CA0168EB7BE00E9445
:102780005C31BC016C5D754077FF03C0719561954C
:102790007109882777FD8095982F0E94E02E2EE3FF
:1027A00033EC4EE259E30E94942F20E030E040ECFD
:1027B0005EE30E94DD2D6093740270937502809336
:1027C00076029093770241C010922703109228035B
:1027D0001092290310922A03CE0183709927892B26
:1027E000E1F0BE016170772780E090E00E94DE2E6C
:1027F00020E030E040E05EE30E94942F20E030E0F3
:1028000040E45FE30E94DD2D6093740270937502D3
:1028100080937602909377020CC080E090E0A0E075
:10282000BFE38093740290937502A0937602B093F5
:102830007702C770DD27CD2B41F4109274021092FD
:1028400075021092760210927702C701B601DF91ED
:10285000CF91FF90EF90DF90CF90BF90AF909F907F
:102860008F900895809188030895CF93DF9300D0CF
:102870001F92CDB7DEB79C0180910E04843019F50C
:1028800093E099833B832A839093E9008FEF9091A3
:10289000E800815095FD06C095ED9A95F1F700008E
:1028A0008111F5CF8091E80085FF0DC040E050E038
:1028B00063E070E0CE0101960E9496168091E800D8
:1028C0008E778093E8000F900F900F90DF91CF915B
:1028D0000895CF93DF9300D01F92CDB7DEB720913C
:1028E0000E04243021F522E029839B838A8383E030
:1028F0008093E9008FEF9091E800815095FD06C02C
:1029000095ED9A95F1F700008111F5CF8091E800DF
:1029100085FF0DC040E050E063E070E0CE0101961D
:102920000E9496168091E8008E778093E8000F90C1
:102930000F900F90DF91CF91089520910E042430D5
:10294000F1F422E02093E9002FEF3091E8002150CC
:1029500035FD06C035ED3A95F1F700002111F5CFB0
:102960002091E80025FF0BC040E050E065E070E0FA
:102970000E9496168091E8008E778093E800089573
:10298000CF93DF93EC0190910E04943009F046C090
:10299000809186028823D9F0809187028823B9F03C
:1029A0009093E9008FEF9091E800815095FD06C06B
:1029B00095E19A95F1F700008111F5CF8091E8003B
:1029C00085FF2CC040E050E060E170E017C081E07E
:1029D0008093E9008FEF9091E800815095FD06C04B
:1029E00095ED9A95F1F700008111F5CF8091E800FF
:1029F00085FF14C040E050E068E070E0CE010E9426
:102A000096168091E8008E778093E80080E1FE01C1
:102A1000A8E7B3E001900D928A95E1F7DF91CF919D
:102A2000089580910D04811109C00E942B180E9405
:102A300088188091E20084608093E20008951092EB
:102A40000D040895089508950C94D02742E061EC98
:102A500081E00E94A51742E061EC82E00E94A51788
:102A600042E061EC83E00E94A51742E161EC84E062
:102A70000C94A51780911004833009F455C030F4EC
:102A8000813071F0823009F48EC008958A3009F4E3
:102A90007AC08B3009F460C0893009F09CC020C036
:102AA00080910F04813A09F096C08091E800877FF9
:102AB0008093E8008091130490911404892B21F4F1
:102AC00060E188E793E003C060E080E090E070E0C0
:102AD0000E94E1168091E8008B778093E8000895CA
:102AE00080910F04813209F076C080911304909197
:102AF0001404009719F0039709F06DC08091E80065
:102B0000877F8093E8008091E80082FD05C0809176
:102B10000E048111F8CF5FC08091F100809388038B
:102B20008091E8008B7753C080910F04813A09F0BF
:102B300052C08091130490911404892B09F04BC06A
:102B40008091E800877F8093E8008091E80080FF13
:102B5000FCCF8091860236C080910F048132D9F576
:102B60008091130490911404892BA9F58091E800B9
:102B7000877F8093E8000E94DA1780911104809388
:102B800086020C944B2180910F04813221F58091B3
:102B9000E800877F8093E8000E94DA178091120492
:102BA00080938903089580910F04813AA1F4809164
:102BB000E800877F8093E8008091E80080FFFCCFE9
:102BC000809189038093F1008091E8008E77809353
:102BD000E8000C94DA17089584B7877F84BF88E1F2
:102BE0000FB6F89480936000109260000FBE90E0E2
:102BF00080E80FB6F89480936100909361000FBE57
:102C00000E947D1B0E942B180E9488188091E20070
:102C100084608093E20078940E940E1B0E947F1BC8
:102C20008CE792E00E94291B80910E04853069F4A4
:102C30000E948A2780910C048823B1F30E94B82750
:102C4000882391F30E948016EFCF0E94871BECCF60
:102C5000292F332723303105C9F064F421303105A1
:102C600081F02230310509F043C08DE690E022E882
:102C700038E042C021323105F1F02232310541F114
:102C800037C082E190E02FEE38E036C099278130DE
:102C9000910541F08230910541F0892B49F5EEE72D
:102CA000F8E005C0E0E5F8E002C0E6E2F8E0849173
:102CB00090E09F0121C06430D8F4E62FF0E0EE0FE1
:102CC000FF1FEE5FFC4F2081318189E090E014C04E
:102CD000643070F470E0FB01EE0FFF1FE650FD4F13
:102CE00020813181FB01EA50FD4F808190E004C0DA
:102CF00080E090E020E030E0FA0131832083089505
:102D000080E189BD82E189BD09B400FEFDCF8091DB
:102D1000D8008F7D8093D8008091E00082608093FE
:102D2000E0008091E00081FDFCCF0895CF92DF921A
:102D3000EF92FF920F931F93CF93DF93EC018B01E0
:102D40006A010E94F917811133C0C114D10439F00E
:102D5000F60180819181081B190BC80FD91FE12C46
:102D6000F12C0115110519F18091E80085FD16C0BF
:102D70008091E8008E778093E800C114D10449F077
:102D8000F60180819181E80EF91EF182E08285E0F2
:102D90000FC00E94F917882321F30AC089918093FC
:102DA000F10001501109FFEFEF1AFF0ADACF80E0BE
:102DB000DF91CF911F910F91FF90EF90DF90CF9017
:102DC000089520911504309116042617370748F00E
:102DD0006115710539F42091E8002E772093E80001
:102DE00001C0B90140E061157105A9F120910E04FF
:102DF000222309F443C0253009F442C02091E800A1
:102E000023FD40C02091E80022FD32C02091E8005F
:102E100020FFE9CF4091F3002091F20030E0342B05
:102E2000FC01CF016115710559F02830310540F4DE
:102E300081918093F100615071092F5F3F4FF1CF75
:102E400041E02830310509F040E02091E8002E777C
:102E50002093E800C8CF4111C9CF0AC080910E0469
:102E6000882361F0853061F08091E80083FD0AC01D
:102E70008091E80082FFF2CF80E0089582E008951B
:102E800083E0089581E0089520911504309116049F
:102E90002617370748F06115710539F42091E800CD
:102EA0002E772093E80001C0B901FC0120E06115F4
:102EB000710591F180910E04882309F440C085309A
:102EC00009F43FC08091E80083FD3DC08091E80097
:102ED00082FD2FC08091E80080FFE9CF2091F300B0
:102EE0008091F20090E0922B6115710559F08830C5
:102EF000910540F424912093F100319661507109BD
:102F00000196F2CF21E0089709F020E08091E800D7
:102F10008E778093E800CBCF2111CCCF0AC080916F
:102F20000E04882361F0853061F08091E80083FD14
:102F30000AC08091E80082FFF2CF80E0089582E02D
:102F4000089583E0089581E00895982F973058F50B
:102F50009093E900981739F07091EC002091ED0002
:102F60005091F00003C0242F762F50E021FF19C0AC
:102F70003091EB003E7F3093EB003091ED003D7FD0
:102F80003093ED003091EB0031603093EB007093A3
:102F9000EC002093ED005093F0002091EE0027FF0D
:102FA00007C09F5FD3CF8F708093E90081E00895C1
:102FB00080E0089580910F0487FF11C08091E800A0
:102FC00082FD05C080910E048111F8CF11C080915F
:102FD000E8008B770BC080910E04882349F0809124
:102FE000E80080FFF8CF8091E8008E778093E800BA
:102FF00008952091E4003091E50095E64091EC00C1
:10300000842F817040FF22C08091E80080FD1CC0A9
:1030100080910E04882391F0853091F08091EB002F
:1030200085FD10C04091E4005091E5004217530720
:1030300029F39A01915011F784E0089582E00895F0
:1030400083E0089581E0089580E008954091E800CC
:1030500042FFDECF08950E9499180E94A118E0EE69
:10306000F0E0808181608083E8EDF0E080818F77FF
:10307000808319BCA7EDB0E08C918E7F8C9380810A
:103080008F7E808310920D0408950F931F93CF932A
:10309000DF930E9499180E94A118C8EDD0E08881A2
:1030A0008F77888388818068888388818F7D8883F3
:1030B00019BC10920E0410920A0410920C04109283
:1030C0000B0400EE10E0F80180818B7F8083888103
:1030D0008160888342E060E080E00E94A517E1EE15
:1030E000F0E080818E7F8083E2EEF0E0808181607D
:1030F0008083808188608083F80180818E7F8083D7
:10310000888180618883DF91CF911F910F9108950D
:10311000E8EDF0E080818F7E8083E7EDF0E0808154
:103120008160808384E082BF81E080930D040C94F1
:103130004518E8EDF0E080818E7F80831092E200F8
:1031400008951092DA001092E10008951F920F92F4
:103150000FB60F9211242F933F934F935F936F936A
:103160007F938F939F93AF93BF93EF93FF93809140
:10317000E10082FF0BC08091E20082FF07C08091D6
:10318000E1008B7F8093E1000E940D1B8091DA00AB
:1031900080FF1FC08091D80080FF1BC08091DA00A3
:1031A0008E7F8093DA008091D90080FF0DC080E18E
:1031B00089BD82E189BD09B400FEFDCF81E0809325
:1031C0000E040E94111505C019BC10920E040E9435
:1031D0001F158091E10080FF19C08091E20080FFFF
:1031E00015C08091E2008E7F8093E2008091E20022
:1031F00080618093E2008091D80080628093D80043
:1032000019BC85E080930E040E9423158091E10093
:1032100084FF30C08091E20084FF2CC080E189BD32
:1032200082E189BD09B400FEFDCF8091D8008F7D79
:103230008093D8008091E1008F7E8093E10080919F
:10324000E2008F7E8093E2008091E20081608093B3
:10325000E20080910A04882311F084E007C0809185
:10326000E30087FD02C081E001C083E080930E048B
:103270000E9424158091E10083FF29C08091E20023
:1032800083FF25C08091E100877F8093E10082E089
:1032900080930E0410920A048091E1008E7F809347
:1032A000E1008091E2008E7F8093E2008091E20055
:1032B00080618093E20042E060E080E00E94A51718
:1032C0008091F00088608093F0000E942215FF91A9
:1032D000EF91BF91AF919F918F917F916F915F918E
:1032E0004F913F912F910F900FBE0F901F90189507
:1032F0001F920F920FB60F9211242F933F934F936B
:103300005F936F937F938F939F93AF93BF93CF936D
:10331000DF93EF93FF93C091E900CF708091EC00B1
:10332000D82FD17080FDD0E81092E9008091F00094
:10333000877F8093F00078940E94BC191092E90076
:103340008091F00088608093F000CD2BCF70C09307
:10335000E900FF91EF91DF91CF91BF91AF919F91E4
:103360008F917F916F915F914F913F912F910F902E
:103370000FBE0F901F9018951F93CF93DF93CDB77B
:10338000DEB7AA970FB6F894DEBF0FBECDBFEFE051
:10339000F4E088E08E0F9091F10091938E13FBCFB3
:1033A0000E943A158091E80083FF1FC180910F04AD
:1033B00090911004492F50E04A30510508F015C192
:1033C000FA01E857FF4F0C948431803881F082383D
:1033D00009F00BC1809113048F708093E9008091F4
:1033E000EB0085FB882780F91092E90006C08091E8
:1033F0000B0490910C04911182609091E800977FEA
:103400009093E8008093F1001092F100C8C0282F3B
:103410002D7F09F0EAC0882319F0823061F0E5C001
:1034200080911104813009F0E0C0933009F080E010
:1034300080930C042BC080911104811127C08091CE
:1034400013048F7009F4D1C08093E9002091EB0040
:1034500020FF1CC0933021F48091EB00806214C0E7
:103460009091EB0090619093EB0021E030E0A90196
:1034700002C0440F551F8A95E2F74093EA0010926C
:10348000EA008091EB0088608093EB001092E900E5
:103490008091E800877F86C08111A7C01091110438
:1034A0001F778091E3008078812B8093E3008091E7
:1034B000E800877F8093E8000E94DA178091E80097
:1034C00080FFFCCF8091E30080688093E3001111BE
:1034D00002C082E001C083E080930E0486C0805861
:1034E000823008F082C080911104909112048C3DCA
:1034F00053E0950779F583E08A838AE289834FB7A1
:10350000F894DE01139620E03EE051E2E32FF0E074
:1035100050935700E49120FF03C0E295EF703F5FA6
:10352000EF708E2F90E0EA3010F0C79601C0C09681
:103530008D939D932F5F243149F74FBF8091E80011
:10354000877F8093E8006AE270E0CE0101960E94D6
:10355000E11614C0AE014F5F5F4F609113040E94EB
:103560002816BC01009709F440C09091E800977FAD
:103570009093E80089819A810E9444178091E80025
:103580008B778093E80031C0803879F58091E8002E
:10359000877F8093E80080910A048093F1008091F6
:1035A000E8008E778093E8000E94DA171EC0811130
:1035B0001CC0909111049230C0F48091E800877F84
:1035C0008093E80090930A040E94DA1780910A041D
:1035D000811106C08091E30087FD02C081E001C037
:1035E00084E080930E040E9426158091E80083FFFA
:1035F0000AC08091E800877F8093E8008091EB000B
:1036000080628093EB00AA960FB6F894DEBF0FBEDF
:10361000CDBFDF91CF911F9108950895CF938091F1
:103620000E048823A1F0C091E900CF709091EC00C6
:10363000892F817090FD80E8C82B1092E90080915D
:10364000E80083FD0E94BC19CF70C093E900CF91C0
:10365000089590938F0380938E030895E0918E03D5
:10366000F0918F03309721F00190F081E02D0994C3
:1036700080E00895E0918E03F0918F03309721F060
:103680000280F381E02D09940895E0918E03F0917A
:103690008F03309721F00480F581E02D099408957F
:1036A00020918C0330918D038217930771F09093D2
:1036B0008D0380938C03E0918E03F0918F033097FC
:1036C00021F00680F781E02D0994089520918A0366
:1036D00030918B038217930771F090938B03809343
:1036E0008A03E0918E03F0918F03309721F00084DC
:1036F000F185E02D0994089508950C947C1B0E9497
:1037000004280E949A0B0E948A280C94452D4F92FF
:103710005F927F928F929F92AF92BF92CF92DF92F1
:10372000EF92FF920F931F93CF93DF93CDB7DEB746
:103730002A970FB6F894DEBF0FBECDBF0E94890C4A
:1037400091E9C92E93E0D92E00E010E0AA24A394B9
:10375000B12C702E802F0E94D20D4C01F6014190A9
:1037600051906F014826592641145104B1F40F5F5E
:103770001F4F0430110569F78FEF89838A831B82FD
:103780000E940D288160782F9D838C8349815A8106
:103790006B818D810E94401C3AC08091ED0381FDB8
:1037A0000E94DB0D20E030E07501022E02C0EE0C1D
:1037B000FF1C0A94E2F7C70184219521892B09F1A6
:1037C0002E837F828E209F2091E0892809F490E04B
:1037D00098870E940D288160782F9A8789874E816B
:1037E0005F8168858A850E94401C000F111FF801C7
:1037F000EF56FC4F80819181E826F926F182E08224
:1038000006C02F5F3F4F2C30310571F6B0CF0E94BC
:10381000762A109190030E942E1B1817D9F00E944F
:103820002E1B809390032A960FB6F894DEBF0FBE2E
:10383000CDBFDF91CF911F910F91FF90EF90DF905F
:10384000CF90BF90AF909F908F907F905F904F9060
:103850000C94D20A2A960FB6F894DEBF0FBECDBFE5
:10386000DF91CF911F910F91FF90EF90DF90CF905C
:10387000BF90AF909F908F907F905F904F900895F2
:10388000CF93DF93CDB7DEB72B970FB6F894DEBF9B
:103890000FBECDBF4F83588769877A878B87DE013C
:1038A000119686E0FD0111928A95E9F785E0FE0107
:1038B000379601900D928A95E1F749815A816B8183
:1038C0007C818D819E810E94E5232B960FB6F89412
:1038D000DEBF0FBECDBFDF91CF910895CF93882378
:1038E00009F4C2C0C82F823859F40E942E1B81FDF2
:1038F000BBC089E30E948E260E945B2789E30CC02F
:10390000833879F40E942E1B80FDAEC083E50E94AF
:103910008E260E945B2783E50E94D026CF910C94CF
:103920005B27843859F40E942E1B82FD9DC087E4DA
:103930000E948E260E945B2787E4EECF8CEF8C0FCF
:10394000813A48F48C2F0E94AD2C81118DC08C2FB0
:103950000E948E26E3CF80E28C0F883048F4C77037
:1039600081E001C0880FCA95EAF70E941427D6CFDC
:103970008BE58C0F833078F4C53A29F0C63A31F0E4
:1039800083E890E005C081E890E002C082E890E022
:10399000CF910C94501B88E58C0F833108F064C0E4
:1039A000C83A39F1C93A41F1CA3A49F1CB3A51F131
:1039B000CC3A59F1CD3A61F1C03B69F1CE3A71F19F
:1039C000CF3A79F1C13B81F1C23B89F1C33B91F11F
:1039D000C43B99F1C53BA1F1C63BA9F1C73BB1F18D
:1039E000C83BB9F1C93BC1F1CA3BC9F180E090E0E5
:1039F00038C082EE90E035C089EE90E032C08AEEA9
:103A000090E02FC085EB90E02CC086EB90E029C0C1
:103A100087EB90E026C08CEC90E023C08DEC90E02A
:103A200020C083E891E01DC08AE891E01AC082E9D5
:103A300091E017C084E991E014C081E292E011C0E6
:103A400083E292E00EC084E292E00BC085E292E055
:103A500008C086E292E005C087E292E002C08AE2F6
:103A600092E0CF910C94661BCF910895882309F4BE
:103A70004BC0823859F40E942E1B81FF45C089E358
:103A80000E948E260E945B2789E30CC0833871F464
:103A90000E942E1B80FF38C083E50E948E260E9464
:103AA0005B2783E50E94D0260C945B27843859F469
:103AB0000E942E1B82FF28C087E40E948E260E944F
:103AC0005B2787E4EFCF9CEF980F913A58F390E291
:103AD000980F983050F4877091E001C0990F8A9543
:103AE000EAF7892F0E941A27DFCF9BE5980F9330C2
:103AF00020F480E090E00C94501B885A833120F42D
:103B000080E090E00C94661B0895882321F00E94C9
:103B100014270C945B270895882321F00E941A270C
:103B20000C945B270895BF92CF92DF92EF92FF92A1
:103B30000F931F93CF93DF9300D000D000D0CDB769
:103B4000DEB725E0FC01DE01119601900D922A9569
:103B5000E1F7FC01D08011810281258122952F702F
:103B600043815481452B09F472C31F3F21F4FFEFB9
:103B7000DF1609F46CC37C012E830E949B07D98257
:103B80001A8369817A81802F0E948A26182FB92E84
:103B90000E943F260E9406252E81002319F00E94D4
:103BA00031272E81EB2DE295EF70F0E0EE56FF4FBE
:103BB0000C9484318B2D807F9B2D9F70F92E882350
:103BC00019F0F29480EFF822002389F0FF2009F425
:103BD0007CC280E2810F883020F48F2D0E94142750
:103BE00003C08F2D0E9424270E945B276EC2812F65
:103BF0000E94361DFF2009F42AC3105E8F2D183055
:103C000018F40E941A2702C00E942A2726960FB68F
:103C1000F894DEBF0FBECDBFDF91CF911F910F9102
:103C2000FF90EF90DF90CF90BF900C945B278B2D8F
:103C3000807F9B2D9F70803211F4892F03C0892FC4
:103C40008295807F112319F0113011F12BC00023D0
:103C5000A9F0222389F1213079F526960FB6F89440
:103C6000DEBF0FBECDBFDF91CF911F910F91FF90AF
:103C7000EF90DF90CF90BF900C944427222319F04F
:103C8000213009F4E4C28E830E9447278E819BC1B4
:103C9000002321F0263008F0DAC20EC0253008F0EB
:103CA000D6C291C10023C9F0222331F0F7019581DA
:103CB00090FF0BC29F70958326960FB6F894DEBFD7
:103CC0000FBECDBFDF91CF911F910F91FF90EF906D
:103CD000DF90CF90BF900C94851D222309F473C10F
:103CE00009C22B2D26952695237030E0211531052C
:103CF00021F021303105D1F0AAC2002321F0812F1B
:103D00009B2D937002C080E090E026960FB6F89449
:103D1000DEBF0FBECDBFDF91CF911F910F91FF90FE
:103D2000EF90DF90CF90BF900C94501B002321F0B8
:103D3000812F9B2D937002C080E090E026960FB6F5
:103D4000F894DEBF0FBECDBFDF91CF911F910F91D1
:103D5000FF90EF90DF90CF90BF900C94661B812F67
:103D6000002319F00E947E2902C00E94E6292696AF
:103D70000FB6F894DEBF0FBECDBFDF91CF911F917C
:103D80000F91FF90EF90DF90CF90BF900C946B2A33
:103D90008B2D837009F07BC0011159C2812F829550
:103DA00086958770880F880F912F9F70C92ED12C10
:103DB000E12CF12C082E04C0CC0CDD1CEE1CFF1CE9
:103DC0000A94D2F714FF12C04FE050E060E070E0B8
:103DD00004C0440F551F661F771F8A95D2F7CB0189
:103DE000BA01609570958095909503C060E070E091
:103DF000CB012B2D269526952370422F50E0423083
:103E00005105D9F04330510569F16C297D298E297E
:103E10009F294130510551F126960FB6F894DEBF27
:103E20000FBECDBFDF91CF911F910F91FF90EF900B
:103E3000DF90CF90BF900C942D256C297D298E2981
:103E40009F2926960FB6F894DEBF0FBECDBFDF9137
:103E5000CF911F910F91FF90EF90DF90CF90BF9087
:103E60000C9449250E942D25C701B60126960FB650
:103E7000F894DEBF0FBECDBFDF91CF911F910F91A0
:103E8000FF90EF90DF90CF90BF900C94112500230E
:103E900019F08B2D817001C08695882309F4D7C154
:103EA000812F829586958770880F880F912F9F703C
:103EB000C92ED12CE12CF12C082E04C0CC0CDD1C19
:103EC000EE1CFF1C0A94D2F714FF12C04FE050E022
:103ED00060E070E004C0440F551F661F771F8A958D
:103EE000D2F7CB01BA01609570958095909503C08B
:103EF00060E070E0CB012B2D269526952370422F94
:103F000050E042305105D9F04330510569F16C2938
:103F10007D298E299F294130510551F126960FB6F2
:103F2000F894DEBF0FBECDBFDF91CF911F910F91EF
:103F3000FF90EF90DF90CF90BF900C9407266C29F4
:103F40007D298E299F2926960FB6F894DEBF0FBED5
:103F5000CDBFDF91CF911F910F91FF90EF90DF9038
:103F6000CF90BF900C9423260E940726C701B6016C
:103F700026960FB6F894DEBF0FBECDBFDF91CF916E
:103F80001F910F91FF90EF90DF90CF90BF900C9416
:103F9000EB25103F49F118F4103E48F491C0123F50
:103FA00009F453C0E8F1133F09F464C089C01F70DD
:103FB0008B2D8F71002321F00E948425812F7CCED0
:103FC0000E94A525812F26960FB6F894DEBF0FBE5E
:103FD000CDBFDF91CF911F910F91FF90EF90DF90B8
:103FE000CF90BF900C948C1D0023B1F0253008F0C9
:103FF0002EC18B2D8F7126960FB6F894DEBF0FBEA3
:10400000CDBFDF91CF911F910F91FF90EF90DF9087
:10401000CF90BF900C94CA25263008F018C1E9CF84
:104020000023A9F08B2D8F7126960FB6F894DEBF72
:104030000FBECDBFDF91CF911F910F91FF90EF90F9
:10404000DF90CF90BF900C948425002359F38B2DE3
:104050008F7126960FB6F894DEBF0FBECDBFDF91ED
:10406000CF911F910F91FF90EF90DF90CF90BF9075
:104070000C94A525002399F08B2D8F7126960FB6F1
:10408000F894DEBF0FBECDBFDF91CF911F910F918E
:10409000FF90EF90DF90CF90BF900C946F25269605
:1040A0000FB6F894DEBF0FBECDBFDF91CF911F9149
:1040B0000F91FF90EF90DF90CF90BF900C9465250B
:1040C0000023A9F0222309F4ADCF812F26960FB645
:1040D000F894DEBF0FBECDBFDF91CF911F910F913E
:1040E000FF90EF90DF90CF90BF900C946E1C222336
:1040F00009F4ADCF812F26960FB6F894DEBF0FBE20
:10410000CDBFDF91CF911F910F91FF90EF90DF9086
:10411000CF90BF900C94361D4B2D4F70612FC7016F
:104120000E948D0526960FB6F894DEBF0FBECDBF58
:10413000DF91CF911F910F91FF90EF90DF90CF9083
:10414000BF900C948924011182C09B2D9F70492F30
:1041500050E04230510509F443C0C4F44115510503
:1041600071F14130510509F072C026960FB6F894EE
:10417000DEBF0FBECDBFDF91CF911F910F91FF909A
:10418000EF90DF90CF90BF900C946D2D4330510590
:10419000C1F14430510509F05AC0812F26960FB65F
:1041A000F894DEBF0FBECDBFDF91CF911F910F916D
:1041B000FF90EF90DF90CF90BF900C94BF2D26968C
:1041C0000FB6F894DEBF0FBECDBFDF91CF911F9128
:1041D0000F91FF90EF90DF90CF90BF900C94562DF1
:1041E00026960FB6F894DEBF0FBECDBFDF91CF91FC
:1041F0001F910F91FF90EF90DF90CF90BF900C94A4
:10420000892D26960FB6F894DEBF0FBECDBFDF9185
:10421000CF911F910F91FF90EF90DF90CF90BF90C3
:104220000C949C2D4B2D4F70612FC70126960FB615
:10423000F894DEBF0FBECDBFDF91CF911F910F91DC
:10424000FF90EF90DF90CF90BF900C949D07269643
:104250000FB6F894DEBF0FBECDBFDF91CF911F9197
:104260000F91FF90EF90DF90CF90BF9008950E9444
:1042700031270E9441270E9406270E945B270E9447
:104280001C2B0E946B2A80E090E00E94501B80E073
:1042900090E00C94661B0E9421270C9437210E9409
:1042A0007F26292F22952F7030E02C3031054CF4D9
:1042B0002A3031056CF4225031092230310588F45E
:1042C00007C02C30310549F02F30310531F009C0DD
:1042D000803E48F0803F29F406C093FB882780F990
:1042E000089580E0089581E00895CF93DF9300D092
:1042F00000D01F92CDB7DEB70F900F900F900F90A8
:104300000F90DF91CF910895CF93DF9300D000D02D
:1043100000D0CDB7DEB726960FB6F894DEBF0FBE3D
:10432000CDBFDF91CF9108951F93CF93DF93C091BD
:10433000990316E080919A03C81799F0D0E01C9F6A
:10434000F0011D9FF00D1124E556FC4F4081518175
:1043500062817381848195810E9484212196C77036
:10436000E9CFDF91CF911F9108954091CB035091F8
:10437000CC036091CD037091CE038091CF039091D7
:10438000D0030C9484218091D00382958F7009F022
:1043900054C08091CD03882309F44FC080919903C4
:1043A000A0919A036091CB037091CC034091CE030E
:1043B0005091CF03B6E08A1709F43FC090E0411551
:1043C0005105C1F17F3F11F46F3FA1F1B89FF0019A
:1043D000B99FF00D1124E556FC4F218172132AC0BC
:1043E0002081621327C02281211124C023813481BE
:1043F0002417350710F421503109241B350B283CB4
:104400003105C0F42091D0032F7020612093D00398
:1044100026E0289FF001299FF00D1124E056FC4F63
:1044200080818F70806180838BEC93E00E94931D6C
:104430000C94942101968770BECF0895CF92DF929D
:10444000EF92FF920F931F93CF93DF93CDB7DEB719
:1044500062970FB6F894DEBF0FBECDBF8C0185E02A
:10446000F801DE011D9601900D928A95E1F7D801C1
:104470004C9111965C91119712966C91129713962C
:10448000CD90DC9014973091CB037091CC03809148
:10449000CE039091CF03009709F46BC17F3F19F4CD
:1044A0003F3F09F466C1E090CD03EE2009F4C0C09F
:1044B0002091D003C816D90628F0F601E81BF90BA5
:1044C000CF0104C0809590958C0D9D1DFF24F39421
:1044D000883C910578F0F12C207F09F0C6C07C2D36
:1044E000D98AC88A89890E9475218BEC93E00E9441
:1044F000931DB1C0822F807F09F046C0751314C090
:10450000341312C0611110C02F7020612093D003AA
:104510000E94B5218BEC93E00E94931D8091D00303
:10452000D80115968C932EC0CD2819F15F3F11F458
:104530004F3FF9F0F62E61111CC080919903209134
:104540009A0336E0821709F45AC090E0389FF001D0
:10455000399FF00D1124E556FC4F7181571306C0A9
:104560007081471303C07281711103C00196877077
:10457000E9CFF62E662309F418C18091D00381603B
:104580008093D003F12C11C1751308C0341306C0F9
:10459000611104C08091D003D801C3C04D875E87EC
:1045A0008D859E856A8B0E944F216A898823E1F15F
:1045B0006623D1F12091D003822F82958F7090E0F5
:1045C000029774F08091CB039091CC0398878F83EE
:1045D0001986DB86CA862C87CE0107960E94931D1A
:1045E00086E0F801ABECB3E001900D928A95E1F71B
:1045F0000E94C3210E94B521FF24F394D6C04D87A9
:104600005E878D859E850E947F26292F22952F709B
:1046100030E0223031050CF0BCC09F7009F0B6C00C
:10462000805E883008F4C1C0C8010E94931DE4CFA9
:10463000C816D90608F453C0F601E81BF90BCF01E0
:10464000883C910508F450C0F12C7C2DD98AC88A89
:1046500089890E947521EBECF3E086E0DF011D9271
:104660008A95E9F70E94B521A0C0751314C03413D0
:1046700012C0611110C08091D003F8018583C80178
:104680000E94931D86E0EBECF3E0DF011D928A951A
:10469000E9F7FE2C8AC04D875E878D859E856A8BE3
:1046A0000E944F216A89882309F4BECF662309F44A
:1046B000BBCF2091D003822F82958F7090E002971C
:1046C0000CF48ECF8091CB039091CC039A83898395
:1046D0001B82DD82CC822E83CE0101967FCF809516
:1046E00090958C0D9D1DACCFF62E662309F49CCFC2
:1046F00075132EC034132CC02091D00320FD1FC091
:10470000822F82958F70D9F0D80115962C9315972A
:104710008F3049F08F5F982F9295907F822F8F7006
:10472000892B15968C93C8010E94931D86E0F80191
:10473000ABECB3E001900D928A95E1F793CF86E060
:10474000F801ABECB3E001900D928A95E1F72DC032
:104750004D875E878D859E850E944F21811140CFB8
:104760008091D00381608093D003C8010E94931D83
:104770001CC0662309F458CF4D875E878D859E85C2
:104780000E944F21882309F44FCF2ACF811148CFAF
:104790000CC0243031050CF047CF9F7009F440CF96
:1047A000F8019581907F09F03BCF8F2D62960FB66F
:1047B000F894DEBF0FBECDBFDF91CF911F910F9157
:1047C000FF90EF90DF90CF9008951F93CF93DF93EA
:1047D000CDB7DEB72C970FB6F894DEBF0FBECDBFB6
:1047E0004F83588769877A878B879C87CE01079686
:1047F0000E941E22882369F08F8198852A853B8537
:10480000232BF1F19F3F09F063C08F3F09F060C097
:1048100037C086E0FE013796DE01119601900D92B9
:104820008A95E1F76F817885EA85FB85309741F1BC
:104830007F3F11F46F3F21F120919A0330E0C901CD
:104840000196877099274091990350E08417950746
:1048500009F447C069837A83FD83EC8396E0929FD5
:10486000D001939FB00D1124A556BC4FFE01319687
:1048700001900D929A95E1F780939A030E949421FA
:1048800016E08091990390919A038917C1F1189FBE
:10489000C001112485569C4F0E941E22882379F165
:1048A000E09199031E9FF0011124E556FC4F4081D1
:1048B000518162817381848195810E9484218091DC
:1048C000990390E001968770992780939903D9CF37
:1048D0004F81588569857A858B859C850E948421C6
:1048E000CFCF0E944B2110929A0310929903EBECC8
:1048F000F3E086E0DF011D928A95E9F7C1CF2C969F
:104900000FB6F894DEBF0FBECDBFDF91CF911F91E0
:104910000895EF92FF920F931F93CF93DF938C0133
:10492000009709F46CC0F12CEE24E394E801219681
:10493000F8018491843740F4843008F051C081300C
:1049400081F0823019F15BC0853709F444C0A8F1C9
:104950009CE7980F903708F052C08F770E94361D61
:1049600041C00E5F1F4FFE01C49180E28C0F883062
:1049700048F4C7708E2D01C0880FCA95EAF70E94CF
:10498000342714C08C2F0E946E1C2DC00E5F1F4F49
:10499000FE01C49180E28C0F883058F4C7708E2DD0
:1049A00001C0880FCA95EAF70E943A270E945B2748
:1049B0001AC08C2F0E94361D16C00E5F1F4FFE01BD
:1049C000C491CC2381F08FE99FE00197F1F700C0FB
:1049D0000000C150F6CF0E5F1F4FFE01F49003C0E0
:1049E0000E946E1C8E018F2D882309F49FCFEFE962
:1049F000FFE03197F1F700C000008150F5CFDF9163
:104A0000CF911F910F91FF90EF90089508956093BB
:104A1000D5037093D6038093D7039093D8030C9457
:104A200037210F931F930091D5031091D603209146
:104A3000D7033091D803DC01CB01802B912BA22B23
:104A4000B32B8093D5039093D603A093D703B09351
:104A5000D8031F910F910C9437210F931F9300914E
:104A6000D5031091D6032091D7033091D803DC01F0
:104A7000CB0180239123A223B3238093D50390936A
:104A8000D603A093D703B093D8031F910F910C9432
:104A900037210F931F930091D5031091D6032091D6
:104AA000D7033091D803DC01CB0180279127A227BF
:104AB000B3278093D5039093D603A093D703B093E5
:104AC000D8031F910F910C9437211092D1031092AB
:104AD000D2031092D3031092D4030C94372141E0F7
:104AE00050E060E070E004C0440F551F661F771F60
:104AF0008A95D2F74093D1035093D2036093D303A6
:104B00007093D4030C94372141E050E060E070E0F2
:104B100004C0440F551F661F771F8A95D2F78091F6
:104B2000D1039091D203A091D303B091D403482B29
:104B3000592B6A2B7B2B4093D1035093D203609364
:104B4000D3037093D4030C94372141E050E060E02C
:104B500070E004C0440F551F661F771F8A95D2F777
:104B600040955095609570958091D1039091D203B6
:104B7000A091D303B091D403482359236A237B2304
:104B80004093D1035093D2036093D3037093D40323
:104B90000C94372141E050E060E070E004C0440F25
:104BA000551F661F771F8A95D2F78091D103909188
:104BB000D203A091D303B091D403482759276A2781
:104BC0007B274093D1035093D2036093D303709318
:104BD000D4030C9437210F931F930091D1031091AC
:104BE000D2032091D3033091D403DC01CB01802B7D
:104BF000912BA22BB32B8093D1039093D203A0933C
:104C0000D303B093D4031F910F910C9437210F93CA
:104C10001F930091D1031091D2032091D3033091BF
:104C2000D403DC01CB0180239123A223B3238093FF
:104C3000D1039093D203A093D303B093D4031F91D5
:104C40000F910C9437210F931F930091D103109172
:104C5000D2032091D3033091D403DC01CB01802710
:104C60009127A227B3278093D1039093D203A093D7
:104C7000D303B093D4031F910F910C94372108955F
:104C8000CF92DF92EF92FF920F931F93CF93DF9318
:104C90008C01C090D503D090D603E090D703F0905C
:104CA000D8038091D1039091D203A091D303B09106
:104CB000D403C82AD92AEA2AFB2ACFE1D0E0D701B7
:104CC000C6010C2E04C0B695A795979587950A94B2
:104CD000D2F780FF06C0B8018C2F0E94F709019718
:104CE00021F4219760F780E001C08C2FDF91CF91F4
:104CF0001F910F91FF90EF90DF90CF900895CF9389
:104D0000DF93EC010E944026BE010E94F709DF916B
:104D1000CF910895CB010E947F260895909186023D
:104D2000992321F090918702911109C02091880266
:104D300030918902F90132969FEF40E01FC0982F11
:104D40009695969596959F3050F5E0918802F09152
:104D50008902E90FF11D877021E030E0A90102C04E
:104D6000440F551F8A95E2F7CA019181892B8183EF
:104D700008959F3F39F04F5F4E3041F051915813E5
:104D8000F8CF0DC05111F7CF942FF5CF9F3F39F0D9
:104D9000F901E90FF11D97FDFA95828308950895B1
:104DA00090918602992321F090918702911109C078
:104DB0002091880230918902F9013296205F3F4F9D
:104DC0001FC0982F9695969596959F30F0F4E09198
:104DD0008802F0918902E90FF11D877021E030E02F
:104DE000A90102C0440F551F8A95E2F7CA018095B8
:104DF00091818923818308953196E217F30729F081
:104E000090819813F9CF1082F7CF089581E090E058
:104E1000E0918802F0918902E80FF91F1082019653
:104E200080319105A9F708959091EC03892B809327
:104E3000EC03089580959091EC0389238093EC0313
:104E400008951092EC0308959091EB03892B8093C1
:104E5000EB03089580959091EB0389238093EB03F6
:104E600008951092EB0308959091EA03892B8093A3
:104E7000EA03089580959091EA0389238093EA03D9
:104E800008951092EA0308958093D903089510922B
:104E9000D90308958091880290918902FC0131968E
:104EA0009C01205F3F4F80E0919191118F5FE2174D
:104EB000F307D1F70895E0918802F091890280917B
:104EC000EC038083E0918802F091890290818091C7
:104ED000EB03892B8083E0918802F0918902908115
:104EE0008091EA03892B80838091D903882361F024
:104EF000E0918802F09189029081892B80830E9441
:104F00004A2781111092D9038091880290918902D9
:104F10000C943A1B80910E04843039F11092EE0308
:104F200020E488E190E00FB6F894A89580936000A3
:104F30000FBE2093600080E00E94540580E00E9434
:104F4000D20A83B7817F846083BF83B7816083BFC8
:104F50007894889583B78E7F83BF88E10FB6F894E5
:104F600080936000109260000FBE08950895089528
:104F7000CF9380E00E9454050E94B6270E94890CBE
:104F80000E94B727C0E08C2F0E94D20D892B29F4F4
:104F9000CF5FC430C1F780E001C081E0CF910895B8
:104FA0000E944B2180E00E9454050E94452D0E94E2
:104FB0002E1B0C94D20A1F920F920FB60F9211243F
:104FC0008F939F93AF93BF938091EE03811113C092
:104FD0008091EF039091F003A091F103B091F2035F
:104FE0004196A11DB11D8093EF039093F003A09310
:104FF000F103B093F203BF91AF919F918F910F9006
:105000000FBE0F901F90189582E084BD93E095BD70
:105010009AEF97BD80936E0008952FB7F894809112
:10502000EF039091F003A091F103B091F2032FBF31
:105030000895CF92DF92EF92FF920F931F932FB7B5
:10504000F8944091EF035091F0036091F103709157
:10505000F2032FBF6A017B01EE24FF248C0120E0C4
:1050600030E0C016D106E206F30610F441505109B3
:105070009A01281B390BC9011F910F91FF90EF90E6
:10508000DF90CF9008951F920F920FB60F921124C8
:105090008F939F93AF93BF938091EF039091F00311
:1050A000A091F103B091F2030196A11DB11D80936F
:1050B000EF039093F003A093F103B093F203BF9139
:1050C000AF919F918F910F900FBE0F901F901895E9
:1050D0000E942B18F8942FEF87EA91E62150804028
:1050E0009040E1F700C0000087E090EBDC01809386
:1050F000190490931A04A0931B04B0931C049CE021
:1051000088E10FB6F894A895809360000FBE909345
:105110006000FFCF0E94C928811102C00E94A5280B
:105120000E94D4288093ED030E94E1288093170405
:1051300087FB882780F9809387020E94D828682FF0
:1051400070E080E090E00C9407256DEE7EEF80E04B
:1051500090E00E94AA3160E082E090E00E949831E5
:1051600060E083E090E00E94983160E084E090E0AD
:105170000E94983160E085E090E00E94983160E004
:1051800086E090E00E9498316FEF87E090E00C9409
:10519000983180E090E00E94923121E08D3E9E4F58
:1051A00009F020E0822F089582E090E00C948A318B
:1051B00083E090E00C948A31682F83E090E00C94B7
:1051C000983184E090E00C948A31682F84E090E07C
:1051D0000C94983186E090E00C948A31682F86E038
:1051E00090E00C94983187E090E00C948A31682F1D
:1051F00087E090E00C9498318091F50380FF0BC01C
:1052000060918D0285E0689FB001112475956795C6
:10521000759567952BC081FF09C060918D0285E06F
:10522000689FB00111247595679520C082FF07C063
:1052300060918D0285E0689FB001112417C09091A4
:10524000F6039923D1F060918C02961788F720918C
:105250008D0285E0289F90011124929FA001939FC9
:10526000500D112470E0CA010E9470316038710540
:1052700040F46115710539F002C065E070E0862FD9
:1052800008958FE7089581E008958091F50380FFE8
:1052900008C060918B0270E075956795759567956C
:1052A00021C081FF06C060918B0270E07595679503
:1052B00019C082FF04C060918B0270E010C0909111
:1052C000F6039923C1F060918A029617A0F78091A6
:1052D0008B02899FC001112470E00E9470316038F8
:1052E000710528F46115710521F0862F08958FE767
:1052F000089581E0089561E070E0F4CF803F21F4EB
:105300000E94FC28819504C0813F29F40E94FC285A
:105310008093F9030895823F21F40E94FC2881952F
:1053200004C0833F29F40E94FC288093F803089569
:10533000893F19F40E94452905C08A3F31F40E9433
:10534000452981958093FA0308958B3F21F40E94AB
:105350004529819504C08C3F29F40E9445298093FA
:10536000FB030895843F21F48091F703816017C007
:10537000853F21F48091F703826011C0863F21F4BC
:105380008091F70384600BC0873F21F48091F7037D
:10539000886005C0883F31F48091F7038061809375
:1053A000F70308958D3F21F48091F50381600BC0D0
:1053B0008E3F21F48091F503826005C08F3F29F470
:1053C0008091F50384608093F5030895803F39F45C
:1053D0008091F90387FF6CC01092F90369C0813F87
:1053E00029F48091F9031816BCF362C09091F80378
:1053F000823F29F497FF5CC01092F80359C0833FA5
:1054000019F41916CCF354C0893F41F48091FA0382
:1054100018160CF04DC01092FA034AC08A3F29F4C6
:105420008091FA0387FF44C0F6CF8B3F39F4809117
:10543000FB0387FF3DC01092FB033AC08C3F29F469
:105440008091FB031816BCF333C0843F21F4809194
:10545000F7038E7F17C0853F21F48091F7038D7F7E
:1054600011C0863F21F48091F7038B7F0BC0873FEB
:1054700021F48091F703877F05C0883F31F4809144
:10548000F7038F7E8093F70313C08D3F21F4809143
:10549000F5038E7F0BC08E3F21F48091F5038D7F45
:1054A00005C08F3F29F48091F5038B7F8093F5032E
:1054B0008091F80381110EC08091F90381110AC017
:1054C0008091FA03811106C08091FB03811102C013
:1054D0001092F603089587EF93E00E94451B0E9407
:1054E0000D289093F4038093F30308951F93CF93B3
:1054F000DF938091F3039091F4030E941928AC018B
:105500009091F603992321F020918E0230E006C09D
:1055100020918F028AE0289F90011124421753079F
:1055200008F486C08091F803C091F903D091FA0382
:105530001091FB03811107C0C11176C0D11174C055
:10554000111172C075C09F3F19F09F5F9093F603D1
:10555000181624F40E94FC288093F8038091F80325
:1055600087FF05C00E94FC2881958093F8031C16D4
:1055700024F40E94FC288093F9038091F90387FFAB
:1055800005C00E94FC2881958093F9036091F8037F
:10559000662339F1C091F903CC2319F1772767FD10
:1055A0007095872F972F0E94E02E23E333E343E388
:1055B0005FE30E94942F0E94AD2E6093F8036C2F3E
:1055C000772767FD7095872F972F0E94E02E23E3A2
:1055D00033E343E35FE30E94942F0E94AD2E609378
:1055E000F9031D1624F40E9445298093FA03809143
:1055F000FA0387FF05C00E94452981958093FA032D
:10560000111624F40E9445298093FB038091FB032B
:1056100087FF05C00E94452981958093FB03DF9198
:10562000CF911F910C946B2A9F3F09F08ECF96CF9C
:10563000DF91CF911F910895E7EFF3E085E0DF015F
:105640001D928A95E9F71092F6031092F5030895DA
:10565000833081F128F4813059F08230D1F00895FF
:10566000853009F449C0B8F1863009F456C0089570
:1056700080918F02262F30E0280F311D2F3F3105FA
:1056800024F4680F60938F0208958FEF80938F0248
:10569000089580918E02262F30E0280F311D2F3F74
:1056A000310524F4680F60938E0208958FEF809384
:1056B0008E02089580918D02262F30E0280F311D33
:1056C0002F3F310524F4680F60938D0208958FEF0A
:1056D00080938D02089580918C02262F30E0280F50
:1056E000311D2F3F310524F4680F60938C0208951B
:1056F0008FEF80938C02089580918B02262F30E0EB
:10570000280F311D2F3F310524F4680F60938B0261
:1057100008958FEF80938B02089580918A02262F3F
:1057200030E0280F311D2F3F310524F4680F6093BE
:105730008A0208958FEF80938A020895833011F1D1
:1057400028F4813049F0823091F00895853081F15C
:1057500020F18630C1F1089580918F02681720F4FE
:10576000861B80938F02089510928F020895809176
:105770008E02681720F4861B80938E020895109283
:105780008E02089580918D02681720F4861B809305
:105790008D02089510928D02089580918C026817F1
:1057A00020F4861B80938C02089510928C02089539
:1057B00080918B02681720F4861B80938B020895DA
:1057C00010928B02089580918A02681720F4861B3C
:1057D00080938A02089510928A0208950F931F936E
:1057E000873208F048C08E3108F094C0803109F447
:1057F0007EC008F5873009F468C068F4863009F087
:10580000A4C08091ED03817F8E7F8093ED0381E0C2
:105810008093FD039BC08B3009F490C08E3009F05B
:1058200094C08091ED0382FB222720F991E092271A
:1058300090FB82F965C0863109F480C060F4813143
:1058400009F083C00E944B219091870281E0892753
:105850008093870273C0893109F470C08B3109F0DD
:1058600074C08091ED0381FB222720F991E09227FB
:1058700090FB81F945C0883309F460C050F4893247
:1058800009F45EC0853309F45BC0873209F458C05F
:105890005CC0833409F454C028F48A3308F455C03A
:1058A000895339C0883409F050C00E944B210E94AE
:1058B00090060FEF13ED20E3015010402040E1F778
:1058C00000C000000E94682839C09091ED03892F24
:1058D0008095817080FB90F929F096609860909394
:1058E000ED0334C0997F977F9093ED0327C080919B
:1058F000ED0383FB222720F991E0922790FB83F9A7
:105900008093ED039923D1F08091ED038160809322
:10591000ED0314C08D5141E050E060E070E08A0179
:105920009B0104C0000F111F221F331F8A95D2F75D
:10593000C901B8010E9407250E944B2181E006C0E1
:1059400061E070E080E090E0F5CF80E01F910F9182
:10595000089580E0089580E00895CF93C82F809146
:10596000FD03813069F018F08230C9F184C0E09104
:105970008802F09189028081823209F07EC007C0DE
:10598000E0918802F09189028081823261F48C2F4B
:105990000E94A92C811104C08C2F0E94EE2B1DC0E7
:1059A00081E090E01AC08C2F0E94AB2C811114C0B2
:1059B000C43179F048F4CB3079F0C03109F061C0DE
:1059C00082E08093FD0308C0C93219F0C83321F08A
:1059D00058C01092FD0355C081E0817054C0C93297
:1059E00091F120F5C43179F1B0F4C73009F047C026
:1059F0008EE180938F0282E380938E028AE080930F
:105A00008D0284E180938C0288E080938B0288E28F
:105A100080938A0234C0CE51C63088F5EC2FF0E076
:105A2000E65FFC4F80818093FC0329C0CE34E9F00F
:105A300020F4CB3421F56AE013C0C13579F0C235CA
:105A4000F1F461E00DC08091FC03882319F01092FD
:105A5000FC0315C081E08093FD0315C061E006C022
:105A60008091FC030E94282B0AC06AE08091FC030D
:105A70000E949E2B04C01092FD0380E004C081E0D0
:105A800002C080E0AACFCF9108950E94C928811159
:105A900002C00E94A5280E94EA288093180480FF73
:105AA00002C0869501C080E00C94540580911804D2
:105AB000982F9695292F30E0233031054CF49F5FC5
:105AC000990F8170892B8160809318040E94EE28C1
:105AD0008091180486950C94540580911804982F91
:105AE000969591F09158990F8170892B80931804A5
:105AF0008E7F91E009F490E08091180490FB80F98A
:105B0000809318040E94EE288091180486950C94C6
:105B1000540580911804982F909590FB80F98093FC
:105B200018040E94EE288091180480FF02C0869518
:105B300001C080E00C94540590911804892F86953B
:105B40008F5F8F779170843028F4880F892B809332
:105B5000180402C090931804809118048E7F91E07D
:105B600009F490E08091180490FB80F98093180468
:105B70000E94EE288091180486950C94540520917B
:105B80001804922F96958927982F990F822F81704C
:105B9000892B809318048E7F91E009F490E0809126
:105BA000180490FB80F9809318040E94EE288091DD
:105BB000180486950C9454055058BB27AA270ED07C
:105BC00075C166D130F06BD120F031F49F3F11F4F4
:105BD0001EF45BC10EF4E095E7FB51C1E92F77D1CC
:105BE00080F3BA17620773078407950718F071F4FA
:105BF0009EF58FC10EF4E0950B2EBA2FA02D0B0150
:105C0000B90190010C01CA01A0011124FF27591B01
:105C100099F0593F50F4503E68F11A16F040A22F07
:105C2000232F342F4427585FF3CF46953795279578
:105C3000A795F0405395C9F77EF41F16BA0B620B77
:105C4000730B840BBAF09150A1F0FF0FBB1F661FBE
:105C5000771F881FC2F70EC0BA0F621F731F841F01
:105C600048F4879577956795B795F7959E3F08F027
:105C7000B3CF9395880F08F09927EE0F97958795E6
:105C80000895D9D008F481E008950CD00FC107D150
:105C900040F0FED030F021F45F3F19F0F0C0511118
:105CA00039C1F3C014D198F39923C9F35523B1F343
:105CB000951B550BBB27AA2762177307840738F07B
:105CC0009F5F5F4F220F331F441FAA1FA9F333D0DA
:105CD0000E2E3AF0E0E830D091505040E695001C8E
:105CE000CAF729D0FE2F27D0660F771F881FBB1F4A
:105CF000261737074807AB07B0E809F0BB0B802D24
:105D0000BF01FF2793585F4F2AF09E3F510568F06F
:105D1000B6C000C15F3FECF3983EDCF38695779503
:105D20006795B795F7959F5FC9F7880F911D969571
:105D3000879597F90895E1E0660F771F881FBB1FCD
:105D4000621773078407BA0720F0621B730B840B7A
:105D5000BA0BEE1F88F7E095089504D06894B1114E
:105D6000D9C00895BCD088F09F5790F0B92F9927DB
:105D7000B751A0F0D1F0660F771F881F991F1AF056
:105D8000BA95C9F712C0B13081F0C3D0B1E008951F
:105D9000C0C0672F782F8827B85F39F0B93FCCF3A0
:105DA000869577956795B395D9F73EF4909580954C
:105DB000709561957F4F8F4F9F4F0895E89409C06C
:105DC00097FB3EF490958095709561957F4F8F4F2E
:105DD0009F4F9923A9F0F92F96E9BB279395F69544
:105DE000879577956795B795F111F8CFFAF4BB0FC2
:105DF00011F460FF1BC06F5F7F4F8F4F9F4F16C026
:105E0000882311F096E911C0772321F09EE8872FAF
:105E1000762F05C0662371F096E8862F70E060E06B
:105E20002AF09A95660F771F881FDAF7880F9695E4
:105E3000879597F90895990F0008550FAA0BE0E888
:105E4000FEEF16161706E807F907C0F0121613063C
:105E5000E407F50798F0621B730B840B950B39F47C
:105E60000A2661F0232B242B252B21F408950A26E2
:105E700009F4A140A6958FEF811D811D089597F922
:105E80009F6780E870E060E008959FEF80EC0895E0
:105E900000240A9416161706180609060895002409
:105EA0000A9412161306140605060895092E039483
:105EB000000C11F4882352F0BB0F40F4BF2B11F4F7
:105EC00060FF04C06F5F7F4F8F4F9F4F089557FD56
:105ED0009058440F551F59F05F3F71F04795880F58
:105EE00097FB991F61F09F3F79F0879508951216EF
:105EF00013061406551FF2CF4695F1DF08C016169B
:105F000017061806991FF1CF86957105610508944B
:105F10000895E894BB2766277727CB0197F9089562
:105F20008ADF08F48FEF08950BD0C0CFB1DF28F0DF
:105F3000B6DF18F0952309F0A2CFA7CF1124EACF3E
:105F4000C6DFA0F3959FD1F3950F50E0551F629FD8
:105F5000F001729FBB27F00DB11D639FAA27F00DC2
:105F6000B11DAA1F649F6627B00DA11D661F829FE9
:105F70002227B00DA11D621F739FB00DA11D621FCE
:105F8000839FA00D611D221F749F3327A00D611DEB
:105F9000231F849F600D211D822F762F6A2F1124CD
:105FA0009F5750408AF0E1F088234AF0EE0FFF1F20
:105FB000BB1F661F771F881F91505040A9F79E3F57
:105FC000510570F05CCFA6CF5F3FECF3983EDCF359
:105FD000869577956795B795F795E7959F5FC1F794
:105FE000FE2B880F911D9695879597F90895FA01D4
:105FF000EE0FFF1F30962105310599F161157105EE
:1060000061F48038BFE39B0749F1689490388105BB
:1060100061F08038BFEF9B0741F0992342F5FF3FC5
:10602000E1053105210511F1E8940894E795D901BE
:10603000AA2329F4AB2FBE2FF85FD0F310C0FF5F67
:1060400070F4A695E0F7F73950F019F0FF3A38F4FC
:106050009F779F930CD00F9007FC905808953EF0C7
:1060600014CF60E070E080E89FE308954FE79F77EA
:106070005F934F933F932F939ED02F913F914F91DA
:106080005F9152DF05C019F40EF0F9CE42CFFDCE7C
:1060900026DFC8F39638C0F707F80F92E8942BE391
:1060A0003AEA48EB5FE74EDF0F920F920F924DB73F
:1060B0005EB70F92C0D0E4E4F1E016D04F915F914B
:1060C000EF91FF91E595EE1FFF1F49F0FE57E06845
:1060D0004427EE0F441FFA95E1F74195550B32D056
:1060E0000F9007FE26C00895DF93CF931F930F9361
:1060F000FF92EF92DF927B018C01689405C0DA2E4B
:10610000EF011EDFFE01E894A5912591359145919F
:106110005591AEF3EF0162DDFE019701A801DA941B
:1061200079F7DF90EF90FF900F911F91CF91DF9162
:1061300008959B01AC0160E070E080E89FE3A5CD8D
:106140009ECEACC0CCDEE8F39923D9F3940F511D59
:10615000BBF39150504094F059F0882332F0660F11
:10616000771F881F91505040C1F79E3F510544F75B
:10617000880F911D9695879597F908955F3FACF02C
:10618000983E9CF0BB27869577956795B79508F460
:10619000B1609395C1F7BB0F58F711F460FFE8CFDA
:1061A0006F5F7F4F8F4F9F4FE3CFB4CE0EF076C01F
:1061B0006CCE689464CE93DEC8F39923D1F3C6F312
:1061C000DF93CF931F930F93FF92C92FDD2788236F
:1061D0002AF02197660F771F881FDAF720E030E05A
:1061E00040E85FEB9FE3883920F0803E30F0219655
:1061F0008F77E3DCECE6F1E003C0DFDCE9E9F1E016
:1062000073DF8B01BE01EC01FB2E6F577109759591
:10621000771F880B990BD4DD28E132E741E35FE378
:106220008FDEAF2D9801AE01FF900F911F91CF919E
:10623000DF91D4DC3BCEFA01DC01AA0FBB1F9B012E
:10624000AC01BF5728F422273327442750781FC0BA
:10625000B75188F4AB2F0024469537952795011C3C
:10626000A395D2F3002069F0220F331F441FB3958A
:10627000DAF30DD0A1CC61307105A0E88A07B946E8
:1062800030F49B01AC0166277727882790783096F9
:1062900021F0208331834283538308959F3F31F05F
:1062A000915020F4879577956795B795880F911D44
:1062B0009695879597F90895AA1BBB1B51E107C0D6
:1062C000AA1FBB1FA617B70710F0A61BB70B881F86
:1062D000991F5A95A9F780959095BC01CD01089515
:1062E00097FB072E16F4009407D077FD09D00E9483
:1062F0005C3107FC05D03EF4909581959F4F089541
:10630000709561957F4F0895EE0FFF1F0590F491F2
:10631000E02D0994F999FECF92BD81BDF89A992795
:1063200080B50895A8E1B0E042E050E00C94B231AD
:10633000262FF999FECF92BD81BDF89A019700B43E
:10634000021639F01FBA20BD0FB6F894FA9AF99ADE
:106350000FBE08950196272F0E9499310C94983111
:10636000DC01CB01FC01F999FECF06C0F2BDE1BD15
:10637000F89A319600B40D9241505040B8F7089504
:04638000F894FFCFBF
:1063840007000C52D02445000000410000DC44000A
:1063940000004152D0A4440000404100005C44008D
:1063A40000004148F17644000000415C978A4400B3
:1063B4000000411FD592440000004152D0A4440083
:1063C4000000415CFFB844000000410AA7CF44002C
:1063D4000000410000DC44000000410AA7CF440053
:1063E4000000410000DC4400000041000000000007
:1063F40000804000005C45000040410000000000B7
:1064040000804052D02445000040410AA7CF4400F8
:106414000000410000DC44000000410000000000D6
:1064240000804052D024450000404100000000009C
:1064340000804000005C45000040410AA7CF4400B2
:106444000000410000DC44000000410000000000A6
:1064540000804052D024450000404100000000006C
:106464000080400AA74F45000040410AA7CF4400DE
:106474000000410000DC4400000041000000000076
:1064840000804052D024450000004100000000007C
:106494000080405CFF38450000004100000000001F
:1064A40000804052D02445000000410AA7CF440098
:1064B4000000410000DC4400000041000000000036
:1064C40000804052D024450000804153D024450030
:1064D40000404160970A450000004154D0A44400A4
:1064E4000000410000DC440000004160970A4500C0
:1064F40000A041050000003F0000C8423214C0144F
:106504009D14691435140101DA032808140A321E93
:106514000000020004000500070009000B000C0045
:106524000E001000110013001500170018001A00C7
:106534001C001D001F002100230024002600280049
:1065440029002B002D002F003000320034003500CC
:10655400370039003B00400045002500260061005B
:106564006000200037006400650066006700440096
:106574004600240047003F4D3639BD0970093A09E9
:1065840001099408AD08C608DF08010203040506E2
:0465940007080900EB
:00000001FF

@ -126,27 +126,44 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# USBaspLoader 2048 # USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096 OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options # Build Options
# comment out to disable the options. # change to "no" to disable the options, or define them in the makefile.mk in
# # the appropriate keymap folder that will get included automatically
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) #
MOUSEKEY_ENABLE = yes # Mouse keys(+4700) BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450) MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
CONSOLE_ENABLE = yes # Console for debug(+400) EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
COMMAND_ENABLE = yes # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality ifdef KEYMAP
MIDI_ENABLE = YES # MIDI controls
AUDIO_ENABLE = YES # Audio output on port C6 ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
# UNICODE_ENABLE = YES # Unicode ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID include keymaps/$(KEYMAP)/makefile.mk
# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with MIDI at the same time. endif
endif
ifdef BACKLIGHT_ENABLE
SRC += backlight.c else
ifneq ("$(wildcard keymaps/default/makefile.mk)","")
include keymaps/default/makefile.mk
endif
endif
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
SRC := backlight.c $(SRC)
endif endif

@ -73,10 +73,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* disable debug print */ /* disable debug print */
#define NO_DEBUG // #define NO_DEBUG
/* disable print */ /* disable print */
#define NO_PRINT // #define NO_PRINT
/* disable action features */ /* disable action features */
//#define NO_ACTION_LAYER //#define NO_ACTION_LAYER

@ -1,34 +1 @@
# The Default Planck Layout # The default Preonic layout - largely based on the Planck's
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = { /* Qwerty */
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
[_CM] = { /* Colemak */
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
[_DV] = { /* Dvorak */
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
[_RS] = { /* RAISE */
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},
[_LW] = { /* LOWER */
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
}
};

@ -1,76 +1,253 @@
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
// this is the style you want to emulate.
#include "preonic.h" #include "preonic.h"
#ifdef BACKLIGHT_ENABLE #include "action_layer.h"
#include "backlight.h" #include "eeconfig.h"
#ifdef AUDIO_ENABLE
#include "audio.h"
#endif #endif
// Each layer gets a name for readability, which is then used in the keymap matrix below. // Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them // Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers. // entirely and just use numbers.
#define _QW 0 #define _QWERTY 0
#define _CM 1 #define _COLEMAK 1
#define _DV 2 #define _DVORAK 2
#define _LW 3 #define _LOWER 3
#define _RS 4 #define _RAISE 4
#define _MUSIC 5
#define _ADJUST 16
// Macro name shortcuts
#define QWERTY M(_QWERTY)
#define COLEMAK M(_COLEMAK)
#define DVORAK M(_DVORAK)
#define LOWER M(_LOWER)
#define RAISE M(_RAISE)
#define M_BL 5
#define AUD_OFF M(6)
#define AUD_ON M(7)
#define MUS_OFF M(8)
#define MUS_ON M(9)
#define VC_IN M(10)
#define VC_DE M(11)
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = { /* Qwerty */
/* Qwerty
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_QWERTY] = {
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL},
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
}, },
[_CM] = { /* Colemak */
/* Colemak
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | R | S | T | D | H | N | E | I | O | " |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_COLEMAK] = {
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL},
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
}, },
[_DV] = { /* Dvorak */
/* Dvorak
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | O | E | U | I | D | H | T | N | S | / |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_DVORAK] = {
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL},
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
}, },
[_RS] = { /* RAISE */
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, /* Lower
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, * ,-----------------------------------------------------------------------------------.
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, * |------+------+------+------+------+-------------+------+------+------+------+------|
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_LOWER] = {
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL},
{KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
{_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
}, },
[_LW] = { /* LOWER */
/* Raise
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_RAISE] = {
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},
/* Music (reserved for process_action_user)
*
*/
[_MUSIC] = {
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
},
/* Adjust (Lower + Raise)
* ,-----------------------------------------------------------------------------------.
* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Reset| | | | | | | | | | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | |Voice-|Voice+|Musoff|Mus on| | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_ADJUST] = {
{KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12},
{_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
{_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______},
{_______, VC_DE, VC_IN, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
} }
}; };
const uint16_t PROGMEM fn_actions[] = { const uint16_t PROGMEM fn_actions[] = {
}; };
#ifdef AUDIO_ENABLE
float start_up[][2] = { float start_up[][2] = {
{440.0*pow(2.0,(67)/12.0), 600}, {440.0*pow(2.0,(14)/12.0), 20},
{440.0*pow(2.0,(64)/12.0), 400}, {440.0*pow(2.0,(26)/12.0), 8},
{440.0*pow(2.0,(55)/12.0), 400}, {440.0*pow(2.0,(18)/12.0), 20},
{440.0*pow(2.0,(60)/12.0), 400}, {440.0*pow(2.0,(26)/12.0), 8}
{440.0*pow(2.0,(64)/12.0), 1000},
}; };
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
float goodbye[][2] = SONG(GOODBYE_SOUND);
#endif
void persistant_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{ {
// MACRODOWN only works in this function
switch(id) { switch(id) {
case 0: case _QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
break;
case _COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, 0);
#endif
persistant_default_layer_set(1UL<<_COLEMAK);
}
break;
case _DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
#endif
persistant_default_layer_set(1UL<<_DVORAK);
}
break;
case _LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
break;
case _RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
break;
case M_BL:
if (record->event.pressed) { if (record->event.pressed) {
register_code(KC_RSFT); register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
@ -80,13 +257,86 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
unregister_code(KC_RSFT); unregister_code(KC_RSFT);
} }
break; break;
case 6:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
audio_off();
#endif
}
break;
case 7:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
audio_on();
PLAY_NOTE_ARRAY(start_up, false, 0);
#endif
}
break;
case 8:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
layer_off(_MUSIC);
stop_all_notes();
#endif
}
break;
case 9:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(music_scale, false, 0);
layer_on(_MUSIC);
#endif
}
break;
case 10:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
voice_iterate();
PLAY_NOTE_ARRAY(music_scale, false, 0);
#endif
}
break;
case 11:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
voice_deiterate();
PLAY_NOTE_ARRAY(music_scale, false, 0);
#endif
}
break;
} }
return MACRO_NONE; return MACRO_NONE;
}; };
void matrix_init_user(void) { void matrix_init_user(void) {
#ifdef AUDIO_ENABLE
_delay_ms(20); // gets rid of tick
PLAY_NOTE_ARRAY(start_up, false, 0);
#endif
}
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
init_notes();
play_notes(&start_up, 5, false); uint8_t starting_note = 0x0C;
#endif int offset = 7;
void process_action_user(keyrecord_t *record) {
if (IS_LAYER_ON(_MUSIC)) {
if (record->event.pressed) {
play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
} else {
stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
}
} }
void play_goodbye_tone()
{
PLAY_NOTE_ARRAY(goodbye, false, 0);
_delay_ms(150);
}
#endif

@ -1,1713 +0,0 @@
:100000000C9410030C9454030C9454030C94540358
:100010000C9454030C9454030C9454030C94540304
:100020000C9454030C9454030C9410170C94E21782
:100030000C94BD290C9454030C9454030C94540355
:100040000C9454030C9454030C9454030C945403D4
:100050000C9454030C942A2A0C9454030C945403C7
:100060000C9454030C9454030C9454030C945403B4
:100070000C9454030C9454030C9454030C945403A4
:100080000C94440E0C9454030C9454030C94540399
:100090000C9454030C9454030C9454030C94540384
:1000A0000C9454030C9454030C9454030763423689
:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9
:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD
:1000D0000000803F08000000BE922449123EABAAF7
:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52
:1000F000AA3E00000000BF000000803F000000009A
:1001000000084178D3BB4387D1133D190E3CC3BDD2
:100110004282AD2B3E68EC8276BED98FE1A93E4C7F
:1001200080EFFFBE01C4FF7F3F00000000003500EC
:100130001E001F00200021002200230024002500B3
:10014000260027002A002B0014001A0008001500C2
:1001500017001C0018000C00120013002A002900D0
:1001600004001600070009000A000B000D000E0035
:100170000F0033003400E1001D001B0006001900D1
:10018000050011001000360037003800280000304C
:10019000E000E200E30003522C002C000452500067
:1001A000510052004F0035001E001F0020002100AA
:1001B0002200230024002500260027002A002B000F
:1001C00014001A00090013000A000D000F001800A7
:1001D0001C0033002A002900040015001600170037
:1001E00007000B00110008000C0012003400E100B1
:1001F0001D001B000600190005000E00100036004F
:100200003700380028000030E000E200E30003522D
:100210002C002C0004525000510052004F003500B9
:100220001E001F00200021002200230024002500C2
:10023000260027002A002B00340036003700130068
:100240001C0009000A00060015000F002A00290002
:1002500004001200080018000C0007000B00170033
:10026000110016003800E100330014000D000E00EC
:100270001B00050010001A0019001D0028000030A6
:10028000E000E200E30003522C002C000452500076
:10029000510052004F0035001E001F0020002100B9
:1002A0002200230024002500260027002A00350212
:1002B0001E021F0220022102220223022402250222
:1002C000260227022A0001003A003B003C003D00C4
:1002D0003E003F002D022E022F02300231020100AB
:1002E00040004100420043004400450000530153D8
:1002F0000253005001000100010001000100010053
:10030000010001000100AB00AA00A900AE00350009
:100310001E001F00200021002200230024002500D1
:10032000260027002A0035001E001F0020002100A3
:100330002200230024002500260027002A000100B7
:100340003A003B003C003D003E003F002D002E00E7
:100350002F00300031000100400041004200430006
:1003600044004500005301530253005001000100B6
:100370000100010001000100010001000100AB00CB
:10038000AA00A900AE00006000600060006000608C
:10039000006000600060006000600060006000605D
:1003A000006000600060006000600060006000604D
:1003B000006000600060006000600060006000603D
:1003C000006000600060006000600060006000602D
:1003D000006000600060006000600060006000601D
:1003E00000600060006000300100010001000100B9
:1003F00001000100010000600060006000602A034D
:1004000054006800650020005000720065006F0015
:100410006E006900630020004B00650079006200F7
:100420006F0061007200640000002C034F00720036
:10043000740068006F006C0069006E006500610068
:10044000720020004B006500790062006F006100BF
:100450007200640073000000040309040902D00064
:10046000060100A0FA0904000001030101000921AE
:1004700011010001223F000705810308000A090459
:1004800001000103010200092111010001224D00B8
:100490000705820308000A090402000103000000A6
:1004A0000921110100012236000705830308000A13
:1004B00009040300020300000009211101000122C8
:1004C0002000070584032000010705040320000124
:1004D00009040400000101000009240100010900D1
:1004E00001050904050002010300000724010001C1
:1004F0004100062402010100062402020200092430
:1005000003010301020100092403020401010100A7
:100510000905060240000500000525010101090545
:1005200085024000050000052501010312011001AC
:1005300000000008EDFE61600100010200010631CB
:10054000FF0974A1010975150025FF952075088123
:10055000020976150025FF952075089102C0050156
:100560000980A101850216010026B7001A01002AA0
:10057000B700751095018100C0050C0901A1018526
:1005800003160100269C021A01002A9C0275109590
:10059000018100C005010902A1010901A1000509AD
:1005A000190129051500250195057501810295019F
:1005B000750381010501093009311581257F9502F7
:1005C0007508810609381581257F95017508810612
:1005D000050C0A38021581257F950175088106C032
:1005E000C005010906A101050719E029E715002545
:1005F00001950875018102950175088101050819A9
:100600000129059505750191029501750391010573
:1006100007190029FF150025FF950675088100C000
:1006200011241FBECFEFDAE0DEBFCDBF04B603FE5C
:1006300024C08091050490910604A0910704B09114
:1006400008048730904BA740B04BB9F410920504D2
:1006500010920604109207041092080414BE84B786
:10066000877F84BF88E10FB6F89480936000109272
:1006700060000FBEE0E0F8E3099512E0A0E0B1E011
:10068000E6ECF9E602C005900D92A832B107D9F761
:1006900014E0A8E2B2E001C01D92A530B107E1F775
:1006A0000E94C8130C94E1340C94000061111DC029
:1006B000FC018281882351F085EE0E94901E0E94E9
:1006C000BC3080E290E0A0E0B0E007C085EE0E9480
:1006D000581F81E090E0A0E0B0E08093E1029093A9
:1006E000E202A093E302B093E40280E090E0089578
:1006F0000E94370E40E050E069E070E080E091E059
:100700000C94880F08950E948B036E9A769A0C942D
:1007100078030C948203279A2F988FEF9FEF909382
:100720008700809386008AE08093800089E180932F
:1007300081000C94653081110BC080918000877F0F
:100740008093800010928D0010928C002F98089555
:100750002F98833041F480918000886080938000DE
:100760008FEF9FEF12C0909180009860909380006F
:1007700023E030E0281B3109220F331F8FEF9FEF5A
:1007800002C0969587952A95E2F790938D00809305
:100790008C0008958B3B910568F4883A910530F5FB
:1007A000853A9105C0F48430910598F4019709F0D9
:1007B0006FC071C0803E910508F46AC0883E910503
:1007C00040F09C01205F31092031310508F060C004
:1007D0005CC09C01A1C0853A910509F45FC0863ACE
:1007E000910509F45EC023E830E496C0883A91058B
:1007F00009F45AC0893A910509F459C08A3A910519
:1008000009F458C08B3A910509F457C08C3A910508
:1008100009F456C08D3A910509F455C0803B910505
:1008200009F454C08E3A910509F453C08F3A9105EA
:1008300009F452C0813B910509F451C0823B9105F6
:1008400009F450C0833B910509F44FC0843B9105E6
:1008500009F44EC0853B910509F44DC0863B9105D6
:1008600009F44CC0873B910509F44BC0883B9105C6
:1008700009F44AC0893B910509F449C08A3B9105B6
:1008800009F048C02AE236E447C09C01306544C004
:1008900020E030E041C021E030E03EC021E830E41B
:1008A0003BC022E830E438C022EE34E435C029EE03
:1008B00034E432C02AEE34E42FC025EB34E42CC0FB
:1008C00026EB34E429C027EB34E426C02CEC34E4D6
:1008D00023C02DEC34E420C023E835E41DC02AE811
:1008E00035E41AC022E935E417C024E935E414C020
:1008F00021E236E411C023E236E40EC024E236E4FD
:100900000BC025E236E408C026E236E405C027E243
:1009100036E402C020E034E4C90108959CE0799FE8
:10092000F00111249CE3899FE00DF11D1124E60FD5
:10093000F11DEE0FFF1FE25DFE4F25913491C901BD
:100940000895880F991F82559040FC01259134919C
:10095000C9010895880F991F825D9E4FFC01259162
:100960003491C90108950E948E049C019A958115C5
:100970009F4110F4C9010895C90190528115904119
:1009800028F4C9019F700E94AA040895C9019053D8
:100990008115904120F4C9019927906C0895C901EF
:1009A0009054409728F4C9018F709927946D089549
:1009B000203180E4380719F480E091ED0895213169
:1009C00090E4390719F480E090ED0895223140E475
:1009D000340719F480E092ED0895233180E438075C
:1009E00019F480E093ED0895211590E53907A1F4FD
:1009F0000E948B2340E065E088E491E00E94880F2C
:100A00002FEF44E38CE0215040408040E1F700C0EC
:100A100000000E944F2A1EC1213090E5390731F4B1
:100A20008091F10281608093F10214C1C901905557
:100A30008115904108F062C0432F55274F7055270C
:100A400041305105F9F4C90174E0880F991F7A9576
:100A5000E1F788279370B901E3E0660F771FEA9505
:100A6000E1F760767727862B972B9C6823703327D6
:100A700002C0440F551F2A95E2F74F715527842B6A
:100A8000952B08954230510529F4922F8827816FC4
:100A9000906A089543305105B9F4C90153E0880FB5
:100AA000991F5A95E1F7807E97702370332741E0B4
:100AB00050E002C0440F551F2A95E2F74F715527A9
:100AC000842B952B9C6808954430510589F5C90104
:100AD00043E0880F991F4A95E1F7807E9770237055
:100AE000332741E050E002C0440F551F2A95E2F73A
:100AF0004F715527842B952B9A680895C9019056FC
:100B00008115904118F4C901906F0895C90190575B
:100B10008115904120F4C9019F7090620895C90128
:100B200090588115904120F4C9019F70906A0895F2
:100B3000203E3105E0F4203C310568F521333105D4
:100B400009F475C048F42932310509F46BC02A3222
:100B5000310509F07BC075C02933310501F1223818
:100B60003105E9F02533310509F070C051C0233E4D
:100B70003105B1F140F4203E3105D1F0223E31057E
:100B800009F064C01CC0263E310579F1273E3105CD
:100B900009F05CC038C0C9010E94A1040895809189
:100BA000020380FD02C081FF51C080EE90E04FC083
:100BB0008091020380FFF9CF89E390E048C08091E3
:100BC000020382FF0AC08091020384FF03C080E019
:100BD00090E03DC083EE90E03AC082EE90E037C0F6
:100BE0008091020382FFEFCFF8CF8091020383FF51
:100BF00007C08091020384FDEACF87EE90E027C012
:100C000086EE90E024C08091020383FFF2CFF8CFFC
:100C10008091020385FF03C089E290E018C085E35C
:100C200090E015C08091020385FDF9CFF5CF80914A
:100C3000020386FF03C08AE290E009C081E390E0EE
:100C400006C08091020386FDF9CFF5CFC9010E944D
:100C5000CA030895089508950C942B065F926F922D
:100C60007F928F929F92AF92BF92CF92DF92EF923C
:100C7000FF920F931F93CF93DF93CDB7DEB72A97E1
:100C80000FB6F894DEBF0FBECDBF9E012F5F3F4F62
:100C90004E018BE0880E911C60E070E000E010E0F7
:100CA000E12CF12CC12CD12CA12CB12C8AE0782E76
:100CB000622E532E41E050E0E3E9F1E0A62DB52D80
:100CC000872D01900D928A95E1F7F901819191911B
:100CD0009F01FC01E07FFF27E032F10559F48F709E
:100CE0009927FA0102C0EE0FFF1F8A95E2F7AE2A9C
:100CF000BF2A37C0E033F10559F48F709927FA0104
:100D000002C0EE0FFF1F8A95E2F7CE2ADF2A29C024
:100D1000E034F10559F48F709927FA0102C0EE0F03
:100D2000FF1F8A95E2F7EE2AFF2A1BC0E035F10586
:100D300059F48F709927FA0102C0EE0FFF1F8A95B0
:100D4000E2F70E2B1F2B0DC0E036F10551F48F702A
:100D50009927FA0102C0EE0FFF1F8A95E2F76E2B6A
:100D60007F2B2815390509F0A7CF94B18A2D8095DE
:100D7000892384B985B18A2985B997B18C2D80954D
:100D8000892387B988B18C2988B99AB18E2D80952D
:100D900089238AB98BB18E298BB99DB1802F80951B
:100DA00089238DB98EB1802B8EB990B3862F809513
:100DB000892380BB81B3862B81BB2A960FB6F8941A
:100DC000DEBF0FBECDBFDF91CF911F910F91FF907E
:100DD000EF90DF90CF90BF90AF909F908F907F90DB
:100DE0006F905F9008955F926F927F928F929F9223
:100DF000AF92BF92CF92DF92EF92FF920F931F9329
:100E0000CF93DF93CDB7DEB768970FB6F894DEBF08
:100E10000FBECDBF85B7806885BF85B7806885BFA9
:100E20000E942E069E012F5F3F4F4E0189E1880EE2
:100E3000911C60E070E000E010E0E12CF12CC12C8E
:100E4000D12CA12CB12C98E1792E622E532E41E0A9
:100E500050E0EDE9F1E0A62DB52D872D01900D9222
:100E60008A95E1F7F901819191919F01FC01E07F61
:100E7000FF27E032F10559F48F709927FA0102C07B
:100E8000EE0FFF1F8A95E2F7AE2ABF2A37C0E03384
:100E9000F10559F48F709927FA0102C0EE0FFF1F78
:100EA0008A95E2F7CE2ADF2A29C0E034F10559F409
:100EB0008F709927FA0102C0EE0FFF1F8A95E2F7A3
:100EC000EE2AFF2A1BC0E035F10559F48F709927EF
:100ED000FA0102C0EE0FFF1F8A95E2F70E2B1F2BBF
:100EE0000DC0E036F10551F48F709927FA0102C068
:100EF000EE0FFF1F8A95E2F76E2B7F2B2815390521
:100F000009F0A7CF94B18A2D8095892384B985B142
:100F10008A2985B997B18C2D8095892387B988B1A5
:100F20008C2988B99AB18E2D809589238AB98BB185
:100F30008E298BB99DB1802F809589238DB98EB173
:100F4000802B8EB990B3862F8095892380BB81B387
:100F5000862B81BB10922902109228021092330234
:100F60001092320210922B0210922A021092350235
:100F70001092340210922D0210922C02109237021D
:100F80001092360210922F0210922E021092390205
:100F900010923802109231021092300210923B02ED
:100FA00010923A0268960FB6F894DEBF0FBECDBF1E
:100FB000DF91CF911F910F91FF90EF90DF90CF9035
:100FC000BF90AF909F908F907F906F905F900C94A8
:100FD00083035F926F927F928F929F92AF92BF92A4
:100FE000CF92DF92EF92FF920F931F93CF93DF93F5
:100FF000CDB7DEB7A2970FB6F894DEBF0FBECDBF58
:101000007E0149E1E40EF11C22E3C22E22E0D22E41
:101010005E0153E2A50EB11C3AE0532E470101E0F8
:1010200010E048E1642E55E0752EE3E9F1E0D401CB
:10103000852D01900D928A95E1F7F70181919191AB
:101040007F019C01207F33272032310589F424B1B0
:101050008F709927A80102C0440F551F8A95E2F7A7
:10106000CA01242B24B995B18095892385B94FC035
:101070002033310589F427B18F709927F80102C018
:10108000EE0FFF1F8A95E2F7CF012E2B27B998B1FB
:101090008095892388B93BC02034310589F42AB171
:1010A0008F709927A80102C0440F551F8A95E2F757
:1010B000CA01242B2AB99BB1809589238BB927C0FB
:1010C0002035310589F42DB18F709927F80102C0C0
:1010D000EE0FFF1F8A95E2F7CF012E2B2DB99EB19F
:1010E000809589238EB913C02036310581F420B351
:1010F0008F709927A80102C0440F551F8A95E2F707
:10110000CA01242B20BB91B38095892381BB50EA6F
:101110005A95F1F7BE016F5F7F4F80E090E020E0CD
:1011200030E0EDE9F1E0DE011196462D01900D92DF
:101130004A95E1F7FB0141915191BF01FA01E07F2E
:10114000FF27E032F10511F4E3B113C0E033F105FC
:1011500011F4E6B10EC0E034F10511F4E9B109C0B3
:10116000E035F10511F4ECB104C0E036F105B9F455
:10117000EFB1F0E04F70552702C0F595E7954A951D
:10118000E2F7E0FD08C0A801022E02C0440F551F7F
:101190000A94E2F702C040E050E0842B952B2F5FC9
:1011A0003F4F2C30310509F0BCCFF6012081318151
:1011B0002817390721F091838083709270010E9473
:1011C0002E06F2E0CF0ED11CEA14FB0409F02DCF5D
:1011D000809170018823A1F1815080937001882350
:1011E00039F08FE99FE00197F1F700C0000028C0B7
:1011F00080913202909133029093290280932802C9
:10120000809134029091350290932B0280932A02B0
:10121000809136029091370290932D0280932C0298
:10122000809138029091390290932F0280932E0280
:1012300080913A0290913B02909331028093300268
:101240000E94890381E0A2960FB6F894DEBF0FBE1C
:10125000CDBFDF91CF911F910F91FF90EF90DF9065
:10126000CF90BF90AF909F908F907F906F905F9046
:101270000895E82FF0E0EE0FFF1FE85DFD4F80813D
:10128000918108950895CF92DF92EF92FF920F938C
:101290001F93CF93DF93CDB7DEB7CC5BD2400FB6B1
:1012A000F894DEBF0FBECDBF8C01862F642F88233C
:1012B00079F0F80192812FE7482F992329F084E0F3
:1012C00093E00E94EC1904C084E093E00E94FC19B2
:1012D000F80180818B3091F59181943009F0A8C29A
:1012E0009281809173019923B1F08F5F8093730194
:1012F00096E4E5EBF1E0DE01A958BD4F01900D92B7
:101300009A95E1F7E0917101F0917201EE0FFF1FE4
:1013100027E732E036C096E4E5EBF1E0DE01AF5CB2
:10132000BD4F01900D929A95E1F7E0917101F09116
:101330007201EE0FFF1F21E332E093C08A3009F003
:10134000CBC0F8019181943009F072C292818091F2
:101350007301992309F473C081508093730196E45B
:10136000E5EBF1E0DE01A551BE4F01900D929A959B
:10137000E1F7E0917101F0917201EE0FFF1F2BEE8A
:1013800031E02C0F3D1FE20FF31F60817181680F68
:10139000711D882777FD8095982F0E94003220E0EC
:1013A00030E040E451E40E94653120E030E040E864
:1013B00050E40E94FD309B01AC0160E070E080E0F1
:1013C00090E40E94173321E230ED42E053E40E94A2
:1013D000B4324CE050E00E94E30F20E04BE760E0C5
:1013E00084E093E00E94DC1920E04BE761E084E0B8
:1013F00093E00E94DC1920E04BE762E084E093E098
:101400000E94DC1920E04BE763E084E093E00E9457
:10141000DC1920E04BE764E084E093E0C454DD4F46
:101420000FB6F894DEBF0FBECDBFDF91CF911F91F5
:101430000F91FF90EF90DF90CF900C94DC1996E421
:10144000E5EBF1E0DE01AB55BE4F01900D929A95B0
:10145000E1F7E0917101F0917201EE0FFF1F25EAB3
:1014600031E02C0F3D1FE20FF31F60817181680F87
:10147000711D882777FD8095982F0E94003220E00B
:1014800030E040E451E40E94653120E030E040E883
:1014900050E40E94FD309B01AC0160E070E080E010
:1014A00090E40E94173321E230ED42E053E40E94C1
:1014B000B4320E94130DC454DD4F0FB6F894DEBF52
:1014C0000FBECDBFDF91CF911F910F91FF90EF9095
:1014D000DF90CF900C94E60C893009F0D3C0F8016E
:1014E0009181943009F0A4C19281992309F4A0C19B
:1014F0008091710190917201019690937201809395
:10150000710120E04BE760E084E093E00E94DC1989
:1015100020E04BE761E084E093E00E94DC1920E0EA
:101520004BE762E084E093E00E94DC1920E04BE7A7
:1015300063E084E093E00E94DC1920E04BE764E084
:1015400084E093E00E94DC190E94E60C00E010E0C9
:10155000E6E4FE2E80917301E5EBF1E0DE01A15A95
:10156000BE4F9F2D01900D929A95E1F7E091710188
:10157000F0917201E00FF11FEE0FFF1F2FE531E038
:101580002C0F3D1FE20FF31F60817181680F711DE9
:10159000882777FD8095982F0E94003220E030E068
:1015A00040E451E40E94653120E030E040E850E43E
:1015B0000E94FD309B01AC0160E070E080E090E4AF
:1015C0000E94173321E230ED42E053E40E94B4322E
:1015D0004CE050E00E94E30F3FEF87EE93E0315084
:1015E00080409040E1F700C0000080917301E5EB7E
:1015F000F1E0DE01A75EBE4F9F2D01900D929A95FE
:10160000E1F7E0917101F0917201E00FF11FEE0F2F
:10161000FF1F29E131E02C0F3D1FE20FF31F608116
:101620007181680F711D882777FD8095982F0E9422
:10163000003220E030E040E451E40E94653120E0D7
:1016400030E040E850E40E94FD309B01AC0160E0D6
:1016500070E080E090E40E94173321E230ED42E038
:1016600053E40E94B4320E94130D8FEF9CE7019760
:10167000F1F700C000000F5F1F4F0830110509F09F
:1016800069CF94C1883009F0D3C0F80191819430BA
:1016900009F0CEC09281992309F4CAC080917101EA
:1016A000909172010197909372018093710120E0F3
:1016B0004BE760E084E093E00E94DC1920E04BE718
:1016C00061E084E093E00E94DC1920E04BE762E0F7
:1016D00084E093E00E94DC1920E04BE763E084E0C3
:1016E00093E00E94DC1920E04BE764E084E093E0A3
:1016F0000E94DC190E94E60C00E010E056E4F52E92
:1017000080917301E5EBF1E0DE01AD52BF4F9F2DFB
:1017100001900D929A95E1F7E0917101F0917201BB
:10172000E00FF11FEE0FFF1F23ED30E02C0F3D1FE8
:10173000E20FF31F60817181680F711D882777FDAB
:101740008095982F0E94003220E030E040E451E480
:101750000E94653120E030E040E850E40E94FD3016
:101760009B01AC0160E070E080E090E40E941733E0
:1017700021E230ED42E053E40E94B4324CE050E00C
:101780000E94E30F3FEF87EE93E03150804090409E
:10179000E1F700C0000080917301E5EBF1E0DE01AC
:1017A000A357BF4F9F2D01900D929A95E1F7E091BD
:1017B0007101F0917201E00FF11FEE0FFF1F2DE894
:1017C00030E02C0F3D1FE20FF31F60817181680F25
:1017D000711D882777FD8095982F0E94003220E0A8
:1017E00030E040E451E40E94653120E030E040E820
:1017F00050E40E94FD309B01AC0160E070E080E0AD
:1018000090E40E94173321E230ED42E053E40E945D
:10181000B4320E94130D8FEF9CE70197F1F700C0DF
:1018200000000F5F1F4F0830110509F069CFBEC0DF
:10183000F801228190917301222309F45DC026E40E
:10184000E5EBF1E0DE01A95BBF4F01900D922A9517
:10185000E1F7E0917101F0917201E80FF11DEE0FD7
:10186000FF1F27E430E02C0F3D1FE20FF31F6081C4
:101870007181690F711D882777FD8095982F0E94CF
:10188000003220E030E040E451E40E9465316B0119
:101890007C01F801818165E070E0681B710988278F
:1018A00077FD8095982F0E9400329B01AC01C70103
:1018B000B6010E94FD309B01AC0160E070E080E069
:1018C00090E40E94173321E230ED42E053E40E949D
:1018D000B4324FE050E0C454DD4F0FB6F894DEBF91
:1018E0000FBECDBFDF91CF911F910F91FF90EF9071
:1018F000DF90CF900C94E30F26E4E5EBF1E0DE01FE
:10190000119601900D922A95E1F7E0917101F09105
:101910007201E80FF11DEE0FFF1F21E030E02C0FE8
:101920003D1FE20FF31F60817181690F711D8827D0
:1019300077FD8095982F0E94003220E030E040E44F
:1019400051E40E9465316B017C01F801818165E001
:1019500070E0681B7109882777FD8095982F0E9499
:1019600000329B01AC01C701B6010E94FD309B0112
:10197000AC0160E070E080E090E40E94173321E267
:1019800030ED42E053E40E94B432C454DD4F0FB650
:10199000F894DEBF0FBECDBFDF91CF911F910F91A5
:1019A000FF90EF90DF90CF900C94130DC454DD4F57
:1019B0000FB6F894DEBF0FBECDBFDF91CF911F9160
:1019C0000F91FF90EF90DF90CF90089510928702D3
:1019D00010928602809171008D7F809371008091BA
:1019E00090008F77809390001092480210924702E7
:1019F0001092800210928102109282021092830251
:101A000010927F0210927E02EEE5F2E0AEE4B2E0C8
:101A100011921192119211921D921D9282E0EE3755
:101A2000F807B1F708956F927F928F929F92AF92CD
:101A3000BF92CF92DF92EF92FF920F931F93CF93BB
:101A4000DF936B017C010EE712E04CE5A42E42E02F
:101A5000B42EC7E0D0E0A7019601F80192918291DF
:101A6000729162918F010E946131882349F0219720
:101A7000F2E0AF1AB108CF3F8FEFD80761F734C05B
:101A8000F8011082118212821382F50111821082F4
:101A9000FE01EE0FFF1FEE0FFF1FE25AFD4FDE01AA
:101AA000AA0FBB1FA25BBD4FCE011AC00196448195
:101AB0005581668177814083518362837383148269
:101AC00015821682178212962D913C9113971196CA
:101AD0003C932E9313961C921E9212973496129654
:101AE0008730910519F7C3CF8091860290918702C4
:101AF000019797FD05C0909387028093860204C0EA
:101B00001092870210928602E0918602F09187027D
:101B10003097C9F4809171008D7F8093710080911E
:101B200090008F7780939000109280021092810233
:101B3000109282021092830210927F0210927E0213
:101B40001092470285C03197DF01AA0FBB1FAA0F71
:101B5000BB1FA25ABD4FCD90DD90ED90FC90EE0FD3
:101B6000FF1FE25BFD4FC081D181609080027090C9
:101B700081028090820290908302A7019601662DD7
:101B8000772D882D992D0E94613187FF25C0262D44
:101B9000372D482D592DC701B6010E94FC3020E099
:101BA00030E04AEF54E40E9465315B018C012A2D3C
:101BB0003B2D402F512F662D772D882D992D0E947A
:101BC000FD303B014C01A7019601772D992D0E9414
:101BD0006131181664F72EC0A7019601662D772D86
:101BE000882D992D0E94B032181634F5A701960160
:101BF000662D772D882D992D0E94FC3020E030E055
:101C00004AEF54E40E9465315B018C012A2D3B2D83
:101C1000402F512F662D772D882D992D0E94FC3055
:101C20003B014C01A7019601772D992D0E94B032FE
:101C300087FFECCF10924D02C0928002D0928102B9
:101C4000E0928202F0928302D0937F02C0937E02E0
:101C5000DF91CF911F910F91FF90EF90DF90CF9088
:101C6000BF90AF909F908F907F906F9008953E9A15
:101C7000E1E7F0E080818D7F808382E080939000B7
:101C80008AE18093910008951F920F920FB60F92F0
:101C90001124CF92DF92EF92FF922F933F934F93B5
:101CA0005F936F937F938F939F93AF93BF93CF93E4
:101CB000DF93EF93FF9380914702882309F479C063
:101CC00020E030E0A9016091800270918102809152
:101CD0008202909183020E94B03218160CF069C003
:101CE00020E030E040E251E46091490270914A0204
:101CF00080914B0290914C020E94B0321816BCF4B5
:101D00008091840290918502019660918602709183
:101D100087020E949C3490938502809384021092E3
:101D2000490210924A0210924B0210924C02C0914A
:101D30008402D0918502CC0FDD1FCC0FDD1FC25A6B
:101D4000DD4F288139814A815B8160E074E284E75C
:101D50009BE40E9465310E94CD317093970060939F
:101D60009600288139814A815B8160E074E284E7D2
:101D70009BE40E9465310E94CD3175956795709303
:101D800099006093980020E030E040E85FE36091C4
:101D9000490270914A0280914B0290914C020E943C
:101DA000FD306093490270934A0280934B029093F6
:101DB0004C0280914802882309F493C0C0904302EA
:101DC000D0904402E0904502F090460220E030E0DE
:101DD000A901C701B6010E94B0321816F4F4A70198
:101DE000960160E074E284E79BE40E9465310E9402
:101DF000CD317093970060939600A701960160E043
:101E000074E284E79BE40E9465310E94CD317595B0
:101E10006795709399006093980060913D0270916E
:101E20003E026F5F7F4F70933E0260933D0280E001
:101E300090E00E94FE3120913F023091400240919B
:101E40004102509142020E94B03287FD4AC0809107
:101E50003C028F5F80933C029091F1038917A0F0C0
:101E60008091F603882319F010923C020DC08091F6
:101E700071008D7F80937100809190008F778093A7
:101E80009000109248022DC0E091F203F091F3030C
:101E900080913C0298E0899FE00DF11D1124808122
:101EA0009181A281B3818093430290934402A093D5
:101EB0004502B093460220E030E040E85EE36481F2
:101EC0007581868197810E94B43260933F0270933E
:101ED0004002809341029093420210923E0210927F
:101EE0003D02FF91EF91DF91CF91BF91AF919F9113
:101EF0008F917F916F915F914F913F912F91FF90C3
:101F0000EF90DF90CF900F900FBE0F901F9018951D
:101F10000F931F93CF93DF9300D0CDB7DEB78C0123
:101F200080914702882331F04A8369830E94E60C3E
:101F300069814A8181E0809348021093F303009302
:101F4000F2036093F1034093F6031092490210925A
:101F50004A0210924B0210924C0210923C02F8017D
:101F600040815181628173814093430250934402C6
:101F7000609345027093460220E030E040E85EE363
:101F800064817581868197810E94B43260933F029B
:101F900070934002809341029093420210923E025D
:101FA00010923D0280917100826080937100809157
:101FB00090008068809390000F900F90DF91CF91F8
:101FC0001F910F9108956F927F928F929F92AF927F
:101FD000BF92CF92DF92EF92FF920F931F93CF9316
:101FE000DF936B017C01EA018091480281110E941C
:101FF000E60C81E08093470220E030E0A901C701B0
:10200000B6010E94B03218160CF09AC0609080029F
:1020100070908102809082029090830220E030E0F4
:10202000A901662D772D882D992D0E94613181118E
:1020300028C0C0928002D0928102E0928202F09287
:102040008302D0937F02C0937E028091860290919A
:102050008702FC01EE0FFF1FEE0FFF1FE25AFD4F3C
:10206000C082D182E282F382FC01EE0FFF1FE25BAD
:10207000FD4FD183C083019690938702809386029F
:102080005FC0A7019601662D772D882D992D0E949E
:10209000613187FF25C0262D372D482D592DC701C9
:1020A000B6010E94FC3020E030E04AEF54E40E9488
:1020B00065315B018C012A2D3B2D402F512F662D60
:1020C000772D882D992D0E94FD303B014C01A701F1
:1020D0009601772D992D0E946131181664F7A9CFCA
:1020E000A7019601662D772D882D992D0E94B0327B
:1020F00018160CF09ECFA7019601662D772D882D1E
:10210000992D0E94FC3020E030E04AEF54E40E9418
:1021100065315B018C012A2D3B2D402F512F662DFF
:10212000772D882D992D0E94FC303B014C01A70191
:102130009601772D992D0E94B03287FFECCF79CF91
:10214000809171008260809371008091900080681E
:1021500080939000DF91CF911F910F91FF90EF90AE
:10216000DF90CF90BF90AF909F908F907F906F90B7
:102170000895809191020895CF93DF9300D01F922C
:10218000CDB7DEB72091FB03243021F523E029836E
:102190009B838A832093E9008FEF06C095ED9A9583
:1021A000F1F70000882329F09091E800815095FF15
:1021B000F5CF8091E80085FF0DC040E050E063E07E
:1021C00070E0CE0101960E94A6148091E8008E77FF
:1021D0008093E8000F900F900F90DF91CF910895BA
:1021E000CF93DF9300D01F92CDB7DEB72091FB03D2
:1021F000243029F522E029839B838A8383E080931E
:10220000E9008FEF06C095ED9A95F1F7000088235D
:1022100029F09091E800815095FFF5CF8091E8007A
:1022200085FF0DC040E050E063E070E0CE01019614
:102230000E94A6148091E8008E778093E8000F90AA
:102240000F900F90DF91CF9108952091FB032430E0
:10225000F9F422E02093E9002FEF06C035ED3A951E
:10226000F1F70000222329F03091E800215035FFDA
:10227000F5CF2091E80025FF0BC040E050E065E07D
:1022800070E00E94A6148091E8008E778093E800A9
:102290000895CF93DF93EC018091FB03843041F5E7
:1022A00081E08093E9008FEF06C095ED9A95F1F7F4
:1022B0000000882329F09091E800815095FFF5CF28
:1022C0008091E80085FF14C040E050E068E070E0D5
:1022D000CE010E94A6148091E8008E778093E800DA
:1022E00088E0FE01A9E8B2E001900D928A95E1F73D
:1022F000DF91CF910895BF92CF92DF92EF92FF923C
:102300000F931F93CF93DF937C01B62EE90100E07A
:1023100010E0C42ED12C0BC04991202F2B0D2F770C
:102320004F776FE0C7010E94DC190F5F1F4F0C153C
:102330001D0594F3DF91CF911F910F91FF90EF90C6
:10234000DF90CF90BF90089570E06F5F7F4F6F7008
:1023500077270C94DC190F931F93CF93C42F63300E
:10236000710509F04AC0842F807F803849F1803997
:1023700009F043C0622F6F7770E080E090E00E9428
:10238000003220E030E040E451E40E9465319B01DE
:10239000AC0160E070E080E090E40E9417330F77BA
:1023A00010E023E0159507952A95E1F72DEC3CEC1C
:1023B00042E053E40E94B432A8010E94E30F1DC022
:1023C000622F6F7770E080E090E00E94003220E0A2
:1023D00030E040E451E40E9465319B01AC0160E0D3
:1023E00070E080E090E40E9417332DEC3CEC42E07A
:1023F00053E40E94B4320E94130DCC3F29F4CF91D4
:102400001F910F910C94E60CCF911F910F9108959D
:102410000F931F93CF93DF93CDB7DEB727970FB6F8
:10242000F894DEBF0FBECDBF8C0114C08A810E941C
:10243000B6199A819D839B819E839C819F83811184
:102440001EC089818430B1F08730A1F08630A1F0C0
:102450008530A1F0BE016F5F7F4F84E791E00E945D
:10246000231D8111E3CF84E791E00E94141D0E9497
:102470008F190DC083E003C082E001C081E0AE018E
:102480004B5F5F4F682FC8010E94491AE3CF279620
:102490000FB6F894DEBF0FBECDBFDF91CF911F9175
:1024A0000F910895EF92FF920F93CF93DF9300D097
:1024B00000D000D0CDB7DEB77B014A832B830C83DD
:1024C000842F2E834D830E94B6192E814D81811158
:1024D0001BC082E0E816F10479F083E0E816F1040D
:1024E00021F0EA94EF2821F50BC0073F11F487E0B3
:1024F00001C084E089830BC0273FD9F786E0FACF7B
:10250000473FB9F785E0F6CF42954F704983BE014A
:102510006F5F7F4F84E791E00E94D91C84E791E0D0
:102520000E94F71C84E791E00E94141D0E948F19FD
:1025300026960FB6F894DEBF0FBECDBFDF91CF91C8
:102540000F91FF90EF9008958091FA03811109C0D7
:102550000E9495160E94F2168091E200846080939A
:10256000E20008951092FA030895089508950C94D6
:10257000B229809192028F5F8093920262E30E945F
:102580007C34911135C0109292028091930288237D
:1025900079F18091FB03843049F58091E9008F70D7
:1025A0009091EC0090FF02C090E801C090E0982B61
:1025B00084E08093E9008091EB0080FF14C080915B
:1025C000EE0087FD03C00FC01092F1008091E8007B
:1025D00085FDFACF8091E80080FF05C08091E8007A
:1025E0008E778093E8009F709093E9001092930299
:1025F000089542E061EC81E00E940B1642E061EC3C
:1026000082E00E940B1642E061EC83E00E940B1610
:1026100042E261EC84E00E940B1642E361E885E04F
:102620000E940B1642E360E886E00C940B16809142
:10263000FD03833009F454C030F4813071F08230EE
:1026400009F0A5C08CC08A3009F479C08B3009F438
:102650005FC0893009F09BC020C08091FC03813AA3
:1026600009F095C08091E800877F8093E800809111
:10267000000490910104892B21F060E080E090E05B
:1026800003C068E089E892E070E00E944415809100
:10269000E8008B778093E80008958091FC038132F5
:1026A00009F075C08091000490910104892B09F014
:1026B0006EC08091E800877F8093E80005C080911C
:1026C000FB03882309F463C08091E80082FFF7CF01
:1026D0008091F100809391028091E8008B7753C044
:1026E0008091FC03813A09F052C0809100049091DE
:1026F0000104892B09F04BC08091E800877F80930B
:10270000E8008091E80080FFFCCF80918A0136C00C
:102710008091FC038132D9F58091000490910104ED
:10272000892BA9F58091E800877F8093E8000E94BB
:1027300042168091FE0380938A010C948B23809132
:10274000FC03813221F58091E800877F8093E800C7
:102750000E9442168091FF03809388020895809121
:10276000FC03813AA1F48091E800877F8093E80020
:102770008091E80080FFFCCF809188028093F10077
:102780008091E8008E778093E8000C9442160895BB
:1027900084E093E00E94181A62E572E184E093E01D
:1027A0000E946E1A68E072E184E093E00E94721A5F
:1027B00084B7877F84BF88E10FB6F8948093600068
:1027C000109260000FBE90E080E80FB6F8948093FE
:1027D0006100909361000FBE0E949C1D0E9495169F
:1027E0000E94F2168091E20084608093E200789467
:1027F0006BEA71E184E093E00E94141A64EA71E1EB
:1028000084E093E00E940C1A6BE771E184E093E0AE
:102810000E94101A0E94370E0E948F190E949E1D5E
:1028200080E891E00E94481D0BC00E946C298091B5
:10283000F903882329F00E949A2981110E9490149B
:102840008091FB03853089F384E093E00E94211C92
:102850000E94A81DF5CF292F332723303105B1F071
:102860004CF42130310509F44DC02230310509F016
:102870004EC007C02132310541F12232310591F1BC
:1028800046C0E0EDF0E08CE594E045C0992781304A
:10289000910569F08230910589F0892B09F037C0E4
:1028A000E8E5F4E0E491F0E088E594E034C0EAE2A1
:1028B000F4E0E491F0E08AE294E02DC0EEEFF3E082
:1028C000E491F0E08EEF93E026C0643000F5E62F4F
:1028D000F0E0EE0FFF1FE550FE4F80819181E9E0AF
:1028E000F0E019C0643098F4E62FF0E0DF01AA0FA1
:1028F000BB1FAD5FBD4F8D919C91E55FFD4FE081AA
:10290000F0E009C0E2E1F0E08CE295E004C0E0E034
:10291000F0E080E090E0DA018D939C93CF01089580
:1029200080E189BD82E189BD09B400FEFDCF8091BF
:10293000D8008F7D8093D8008091E00082608093E2
:10294000E0008091E00081FDFCCF0895BF92CF921E
:10295000DF92EF92FF920F931F93CF93DF937C014F
:102960008B01EA010E946316B82E811133C02097B3
:1029700031F028813981021B130BE20EF31EC12CAA
:10298000D12C23C08091E80085FD15C08091E8001E
:102990008E778093E800209749F0888199818C0D8B
:1029A0009D1D9983888325E0B22E14C00E94631672
:1029B000882359F00EC0F70181917F018093F100C7
:1029C00001501109FFEFCF1ADF0A01151105D1F6E9
:1029D00001C0B82E8B2DDF91CF911F910F91FF90E9
:1029E000EF90DF90CF90BF900895BF92CF92DF928B
:1029F000EF92FF920F931F93CF93DF937C018B0194
:102A0000EA010E946316B82E811133C0209731F07D
:102A100028813981021B130BE20EF31EC12CD12C2D
:102A200023C08091E80085FD15C08091E8008B7778
:102A30008093E800209749F0888199818C0D9D1D35
:102A40009983888345E0B42E14C00E9463168823BE
:102A500059F00EC08091F100F70181937F01015080
:102A60001109FFEFCF1ADF0A01151105D1F601C0D8
:102A7000B82E8B2DDF91CF911F910F91FF90EF908A
:102A8000DF90CF90BF9008954091020450910304CD
:102A90004617570748F06115710539F44091E80071
:102AA0004E774093E80001C0BA01FC0140E033C01A
:102AB0008091FB03882309F444C0853009F443C0A6
:102AC0008091E80083FD41C08091E80082FD33C021
:102AD0008091E80080FF1FC09091F3008091F20088
:102AE000392F20E0A901482BCA0106C0419140932B
:102AF000F1006150710901966115710519F0883076
:102B00009105A0F341E0089709F040E08091E800CA
:102B10008E778093E8006115710551F64111C8CF99
:102B20000AC08091FB03882361F0853061F08091B9
:102B3000E80083FD0AC08091E80082FFF2CF80E0C8
:102B4000089582E0089583E0089581E0089540911A
:102B50000204509103044617570748F061157105A8
:102B600039F44091E8004E774093E80001C0BA0183
:102B7000FC0140E034C08091FB03882309F445C088
:102B8000853009F444C08091E80083FD42C0809103
:102B9000E80082FD34C08091E80080FF20C0909161
:102BA000F3008091F200392F20E0A901482BCA01DF
:102BB00007C044914093F10031966150710901962C
:102BC0006115710519F08830910598F341E0089777
:102BD00009F040E08091E8008E778093E80061156D
:102BE000710549F64111C7CF0AC08091FB038823C4
:102BF00061F0853061F08091E80083FD0AC080912A
:102C0000E80082FFF2CF80E0089582E0089583E03B
:102C1000089581E00895982F2CC09093E9009817AB
:102C200039F07091EC002091ED005091F00003C05C
:102C3000242F762F50E021FD02C09F5F1AC03091F3
:102C4000EB003E7F3093EB003091ED003D7F309301
:102C5000ED003091EB0031603093EB007093EC00AD
:102C60002093ED005093F0002091EE0027FDE5CF7A
:102C700007C0973090F28F708093E90081E008954B
:102C800080E008958091FC0387FD05C08091E800F5
:102C900080FF0EC012C08091E80082FD05C08091C7
:102CA000FB038111F8CF08958091E8008B7708C06D
:102CB0008091FB038111EACF08958091E8008E771F
:102CC0008093E80008958091E4009091E50045E646
:102CD0002091EC0020FD1FC023C02091FB03222384
:102CE00091F0253091F02091EB0025FD10C020914E
:102CF000E4003091E5002817390751F34150C9012C
:102D000039F784E0089582E0089583E0089581E032
:102D1000089580E008952091E80020FFDECFF9CFEC
:102D20002091E80022FFD9CFF4CF0E9403170E9420
:102D30000B17E0EEF0E0808181608083E8EDF0E049
:102D400080818F77808319BCA7EDB0E08C918E7F56
:102D50008C9380818F7E80831092FA0308950F9365
:102D60001F93CF93DF930E9403170E940B17C8EDA8
:102D7000D0E088818F778883888180688883888184
:102D80008F7D888319BC1092FB031092F703109279
:102D9000F9031092F80300EE10E0F80180818B7FB8
:102DA000808388818160888342E060E080E00E94C7
:102DB0000B16E1EEF0E080818E7F8083E2EEF0E0A2
:102DC000808181608083808188608083F801808138
:102DD0008E7F8083888180618883DF91CF911F916E
:102DE0000F910895E8EDF0E080818F7E8083E7ED1C
:102DF000F0E080818160808384E082BF81E0809305
:102E0000FA030C94AF16E8EDF0E080818E7F8083AA
:102E10001092E20008951092DA001092E1000895F5
:102E20001F920F920FB60F9211242F933F934F933F
:102E30005F936F937F938F939F93AF93BF93EF9322
:102E4000FF938091E10082FF0BC08091E20082FF3E
:102E500007C08091E1008B7F8093E1000E94B9124E
:102E60008091DA0080FF1FC08091D80080FF1BC0D6
:102E70008091DA008E7F8093DA008091D90080FF04
:102E80000DC080E189BD82E189BD09B400FEFDCF9E
:102E900081E08093FB030E94A41205C019BC10922C
:102EA000FB030E94B2128091E10080FF19C0809163
:102EB000E20080FF15C08091E2008E7F8093E200E7
:102EC0008091E20080618093E2008091D80080626E
:102ED0008093D80019BC85E08093FB030E94B61252
:102EE0008091E10084FF30C08091E20084FF2CC01B
:102EF00080E189BD82E189BD09B400FEFDCF8091EA
:102F0000D8008F7D8093D8008091E1008F7E8093E0
:102F1000E1008091E2008F7E8093E2008091E200E8
:102F200081608093E2008091F703882311F084E0B0
:102F300007C08091E30087FF02C083E001C081E009
:102F40008093FB030E94B7128091E10083FF29C0A8
:102F50008091E20083FF25C08091E100877F80930C
:102F6000E10082E08093FB031092F7038091E1007F
:102F70008E7F8093E1008091E2008E7F8093E2005B
:102F80008091E20080618093E20042E060E080E0B6
:102F90000E940B168091F00088608093F0000E94E0
:102FA000B512FF91EF91BF91AF919F918F917F915A
:102FB0006F915F914F913F912F910F900FBE0F90A6
:102FC0001F9018951F920F920FB60F9211242F93F6
:102FD0003F934F935F936F937F938F939F93AF93A1
:102FE000BF93CF93EF93FF938091E9008F709091FF
:102FF000EC0090FF02C090E801C090E0C92FC82B00
:103000001092E9008091F000877F8093F00078941F
:103010000E9426181092E9008091F0008860809349
:10302000F000CF70C093E900FF91EF91CF91BF9175
:10303000AF919F918F917F916F915F914F913F9150
:103040002F910F900FBE0F901F9018951F93CF9345
:10305000DF93CDB7DEB7AC970FB6F894DEBF0FBEE7
:10306000CDBFECEFF3E08091F100819324E0E430F8
:10307000F207C9F70E9417138091E80083FF37C158
:103080008091FC039091FD03953009F488C038F4D9
:103090009130B1F170F0933009F029C131C098300E
:1030A00009F4F8C0993009F404C1963009F01FC141
:1030B0009DC0803821F0823809F019C108C0809184
:1030C000F8039091F903992389F082600FC08091F1
:1030D0000004909101048F7099278093E9008091FA
:1030E000EB0085FB882780F91092E9009091E800B9
:1030F000977F9093E8008093F1001092F100D5C083
:10310000882319F0823009F0F2C08F7121F08230EB
:1031100009F0EDC00BC08091FE03813009F0E7C0DB
:10312000933009F080E08093F9032FC08091FE0373
:1031300081112BC080910004909101048F70992718
:10314000009709F4D4C08093E9002091EB0020FFA0
:103150001CC02091FD03233021F48091EB0080629C
:1031600012C09091EB0090619093EB0021E030E071
:1031700001C0220F8A95EAF72093EA001092EA0034
:103180008091EB0088608093EB001092E9008091C1
:10319000E800877F8093E8000E944216A8C0811152
:1031A000A6C08091FE039091FF038F779927182F77
:1031B0009091E3009078982B9093E3008091E80041
:1031C000877F8093E8000E9442168091E80080FF8C
:1031D000FCCF8091E30080688093E300112311F01D
:1031E00083E001C082E08093FB0381C0805882307D
:1031F00008F07DC08091FE039091FF038C3D23E099
:10320000920779F583E08A838AE289834FB7F8943D
:10321000DE01139620E03EE051E2E32FF0E0509310
:103220005700E49120FF03C0E295EF703F5FEF701D
:103230008E2F90E0EA3010F0C79601C0C0968D93B3
:103240009D932F5F243149F74FBF8091E800877F1E
:103250008093E8006AE270E0CE0101960E94441576
:1032600013C0AE01455D5F4F609100040E942B14B6
:103270000097E9F12091E800277F2093E800BC0146
:103280008BA59CA50E94A7158091E8008B77809361
:10329000E8002DC0803859F58091E800877F809341
:1032A000E8008091F7038093F1008091E8008E7729
:1032B00071CF81111CC09091FE039230C0F48091B7
:1032C000E800877F8093E8009093F7030E944216FE
:1032D0008091F703811104C08091E30087FF02C051
:1032E00084E001C081E08093FB030E94F912809189
:1032F000E80083FF0AC08091E800877F8093E800A0
:103300008091EB0080628093EB00AC960FB6F8944E
:10331000DEBF0FBECDBFDF91CF911F910895CF9338
:103320008091FB038823B1F08091E9008F70909128
:10333000EC0090FF02C090E801C090E0C92FC82BBC
:103340001092E9008091E80083FD0E942618CF705A
:10335000C093E900CF910895881F8827881F08959A
:1033600091E0883F08F490E0892F0895982F907F8E
:10337000903B99F038F4903981F0903A71F09038A0
:10338000C9F40BC0903DA1F018F4903C99F410C022
:10339000903E19F0903F71F402C083E00895E82F49
:1033A000E15FEF3038F4F0E0E15FFD4F8081089598
:1033B00082E0089580E008950F932F774F776F7024
:1033C000606BDC01ED91FC91022F242F462F63E00E
:1033D00070E009950F9108950F932F774F776F70D5
:1033E0006069DC01ED91FC91022F242F462F63E0F0
:1033F00070E009950F9108950F932F774F776F70B5
:103400006068DC01ED91FC91022F242F462F63E0D0
:1034100070E009950F910895FC017383628308950C
:10342000FC01738F628F0895FC01758F648F08957E
:10343000CF93DF93EC011DA21FA21EA2BC01685D09
:103440007F4F40EC88519F4F0E94551C1B821A826F
:103450001D821C821F821E82198618861B861A8670
:103460001D861C861F861E86198A188A1B8A1A8A40
:103470001D8A1C8A1F8A1E8A198E188E1B8E1A8E10
:103480001D8E1C8E1F8E1E8E19A218A2DF91CF9149
:103490000895CF92DF92FF920F931F93CF93DF9304
:1034A0001F92CDB7DEB7F62E6A018C0108511F4F6F
:1034B00008C0F60161916F01C80149830E945C1C3C
:1034C00049818C2D841B8F15A0F30F90DF91CF9134
:1034D0001F910F91FF90DF90CF900895FC017183B1
:1034E00060830895FC0171A360A30895AF92BF9219
:1034F000CF92DF92EF92FF920F931F93CF93DF93C0
:1035000000D01F92CDB7DEB77C016B01142FB22E15
:10351000A02EDC0195968C9195978430F1F45A9603
:10352000ED91FC915B97309709F4D8C0CB010197DE
:1035300063E070E00E948834DB01AA0FBB1FA60F76
:10354000B71F49832A830B834C2D4A1B9E012F5F93
:103550003F4FBD01C7010995B1C06230710509F443
:1035600053C06330710529F06130710509F09CC0CA
:1035700083C0842F807F803A01F130F48038B9F025
:10358000803909F0ABC00DC0803EE9F0803F09F101
:10359000803B09F0A3C0D7011296ED91FC911397DF
:1035A00023C0D7011496ED91FC9115971DC0D7014A
:1035B0001696ED91FC91179717C0D7011896ED91CB
:1035C000FC91199711C0D7011A96ED91FC911B97A8
:1035D0000BC0423F09F082C0D7011C96ED91FC91CF
:1035E0001D97309731F47AC0309709F477C0123FB5
:1035F00021F42A2D4B2D62EF04C0612F6F702A2D0C
:103600004B2DC70109955AC0842F807F803D59F00A
:10361000803F79F0803C09F061C0D7011E96ED91A2
:10362000FC911F9719C0D7015096ED91FC915197CD
:1036300013C0433F31F4D7015296ED91FC9153975B
:1036400008C0413F09F04AC0D7015496ED91FC9162
:103650005597309741F442C0309709F43FC0133F6B
:1036600011F0113F19F44B2D612F03C0612F6F70C2
:103670004B2DC701099522C0842F0E94B0198823C1
:1036800031F0D7015696ED91FC91579707C0163F40
:1036900029F5D7015896ED91FC9159973097F1F0A3
:1036A000612FC70109950AC064307105A8F416C0DE
:1036B0000A2D2B2D412FB601C7010995D7015E9622
:1036C000ED91FC915F97309789F00A2D2B2D412FBA
:1036D000B601C70109950AC0C12CD12CD7015C964F
:1036E000ED91FC915D97309719F7E8CF0F900F900F
:1036F0000F90DF91CF911F910F91FF90EF90DF908E
:10370000CF90BF90AF900895EF92FF920F931F93C9
:10371000CF93DF93EC01162F862F0E94B0198823D8
:1037200069F0FDA081E08DA300E020E0412F61E081
:1037300070E0CE010E94761AFDA27CC0812F0E940B
:10374000AC194DA1882309F440C0443029F01AA3D4
:1037500021E030E03FA32EA3812F0E94B6198130D3
:1037600031F070F0823051F0833059F507C08DA3ED
:1037700000E020E0412F61E070E01EC08DA35AC040
:10378000103F19F0173FE9F404C084E08DA31AA399
:103790003FC02EA13FA1C90163E070E00E948834C0
:1037A0008C0F9D1FFC0112A3B9016F5F7F4F7FA398
:1037B0006EA30CA12BA14AA1CE010E94761A1DA2D4
:1037C00039C01DA21FA21EA235C0442399F12EA10B
:1037D0003FA1C90163E070E00E9488347C01FE01D2
:1037E000E80FF91F12A3B9016F5F7F4F7FA36EA38C
:1037F0008130910591F082E0E816F104D9F40CA132
:103800002BA14AA1CE010E94761A8DA1843091F09D
:1038100081E090E09FA38EA30DC0423059F400E0F8
:103820002BA14AA1CE010E94761A8DA1843011F0FD
:10383000FFA2EEA2DF91CF911F910F91FF90EF9029
:103840000895CF92DF92EF92FF920F931F93CF9341
:10385000DF93EC01E8A1F9A1309709F009958E01F9
:1038600008511F4FC8010E948E1CE12CF12CC82E5C
:10387000D12C0FC060E0C8010E94A21C682FCE01AD
:103880000E94841B61E0C8010E94B31C8FEFE81AFC
:10389000F80AEC14FD0470F3DF91CF911F910F91A2
:1038A000FF90EF90DF90CF900895FC0142837483E6
:1038B00063831182108208950F931F93CF93DF9338
:1038C000EC01062F0E94D41C182F298130E0C90179
:1038D00001966A8170E00E949C34488150E0841710
:1038E000950729F4812F0E94D71C80E012C0EB813C
:1038F000FC81E20FF31F00832981822F90E0019663
:103900006A8170E00E949C348983812F0E94D71CB9
:1039100081E0DF91CF911F910F910895CF93DF93B5
:10392000EC010E94D41C29819881291710F0C22F24
:1039300002C0CA81C20FC91B0E94D71C8C2FDF9105
:10394000CF910895FC012081862F90E0820F911D78
:10395000628170E00E949C340380F481E02DE80FC6
:10396000F91F808108950F931F93CF93DF931F92C8
:10397000CDB7DEB78C0169830E94D41C482FF801B3
:1039800080816981262F30E0280F311D6281C901B5
:1039900070E00E949C348083842F0F90DF91CF9140
:1039A0001F910F910C94D71C8FB7F89408958FBF77
:1039B0000895FC01CB012091FB032430B1F4218157
:1039C0002F702093E90040E050E064E070E00E9436
:1039D000A61481110BC09091E80095FD07C090914D
:1039E000E8009E779093E800089582E00895209182
:1039F000FB032430A9F4FC0181818F708093E900DE
:103A00003091F3002091F200932F80E0822B892BDC
:103A100049F08091E8008E778093E8000C9463165B
:103A200082E0089580E008952091FB03243051F452
:103A3000FC0121812F702093E9002091E80020FDF6
:103A40000C94F71C0895FC01CB012091FB0324305A
:103A500011F080E0089526812F702093E9002091D5
:103A6000E80022FFF6CF2091E80025FFF2CF40E0EA
:103A700050E064E070E00E94F5148091E80085FD5C
:103A800005C08091E8008B778093E80081E008957D
:103A900090939502809394020895E0919402F0919E
:103AA0009502309721F00190F081E02D099480E09B
:103AB0000895E0919402F0919502309721F00280F0
:103AC000F381E02D09940895E0919402F09195021C
:103AD000309721F00480F581E02D0994089520911C
:103AE0009602309197028217930771F09093970294
:103AF00080939602E0919402F0919502309721F024
:103B00000680F781E02D0994089520919802309164
:103B100099028217930771F090939902809398020B
:103B2000E0919402F0919502309721F00084F185A4
:103B3000E02D0994089508950C949B1D0E94E62998
:103B40000E94F3060E94BA2A0C9465300C942C064D
:103B50005F926F927F928F929F92AF92BF92CF921D
:103B6000DF92EF92FF920F931F93CF93DF93CDB726
:103B7000DEB72A970FB6F894DEBF0FBECDBF0E9406
:103B8000E9079AE9C92E92E0D92E00E010E0AA24B4
:103B9000A394B12C502E802F0E9439093C01F601CC
:103BA000E190F1906F01E826F926E114F10431F477
:103BB0000F5F1F4F0530110569F73AC08091F10280
:103BC00081FD0E94420920E030E04501022E02C042
:103BD000880C991C0A94E2F7C4018E219F21892B3D
:103BE00009F12E835F826820792081E0672809F43B
:103BF00080E088870E94EF298160782F9A878987E3
:103C00004E815F8168858A850E94611EF801EE0FF2
:103C1000FF1FE656FD4F808191818825992591836C
:103C2000808316C02F5F3F4F2C30310571F6C0CF17
:103C30008FEF89838A831B820E94EF298160782F0E
:103C40009D838C8349815A816B818D810E94611E85
:103C50000E94A72D1091A4020E944D1D1817D9F0A3
:103C60000E944D1D8093A4022A960FB6F894DEBFE1
:103C70000FBECDBFDF91CF911F910F91FF90EF90BD
:103C8000DF90CF90BF90AF909F908F907F906F907C
:103C90005F900C94A61D2A960FB6F894DEBF0FBE57
:103CA000CDBFDF91CF911F910F91FF90EF90DF90EB
:103CB000CF90BF90AF909F908F907F906F905F90CC
:103CC0000895CF93DF93CDB7DEB72B970FB6F89457
:103CD000DEBF0FBECDBF4F83588769877A878B873A
:103CE000DE01119686E0FD0111928A95E9F785E0E3
:103CF000FE01379601900D928A95E1F749815A812C
:103D00006B817C818D819E810E944A262B960FB605
:103D1000F894DEBF0FBECDBFDF91CF910895089517
:103D2000CF93C82F882309F4C1C0823859F40E9468
:103D30004D1D81FDBBC089E30E94B1280E943D2931
:103D400089E30CC0833879F40E944D1D80FDAEC01C
:103D500083E50E94B1280E943D2983E50E94D32873
:103D6000CF910C943D29843859F40E944D1D82FD59
:103D70009DC087E40E94B1280E943D2987E4EECFD0
:103D80008450813A48F48C2F0E94C72F81118EC035
:103D90008C2F0E94B128E4CF8C2F805E883050F4A5
:103DA000C77081E090E001C0880FCA95EAF70E94D1
:103DB000F428D6CF8C2F855A833078F4C53A29F071
:103DC000C63A31F482E890E005C081E890E002C094
:103DD00083E890E0CF910C946F1D8C2F885A83312B
:103DE00008F064C0C83A39F1C93A41F1CA3A49F118
:103DF000CB3A51F1CC3A59F1CD3A61F1C03B69F17E
:103E0000CE3A71F1CF3A79F1C13B81F1C23B89F1F0
:103E1000C33B91F1C43B99F1C53BA1F1C63BA9F16C
:103E2000C73BB1F1C83BB9F1C93BC1F1CA3BC9F5C8
:103E30008AE292E038C082EE90E035C089EE90E0F0
:103E400032C08AEE90E02FC085EB90E02CC086EB6C
:103E500090E029C087EB90E026C08CEC90E023C076
:103E60008DEC90E020C083E891E01DC08AE891E0ED
:103E70001AC082E991E017C084E991E014C081E2A0
:103E800092E011C083E292E00EC084E292E00BC0A7
:103E900085E292E008C086E292E005C087E292E007
:103EA00002C080E090E0CF910C94851DCF910895E1
:103EB000882309F44DC0823859F40E944D1D81FFBA
:103EC00047C089E30E94B1280E943D2989E30CC0C4
:103ED000833871F40E944D1D80FF3AC083E50E9433
:103EE000B1280E943D2983E50E94D3280C943D29E6
:103EF000843859F40E944D1D82FF2AC087E40E9435
:103F0000B1280E943D2987E4EFCF982F9450913A31
:103F100008F4EACF982F905E983058F4282F277035
:103F200081E090E001C0880F2A95EAF70E94FA2804
:103F3000DDCF982F955A933020F480E090E00C94D8
:103F40006F1D885A833120F480E090E00C94851D29
:103F50000895882321F00E94F4280C943D290895A7
:103F6000882321F00E94FA280C943D290895BF92DD
:103F7000CF92DF92EF92FF920F931F93CF93DF9335
:103F8000CDB7DEB727970FB6F894DEBF0FBECDBF13
:103F90008C0185E0F801DE01119601900D928A9561
:103FA000E1F7F801D080E180F280558152955F7091
:103FB00083819481892B41F0FFEFEF1208C081E0EB
:103FC00090E0DF1631F003C081E090E002C080E0B5
:103FD00090E080FD7CC3C8015E830E948F1ED98261
:103FE000EA8289819A810E946E28B92E8F830E946D
:103FF0006D280E9495275E816F81FF2021F00E942D
:1040000011296F815E812B2D22952F7030E0253094
:10401000310509F4E6C06CF4243031050CF0A2C07F
:104020004B2D407F8B2D8F70223031050CF045C019
:1040300017C02C3031054CF42A3031050CF0E7C1A3
:104040002830310509F043C3E5C02D30310509F4AE
:10405000BAC20CF4A2C22F30310509F038C323C311
:10406000182F411101C002C01295107FFF2059F096
:10407000112309F46BC2812F6F830E9404290E94CF
:104080003D296F8163C2862F0E94581F112309F4B6
:104090001EC3812F0E940A2927960FB6F894DEBF0F
:1040A0000FBECDBFDF91CF911F910F91FF90EF9089
:1040B000DF90CF90BF900C943D29403211F0829553
:1040C000807F662319F0613071F523C0FF20B1F0C5
:1040D000511101C032C0513081F527960FB6F894C6
:1040E000DEBF0FBECDBFDF91CF911F910F91FF902B
:1040F000EF90DF90CF90BF900C942429511101C014
:1041000003C0513009F4E3C28E830E9427298E81B7
:104110009AC1FF2021F0563008F0D9C20EC05530A8
:1041200008F0D5C290C1FF20C9F0552331F0F80145
:10413000958190FF0BC29F70958327960FB6F894D8
:10414000DEBF0FBECDBFDF91CF911F910F91FF90CA
:10415000EF90DF90CF90BF900C94A91F552309F4E6
:1041600072C109C22B2D26952695237030E02115AA
:10417000310529F02130310509F0A9C219C0FF200D
:1041800021F0862F9B2D937002C080E090E027964F
:104190000FB6F894DEBF0FBECDBFDF91CF911F9158
:1041A0000F91FF90EF90DF90CF90BF900C946F1D18
:1041B000FF2021F0862F9B2D937002C080E090E0BD
:1041C00027960FB6F894DEBF0FBECDBFDF91CF911B
:1041D0001F910F91FF90EF90DF90CF90BF900C94C4
:1041E000851D862FFF2019F00E94AD2C02C00E9471
:1041F000152D27960FB6F894DEBF0FBECDBFDF9109
:10420000CF911F910F91FF90EF90DF90CF90BF90D3
:104210000C949C2D8B2D837009F079C0F11057C23E
:10422000262F229526952770220F220F862F8F701A
:10423000C82ED12CE12CF12C022E04C0CC0CDD1C9C
:10424000EE1CFF1C0A94D2F764FF10C06FE070E010
:1042500080E090E004C0660F771F881F991F2A95A1
:10426000D2F7609570958095909503C060E070E0FE
:10427000CB012B2D269526952370422F50E04230FE
:104280005105D9F04330510569F16C297D298E29FA
:104290009F294130510551F127960FB6F894DEBFA2
:1042A0000FBECDBFDF91CF911F910F91FF90EF9087
:1042B000DF90CF90BF900C94AA276C297D298E297E
:1042C0009F2927960FB6F894DEBF0FBECDBFDF91B2
:1042D000CF911F910F91FF90EF90DF90CF90BF9003
:1042E0000C94BC270E94AA27C701B60127960FB6D7
:1042F000F894DEBF0FBECDBFDF91CF911F910F911C
:10430000FF90EF90DF90CF90BF900C949827FF2004
:1043100019F08B2D817001C08695882309F4D7C1CF
:10432000262F229526952770220F220F862F8F7019
:10433000C82ED12CE12CF12C022E04C0CC0CDD1C9B
:10434000EE1CFF1C0A94D2F764FF10C06FE070E00F
:1043500080E090E004C0660F771F881F991F2A95A0
:10436000D2F7609570958095909503C060E070E0FD
:10437000CB012B2D269526952370422F50E04230FD
:104380005105D9F04330510569F16C297D298E29F9
:104390009F294130510551F127960FB6F894DEBFA1
:1043A0000FBECDBFDF91CF911F910F91FF90EF9086
:1043B000DF90CF90BF900C9449286C297D298E29DD
:1043C0009F2927960FB6F894DEBF0FBECDBFDF91B1
:1043D000CF911F910F91FF90EF90DF90CF90BF9002
:1043E0000C945B280E944928C701B60127960FB696
:1043F000F894DEBF0FBECDBFDF91CF911F910F911B
:10440000FF90EF90DF90CF90BF900C943728603FE3
:1044100059F120F4603E08F494C008C0623F09F4EA
:1044200067C0F0F1633F09F08CC065C0162F1F70A4
:104430008B2D8F71FF2021F00E94E227812F7DCEEE
:104440000E94FD27812F27960FB6F894DEBF0FBE7E
:10445000CDBFDF91CF911F910F91FF90EF90DF9033
:10446000CF90BF900C94B01FFF20B1F0553008F0F2
:104470002EC18B2D8F7127960FB6F894DEBF0FBE1D
:10448000CDBFDF91CF911F910F91FF90EF90DF9003
:10449000CF90BF900C941C28563008F018C1E9CF7B
:1044A000FF2099F08B2D8F7127960FB6F894DEBF01
:1044B0000FBECDBFDF91CF911F910F91FF90EF9075
:1044C000DF90CF90BF900C94E2278B2D8F712796B1
:1044D0000FB6F894DEBF0FBECDBFDF91CF911F9115
:1044E0000F91FF90EF90DF90CF90BF900C94FD273D
:1044F000F110EBCFD7CFFF2099F08B2D8F7127963E
:104500000FB6F894DEBF0FBECDBFDF91CF911F91E4
:104510000F91FF90EF90DF90CF90BF900C94D32736
:1045200027960FB6F894DEBF0FBECDBFDF91CF91B7
:104530001F910F91FF90EF90DF90CF90BF900C9460
:10454000CE27FF20A9F0552309F4ACCF862F27965C
:104550000FB6F894DEBF0FBECDBFDF91CF911F9194
:104560000F91FF90EF90DF90CF90BF900C94901E32
:10457000552309F4AACF862F27960FB6F894DEBFED
:104580000FBECDBFDF91CF911F910F91FF90EF90A4
:10459000DF90CF90BF900C94581F4B2D4F70C801E7
:1045A0000E94560327960FB6F894DEBF0FBECDBF0C
:1045B000DF91CF911F910F91FF90EF90DF90CF90FF
:1045C000BF900C940027F11082C09B2D9F70492F43
:1045D00050E04230510599F144F44115510569F01C
:1045E0004130510509F073C019C043305105C1F184
:1045F0004430510509F06BC044C027960FB6F894BB
:10460000DEBF0FBECDBFDF91CF911F910F91FF9005
:10461000EF90DF90CF90BF900C94763027960FB636
:10462000F894DEBF0FBECDBFDF91CF911F910F91E8
:10463000FF90EF90DF90CF90BF900C948D30279635
:104640000FB6F894DEBF0FBECDBFDF91CF911F91A3
:104650000F91FF90EF90DF90CF90BF900C94A93016
:1046600027960FB6F894DEBF0FBECDBFDF91CF9176
:104670001F910F91FF90EF90DF90CF90BF900C941F
:10468000BC30862F27960FB6F894DEBF0FBECDBF85
:10469000DF91CF911F910F91FF90EF90DF90CF901E
:1046A000BF900C94E0304B2D4F70C80127960FB689
:1046B000F894DEBF0FBECDBFDF91CF911F910F9158
:1046C000FF90EF90DF90CF90BF900C944309279616
:1046D0000FB6F894DEBF0FBECDBFDF91CF911F9113
:1046E0000F91FF90EF90DF90CF90BF9008950E94C0
:1046F00011290E9421290E94E6280E943D290E943A
:10470000482E0E949C2D80E090E00E946F1D80E06A
:1047100090E00C94851D0E9401290C9477230E943F
:104720006E28292F22952F7030E02C3031054CF463
:104730002A3031056CF4225031092230310590F4D1
:1047400007C02C30310551F02F30310559F406C027
:10475000803E10F0803F31F481E0089593FB88277C
:1047600080F9089580E00895CF93DF9300D000D0C2
:104770001F92CDB7DEB70F900F900F900F900F9054
:10478000DF91CF910895CF93DF9300D000D000D078
:10479000CDB7DEB726960FB6F894DEBF0FBECDBFFD
:1047A000DF91CF9108951F93CF93DF93C091DB02E8
:1047B00016E012C0D0E01C9FF0011D9FF00D1124E7
:1047C000E555FD4F408151816281738184819581DE
:1047D0000E94C3232196C7708091DC02C813EACFE0
:1047E000DF91CF911F9108954091A5025091A602AB
:1047F0006091A7027091A8028091A9029091AA02EB
:104800000C94C3230F931F93CF93DF938091AA023D
:1048100082958F7009F069C08091A702882309F4FE
:1048200064C0A091DB02D091DC02B091A502C091DE
:10483000A6028091A8029091A90221E030E0BF3F3A
:1048400011F020E030E0122FBC016095709506E079
:104850004AC0009721F0CF3F29F4212F05C021E065
:1048600030E002C020E030E020FD3BC04A2F50E0A5
:10487000049FF001059FF00D1124E555FD4F2181A6
:10488000C2132FC02081B2132CC02281211129C054
:10489000238134812817390718F0281B390B02C0EF
:1048A000260F371F283C3105E0F48091AA028F7053
:1048B00080618093AA0286E0849FF001859FF00DBD
:1048C0001124E055FD4F80818F708061808385EADF
:1048D00092E00E94B71FDF91CF911F910F910C942E
:1048E000D323AF5FA770AD13B4CFDF91CF911F91EA
:1048F0000F910895EF92FF920F931F93CF93DF9341
:10490000CDB7DEB762970FB6F894DEBF0FBECDBF4E
:104910008C0185E0F801DE011D9601900D928A95CB
:10492000E1F7D8014C9111965C91119712966C9118
:1049300012971396ED90FC9014977091A502E09158
:10494000A6028091A8029091A902009739F0EF3F4A
:1049500041F421E030E07F3F31F003C021E030E05E
:1049600002C020E030E020FD5CC12091A70222239C
:1049700009F4F1C0E816F90628F09701281B390B55
:10498000C90104C0809590958E0D9F1D883C9105AE
:1049900008F098C08091AA02982F907F09F064C017
:1049A000E51314C0741312C0611110C08F708061C0
:1049B0008093AA020E94F42385EA92E00E94B71F26
:1049C0008091AA02D80115968C9343C1EF2839F043
:1049D0005F3F41F481E090E04F3F31F003C081E060
:1049E00090E002C080E090E080FD03C081E0862777
:1049F00002C080E090E080FF2EC08091DB02209119
:104A0000DC0236E013C090E0389FF001399FF00DD2
:104A10001124E555FD4F7181571306C0708147136E
:104A200003C07281671317C0019687708213EBCFA2
:104A300012C19F7059F0882309F40BC107C09F7001
:104A400029F0F8019581907F09F403C1805E8830D8
:104A500008F4FFC0D2C0662309F4FBC08091AA020B
:104A600081608093AA02F5C0E51308C0741306C0E4
:104A7000611104C0D80115968C939DC04D875E8747
:104A80008D859E856A8B0E948F236A89882309F40D
:104A9000B4C0662309F4B1C02091AA02822F829586
:104AA0008F7090E002970CF4C6C08091A50290919F
:104AB000A60298878F831986FB86EA862C87CE010B
:104AC000079646C08091AA02982F907F59F47E2DB8
:104AD000F98AE88A89890E94B42385EA92E00E94D3
:104AE000B71F95C0E51311C074130FC061110DC03D
:104AF000F8018583C8010E94B71FE5EAF2E086E06D
:104B0000DF011D928A95E9F7A2C04D875E878D85EA
:104B10009E856A8B0E948F236A89882309F46DC061
:104B2000662309F46AC02091AA02822F82958F70B1
:104B300090E002970CF47FC08091A5029091A602AC
:104B40009A8389831B82FD82EC822E83CE0101969B
:104B50000E94B71F70C0E816F90628F09701281BBD
:104B6000390BC90104C0809590958E0D9F1D883C1E
:104B7000910508F046C0662309F43FC0E51330C034
:104B800074132EC02091AA0220FD21C0322F32952D
:104B90003F70832F90E00097D1F0D80115962C93A9
:104BA00015970F9741F0832F8F5F8295807F2F702D
:104BB000282B15962C93C8010E94B71F86E0F80198
:104BC000A5EAB2E001900D928A95E1F73EC086E039
:104BD000F801A5EAB2E001900D928A95E1F737C09D
:104BE0004D875E878D859E850E948F23811123C00E
:104BF0008091AA0281608093AA02C8010E94B71F17
:104C000026C07E2DF98AE88A89890E94B423E5EAC4
:104C1000F2E086E0DF011D928A95E9F70E94F42315
:104C200018C0662351F34D875E878D859E850E944F
:104C30008F23882311F386E0F801A5EAB2E0019002
:104C40000D928A95E1F70E9402240E94F42381E0EC
:104C500014C080E012C04D875E878D859E850E94BE
:104C60006E28292F22952F7030E0223031050CF468
:104C7000E0CE243031050CF6E2CE62960FB6F89401
:104C8000DEBF0FBECDBFDF91CF911F910F91FF907F
:104C9000EF9008951F93CF93DF93CDB7DEB72C9796
:104CA0000FB6F894DEBF0FBECDBF4F83588769871C
:104CB0007A878B879C87CE0107960E947A24882367
:104CC000D9F02F8138858A859B85892B39F03F3F24
:104CD00019F080E090E004C02F3FD9F781E090E028
:104CE000892B09F06DC04F81588569857A858B8540
:104CF0009C850E94C32364C086E0FE013796DE01D6
:104D0000119601900D928A95E1F7FF81E8854A8519
:104D10005B854115510539F0EF3F41F481E090E0AA
:104D2000FF3F31F003C081E090E002C080E090E0FE
:104D300080FD46C02091DC0230E0C90101968770F9
:104D400099276091DB0270E08617970709F440C04D
:104D5000F983EA835D834C8396E0929FD001939F11
:104D6000B00D1124A555BD4FFE01319601900D9255
:104D70009A95E1F78093DC020E94D32321C0189F0B
:104D8000C001112485559D4F0E947A24882371F11A
:104D9000E091DB021E9FF0011124E555FD4F40819B
:104DA000518162817381848195810E94C3238091A6
:104DB000DB0290E00196877099278093DB0201C0A7
:104DC00016E08091DB029091DC028913D8CF0EC0EF
:104DD0000E948B231092DC021092DB02E5EAF2E0E3
:104DE00086E0DF011D928A95E9F7EACF2C960FB68F
:104DF000F894DEBF0FBECDBFDF91CF911F91089514
:104E0000DF92EF92FF920F931F93CF93DF93EC010A
:104E1000009709F46EC0D12CEE24E394F12C8E019E
:104E20000F5F1F4FFE018491843748F4843008F0EF
:104E30004CC0813071F0823009F05BC01EC08537F4
:104E400009F43FC080F1982F9458903708F051C072
:104E50003FC02296F8018491982F905E983050F4CC
:104E60008770FE2D01C0FF0F8A95EAF78F2F0E94F1
:104E7000142913C00E94901E2FC02296F80184911D
:104E8000982F905E983060F48770FE2D01C0FF0F60
:104E90008A95EAF78F2F0E941A290E943D291CC08B
:104EA0000E94581F19C02296F801049107C08FE98B
:104EB0009FE00197F1F700C0000001500111F7CF0A
:104EC0000BC02296F801D49007C00E94901E03C028
:104ED0008F770E94581FE8018D2D07C08150EFE9A0
:104EE000FFE03197F1F700C00000882309F497CF65
:104EF000F5CFDF91CF911F910F91FF90EF90DF9051
:104F000008956093E1027093E2028093E30290932C
:104F1000E4020C9477236093DD027093DE028093A9
:104F2000DF029093E0020C94772308950C9481277C
:104F30000F931F930091E1021091E2022091E3028E
:104F40003091E402602B712B822B932B1F910F91D8
:104F50000C9481270F931F930091E1021091E202BC
:104F60002091E3023091E402602371238223932392
:104F70001F910F910C9481270F931F930091E102D1
:104F80001091E2022091E3023091E4026027712740
:104F9000822793271F910F910C94812760E070E086
:104FA000CB010C948B2741E050E060E070E004C03E
:104FB000440F551F661F771F8A95D2F7CB01BA01A0
:104FC0000C948B2741E050E060E070E004C0440F97
:104FD000551F661F771F8A95D2F78091DD02909149
:104FE000DE02A091DF02B091E002482B592B6A2B20
:104FF0007B2BCB01BA010C948B2741E050E060E0A1
:1050000070E004C0440F551F661F771F8A95D2F7C2
:1050100040955095609570958091DD029091DE02EB
:10502000A091DF02B091E002482359236A237B2339
:10503000CB01BA010C948B2741E050E060E070E0B6
:1050400004C0440F551F661F771F8A95D2F78091C1
:10505000DD029091DE02A091DF02B091E0024827CC
:1050600059276A277B27CB01BA010C948B270F9312
:105070001F930091DD021091DE022091DF0230913A
:10508000E002602B712B822B932B1F910F910C94BC
:105090008B270F931F930091DD021091DE02209168
:1050A000DF023091E00260237123822393231F915A
:1050B0000F910C948B270F931F930091DD02109199
:1050C000DE022091DF023091E00260277127822703
:1050D00093271F910F910C948B270895CF92DF9205
:1050E000EF92FF920F931F93CF93DF93EC01C09049
:1050F000E102D090E202E090E302F090E4028091BD
:10510000DD029091DE02A091DF02B091E002C82A98
:10511000D92AEA2AFB2A0FE110E0B701A601002EE6
:1051200004C076956795579547950A94D2F740FF46
:1051300008C0BE01802F0E94B3048130910509F0A0
:1051400007C00150110948F7BE0180E00E94B30476
:10515000DF91CF911F910F91FF90EF90DF90CF9053
:10516000089540918B0150918C0120E030E09FEF39
:10517000FA01E20FF31F62816817A1F09F3F19F453
:10518000611101C0922F2F5F3F4F2630310581F70B
:1051900007C0FA01E90FF11D97FDFA958283089582
:1051A0009F3FB9F7089540918B0150918C0120E009
:1051B00030E0FA01E20FF31F9281981301C01282CE
:1051C0002F5F3F4F26303105A1F7089581E090E031
:1051D000E0918B01F0918C01E80FF91F108201968C
:1051E00088309105A9F708959091E502982B909346
:1051F000E502089580959091E50298239093E50249
:1052000008951092E50208959091E602982B9093EC
:10521000E602089580959091E60298239093E60225
:1052200008951092E60208959091E702982B9093CA
:10523000E702089580959091E70298239093E70202
:1052400008951092E70208958093E802089510925D
:10525000E802089540918B0150918C0120E030E0EC
:1052600080E0FA01E20FF31F918191118F5F2F5FB0
:105270003F4F27303105A9F70895E0918B01F09158
:105280008C018091E5028083E0918B01F0918C018B
:1052900080819091E602892B8083E0918B01F091CF
:1052A0008C0180819091E702892B80839091E802A4
:1052B000992361F0E0918B01F0918C018081892B21
:1052C00080830E942A2981110E94272980918B01C5
:1052D00090918C010C94591D8091FB03843039F11D
:1052E0001092F20220E488E190E00FB6F894A895BD
:1052F000809360000FBE2093600080E00E949B03BB
:1053000080E00E942C0683B7817F846083BF83B7CF
:10531000816083BF7894889583B78E7F83BF88E14F
:105320000FB6F89480936000109260000FBE08954D
:1053300008950895CF9380E00E949B030E949829CE
:105340000E94E9070E949929C0E08C2F0E94390928
:10535000892B29F4CF5FC530C1F780E001C081E01F
:10536000CF9108950E948B2380E00E949B030E94AE
:1053700065300E944D1D0C942C061F920F920FB6A3
:105380000F9211248F939F93AF93BF938091F2025A
:10539000811113C08091F3029091F402A091F50263
:1053A000B091F6024196A11DB11D8093F302909336
:1053B000F402A093F502B093F602BF91AF919F91D2
:1053C0008F910F900FBE0F901F90189582E084BDB3
:1053D00093E095BD9AEF97BD80936E0008958FB7C7
:1053E000F8944091F3025091F4026091F5027091AB
:1053F000F6028FBFCA010895CF92DF92EF92FF921B
:105400000F931F932FB7F8944091F3025091F40239
:105410006091F5027091F6022FBF6A017B01EE24C4
:10542000FF248C0120E030E0C016D106E206F3062E
:1054300020F09A01281B390B05C09C01209530955E
:10544000240F351FC9011F910F91FF90EF90DF903E
:10545000CF9008951F920F920FB60F9211248F9341
:105460009F93AF93BF938091F3029091F402A09128
:10547000F502B091F6020196A11DB11D8093F302D1
:105480009093F402A093F502B093F602BF91AF910E
:105490009F918F910F900FBE0F901F9018950E94B3
:1054A0009516F8942FEF87EA91E6215080409040BE
:1054B000E1F700C0000087E090EBDC018093050479
:1054C00090930604A0930704B09308042CE088E1AD
:1054D00090E00FB6F894A895809360000FBE2093DB
:1054E0006000FFCFCF92DF92EF92FF920F931F9356
:1054F000CF93DF93C82ED12C01E010E08D2D0E94B8
:1055000039097C01C0E0D0E098010C2E02C0220FC6
:10551000331F0A94E2F72E213F21232B29F42196F1
:10552000CC30D10589F708C06C2F7D2D80E00E941A
:105530008E04C812F4CF06C0D39485E0D812DECF13
:1055400080E001C081E0DF91CF911F910F91FF902A
:10555000EF90DF90CF900895CF93C82F8CE20E94F8
:10556000722A882321F08C2FCF910C94722A80E02C
:10557000CF910895CF930E94FD2B811102C00E940C
:10558000DE2BC5E608C00E94E9078FE39CE901977E
:10559000F1F700C00000C150B1F789E20E94AC2AC7
:1055A00081110AC18AE20E94AC2A81110E94DE2B7D
:1055B00085E00E94AC2A81110E944F2A0E94082C8B
:1055C0008093F10287E00E94AC2A882399F18BE155
:1055D0000E94AC2A882351F09091F10291FB882718
:1055E00080F921E0822780FB91F922C08EE00E94A1
:1055F000AC2A882351F09091F10292FB882780F920
:1056000021E0822780FB92F913C080E10E94AC2A3E
:105610009091F102882341F093FB882780F921E0E3
:10562000822780FB93F904C0892F809580FB90F935
:105630009093F1028091F1020E940C2C0E941A2C8E
:105640008093020380EE0E94AC2A882341F080916F
:105650000203982F909590FB80F98093020389E3D1
:105660000E94AC2A882359F09091020391FB88276D
:1056700080F921E0822780FB91F99093020382EE6A
:105680000E94AC2A882359F09091020392FB88274C
:1056900080F921E0822780FB92F99093020386EE45
:1056A0000E94AC2A882359F09091020393FB88272B
:1056B00080F921E0822780FB93F99093020383EE27
:1056C0000E94AC2A882359F09091020394FB88270A
:1056D00080F921E0822780FB94F99093020385E30F
:1056E0000E94AC2A882359F09091020395FB8827E9
:1056F00080F921E0822780FB95F99093020381E3F2
:105700000E94AC2A882359F09091020396FB8827C7
:1057100080F921E0822780FB96F99093020381E1D2
:105720000E94AC2A882359F09091020397FB8827A6
:1057300080F921E0822780FB97F990930203809102
:1057400002030E941E2C87E20E94AC2AC82F8EE121
:105750000E94AC2A8111C2608FE10E94AC2A8111A3
:10576000C46080E20E94AC2A8111C86081E20E947C
:10577000AC2A8111C06182E20E94AC2A8111C06210
:1057800083E20E94AC2A8111C06484E20E94AC2AA8
:10579000882311F0C06802C0CC2329F08C2F0E940E
:1057A000152C6C2F03C00E94112C682F70E080E034
:1057B00090E0CF910C949627CF9108956DEE7EEFF7
:1057C00080E090E00E94CC3460E082E090E00E94B3
:1057D000BE3460E083E090E00E94BE3460E084E08C
:1057E00090E00E94BE3460E085E090E00E94BE340C
:1057F00060E086E090E00C94BE3480E090E00E948F
:10580000B83421E08D3E9E4F09F020E0822F0895AC
:1058100082E090E00C94B034682F82E090E00C9429
:10582000BE3483E090E00C94B034682F83E090E0C5
:105830000C94BE3484E090E00C94B034682F84E083
:1058400090E00C94BE3486E090E00C94B034682F65
:1058500086E090E00C94BE348091FF0280FF0BC084
:105860006091900185E0689FB0011124759567955E
:10587000759567952AC081FF09C06091900185E008
:10588000689FB0011124759567951FC082FF07C0FE
:105890006091900185E0689FB001112416C040918D
:1058A000F9024423C9F060918F01461788F72091CF
:1058B000900185E0289F90011124429FC001439FE1
:1058C000900D112470E00E949C346038710540F402
:1058D0006115710539F002C065E070E0862F08950A
:1058E0008FE7089581E008958091FF0280FF08C04E
:1058F00060918E0170E0759567957595679521C0EB
:1059000081FF06C060918E0170E07595679519C0A2
:1059100082FF04C060918E0170E010C08091F90296
:105920008823C1F060918D018617A0F790918E01B8
:10593000989FC001112470E00E949C34603871056A
:1059400028F46115710521F0862F08958FE70895D9
:1059500081E0089561E070E0F4CF803F21F40E947F
:105960002C2C819504C0813F29F40E942C2C80931B
:10597000FC020895823F21F40E942C2C819504C0E2
:10598000833F29F40E942C2C8093FB020895893FC9
:1059900019F40E94742C05C08A3F31F40E94742CC3
:1059A00081958093FD0208958B3F21F40E94742C11
:1059B000819504C08C3F29F40E94742C8093FE02D0
:1059C0000895843F21F48091FA02816017C0853FD9
:1059D00021F48091FA02826011C0863F21F4809107
:1059E000FA0284600BC0873F21F48091FA0288603C
:1059F00005C0883F31F48091FA0280618093FA02F9
:105A000008958D3F21F48091FF0281600BC08E3F8D
:105A100021F48091FF02826005C08F3F29F48091BC
:105A2000FF0284608093FF020895803F29F48091F3
:105A3000FC0287FF6EC007C0813F41F48091FC02E9
:105A400018160CF066C01092FC0263C09091FB0225
:105A5000823F19F497FF5DC005C0833F31F41916EA
:105A60000CF057C01092FB0254C0893F31F4809172
:105A7000FD0218160CF04DC006C08A3F39F4809123
:105A8000FD0287FF46C01092FD0243C08B3F29F400
:105A90008091FE0287FF3DC006C08C3F39F48091A3
:105AA000FE021816B4F51092FE0233C0843F21F4B2
:105AB0008091FA028E7F05C0853F31F48091FA0211
:105AC0008D7F8093FA0225C0863F21F48091FA02EF
:105AD0008B7FF7CF873F21F48091FA02877FF1CF48
:105AE000883F21F48091FA028F7EEBCF8D3F21F425
:105AF0008091FF028E7F0BC08E3F21F48091FF02C8
:105B00008D7F05C08F3F29F48091FF028B7F8093AA
:105B1000FF028091FB0281110EC08091FC02811175
:105B20000AC08091FD02811106C08091FE028111A0
:105B300002C01092F90208958AEF92E00E94641D5B
:105B40000E94EF299093F8028093F7020895CF9373
:105B50008091F7029091F8020E94FC294091F9028D
:105B6000442321F02091910130E006C02091920160
:105B70005AE0259F900111248217930708F486C0EC
:105B80008091FB0281110DC09091FC02911109C01E
:105B90009091FD02911105C09091FE02992309F4A4
:105BA00075C04F3F19F04F5F4093F902181624F467
:105BB0000E942C2C8093FB028091FB0287FF05C082
:105BC0000E942C2C81958093FB028091FC02181678
:105BD00024F40E942C2C8093FC028091FC0287FF0D
:105BE00005C00E942C2C81958093FC026091FB02E1
:105BF000662339F1C091FC02CC2319F1772767FDA8
:105C00007095872F972F0E94003223E333E343E3FD
:105C10005FE30E94B4320E94CD316093FB026C2F8F
:105C2000772767FD7095872F972F0E94003223E317
:105C300033E343E35FE30E94B4320E94CD316093CB
:105C4000FC028091FD02181624F40E94742C8093AB
:105C5000FD028091FD0287FF05C00E94742C819592
:105C60008093FD028091FE02181624F40E94742C89
:105C70008093FE028091FE0287FF05C00E94742C73
:105C800081958093FE02CF910C949C2DCF91089525
:105C9000EAEFF2E085E0DF011D928A95E9F71092C4
:105CA000F9021092FF020895833089F130F48130B7
:105CB00061F0823009F06EC019C0853009F449C026
:105CC000B8F1863009F066C055C020919201862F48
:105CD00090E0820F911D8F3F910520F4620F609339
:105CE000920108958FEF8093920108952091910180
:105CF000862F90E0820F911D8F3F910520F4620F57
:105D00006093910108958FEF809391010895209100
:105D10009001862F90E0820F911D8F3F910520F416
:105D2000620F6093900108958FEF80939001089522
:105D300020918F01862F90E0820F911D8F3F91055A
:105D400020F4620F60938F0108958FEF80938F018D
:105D5000089520918E01862F90E0820F911D8F3F34
:105D6000910520F4620F60938E0108958FEF809368
:105D70008E01089520918D01862F90E0820F911D54
:105D80008F3F910520F4620F60938D0108958FEF8E
:105D900080938D010895833021F130F4813059F0E2
:105DA000823009F049C012C0853089F128F186306F
:105DB00009F042C037C080919201681720F4861B19
:105DC000809392010895109292010895809191011B
:105DD000681720F4861B8093910108951092910119
:105DE000089580919001681720F4861B809390019C
:105DF000089510929001089580918F01681720F402
:105E0000861B80938F01089510928F0108958091D1
:105E10008E01681720F4861B80938E0108951092DE
:105E20008E01089580918D01681720F4861B809360
:105E30008D01089510928D01089541E050E060E0D9
:105E400070E004C0440F551F661F771F8A95D2F774
:105E5000CB01BA010E9496270C948B23873200F560
:105E60008E3108F089C08E3009F469C060F4873043
:105E700009F44DC018F4863049F531C0883041F13D
:105E80008B3021F57EC0863109F47BC018F4803157
:105E9000E9F45FC0893109F474C08B31B9F445C0AD
:105EA000883309F46EC048F4893209F467C0853339
:105EB00009F464C0873251F461C0833409F45EC0D0
:105EC00018F48A3318F056C0883499F080E00895A9
:105ED0000E94082C0E941A2C0E94232C52C08091F0
:105EE000F102817F8E7F8093F10281E08093000335
:105EF00008950E948B232FEF83ED90E32150804083
:105F00009040E1F700C000000E944F2A3AC09091F3
:105F1000F102892F8095817080FB90F919F09660CD
:105F2000986025C0997F977F22C09091F10291FBE4
:105F3000882780F921E0822780FB91F913C0909196
:105F4000F10292FB882780F921E0822780FB92F9F9
:105F500009C09091F10293FB882780F921E0822704
:105F600080FB93F99093F102882359F0916090930C
:105F7000F10207C0895303C08D5101C080E00E9427
:105F80001D2F81E0089580E0089580E00895CF936B
:105F9000C82F80910003813071F020F0823009F029
:105FA00089C037C0A0918B01B0918C018C91823255
:105FB00009F082C007C0A0918B01B0918C018C9137
:105FC000823249F48C2F0E94C32F81111EC08C2F66
:105FD0000E942E2F1CC08C2F0E94C52F811115C02E
:105FE000C43169F030F4CB3081F0C03109F068C0C1
:105FF00009C0C93221F0C83309F062C006C010924E
:1060000000035EC082E08093000381E090E0817035
:106010005AC0C932C9F060F4C431B1F020F4C730BD
:1060200009F04CC034C0CE51C63008F047C017C08C
:10603000CE3439F120F4CB3409F040C01CC0C13556
:10604000C1F0C235D9F513C080910103882319F03E
:106050001092010333C081E08093000334C0EC2F21
:10606000F0E0E25EFD4F80818093010327C061E094
:1060700003C061E007C06AE0809101030E94542ED2
:106080001DC06AE0809101030E94CB2E17C08EE1F3
:106090008093920182E3809391018AE08093900142
:1060A00084E180938F0188E080938E0188E2809361
:1060B0008D0104C01092000380E005C081E003C0A0
:1060C00080E090E0A4CFCF9108950E94FD2B811134
:1060D00002C00E94DE2B0E94232C8093040480FFC8
:1060E00002C0869501C080E00C949B03809104045B
:1060F000982F9695292F30E0233031054CF49F5F7F
:10610000990F8170892B8160809304040E94272C51
:106110008091040486950C949B0380910404982F2D
:10612000969591F09158990F8170892B8093040472
:106130008E7F91E009F490E08091040490FB80F957
:10614000809304040E94272C8091040486950C946B
:106150009B0380910404982F909590FB80F9809385
:1061600004040E94272C8091040480FF02C08695BD
:1061700001C080E00C949B0330910404232F2695EA
:106180002F5F2F77822F90E0317004972CF4220F2D
:10619000232B2093040402C0309304048091040450
:1061A000282F2E7F91E009F490E090FB80F98093F6
:1061B00004040E94272C8091040486950C949B0370
:1061C00020910404922F96959827990F822F817021
:1061D000892B809304048E7F91E009F490E08091F4
:1061E000040490FB80F9809304040E94272C809182
:1061F000040486950C949B035058BB27AA270ED005
:1062000075C166D130F06BD120F031F49F3F11F4AD
:106210001EF45BC10EF4E095E7FB51C1E92F77D185
:1062200080F3BA17620773078407950718F071F4B3
:106230009EF58FC10EF4E0950B2EBA2FA02D0B0109
:10624000B90190010C01CA01A0011124FF27591BBB
:1062500099F0593F50F4503E68F11A16F040A22FC1
:10626000232F342F4427585FF3CF46953795279532
:10627000A795F0405395C9F77EF41F16BA0B620B31
:10628000730B840BBAF09150A1F0FF0FBB1F661F78
:10629000771F881FC2F70EC0BA0F621F731F841FBB
:1062A00048F4879577956795B795F7959E3F08F0E1
:1062B000B3CF9395880F08F09927EE0F97958795A0
:1062C0000895D9D008F481E008950CD00FC107D10A
:1062D00040F0FED030F021F45F3F19F0F0C05111D2
:1062E00039C1F3C014D198F39923C9F35523B1F3FD
:1062F000951B550BBB27AA2762177307840738F035
:106300009F5F5F4F220F331F441FAA1FA9F333D093
:106310000E2E3AF0E0E830D091505040E695001C47
:10632000CAF729D0FE2F27D0660F771F881FBB1F03
:10633000261737074807AB07B0E809F0BB0B802DDD
:10634000BF01FF2793585F4F2AF09E3F510568F029
:10635000B6C000C15F3FECF3983EDCF386957795BD
:106360006795B795F7959F5FC9F7880F911D96952B
:10637000879597F90895E1E0660F771F881FBB1F87
:10638000621773078407BA0720F0621B730B840B34
:10639000BA0BEE1F88F7E095089504D06894B11108
:1063A000D9C00895BCD088F09F5790F0B92F992795
:1063B000B751A0F0D1F0660F771F881F991F1AF010
:1063C000BA95C9F712C0B13081F0C3D0B1E00895D9
:1063D000C0C0672F782F8827B85F39F0B93FCCF35A
:1063E000869577956795B395D9F73EF49095809506
:1063F000709561957F4F8F4F9F4F0895E89409C026
:1064000097FB3EF490958095709561957F4F8F4FE7
:106410009F4F9923A9F0F92F96E9BB279395F695FD
:10642000879577956795B795F111F8CFFAF4BB0F7B
:1064300011F460FF1BC06F5F7F4F8F4F9F4F16C0DF
:10644000882311F096E911C0772321F09EE8872F69
:10645000762F05C0662371F096E8862F70E060E025
:106460002AF09A95660F771F881FDAF7880F96959E
:10647000879597F90895990F0008550FAA0BE0E842
:10648000FEEF16161706E807F907C0F012161306F6
:10649000E407F50798F0621B730B840B950B39F436
:1064A0000A2661F0232B242B252B21F408950A269C
:1064B00009F4A140A6958FEF811D811D089597F9DC
:1064C0009F6780E870E060E008959FEF80EC08959A
:1064D00000240A94161617061806090608950024C3
:1064E0000A9412161306140605060895092E03943D
:1064F000000C11F4882352F0BB0F40F4BF2B11F4B1
:1065000060FF04C06F5F7F4F8F4F9F4F089557FD0F
:106510009058440F551F59F05F3F71F04795880F11
:1065200097FB991F61F09F3F79F0879508951216A8
:1065300013061406551FF2CF4695F1DF08C0161654
:1065400017061806991FF1CF869571056105089405
:106550000895E894BB2766277727CB0197F908951C
:106560008ADF08F48FEF08950BD0C0CFB1DF28F099
:10657000B6DF18F0952309F0A2CFA7CF1124EACFF8
:10658000C6DFA0F3959FD1F3950F50E0551F629F92
:10659000F001729FBB27F00DB11D639FAA27F00D7C
:1065A000B11DAA1F649F6627B00DA11D661F829FA3
:1065B0002227B00DA11D621F739FB00DA11D621F88
:1065C000839FA00D611D221F749F3327A00D611DA5
:1065D000231F849F600D211D822F762F6A2F112487
:1065E0009F5750408AF0E1F088234AF0EE0FFF1FDA
:1065F000BB1F661F771F881F91505040A9F79E3F11
:10660000510570F05CCFA6CF5F3FECF3983EDCF312
:10661000869577956795B795F795E7959F5FC1F74D
:10662000FE2B880F911D9695879597F90895FA018D
:10663000EE0FFF1F30962105310599F161157105A7
:1066400061F48038BFE39B0749F168949038810575
:1066500061F08038BFEF9B0741F0992342F5FF3F7F
:10666000E1053105210511F1E8940894E795D90178
:10667000AA2329F4AB2FBE2FF85FD0F310C0FF5F21
:1066800070F4A695E0F7F73950F019F0FF3A38F4B6
:106690009F779F930CD00F9007FC905808953EF081
:1066A00014CF60E070E080E89FE308954FE79F77A4
:1066B0005F934F933F932F939ED02F913F914F9194
:1066C0005F9152DF05C019F40EF0F9CE42CFFDCE36
:1066D00026DFC8F39638C0F707F80F92E8942BE34B
:1066E0003AEA48EB5FE74EDF0F920F920F924DB7F9
:1066F0005EB70F92C0D0ECEAF0E016D04F915F91F8
:10670000EF91FF91E595EE1FFF1F49F0FE57E068FE
:106710004427EE0F441FFA95E1F74195550B32D00F
:106720000F9007FE26C00895DF93CF931F930F931A
:10673000FF92EF92DF927B018C01689405C0DA2E04
:10674000EF011EDFFE01E894A59125913591459159
:106750005591AEF3EF0162DDFE019701A801DA94D5
:1067600079F7DF90EF90FF900F911F91CF91DF911C
:1067700008959B01AC0160E070E080E89FE3A5CD47
:106780009ECEACC0CCDEE8F39923D9F3940F511D13
:10679000BBF39150504094F059F0882332F0660FCB
:1067A000771F881F91505040C1F79E3F510544F715
:1067B000880F911D9695879597F908955F3FACF0E6
:1067C000983E9CF0BB27869577956795B79508F41A
:1067D000B1609395C1F7BB0F58F711F460FFE8CF94
:1067E0006F5F7F4F8F4F9F4FE3CFB4CE0EF076C0D9
:1067F0006CCE689464CE93DEC8F39923D1F3C6F3CC
:10680000DF93CF931F930F93FF92C92FDD27882328
:106810002AF02197660F771F881FDAF720E030E013
:1068200040E85FEB9FE3883920F0803E30F021960E
:106830008F77E3DCE4EDF0E003C0DFDCE1E0F1E0E2
:1068400073DF8B01BE01EC01FB2E6F57710975954B
:10685000771F880B990BD4DD28E132E741E35FE332
:106860008FDEAF2D9801AE01FF900F911F91CF9158
:10687000DF91D4DC3BCEFA01DC01AA0FBB1F9B01E8
:10688000AC01BF5728F422273327442750781FC074
:10689000B75188F4AB2F0024469537952795011CF6
:1068A000A395D2F3002069F0220F331F441FB39544
:1068B000DAF30DD0A1CC61307105A0E88A07B946A2
:1068C00030F49B01AC0166277727882790783096B3
:1068D00021F0208331834283538308959F3F31F019
:1068E000915020F4879577956795B795880F911DFE
:1068F0009695879597F90895991B79E004C0991F9B
:10690000961708F0961B881F7A95C9F78095089509
:10691000AA1BBB1B51E107C0AA1FBB1FA617B707C5
:1069200010F0A61BB70B881F991F5A95A9F78095E1
:106930009095BC01CD01089597FB072E16F40094A5
:1069400007D077FD09D00E94883407FC05D03EF4BB
:10695000909581959F4F0895709561957F4F08950B
:10696000F999FECF92BD81BDF89A992780B5089517
:10697000A8E1B0E042E050E00C94D334262FF9991E
:10698000FECF1FBA92BD81BD20BD0FB6F894FA9A12
:10699000F99A0FBE019608950E94BE34272F0C94D9
:1069A000BF34DC01CB01FC01F999FECF06C0F2BD7A
:1069B000E1BDF89A319600B40D9241505040B8F7BD
:0669C0000895F894FFCFDA
:1069C60055D0A446000016440000000000004842CE
:1069D60061978A460000C843000000000000484254
:1069E60055D024460000C84300000000000048427D
:1069F60000005C460000C84300000000000048425A
:106A060061978A4600007A4455D0A4460000C843E0
:106A1600000000000000484200005C460000C84339
:106A2600000000000000484255D0244600001644ED
:106A36000507000C05854000000106400000010026
:106A4600B91049112511F010BC1001E902280814EB
:106A56000A321E4200450025002600430061006000
:106A660000200037006400650066006700440046A9
:106A7600002400470000000200040005000700098A
:106A8600000B000C000E001000110013001500177B
:106A96000018001A001C001D001F002100230024FE
:106AA600002600280029002B002D002F0030003280
:106AB6000034003500370039003B006E048704A01F
:106AC60004B904E10594055E053E053F4D362002F6
:106AD60003020000010001010101010001010102A0
:086AE60003040506070809007E
:00000001FF

@ -0,0 +1,1863 @@
:020000020000FC
:047000000C948D3E21
:047028000C94B73DD0
:10702F0012010002FF010020EB03F42F0000010208
:10703F00030109021200010100803209040000005F
:10704F00000000000C03410054004D0045004C00AF
:10705F001603410054006D00330032005500340018
:10706F004400460055000C0331002E0030002E0066
:10707F0030000403090416010C0100000C0000018C
:02708F006C7F14
:1070920012BD01BDF89A00B5089501E00895F9996D
:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929
:1070B200FECF0C944938F80104910895F8013491F7
:1070C20031962491890108950091610000930C0189
:1070D20000E80093610001E00093610005BF02E057
:1070E20005BF0C9486380091D70001600093D70049
:1070F200A89507EF04BF0091600000610093600053
:1071020000E00093600001E008950E94AA3D0E9401
:10711200B53DFDCF0CD00F7708D0006806D00061D6
:1071220004D0016028D0789408950093D80000918B
:10713200D8000895FCDF00621ED04CD009B500FFD4
:10714200FDCFF5DF0F7D17D00091E0000E7F009399
:10715200E0000091E000077F0093E0000091E20070
:1071620001600093E2000091E20008600093E200F7
:1071720078940C94743B0093D800089500910D010B
:10718200002359F40091D90000FF07C0D0DF006846
:10719200F2DF01E000930D01CDDFE0E2F2E00081D9
:1071A200018100FF0DC0008111811E7F11830083C8
:1071B20001E00093EA0000E00093EA0000931E025F
:1071C20000E00093E9000091E80003FF02C00E9482
:1071D200F23B0895A89539D000E40093600000E0E6
:1071E200009381000093800010E0009385000093DB
:1071F200840001E006BB00918100036000938100DE
:107202000091600007FFFCCF00E80093600010933C
:107212008100A89507EF04BF18D010936000209159
:1072220084003091850010938100109380001093A8
:1072320085001093840001E006BB2D3D354010F01F
:1072420002E101C002E009BD089500916000006101
:107252000093600008950E94AD3E239741D100E063
:1072620000930901B5D104811581012B51F437D165
:1072720000910701002309F4B9C000E0009307015F
:10728200B5C058D102FFFDCF37D1068335D1009367
:107292000F0132D1009310012FD1009311012CD193
:1072A2000093120129D10093130102852091130149
:1072B20030911201409111015091100116811A95DD
:1072C20041F01250A9F01A9599F11A9509F473C078
:1072D2008BC010910F01113011F411E001C010E0C8
:1072E200138799D00C3F11F414D17FC077D17DC0A0
:1072F20092D010910F01112329F01A9549F01A9595
:10730200A9F073C010E013870C3F09F06EC0ECCFF8
:1073120056D103C04CD109F468C00D911C9144D1DF
:107322000F3FC1F305E0009309015FC011E0EBCF0D
:10733200D2D029F00250E1F10A9541F056C0FDD0B9
:107342000E94A33F0FEF00930A014FC0552319F08B
:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE
:1073620003FFFDCF67D051D04AD008E00093600000
:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F
:1073820044D00FEF1FE004C009811A810150104060
:1073920009831A8309811A81012BB1F700E800934E
:1073A200610000910C01009361000C940000FFCF7A
:1073B20001E003871AC08FD019F00A9539F015C081
:1073C200535098F4BAD002E000870FC0505339F0FE
:1073D2005A9541F05F52B1F35A95A1F306C002E00B
:1073E2000883F0CF01E0FCCFA8D079D02396E4E067
:1073F2000C94BA3E01E005BF00E005BF089500917C
:10740200D8000F770093D800089509B50D7F09BD04
:1074120000E009BD08955183408333832283109194
:10742200E8001B7F1093E8001091E8001F7710938B
:10743200E80008955DD053D0F8940091E000016017
:107442000093E000089579D04AC0219749D0009175
:107452000601035019F00250B9F00BC03CD021F0E4
:107462000A9559F00A9529F400910A010C3F19F482
:1074720050D02196089567D0FCCF0091010100936E
:10748200F100009100010AC01091100124D019F0FE
:107492000A9549F0EECF135018F400E00093F10082
:1074A2001ED044D0E6CF105339F01A9539F01F524E
:1074B20041F01A9541F0F4CF08E5F0CF00E006D094
:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5
:1074D20030E00C94113F00910F010023089521C068
:1074E2000BD008D007D00093040106D00093050109
:1074F20021D00BC000D008830091F10008950091C3
:10750200EB0000620093EB0015D0077F0093E800C8
:107512000895F5DF02E00093080103E000930901FA
:10752200089559D007D000FFFDCF089503D002FF80
:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A
:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD
:107552002BD00093F1002BD059F43DD0082F092BEA
:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1
:10757200042D4394003289F300910B0100230D91F5
:107582001C9131F311970E945838E3CFD3DF00FFEB
:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B
:1075A200CCDFE5E00C94B93E11970C945C380D9158
:1075B2001C910F5F1F4F1C930E93019708958281B8
:1075C200938100811181801B910B0196DF01089547
:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71
:1075E200F7DF80819181A081B181AF710481158122
:1075F20000521040048315830AC000910B0100233E
:1076020031F4A301920103E911E00E943B3F47D00C
:10761200B8F1662477242C0111C06EDFF301ED5618
:10762200FE4F008301E0600E00E0701E01960091A3
:10763200F200002311F033D0B8F47FDF30D0E8F24B
:10764200F301B096E238F040C0F674DF02FFFDCFDE
:107652000091F200BDDF24813581201B304024835C
:107662003583E5CF49DFAA95AA23E1F700910B0103
:10767200013099F62091F1008C010E945038D6CF4A
:1076820004811581012B21F055DF02FFFDCF55DF6B
:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051
:1076A200F1E0028113810817190708952091EB0078
:1076B20021602093EB000093EC000091ED0002703A
:1076C200012B0093ED000091ED0002600093ED00AC
:1076D2001091EE00012F000F00E0001F0895412FCE
:1076E2000093E900089500E009D000FD05C000E024
:1076F200F7DF10E202E0DACF00E00895F1DF009157
:10770200EB0008950F770132A9F5112369F11A955B
:1077120059F01A9561F01A9569F01A95F9F01A95CF
:10772200C1F01A95D9F024C00E942C3920C00E94C1
:10773200263A1DC029D00091090123D001E01FD0B3
:1077420020D0009108011BD00E94923A0E94973AE1
:107752000EC01AD00091080114D007C002E00093B5
:10776200080100E0009309010FD00E94923A03C081
:107772000E94803A02C001E0089500E0089501D01D
:1077820000E00093F10008950091E800077F009364
:10779200E800089508950350F9F4112339F01A9579
:1077A20051F01A9581F01A9599F016C004E016D09E
:1077B20001E810E703C011D003E510E7E7E1F2E0CA
:1077C20000831183D8CF06E109D00FE510E7F6CF89
:1077D20004D005E710E7F2CFD0CF0CE000931A02F5
:1077E200089527D120D100931D02E1D0212F11232A
:1077F20029F12A95E9F02250F1F0225099F02A95C8
:1078020049F0225061F02A9581F02A95E1F02A95FB
:10781200E9F023C0003809F44FC00C94833B0038D0
:10782200E1F7C8C00023C9F71EC00023B1F72DC07D
:10783200033098F744C1033080F70BC1003868F376
:10784200033858F7C9C0013841F77BC1013051F400
:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA
:1078620009F41ED008951091E3001078DCD00F7750
:10787200012B0093E300E9D0ACD000FFFDCF0091D3
:10788200E30000680093E300089591D0123040F4C1
:107892000FD010931E02DAD000911E020C94CB3B43
:1078A2000091EB0001D004C000620093EB00089548
:1078B2000091E800077FC0C0BA93AA93229700E024
:1078C2000093190274D0AFD0202F2A9519F02A956F
:1078D200E9F022C002E100931A020FE210E7E7E1A9
:1078E200F2E0008311839DD008839DD00983E0DFFD
:1078F20000911A0210E02881398102171307A8F4B7
:107902000F7181F401E00093190211C002E10093AA
:107912001A0201E410E7E3CF0E94CC3B002319F7DF
:107922008ED040C01093190202C020931A027ED05A
:10793200A7E1B2E001C08AD000911A02002309F146
:1079420048D004FD1EC045D000FD03C042D004FF54
:10795200FACF10E0012F1395003281F0ED91FC91E6
:107962001197049133D02D913C912F5F3F4F3C935F
:107972002E93FD0103810A95038361F72AD004FF48
:10798200DACF00911902013039F423D004FD04C08A
:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F
:1079A20018D00B7F49D02296A991B99108951091D0
:1079B200F10008957DDF00911E0208D047D009D062
:1079C2000F773AD006D002FFFDCFBFC00093F1007F
:1079D20008950091E800089524D010911D021058D6
:1079E20029F01A9589F01A9591F019C061DF00917A
:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63
:107A020018D0E7DF0F770CC053DF00E0F2CF51D080
:107A12000F7710E0F801E55EFD4F0081EACF0FD04D
:107A22000BC001D000D00091F1000895D2DF0F7E8B
:107A320003C00091E8000B7F0093E80008950091D5
:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31
:107A5200F3CF00911D02002329F00A9509F10A953E
:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE
:107A7200B9F4D9DF0F7711F416D01BD00093E900C7
:107A82001091EB0010FF0BC00ED010E01093E90034
:107A920021E0F801E55EFD4F20834FD003C042D0C4
:107AA20045D0CFDFC9CF1091EB0010621093EB00ED
:107AB20008951091E800177F1093E800089500914F
:107AC2001D02002311F4AFDF02C0013011F4B7DF51
:107AD200B3CF023031F52DD019F52091F1002F7777
:107AE2002093E90023D000FF19C081F01FD000616C
:107AF200DCDE01E010E0422F0E949F3E0093EA008C
:107B020000E00093EA0012D00860CFDE0BD030E034
:107B1200F901E55EFD4F008310D0DACF03D0D7CF55
:107B2200BFDE089500E00093E90008950091EB00A4
:107B3200089579DF3CDF00230895BADE4ADF0E7F25
:107B4200089583DF46DF02FFFDCF73DF42DF0F7749
:107B520073CF0091D70001600093D7000E948B3849
:107B620000E000931F0208950C94BF388A93FA93A1
:107B7200EA933A922A921A920A927A936A935A93BF
:107B82004A933A932A931A930A938FB70091DA0091
:107B920000FF24C00091D80000FF20C00EEF009328
:107BA200DA000091D90000FF11C001E000930D013D
:107BB200ABD0026096D09AD00860A2D00E949B38C7
:107BC2000091E0000E7F0093E00008C000E0009307
:107BD2000D0100931E0298D0046083D07FD002FF73
:107BE20005C084D002FF02C00BEF75D077D000FF32
:107BF2001BC07CD000FF18C001E000930E016AD0C8
:107C020083D000626ED00EEF6FD0006179D06ED05B
:107C12000F7D76D00091D80000620093D80009B59C
:107C22000D7F09BD00E009BD59D004FF20C05ED020
:107C320004FF1DC009B500FD05C00E94EB3809B55F
:107C420000FFFDCF0091D8000F7D0093D80042D0F5
:107C520000910E01002359F04CD00FEE45D00F7E5B
:107C620052D000643ED042D001604AD042D036D0D9
:107C720005FF0FC03BD005FF0CC000E000930E01D2
:107C820035D00F7E3DD00FED2FD00F7D3CD0006858
:107C920028D024D003FF0DC029D003FF0AC000E082
:107CA20000931F0207EF17D00E94743B2DD0116082
:107CB20018D08FBF09911991299139914991599100
:107CC200699179910990199029903990E991F991E6
:107CD200899118950FEE0093E10008950091E1005B
:107CE20008951183008308950093E1000091E2005A
:107CF20008950091E200006203D00091E200086062
:107D02000093E2000895FCDFE0E2F2E000811181DD
:107D1200089500008895FECF01E60DBF02E00EBF78
:107D2200C2EED2E00E947438002311F00E94D33ECA
:107D32000E9465380E948A3E0C948A3E4A951AF047
:107D4200000F111FFBCF0895BA92AA929A928A92BB
:107D52007A926A925A924A92BA93AA939A938A937D
:107D62000895BB84AA84998488847F806E805D8014
:107D72004C80BB81AA8199818881F0E00FB6F8948A
:107D8200CE0FDF1F0FBE089520E006D0E9F7089559
:107D9200259102D0E9F708952D9301501040202F2C
:107DA200212B089585E890E7FC0105911491FC01CF
:107DB2003296A591B491FC01349625913491422FCB
:107DC200432B19F0F901E4DF01C0DEDF069610E76C
:107DD2008139910748F308952F930CD02F9101D048
:107DE20008953CD0F12FE02F45E047BFE89536D00B
:107DF20012D0089533D0F12FE02F43E047BFE8952A
:107E02002DD008952BD0F12FE02F43E047BFE89506
:107E120025D001D0089522D041E147BFE8951EC088
:107E22001DD0F12FE02F41E247BFC895002D16C0AB
:107E320015D0F12FE02F49E047BFC895002D0EC0A5
:107E4200F32FE22F012E102E41E047BFE89506C026
:107E520005D0002E29E027BFE89500C0022E27B7E3
:107E620020FDFCCF202D0895022E27B726FDFCCF42
:107E7200202D08950E94A53E22974801C901DA01EA
:107E820010C05BD001E0A00E00E0B01E00E4A0161E
:107E920000E0B00608F440C0830120E030E00E9418
:107EA200F23E0A2F0B2B09F440C0082F0F7710E087
:107EB2002C01401A510A320100E4A02E03C00A2FFD
:107EC2000B2BE1F04816590680F0F40101914F01A5
:107ED2000983119729F001914F010883119711C06D
:107EE200F2013196049108830CC0F20104910983D6
:107EF2003196E817F907A1F7F401EDCF1BD00883FB
:107F020019839201088119810E94213F16D0AA94F7
:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE
:107F220009F4AFCF83011DD0B7CF01E02296ECE078
:107F32000C94B23E82010C945F3802E0400E00E0E5
:107F4200501E08959A938A9380E090E08C0109D0A4
:107F520080589F4F8F3F0FE69007C0F38991999108
:107F6200089520E030E00C94FB3E00000000000089
:067F720000000000FC000D
:107FE4000C94ED3E0C94113F0C94193F0C94213FDA
:0C7FF4000C94F23E0C94033F0C94293FC7
:040000030000700089
:100000000C94A0050C94E4050C94E4050C94E40510
:100010000C94E4050C94E4050C94E4050C94E405BC
:100020000C94E4050C94E4050C94B6180C9488190F
:100030000C94A1270C94E4050C94E4050C94E405BD
:100040000C94E4050C94E4050C94E4050C94E4058C
:100050000C94E4050C9409280C94E4050C94E40534
:100060000C94E4050C94E4050C94E4050C94E4056C
:100070000C94E4050C94E4050C94E4050C94E4055C
:100080000C94090F0C94E4050C94E4050C94E4051D
:100090000C94E4050C94E4050C94E4050C94E4053C
:1000A0000C94E4050C94E4050C94E4053F064F061B
:1000B000610671067706860692069706A406AC06C8
:1000C000BC06C106C813C813C813C813C813C81385
:1000D000C813C813C813C813DF13DF13DF13DF13EC
:1000E000DF13DF13DF13DF13DF13DF13C813C813AE
:1000F000C813C813C813DF13DF13DF13DF13DF13B5
:10010000C813C813C813DF13DF13DF13F519171A49
:10011000051B171A051B5C1A7F1A051BD41AE71A50
:10012000EA1DEA1D271E271E811EBF1E372137210B
:10013000D81E3721D91FD91F9C20B3203721222157
:1001400007634236B79BD8A71A39685618AEBAABC0
:10015000558C1D3CB7CC5763BD6DEDFD753EF61754
:100160007231BF000000803F08000000BE922449A9
:10017000123EABAAAA2ABECDCCCC4C3E00000080D9
:10018000BEABAAAAAA3E00000000BF000000803F4C
:100190000000000000084178D3BB4387D1133D190C
:1001A0000E3CC3BD4282AD2B3E68EC8276BED98F39
:1001B000E1A93E4C80EFFFBE01C4FF7F3F0000007D
:1001C000000035001E001F00200021002200230037
:1001D00024002500260027002A002B0014001A0006
:1001E0000800150017001C0018000C001200130076
:1001F0004C00290004001600070009000A000B004B
:100200000D000E000F0033003400E1001D001B0044
:1002100006001900050011001000360037003800F4
:1002200028000530E000E200E30003302C002C0041
:1002300004305000510052004F0035001E001F00D6
:100240002000210022002300240025002600270092
:100250002A002B0014001A00090013000A000D00E8
:100260000F0018001C0033004C002900040015008A
:100270001600170007000B00110008000C00120008
:100280003400E1001D001B000600190005000E00EF
:10029000100036003700380028000530E000E2008A
:1002A000E30003302C002C000430500051005200B9
:1002B0004F0035001E001F002000210022002300F7
:1002C00024002500260027002A002B0034003600D9
:1002D000370013001C0009000A00060015000F007B
:1002E0004C00290004001200080018000C00070050
:1002F0000B001700110016003800E1003300140055
:100300000D000E001B00050010001A0019001D0052
:1003100028000530E000E200E30003302C002C0050
:1003200004305000510052004F0035021E021F02DF
:100330002002210222022302240225022602270291
:100340002A0035021E021F0220022102220223027D
:1003500024022502260227024C004C003A003B00F2
:100360003C003D003E003F002D022E022F023002D5
:1003700031020100400041004200430044004500BA
:100380000100010001000100010001000100010065
:1003900001000100010001000100AB00AA00A9005A
:1003A000AE0035001E001F002000210022002300A7
:1003B00024002500260027002A0035001E001F000B
:1003C0002000210022002300240025002600270011
:1003D0004C004C003A003B003C003D003E003F001A
:1003E0002D002E002F0030003100010040004100A0
:1003F00042004300440045000100010001000100EB
:1004000001000100010001000100010001000100E4
:100410000100AB00AA00A900AE000000000000002F
:1004200000000000000000000000000000000000CC
:1004300000000000000000000000000000000000BC
:1004400000000000000000000000000000000000AC
:10045000000000000000000000000000000000009C
:10046000000000000000000000000000000000008C
:10047000000000000000000000000000000000007C
:100480000000033000000000043000000000000005
:10049000000000000000000000000000000000005C
:1004A000000000000000000000000000000000004C
:1004B000000000000000000000000000000000003C
:1004C000000000000000000000000000000000002C
:1004D000000000000000000000000000000000001C
:1004E000000000000000000000000000000000000C
:1004F00000000000000000000000000000000000FC
:1005000000000000000000000000000000000000EB
:1005100000000000000000000000000000000000DB
:1005200000000000000000000000000000000000CB
:1005300000000000000000000000000000000000BB
:1005400000000000000000000000000000000000AB
:10055000000000000000000000000000000000009B
:10056000000000000000000000000000000000008B
:10057000000000000000000000000000000000007B
:10058000000000000000000000000000000000006B
:10059000000000000000000000000000000000005B
:1005A000000000000000000000000000000000004B
:1005B000000000000000000000000000000000003B
:1005C000000000000000000000000000000000002B
:1005D000000000000000000000000000000000001B
:1005E000000000000000000000000000000000000B
:1005F00000000000000000000000000000000000FB
:1006000000000000000000000000000000000000EA
:1006100000000000000000000000000000000000DA
:1006200000000000000000000000000000000000CA
:1006300000000000000000000000000000000000BA
:1006400000000000000000000000000000000000AA
:10065000000000000000000000000000000000009A
:10066000000000000000000000000000000000008A
:10067000000000000000000000000000000000007A
:10068000000000000000000000000000000000006A
:10069000000000000000000000000000000000005A
:1006A000000000000000000000000000000000004A
:1006B000000000000000000000000000000000003A
:1006C000000000000000000000000000000000002A
:1006D000000000000000000000000000000000001A
:1006E000000000000000000000000000000000000A
:1006F00000000000000000000000000000000000FA
:1007000000000000000000000000000000000000E9
:1007100000000000000000000000000000000000D9
:1007200000000000000000000000000000000000C9
:1007300000000000000000000000000000000000B9
:1007400000000000000000000000000000000000A9
:100750000000000000000000000000000000000099
:100760000000000000000000000000000000000089
:100770000000000000000000000000000000000079
:100780000000000000000000000000000000000069
:100790000000000000000000000000000000000059
:1007A0000000000000000000000000000000000049
:1007B0000000000000000000000000000000000039
:1007C0000000000000000000000000000000000029
:1007D0000000000000000000000000000000000019
:1007E0000000000000000000000000000000000009
:1007F00000000000000000000000000000000000F9
:1008000000000000000000000000000000000000E8
:1008100000000000000000000000000000000000D8
:1008200000000000000000000000000000000000C8
:1008300000000000000000000000000000000000B8
:1008400000000000000000000000000000000000A8
:100850000000000000000000000000000000000098
:100860000000000000000000000000000000000088
:100870000000000000000000000000000000000078
:100880000000000000000000000000000000000068
:100890000000000000000000000000000000000058
:1008A0000000000000000000000000000000000048
:1008B0000000000000000000000000000000000038
:1008C0000000000000000000000000000000000028
:1008D0000000000000000000000000000000000018
:1008E0000000000000000000000000000000000008
:1008F00000000000000000000000000000000000F8
:1009000000000000000000000000000000000000E7
:1009100000000000000000000000000000000000D7
:1009200000000000000000000000000000000000C7
:1009300000000000000000000000000000000000B7
:1009400000003A003B003C003D003E003F004000FC
:1009500041004200430044004500010000500100F6
:10096000010001000100010001000100010001007F
:100970004C000100010001000730063013501250F6
:100980000030013002300100010001000B300A305C
:1009900009300830010001000100010001000100E0
:1009A000010001000100010001000100010001003F
:1009B000010001000100010001002A035400680049
:1009C000650020005000720065006F006E00690035
:1009D000630020004B006500790062006F00610039
:1009E0007200640000002C034F0072007400680065
:1009F0006F006C0069006E006500610072002000ED
:100A00004B006500790062006F00610072006400B5
:100A1000730000000403090409025400030100A04C
:100A2000FA0904000001030101000921110100017C
:100A3000223F000705810308000A090401000103A1
:100A4000010200092111010001224D000705820366
:100A500008000A0904020001030000000921110135
:100A600000012236000705830308000A1201100165
:100A700000000008EDFE61600100010200010501B7
:100A80000980A101850216010026B7001A01002A7B
:100A9000B700751095018100C0050C0901A1018501
:100AA00003160100269C021A01002A9C027510956B
:100AB000018100C005010902A1010901A100050988
:100AC000190129051500250195057501810295017A
:100AD000750381010501093009311581257F9502D2
:100AE0007508810609381581257F950175088106ED
:100AF000050C0A38021581257F950175088106C00D
:100B0000C005010906A101050719E029E71500251F
:100B10000195087501810295017508810105081983
:100B2000012905950575019102950175039101054E
:100B300007190029FF150025FF950675088100C0DB
:100B400011241FBECFEFDAE0DEBFCDBF04B603FE37
:100B500024C08091A3039091A403A091A503B09118
:100B6000A6038730904BA740B04BB9F41092A30373
:100B70001092A4031092A5031092A60314BE84B78A
:100B8000877F84BF88E10FB6F8948093600010924D
:100B900060000FBEE0E0F8E3099512E0A0E0B1E0EC
:100BA000EAEEF2E602C005900D92A83AB107D9F735
:100BB00013E0A8EAB2E001C01D92A33AB107E1F741
:100BC0000E94FC150C9473310C940000279A2F9806
:100BD0008FEF9FEF90938700809386008AE0809349
:100BE000800089E1809381000C94F82C282F8111DA
:100BF0000BC080918000877F8093800010928D00D1
:100C000010928C002F9808952F9880918000886012
:100C100080938000233019F48FEF9FEF0FC083E0A3
:100C200090E0821B9109880F991F2FEF3FEFA901D8
:100C300002C0569547958A95E2F7CA0190938D00B8
:100C400080938C000895CF93DF93EC010E949D2840
:100C5000BE0180E090E0DF91CF910C9417250F93B7
:100C60001F93462F50E04C30510508F098C0DC012E
:100C7000FA01EA5AFF4F12968C910C94373188236F
:100C800009F48DC000E010E0980140E064E070E0FD
:100C90008BEC91E00E94871281E090E00FC08823E6
:100CA00009F47DC000E010E0980140E066E070E0EB
:100CB0008BE591E00E94871282E090E00E9423067B
:100CC0006EC0882309F46BC000E010E0980140E09A
:100CD00068E070E08BE891E00E94871284E090E089
:100CE000EDCF882311F083E005C083E00CC088239A
:100CF00049F084E00E94942540E164E083E00E9492
:100D0000ED0A4DC084E00E94B525F6CF882331F06E
:100D100085EE0E947E1C0E944F2D41C085EE0E94F0
:100D2000461D3DC08823D9F10E941B0E38C0882380
:100D3000B1F10E94140E00E010E0980140E064E080
:100D400070E08BEE91E029C0882349F185E00E9494
:100D5000B5250E943C0E23C0882309F100E010E075
:100D6000980140E068E070E08BE191E00E9487121A
:100D700085E00E94942513C0882389F00E941A13ED
:100D800004C0882361F00E94251300E010E0980160
:100D900040E068E070E08BE191E00E94871280E023
:100DA00090E01F910F9108950F931F932FEF89EFFC
:100DB00090E0215080409040E1F700C0000000E04A
:100DC00010E0980140E064E070E08BEE91E00E945A
:100DD00087121F910F910895CF92DF92EF92FF92A9
:100DE0000F931F93CF93DF93CDB7DEB7CC58D109C4
:100DF0000FB6F894DEBF0FBECDBF2091630325FF71
:100E0000C5C08C01FC01928180910201992309F4F3
:100E100060C096E4E7E2F2E0DE01A95BBF4F01901B
:100E20000D929A95E1F7F8019081E0910001F0911F
:100E30000101E90FF11DEE0FFF1F27E430E02C0F39
:100E40003D1FE20FF31F60817181680F711D8827BC
:100E500077FD8095982F0E94932E20E030E040E4AB
:100E600051E40E94F82D6B017C01F801218185E09D
:100E700090E0821B9109BC01882777FD8095982F0F
:100E80000E94932E9B01AC01C701B6010E94902DD8
:100E90009B01AC0160E070E080E090E40E94AA2F2A
:100EA00020E030E04CE551E40E94472F4FE050E055
:100EB000C457DF4F0FB6F894DEBF0FBECDBFDF9132
:100EC000CF911F910F91FF90EF90DF90CF900C94F6
:100ED000271296E4E7E2F2E0DE01119601900D920E
:100EE0009A95E1F7F8019081E0910001F0910101FC
:100EF000E90FF11DEE0FFF1F21E030E02C0F3D1F29
:100F0000E20FF31F60817181680F711D882777FDE3
:100F10008095982F0E94932E20E030E040E451E429
:100F20000E94F82D6B017C01F801218185E090E0A1
:100F3000821B9109BC01882777FD8095982F0E941C
:100F4000932E9B01AC01C701B6010E94902D9B011D
:100F5000AC0160E070E080E090E40E94AA2F20E005
:100F600030E04CE551E40E94472FC457DF4F0FB6E5
:100F7000F894DEBF0FBECDBFDF91CF911F910F91CF
:100F8000FF90EF90DF90CF900C946F0EC457DF4F1F
:100F90000FB6F894DEBF0FBECDBFDF91CF911F918A
:100FA0000F91FF90EF90DF90CF9008950F931F93D4
:100FB00000E010E0980140E063E070E083E091E041
:100FC0000E9487122FEF82E597E0215080409040E9
:100FD000E1F700C000001F910F91089508950E944D
:100FE000E6056E9A769A0C94D4060C94EE070C944F
:100FF000EC060895880F991FFC01EE5BFF4F859169
:1010000094910895880F991FFC01EE53FE4F85912E
:10101000949108950F931F93CF93DF93EC01811563
:1010200020E49207A0F5C11580E3D80708F0E1C0DD
:10103000C83ED105D8F4C03ED10508F0EEC1C83A8B
:10104000D10578F4C53AD10508F074C0C130D10596
:1010500009F46DC008F4DEC1C430D10508F0DDC16B
:10106000D9C1CB3BD10508F470C0D4C1C11590E201
:10107000D90708F0B9C0C11521E0D20708F0CDC1E9
:10108000C03FD10508F4C6C18E01106506C2C1304B
:1010900080E5D80709F4BDC068F5C13120E4D20766
:1010A00009F4AEC050F4C03190E4D90708F0A5C0EF
:1010B000CF70DD278E01146DF0C1C33120E4D2075B
:1010C00009F4A4C008F49FC0C115D04509F0A2C11D
:1010D0000E945B210E943C0E0E94D6079FEF24E3F2
:1010E0008CE0915020408040E1F700C000000E9459
:1010F0002E28D3C1C11520E6D20730F4C11581E5F1
:10110000D80708F48CC02DC1C11590E7D90708F4A1
:1011100081C1C11520E8D20708F478C1C11580E962
:10112000D80708F077C1DF708E01106AB6C101E000
:1011300010E0B3C1C53AD10509F471C1C63AD10571
:1011400009F070C102E810E4A8C1C83AD10509F459
:101150006CC1C93AD10509F46BC1CA3AD10509F489
:101160006AC1CB3AD10509F469C1CC3AD10509F479
:1011700068C1CD3AD10509F467C1C03BD10509F476
:1011800066C1CE3AD10509F465C1CF3AD10509F45B
:1011900064C1C13BD10509F463C1C23BD10509F467
:1011A00062C1C33BD10509F461C1C43BD10509F457
:1011B00060C1C53BD10509F45FC1C63BD10509F447
:1011C0005EC1C73BD10509F45DC1C83BD10509F437
:1011D0005CC1C93BD10509F45BC1CA3BD10509F427
:1011E0005AC100E014E459C1CE019F700E94020868
:1011F00055C1DD278E01106C50C100E011ED4DC1CD
:1012000000E010ED4AC100E012ED47C100E013ED2F
:1012100044C1809177038160809377033EC10E942F
:101220008A28811102C00E9466280E94A22890E0AC
:101230009093A2038093A103C23090E5D90721F4D3
:101240008091A103816086C0C43020E5D20721F4DB
:101250008091A10382607EC0C63080E5D80721F46A
:101260008091A103846076C0C83090E5D90719F455
:101270008091A10327C0CA3020E5D20721F48091D4
:10128000A103806167C0CC3080E5D80721F480914C
:10129000A10380625FC0CE3090E5D90721F4809130
:1012A000A103806457C0C03120E5D20721F48091AA
:1012B000A10380684FC0C23180E5D80729F480912E
:1012C000A1038460886046C0C33090E5D90721F44B
:1012D0008091A1038E7F3EC0C53020E5D20721F466
:1012E0008091A1038D7F36C0C73080E5D80721F4F7
:1012F0008091A1038B7F2EC0C93090E5D90719F4E6
:101300008091A10326C0CB3020E5D20721F4809143
:10131000A1038F7E1FC0CD3080E5D80721F48091D6
:10132000A1038F7D17C0CF3090E5D90721F48091BC
:10133000A1038F7B0FC0C13120E5D20721F480913A
:10134000A1038F7707C0C331D04531F48091A10349
:101350008B7F877F8093A1038091A1030E94A628A1
:101360009CC08D2F99278F70992781309105D9F4D2
:101370009E012370332702C0880F991F2A95E2F738
:101380009C688E0144E0000F111F4A95E1F7002789
:101390001370802B912B53E0CC0FDD1F5A95E1F792
:1013A000C076DD272FC08230910531F4DC2FCC27A9
:1013B0008E01016F106A71C08330910569F4CE010E
:1013C0008370992701E010E002C0000F111F8A9579
:1013D000E2F7C8019C680FC0049709F05EC0CE0117
:1013E0008370992701E010E002C0000F111F8A9559
:1013F000E2F7C8019A6823E0CC0FDD1F2A95E1F7D8
:10140000C07ED7708C010C2B1D2B47C0DF708E0166
:10141000106243C000E010E040C08E013EC001E811
:1014200010E43BC003E810E438C002EE14E435C019
:1014300009EE14E432C00AEE14E42FC005EB14E404
:101440002CC006EB14E429C007EB14E426C00CEC16
:1014500014E423C00DEC14E420C003E815E41DC01F
:101460000AE815E41AC002E915E417C004E915E416
:1014700014C001E216E411C003E216E40EC004E257
:1014800016E40BC005E216E408C006E216E405C047
:1014900007E216E402C00AE216E4C801DF91CF9128
:1014A0001F910F9108959CE0799FF00111249CE316
:1014B000899FE00DF11D1124E60FF11DEE0FFF1FB6
:1014C000EE53FE4F85919491803E9105E0F4803C6F
:1014D000910558F58133910509F46FC048F48932BC
:1014E000910509F463C08A32910509F46DC072C098
:1014F00089339105E9F082389105D1F08533910562
:1015000009F44DC067C0833E910581F138F4803EF7
:101510009105B9F0823E9105D9F05CC0863E9105F7
:1015200061F1873E9105A1F155C00E94FA07089527
:101530002091A10320FD02C021FF4CC080EE90E06D
:1015400049C08091A10380FFF9CF89E390E042C0B8
:101550008091A10382FF0EC08091A10384FF03C08C
:1015600080E090E037C083EE90E034C08091A1032A
:1015700082FFF2CF82EE90E02DC08091A10383FF25
:101580000BC08091A10384FDEBCF87EE90E022C0D9
:101590008091A10383FFF5CF86EE90E01BC0809180
:1015A000A10385FF07C089E290E014C08091A103E8
:1015B00085FFF9CF85E390E00DC08091A10386FF00
:1015C00007C08AE290E006C08091A10386FFF9CFB0
:1015D00081E390E00E940A080895CF92DF92EF9293
:1015E000FF920F931F9301E010E020E030E06801CC
:1015F000790104C0CC0CDD1CEE1CFF1C8A95D2F7CF
:1016000004C0000F111F221F331F6A95D2F70C2947
:101610001D292E293F29C0906303D0906403E090D8
:101620006503F0906603C022D122E222F322842FC8
:10163000C016D106E206F30641F41F910F91FF9008
:10164000EF90DF90CF900C9494251F910F91FF9015
:10165000EF90DF90CF900C94B52508950C942D0B4E
:101660005F926F927F928F929F92AF92BF92CF9232
:10167000DF92EF92FF920F931F93CF93DF93CDB73B
:10168000DEB72A970FB6F894DEBF0FBECDBFCE01EE
:1016900001966C014E019BE0890E911C20E030E028
:1016A00040E050E060E070E000E010E0E12CF12C60
:1016B0006C2C5D2C8AE0782EAA24A394B12CEDE644
:1016C000F2E0A62DB52D872D01900D928A95E1F7B8
:1016D000F601819191916F01FC01E07FFF27E032DB
:1016E000F10559F48F709927F50102C0EE0FFF1F25
:1016F0008A95E2F7EE2AFF2A37C0E033F10559F464
:101700008F709927F50102C0EE0FFF1F8A95E2F74F
:101710000E2B1F2B29C0E034F10559F48F70992747
:10172000F50102C0EE0FFF1F8A95E2F76E2B7F2BAB
:101730001BC0E035F10559F48F709927F50102C0FF
:10174000EE0FFF1F8A95E2F74E2B5F2B0DC0E036A0
:10175000F10551F48F709927F50102C0EE0FFF1FBC
:101760008A95E2F72E2B3F2BC814D90409F0A7CF96
:1017700084B19E2D9095892384B985B1E82AE5B876
:1017800087B1902F9095892387B988B1082B08B924
:101790008AB1962F909589238AB98BB1682B6BB942
:1017A0008DB1942F909589238DB98EB1482B4EB968
:1017B00080B3922F9095892380BB81B3282B21BBC6
:1017C0002A960FB6F894DEBF0FBECDBFDF91CF9142
:1017D0001F910F91FF90EF90DF90CF90BF90AF904F
:1017E0009F908F907F906F905F9008955F926F921F
:1017F0007F928F929F92AF92BF92CF92DF92EF92A1
:10180000FF920F931F93CF93DF93CDB7DEB7689707
:101810000FB6F894DEBF0FBECDBF85B7806885BF19
:1018200085B7806885BF0E94300BCE0101966C01A0
:101830004E0199E1890E911C20E030E040E050E03B
:1018400060E070E000E010E0E12CF12C6C2C5D2CED
:1018500088E1782EAA24A394B12CE7E7F2E0A62D24
:10186000B52D872D01900D928A95E1F7F6018191B2
:1018700091916F01FC01E07FFF27E032F10559F4FF
:101880008F709927F50102C0EE0FFF1F8A95E2F7CE
:10189000EE2AFF2A37C0E033F10559F48F709927FB
:1018A000F50102C0EE0FFF1F8A95E2F70E2B1F2BEA
:1018B00029C0E034F10559F48F709927F50102C071
:1018C000EE0FFF1F8A95E2F76E2B7F2B1BC0E035D2
:1018D000F10559F48F709927F50102C0EE0FFF1F33
:1018E0008A95E2F74E2B5F2B0DC0E036F10551F4DF
:1018F0008F709927F50102C0EE0FFF1F8A95E2F75E
:101900002E2B3F2BC814D90409F0A7CF84B19E2DEC
:101910009095892384B985B1E82AE5B887B1902FDD
:101920009095892387B988B1082B08B98AB1962F79
:10193000909589238AB98BB1682B6BB98DB1942F9F
:10194000909589238DB98EB1482B4EB980B3922FD3
:101950009095892380BB81B3282B21BBE2EBF2E079
:10196000A8EAB2E0119211921D921D9282E0EC3B26
:10197000F807C1F768960FB6F894DEBF0FBECDBF6B
:10198000DF91CF911F910F91FF90EF90DF90CF905B
:10199000BF90AF909F908F907F906F905F900C94CE
:1019A000EF075F926F927F928F929F92AF92BF925A
:1019B000CF92DF92EF92FF920F931F93CF93DF931B
:1019C000CDB7DEB7A2970FB6F894DEBF0FBECDBF7E
:1019D0006E0149E1C40ED11C88EAA82E82E0B82E1F
:1019E00075019AE0592E460101E010E028E1622ECF
:1019F00035E0732EEDE6F2E0D401852D01900D92D5
:101A00008A95E1F7D6018D919D916D019C01207F12
:101A100033272032310591F424B18F709927F801D2
:101A200002C0EE0FFF1F8A95E2F7CF01922F982B8D
:101A300094B995B18095892385B953C02033310578
:101A400091F427B18F709927A80102C0440F551F48
:101A50008A95E2F7CA01922F982B97B998B1809591
:101A6000892388B93EC02034310591F42AB18F70A2
:101A70009927D80102C0AA0FBB1F8A95E2F7CD01B2
:101A8000922F982B9AB99BB1809589238BB929C045
:101A90002035310591F42DB18F709927F80102C0DE
:101AA000EE0FFF1F8A95E2F7CF01922F982B9DB979
:101AB0009EB1809589238EB914C02036310589F4F2
:101AC00020B38F709927A80102C0440F551F8A9533
:101AD000E2F7CA01922F982B90BB91B3809589238E
:101AE00081BB50EA5A95F1F7BE016F5F7F4F20E04E
:101AF00030E040E050E0E7E7F2E0DE011196862DAD
:101B000001900D928A95E1F7DB018D919D91BD01C8
:101B1000FC01E07FFF27E032F10511F4E3B113C0CF
:101B2000E033F10511F4E6B10EC0E034F10511F433
:101B3000E9B109C0E035F10511F4ECB104C0E036BB
:101B4000F105B9F4EFB1F0E08F70992702C0F59577
:101B5000E7958A95E2F7E0FD08C0C801042E02C0AF
:101B6000880F991F0A94E2F702C080E090E0282BCA
:101B7000392B4F5F5F4F4C30510509F0BCCFF70157
:101B8000808191818217930721F0318320837092A5
:101B90000B020E94300BF2E0EF0EF11C42EBE41658
:101BA00042E0F40609F026CF80910B028823C9F0A9
:101BB000815080930B02882339F08FE99FE00197D1
:101BC000F1F700C000000DC0E2EBF2E0D5018D910D
:101BD0009D915D0181939193B2EBAB16B2E0BB0690
:101BE000A9F70E94F50781E0A2960FB6F894DEBF30
:101BF0000FBECDBFDF91CF911F910F91FF90EF905E
:101C0000DF90CF90BF90AF909F908F907F906F901C
:101C10005F900895E82FF0E0EE0FFF1FEE54FD4FA8
:101C2000808191810895089580918C0381608093D3
:101C30008C030C94B82880918C038E7F80938C0346
:101C40000C94B8280E948A28811102C00E9466283C
:101C50000E94B42880938C033E9A809171008D7FFE
:101C60008093710082E0809390008AE180939100DC
:101C700081E08093BE0208958091BE02811102C06E
:101C80000E94220E10920E0310920D03809171009B
:101C90008D7F80937100809190008F77809390006A
:101CA0001092D0021092CF021092070310920803F4
:101CB0001092090310920A03109206031092050372
:101CC000E5EEF2E0A5EDB2E01192119211921192BF
:101CD0001D921D9283E0E530F807B1F70895CF9289
:101CE000DF92EF92FF920F931F93CF93DF93209198
:101CF000CF02222309F484C06B017C018091BE02D3
:101D0000811102C00E94220E05E013E0C7E0D0E07E
:101D1000A7019601F80192918291729162918F01CF
:101D20000E94F42D811131C0FE01EE0FFF1FEE0F56
:101D3000FF1FEB51FD4F1082118212821382DE01D0
:101D4000AA0FBB1FAB52BD4F11961C921E92C730FB
:101D5000D105E9F0219644815581668177814083E0
:101D600051836283738314821582168217821296BE
:101D70008D919C91139711969C938E9313961C9220
:101D80001E92129734961296E2CF219708F6809110
:101D90000D0390910E03019797FD05C090930E03DC
:101DA00080930D0304C010920E0310920D038091D6
:101DB0000D0390910E0320910B0330910C03281713
:101DC000390724F010920C0310920B03892BC1F4F5
:101DD000809171008D7F80937100809190008F774A
:101DE0008093900010920703109208031092090349
:101DF00010920A0310920603109205031092CF026C
:101E0000DF91CF911F910F91FF90EF90DF90CF90D6
:101E100008951F920F920FB60F9211244F925F9266
:101E20006F927F928F929F92AF92BF92CF92DF92EA
:101E3000EF92FF922F933F934F935F936F937F9314
:101E40008F939F93AF93BF93CF93DF93EF93FF93C2
:101E50008091CF02882309F49BC1C0910D03D091DA
:101E60000E031C161D060CF093C14090BF0250904B
:101E7000C0026090C1027090C20220E030E0A9016F
:101E8000C301B2010E94432F18160CF065C0C13087
:101E9000D10509F452C080910B0390910C03BE014F
:101EA0000E9423317C0190930C0380930B0380905C
:101EB000D1029090D202A090D302B090D40220E040
:101EC00030E040E85FE3C501B4010E94902D6093CB
:101ED000D1027093D2028093D3029093D402F7017F
:101EE000EE0FFF1FEE0FFF1FEB51FD4FA3019201FD
:101EF00060817181828193810E94F82D20E030E021
:101F000040E05EE30E94472F9B01AC01C501B40194
:101F10000E94432F18168CF4C7010196BE010E943F
:101F2000233190930C0380930B031092D1021092F3
:101F3000D2021092D3021092D402E0910B03F091DE
:101F40000C03EE0FFF1FEE0FFF1FEB51FD4F6081E3
:101F5000718182819381D0C0C0900703D090080323
:101F6000E0900903F0900A0320E030E0A901C701E6
:101F7000B6010E94F42D2197882309F4A2C0FE0126
:101F8000EE0FFF1FEE0FFF1FEB51FD4F8080918082
:101F9000A280B380A5019401C701B6010E94F42D6F
:101FA00087FF31C0A501940160E070E08CED93ECF7
:101FB0000E94F82D20E030E040E451E40E94F82D2A
:101FC00020E030E040E05FE30E94472F9B01AC013E
:101FD00060E070E080E090E40E94AA2F9B01AC01D9
:101FE000C501B4010E94472F9B01AC01C701B60196
:101FF0000E94F42D87FF07C0A701960160E070E002
:102000008CED93E439C0A5019401C701B6010E948B
:10201000432F18160CF055C0A501940160E070E044
:102020008CED93E40E94F82D20E030E040E451E490
:102030000E94F82D20E030E040E05FE30E94472F4F
:102040009B01AC0160E070E080E090E40E94AA2F68
:102050009B01AC01C501B4010E94472F9B01AC015B
:10206000C701B6010E94432F18165CF5A70196011F
:1020700060E070E08CED93EC0E94F82D20E030E001
:1020800040E451E40E94F82D20E030E040E05FE3BE
:102090000E94472F9B01AC0160E070E080E090E47B
:1020A0000E94AA2F9B01AC01C701B6010E94472FD5
:1020B00060930703709308038093090390930A03C6
:1020C00013C0FE01EE0FFF1FEE0FFF1FEB51FD4F80
:1020D00080819181A281B38180930703909308034B
:1020E000A0930903B0930A0360910703709108035A
:1020F0008091090390910A032091BC023091BD02A6
:102100002F3F4FEF340731F02F5F3F4F3093BD0229
:102110002093BC020E9430136B017C0120E034E26A
:1021200044EF51E40E94F42D87FF08C086EFC82ECB
:1021300088E2D82E84EFE82E81E4F82E20E030E00B
:1021400040E051E4C701B6010E94472F9B01AC015A
:1021500060E074E284E79BE40E94F82D6B017C014F
:102160000E94602E709397006093960020910C025D
:1021700030910D0240910E0250910F02C701B6013D
:102180000E94472F0E94602E7093990060939800E0
:102190008091D002882309F433C1C090CB02D09043
:1021A000CC02E090CD02F090CE0220E030E0A90118
:1021B000C701B6010E94432F1816D4F58091BC02C6
:1021C0009091BD028F3F2FEF920729F001969093D7
:1021D000BD028093BC02C701B6010E94301320E00B
:1021E00030E040E051E40E94472F9B01AC0160E0E9
:1021F00074E284E79BE40E94F82D6B017C010E944D
:10220000602E709397006093960020910C0230919D
:102210000D0240910E0250910F02C701B6010E94BB
:10222000472F0E94602E709399006093980008C019
:1022300010929700109296001092990010929800B8
:102240006091C5027091C6026F5F7F4F7093C602A6
:102250006093C502209196003091970080E090E055
:10226000232BF1F0C0919600D09197000E94912EFF
:102270006B017C01BE0180E090E00E94912E9B01E9
:10228000AC016091C7027091C8028091C90290911F
:10229000CA020E94F82D20E03FEF4FE757E410C03C
:1022A0000E94912E6B017C0120E030EE4FEF54E450
:1022B0006091C7027091C8028091C9029091CA02D0
:1022C0000E94472F9B01AC01C701B6010E94432F1A
:1022D00087FD96C08091C3028F5F8093C30290E018
:1022E000209188033091890382179307A0F0809191
:1022F0009303882319F01092C3020DC080917100DE
:102300008D7F80937100809190008F7780939000F3
:102310001092D0027DC08091C402C091C30281118D
:1023200028C0C0908D03D0908E03E0908F03F09072
:10233000900320E030E0A901C701B6010E94432FBD
:102340001816BCF481E08093C4021092CB02109264
:10235000CC021092CD021092CE02C092C702D0924F
:10236000C802E092C902F092CA02C150C093C302EF
:1023700043C01092C4021092BD021092BC02E091C0
:102380008A03F0918B0348E0C49FE00DF11D1124F6
:1023900080819181A281B3818093CB029093CC0202
:1023A000A093CD02B093CE0220E030E040E85EE39F
:1023B00064817581868197810E94472F6B017C0122
:1023C00020E030E048EC52E460911002709111027C
:1023D00080911202909113020E94F82D9B01AC0192
:1023E000C701B6010E94472F6093C7027093C802CD
:1023F0008093C9029093CA021092C6021092C5023D
:1024000080918C0380FD04C01092D0021092CF0204
:10241000FF91EF91DF91CF91BF91AF919F918F91FC
:102420007F916F915F914F913F912F91FF90EF902E
:10243000DF90CF90BF90AF909F908F907F906F90E4
:102440005F904F900F900FBE0F901F901895CF92F6
:10245000DF92EF92FF92CF93DF936B017C01EA0151
:102460008091BE02811102C00E94220E80918C03D5
:1024700080FF46C080910D0390910E0308970CF0E9
:102480003FC0809171008D7F809371008091D00258
:1024900081110E943C0E81E08093CF021092BD0218
:1024A0001092BC0220E030E0A901C701B6010E94F1
:1024B000432F1816DCF480910D0390910E03FC015C
:1024C000EE0FFF1FEE0FFF1FEB51FD4FC082D182B9
:1024D000E282F382FC01EE0FFF1FEB52FD4FD1832E
:1024E000C083019690930E0380930D038091710039
:1024F000826080937100809190008068809390004A
:10250000DF91CF91FF90EF90DF90CF9008958F9261
:102510009F92AF92BF92CF92DF92EF92FF920F9372
:102520001F93CF93DF93EC017B01D42E4801590117
:102530008091BE02811102C00E94220E80918C0304
:1025400080FF6BC0809171008D7F809371008091BE
:10255000CF0281110E943C0E81E08093D002D09383
:102560008B03C0938A03F0928903E0928803D09290
:10257000930380928D0390928E03A0928F03B0926A
:1025800090031092D1021092D2021092D3021092B4
:10259000D4021092C30288819981AA81BB81809361
:1025A000CB029093CC02A093CD02B093CE0220E058
:1025B00030E040E85EE36C817D818E819F810E94E6
:1025C000472F6B017C0120E030E048EC52E4609141
:1025D00010027091110280911202909113020E94D8
:1025E000F82D9B01AC01C701B6010E94472F6093F3
:1025F000C7027093C8028093C9029093CA021092D6
:10260000C6021092C50280917100826080937100B1
:1026100080919000806880939000DF91CF911F910E
:102620000F91FF90EF90DF90CF90BF90AF909F9071
:102630008F90089580910F0390E0019665E070E01F
:102640000E94233180930F03089580910F0390E03F
:10265000019765E070E00E94233180930F03089595
:102660008F929F92AF92BF92CF92DF92EF92FF92A2
:10267000CF93DF936B017C01C091BC02D091BD026E
:10268000BE0180E090E00E94912E4B015C01A70109
:10269000960160E070E08CE594E40E94F82D9B01C7
:1026A000AC01C501B4010E94472F0E94652E4091E4
:1026B0000F03423009F45CC028F4442351F0413048
:1026C000E9F0FBC0433009F481C0443009F4B4C0E0
:1026D000F4C080E090E0A0E0BFE380930C02909310
:1026E0000D02A0930E02B0930F021092BF0210923F
:1026F000C0021092C1021092C202DFC01092BF024B
:102700001092C0021092C1021092C202643171058F
:1027100040F46A307105E0F520E030E040E85EE327
:102720003BC0693C710508F0C0C080E090E00E94A9
:10273000912E20E030E040EA51E40E948F2D20E00D
:1027400030E044E353E40E94F82D9B01AC010E9469
:10275000472F20E030E040E05EE30E94472F9B01DE
:10276000AC0160E070E080E09EE30E948F2D5BC0D2
:102770001092BF021092C0021092C1021092C202C7
:102780006432710578F4FB01EE59FF4F0C94373138
:1027900020E030E040E05FE3C701B6010E94472F30
:1027A0006B017C0180E090E0A0E0BEE380930C022E
:1027B00090930D02A0930E02B0930F027EC0A7016A
:1027C0009601C701B6010E94902DEACF1092BF0278
:1027D0001092C0021092C1021092C2022AE0269FFB
:1027E000A001279F500D1124CA0168EB7BE00E94D5
:1027F0000F31BC016C5D754077FF03C07195619529
:102800007109882777FD8095982F0E94932E2EE3DB
:1028100033EC4EE259E30E94472F20E030E040ECD9
:102820005EE30E94902D60930C0270930D028093E2
:102830000E0290930F0241C01092BF021092C0028C
:102840001092C1021092C202CE0183709927892B87
:10285000E1F0BE016170772780E090E00E94912E48
:1028600020E030E040E05EE30E94472F20E030E0CF
:1028700040E45FE30E94902D60930C0270930D0280
:1028800080930E0290930F020CC080E090E0A0E0D5
:10289000BFE380930C0290930D02A0930E02B093BD
:1028A0000F02C770DD27CD2B41F410920C0210925D
:1028B0000D0210920E0210920F02C701B601DF91B5
:1028C000CF91FF90EF90DF90CF90BF90AF909F900F
:1028D0008F900895809118030895CF93DF9300D0CF
:1028E0001F92CDB7DEB79C0180919803843019F513
:1028F00093E099833B832A839093E9008FEF909133
:10290000E800815095FD06C095ED9A95F1F700001D
:102910008111F5CF8091E80085FF0DC040E050E0C7
:1029200063E070E0CE0101960E94A6168091E80057
:102930008E778093E8000F900F900F90DF91CF91EA
:102940000895CF93DF9300D01F92CDB7DEB72091CB
:102950009803243021F522E029839B838A8383E036
:102960008093E9008FEF9091E800815095FD06C0BB
:1029700095ED9A95F1F700008111F5CF8091E8006F
:1029800085FF0DC040E050E063E070E0CE010196AD
:102990000E94A6168091E8008E778093E8000F9041
:1029A0000F900F90DF91CF910895209198032430DC
:1029B000F1F422E02093E9002FEF3091E80021505C
:1029C00035FD06C035ED3A95F1F700002111F5CF40
:1029D0002091E80025FF0BC040E050E065E070E08A
:1029E0000E94A6168091E8008E778093E8000895F3
:1029F000CF93DF9320919803243039F521E0209381
:102A0000E9002FEF3091E800215035FD06C035ED8B
:102A10003A95F1F700002111F5CF2091E80025FF4C
:102A200014C0EC0140E050E068E070E00E94A6169F
:102A30008091E8008E778093E80088E0FE01A0E1B5
:102A4000B3E001900D928A95E1F7DF91CF9108955F
:102A500080919703811109C00E943B180E94981829
:102A60008091E20084608093E200089510929703C1
:102A70000895089508950C94962742E061EC81E052
:102A80000E94B51742E061EC82E00E94B51742E077
:102A900061EC83E00C94B51780919A03833009F4BC
:102AA00053C030F4813071F0823009F48CC0089545
:102AB0008A3009F478C08B3009F45EC0893009F09F
:102AC0009AC020C080919903813A09F094C0809106
:102AD000E800877F8093E80080919D0390919E039A
:102AE000892B21F468E080E193E003C060E080E09E
:102AF00090E070E00E94F1168091E8008B7780935F
:102B0000E800089580919903813209F074C08091A2
:102B10009D0390919E03892B09F06DC08091E80080
:102B2000877F8093E8008091E80082FD05C0809156
:102B300098038111F8CF5FC08091F1008093180352
:102B40008091E8008B7753C080919903813A09F016
:102B500052C080919D0390919E03892B09F04BC038
:102B60008091E800877F8093E8008091E80080FFF3
:102B7000FCCF80911E0236C0809199038132D9F535
:102B800080919D0390919E03892BA9F58091E80087
:102B9000877F8093E8000E94EA1780919B038093CF
:102BA0001E020C945B2180919903813221F5809162
:102BB000E800877F8093E8000E94EA1780919C03D9
:102BC00080931903089580919903813AA1F480912B
:102BD000E800877F8093E8008091E80080FFFCCFC9
:102BE000809119038093F1008091E8008E778093A3
:102BF000E8000C94EA17089584B7877F84BF88E1C2
:102C00000FB6F89480936000109260000FBE90E0C1
:102C100080E80FB6F89480936100909361000FBE36
:102C20000E948D1B0E943B180E9498188091E20020
:102C300084608093E20078940E941E1B0E948F1B88
:102C400084E192E00E94391B80919803853069F4F9
:102C50000E945027809196038823B1F30E947E271B
:102C6000882391F30E949016EFCF0E94971BECCF20
:102C7000292F332723303105C9F064F42130310581
:102C800081F02230310509F043C084E590E028E16D
:102C90003AE042C021323105F1F02232310541F1F2
:102CA00037C082E190E02CE63AE036C099278130C7
:102CB000910541F08230910541F0892B49F5E4E11D
:102CC000FAE005C0E6EEF9E002C0EAEBF9E0849133
:102CD00090E09F0121C06330D8F4E62FF0E0EE0FC2
:102CE000FF1FE856FD4F2081318189E090E014C03C
:102CF000633070F470E0FB01EE0FFF1FEE56FD4FE6
:102D000020813181FB01E157FD4F808190E004C0BB
:102D100080E090E020E030E0FA01318320830895E4
:102D200080E189BD82E189BD09B400FEFDCF8091BB
:102D3000D8008F7D8093D8008091E00082608093DE
:102D4000E0008091E00081FDFCCF0895CF92DF92FA
:102D5000EF92FF920F931F93CF93DF93EC018B01C0
:102D60006A010E940918811133C0C114D10439F0DD
:102D7000F60180819181081B190BC80FD91FE12C26
:102D8000F12C0115110519F18091E80085FD16C09F
:102D90008091E8008E778093E800C114D10449F057
:102DA000F60180819181E80EF91EF182E08285E0D2
:102DB0000FC00E940918882321F30AC089918093CB
:102DC000F10001501109FFEFEF1AFF0ADACF80E09E
:102DD000DF91CF911F910F91FF90EF90DF90CF90F7
:102DE000089520919F033091A0032617370748F0DC
:102DF0006115710539F42091E8002E772093E800E1
:102E000001C0B90140E061157105A9F12091980355
:102E1000222309F443C0253009F442C02091E80080
:102E200023FD40C02091E80022FD32C02091E8003F
:102E300020FFE9CF4091F3002091F20030E0342BE5
:102E4000FC01CF016115710559F02830310540F4BE
:102E500081918093F100615071092F5F3F4FF1CF55
:102E600041E02830310509F040E02091E8002E775C
:102E70002093E800C8CF4111C9CF0AC080919803C0
:102E8000882361F0853061F08091E80083FD0AC0FD
:102E90008091E80082FFF2CF80E0089582E00895FB
:102EA00083E0089581E0089520919F033091A0036D
:102EB0002617370748F06115710539F42091E800AD
:102EC0002E772093E80001C0B901FC0120E06115D4
:102ED000710591F180919803882309F440C08530F1
:102EE00009F43FC08091E80083FD3DC08091E80077
:102EF00082FD2FC08091E80080FFE9CF2091F30090
:102F00008091F20090E0922B6115710559F08830A4
:102F1000910540F424912093F1003196615071099C
:102F20000196F2CF21E0089709F020E08091E800B7
:102F30008E778093E800CBCF2111CCCF0AC080914F
:102F40009803882361F0853061F08091E80083FD6B
:102F50000AC08091E80082FFF2CF80E0089582E00D
:102F6000089583E0089581E00895982F973058F5EB
:102F70009093E900981739F07091EC002091ED00E2
:102F80005091F00003C0242F762F50E021FF19C08C
:102F90003091EB003E7F3093EB003091ED003D7FB0
:102FA0003093ED003091EB0031603093EB00709383
:102FB000EC002093ED005093F0002091EE0027FFED
:102FC00007C09F5FD3CF8F708093E90081E00895A1
:102FD00080E008958091990387FF11C08091E800F7
:102FE00082FD05C0809198038111F8CF11C08091B6
:102FF000E8008B770BC080919803882349F080917B
:10300000E80080FFF8CF8091E8008E778093E80099
:1030100008952091E4003091E50095E64091EC00A0
:10302000842F817040FF22C08091E80080FD1CC089
:1030300080919803882391F0853091F08091EB0086
:1030400085FD10C04091E4005091E5004217530700
:1030500029F39A01915011F784E0089582E00895D0
:1030600083E0089581E0089580E008954091E800AC
:1030700042FFDECF08950E94A9180E94B118E0EE29
:10308000F0E0808181608083E8EDF0E080818F77DF
:10309000808319BCA7EDB0E08C918E7F8C938081EA
:1030A0008F7E80831092970308950F931F93CF9381
:1030B000DF930E94A9180E94B118C8EDD0E0888162
:1030C0008F77888388818068888388818F7D8883D3
:1030D00019BC1092980310929403109296031092C8
:1030E000950300EE10E0F80180818B7F808388815A
:1030F0008160888342E060E080E00E94B517E1EEE5
:10310000F0E080818E7F8083E2EEF0E0808181605C
:103110008083808188608083F80180818E7F8083B6
:10312000888180618883DF91CF911F910F910895ED
:10313000E8EDF0E080818F7E8083E7EDF0E0808134
:103140008160808384E082BF81E0809397030C9448
:103150005518E8EDF0E080818E7F80831092E200C8
:1031600008951092DA001092E10008951F920F92D4
:103170000FB60F9211242F933F934F935F936F934A
:103180007F938F939F93AF93BF93EF93FF93809120
:10319000E10082FF0BC08091E20082FF07C08091B6
:1031A000E1008B7F8093E1000E941D1B8091DA007B
:1031B00080FF1FC08091D80080FF1BC08091DA0083
:1031C0008E7F8093DA008091D90080FF0DC080E16E
:1031D00089BD82E189BD09B400FEFDCF81E0809305
:1031E00098030E94281505C019BC109298030E94EC
:1031F00036158091E10080FF19C08091E20080FFC8
:1032000015C08091E2008E7F8093E2008091E20001
:1032100080618093E2008091D80080628093D80022
:1032200019BC85E0809398030E943A158091E100D3
:1032300084FF30C08091E20084FF2CC080E189BD12
:1032400082E189BD09B400FEFDCF8091D8008F7D59
:103250008093D8008091E1008F7E8093E10080917F
:10326000E2008F7E8093E2008091E2008160809393
:10327000E20080919403882311F084E007C08091DC
:10328000E30087FD02C081E001C083E080939803E2
:103290000E943B158091E10083FF29C08091E200EC
:1032A00083FF25C08091E100877F8093E10082E069
:1032B00080939803109294038091E1008E7F809315
:1032C000E1008091E2008E7F8093E2008091E20035
:1032D00080618093E20042E060E080E00E94B517E8
:1032E0008091F00088608093F0000E943915FF9172
:1032F000EF91BF91AF919F918F917F916F915F916E
:103300004F913F912F910F900FBE0F901F901895E6
:103310001F920F920FB60F9211242F933F934F934A
:103320005F936F937F938F939F93AF93BF93CF934D
:10333000DF93EF93FF93C091E900CF708091EC0091
:10334000D82FD17080FDD0E81092E9008091F00074
:10335000877F8093F00078940E94CC191092E90046
:103360008091F00088608093F000CD2BCF70C093E7
:10337000E900FF91EF91DF91CF91BF91AF919F91C4
:103380008F917F916F915F914F913F912F910F900E
:103390000FBE0F901F9018951F93CF93DF93CDB75B
:1033A000DEB7AA970FB6F894DEBF0FBECDBFE9E92E
:1033B000F3E088E08E0F9091F10091938E13FBCF94
:1033C0000E944C158091E80083FF1FC180919903F2
:1033D00090919A03492F50E04A30510508F015C1E9
:1033E000FA01EA57FF4F0C943731803881F0823868
:1033F00009F00BC180919D038F708093E90080914B
:10340000EB0085FB882780F91092E90006C08091C7
:10341000950390919603911182609091E800977FB7
:103420009093E8008093F1001092F100C8C0282F1B
:103430002D7F09F0EAC0882319F0823061F0E5C0E1
:1034400080919B03813009F0E0C0933009F080E067
:10345000809396032BC080919B03811127C080919C
:103460009D038F7009F4D1C08093E9002091EB0097
:1034700020FF1CC0933021F48091EB00806214C0C7
:103480009091EB0090619093EB0021E030E0A90176
:1034900002C0440F551F8A95E2F74093EA0010924C
:1034A000EA008091EB0088608093EB001092E900C5
:1034B0008091E800877F86C08111A7C010919B038F
:1034C0001F778091E3008078812B8093E3008091C7
:1034D000E800877F8093E8000E94EA178091E80067
:1034E00080FFFCCF8091E30080688093E30011119E
:1034F00002C082E001C083E08093980386C08058B8
:10350000823008F082C080919B0390919C038C3D97
:1035100053E0950779F583E08A838AE289834FB780
:10352000F894DE01139620E03EE051E2E32FF0E054
:1035300050935700E49120FF03C0E295EF703F5F86
:10354000EF708E2F90E0EA3010F0C79601C0C09661
:103550008D939D932F5F243149F74FBF8091E800F1
:10356000877F8093E8006AE270E0CE0101960E94B6
:10357000F11614C0AE014F5F5F4F60919D030E9432
:103580003816BC01009709F440C09091E800977F7D
:103590009093E80089819A810E9454178091E800F5
:1035A0008B778093E80031C0803879F58091E8000E
:1035B000877F8093E800809194038093F10080914D
:1035C000E8008E778093E8000E94EA171EC0811100
:1035D0001CC090919B039230C0F48091E800877FDB
:1035E0008093E800909394030E94EA1780919403DB
:1035F000811106C08091E30087FD02C081E001C017
:1036000084E0809398030E943D158091E80083FF39
:103610000AC08091E800877F8093E8008091EB00EA
:1036200080628093EB00AA960FB6F894DEBF0FBEBF
:10363000CDBFDF91CF911F9108950895CF938091D1
:1036400098038823A1F0C091E900CF709091EC001D
:10365000892F817090FD80E8C82B1092E90080913D
:10366000E80083FD0E94CC19CF70C093E900CF9190
:10367000089590931F0380931E030895E0911E0305
:10368000F0911F03309721F00190F081E02D099413
:1036900080E00895E0911E03F0911F03309721F020
:1036A0000280F381E02D09940895E0911E03F091CA
:1036B0001F03309721F00480F581E02D09940895CF
:1036C00020911C0330911D038217930771F0909392
:1036D0001D0380931C03E0911E03F0911F0330979C
:1036E00021F00680F781E02D0994089520911A03B6
:1036F00030911B038217930771F090931B03809303
:103700001A03E0911E03F0911F03309721F000840B
:10371000F185E02D0994089508950C948C1B0E9466
:10372000CA270E94F60B0E9450280C94F82C4F9246
:103730005F927F928F929F92AF92BF92CF92DF92D1
:10374000EF92FF920F931F93CF93DF93CDB7DEB726
:103750002A970FB6F894DEBF0FBECDBF0E94D10CE2
:1037600091E2C92E93E0D92E00E010E0AA24A394A0
:10377000B12C702E802F0E940A0E4C01F601419050
:1037800051906F014826592641145104B1F40F5F3E
:103790001F4F0530110569F78FEF89838A831B82DC
:1037A0000E94D3278160782F9D838C8349815A8121
:1037B0006B818D810E94501C3AC08091770381FDFE
:1037C0000E94130E20E030E07501022E02C0EE0CC4
:1037D000FF1C0A94E2F7C70184219521892B09F186
:1037E0002E837F828E209F2091E0892809F490E02B
:1037F00098870E94D3278160782F9A8789874E8186
:103800005F8168858A850E94501C000F111FF80196
:10381000EF5DFC4F80819181E826F926F182E082FC
:1038200006C02F5F3F4F2C30310571F6B0CF0E949C
:10383000372A109120030E943E1B1817D9F00E94CE
:103840003E1B809320032A960FB6F894DEBF0FBE6E
:10385000CDBFDF91CF911F910F91FF90EF90DF903F
:10386000CF90BF90AF909F908F907F905F904F9040
:103870000C942E0B2A960FB6F894DEBF0FBECDBF68
:10388000DF91CF911F910F91FF90EF90DF90CF903C
:10389000BF90AF909F908F907F905F904F900895D2
:1038A000CF93DF93CDB7DEB72B970FB6F894DEBF7B
:1038B0000FBECDBF4F83588769877A878B87DE011C
:1038C000119686E0FD0111928A95E9F785E0FE01E7
:1038D000379601900D928A95E1F749815A816B8163
:1038E0007C818D819E810E94F5232B960FB6F894E2
:1038F000DEBF0FBECDBFDF91CF910895CF93882358
:1039000009F4C2C0C82F823859F40E943E1B81FDC1
:10391000BBC089E30E949E260E94212789E30CC038
:10392000833879F40E943E1B80FDAEC083E50E947F
:103930009E260E94212783E50E94BB26CF910C94EE
:103940002127843859F40E943E1B82FD9DC087E4E4
:103950000E949E260E94212787E4EECF8CEF8C0FD9
:10396000813A48F48C2F0E94602C81118DC08C2FDD
:103970000E949E26E3CF80E28C0F883048F4C77007
:1039800081E001C0880FCA95EAF70E94DA26D6CFF7
:103990008BE58C0F833078F4C53A29F0C63A31F0C4
:1039A00083E890E005C081E890E002C082E890E002
:1039B000CF910C94601B88E58C0F833108F064C0B4
:1039C000C83A39F1C93A41F1CA3A49F1CB3A51F111
:1039D000CC3A59F1CD3A61F1C03B69F1CE3A71F17F
:1039E000CF3A79F1C13B81F1C23B89F1C33B91F1FF
:1039F000C43B99F1C53BA1F1C63BA9F1C73BB1F16D
:103A0000C83BB9F1C93BC1F1CA3BC9F180E090E0C4
:103A100038C082EE90E035C089EE90E032C08AEE88
:103A200090E02FC085EB90E02CC086EB90E029C0A1
:103A300087EB90E026C08CEC90E023C08DEC90E00A
:103A400020C083E891E01DC08AE891E01AC082E9B5
:103A500091E017C084E991E014C081E292E011C0C6
:103A600083E292E00EC084E292E00BC085E292E035
:103A700008C086E292E005C087E292E002C08AE2D6
:103A800092E0CF910C94761BCF910895882309F48E
:103A90004BC0823859F40E943E1B81FF45C089E328
:103AA0000E949E260E94212789E30CC0833871F46E
:103AB0000E943E1B80FF38C083E50E949E260E9424
:103AC000212783E50E94BB260C942127843859F4D2
:103AD0000E943E1B82FF28C087E40E949E260E940F
:103AE000212787E4EFCF9CEF980F913A58F390E2AB
:103AF000980F983050F4877091E001C0990F8A9523
:103B0000EAF7892F0E94E026DFCF9BE5980F9330DC
:103B100020F480E090E00C94601B885A833120F4FC
:103B200080E090E00C94761B0895882321F00E9499
:103B3000DA260C9421270895882321F00E94E0269C
:103B40000C9421270895BF92CF92DF92EF92FF92BB
:103B50000F931F93CF93DF9300D000D000D0CDB749
:103B6000DEB725E0FC01DE01119601900D922A9549
:103B7000E1F7FC01D08011810281258122952F700F
:103B800043815481452B09F472C31F3F21F4FFEF99
:103B9000DF1609F46CC37C012E830E94F707D982DB
:103BA0001A8369817A81802F0E949A26182FB92E54
:103BB0000E944F260E9416252E81002319F00E9494
:103BC000F7262E81EB2DE295EF70F0E0E057FF4FE6
:103BD0000C9437318B2D807F9B2D9F70F92E88237D
:103BE00019F0F29480EFF822002389F0FF2009F405
:103BF0007CC280E2810F883020F48F2D0E94DA266B
:103C000003C08F2D0E94EA260E9421276EC2812FB9
:103C10000E94461DFF2009F42AC3105E8F2D183024
:103C200018F40E94E02602C00E94F02626960FB6E5
:103C3000F894DEBF0FBECDBFDF91CF911F910F91E2
:103C4000FF90EF90DF90CF90BF900C9421278B2DA9
:103C5000807F9B2D9F70803211F4892F03C0892FA4
:103C60008295807F112319F0113011F12BC00023B0
:103C7000A9F0222389F1213079F526960FB6F89420
:103C8000DEBF0FBECDBFDF91CF911F910F91FF908F
:103C9000EF90DF90CF90BF900C940A27222319F069
:103CA000213009F4E4C28E830E940D278E819BC1CE
:103CB000002321F0263008F0DAC20EC0253008F0CB
:103CC000D6C291C10023C9F0222331F0F7019581BA
:103CD00090FF0BC29F70958326960FB6F894DEBFB7
:103CE0000FBECDBFDF91CF911F910F91FF90EF904D
:103CF000DF90CF90BF900C94951D222309F473C1DF
:103D000009C22B2D26952695237030E0211531050B
:103D100021F021303105D1F0AAC2002321F0812FFA
:103D20009B2D937002C080E090E026960FB6F89429
:103D3000DEBF0FBECDBFDF91CF911F910F91FF90DE
:103D4000EF90DF90CF90BF900C94601B002321F088
:103D5000812F9B2D937002C080E090E026960FB6D5
:103D6000F894DEBF0FBECDBFDF91CF911F910F91B1
:103D7000FF90EF90DF90CF90BF900C94761B812F37
:103D8000002319F00E943F2902C00E94A72926960D
:103D90000FB6F894DEBF0FBECDBFDF91CF911F915C
:103DA0000F91FF90EF90DF90CF90BF900C942C2A52
:103DB0008B2D837009F07BC0011159C2812F829530
:103DC00086958770880F880F912F9F70C92ED12CF0
:103DD000E12CF12C082E04C0CC0CDD1CEE1CFF1CC9
:103DE0000A94D2F714FF12C04FE050E060E070E098
:103DF00004C0440F551F661F771F8A95D2F7CB0169
:103E0000BA01609570958095909503C060E070E070
:103E1000CB012B2D269526952370422F50E0423062
:103E20005105D9F04330510569F16C297D298E295E
:103E30009F294130510551F126960FB6F894DEBF07
:103E40000FBECDBFDF91CF911F910F91FF90EF90EB
:103E5000DF90CF90BF900C943D256C297D298E2951
:103E60009F2926960FB6F894DEBF0FBECDBFDF9117
:103E7000CF911F910F91FF90EF90DF90CF90BF9067
:103E80000C9459250E943D25C701B60126960FB610
:103E9000F894DEBF0FBECDBFDF91CF911F910F9180
:103EA000FF90EF90DF90CF90BF900C9421250023DE
:103EB00019F08B2D817001C08695882309F4D7C134
:103EC000812F829586958770880F880F912F9F701C
:103ED000C92ED12CE12CF12C082E04C0CC0CDD1CF9
:103EE000EE1CFF1C0A94D2F714FF12C04FE050E002
:103EF00060E070E004C0440F551F661F771F8A956D
:103F0000D2F7CB01BA01609570958095909503C06A
:103F100060E070E0CB012B2D269526952370422F73
:103F200050E042305105D9F04330510569F16C2918
:103F30007D298E299F294130510551F126960FB6D2
:103F4000F894DEBF0FBECDBFDF91CF911F910F91CF
:103F5000FF90EF90DF90CF90BF900C9417266C29C4
:103F60007D298E299F2926960FB6F894DEBF0FBEB5
:103F7000CDBFDF91CF911F910F91FF90EF90DF9018
:103F8000CF90BF900C9433260E941726C701B6012C
:103F900026960FB6F894DEBF0FBECDBFDF91CF914E
:103FA0001F910F91FF90EF90DF90CF90BF900C94F6
:103FB000FB25103F49F118F4103E48F491C0123F20
:103FC00009F453C0E8F1133F09F464C089C01F70BD
:103FD0008B2D8F71002321F00E949425812F7CCEA0
:103FE0000E94B525812F26960FB6F894DEBF0FBE2E
:103FF000CDBFDF91CF911F910F91FF90EF90DF9098
:10400000CF90BF900C949C1D0023B1F0253008F098
:104010002EC18B2D8F7126960FB6F894DEBF0FBE82
:10402000CDBFDF91CF911F910F91FF90EF90DF9067
:10403000CF90BF900C94DA25263008F018C1E9CF54
:104040000023A9F08B2D8F7126960FB6F894DEBF52
:104050000FBECDBFDF91CF911F910F91FF90EF90D9
:10406000DF90CF90BF900C949425002359F38B2DB3
:104070008F7126960FB6F894DEBF0FBECDBFDF91CD
:10408000CF911F910F91FF90EF90DF90CF90BF9055
:104090000C94B525002399F08B2D8F7126960FB6C1
:1040A000F894DEBF0FBECDBFDF91CF911F910F916E
:1040B000FF90EF90DF90CF90BF900C947F252696D5
:1040C0000FB6F894DEBF0FBECDBFDF91CF911F9129
:1040D0000F91FF90EF90DF90CF90BF900C947525DB
:1040E0000023A9F0222309F4ADCF812F26960FB625
:1040F000F894DEBF0FBECDBFDF91CF911F910F911E
:10410000FF90EF90DF90CF90BF900C947E1C222305
:1041100009F4ADCF812F26960FB6F894DEBF0FBEFF
:10412000CDBFDF91CF911F910F91FF90EF90DF9066
:10413000CF90BF900C94461D4B2D4F70612FC7013F
:104140000E942F0626960FB6F894DEBF0FBECDBF95
:10415000DF91CF911F910F91FF90EF90DF90CF9063
:10416000BF900C949924011182C09B2D9F70492F00
:1041700050E04230510509F443C0C4F441155105E3
:1041800071F14130510509F072C026960FB6F894CE
:10419000DEBF0FBECDBFDF91CF911F910F91FF907A
:1041A000EF90DF90CF90BF900C94202D43305105BD
:1041B000C1F14430510509F05AC0812F26960FB63F
:1041C000F894DEBF0FBECDBFDF91CF911F910F914D
:1041D000FF90EF90DF90CF90BF900C94722D2696B9
:1041E0000FB6F894DEBF0FBECDBFDF91CF911F9108
:1041F0000F91FF90EF90DF90CF90BF900C94092D1E
:1042000026960FB6F894DEBF0FBECDBFDF91CF91DB
:104210001F910F91FF90EF90DF90CF90BF900C9483
:104220003C2D26960FB6F894DEBF0FBECDBFDF91B2
:10423000CF911F910F91FF90EF90DF90CF90BF90A3
:104240000C944F2D4B2D4F70612FC70126960FB642
:10425000F894DEBF0FBECDBFDF91CF911F910F91BC
:10426000FF90EF90DF90CF90BF900C94F9072696C7
:104270000FB6F894DEBF0FBECDBFDF91CF911F9177
:104280000F91FF90EF90DF90CF90BF9008950E9424
:10429000F7260E9407270E94CC260E9421270E9411
:1042A000DD2A0E942C2A80E090E00E94601B80E0C2
:1042B00090E00C94761B0E94E7260C9447210E9404
:1042C0008F26292F22952F7030E02C3031054CF4A9
:1042D0002A3031056CF4225031092230310588F43E
:1042E00007C02C30310549F02F30310531F009C0BD
:1042F000803E48F0803F29F406C093FB882780F970
:10430000089580E0089581E00895CF93DF9300D071
:1043100000D01F92CDB7DEB70F900F900F900F9087
:104320000F90DF91CF910895CF93DF9300D000D00D
:1043300000D0CDB7DEB726960FB6F894DEBF0FBE1D
:10434000CDBFDF91CF9108951F93CF93DF93C0919D
:104350002B0316E080912C03C81799F0D0E01C9F26
:10436000F0011D9FF00D1124E35DFC4F4081518150
:1043700062817381848195810E9494212196C77006
:10438000E9CFDF91CF911F91089540915D03509146
:104390005E0360915F03709160038091610390916F
:1043A00062030C9494218091620382958F7009F0CE
:1043B00054C080915F03882309F44FC080912B0380
:1043C000A0912C0360915D0370915E0340916003A6
:1043D00050916103B6E08A1709F43FC090E041159F
:1043E0005105C1F17F3F11F46F3FA1F1B89FF0017A
:1043F000B99FF00D1124E35DFC4F218172132AC097
:104400002081621327C02281211124C0238134819D
:104410002417350710F421503109241B350B283C93
:104420003105C0F4209162032F7020612093620354
:1044300026E0289FF001299FF00D1124EE5CFC4F2F
:1044400080818F70806180838DE593E00E94A31D41
:104450000C94A42101968770BECF0895CF92DF926D
:10446000EF92FF920F931F93CF93DF93CDB7DEB7F9
:1044700062970FB6F894DEBF0FBECDBF8C0185E00A
:10448000F801DE011D9601900D928A95E1F7D801A1
:104490004C9111965C91119712966C91129713960C
:1044A000CD90DC90149730915D0370915E03809104
:1044B000600390916103009709F46BC17F3F19F489
:1044C0003F3F09F466C1E0905F03EE2009F4C0C0ED
:1044D00020916203C816D90628F0F601E81BF90BF3
:1044E000CF0104C0809590958C0D9D1DFF24F39401
:1044F000883C910578F0F12C207F09F0C6C07C2D16
:10450000D98AC88A89890E9485218DE593E00E9415
:10451000A31DB1C0822F807F09F046C0751314C05F
:10452000341312C0611110C02F70206120936203F8
:104530000E94C5218DE593E00E94A31D8091620336
:10454000D80115968C932EC0CD2819F15F3F11F438
:104550004F3FF9F0F62E61111CC080912B03209182
:104560002C0336E0821709F45AC090E0389FF0011E
:10457000399FF00D1124E35DFC4F7181571306C084
:104580007081471303C07281711103C00196877057
:10459000E9CFF62E662309F418C180916203816089
:1045A00080936203F12C11C1751308C0341306C047
:1045B000611104C080916203D801C3C04D875E873A
:1045C0008D859E856A8B0E945F216A898823E1F12F
:1045D0006623D1F120916203822F82958F7090E043
:1045E000029774F080915D0390915E0398878F83AA
:1045F0001986DB86CA862C87CE0107960E94A31DEA
:1046000086E0F801ADE5B3E001900D928A95E1F7FF
:104610000E94D3210E94C521FF24F394D6C04D8768
:104620005E878D859E850E948F26292F22952F706B
:1046300030E0223031050CF0BCC09F7009F0B6C0EC
:10464000805E883008F4C1C0C8010E94A31DE4CF79
:10465000C816D90608F453C0F601E81BF90BCF01C0
:10466000883C910508F450C0F12C7C2DD98AC88A69
:1046700089890E948521EDE5F3E086E0DF011D9246
:104680008A95E9F70E94C521A0C0751314C03413A0
:1046900012C0611110C080916203F8018583C801C6
:1046A0000E94A31D86E0EDE5F3E0DF011D928A95EF
:1046B000E9F7FE2C8AC04D875E878D859E856A8BC3
:1046C0000E945F216A89882309F4BECF662309F41A
:1046D000BBCF20916203822F82958F7090E002976A
:1046E0000CF48ECF80915D0390915E039A83898351
:1046F0001B82DD82CC822E83CE0101967FCF8095F6
:1047000090958C0D9D1DACCFF62E662309F49CCFA1
:1047100075132EC034132CC02091620320FD1FC0DE
:10472000822F82958F70D9F0D80115962C9315970A
:104730008F3049F08F5F982F9295907F822F8F70E6
:10474000892B15968C93C8010E94A31D86E0F80161
:10475000ADE5B3E001900D928A95E1F793CF86E045
:10476000F801ADE5B3E001900D928A95E1F72DC017
:104770004D875E878D859E850E945F21811140CF88
:1047800080916203816080936203C8010E94A31D2F
:104790001CC0662309F458CF4D875E878D859E85A2
:1047A0000E945F21882309F44FCF2ACF811148CF7F
:1047B0000CC0243031050CF047CF9F7009F440CF76
:1047C000F8019581907F09F03BCF8F2D62960FB64F
:1047D000F894DEBF0FBECDBFDF91CF911F910F9137
:1047E000FF90EF90DF90CF9008951F93CF93DF93CA
:1047F000CDB7DEB72C970FB6F894DEBF0FBECDBF96
:104800004F83588769877A878B879C87CE01079665
:104810000E942E22882369F08F8198852A853B8506
:10482000232BF1F19F3F09F063C08F3F09F060C077
:1048300037C086E0FE013796DE01119601900D9299
:104840008A95E1F76F817885EA85FB85309741F19C
:104850007F3F11F46F3F21F120912C0330E0C9011B
:1048600001968770992740912B0350E08417950794
:1048700009F447C069837A83FD83EC8396E0929FB5
:10488000D001939FB00D1124A35DBC4FFE01319662
:1048900001900D929A95E1F780932C030E94A42138
:1048A00016E080912B0390912C038917C1F1189F7A
:1048B000C0011124835D9C4F0E942E22882379F130
:1048C000E0912B031E9FF0011124E35DFC4F40811A
:1048D000518162817381848195810E9494218091AC
:1048E0002B0390E001968770992780932B03D9CFF3
:1048F0004F81588569857A858B859C850E94942196
:10490000CFCF0E945B2110922C0310922B03EDE578
:10491000F3E086E0DF011D928A95E9F7C1CF2C967E
:104920000FB6F894DEBF0FBECDBFDF91CF911F91C0
:104930000895EF92FF920F931F93CF93DF938C0113
:10494000009709F46CC0F12CEE24E394E801219661
:10495000F8018491843740F4843008F051C08130EC
:1049600081F0823019F15BC0853709F444C0A8F1A9
:104970009CE7980F903708F052C08F770E94461D31
:1049800041C00E5F1F4FFE01C49180E28C0F883042
:1049900048F4C7708E2D01C0880FCA95EAF70E94AF
:1049A000FA2614C08C2F0E947E1C2DC00E5F1F4F54
:1049B000FE01C49180E28C0F883058F4C7708E2DB0
:1049C00001C0880FCA95EAF70E9400270E9421279C
:1049D0001AC08C2F0E94461D16C00E5F1F4FFE018D
:1049E000C491CC2381F08FE99FE00197F1F700C0DB
:1049F0000000C150F6CF0E5F1F4FFE01F49003C0C0
:104A00000E947E1C8E018F2D882309F49FCFEFE931
:104A1000FFE03197F1F700C000008150F5CFDF9142
:104A2000CF911F910F91FF90EF900895089560939B
:104A30006703709368038093690390936A030C94EF
:104A400047210F931F9300916703109168032091F2
:104A5000690330916A03DC01CB01802B912BA22BDF
:104A6000B32B8093670390936803A0936903B0937B
:104A70006A031F910F910C9447210F931F9300918C
:104A80006703109168032091690330916A03DC0188
:104A9000CB0180239123A223B323809367039093B8
:104AA0006803A0936903B0936A031F910F910C945C
:104AB00047210F931F930091670310916803209182
:104AC000690330916A03DC01CB0180279127A2277B
:104AD000B3278093670390936803A0936903B0930F
:104AE0006A031F910F910C94472110926303109257
:104AF000640310926503109266030C94472141E011
:104B000050E060E070E004C0440F551F661F771F3F
:104B10008A95D2F7409363035093640360936503CF
:104B2000709366030C94472141E050E060E070E030
:104B300004C0440F551F661F771F8A95D2F78091D6
:104B4000630390916403A0916503B0916603482BC1
:104B5000592B6A2B7B2B4093630350936403609320
:104B60006503709366030C94472141E050E060E0D8
:104B700070E004C0440F551F661F771F8A95D2F757
:104B80004095509560957095809163039091640372
:104B9000A0916503B0916603482359236A237B23C0
:104BA00040936303509364036093650370936603BB
:104BB0000C94472141E050E060E070E004C0440FF5
:104BC000551F661F771F8A95D2F7809163039091D6
:104BD0006403A0916503B0916603482759276A27AB
:104BE0007B27409363035093640360936503709342
:104BF00066030C9447210F931F9300916303109158
:104C000064032091650330916603DC01CB01802BA6
:104C1000912BA22BB32B8093630390936403A093F7
:104C20006503B09366031F910F910C9447210F9376
:104C30001F930091630310916403209165033091E9
:104C40006603DC01CB0180239123A223B32380934D
:104C5000630390936403A0936503B09366031F916D
:104C60000F910C9447210F931F93009163031091B0
:104C700064032091650330916603DC01CB0180273A
:104C80009127A227B3278093630390936403A09393
:104C90006503B09366031F910F910C94472108950B
:104CA000CF92DF92EF92FF920F931F93CF93DF93F8
:104CB0008C01C0906703D0906803E0906903F09086
:104CC0006A038091630390916403A0916503B0919E
:104CD0006603C82AD92AEA2AFB2ACFE1D0E0D70105
:104CE000C6010C2E04C0B695A795979587950A9492
:104CF000D2F780FF06C0B8018C2F0E94530A01979B
:104D000021F4219760F780E001C08C2FDF91CF91D3
:104D10001F910F91FF90EF90DF90CF900895CF9368
:104D2000DF93EC010E945026BE010E94530ADF91DE
:104D3000CF910895CB010E948F26089520911F02E4
:104D400030912002F90132969FEF40E051915817BF
:104D500089F09F3F19F4511101C0942F4F5F4630E5
:104D6000A9F79F3F39F0F901E90FF11D97FDFA9579
:104D700082830895089520911F0230912002F90145
:104D80003296285F3F4F9081981301C01082319670
:104D9000E217F307C1F7089581E090E0E0911F0268
:104DA000F0912002E80FF91F1082019688309105DA
:104DB000A9F7089590917603892B8093760308953F
:104DC00080959091760389238093760308951092BD
:104DD0007603089590917503892B80937503089548
:104DE000809590917503892380937503089510929F
:104DF0007503089590917403892B8093740308952B
:104E00008095909174038923809374030895109280
:104E10007403089580936B03089510926B030895B3
:104E200080911F0290912002FC0131969C01285F25
:104E30003F4F80E0919191118F5FE217F307D1F717
:104E40000895E0911F02F091200280917603808303
:104E5000E0911F02F0912002908180917503892BCF
:104E60008083E0911F02F091200290818091740371
:104E7000892B808380916B03882361F0E0911F026E
:104E8000F09120029081892B80830E94102781114C
:104E900010926B0380911F02909120020C944A1B88
:104EA00080919803843039F11092780320E488E1EE
:104EB00090E00FB6F894A895809360000FBE209301
:104EC000600080E00E94F60580E00E942E0B83B710
:104ED000817F846083BF83B7816083BF7894889526
:104EE00083B78E7F83BF88E10FB6F894809360000C
:104EF000109260000FBE089508950895CF9380E04A
:104F00000E94F6050E947C270E94D10C0E947D27FA
:104F1000C0E08C2F0E940A0E892B29F4CF5FC53088
:104F2000C1F780E001C081E0CF9108950E945B212C
:104F300080E00E94F6050E94F82C0E943E1B0C9413
:104F40002E0B1F920F920FB60F9211248F939F93E7
:104F5000AF93BF9380917803811113C0809179033F
:104F600090917A03A0917B03B0917C034196A11D9F
:104F7000B11D8093790390937A03A0937B03B09340
:104F80007C03BF91AF919F918F910F900FBE0F90B7
:104F90001F90189582E084BD93E095BD9AEF97BD70
:104FA00080936E0008952FB7F894809179039091C3
:104FB0007A03A0917B03B0917C032FBF0895CF9219
:104FC000DF92EF92FF920F931F932FB7F8944091C7
:104FD000790350917A0360917B0370917C032FBF1A
:104FE0006A017B01EE24FF248C0120E030E0C01632
:104FF000D106E206F30610F4415051099A01281B2C
:10500000390BC9011F910F91FF90EF90DF90CF9066
:1050100008951F920F920FB60F9211248F939F93B2
:10502000AF93BF938091790390917A03A0917B0312
:10503000B0917C030196A11DB11D809379039093DB
:105040007A03A0937B03B0937C03BF91AF919F91B0
:105050008F910F900FBE0F901F9018950E943B18D4
:10506000F8942FEF87EA91E6215080409040E1F7D5
:1050700000C0000087E090EBDC018093A3039093D5
:10508000A403A093A503B093A6039CE088E10FB608
:10509000F894A895809360000FBE90936000FFCFB6
:1050A0000E948A28811102C00E9466280E949528C9
:1050B000809377030E94A2288093A1030E949928DD
:1050C000682F70E080E090E00C9417256DEE7EEF85
:1050D00080E090E00E945D3160E082E090E00E941C
:1050E0004B3160E083E090E00E944B3160E084E06F
:1050F00090E00E944B3160E085E090E00E944B31EF
:1051000060E086E090E00E944B316FEF87E090E036
:105110000C944B3180E090E00E94453121E08D3EBF
:105120009E4F09F020E0822F089582E090E00C94D9
:105130003D3183E090E00C943D31682F83E090E0B6
:105140000C944B3184E090E00C943D31682F84E066
:1051500090E00C944B3186E090E00C943D31682F48
:1051600086E090E00C944B3187E090E00C943D3168
:10517000682F87E090E00C944B3180917F0380FF93
:105180000BC06091240285E0689FB00111247595E1
:105190006795759567952BC081FF09C060912402C2
:1051A00085E0689FB00111247595679520C082FF46
:1051B00007C06091240285E0689FB001112417C0E8
:1051C000909180039923D1F060912302961788F77C
:1051D0002091240285E0289F90011124929FA00134
:1051E000939F500D112470E0CA010E942331603852
:1051F000710540F46115710539F002C065E070E099
:10520000862F08958FE7089581E0089580917F03A8
:1052100080FF08C06091220270E0759567957595D2
:10522000679521C081FF06C06091220270E07595EC
:10523000679519C082FF04C06091220270E010C01F
:10524000909180039923C1F0609121029617A0F7F5
:1052500080912202899FC001112470E00E942331B5
:105260006038710528F46115710521F0862F0895C5
:105270008FE7089581E0089561E070E0F4CF803F0A
:1052800021F40E94BD28819504C0813F29F40E9429
:10529000BD28809383030895823F21F40E94BD2896
:1052A000819504C0833F29F40E94BD288093820326
:1052B0000895893F19F40E94062905C08A3F31F4F8
:1052C0000E94062981958093840308958B3F21F4E1
:1052D0000E940629819504C08C3F29F40E9406296A
:1052E000809385030895843F21F480918103816038
:1052F00017C0853F21F480918103826011C0863FF1
:1053000021F48091810384600BC0873F21F4809158
:105310008103886005C0883F31F4809181038061FA
:105320008093810308958D3F21F480917F038160F4
:105330000BC08E3F21F480917F03826005C08F3FB8
:1053400029F480917F03846080937F030895803FD8
:1053500039F48091830387FF6CC01092830369C086
:10536000813F29F4809183031816BCF362C09091A9
:105370008203823F29F497FF5CC01092820359C0D8
:10538000833F19F41916CCF354C0893F41F480913E
:10539000840318160CF04DC0109284034AC08A3F53
:1053A00029F48091840387FF44C0F6CF8B3F39F402
:1053B0008091850387FF3DC0109285033AC08C3FE2
:1053C00029F4809185031816BCF333C0843F21F47F
:1053D000809181038E7F17C0853F21F480918103E6
:1053E0008D7F11C0863F21F4809181038B7F0BC09C
:1053F000873F21F480918103877F05C0883F31F486
:10540000809181038F7E8093810313C08D3F21F4AF
:1054100080917F038E7F0BC08E3F21F480917F03AC
:105420008D7F05C08F3F29F480917F038B7F809310
:105430007F038091820381110EC0809183038111CB
:105440000AC080918403811106C080918503811177
:1054500002C010928003089581E893E00E94551BDA
:105460000E94D32790937E0380937D0308951F931A
:10547000CF93DF9380917D0390917E030E94DF277D
:10548000AC0190918003992321F02091250230E016
:1054900006C0209126028AE0289F9001112442171D
:1054A000530708F486C080918203C0918303D09192
:1054B000840310918503811107C0C11176C0D111F9
:1054C00074C0111172C075C09F3F19F09F5F909317
:1054D0008003181624F40E94BD28809382038091D3
:1054E000820387FF05C00E94BD28819580938203B7
:1054F0001C1624F40E94BD288093830380918303AB
:1055000087FF05C00E94BD28819580938303609129
:105510008203662339F1C0918303CC2319F17727E5
:1055200067FD7095872F972F0E94932E23E333E317
:1055300043E35FE30E94472F0E94602E6093820343
:105540006C2F772767FD7095872F972F0E94932EDA
:1055500023E333E343E35FE30E94472F0E94602E7F
:10556000609383031D1624F40E940629809384030C
:105570008091840387FF05C00E940629819580934E
:105580008403111624F40E940629809385038091D8
:10559000850387FF05C00E940629819580938503B6
:1055A000DF91CF911F910C942C2A9F3F09F08ECF51
:1055B00096CFDF91CF911F910895E1E8F3E085E068
:1055C000DF011D928A95E9F71092800310927F0304
:1055D0000895833081F128F4813059F08230D1F080
:1055E0000895853009F449C0B8F1863009F456C0F1
:1055F000089580912602262F30E0280F311D2F3F7D
:10560000310524F4680F6093260208958FEF80938C
:105610002602089580912502262F30E0280F311DA3
:105620002F3F310524F4680F6093250208958FEF12
:1056300080932502089580912402262F30E0280FC0
:10564000311D2F3F310524F4680F60932402089523
:105650008FEF80932402089580912302262F30E05B
:10566000280F311D2F3F310524F4680F609323026A
:1056700008958FEF80932302089580912202262FB0
:1056800030E0280F311D2F3F310524F4680F60935F
:10569000220208958FEF80932202089580912102C3
:1056A000262F30E0280F311D2F3F310524F4680FDD
:1056B0006093210208958FEF809321020895833033
:1056C00011F128F4813049F0823091F0089585304D
:1056D00081F120F18630C1F108958091260268178A
:1056E00020F4861B809326020895109226020895C6
:1056F00080912502681720F4861B80932502089567
:1057000010922502089580912402681720F4861BC8
:105710008093240208951092240208958091230218
:10572000681720F4861B80932302089510922302A9
:10573000089580912202681720F4861B809322022C
:10574000089510922202089580912102681720F492
:10575000861B8093210208951092210208950F93D1
:105760001F938732D8F58E3108F087C08E3009F448
:1057700071C098F4873009F45BC08B3009F491C094
:10578000863009F095C080917703817F8E7F80936A
:10579000770381E0809387038CC0863109F481C050
:1057A00068F4803109F084C08091770383FB22275D
:1057B00020F991E0922790FB83F955C0893109F4D3
:1057C00070C08B3109F074C08091770381FB222770
:1057D00020F991E0922790FB81F945C0883309F4C4
:1057E00060C050F4893209F45EC0853309F45BC0AF
:1057F000873209F458C05CC0833409F454C028F4DB
:105800008A3308F455C0895339C0883409F050C030
:105810000E945B210E94D6070FEF13ED20E3015099
:1058200010402040E1F700C000000E942E2839C03F
:1058300090917703892F8095817080FB90F929F0F2
:10584000966098609093770334C0997F977F909388
:10585000770327C08091770382FB222720F991E00C
:10586000922790FB82F9809377039923D1F080915E
:10587000770381608093770314C08D5141E050E03D
:1058800060E070E08A019B0104C0000F111F221F1D
:10589000331F8A95D2F7C901B8010E9417250E94CB
:1058A0005B2181E006C061E070E080E090E0F5CF30
:1058B00080E01F910F91089580E0089580E00895A1
:1058C000CF93C82F80918703813069F018F0823020
:1058D000C9F184C0E0911F02F091200280818232E0
:1058E00009F07EC007C0E0911F02F0912002808184
:1058F000823261F48C2F0E945C2C811104C08C2FA9
:105900000E94AF2B1DC081E090E01AC08C2F0E9436
:105910005E2C811114C0C43179F048F4CB3079F099
:10592000C03109F061C082E08093870308C0C932AA
:1059300019F0C83321F058C01092870355C081E098
:10594000817054C0C93291F120F5C43179F1B0F4BD
:10595000C73009F047C08EE18093260282E380932E
:1059600025028AE08093240284E18093230288E068
:105970008093220288E28093210234C0CE51C63047
:1059800088F5EC2FF0E0E256FD4F8081809386038E
:1059900029C0CE34E9F020F4CB3421F56AE013C0FD
:1059A000C13579F0C235F1F461E00DC08091860314
:1059B000882319F01092860315C081E08093870335
:1059C00015C061E006C0809186030E94E92A0AC0E2
:1059D0006AE0809186030E945F2B04C010928703C7
:1059E00080E004C081E002C080E0AACFCF9108959A
:1059F0000E948A28811102C00E9466280E94AB285A
:105A00008093A20380FF02C0869501C080E00C94C1
:105A1000F6058091A203982F9695292F30E0233028
:105A200031054CF49F5F990F8170892B81608093C1
:105A3000A2030E94AF288091A20386950C94F605DC
:105A40008091A203982F969591F09158990F8170AB
:105A5000892B8093A2038E7F91E009F490E08091DE
:105A6000A20390FB80F98093A2030E94AF2880914B
:105A7000A20386950C94F6058091A203982F909529
:105A800090FB80F98093A2030E94AF288091A2032B
:105A900080FF02C0869501C080E00C94F6059091CD
:105AA000A203892F86958F5F8F779170843028F4B9
:105AB000880F892B8093A20302C09093A203809148
:105AC000A2038E7F91E009F490E08091A20390FB05
:105AD00080F98093A2030E94AF288091A20386954B
:105AE0000C94F6052091A203922F96958927982F62
:105AF000990F822F8170892B8093A2038E7F91E072
:105B000009F490E08091A20390FB80F98093A203B6
:105B10000E94AF288091A20386950C94F6055058F8
:105B2000BB27AA270ED075C166D130F06BD120F00B
:105B300031F49F3F11F41EF45BC10EF4E095E7FBD6
:105B400051C1E92F77D180F3BA1762077307840731
:105B5000950718F071F49EF58FC10EF4E0950B2EA9
:105B6000BA2FA02D0B01B90190010C01CA01A001AF
:105B70001124FF27591B99F0593F50F4503E68F10A
:105B80001A16F040A22F232F342F4427585FF3CF4B
:105B9000469537952795A795F0405395C9F77EF41C
:105BA0001F16BA0B620B730B840BBAF09150A1F065
:105BB000FF0FBB1F661F771F881FC2F70EC0BA0FEB
:105BC000621F731F841F48F4879577956795B79573
:105BD000F7959E3F08F0B3CF9395880F08F099276B
:105BE000EE0F979587950895D9D008F481E0089530
:105BF0000CD00FC107D140F0FED030F021F45F3F50
:105C000019F0F0C0511139C1F3C014D198F39923A0
:105C1000C9F35523B1F3951B550BBB27AA27621770
:105C20007307840738F09F5F5F4F220F331F441FB5
:105C3000AA1FA9F333D00E2E3AF0E0E830D09150ED
:105C40005040E695001CCAF729D0FE2F27D0660FDA
:105C5000771F881FBB1F261737074807AB07B0E819
:105C600009F0BB0B802DBF01FF2793585F4F2AF02F
:105C70009E3F510568F0B6C000C15F3FECF3983E0F
:105C8000DCF3869577956795B795F7959F5FC9F78C
:105C9000880F911D9695879597F90895E1E0660F15
:105CA000771F881FBB1F621773078407BA0720F08E
:105CB000621B730B840BBA0BEE1F88F7E0950895F7
:105CC00004D06894B111D9C00895BCD088F09F5712
:105CD00090F0B92F9927B751A0F0D1F0660F771F38
:105CE000881F991F1AF0BA95C9F712C0B13081F018
:105CF000C3D0B1E00895C0C0672F782F8827B85F60
:105D000039F0B93FCCF3869577956795B395D9F778
:105D10003EF490958095709561957F4F8F4F9F4F82
:105D20000895E89409C097FB3EF49095809570958E
:105D300061957F4F8F4F9F4F9923A9F0F92F96E9D7
:105D4000BB279395F695879577956795B795F1114C
:105D5000F8CFFAF4BB0F11F460FF1BC06F5F7F4FE9
:105D60008F4F9F4F16C0882311F096E911C07723FB
:105D700021F09EE8872F762F05C0662371F096E804
:105D8000862F70E060E02AF09A95660F771F881FD3
:105D9000DAF7880F9695879597F90895990F000877
:105DA000550FAA0BE0E8FEEF16161706E807F907ED
:105DB000C0F012161306E407F50798F0621B730B88
:105DC000840B950B39F40A2661F0232B242B252B09
:105DD00021F408950A2609F4A140A6958FEF811DAC
:105DE000811D089597F99F6780E870E060E008954D
:105DF0009FEF80EC089500240A94161617061806E3
:105E00000906089500240A941216130614060506BE
:105E10000895092E0394000C11F4882352F0BB0F4F
:105E200040F4BF2B11F460FF04C06F5F7F4F8F4FB2
:105E30009F4F089557FD9058440F551F59F05F3FED
:105E400071F04795880F97FB991F61F09F3F79F09C
:105E500087950895121613061406551FF2CF46951E
:105E6000F1DF08C0161617061806991FF1CF8695A0
:105E70007105610508940895E894BB276627772784
:105E8000CB0197F908958ADF08F48FEF08950BD0BE
:105E9000C0CFB1DF28F0B6DF18F0952309F0A2CF0C
:105EA000A7CF1124EACFC6DFA0F3959FD1F3950FBA
:105EB00050E0551F629FF001729FBB27F00DB11D8E
:105EC000639FAA27F00DB11DAA1F649F6627B00D1E
:105ED000A11D661F829F2227B00DA11D621F739F07
:105EE000B00DA11D621F839FA00D611D221F749F15
:105EF0003327A00D611D231F849F600D211D822F5C
:105F0000762F6A2F11249F5750408AF0E1F08823A2
:105F10004AF0EE0FFF1FBB1F661F771F881F9150AF
:105F20005040A9F79E3F510570F05CCFA6CF5F3F70
:105F3000ECF3983EDCF3869577956795B795F795E2
:105F4000E7959F5FC1F7FE2B880F911D969587956A
:105F500097F90895FA01EE0FFF1F309621053105DC
:105F600099F16115710561F48038BFE39B0749F130
:105F700068949038810561F08038BFEF9B0741F04D
:105F8000992342F5FF3FE1053105210511F1E89420
:105F90000894E795D901AA2329F4AB2FBE2FF85F07
:105FA000D0F310C0FF5F70F4A695E0F7F73950F01A
:105FB00019F0FF3A38F49F779F930CD00F9007FCAD
:105FC000905808953EF014CF60E070E080E89FE3C1
:105FD00008954FE79F775F934F933F932F939ED002
:105FE0002F913F914F915F9152DF05C019F40EF050
:105FF000F9CE42CFFDCE26DFC8F39638C0F707F8BA
:106000000F92E8942BE33AEA48EB5FE74EDF0F92FA
:106010000F920F924DB75EB70F92C0D0E0E4F1E05F
:1060200016D04F915F91EF91FF91E595EE1FFF1F05
:1060300049F0FE57E0684427EE0F441FFA95E1F758
:106040004195550B32D00F9007FE26C00895DF937F
:10605000CF931F930F93FF92EF92DF927B018C01FE
:10606000689405C0DA2EEF011EDFFE01E894A591C9
:106070002591359145915591AEF3EF0162DDFE0119
:106080009701A801DA9479F7DF90EF90FF900F91D4
:106090001F91CF91DF9108959B01AC0160E070E00A
:1060A00080E89FE3A5CD9ECEACC0CCDEE8F399237B
:1060B000D9F3940F511DBBF39150504094F059F017
:1060C000882332F0660F771F881F91505040C1F728
:1060D0009E3F510544F7880F911D9695879597F936
:1060E00008955F3FACF0983E9CF0BB27869577956E
:1060F0006795B79508F4B1609395C1F7BB0F58F752
:1061000011F460FFE8CF6F5F7F4F8F4F9F4FE3CF5A
:10611000B4CE0EF076C06CCE689464CE93DEC8F335
:106120009923D1F3C6F3DF93CF931F930F93FF927D
:10613000C92FDD2788232AF02197660F771F881F34
:10614000DAF720E030E040E85FEB9FE3883920F0A9
:10615000803E30F021968F77E3DCE8E6F1E003C083
:10616000DFDCE5E9F1E073DF8B01BE01EC01FB2E22
:106170006F5771097595771F880B990BD4DD28E14E
:1061800032E741E35FE38FDEAF2D9801AE01FF9070
:106190000F911F91CF91DF91D4DC3BCEFA01DC014E
:1061A000AA0FBB1F9B01AC01BF5728F4222733273E
:1061B000442750781FC0B75188F4AB2F0024469570
:1061C00037952795011CA395D2F3002069F0220F83
:1061D000331F441FB395DAF30DD0A1CC61307105A4
:1061E000A0E88A07B94630F49B01AC0166277727FF
:1061F00088279078309621F020833183428353831F
:1062000008959F3F31F0915020F4879577956795D9
:10621000B795880F911D9695879597F90895AA1BB4
:10622000BB1B51E107C0AA1FBB1FA617B70710F081
:10623000A61BB70B881F991F5A95A9F780959095B3
:10624000BC01CD01089597FB072E16F4009407D0EA
:1062500077FD09D00E940F3107FC05D03EF49095E0
:1062600081959F4F0895709561957F4F0895EE0F2A
:10627000FF1F0590F491E02D0994F999FECF92BD8E
:1062800081BDF89A992780B50895A8E1B0E042E071
:1062900050E00C946531262FF999FECF92BD81BD57
:1062A000F89A019700B4021639F01FBA20BD0FB654
:1062B000F894FA9AF99A0FBE08950196272F0E9432
:1062C0004C310C944B31DC01CB01FC01F999FECF30
:1062D00006C0F2BDE1BDF89A319600B40D9241506E
:0A62E0005040B8F70895F894FFCF7E
:1062EA0007000C52D02445000000410000DC4400A5
:1062FA0000004152D0A4440000404100005C440028
:10630A0000004148F17644000000415C978A44004D
:10631A000000411FD592440000004152D0A444001D
:10632A000000415CFFB844000000410AA7CF4400C6
:10633A000000410000DC44000000410AA7CF4400ED
:10634A000000410000DC44000000410000000000A1
:10635A0000804052D0244500004041000000000067
:10636A000080400AA74F45000040410AA7CF4400D9
:10637A000000410000DC4400000041000000000071
:10638A0000804052D0244500000041000000000077
:10639A000080405CFF38450000004100000000001A
:1063AA0000804052D02445000000410AA7CF440093
:1063BA000000410000DC4400000041000000000031
:1063CA0000804052D024450000804110F1764400FC
:1063DA0000A04112F1F6440000004141909B4400A4
:1063EA0000A04112F1F64400000041050000003F00
:1063FA000000C8426A14F814D514A1146D14016C73
:10640A00032808140A321E000002000400050007CF
:10641A000009000B000C000E0010001100130015FB
:10642A0000170018001A001C001D001F002100237D
:10643A000024002600280029002B002D002F003000
:10644A0000320034003500370039003B0042004575
:10645A000025002600430061006000200037006428
:10646A000065006600670044004600240047003FBC
:10647A004D36010BB40A7E0A2A0A430A5C0A010253
:08648A000304050607080900E0
:00000001FF

@ -1,1189 +0,0 @@
:100000000C9465020C94A9020C94A9020C94A90208
:100010000C94A9020C94A9020C94A9020C94A902B4
:100020000C94A9020C94A9020C94430D0C94150E87
:100030000C942B1C0C94A9020C94A9020C94A902F8
:100040000C94A9020C94A9020C94A9020C94A90284
:100050000C94A9020C94981C0C94A9020C94A9026B
:100060000C94A9020C94A9020C94A9020C94A90264
:100070000C94A9020C94A9020C94A9020C94A90254
:100080000C94A9020C94A9020C94A9020C94A90244
:100090000C94A9020C94A9020C94A9020C94A90234
:1000A0000C94A9020C94A9020C94A90235001E001C
:1000B0001F0020002100220023002400250026002C
:1000C00027002A002B0014001A0008001500170052
:1000D0001C0018000C00120013002A002900040064
:1000E0001600070009000A000B000D000E000F00AB
:1000F00033003400E1001D001B000600190005005C
:100100001100100036003700380028000030E000F1
:10011000E200E30003522C002C0004525000510076
:1001200052004F0035001E001F0020002100220059
:10013000230024002500260027002A002B0014009D
:100140001A00090013000A000D000F0018001C001F
:1001500033002A00290004001500160017000700CC
:100160000B00110008000C0012003400E1001D001B
:100170001B000600190005000E00100036003700B5
:10018000380028000030E000E200E30003522C00B9
:100190002C0004525000510052004F0035001E0048
:1001A0001F0020002100220023002400250026003B
:1001B00027002A002B0034003600370013001C00F3
:1001C00009000A00060015000F002A00290004009B
:1001D0001200080018000C0007000B0017001100A7
:1001E00016003800E100330014000D000E001B0063
:1001F000050010001A0019001D0028000030E00062
:10020000E200E30003522C002C0004525000510085
:1002100052004F0035001E001F0020002100220068
:10022000230024002500260027002A0035021E0294
:100230001F0220022102220223022402250226029A
:1002400027022A0001003A003B003C003D003E002E
:100250003F002D022E022F02300231020100400029
:100260004100420043004400450000530153025343
:100270000050010001000100010001000100010027
:1002800001000100AB00AA00A900AE0035001E006D
:100290001F0020002100220023002400250026004A
:1002A00027002A0035001E001F0020002100220028
:1002B000230024002500260027002A0001003A0020
:1002C0003B003C003D003E003F002D002E002F0073
:1002D0003000310001004000410042004300440072
:1002E000450000530153025300500100010001007A
:1002F000010001000100010001000100AB00AA00A3
:10030000A900AE002A0354006800650020005000D8
:10031000720065006F006E006900630020004B00F2
:100320006500790062006F006100720064000000E7
:100330002C034F007200740068006F006C006900AD
:100340006E0065006100720020004B0065007900BE
:1003500062006F006100720064007300000004031B
:10036000090409027400040100A0FA090400000154
:1003700003010100092111010001223F000705814D
:100380000308000A09040100010301020009211108
:10039000010001224D000705820308000A0904023A
:1003A00000010300000009211101000122360007AD
:1003B00005830308000A0904030002030000000982
:1003C00021110100012220000705840320000107FC
:1003D0000504032000011201100100000008EDFED9
:1003E00061600100010200010631FF0974A10109E9
:1003F00075150025FF9520750881020976150025E1
:10040000FF952075089102C005010980A1018502B0
:1004100016010026B7001A01002AB70075109501D1
:100420008100C0050C0901A1018503160100269C6D
:10043000021A01002A9C02751095018100C0050175
:100440000902A1010901A1000509190129051500E9
:10045000250195057501810295017503810105014D
:10046000093009311581257F950275088106093803
:100470001581257F950175088106050C0A3802153E
:1004800081257F950175088106C0C005010906A177
:1004900001050719E029E715002501950875018177
:1004A0000295017508810105081901290595057551
:1004B0000191029501750391010507190029FF15A6
:1004C0000025FF950675088100C011241FBECFEFDF
:1004D000DAE0DEBFCDBF04B603FE24C08091F10197
:1004E0009091F201A091F301B091F4018730904B0B
:1004F000A740B04BB9F41092F1011092F2011092A2
:10050000F3011092F40114BE84B7877F84BF88E1A1
:100510000FB6F89480936000109260000FBEE0E088
:10052000F8E3099511E0A0E0B1E0E0EEF9E402C0E3
:1005300005900D92A435B107D9F711E0A4E5B1E01B
:1005400001C01D92A13FB107E1F70E94720A0C940D
:10055000EE240C94000061110DC0FC0182818823FF
:1005600031F085EE0E9426110E94272303C085EEFC
:100570000E94EE1180E090E00895089508950E9491
:10058000D1026E9A769A8DEB92E0892B11F00C9441
:10059000BD0208958EEB92E0892B11F00C94BE02FF
:1005A0000895279A2F988FEF9FEF9093870080935D
:1005B00086008AE08093800089E1809381000C941A
:1005C000D02281110BC080918000877F80938000B2
:1005D00010928D0010928C002F9808952F988330E0
:1005E00041F4809180008860809380008FEF9FEFBE
:1005F00012C09091800098609093800023E030E0DA
:10060000281B3109220F331F8FEF9FEF02C09695F1
:1006100087952A95E2F790938D0080938C0008953A
:100620008B3B910568F4883A910530F5853A910540
:10063000C0F48430910598F4019709F06FC071C03F
:10064000803E910508F46AC0883E910540F09C0107
:10065000205F31092031310508F060C05CC09C0189
:10066000A1C0853A910509F45FC0863A910509F465
:100670005EC023E830E496C0883A910509F45AC078
:10068000893A910509F459C08A3A910509F458C08C
:100690008B3A910509F457C08C3A910509F456C07C
:1006A0008D3A910509F455C0803B910509F454C079
:1006B0008E3A910509F453C08F3A910509F452C05E
:1006C000813B910509F451C0823B910509F450C06A
:1006D000833B910509F44FC0843B910509F44EC05A
:1006E000853B910509F44DC0863B910509F44CC04A
:1006F000873B910509F44BC0883B910509F44AC03A
:10070000893B910509F449C08A3B910509F048C02D
:100710002AE236E447C09C01306544C020E030E066
:1007200041C021E030E03EC021E830E43BC022E897
:1007300030E438C022EE34E435C029EE34E432C06F
:100740002AEE34E42FC025EB34E42CC026EB34E44D
:1007500029C027EB34E426C02CEC34E423C02DEC74
:1007600034E420C023E835E41DC02AE835E41AC08B
:1007700022E935E417C024E935E414C021E236E467
:1007800011C023E236E40EC024E236E40BC025E2B9
:1007900036E408C026E236E405C027E236E402C0AB
:1007A00020E034E4C901089508959CE0799FF001A8
:1007B00011249CE3899FE00DF11D1124E60FF11D2A
:1007C000EE0FFF1FE455FF4F25913491C9010895A5
:1007D000880F991F845D9040FC0125913491C901D7
:1007E0000895880F991F84559F4FFC0125913491DE
:1007F000C90108950E94D5039C019A9581159F41D6
:1008000010F4C9010895C90190528115904128F44E
:10081000C9019F700E94F1030895C9019053811589
:10082000904120F4C9019927906C0895C901905412
:10083000409728F4C9018F709927946D089520314D
:1008400080E4380719F480E091ED0895213190E4B7
:10085000390719F480E090ED0895223140E434071F
:1008600019F480E092ED0895233180E4380719F4FB
:1008700080E093ED0895211590E5390769F40E9411
:1008800015162FEF44E38CE0215040408040E1F703
:1008900000C000000C94BD1C213090E5390731F4F4
:1008A0008091D00181608093D0010895C901905555
:1008B0008115904108F062C0432F55274F7055278E
:1008C00041305105F9F4C90174E0880F991F7A95F8
:1008D000E1F788279370B901E3E0660F771FEA9587
:1008E000E1F760767727862B972B9C682370332758
:1008F00002C0440F551F2A95E2F74F715527842BEC
:10090000952B08954230510529F4922F8827816F45
:10091000906A089543305105B9F4C90153E0880F36
:10092000991F5A95E1F7807E97702370332741E035
:1009300050E002C0440F551F2A95E2F74F7155272A
:10094000842B952B9C6808954430510549F5C901C5
:1009500043E0880F991F4A95E1F7807E97702370D6
:10096000332741E050E002C0440F551F2A95E2F7BB
:100970004F715527842B952B9A680895C90190577C
:100980008115904120F4C9019F7090620895C901BA
:1009900090588115904120F4C9019F70906A089584
:1009A000203E3105E0F4203C310568F52133310566
:1009B00009F475C048F42932310509F46BC02A32B4
:1009C000310509F07BC075C02933310501F12238AA
:1009D0003105E9F02533310509F070C051C0233EDF
:1009E0003105B1F140F4203E3105D1F0223E310510
:1009F00009F064C01CC0263E310579F1273E31055F
:100A000009F05CC038C0C9010E94E80308958091D4
:100A1000E10180FD02C081FF51C080EE90E04FC037
:100A20008091E10180FFF9CF89E390E048C0809197
:100A3000E10182FF0AC08091E10184FF03C080E0F0
:100A400090E03DC083EE90E03AC082EE90E037C087
:100A50008091E10182FFEFCFF8CF8091E10183FF28
:100A600007C08091E10184FDEACF87EE90E027C0C6
:100A700086EE90E024C08091E10183FFF2CFF8CFB1
:100A80008091E10185FF03C089E290E018C085E311
:100A900090E015C08091E10185FDF9CFF5CF8091FF
:100AA000E10186FF03C08AE290E009C081E390E0A3
:100AB00006C08091E10186FDF9CFF5CFC9010E9402
:100AC0001003089508955F926F927F928F929F9284
:100AD000AF92BF92CF92DF92EF92FF920F931F934C
:100AE000CF93DF93CDB7DEB72A970FB6F894DEBF6A
:100AF0000FBECDBF9E012F5F3F4F4E018BE0880E92
:100B0000911C60E070E000E010E0E12CF12CC12CC1
:100B1000D12CA12CB12C8AE0782E622E532E41E0EC
:100B200050E0E4E1F1E0A62DB52D872D01900D9266
:100B30008A95E1F7F901819191919F01FC01E07F94
:100B4000FF27E032F10559F48F709927FA0102C0AE
:100B5000EE0FFF1F8A95E2F7AE2ABF2A37C0E033B7
:100B6000F10559F48F709927FA0102C0EE0FFF1FAB
:100B70008A95E2F7CE2ADF2A29C0E034F10559F43C
:100B80008F709927FA0102C0EE0FFF1F8A95E2F7D6
:100B9000EE2AFF2A1BC0E035F10559F48F70992722
:100BA000FA0102C0EE0FFF1F8A95E2F70E2B1F2BF2
:100BB0000DC0E036F10551F48F709927FA0102C09B
:100BC000EE0FFF1F8A95E2F76E2B7F2B2815390554
:100BD00009F0A7CF94B18A2D8095892384B985B176
:100BE0008A2985B997B18C2D8095892387B988B1D9
:100BF0008C2988B99AB18E2D809589238AB98BB1B9
:100C00008E298BB99DB1802F809589238DB98EB1A6
:100C1000802B8EB990B3862F8095892380BB81B3BA
:100C2000862B81BB2A960FB6F894DEBF0FBECDBFD0
:100C3000DF91CF911F910F91FF90EF90DF90CF90B8
:100C4000BF90AF909F908F907F906F905F9008952E
:100C50005F926F927F928F929F92AF92BF92CF924C
:100C6000DF92EF92FF920F931F93CF93DF93CDB755
:100C7000DEB768970FB6F894DEBF0FBECDBF85B75D
:100C8000806885BF85B7806885BF0E9463059E0127
:100C90002F5F3F4F4E0189E1880E911C60E070E0AC
:100CA00000E010E0E12CF12CC12CD12CA12CB12CB6
:100CB00098E1792E622E532E41E050E0EEE1F1E012
:100CC000A62DB52D872D01900D928A95E1F7F9019A
:100CD000819191919F01FC01E07FFF27E032F105B6
:100CE00059F48F709927FA0102C0EE0FFF1F8A9501
:100CF000E2F7AE2ABF2A37C0E033F10559F48F700E
:100D00009927FA0102C0EE0FFF1F8A95E2F7CE2A5B
:100D1000DF2A29C0E034F10559F48F709927FA01D0
:100D200002C0EE0FFF1F8A95E2F7EE2AFF2A1BC0D2
:100D3000E035F10559F48F709927FA0102C0EE0FE2
:100D4000FF1F8A95E2F70E2B1F2B0DC0E036F10531
:100D500051F48F709927FA0102C0EE0FFF1F8A9598
:100D6000E2F76E2B7F2B2815390509F0A7CF94B138
:100D70008A2D8095892384B985B18A2985B997B14F
:100D80008C2D8095892387B988B18C2988B99AB12F
:100D90008E2D809589238AB98BB18E298BB99DB10F
:100DA000802F809589238DB98EB1802B8EB990B319
:100DB000862F8095892380BB81B3862B81BB1092BF
:100DC00055011092540110925F0110925E01109231
:100DD0005701109256011092610110926001109219
:100DE0005901109258011092630110926201109201
:100DF0005B0110925A0110926501109264011092E9
:100E00005D0110925C0110926701109266018FEBF8
:100E100092E0892BB9F068960FB6F894DEBF0FBE4A
:100E2000CDBFDF91CF911F910F91FF90EF90DF9099
:100E3000CF90BF90AF909F908F907F906F905F907A
:100E40000C94BF0268960FB6F894DEBF0FBECDBFFC
:100E5000DF91CF911F910F91FF90EF90DF90CF9096
:100E6000BF90AF909F908F907F906F905F9008950C
:100E70005F926F927F928F929F92AF92BF92CF922A
:100E8000DF92EF92FF920F931F93CF93DF93CDB733
:100E9000DEB7A2970FB6F894DEBF0FBECDBF7E01BE
:100EA00049E1E40EF11C2EE5C22E21E0D22E5E01B6
:100EB00053E2A50EB11C3AE0532E470101E010E0C9
:100EC00048E1642E55E0752EE4E1F1E0D401852D72
:100ED00001900D928A95E1F7F701819191917F013F
:100EE0009C01207F33272032310589F424B18F7093
:100EF0009927A80102C0440F551F8A95E2F7CA013D
:100F0000242B24B995B18095892385B94FC020330E
:100F1000310589F427B18F709927F80102C0EE0FCF
:100F2000FF1F8A95E2F7CF012E2B27B998B1809544
:100F3000892388B93BC02034310589F42AB18F70E8
:100F40009927A80102C0440F551F8A95E2F7CA01EC
:100F5000242B2AB99BB1809589238BB927C02035D2
:100F6000310589F42DB18F709927F80102C0EE0F79
:100F7000FF1F8A95E2F7CF012E2B2DB99EB18095E8
:100F800089238EB913C02036310581F420B38F70C8
:100F90009927A80102C0440F551F8A95E2F7CA019C
:100FA000242B20BB91B38095892381BB50EA5A95AD
:100FB000F1F7BE016F5F7F4F80E090E020E030E00E
:100FC000EEE1F1E0DE011196462D01900D924A9579
:100FD000E1F7FB0141915191BF01FA01E07FFF2749
:100FE000E032F10511F4E3B113C0E033F10511F47F
:100FF000E6B10EC0E034F10511F4E9B109C0E03505
:10100000F10511F4ECB104C0E036F105B9F4EFB12B
:10101000F0E04F70552702C0F595E7954A95E2F745
:10102000E0FD08C0A801022E02C0440F551F0A941B
:10103000E2F702C040E050E0842B952B2F5F3F4F3A
:101040002C30310509F0BCCFF60120813181281701
:10105000390721F091838083709200010E9463051B
:10106000F2E0CF0ED11CEA14FB0409F02DCF8091E1
:1010700000018823A1F1815080930001882339F079
:101080008FE99FE00197F1F700C0000028C0809130
:101090005E0190915F01909355018093540180917E
:1010A0006001909161019093570180935601809166
:1010B000620190916301909359018093580180914E
:1010C00064019091650190935B0180935A01809136
:1010D00066019091670190935D0180935C018AECB9
:1010E00092E0892B11F00E94CA0281E0A2960FB60D
:1010F000F894DEBF0FBECDBFDF91CF911F910F914E
:10110000FF90EF90DF90CF90BF90AF909F908F9027
:101110007F906F905F900895E82FF0E0EE0FFF1F33
:10112000EC5AFE4F8081918108950895809171015C
:101130000895CF93DF9300D01F92CDB7DEB72091F3
:10114000E701243021F523E029839B838A832093C0
:10115000E9008FEF06C095ED9A95F1F7000088231E
:1011600029F09091E800815095FFF5CF8091E8003B
:1011700085FF0DC040E050E063E070E0CE010196D5
:101180000E94280B8091E8008E778093E8000F90F2
:101190000F900F90DF91CF910895CF93DF9300D000
:1011A0001F92CDB7DEB72091E701243029F522E068
:1011B00029839B838A8383E08093E9008FEF06C0B5
:1011C00095ED9A95F1F70000882329F09091E800B9
:1011D000815095FFF5CF8091E80085FF0DC040E07C
:1011E00050E063E070E0CE0101960E94280B8091F0
:1011F000E8008E778093E8000F900F900F90DF91BA
:10120000CF9108952091E7012430F9F422E0209352
:10121000E9002FEF06C035ED3A95F1F700002223E3
:1012200029F03091E800215035FFF5CF2091E800FA
:1012300025FF0BC040E050E065E070E00E94280B05
:101240008091E8008E778093E8000895CF93DF9334
:10125000EC018091E701843041F581E08093E90061
:101260008FEF06C095ED9A95F1F70000882329F0DD
:101270009091E800815095FFF5CF8091E80085FFBF
:1012800014C040E050E068E070E0CE010E94280BFE
:101290008091E8008E778093E80088E0FE01A9E65F
:1012A000B1E001900D928A95E1F7DF91CF91089519
:1012B0008091E601811109C00E94C80C0E94250D91
:1012C0008091E20084608093E20008951092E6012C
:1012D0000895089508950C94201C809172018F5FE9
:1012E0008093720162E30E948924911135C01092AB
:1012F000720180917301882379F18091E701843034
:1013000049F58091E9008F709091EC0090FF02C048
:1013100090E801C090E0982B84E08093E9008091F0
:10132000EB0080FF14C08091EE0087FD03C00FC06A
:101330001092F1008091E80085FDFACF8091E800DD
:1013400080FF05C08091E8008E778093E8009F7051
:101350009093E90010927301089542E061EC81E0FE
:101360000E943E0C42E061EC82E00E943E0C42E0B2
:1013700061EC83E00E943E0C42E261EC84E00C945C
:101380003E0C8091E901833009F454C030F481307F
:1013900071F0823009F0A5C08CC08A3009F479C0A0
:1013A0008B3009F45FC0893009F09BC020C0809168
:1013B000E801813A09F095C08091E800877F809329
:1013C000E8008091EC019091ED01892B21F060E023
:1013D00080E090E003C068E089E691E070E00E9460
:1013E000770B8091E8008B778093E80008958091D7
:1013F000E801813209F075C08091EC019091ED0116
:10140000892B09F06EC08091E800877F8093E80007
:1014100005C08091E701882309F463C08091E8004A
:1014200082FFF7CF8091F100809371018091E800F5
:101430008B7753C08091E801813A09F052C08091C6
:10144000EC019091ED01892B09F04BC08091E800EF
:10145000877F8093E8008091E80080FFFCCF809137
:101460000B0136C08091E8018132D9F58091EC0101
:101470009091ED01892BA9F58091E800877F8093F9
:10148000E8000E94750C8091EA0180930B010C9496
:1014900015168091E801813221F58091E800877F5F
:1014A0008093E8000E94750C8091EB0180936801A5
:1014B00008958091E801813AA1F48091E800877F46
:1014C0008093E8008091E80080FFFCCF8091680164
:1014D0008093F1008091E8008E778093E8000C946F
:1014E000750C089584B7877F84BF88E10FB6F894A0
:1014F00080936000109260000FBE90E080E80FB60D
:10150000F89480936100909361000FBE0E943310A5
:101510000E94C80C0E94250D8091E2008460809397
:10152000E20078940E94C20F0E94351081E091E0A1
:101530000E94DF0F0BC00E94DD1B8091E501882314
:1015400029F00E94081C81110E94120B8091E70172
:10155000853089F30E943F10F9CF292F332723309C
:101560003105B1F04CF42130310509F44DC0223081
:10157000310509F04EC007C02132310541F1223258
:10158000310591F146C0E4E7F0E082E693E045C022
:1015900099278130910569F08230910589F0892B76
:1015A00009F037C0EEE5F3E0E491F0E08EE593E07A
:1015B00034C0E0E3F3E0E491F0E080E393E02DC099
:1015C000E4E0F3E0E491F0E084E093E026C06430EE
:1015D00000F5E62FF0E0EE0FFF1FEA5CFE4F808182
:1015E0009181E9E0F0E019C0643098F4E62FF0E072
:1015F000DF01AA0FBB1FA25CBE4F8D919C91EA5BDD
:10160000FE4FE081F0E009C0E2E1F0E086ED93E01A
:1016100004C0E0E0F0E080E090E0DA018D939C937C
:10162000CF01089580E189BD82E189BD09B400FE42
:10163000FDCF8091D8008F7D8093D8008091E0000D
:1016400082608093E0008091E00081FDFCCF0895EE
:10165000BF92CF92DF92EF92FF920F931F93CF939F
:10166000DF937C018B01EA010E94960CB82E811158
:1016700033C0209731F028813981021B130BE20E11
:10168000F31EC12CD12C23C08091E80085FD15C02C
:101690008091E8008E778093E800209749F0888158
:1016A00099818C0D9D1D9983888325E0B22E14C0ED
:1016B0000E94960C882359F00EC0F70181917F019A
:1016C0008093F10001501109FFEFCF1ADF0A0115D5
:1016D0001105D1F601C0B82E8B2DDF91CF911F914E
:1016E0000F91FF90EF90DF90CF90BF9008954091C1
:1016F000EE015091EF014617570748F0611571054B
:1017000039F44091E8004E774093E80001C0BA01F7
:10171000FC0140E033C08091E701882309F444C014
:10172000853009F443C08091E80083FD41C0809179
:10173000E80082FD33C08091E80080FF1FC09091D7
:10174000F3008091F200392F20E0A901482BCA0153
:1017500006C041914093F1006150710901966115F5
:10176000710519F088309105A0F341E0089709F060
:1017700040E08091E8008E778093E8006115710564
:1017800051F64111C8CF0AC08091E701882361F06A
:10179000853061F08091E80083FD0AC08091E80007
:1017A00082FFF2CF80E0089582E0089583E00895FB
:1017B00081E008954091EE015091EF0146175707DF
:1017C00048F06115710539F44091E8004E77409377
:1017D000E80001C0BA01FC0140E034C08091E7019B
:1017E000882309F445C0853009F444C08091E8009D
:1017F00083FD42C08091E80082FD34C08091E80002
:1018000080FF20C09091F3008091F200392F20E0FA
:10181000A901482BCA0107C044914093F1003196B9
:101820006150710901966115710519F088309105B3
:1018300098F341E0089709F040E08091E8008E7746
:101840008093E8006115710549F64111C7CF0AC0C0
:101850008091E701882361F0853061F08091E80094
:1018600083FD0AC08091E80082FFF2CF80E00895F6
:1018700082E0089583E0089581E00895982F2CC0B8
:101880009093E900981739F07091EC002091ED00E9
:101890005091F00003C0242F762F50E021FD02C0AC
:1018A0009F5F1AC03091EB003E7F3093EB00309188
:1018B000ED003D7F3093ED003091EB0031603093CF
:1018C000EB007093EC002093ED005093F00020911A
:1018D000EE0027FDE5CF07C0973090F28F70809320
:1018E000E90081E0089580E008958091E80187FD96
:1018F00005C08091E80080FF0EC012C08091E80012
:1019000082FD05C08091E7018111F8CF0895809193
:10191000E8008B7708C08091E7018111EACF089534
:101920008091E8008E778093E80008958091E4002C
:101930009091E50045E62091EC0020FD1FC023C0FA
:101940002091E701222391F0253091F02091EB00C6
:1019500025FD10C02091E4003091E50028173907DB
:1019600051F34150C90139F784E0089582E00895A8
:1019700083E0089581E0089580E008952091E800D3
:1019800020FFDECFF9CF2091E80022FFD9CFF4CF9E
:101990000E94360D0E943E0DE0EEF0E080818160F5
:1019A0008083E8EDF0E080818F77808319BCA7ED1C
:1019B000B0E08C918E7F8C9380818F7E808310929B
:1019C000E60108950F931F93CF93DF930E94360D86
:1019D0000E943E0DC8EDD0E088818F778883888192
:1019E0008068888388818F7D888319BC1092E70185
:1019F0001092E3011092E5011092E40100EE10E074
:101A0000F80180818B7F808388818160888342E0B8
:101A100060E080E00E943E0CE1EEF0E080818E7F8D
:101A20008083E2EEF0E08081816080838081886045
:101A30008083F80180818E7F8083888180618883A4
:101A4000DF91CF911F910F910895E8EDF0E0808133
:101A50008F7E8083E7EDF0E080818160808384E089
:101A600082BF81E08093E6010C94E20CE8EDF0E0A7
:101A700080818E7F80831092E20008951092DA00B8
:101A80001092E10008951F920F920FB60F92112449
:101A90002F933F934F935F936F937F938F939F9376
:101AA000AF93BF93EF93FF938091E10082FF0BC050
:101AB0008091E20082FF07C08091E1008B7F8093DC
:101AC000E1000E946D098091DA0080FF1FC08091C3
:101AD000D80080FF1BC08091DA008E7F8093DA00EF
:101AE0008091D90080FF0DC080E189BD82E189BD70
:101AF00009B400FEFDCF81E08093E7010E94580900
:101B000005C019BC1092E7010E9466098091E100AE
:101B100080FF19C08091E20080FF15C08091E20033
:101B20008E7F8093E2008091E20080618093E200EA
:101B30008091D80080628093D80019BC85E08093A2
:101B4000E7010E946A098091E10084FF30C0809122
:101B5000E20084FF2CC080E189BD82E189BD09B427
:101B600000FEFDCF8091D8008F7D8093D8008091BA
:101B7000E1008F7E8093E1008091E2008F7E809370
:101B8000E2008091E20081608093E2008091E301B5
:101B9000882311F084E007C08091E30087FF02C032
:101BA00083E001C081E08093E7010E946B0980918E
:101BB000E10083FF29C08091E20083FF25C080916E
:101BC000E100877F8093E10082E08093E70110923B
:101BD000E3018091E1008E7F8093E1008091E2003B
:101BE0008E7F8093E2008091E20080618093E2002A
:101BF00042E060E080E00E943E0C8091F00088604E
:101C00008093F0000E946909FF91EF91BF91AF911D
:101C10009F918F917F916F915F914F913F912F9104
:101C20000F900FBE0F901F9018951F920F920FB636
:101C30000F9211242F933F934F935F936F937F9352
:101C40008F939F93AF93BF93CF93EF93FF93809125
:101C5000E9008F709091EC0090FF02C090E801C005
:101C600090E0C92FC82B1092E9008091F000877F87
:101C70008093F00078940E94590E1092E9008091B0
:101C8000F00088608093F000CF70C093E900FF916E
:101C9000EF91CF91BF91AF919F918F917F916F9174
:101CA0005F914F913F912F910F900FBE0F901F901A
:101CB00018951F93CF93DF93CDB7DEB7AC970FB6D0
:101CC000F894DEBF0FBECDBFE8EEF1E08091F100E9
:101CD000819321E0E03FF207C9F70E94C10980919A
:101CE000E80083FF37C18091E8019091E9019530C8
:101CF00009F488C038F49130B1F170F0933009F0F4
:101D000029C131C0983009F4F8C0993009F404C1F0
:101D1000963009F01FC19DC0803821F0823809F04B
:101D200019C108C08091E4019091E501992389F0DF
:101D300082600FC08091EC019091ED018F70992726
:101D40008093E9008091EB0085FB882780F9109251
:101D5000E9009091E800977F9093E8008093F1006C
:101D60001092F100D5C0882319F0823009F0F2C03A
:101D70008F7121F0823009F0EDC00BC08091EA0133
:101D8000813009F0E7C0933009F080E08093E501ED
:101D90002FC08091EA0181112BC08091EC019091BC
:101DA000ED018F709927009709F4D4C08093E90062
:101DB0002091EB0020FF1CC02091E901233021F489
:101DC0008091EB00806212C09091EB009061909343
:101DD000EB0021E030E001C0220F8A95EAF7209362
:101DE000EA001092EA008091EB0088608093EB009B
:101DF0001092E9008091E800877F8093E8000E94BC
:101E0000750CA8C08111A6C08091EA019091EB01E8
:101E10008F779927182F9091E3009078982B9093C3
:101E2000E3008091E800877F8093E8000E94750CB2
:101E30008091E80080FFFCCF8091E3008068809370
:101E4000E300112311F083E001C082E08093E701F9
:101E500081C08058823008F07DC08091EA01909165
:101E6000EB018C3D23E0920779F583E08A838AE2D7
:101E700089834FB7F894DE01139620E03EE051E2EB
:101E8000E32FF0E050935700E49120FF03C0E29568
:101E9000EF703F5FEF708E2F90E0EA3010F0C79642
:101EA00001C0C0968D939D932F5F243149F74FBF9A
:101EB0008091E800877F8093E8006AE270E0CE01BD
:101EC00001960E94770B13C0AE01455D5F4F609194
:101ED000EC010E94AD0A0097E9F12091E800277F0C
:101EE0002093E800BC018BA59CA50E94DA0B809191
:101EF000E8008B778093E8002DC0803859F58091F9
:101F0000E800877F8093E8008091E3018093F100EF
:101F10008091E8008E7771CF81111CC09091EA0109
:101F20009230C0F48091E800877F8093E80090931E
:101F3000E3010E94750C8091E301811104C080913E
:101F4000E30087FF02C084E001C081E08093E701E5
:101F50000E94AD098091E80083FF0AC08091E800EB
:101F6000877F8093E8008091EB0080628093EB0094
:101F7000AC960FB6F894DEBF0FBECDBFDF91CF9108
:101F80001F910895CF938091E7018823B1F080914C
:101F9000E9008F709091EC0090FF02C090E801C0C2
:101FA00090E0C92FC82B1092E9008091E80083FDD2
:101FB0000E94590ECF70C093E900CF91089590937D
:101FC0007501809374010895E0917401F091750199
:101FD000309721F00190F081E02D099480E0089580
:101FE000E0917401F0917501309721F00280F38146
:101FF000E02D09940895E0917401F09175013097F6
:1020000021F00480F581E02D099408952091760156
:10201000309177018217930771F090937701809345
:102020007601E0917401F0917501309721F00680FE
:10203000F781E02D0994089520917801309179017C
:102040008217930771F09093790180937801E09162
:102050007401F0917501309721F00084F185E02D35
:102060000994089508950C9432100E94541C0E9403
:1020700028060E94281D0C94D0220C9462055F92C1
:102080006F927F928F929F92AF92BF92CF92DF9288
:10209000EF92FF920F931F93CF93DF93CDB7DEB7ED
:1020A0002A970FB6F894DEBF0FBECDBF0E94380747
:1020B0009AE7C92E91E0D92E00E010E0AA24A3945B
:1020C000B12C502E802F0E948C083C01F601E1902B
:1020D000F1906F01E826F926E114F10431F40F5F65
:1020E0001F4F0530110569F73AC08091D00181FD7D
:1020F0000E94950820E030E04501022E02C0880CC5
:10210000991C0A94E2F7C4018E219F21892B09F1C1
:102110002E835F826820792081E0672809F480E0BF
:1021200088870E945D1C8160782F9A8789874E81FD
:102130005F8168858A850E94F810F801EE0FFF1F05
:10214000E658FE4F8081918188259925918380836F
:1021500016C02F5F3F4F2C30310571F6C0CF8FEF87
:1021600089838A831B820E945D1C8160782F9D83F6
:102170008C8349815A816B818D810E94F8100E9465
:102180001520109184010E94E40F1817D9F00E94C5
:10219000E40F809384012A960FB6F894DEBF0FBE39
:1021A000CDBFDF91CF911F910F91FF90EF90DF9006
:1021B000CF90BF90AF909F908F907F906F905F90E7
:1021C0000C943D102A960FB6F894DEBF0FBECDBF1B
:1021D000DF91CF911F910F91FF90EF90DF90CF9003
:1021E000BF90AF909F908F907F906F905F90089579
:1021F000CF93DF93CDB7DEB72B970FB6F894DEBF42
:102200000FBECDBF4F83588769877A878B87DE01E2
:10221000119686E0FD0111928A95E9F785E0FE01AD
:10222000379601900D928A95E1F749815A816B8129
:102230007C818D819E810E94D4182B960FB6F894D4
:10224000DEBF0FBECDBFDF91CF910895CF93C82FD2
:10225000882309F4C1C0823859F40E94E40F81FD3B
:10226000BBC089E30E943B1B0E94B71B89E30CC0E3
:10227000833879F40E94E40F80FDAEC083E50E94AC
:102280003B1B0E94B71B83E50E945D1BCF910C9402
:10229000B71B843859F40E94E40F82FD9DC087E487
:1022A0000E943B1B0E94B71B87E4EECF8450813A0B
:1022B00048F48C2F0E94322281118EC08C2F0E94F4
:1022C0003B1BE4CF8C2F805E883050F4C77081E0D8
:1022D00090E001C0880FCA95EAF70E947E1BD6CF16
:1022E0008C2F855A833078F4C53A29F0C63A31F4F8
:1022F00082E890E005C081E890E002C083E890E0C9
:10230000CF910C9406108C2F885A833108F064C04A
:10231000C83A39F1C93A41F1CA3A49F1CB3A51F1D7
:10232000CC3A59F1CD3A61F1C03B69F1CE3A71F145
:10233000CF3A79F1C13B81F1C23B89F1C33B91F1C5
:10234000C43B99F1C53BA1F1C63BA9F1C73BB1F133
:10235000C83BB9F1C93BC1F1CA3BC9F58AE292E079
:1023600038C082EE90E035C089EE90E032C08AEE4F
:1023700090E02FC085EB90E02CC086EB90E029C068
:1023800087EB90E026C08CEC90E023C08DEC90E0D1
:1023900020C083E891E01DC08AE891E01AC082E97C
:1023A00091E017C084E991E014C081E292E011C08D
:1023B00083E292E00EC084E292E00BC085E292E0FC
:1023C00008C086E292E005C087E292E002C080E0A9
:1023D00090E0CF910C941C10CF910895882309F4BC
:1023E0004DC0823859F40E94E40F81FF47C089E351
:1023F0000E943B1B0E94B71B89E30CC0833871F419
:102400000E94E40F80FF3AC083E50E943B1B0E94BC
:10241000B71B83E50E945D1B0C94B71B843859F4ED
:102420000E94E40F82FF2AC087E40E943B1B0E94A7
:10243000B71B87E4EFCF982F9450913A08F4EACF76
:10244000982F905E983058F4282F277081E090E004
:1024500001C0880F2A95EAF70E94841BDDCF982FD0
:10246000955A933020F480E090E00C940610885A3E
:10247000833120F480E090E00C941C1008958823B0
:1024800021F00E947E1B0C94B71B0895882321F035
:102490000E94841B0C94B71B0895BF92CF92DF92C9
:1024A000EF92FF920F931F93CF93DF93CDB7DEB7D9
:1024B00027970FB6F894DEBF0FBECDBF8C0185E025
:1024C000F801DE01119601900D928A95E1F7F8016D
:1024D00030812181F280558152955F708381948192
:1024E000892B39F02F3F41F481E090E03F3F31F0FC
:1024F00003C081E090E002C080E090E080FD73C303
:1025000039832A8389819A815E830E94F81AB92EC1
:102510008F830E94F71A0E941F1A2B2D22952F706D
:1025200030E05E816F812530310509F4E6C06CF43E
:10253000243031050CF0A2C04B2D407F8B2D8F70C5
:10254000223031050CF045C017C02C3031054CF459
:102550002A3031050CF0E7C12830310509F043C3BA
:10256000E5C02D30310509F4BAC20CF4A2C22F30F7
:10257000310509F038C323C3182F411101C002C02F
:102580001295107FFF2059F0112309F46BC2812F9F
:102590006F830E948E1B0E94B71B6F8163C2862FC0
:1025A0000E94EE11112309F41EC3812F0E94941B77
:1025B00027960FB6F894DEBF0FBECDBFDF91CF9147
:1025C0001F910F91FF90EF90DF90CF90BF900C94F0
:1025D000B71B403211F08295807F662319F061307D
:1025E00071F523C0FF20B1F0511101C032C051304C
:1025F00081F527960FB6F894DEBF0FBECDBFDF91F1
:10260000CF911F910F91FF90EF90DF90CF90BF90EF
:102610000C949E1B511101C003C0513009F4E3C258
:102620008E830E94A11B8E819AC1FF2021F056301B
:1026300008F0D9C20EC0553008F0D5C290C1FF20B5
:10264000C9F0552331F0F801958190FF0BC29F70BE
:10265000958327960FB6F894DEBF0FBECDBFDF91EE
:10266000CF911F910F91FF90EF90DF90CF90BF908F
:102670000C943F12552309F472C109C22B2D2695E3
:102680002695237030E02115310529F021303105E0
:1026900009F0A9C219C0FF2021F0862F9B2D93704D
:1026A00002C080E090E027960FB6F894DEBF0FBE20
:1026B000CDBFDF91CF911F910F91FF90EF90DF90F1
:1026C000CF90BF900C940610FF2021F0862F9B2DF9
:1026D000937002C080E090E027960FB6F894DEBFBA
:1026E0000FBECDBFDF91CF911F910F91FF90EF9063
:1026F000DF90CF90BF900C941C10862FFF2019F014
:102700000E941B1F02C00E94831F27960FB6F894D9
:10271000DEBF0FBECDBFDF91CF911F910F91FF9014
:10272000EF90DF90CF90BF900C940A208B2D837098
:1027300009F079C0F11057C2262F229526952770EF
:10274000220F220F862F8F70C82ED12CE12CF12C56
:10275000022E04C0CC0CDD1CEE1CFF1C0A94D2F728
:1027600064FF10C06FE070E080E090E004C0660F8E
:10277000771F881F991F2A95D2F7609570958095CD
:10278000909503C060E070E0CB012B2D2695269537
:102790002370422F50E042305105D9F043305105AB
:1027A00069F16C297D298E299F294130510551F10C
:1027B00027960FB6F894DEBF0FBECDBFDF91CF9145
:1027C0001F910F91FF90EF90DF90CF90BF900C94EE
:1027D000341A6C297D298E299F2927960FB6F894E3
:1027E000DEBF0FBECDBFDF91CF911F910F91FF9044
:1027F000EF90DF90CF90BF900C94461A0E94341A4D
:10280000C701B60127960FB6F894DEBF0FBECDBF45
:10281000DF91CF911F910F91FF90EF90DF90CF90BC
:10282000BF900C94221AFF2019F08B2D817001C0EB
:102830008695882309F4D7C1262F229526952770DF
:10284000220F220F862F8F70C82ED12CE12CF12C55
:10285000022E04C0CC0CDD1CEE1CFF1C0A94D2F727
:1028600064FF10C06FE070E080E090E004C0660F8D
:10287000771F881F991F2A95D2F7609570958095CC
:10288000909503C060E070E0CB012B2D2695269536
:102890002370422F50E042305105D9F043305105AA
:1028A00069F16C297D298E299F294130510551F10B
:1028B00027960FB6F894DEBF0FBECDBFDF91CF9144
:1028C0001F910F91FF90EF90DF90CF90BF900C94ED
:1028D000D31A6C297D298E299F2927960FB6F89443
:1028E000DEBF0FBECDBFDF91CF911F910F91FF9043
:1028F000EF90DF90CF90BF900C94E51A0E94D31A0E
:10290000C701B60127960FB6F894DEBF0FBECDBF44
:10291000DF91CF911F910F91FF90EF90DF90CF90BB
:10292000BF900C94C11A603F59F120F4603E08F446
:1029300094C008C0623F09F467C0F0F1633F09F03A
:102940008CC065C0162F1F708B2D8F71FF2021F05A
:102950000E946C1A812F7DCE0E94871A812F2796A4
:102960000FB6F894DEBF0FBECDBFDF91CF911F91A0
:102970000F91FF90EF90DF90CF90BF900C94461294
:10298000FF20B1F0553008F02EC18B2D8F712796A6
:102990000FB6F894DEBF0FBECDBFDF91CF911F9170
:1029A0000F91FF90EF90DF90CF90BF900C94A61AFC
:1029B000563008F018C1E9CFFF2099F08B2D8F71A8
:1029C00027960FB6F894DEBF0FBECDBFDF91CF9133
:1029D0001F910F91FF90EF90DF90CF90BF900C94DC
:1029E0006C1A8B2D8F7127960FB6F894DEBF0FBE31
:1029F000CDBFDF91CF911F910F91FF90EF90DF90AE
:102A0000CF90BF900C94871AF110EBCFD7CFFF2057
:102A100099F08B2D8F7127960FB6F894DEBF0FBEFD
:102A2000CDBFDF91CF911F910F91FF90EF90DF907D
:102A3000CF90BF900C945D1A27960FB6F894DEBF26
:102A40000FBECDBFDF91CF911F910F91FF90EF90FF
:102A5000DF90CF90BF900C94581AFF20A9F0552317
:102A600009F4ACCF862F27960FB6F894DEBF0FBEC1
:102A7000CDBFDF91CF911F910F91FF90EF90DF902D
:102A8000CF90BF900C942611552309F4AACF862F1E
:102A900027960FB6F894DEBF0FBECDBFDF91CF9162
:102AA0001F910F91FF90EF90DF90CF90BF900C940B
:102AB000EE114B2D4F70C8010E94AB0227960FB646
:102AC000F894DEBF0FBECDBFDF91CF911F910F9164
:102AD000FF90EF90DF90CF90BF900C948A19F11087
:102AE00082C09B2D9F70492F50E04230510599F1D3
:102AF00044F44115510569F04130510509F073C0A6
:102B000019C043305105C1F14430510509F06BC083
:102B100044C027960FB6F894DEBF0FBECDBFDF913D
:102B2000CF911F910F91FF90EF90DF90CF90BF90CA
:102B30000C94E12227960FB6F894DEBF0FBECDBFEE
:102B4000DF91CF911F910F91FF90EF90DF90CF9089
:102B5000BF900C94F82227960FB6F894DEBF0FBEF4
:102B6000CDBFDF91CF911F910F91FF90EF90DF903C
:102B7000CF90BF900C94142327960FB6F894DEBF25
:102B80000FBECDBFDF91CF911F910F91FF90EF90BE
:102B9000DF90CF90BF900C942723862F27960FB6F7
:102BA000F894DEBF0FBECDBFDF91CF911F910F9183
:102BB000FF90EF90DF90CF90BF900C944B234B2D64
:102BC0004F70C80127960FB6F894DEBF0FBECDBF79
:102BD000DF91CF911F910F91FF90EF90DF90CF90F9
:102BE000BF900C94D40327960FB6F894DEBF0FBEA7
:102BF000CDBFDF91CF911F910F91FF90EF90DF90AC
:102C0000CF90BF9008950E949B1B0E94701B0E9452
:102C1000B71B0E94B6200E940A2080E090E00E942C
:102C2000061080E090E00C941C100E948B1B0C940A
:102C300003160E94F81A292F22952F7030E02C30AD
:102C400031054CF42A3031056CF422503109223020
:102C5000310590F407C02C30310551F02F3031058B
:102C600059F406C0803E10F0803F31F481E00895B1
:102C700093FB882780F9089580E00895CF93DF9330
:102C800000D000D01F92CDB7DEB70F900F900F90FD
:102C90000F900F90DF91CF910895CF93DF9300D0E5
:102CA00000D000D0CDB7DEB726960FB6F894DEBFC1
:102CB0000FBECDBFDF91CF9108951F93CF93DF93C8
:102CC000C091BB0116E012C0D0E01C9FF0011D9F17
:102CD000F00D1124E557FE4F4081518162817381CF
:102CE000848195810E944D162196C7708091BC0108
:102CF000C813EACFDF91CF911F91089540918501CC
:102D000050918601609187017091880180918901BD
:102D100090918A010C944D160F931F93CF93DF93DC
:102D200080918A0182958F7009F069C08091870136
:102D3000882309F464C0A091BB01D091BC01B0917B
:102D40008501C0918601809188019091890121E0DF
:102D500030E0BF3F11F020E030E0122FBC01609561
:102D6000709506E04AC0009721F0CF3F29F4212F4B
:102D700005C021E030E002C020E030E020FD3BC093
:102D80004A2F50E0049FF001059FF00D1124E557F4
:102D9000FE4F2181C2132FC02081B2132CC022818B
:102DA000211129C0238134812817390718F0281BE5
:102DB000390B02C0260F371F283C3105E0F4809103
:102DC0008A018F70806180938A0186E0849FF00180
:102DD000859FF00D1124E057FE4F80818F70806138
:102DE000808385E891E00E944D12DF91CF911F9181
:102DF0000F910C945D16AF5FA770AD13B4CFDF9148
:102E0000CF911F910F910895EF92FF920F931F930F
:102E1000CF93DF93CDB7DEB762970FB6F894DEBFDE
:102E20000FBECDBF8C0185E0F801DE011D9601903B
:102E30000D928A95E1F7D8014C9111965C9111970A
:102E400012966C9112971396ED90FC9014977091D6
:102E50008501E09186018091880190918901009718
:102E600039F0EF3F41F421E030E07F3F31F003C023
:102E700021E030E002C020E030E020FD5CC1209184
:102E80008701222309F4F1C0E816F90628F097011A
:102E9000281B390BC90104C0809590958E0D9F1D8C
:102EA000883C910508F098C080918A01982F907F06
:102EB00009F064C0E51314C0741312C0611110C08E
:102EC0008F70806180938A010E947E1685E891E070
:102ED0000E944D1280918A01D80115968C9343C1AE
:102EE000EF2839F05F3F41F481E090E04F3F31F04F
:102EF00003C081E090E002C080E090E080FD03C06C
:102F000081E0862702C080E090E080FF2EC08091A3
:102F1000BB012091BC0136E013C090E0389FF00166
:102F2000399FF00D1124E557FE4F7181571306C0EC
:102F30007081471303C07281671317C001968770B1
:102F40008213EBCF12C19F7059F0882309F40BC193
:102F500007C09F7029F0F8019581907F09F403C1A3
:102F6000805E883008F4FFC0D2C0662309F4FBC03D
:102F700080918A01816080938A01F5C0E51308C0C1
:102F8000741306C0611104C0D80115968C939DC0BE
:102F90004D875E878D859E856A8B0E9419166A898A
:102FA000882309F4B4C0662309F4B1C020918A01D2
:102FB000822F82958F7090E002970CF4C6C08091AA
:102FC00085019091860198878F831986FB86EA8612
:102FD0002C87CE01079646C080918A01982F907F5A
:102FE00059F47E2DF98AE88A89890E943E1685E87F
:102FF00091E00E944D1295C0E51311C074130FC0EB
:1030000061110DC0F8018583C8010E944D12E5E8E9
:10301000F1E086E0DF011D928A95E9F7A2C04D87B5
:103020005E878D859E856A8B0E9419166A89882322
:1030300009F46DC0662309F46AC020918A01822FC9
:1030400082958F7090E002970CF47FC0809185018B
:10305000909186019A8389831B82FD82EC822E8364
:10306000CE0101960E944D1270C0E816F90628F0B4
:103070009701281B390BC90104C0809590958E0DCE
:103080009F1D883C910508F046C0662309F43FC0A7
:10309000E51330C074132EC020918A0120FD21C099
:1030A000322F32953F70832F90E00097D1F0D801F6
:1030B00015962C9315970F9741F0832F8F5F82956C
:1030C000807F2F70282B15962C93C8010E944D12DB
:1030D00086E0F801A5E8B1E001900D928A95E1F74C
:1030E0003EC086E0F801A5E8B1E001900D928A9516
:1030F000E1F737C04D875E878D859E850E94191642
:10310000811123C080918A01816080938A01C80166
:103110000E944D1226C07E2DF98AE88A89890E9474
:103120003E16E5E8F1E086E0DF011D928A95E9F7B9
:103130000E947E1618C0662351F34D875E878D85E9
:103140009E850E941916882311F386E0F801A5E8F0
:10315000B1E001900D928A95E1F70E948C160E94D1
:103160007E1681E014C080E012C04D875E878D8599
:103170009E850E94F81A292F22952F7030E0223068
:1031800031050CF4E0CE243031050CF6E2CE629627
:103190000FB6F894DEBF0FBECDBFDF91CF911F9168
:1031A0000F91FF90EF9008951F93CF93DF93CDB7CA
:1031B000DEB72C970FB6F894DEBF0FBECDBF4F839E
:1031C000588769877A878B879C87CE0107960E94EC
:1031D00004178823D9F02F8138858A859B85892B10
:1031E00039F03F3F19F080E090E004C02F3FD9F75D
:1031F00081E090E0892B09F06DC04F815885698589
:103200007A858B859C850E944D1664C086E0FE0100
:103210003796DE01119601900D928A95E1F7FF81B4
:10322000E8854A855B854115510539F0EF3F41F44A
:1032300081E090E0FF3F31F003C081E090E002C008
:1032400080E090E080FD46C02091BC0130E0C901E3
:103250000196877099276091BB0170E086179707E8
:1032600009F440C0F983EA835D834C8396E0929F22
:10327000D001939FB00D1124A557BE4FFE0131968A
:1032800001900D929A95E1F78093BC010E945D1622
:1032900021C0189FC001112485579E4F0E9404171A
:1032A000882371F1E091BB011E9FF0011124E557C5
:1032B000FE4F4081518162817381848195810E949A
:1032C0004D168091BB0190E00196877099278093FD
:1032D000BB0101C016E08091BB019091BC01891334
:1032E000D8CF0EC00E9415161092BC011092BB01DF
:1032F000E5E8F1E086E0DF011D928A95E9F7EACF83
:103300002C960FB6F894DEBF0FBECDBFDF91CF91E4
:103310001F910895DF92EF92FF920F931F93CF9327
:10332000DF93EC01009709F46EC0D12CEE24E394F6
:10333000F12C8E010F5F1F4FFE018491843748F4FA
:10334000843008F04CC0813071F0823009F05BC0ED
:103350001EC0853709F43FC080F1982F94589037EC
:1033600008F051C03FC02296F8018491982F905EDA
:10337000983050F48770FE2D01C0FF0F8A95EAF750
:103380008F2F0E948E1B13C00E9426112FC02296E1
:10339000F8018491982F905E983060F48770FE2D2C
:1033A00001C0FF0F8A95EAF78F2F0E94941B0E949D
:1033B000B71B1CC00E94EE1119C02296F80104919F
:1033C00007C08FE99FE00197F1F700C000000150AE
:1033D0000111F7CF0BC02296F801D49007C00E94CC
:1033E000261103C08F770E94EE11E8018D2D07C0D2
:1033F0008150EFE9FFE03197F1F700C0000088232A
:1034000009F497CFF5CFDF91CF911F910F91FF90E6
:10341000EF90DF9008956093C1017093C201809393
:10342000C3019093C4010C9403166093BD01709383
:10343000BE018093BF019093C0010C9403160895C0
:103440000C940B1A0F931F930091C1011091C201AC
:103450002091C3013091C401602B712B822B932BDF
:103460001F910F910C940B1A0F931F930091C101A0
:103470001091C2012091C3013091C40160237123D6
:10348000822393231F910F910C940B1A0F931F9378
:103490000091C1011091C2012091C3013091C4017A
:1034A00060277127822793271F910F910C940B1A85
:1034B00060E070E0CB010C94151A41E050E060E050
:1034C00070E004C0440F551F661F771F8A95D2F71E
:1034D000CB01BA010C94151A41E050E060E070E0B5
:1034E00004C0440F551F661F771F8A95D2F780913D
:1034F000BD019091BE01A091BF01B091C001482BC8
:10350000592B6A2B7B2BCB01BA010C94151A41E085
:1035100050E060E070E004C0440F551F661F771F45
:103520008A95D2F740955095609570958091BD0130
:103530009091BE01A091BF01B091C00148235923D1
:103540006A237B23CB01BA010C94151A41E050E0A9
:1035500060E070E004C0440F551F661F771F8A9516
:10356000D2F78091BD019091BE01A091BF01B091B1
:10357000C001482759276A277B27CB01BA010C9441
:10358000151A0F931F930091BD011091BE01209158
:10359000BF013091C001602B712B822B932B1F91A7
:1035A0000F910C94151A0F931F930091BD01109168
:1035B000BE012091BF013091C0016023712382239D
:1035C00093231F910F910C94151A0F931F93009141
:1035D000BD011091BE012091BF013091C001602753
:1035E0007127822793271F910F910C94151A089524
:1035F000CF92DF92EF92FF920F931F93CF93DF93BF
:10360000EC01C090C101D090C201E090C301F090E4
:10361000C4018091BD019091BE01A091BF01B09104
:10362000C001C82AD92AEA2AFB2A0FE110E0B70113
:10363000A601002E04C076956795579547950A9484
:10364000D2F740FF08C0BE01802F0E94FA038130EC
:10365000910509F007C00150110948F7BE0180E04B
:103660000E94FA03DF91CF911F910F91FF90EF908D
:10367000DF90CF90089540910C0150910D0120E012
:1036800030E09FEFFA01E20FF31F62816817A1F0AB
:103690009F3F19F4611101C0922F2F5F3F4F2630D9
:1036A000310581F707C0FA01E90FF11D97FDFA9581
:1036B000828308959F3FB9F7089540910C0150917E
:1036C0000D0120E030E0FA01E20FF31F9281981320
:1036D00001C012822F5F3F4F26303105A1F70895B8
:1036E00081E090E0E0910C01F0910D01E80FF91FED
:1036F0001082019688309105A9F708959091C5012F
:10370000982B9093C501089580959091C5019823B9
:103710009093C50108951092C50108959091C60136
:10372000982B9093C601089580959091C601982397
:103730009093C60108951092C60108958093C70121
:1037400008951092C701089540910C0150910D0108
:1037500020E030E080E0FA01E20FF31F9181911147
:103760008F5F2F5F3F4F27303105A9F70895E09114
:103770000C01F0910D018091C5018083E0910C0155
:10378000F0910D0180819091C601892B80839091E9
:10379000C701992361F0E0910C01F0910D01808146
:1037A000892B80830E94A41B81110E94A11B809100
:1037B0000C0190910D010C94F00F8091E701843081
:1037C00021F11092D10120E488E190E00FB6F89445
:1037D000A895809360000FBE2093600080E00E9457
:1037E000E10283B7817F846083BF83B7816083BF39
:1037F0007894889583B78E7F83BF88E10FB6F8945D
:1038000080936000109260000FBE0895089508959F
:10381000CF9380E00E94E1020E94061C0E943807BC
:103820000E94071CC0E08C2F0E948C08892B29F471
:10383000CF5FC530C1F780E001C081E0CF9108952E
:103840000E94151680E00E94E1020E94D0220E9490
:10385000E40F0C9462051F920F920FB60F92112481
:103860008F939F93AF93BF938091D101811113C028
:103870008091D2019091D301A091D401B091D50152
:103880004196A11DB11D8093D2019093D301A093C5
:10389000D401B093D501BF91AF919F918F910F90BB
:1038A0000FBE0F901F90189582E084BD93E095BDE8
:1038B0009AEF97BD80936E0008958FB7F89440916A
:1038C000D2015091D3016091D4017091D5018FBF85
:1038D000CA010895CF92DF92EF92FF920F931F9348
:1038E0002FB7F8944091D2015091D3016091D40147
:1038F0007091D5012FBF6A017B01EE24FF248C015A
:1039000020E030E0C016D106E206F30620F09A016E
:10391000281B390B05C09C0120953095240F351FBD
:10392000C9011F910F91FF90EF90DF90CF90089504
:103930001F920F920FB60F9211248F939F93AF9304
:10394000BF938091D2019091D301A091D401B09105
:10395000D5010196A11DB11D8093D2019093D30191
:10396000A093D401B093D501BF91AF919F918F9156
:103970000F900FBE0F901F9018950E94C80CF894DE
:103980002FEF87EA91E6215080409040E1F700C098
:10399000000087E090EBDC018093F1019093F2014D
:1039A000A093F301B093F4012CE088E190E00FB60E
:1039B000F894A895809360000FBE20936000FFCF1D
:1039C000CF92DF92EF92FF920F931F93CF93DF93EB
:1039D000C82ED12C01E010E08D2D0E948C087C01B6
:1039E000C0E0D0E098010C2E02C0220F331F0A94D1
:1039F000E2F72E213F21232B29F42196CC30D1054B
:103A000089F708C06C2F7D2D80E00E94D503C81275
:103A1000F4CF06C0D39485E0D812DECF80E001C099
:103A200081E0DF91CF911F910F91FF90EF90DF9098
:103A3000CF900895CF93C82F8CE20E94E01C88237A
:103A400021F08C2FCF910C94E01C80E0CF91089551
:103A5000CF930E946B1E811102C00E944C1EC5E6CE
:103A600008C00E9438078FE39CE90197F1F700C076
:103A70000000C150B1F789E20E941A1D81110AC1EC
:103A80008AE20E941A1D81110E944C1E85E00E944C
:103A90001A1D81110E94BD1C0E94761E8093D001C8
:103AA00087E00E941A1D882399F18BE10E941A1D5C
:103AB000882351F09091D00191FB882780F921E073
:103AC000822780FB91F922C08EE00E941A1D882374
:103AD00051F09091D00192FB882780F921E0822754
:103AE00080FB92F913C080E10E941A1D9091D001D1
:103AF000882341F093FB882780F921E0822780FB0F
:103B000093F904C0892F809580FB90F99093D001A0
:103B10008091D0010E947A1E0E94881E8093E1014C
:103B200080EE0E941A1D882341F08091E101982FB8
:103B3000909590FB80F98093E10189E30E941A1D22
:103B4000882359F09091E10191FB882780F921E0C9
:103B5000822780FB91F99093E10182EE0E941A1D69
:103B6000882359F09091E10192FB882780F921E0A8
:103B7000822780FB92F99093E10186EE0E941A1D44
:103B8000882359F09091E10193FB882780F921E087
:103B9000822780FB93F99093E10183EE0E941A1D26
:103BA000882359F09091E10194FB882780F921E066
:103BB000822780FB94F99093E10185E30E941A1D0E
:103BC000882359F09091E10195FB882780F921E045
:103BD000822780FB95F99093E10181E30E941A1DF1
:103BE000882359F09091E10196FB882780F921E024
:103BF000822780FB96F99093E10181E10E941A1DD2
:103C0000882359F09091E10197FB882780F921E002
:103C1000822780FB97F99093E1018091E1010E9456
:103C20008C1E87E20E941A1DC82F8EE10E941A1D69
:103C30008111C2608FE10E941A1D8111C46080E26F
:103C40000E941A1D8111C86081E20E941A1D811113
:103C5000C06182E20E941A1D8111C06283E20E944B
:103C60001A1D8111C06484E20E941A1D882311F07C
:103C7000C06802C0CC2329F08C2F0E94831E6C2FB9
:103C800003C00E947F1E682F70E080E090E0CF911B
:103C90000C94201ACF9108956DEE7EEF80E090E0B5
:103CA0000E94D92460E082E090E00E94CB2460E092
:103CB00083E090E00E94CB2460E084E090E00E94EA
:103CC000CB2460E085E090E00E94CB2460E086E0B9
:103CD00090E00C94CB2480E090E00E94C52421E089
:103CE0008D3E9E4F09F020E0822F089582E090E003
:103CF0000C94BD24682F82E090E00C94CB2483E0E8
:103D000090E00C94BD24682F83E090E00C94CB24C9
:103D100084E090E00C94BD24682F84E090E00C9443
:103D2000CB2486E090E00C94BD24682F86E090E0E0
:103D30000C94CB248091DE0180FF0BC060911101B7
:103D400085E0689FB0011124759567957595679515
:103D50002AC081FF09C06091110185E0689FB00110
:103D60001124759567951FC082FF07C060911101EE
:103D700085E0689FB001112416C04091D80144230A
:103D8000C9F060911001461788F72091110185E074
:103D9000289F90011124429FC001439F900D112440
:103DA00070E00E9495246038710540F4611571053A
:103DB00039F002C065E070E0862F08958FE708951E
:103DC00081E008958091DE0180FF08C060910F01BD
:103DD00070E0759567957595679521C081FF06C060
:103DE00060910F0170E07595679519C082FF04C05E
:103DF00060910F0170E010C08091D8018823C1F05C
:103E000060910E018617A0F790910F01989FC00155
:103E1000112470E00E9495246038710528F4611522
:103E2000710521F0862F08958FE7089581E00895A8
:103E300061E070E0F4CF803F21F40E949A1E8195EA
:103E400004C0813F29F40E949A1E8093DB010895EB
:103E5000823F21F40E949A1E819504C0833F29F479
:103E60000E949A1E8093DA010895893F19F40E94F6
:103E7000E21E05C08A3F31F40E94E21E81958093C4
:103E8000DC0108958B3F21F40E94E21E819504C05D
:103E90008C3F29F40E94E21E8093DD010895843F47
:103EA00021F48091D901816017C0853F21F4809170
:103EB000D901826011C0863F21F48091D9018460CC
:103EC0000BC0873F21F48091D901886005C0883FED
:103ED00031F48091D90180618093D90108958D3F9B
:103EE00021F48091DE0181600BC08E3F21F480912E
:103EF000DE01826005C08F3F29F48091DE0184607D
:103F00008093DE010895803F29F48091DB0187FFD3
:103F10006EC007C0813F41F48091DB0118160CF0A0
:103F200066C01092DB0163C09091DA01823F19F400
:103F300097FF5DC005C0833F31F419160CF057C0E0
:103F40001092DA0154C0893F31F48091DC011816D7
:103F50000CF04DC006C08A3F39F48091DC0187FF28
:103F600046C01092DC0143C08B3F29F48091DD01F3
:103F700087FF3DC006C08C3F39F48091DD011816E3
:103F8000B4F51092DD0133C0843F21F48091D90152
:103F90008E7F05C0853F31F48091D9018D7F80935C
:103FA000D90125C0863F21F48091D9018B7FF7CFBD
:103FB000873F21F48091D901877FF1CF883F21F499
:103FC0008091D9018F7EEBCF8D3F21F48091DE016E
:103FD0008E7F0BC08E3F21F48091DE018D7F05C066
:103FE0008F3F29F48091DE018B7F8093DE018091E9
:103FF000DA0181110EC08091DB0181110AC080912C
:10400000DC01811106C08091DD01811102C0109296
:10401000D801089589ED91E00E94FB0F0E945D1C7C
:104020009093D7018093D6010895CF938091D601C4
:104030009091D7010E946A1C4091D801442321F03D
:104040002091120130E006C0209113015AE0259F13
:10405000900111248217930708F486C08091DA0139
:1040600081110DC09091DB01911109C09091DC018B
:10407000911105C09091DD01992309F475C04F3F5E
:1040800019F04F5F4093D801181624F40E949A1E2D
:104090008093DA018091DA0187FF05C00E949A1EA1
:1040A00081958093DA018091DB01181624F40E9437
:1040B0009A1E8093DB018091DB0187FF05C00E947F
:1040C0009A1E81958093DB016091DA01662339F1B4
:1040D000C091DB01CC2319F1772767FD7095872FFD
:1040E000972F0E949A2323E333E343E35FE30E9485
:1040F000FE230E9467236093DA016C2F772767FD08
:104100007095872F972F0E949A2323E333E343E38D
:104110005FE30E94FE230E9467236093DB0180918E
:10412000DC01181624F40E94E21E8093DC018091C9
:10413000DC0187FF05C00E94E21E81958093DC01AF
:104140008091DD01181624F40E94E21E8093DD01A7
:104150008091DD0187FF05C00E94E21E819580935A
:10416000DD01CF910C940A20CF910895E9EDF1E0A3
:1041700085E0DF011D928A95E9F71092D80110922F
:10418000DE010895833089F130F4813061F08230AE
:1041900009F06EC019C0853009F449C0B8F1863005
:1041A00009F066C055C020911301862F90E0820F60
:1041B000911D8F3F910520F4620F609313010895C4
:1041C0008FEF80931301089520911201862F90E0C4
:1041D000820F911D8F3F910520F4620F60931201B1
:1041E00008958FEF80931201089520911101862F79
:1041F00090E0820F911D8F3F910520F4620F609334
:10420000110108958FEF80931101089520911001FD
:10421000862F90E0820F911D8F3F910520F4620F51
:104220006093100108958FEF8093100108952091FD
:104230000F01862F90E0820F911D8F3F910520F492
:10424000620F60930F0108958FEF80930F0108951F
:1042500020910E01862F90E0820F911D8F3F9105D6
:1042600020F4620F60930E0108958FEF80930E018A
:104270000895833021F130F4813059F0823009F013
:1042800049C012C0853089F128F1863009F042C05A
:1042900037C080911301681720F4861B80931301A7
:1042A000089510921301089580911201681720F467
:1042B000861B809312010895109212010895809137
:1042C0001101681720F4861B809311010895109244
:1042D0001101089580911001681720F4861B8093C6
:1042E0001001089510921001089580910F01681730
:1042F00020F4861B80930F01089510920F010895FA
:1043000080910E01681720F4861B80930E0108959A
:1043100010920E01089541E050E060E070E004C0AA
:10432000440F551F661F771F8A95D2F7CB01BA013C
:104330000E94201A0C941516873200F58E3108F071
:1043400086C08E3009F466C060F4873009F44DC031
:1043500018F4863049F531C0883041F18B3021F5B1
:104360007BC0863109F478C018F48031E9F45CC070
:10437000893109F471C08B31B9F442C0883309F432
:104380006BC048F4893209F460C0853309F45DC01C
:10439000873251F45AC0833409F457C018F48A3371
:1043A00018F057C0883499F080E008950E94761E76
:1043B0000E94881E0E94911E4FC08091D001817F73
:1043C0008E7F8093D00181E08093DF0108950E9469
:1043D00015162FEF83ED90E3215080409040E1F7D8
:1043E00000C000000E94BD1C37C08091D00180FF3A
:1043F00003C0817F8E7F01C081608093D0012CC07B
:104400009091D00191FB882780F921E0822780FBE1
:1044100091F913C09091D00192FB882780F921E097
:10442000822780FB92F909C09091D00193FB8827E5
:1044300080F921E0822780FB93F99093D0018823B3
:1044400059F091609093D00107C080E003C08D5176
:1044500001C089530E948B2181E0089580E0089576
:1044600080E00895CF93C82F8091DF01813071F0F3
:1044700020F0823009F089C037C0A0910C01B091C2
:104480000D018C91823209F082C007C0A0910C010D
:10449000B0910D018C91823249F48C2F0E942E2212
:1044A00081111EC08C2F0E949C211CC08C2F0E9449
:1044B0003022811115C0C43169F030F4CB3081F065
:1044C000C03109F068C009C0C93221F0C83309F011
:1044D00062C006C01092DF015EC082E08093DF01FF
:1044E00081E090E081705AC0C932C9F060F4C431F3
:1044F000B1F020F4C73009F04CC034C0CE51C63002
:1045000008F047C017C0CE3439F120F4CB3409F09D
:1045100040C01CC0C135C1F0C235D9F513C080916F
:10452000E001882319F01092E00133C081E080930C
:10453000DF0134C0EC2FF0E0E65BFE4F808180931A
:10454000E00127C061E003C061E007C06AE080913C
:10455000E0010E94C2201DC06AE08091E0010E943B
:10456000392117C08EE18093130182E380931201F9
:104570008AE08093110184E18093100188E08093A8
:104580000F0188E280930E0104C01092DF0180E0E9
:1045900005C081E003C080E090E0A4CFCF910895F2
:1045A0000E946B1E811102C00E944C1E0E94911E2F
:1045B0008093F00180FF02C0869501C080E00C94DA
:1045C000E1028091F001982F9695292F30E0233059
:1045D00031054CF49F5F990F8170892B8160809326
:1045E000F0010E94951E8091F00186950C94E102E5
:1045F0008091F001982F969591F09158990F8170C4
:10460000892B8093F0018E7F91E009F490E08091F6
:10461000F00190FB80F98093F0010E94951E80913B
:10462000F00186950C94E1028091F001982F90950D
:1046300090FB80F98093F0010E94951E8091F0011B
:1046400080FF02C0869501C080E00C94E1023091A9
:10465000F001232F26952F5F2F77822F90E0317066
:1046600004972CF4220F232B2093F00102C03093E7
:10467000F0018091F001282F2E7F91E009F490E065
:1046800090FB80F98093F0010E94951E8091F001CB
:1046900086950C94E1022091F001922F969598272F
:1046A000990F822F8170892B8093F0018E7F91E08A
:1046B00009F490E08091F00190FB80F98093F00183
:1046C0000E94951E8091F00186950C94E10204D021
:1046D0006894B1118DC0089570D088F09F5790F004
:1046E000B92F9927B751A0F0D1F0660F771F881F17
:1046F000991F1AF0BA95C9F712C0B13081F077D07E
:10470000B1E0089574C0672F782F8827B85F39F01B
:10471000B93FCCF3869577956795B395D9F73EF475
:1047200090958095709561957F4F8F4F9F4F08951D
:10473000E89409C097FB3EF490958095709561953B
:104740007F4F8F4F9F4F9923A9F0F92F96E9BB27F1
:104750009395F695879577956795B795F111F8CF6D
:10476000FAF4BB0F11F460FF1BC06F5F7F4F8F4FD8
:104770009F4F16C0882311F096E911C0772321F0CE
:104780009EE8872F762F05C0662371F096E8862F66
:1047900070E060E02AF09A95660F771F881FDAF7BD
:1047A000880F9695879597F9089557FD9058440F6F
:1047B000551F59F05F3F71F04795880F97FB991F80
:1047C00061F09F3F79F0879508951216130614063D
:1047D000551FF2CF4695F1DF08C0161617061806CA
:1047E000991FF1CF86957105610508940895E894A5
:1047F000BB2766277727CB0197F908950BD078C0A0
:1048000069D028F06ED018F0952309F05AC05FC027
:104810001124EECFCADFA0F3959FD1F3950F50E09E
:10482000551F629FF001729FBB27F00DB11D639F62
:10483000AA27F00DB11DAA1F649F6627B00DA11D08
:10484000661F829F2227B00DA11D621F739FB00DAE
:10485000A11D621F839FA00D611D221F749F33271E
:10486000A00D611D231F849F600D211D822F762FB7
:104870006A2F11249F5750408AF0E1F088234AF0B4
:10488000EE0FFF1FBB1F661F771F881F9150504000
:10489000A9F79E3F510570F014C0AACF5F3FECF31B
:1048A000983EDCF3869577956795B795F795E795EC
:1048B0009F5FC1F7FE2B880F911D9695879597F9FD
:1048C000089597F99F6780E870E060E008959FEF92
:1048D00080EC089500240A94161617061806090697
:1048E000089500240A941216130614060506089566
:1048F000092E0394000C11F4882352F0BB0F40F4EE
:10490000BF2B11F460FF04C06F5F7F4F8F4F9F4F2D
:104910000895991B79E004C0991F961708F0961B1B
:10492000881F7A95C9F78095089597FB072E16F48E
:10493000009407D077FD09D00E94A92407FC05D078
:104940003EF4909581959F4F0895709561957F4FA6
:104950000895AA1BBB1B51E107C0AA1FBB1FA617C6
:10496000B70710F0A61BB70B881F991F5A95A9F718
:1049700080959095BC01CD010895F999FECF92BD27
:1049800081BDF89A992780B50895A8E1B0E042E08A
:1049900050E00C94E024262FF999FECF1FBA92BD67
:1049A00081BD20BD0FB6F894FA9AF99A0FBE019610
:1049B00008950E94CB24272F0C94CC24DC01CB013A
:1049C000FC01F999FECF06C0F2BDE1BDF89A31961F
:1049D00000B40D9241505040B8F70895F894FFCFBD
:1049E00005960826090209CD08990801C80128087A
:1049F000140A321E420045002500260043006100D3
:104A00006000200037006400650066006700440015
:104A100046002400470074038D03A603BF038B04E4
:104A20003E040804E8033F4D362001020304050656
:044A3000070809006A
:00000001FF

@ -2,39 +2,39 @@
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_init_user(void) { void matrix_init_user(void) {
// leave this function blank - it can be defined in a keymap file // leave this function blank - it can be defined in a keymap file
}; };
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_scan_user(void) { void matrix_scan_user(void) {
// leave this function blank - it can be defined in a keymap file // leave this function blank - it can be defined in a keymap file
}; };
__attribute__ ((weak)) __attribute__ ((weak))
void led_set_user(uint8_t usb_led) { void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file // leave this function blank - it can be defined in a keymap file
}; };
void matrix_init_kb(void) { void matrix_init_kb(void) {
// put your keyboard start-up code here // put your keyboard start-up code here
// runs once when the firmware starts up // runs once when the firmware starts up
// Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS) // Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS)
DDRD |= (1<<6); DDRD |= (1<<6);
PORTD |= (1<<6); PORTD |= (1<<6);
matrix_init_user(); matrix_init_user();
}; };
void amatrix_scan_kb(void) { void amatrix_scan_kb(void) {
// put your looping keyboard code here // put your looping keyboard code here
// runs every cycle (a lot) // runs every cycle (a lot)
matrix_scan_user(); matrix_scan_user();
}; };
void led_set_kb(uint8_t usb_led) { void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
if (usb_led & (1<<USB_LED_CAPS_LOCK)) { if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// output low // output low
@ -62,7 +62,7 @@ void led_set_kb(uint8_t usb_led) {
// Hi-Z // Hi-Z
DDRC &= ~(1<<6); DDRC &= ~(1<<6);
PORTC &= ~(1<<6); PORTC &= ~(1<<6);
} }
led_set_user(usb_led); led_set_user(usb_led);
}; };

@ -2,6 +2,11 @@
# Script to make a new quantum project # Script to make a new quantum project
# Jack Humbert 2015 # Jack Humbert 2015
if [ -z "$1" ]; then
echo "Usage: $0 <keyboard_name>"
exit 1
fi
KEYBOARD=$1 KEYBOARD=$1
KEYBOARD_UPPERCASE=$(echo $1 | awk '{print toupper($0)}') KEYBOARD_UPPERCASE=$(echo $1 | awk '{print toupper($0)}')

@ -1,365 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include "audio.h"
#include "keymap_common.h"
#define PI 3.14159265
// #define PWM_AUDIO
#ifdef PWM_AUDIO
#include "wave.h"
#define SAMPLE_DIVIDER 39
#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
#endif
void delay_us(int count) {
while(count--) {
_delay_us(1);
}
}
int voices = 0;
int voice_place = 0;
double frequency = 0;
int volume = 0;
long position = 0;
double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
bool sliding = false;
int max = 0xFF;
float sum = 0;
int value = 128;
float place = 0;
float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
uint16_t place_int = 0;
bool repeat = true;
uint8_t * sample;
uint16_t sample_length = 0;
bool notes = false;
bool note = false;
float note_frequency = 0;
float note_length = 0;
uint16_t note_position = 0;
float (* notes_pointer)[][2];
uint8_t notes_length;
bool notes_repeat;
uint8_t current_note = 0;
void stop_all_notes() {
voices = 0;
#ifdef PWM_AUDIO
TIMSK3 &= ~_BV(OCIE3A);
#else
TIMSK3 &= ~_BV(OCIE3A);
TCCR3A &= ~_BV(COM3A1);
#endif
notes = false;
note = false;
frequency = 0;
volume = 0;
for (int i = 0; i < 8; i++) {
frequencies[i] = 0;
volumes[i] = 0;
}
}
void stop_note(double freq) {
#ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE;
#endif
for (int i = 7; i >= 0; i--) {
if (frequencies[i] == freq) {
frequencies[i] = 0;
volumes[i] = 0;
for (int j = i; (j < 7); j++) {
frequencies[j] = frequencies[j+1];
frequencies[j+1] = 0;
volumes[j] = volumes[j+1];
volumes[j+1] = 0;
}
}
}
voices--;
if (voices < 0)
voices = 0;
if (voices == 0) {
#ifdef PWM_AUDIO
TIMSK3 &= ~_BV(OCIE3A);
#else
TIMSK3 &= ~_BV(OCIE3A);
TCCR3A &= ~_BV(COM3A1);
#endif
frequency = 0;
volume = 0;
note = false;
} else {
double freq = frequencies[voices - 1];
int vol = volumes[voices - 1];
double starting_f = frequency;
if (frequency < freq) {
sliding = true;
for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
frequency = f;
}
sliding = false;
} else if (frequency > freq) {
sliding = true;
for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
frequency = f;
}
sliding = false;
}
frequency = freq;
volume = vol;
}
}
void init_notes() {
#ifdef PWM_AUDIO
PLLFRQ = _BV(PDIV2);
PLLCSR = _BV(PLLE);
while(!(PLLCSR & _BV(PLOCK)));
PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
/* Init a fast PWM on Timer4 */
TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
OCR4A = 0;
/* Enable the OC4A output */
DDRC |= _BV(PORTC6);
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
TCCR3A = 0x0; // Options not needed
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
#else
DDRC |= _BV(PORTC6);
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
#endif
}
ISR(TIMER3_COMPA_vect) {
if (note) {
#ifdef PWM_AUDIO
if (voices == 1) {
// SINE
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
// SQUARE
// if (((int)place) >= 1024){
// OCR4A = 0xFF >> 2;
// } else {
// OCR4A = 0x00;
// }
// SAWTOOTH
// OCR4A = (int)place / 4;
// TRIANGLE
// if (((int)place) >= 1024) {
// OCR4A = (int)place / 2;
// } else {
// OCR4A = 2048 - (int)place / 2;
// }
place += frequency;
if (place >= SINE_LENGTH)
place -= SINE_LENGTH;
} else {
int sum = 0;
for (int i = 0; i < voices; i++) {
// SINE
sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2;
// SQUARE
// if (((int)places[i]) >= 1024){
// sum += 0xFF >> 2;
// } else {
// sum += 0x00;
// }
places[i] += frequencies[i];
if (places[i] >= SINE_LENGTH)
places[i] -= SINE_LENGTH;
}
OCR4A = sum;
}
#else
if (frequency > 0) {
// ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
// OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
if (place > 10) {
voice_place = (voice_place + 1) % voices;
place = 0.0;
}
ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period
place++;
}
#endif
}
// SAMPLE
// OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
// place_int++;
// if (place_int >= sample_length)
// if (repeat)
// place_int -= sample_length;
// else
// TIMSK3 &= ~_BV(OCIE3A);
if (notes) {
#ifdef PWM_AUDIO
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
place += note_frequency;
if (place >= SINE_LENGTH)
place -= SINE_LENGTH;
#else
if (note_frequency > 0) {
ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period
OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period
} else {
ICR3 = 0;
OCR3A = 0;
}
#endif
note_position++;
if (note_position >= note_length) {
current_note++;
if (current_note >= notes_length) {
if (notes_repeat) {
current_note = 0;
} else {
#ifdef PWM_AUDIO
TIMSK3 &= ~_BV(OCIE3A);
#else
TIMSK3 &= ~_BV(OCIE3A);
TCCR3A &= ~_BV(COM3A1);
#endif
notes = false;
return;
}
}
#ifdef PWM_AUDIO
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
note_length = (*notes_pointer)[current_note][1];
#else
note_frequency = (*notes_pointer)[current_note][0];
note_length = (*notes_pointer)[current_note][1] / 4;
#endif
note_position = 0;
}
}
}
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
if (note)
stop_all_notes();
notes = true;
notes_pointer = np;
notes_length = n_length;
notes_repeat = n_repeat;
place = 0;
current_note = 0;
#ifdef PWM_AUDIO
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
note_length = (*notes_pointer)[current_note][1];
#else
note_frequency = (*notes_pointer)[current_note][0];
note_length = (*notes_pointer)[current_note][1] / 4;
#endif
note_position = 0;
#ifdef PWM_AUDIO
TIMSK3 |= _BV(OCIE3A);
#else
TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1);
#endif
}
void play_sample(uint8_t * s, uint16_t l, bool r) {
stop_all_notes();
place_int = 0;
sample = s;
sample_length = l;
repeat = r;
#ifdef PWM_AUDIO
TIMSK3 |= _BV(OCIE3A);
#else
#endif
}
void play_note(double freq, int vol) {
if (notes)
stop_all_notes();
note = true;
#ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE;
#endif
if (freq > 0) {
if (frequency != 0) {
double starting_f = frequency;
if (frequency < freq) {
for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
frequency = f;
}
} else if (frequency > freq) {
for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
frequency = f;
}
}
}
frequency = freq;
volume = vol;
frequencies[voices] = frequency;
volumes[voices] = volume;
voices++;
}
#ifdef PWM_AUDIO
TIMSK3 |= _BV(OCIE3A);
#else
TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1);
#endif
}

@ -1,11 +0,0 @@
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
void play_sample(uint8_t * s, uint16_t l, bool r);
void play_note(double freq, int vol);
void stop_note(double freq);
void stop_all_notes();
void init_notes();
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);

@ -0,0 +1,607 @@
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include "print.h"
#include "audio.h"
#include "keymap_common.h"
#include "eeconfig.h"
#ifdef VIBRATO_ENABLE
#include "vibrato_lut.h"
#endif
#define PI 3.14159265
#define CPU_PRESCALER 8
#ifdef PWM_AUDIO
#include "wave.h"
#define SAMPLE_DIVIDER 39
#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
uint16_t place_int = 0;
bool repeat = true;
#endif
void delay_us(int count) {
while(count--) {
_delay_us(1);
}
}
int voices = 0;
int voice_place = 0;
float frequency = 0;
int volume = 0;
long position = 0;
float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
bool sliding = false;
int max = 0xFF;
float sum = 0;
float place = 0;
uint8_t * sample;
uint16_t sample_length = 0;
// float freq = 0;
bool notes = false;
bool note = false;
float note_frequency = 0;
float note_length = 0;
float note_tempo = TEMPO_DEFAULT;
float note_timbre = TIMBRE_DEFAULT;
uint16_t note_position = 0;
float (* notes_pointer)[][2];
uint16_t notes_count;
bool notes_repeat;
float notes_rest;
bool note_resting = false;
uint8_t current_note = 0;
uint8_t rest_counter = 0;
#ifdef VIBRATO_ENABLE
float vibrato_counter = 0;
float vibrato_strength = .5;
float vibrato_rate = 0.125;
#endif
float polyphony_rate = 0;
bool inited = false;
audio_config_t audio_config;
uint16_t envelope_index = 0;
void audio_toggle(void) {
audio_config.enable ^= 1;
eeconfig_update_audio(audio_config.raw);
}
void audio_on(void) {
audio_config.enable = 1;
eeconfig_update_audio(audio_config.raw);
}
void audio_off(void) {
audio_config.enable = 0;
eeconfig_update_audio(audio_config.raw);
}
#ifdef VIBRATO_ENABLE
// Vibrato rate functions
void set_vibrato_rate(float rate) {
vibrato_rate = rate;
}
void increase_vibrato_rate(float change) {
vibrato_rate *= change;
}
void decrease_vibrato_rate(float change) {
vibrato_rate /= change;
}
#ifdef VIBRATO_STRENGTH_ENABLE
void set_vibrato_strength(float strength) {
vibrato_strength = strength;
}
void increase_vibrato_strength(float change) {
vibrato_strength *= change;
}
void decrease_vibrato_strength(float change) {
vibrato_strength /= change;
}
#endif
#endif
// Polyphony functions
void set_polyphony_rate(float rate) {
polyphony_rate = rate;
}
void enable_polyphony() {
polyphony_rate = 5;
}
void disable_polyphony() {
polyphony_rate = 0;
}
void increase_polyphony_rate(float change) {
polyphony_rate *= change;
}
void decrease_polyphony_rate(float change) {
polyphony_rate /= change;
}
// Timbre function
void set_timbre(float timbre) {
note_timbre = timbre;
}
// Tempo functions
void set_tempo(float tempo) {
note_tempo = tempo;
}
void decrease_tempo(uint8_t tempo_change) {
note_tempo += (float) tempo_change;
}
void increase_tempo(uint8_t tempo_change) {
if (note_tempo - (float) tempo_change < 10) {
note_tempo = 10;
} else {
note_tempo -= (float) tempo_change;
}
}
void audio_init() {
/* check signature */
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
audio_config.raw = eeconfig_read_audio();
#ifdef PWM_AUDIO
PLLFRQ = _BV(PDIV2);
PLLCSR = _BV(PLLE);
while(!(PLLCSR & _BV(PLOCK)));
PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
/* Init a fast PWM on Timer4 */
TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
OCR4A = 0;
/* Enable the OC4A output */
DDRC |= _BV(PORTC6);
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
TCCR3A = 0x0; // Options not needed
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
#else
DDRC |= _BV(PORTC6);
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
#endif
inited = true;
}
void stop_all_notes() {
if (!inited) {
audio_init();
}
voices = 0;
#ifdef PWM_AUDIO
TIMSK3 &= ~_BV(OCIE3A);
#else
TIMSK3 &= ~_BV(OCIE3A);
TCCR3A &= ~_BV(COM3A1);
#endif
notes = false;
note = false;
frequency = 0;
volume = 0;
for (int i = 0; i < 8; i++) {
frequencies[i] = 0;
volumes[i] = 0;
}
}
void stop_note(float freq) {
if (note) {
if (!inited) {
audio_init();
}
#ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE;
#endif
for (int i = 7; i >= 0; i--) {
if (frequencies[i] == freq) {
frequencies[i] = 0;
volumes[i] = 0;
for (int j = i; (j < 7); j++) {
frequencies[j] = frequencies[j+1];
frequencies[j+1] = 0;
volumes[j] = volumes[j+1];
volumes[j+1] = 0;
}
break;
}
}
voices--;
if (voices < 0)
voices = 0;
if (voice_place >= voices) {
voice_place = 0;
}
if (voices == 0) {
#ifdef PWM_AUDIO
TIMSK3 &= ~_BV(OCIE3A);
#else
TIMSK3 &= ~_BV(OCIE3A);
TCCR3A &= ~_BV(COM3A1);
#endif
frequency = 0;
volume = 0;
note = false;
}
}
}
#ifdef VIBRATO_ENABLE
float mod(float a, int b)
{
float r = fmod(a, b);
return r < 0 ? r + b : r;
}
float vibrato(float average_freq) {
#ifdef VIBRATO_STRENGTH_ENABLE
float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength);
#else
float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter];
#endif
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
return vibrated_freq;
}
#endif
ISR(TIMER3_COMPA_vect) {
if (note) {
#ifdef PWM_AUDIO
if (voices == 1) {
// SINE
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
// SQUARE
// if (((int)place) >= 1024){
// OCR4A = 0xFF >> 2;
// } else {
// OCR4A = 0x00;
// }
// SAWTOOTH
// OCR4A = (int)place / 4;
// TRIANGLE
// if (((int)place) >= 1024) {
// OCR4A = (int)place / 2;
// } else {
// OCR4A = 2048 - (int)place / 2;
// }
place += frequency;
if (place >= SINE_LENGTH)
place -= SINE_LENGTH;
} else {
int sum = 0;
for (int i = 0; i < voices; i++) {
// SINE
sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2;
// SQUARE
// if (((int)places[i]) >= 1024){
// sum += 0xFF >> 2;
// } else {
// sum += 0x00;
// }
places[i] += frequencies[i];
if (places[i] >= SINE_LENGTH)
places[i] -= SINE_LENGTH;
}
OCR4A = sum;
}
#else
if (voices > 0) {
float freq;
if (polyphony_rate > 0) {
if (voices > 1) {
voice_place %= voices;
if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) {
voice_place = (voice_place + 1) % voices;
place = 0.0;
}
}
#ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) {
freq = vibrato(frequencies[voice_place]);
} else {
#else
{
#endif
freq = frequencies[voice_place];
}
} else {
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
frequency = frequency * pow(2, 440/frequency/12/2);
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
frequency = frequency * pow(2, -440/frequency/12/2);
} else {
frequency = frequencies[voices - 1];
}
#ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) {
freq = vibrato(frequency);
} else {
#else
{
#endif
freq = frequency;
}
}
if (envelope_index < 65535) {
envelope_index++;
}
freq = voice_envelope(freq);
if (freq < 30.517578125)
freq = 30.52;
ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
}
#endif
}
// SAMPLE
// OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
// place_int++;
// if (place_int >= sample_length)
// if (repeat)
// place_int -= sample_length;
// else
// TIMSK3 &= ~_BV(OCIE3A);
if (notes) {
#ifdef PWM_AUDIO
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
place += note_frequency;
if (place >= SINE_LENGTH)
place -= SINE_LENGTH;
#else
if (note_frequency > 0) {
float freq;
#ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) {
freq = vibrato(note_frequency);
} else {
#else
{
#endif
freq = note_frequency;
}
if (envelope_index < 65535) {
envelope_index++;
}
freq = voice_envelope(freq);
ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
} else {
ICR3 = 0;
OCR3A = 0;
}
#endif
note_position++;
bool end_of_note = false;
if (ICR3 > 0)
end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF));
else
end_of_note = (note_position >= (note_length * 0x7FF));
if (end_of_note) {
current_note++;
if (current_note >= notes_count) {
if (notes_repeat) {
current_note = 0;
} else {
#ifdef PWM_AUDIO
TIMSK3 &= ~_BV(OCIE3A);
#else
TIMSK3 &= ~_BV(OCIE3A);
TCCR3A &= ~_BV(COM3A1);
#endif
notes = false;
return;
}
}
if (!note_resting && (notes_rest > 0)) {
note_resting = true;
note_frequency = 0;
note_length = notes_rest;
current_note--;
} else {
note_resting = false;
#ifdef PWM_AUDIO
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100);
#else
envelope_index = 0;
note_frequency = (*notes_pointer)[current_note][0];
note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100);
#endif
}
note_position = 0;
}
}
if (!audio_config.enable) {
notes = false;
note = false;
}
}
void play_note(float freq, int vol) {
if (!inited) {
audio_init();
}
if (audio_config.enable && voices < 8) {
TIMSK3 &= ~_BV(OCIE3A);
// Cancel notes if notes are playing
if (notes)
stop_all_notes();
note = true;
envelope_index = 0;
#ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE;
#endif
if (freq > 0) {
frequencies[voices] = freq;
volumes[voices] = vol;
voices++;
}
#ifdef PWM_AUDIO
TIMSK3 |= _BV(OCIE3A);
#else
TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1);
#endif
}
}
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) {
if (!inited) {
audio_init();
}
if (audio_config.enable) {
TIMSK3 &= ~_BV(OCIE3A);
// Cancel note if a note is playing
if (note)
stop_all_notes();
notes = true;
notes_pointer = np;
notes_count = n_count;
notes_repeat = n_repeat;
notes_rest = n_rest;
place = 0;
current_note = 0;
#ifdef PWM_AUDIO
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100);
#else
note_frequency = (*notes_pointer)[current_note][0];
note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100);
#endif
note_position = 0;
#ifdef PWM_AUDIO
TIMSK3 |= _BV(OCIE3A);
#else
TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1);
#endif
}
}
#ifdef PWM_AUDIO
void play_sample(uint8_t * s, uint16_t l, bool r) {
if (!inited) {
audio_init();
}
if (audio_config.enable) {
TIMSK3 &= ~_BV(OCIE3A);
stop_all_notes();
place_int = 0;
sample = s;
sample_length = l;
repeat = r;
TIMSK3 |= _BV(OCIE3A);
}
}
#endif
//------------------------------------------------------------------------------
// Override these functions in your keymap file to play different tunes on
// startup and bootloader jump
__attribute__ ((weak))
void play_startup_tone()
{
}
__attribute__ ((weak))
void play_goodbye_tone()
{
}
//------------------------------------------------------------------------------

@ -0,0 +1,89 @@
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
#include "musical_notes.h"
#include "song_list.h"
#include "voices.h"
#ifndef AUDIO_H
#define AUDIO_H
// Largely untested PWM audio mode (doesn't sound as good)
// #define PWM_AUDIO
// #define VIBRATO_ENABLE
// Enable vibrato strength/amplitude - slows down ISR too much
// #define VIBRATO_STRENGTH_ENABLE
typedef union {
uint8_t raw;
struct {
bool enable :1;
uint8_t level :7;
};
} audio_config_t;
void audio_toggle(void);
void audio_on(void);
void audio_off(void);
// Vibrato rate functions
#ifdef VIBRATO_ENABLE
void set_vibrato_rate(float rate);
void increase_vibrato_rate(float change);
void decrease_vibrato_rate(float change);
#ifdef VIBRATO_STRENGTH_ENABLE
void set_vibrato_strength(float strength);
void increase_vibrato_strength(float change);
void decrease_vibrato_strength(float change);
#endif
#endif
// Polyphony functions
void set_polyphony_rate(float rate);
void enable_polyphony(void);
void disable_polyphony(void);
void increase_polyphony_rate(float change);
void decrease_polyphony_rate(float change);
void set_timbre(float timbre);
void set_tempo(float tempo);
void increase_tempo(uint8_t tempo_change);
void decrease_tempo(uint8_t tempo_change);
void audio_init(void);
#ifdef PWM_AUDIO
void play_sample(uint8_t * s, uint16_t l, bool r);
#endif
void play_note(float freq, int vol);
void stop_note(float freq);
void stop_all_notes(void);
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest);
#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
// These macros are used to allow play_notes to play an array of indeterminate
// length. This works around the limitation of C's sizeof operation on pointers.
// The global float array for the song must be used here.
#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0]))))
#define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style));
void play_goodbye_tone(void);
void play_startup_tone(void);
#endif

@ -0,0 +1,357 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define FREQUENCY_LUT_LENGTH 349
const uint16_t FREQUENCY_LUT[FREQUENCY_LUT_LENGTH] = {
0x8E0B,
0x8C02,
0x8A00,
0x8805,
0x8612,
0x8426,
0x8241,
0x8063,
0x7E8C,
0x7CBB,
0x7AF2,
0x792E,
0x7772,
0x75BB,
0x740B,
0x7261,
0x70BD,
0x6F20,
0x6D88,
0x6BF6,
0x6A69,
0x68E3,
0x6762,
0x65E6,
0x6470,
0x6300,
0x6194,
0x602E,
0x5ECD,
0x5D71,
0x5C1A,
0x5AC8,
0x597B,
0x5833,
0x56EF,
0x55B0,
0x5475,
0x533F,
0x520E,
0x50E1,
0x4FB8,
0x4E93,
0x4D73,
0x4C57,
0x4B3E,
0x4A2A,
0x491A,
0x480E,
0x4705,
0x4601,
0x4500,
0x4402,
0x4309,
0x4213,
0x4120,
0x4031,
0x3F46,
0x3E5D,
0x3D79,
0x3C97,
0x3BB9,
0x3ADD,
0x3A05,
0x3930,
0x385E,
0x3790,
0x36C4,
0x35FB,
0x3534,
0x3471,
0x33B1,
0x32F3,
0x3238,
0x3180,
0x30CA,
0x3017,
0x2F66,
0x2EB8,
0x2E0D,
0x2D64,
0x2CBD,
0x2C19,
0x2B77,
0x2AD8,
0x2A3A,
0x299F,
0x2907,
0x2870,
0x27DC,
0x2749,
0x26B9,
0x262B,
0x259F,
0x2515,
0x248D,
0x2407,
0x2382,
0x2300,
0x2280,
0x2201,
0x2184,
0x2109,
0x2090,
0x2018,
0x1FA3,
0x1F2E,
0x1EBC,
0x1E4B,
0x1DDC,
0x1D6E,
0x1D02,
0x1C98,
0x1C2F,
0x1BC8,
0x1B62,
0x1AFD,
0x1A9A,
0x1A38,
0x19D8,
0x1979,
0x191C,
0x18C0,
0x1865,
0x180B,
0x17B3,
0x175C,
0x1706,
0x16B2,
0x165E,
0x160C,
0x15BB,
0x156C,
0x151D,
0x14CF,
0x1483,
0x1438,
0x13EE,
0x13A4,
0x135C,
0x1315,
0x12CF,
0x128A,
0x1246,
0x1203,
0x11C1,
0x1180,
0x1140,
0x1100,
0x10C2,
0x1084,
0x1048,
0x100C,
0xFD1,
0xF97,
0xF5E,
0xF25,
0xEEE,
0xEB7,
0xE81,
0xE4C,
0xE17,
0xDE4,
0xDB1,
0xD7E,
0xD4D,
0xD1C,
0xCEC,
0xCBC,
0xC8E,
0xC60,
0xC32,
0xC05,
0xBD9,
0xBAE,
0xB83,
0xB59,
0xB2F,
0xB06,
0xADD,
0xAB6,
0xA8E,
0xA67,
0xA41,
0xA1C,
0x9F7,
0x9D2,
0x9AE,
0x98A,
0x967,
0x945,
0x923,
0x901,
0x8E0,
0x8C0,
0x8A0,
0x880,
0x861,
0x842,
0x824,
0x806,
0x7E8,
0x7CB,
0x7AF,
0x792,
0x777,
0x75B,
0x740,
0x726,
0x70B,
0x6F2,
0x6D8,
0x6BF,
0x6A6,
0x68E,
0x676,
0x65E,
0x647,
0x630,
0x619,
0x602,
0x5EC,
0x5D7,
0x5C1,
0x5AC,
0x597,
0x583,
0x56E,
0x55B,
0x547,
0x533,
0x520,
0x50E,
0x4FB,
0x4E9,
0x4D7,
0x4C5,
0x4B3,
0x4A2,
0x491,
0x480,
0x470,
0x460,
0x450,
0x440,
0x430,
0x421,
0x412,
0x403,
0x3F4,
0x3E5,
0x3D7,
0x3C9,
0x3BB,
0x3AD,
0x3A0,
0x393,
0x385,
0x379,
0x36C,
0x35F,
0x353,
0x347,
0x33B,
0x32F,
0x323,
0x318,
0x30C,
0x301,
0x2F6,
0x2EB,
0x2E0,
0x2D6,
0x2CB,
0x2C1,
0x2B7,
0x2AD,
0x2A3,
0x299,
0x290,
0x287,
0x27D,
0x274,
0x26B,
0x262,
0x259,
0x251,
0x248,
0x240,
0x238,
0x230,
0x228,
0x220,
0x218,
0x210,
0x209,
0x201,
0x1FA,
0x1F2,
0x1EB,
0x1E4,
0x1DD,
0x1D6,
0x1D0,
0x1C9,
0x1C2,
0x1BC,
0x1B6,
0x1AF,
0x1A9,
0x1A3,
0x19D,
0x197,
0x191,
0x18C,
0x186,
0x180,
0x17B,
0x175,
0x170,
0x16B,
0x165,
0x160,
0x15B,
0x156,
0x151,
0x14C,
0x148,
0x143,
0x13E,
0x13A,
0x135,
0x131,
0x12C,
0x128,
0x124,
0x120,
0x11C,
0x118,
0x114,
0x110,
0x10C,
0x108,
0x104,
0x100,
0xFD,
0xF9,
0xF5,
0xF2,
0xEE
};

@ -0,0 +1,217 @@
#ifndef MUSICAL_NOTES_H
#define MUSICAL_NOTES_H
// Tempo Placeholder
#define TEMPO_DEFAULT 100
#define SONG(notes...) { notes }
// Note Types
#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration}
#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64)
#define HALF_NOTE(note) MUSICAL_NOTE(note, 32)
#define QUARTER_NOTE(note) MUSICAL_NOTE(note, 16)
#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8)
#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4)
#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32)
#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16)
#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8)
#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4)
#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2)
// Note Type Shortcuts
#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration)
#define W__NOTE(n) WHOLE_NOTE(n)
#define H__NOTE(n) HALF_NOTE(n)
#define Q__NOTE(n) QUARTER_NOTE(n)
#define E__NOTE(n) EIGHTH_NOTE(n)
#define S__NOTE(n) SIXTEENTH_NOTE(n)
#define WD_NOTE(n) WHOLE_DOT_NOTE(n)
#define HD_NOTE(n) HALF_DOT_NOTE(n)
#define QD_NOTE(n) QUARTER_DOT_NOTE(n)
#define ED_NOTE(n) EIGHTH_DOT_NOTE(n)
#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n)
// Note Styles
// Staccato makes sure there is a rest between each note. Think: TA TA TA
// Legato makes notes flow together. Think: TAAA
#define STACCATO 0.01
#define LEGATO 0
// Note Timbre
// Changes how the notes sound
#define TIMBRE_12 0.125
#define TIMBRE_25 0.250
#define TIMBRE_50 0.500
#define TIMBRE_75 0.750
#define TIMBRE_DEFAULT TIMBRE_50
// Notes - # = Octave
#define NOTE_REST 0.00
/* These notes are currently bugged
#define NOTE_C0 16.35
#define NOTE_CS0 17.32
#define NOTE_D0 18.35
#define NOTE_DS0 19.45
#define NOTE_E0 20.60
#define NOTE_F0 21.83
#define NOTE_FS0 23.12
#define NOTE_G0 24.50
#define NOTE_GS0 25.96
#define NOTE_A0 27.50
#define NOTE_AS0 29.14
#define NOTE_B0 30.87
#define NOTE_C1 32.70
#define NOTE_CS1 34.65
#define NOTE_D1 36.71
#define NOTE_DS1 38.89
#define NOTE_E1 41.20
#define NOTE_F1 43.65
#define NOTE_FS1 46.25
#define NOTE_G1 49.00
#define NOTE_GS1 51.91
#define NOTE_A1 55.00
#define NOTE_AS1 58.27
*/
#define NOTE_B1 61.74
#define NOTE_C2 65.41
#define NOTE_CS2 69.30
#define NOTE_D2 73.42
#define NOTE_DS2 77.78
#define NOTE_E2 82.41
#define NOTE_F2 87.31
#define NOTE_FS2 92.50
#define NOTE_G2 98.00
#define NOTE_GS2 103.83
#define NOTE_A2 110.00
#define NOTE_AS2 116.54
#define NOTE_B2 123.47
#define NOTE_C3 130.81
#define NOTE_CS3 138.59
#define NOTE_D3 146.83
#define NOTE_DS3 155.56
#define NOTE_E3 164.81
#define NOTE_F3 174.61
#define NOTE_FS3 185.00
#define NOTE_G3 196.00
#define NOTE_GS3 207.65
#define NOTE_A3 220.00
#define NOTE_AS3 233.08
#define NOTE_B3 246.94
#define NOTE_C4 261.63
#define NOTE_CS4 277.18
#define NOTE_D4 293.66
#define NOTE_DS4 311.13
#define NOTE_E4 329.63
#define NOTE_F4 349.23
#define NOTE_FS4 369.99
#define NOTE_G4 392.00
#define NOTE_GS4 415.30
#define NOTE_A4 440.00
#define NOTE_AS4 466.16
#define NOTE_B4 493.88
#define NOTE_C5 523.25
#define NOTE_CS5 554.37
#define NOTE_D5 587.33
#define NOTE_DS5 622.25
#define NOTE_E5 659.26
#define NOTE_F5 698.46
#define NOTE_FS5 739.99
#define NOTE_G5 783.99
#define NOTE_GS5 830.61
#define NOTE_A5 880.00
#define NOTE_AS5 932.33
#define NOTE_B5 987.77
#define NOTE_C6 1046.50
#define NOTE_CS6 1108.73
#define NOTE_D6 1174.66
#define NOTE_DS6 1244.51
#define NOTE_E6 1318.51
#define NOTE_F6 1396.91
#define NOTE_FS6 1479.98
#define NOTE_G6 1567.98
#define NOTE_GS6 1661.22
#define NOTE_A6 1760.00
#define NOTE_AS6 1864.66
#define NOTE_B6 1975.53
#define NOTE_C7 2093.00
#define NOTE_CS7 2217.46
#define NOTE_D7 2349.32
#define NOTE_DS7 2489.02
#define NOTE_E7 2637.02
#define NOTE_F7 2793.83
#define NOTE_FS7 2959.96
#define NOTE_G7 3135.96
#define NOTE_GS7 3322.44
#define NOTE_A7 3520.00
#define NOTE_AS7 3729.31
#define NOTE_B7 3951.07
#define NOTE_C8 4186.01
#define NOTE_CS8 4434.92
#define NOTE_D8 4698.64
#define NOTE_DS8 4978.03
#define NOTE_E8 5274.04
#define NOTE_F8 5587.65
#define NOTE_FS8 5919.91
#define NOTE_G8 6271.93
#define NOTE_GS8 6644.88
#define NOTE_A8 7040.00
#define NOTE_AS8 7458.62
#define NOTE_B8 7902.13
// Flat Aliases
#define NOTE_DF0 NOTE_CS0
#define NOTE_EF0 NOTE_DS0
#define NOTE_GF0 NOTE_FS0
#define NOTE_AF0 NOTE_GS0
#define NOTE_BF0 NOTE_AS0
#define NOTE_DF1 NOTE_CS1
#define NOTE_EF1 NOTE_DS1
#define NOTE_GF1 NOTE_FS1
#define NOTE_AF1 NOTE_GS1
#define NOTE_BF1 NOTE_AS1
#define NOTE_DF2 NOTE_CS2
#define NOTE_EF2 NOTE_DS2
#define NOTE_GF2 NOTE_FS2
#define NOTE_AF2 NOTE_GS2
#define NOTE_BF2 NOTE_AS2
#define NOTE_DF3 NOTE_CS3
#define NOTE_EF3 NOTE_DS3
#define NOTE_GF3 NOTE_FS3
#define NOTE_AF3 NOTE_GS3
#define NOTE_BF3 NOTE_AS3
#define NOTE_DF4 NOTE_CS4
#define NOTE_EF4 NOTE_DS4
#define NOTE_GF4 NOTE_FS4
#define NOTE_AF4 NOTE_GS4
#define NOTE_BF4 NOTE_AS4
#define NOTE_DF5 NOTE_CS5
#define NOTE_EF5 NOTE_DS5
#define NOTE_GF5 NOTE_FS5
#define NOTE_AF5 NOTE_GS5
#define NOTE_BF5 NOTE_AS5
#define NOTE_DF6 NOTE_CS6
#define NOTE_EF6 NOTE_DS6
#define NOTE_GF6 NOTE_FS6
#define NOTE_AF6 NOTE_GS6
#define NOTE_BF6 NOTE_AS6
#define NOTE_DF7 NOTE_CS7
#define NOTE_EF7 NOTE_DS7
#define NOTE_GF7 NOTE_FS7
#define NOTE_AF7 NOTE_GS7
#define NOTE_BF7 NOTE_AS7
#define NOTE_DF8 NOTE_CS8
#define NOTE_EF8 NOTE_DS8
#define NOTE_GF8 NOTE_FS8
#define NOTE_AF8 NOTE_GS8
#define NOTE_BF8 NOTE_AS8
#endif

@ -0,0 +1,117 @@
#include "musical_notes.h"
#ifndef SONG_LIST_H
#define SONG_LIST_H
#define ODE_TO_JOY \
Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \
Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \
Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \
QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4),
#define ROCK_A_BYE_BABY \
QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \
H__NOTE(_A5), Q__NOTE(_G5), \
QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \
H__NOTE(_FS5),
#define CLOSE_ENCOUNTERS_5_NOTE \
Q__NOTE(_D5), \
Q__NOTE(_E5), \
Q__NOTE(_C5), \
Q__NOTE(_C4), \
Q__NOTE(_G4),
#define DOE_A_DEER \
QD_NOTE(_C4), E__NOTE(_D4), \
QD_NOTE(_E4), E__NOTE(_C4), \
Q__NOTE(_E4), Q__NOTE(_C4), \
Q__NOTE(_E4),
#define GOODBYE_SOUND \
E__NOTE(_E7), \
E__NOTE(_A6), \
ED_NOTE(_E6),
#define STARTUP_SOUND \
ED_NOTE(_E7 ), \
E__NOTE(_CS7), \
E__NOTE(_E6 ), \
E__NOTE(_A6 ), \
M__NOTE(_CS7, 20),
#define QWERTY_SOUND \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
Q__NOTE(_E7 ),
#define COLEMAK_SOUND \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
ED_NOTE(_E7 ), \
S__NOTE(_REST), \
ED_NOTE(_GS7 ),
#define DVORAK_SOUND \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
E__NOTE(_E7 ), \
S__NOTE(_REST), \
E__NOTE(_FS7 ), \
S__NOTE(_REST), \
E__NOTE(_E7 ),
#define PLOVER_SOUND \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
ED_NOTE(_E7 ), \
S__NOTE(_REST), \
ED_NOTE(_A7 ),
#define PLOVER_GOODBYE_SOUND \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
ED_NOTE(_A7 ), \
S__NOTE(_REST), \
ED_NOTE(_E7 ),
#define MUSIC_SCALE_SOUND \
E__NOTE(_A5 ), \
E__NOTE(_B5 ), \
E__NOTE(_CS6), \
E__NOTE(_D6 ), \
E__NOTE(_E6 ), \
E__NOTE(_FS6), \
E__NOTE(_GS6), \
E__NOTE(_A6 ),
#define CAPS_LOCK_ON_SOUND \
E__NOTE(_A3), \
E__NOTE(_B3),
#define CAPS_LOCK_OFF_SOUND \
E__NOTE(_B3), \
E__NOTE(_A3),
#define SCROLL_LOCK_ON_SOUND \
E__NOTE(_D4), \
E__NOTE(_E4),
#define SCROLL_LOCK_OFF_SOUND \
E__NOTE(_E4), \
E__NOTE(_D4),
#define NUM_LOCK_ON_SOUND \
E__NOTE(_D5), \
E__NOTE(_E5),
#define NUM_LOCK_OFF_SOUND \
E__NOTE(_E5), \
E__NOTE(_D5),
#endif

@ -0,0 +1,28 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define VIBRATO_LUT_LENGTH 20
const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \
1.00223368114872,
1.00425299436105,
1.00585842560279,
1.00689052852052,
1.0072464122237,
1.00689052852052,
1.00585842560279,
1.00425299436105,
1.00223368114872,
1,
0.99777129706302,
0.99576501699778,
0.994175695650927,
0.993156625943589,
0.992805720491269,
0.993156625943589,
0.994175695650927,
0.99576501699778,
0.99777129706302,
1
};

@ -0,0 +1,163 @@
#include "voices.h"
#include "stdlib.h"
#include "vibrato_lut.h"
// these are imported from audio.c
extern uint16_t envelope_index;
extern float note_timbre;
extern float polyphony_rate;
voice_type voice = default_voice;
void set_voice(voice_type v) {
voice = v;
}
void voice_iterate() {
voice = (voice + 1) % number_of_voices;
}
void voice_deiterate() {
voice = (voice - 1) % number_of_voices;
}
float voice_envelope(float frequency) {
// envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
switch (voice) {
case default_voice:
note_timbre = TIMBRE_50;
polyphony_rate = 0;
break;
case butts_fader:
polyphony_rate = 0;
switch (compensated_index) {
case 0 ... 9:
frequency = frequency / 4;
note_timbre = TIMBRE_12;
break;
case 10 ... 19:
frequency = frequency / 2;
note_timbre = TIMBRE_12;
break;
case 20 ... 200:
note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
break;
default:
note_timbre = 0;
break;
}
break;
case octave_crunch:
polyphony_rate = 0;
switch (compensated_index) {
case 0 ... 9:
case 20 ... 24:
case 30 ... 32:
frequency = frequency / 2;
note_timbre = TIMBRE_12;
break;
case 10 ... 19:
case 25 ... 29:
case 33 ... 35:
frequency = frequency * 2;
note_timbre = TIMBRE_12;
break;
default:
note_timbre = TIMBRE_12;
break;
}
break;
case duty_osc:
// This slows the loop down a substantial amount, so higher notes may freeze
polyphony_rate = 0;
switch (compensated_index) {
default:
#define OCS_SPEED 10
#define OCS_AMP .25
// sine wave is slow
// note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
// triangle wave is a bit faster
note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
break;
}
break;
case duty_octave_down:
polyphony_rate = 0;
note_timbre = (envelope_index % 2) * .125 + .375 * 2;
if ((envelope_index % 4) == 0)
note_timbre = 0.5;
if ((envelope_index % 8) == 0)
note_timbre = 0;
break;
case delayed_vibrato:
polyphony_rate = 0;
note_timbre = TIMBRE_50;
#define VOICE_VIBRATO_DELAY 150
#define VOICE_VIBRATO_SPEED 50
switch (compensated_index) {
case 0 ... VOICE_VIBRATO_DELAY:
break;
default:
frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
break;
}
break;
// case delayed_vibrato_octave:
// polyphony_rate = 0;
// if ((envelope_index % 2) == 1) {
// note_timbre = 0.55;
// } else {
// note_timbre = 0.45;
// }
// #define VOICE_VIBRATO_DELAY 150
// #define VOICE_VIBRATO_SPEED 50
// switch (compensated_index) {
// case 0 ... VOICE_VIBRATO_DELAY:
// break;
// default:
// frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
// break;
// }
// break;
// case duty_fifth_down:
// note_timbre = 0.5;
// if ((envelope_index % 3) == 0)
// note_timbre = 0.75;
// break;
// case duty_fourth_down:
// note_timbre = 0.0;
// if ((envelope_index % 12) == 0)
// note_timbre = 0.75;
// if (((envelope_index % 12) % 4) != 1)
// note_timbre = 0.75;
// break;
// case duty_third_down:
// note_timbre = 0.5;
// if ((envelope_index % 5) == 0)
// note_timbre = 0.75;
// break;
// case duty_fifth_third_down:
// note_timbre = 0.5;
// if ((envelope_index % 5) == 0)
// note_timbre = 0.75;
// if ((envelope_index % 3) == 0)
// note_timbre = 0.25;
// break;
default:
break;
}
return frequency;
}

@ -0,0 +1,32 @@
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
#include "musical_notes.h"
#include "song_list.h"
#ifndef VOICES_H
#define VOICES_H
float voice_envelope(float frequency);
typedef enum {
default_voice,
butts_fader,
octave_crunch,
duty_osc,
duty_octave_down,
delayed_vibrato,
// delayed_vibrato_octave,
// duty_fifth_down,
// duty_fourth_down,
// duty_third_down,
// duty_fifth_third_down,
number_of_voices // important that this is last
} voice_type;
void set_voice(voice_type v);
void voice_iterate(void);
void voice_deiterate(void);
#endif

@ -26,141 +26,27 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "backlight.h" #include "backlight.h"
#include "keymap_midi.h" #include "keymap_midi.h"
#include "bootloader.h" #include "bootloader.h"
#include "eeconfig.h"
extern keymap_config_t keymap_config;
#include <stdio.h> #include <stdio.h>
#include <inttypes.h> #include <inttypes.h>
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#include "audio.h" #include "audio.h"
#endif /* AUDIO_ENABLE */
float goodbye[][2] = {
{440.0*pow(2.0,(67)/12.0), 400},
{0, 50},
{440.0*pow(2.0,(60)/12.0), 400},
{0, 50},
{440.0*pow(2.0,(55)/12.0), 600},
};
#endif
static action_t keycode_to_action(uint16_t keycode); static action_t keycode_to_action(uint16_t keycode);
/* converts key to action */ /* converts key to action */
action_t action_for_key(uint8_t layer, keypos_t key) action_t action_for_key(uint8_t layer, keypos_t key)
{ {
// 16bit keycodes - important // 16bit keycodes - important
uint16_t keycode = keymap_key_to_keycode(layer, key); uint16_t keycode = keymap_key_to_keycode(layer, key);
if (keycode >= 0x0100 && keycode < 0x2000) {
// Has a modifier
action_t action;
// Split it up
action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
return action;
} else if (keycode >= 0x2000 && keycode < 0x3000) {
// Is a shortcut for function layer, pull last 12bits
// This means we have 4,096 FN macros at our disposal
return keymap_func_to_action(keycode & 0xFFF);
} else if (keycode >= 0x3000 && keycode < 0x4000) {
// When the code starts with 3, it's an action macro.
action_t action;
action.code = ACTION_MACRO(keycode & 0xFF);
return action;
#ifdef BACKLIGHT_ENABLE
} else if (keycode >= BL_0 && keycode <= BL_15) {
action_t action;
action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
return action;
} else if (keycode == BL_DEC) {
action_t action;
action.code = ACTION_BACKLIGHT_DECREASE();
return action;
} else if (keycode == BL_INC) {
action_t action;
action.code = ACTION_BACKLIGHT_INCREASE();
return action;
} else if (keycode == BL_TOGG) {
action_t action;
action.code = ACTION_BACKLIGHT_TOGGLE();
return action;
} else if (keycode == BL_STEP) {
action_t action;
action.code = ACTION_BACKLIGHT_STEP();
return action;
#endif
} else if (keycode == RESET) { // RESET is 0x5000, which is why this is here
clear_keyboard();
#ifdef AUDIO_ENABLE
play_notes(&goodbye, 5, false);
#endif
_delay_ms(250);
#ifdef ATREUS_ASTAR
*(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
#endif
bootloader_jump();
return;
} else if (keycode == DEBUG) { // DEBUG is 0x5001
// TODO: Does this actually work?
print("\nDEBUG: enabled.\n");
debug_enable = true;
return;
} else if (keycode >= 0x5000 && keycode < 0x6000) {
// Layer movement shortcuts
// See .h to see constraints/usage
int type = (keycode >> 0x8) & 0xF;
if (type == 0x1) {
// Layer set "GOTO"
int when = (keycode >> 0x4) & 0x3;
int layer = keycode & 0xF;
action_t action;
action.code = ACTION_LAYER_SET(layer, when);
return action;
} else if (type == 0x2) {
// Momentary layer
int layer = keycode & 0xFF;
action_t action;
action.code = ACTION_LAYER_MOMENTARY(layer);
return action;
} else if (type == 0x3) {
// Set default layer
int layer = keycode & 0xFF;
action_t action;
action.code = ACTION_DEFAULT_LAYER_SET(layer);
return action;
} else if (type == 0x4) {
// Set default layer
int layer = keycode & 0xFF;
action_t action;
action.code = ACTION_LAYER_TOGGLE(layer);
return action;
}
#ifdef MIDI_ENABLE
} else if (keycode >= 0x6000 && keycode < 0x7000) {
action_t action;
action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
return action;
#endif
} else if (keycode >= 0x7000 && keycode < 0x8000) {
action_t action;
action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
return action;
} else if (keycode >= 0x8000 && keycode < 0x9000) {
action_t action;
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
return action;
#ifdef UNICODE_ENABLE
} else if (keycode >= 0x8000000) {
action_t action;
uint16_t unicode = keycode & ~(0x8000);
action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
return action;
#endif
} else {
}
switch (keycode) { switch (keycode) {
case KC_FN0 ... KC_FN31: case KC_FN0 ... KC_FN31:
return keymap_fn_to_action(keycode); return keymap_fn_to_action(keycode);
#ifdef BOOTMAGIC_ENABLE
case KC_CAPSLOCK: case KC_CAPSLOCK:
case KC_LOCKING_CAPS: case KC_LOCKING_CAPS:
if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
@ -224,7 +110,6 @@ action_t action_for_key(uint8_t layer, keypos_t key)
return keycode_to_action(KC_BSLASH); return keycode_to_action(KC_BSLASH);
} }
return keycode_to_action(KC_BSPACE); return keycode_to_action(KC_BSPACE);
#endif
default: default:
return keycode_to_action(keycode); return keycode_to_action(keycode);
} }
@ -265,6 +150,143 @@ static action_t keycode_to_action(uint16_t keycode)
case KC_TRNS: case KC_TRNS:
action.code = ACTION_TRANSPARENT; action.code = ACTION_TRANSPARENT;
break; break;
case 0x0100 ... 0x1FFF: ;
// Has a modifier
// Split it up
action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
break;
case 0x2000 ... 0x2FFF:
// Is a shortcut for function layer, pull last 12bits
// This means we have 4,096 FN macros at our disposal
return keymap_func_to_action(keycode & 0xFFF);
break;
case 0x3000 ... 0x3FFF: ;
// When the code starts with 3, it's an action macro.
action.code = ACTION_MACRO(keycode & 0xFF);
break;
#ifdef BACKLIGHT_ENABLE
case BL_0 ... BL_15:
action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
break;
case BL_DEC:
action.code = ACTION_BACKLIGHT_DECREASE();
break;
case BL_INC:
action.code = ACTION_BACKLIGHT_INCREASE();
break;
case BL_TOGG:
action.code = ACTION_BACKLIGHT_TOGGLE();
break;
case BL_STEP:
action.code = ACTION_BACKLIGHT_STEP();
break;
#endif
case RESET: ; // RESET is 0x5000, which is why this is here
clear_keyboard();
#ifdef AUDIO_ENABLE
stop_all_notes();
play_goodbye_tone();
#endif
_delay_ms(250);
#ifdef ATREUS_ASTAR
*(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
#endif
bootloader_jump();
break;
case DEBUG: ; // DEBUG is 0x5001
print("\nDEBUG: enabled.\n");
debug_enable = true;
break;
case 0x5002 ... 0x50FF:
// MAGIC actions (BOOTMAGIC without the boot)
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
/* keymap config */
keymap_config.raw = eeconfig_read_keymap();
if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) {
keymap_config.swap_control_capslock = 1;
} else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) {
keymap_config.capslock_to_control = 1;
} else if (keycode == MAGIC_SWAP_LALT_LGUI) {
keymap_config.swap_lalt_lgui = 1;
} else if (keycode == MAGIC_SWAP_RALT_RGUI) {
keymap_config.swap_ralt_rgui = 1;
} else if (keycode == MAGIC_NO_GUI) {
keymap_config.no_gui = 1;
} else if (keycode == MAGIC_SWAP_GRAVE_ESC) {
keymap_config.swap_grave_esc = 1;
} else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) {
keymap_config.swap_backslash_backspace = 1;
} else if (keycode == MAGIC_HOST_NKRO) {
keymap_config.nkro = 1;
} else if (keycode == MAGIC_SWAP_ALT_GUI) {
keymap_config.swap_lalt_lgui = 1;
keymap_config.swap_ralt_rgui = 1;
}
/* UNs */
else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) {
keymap_config.swap_control_capslock = 0;
} else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) {
keymap_config.capslock_to_control = 0;
} else if (keycode == MAGIC_UNSWAP_LALT_LGUI) {
keymap_config.swap_lalt_lgui = 0;
} else if (keycode == MAGIC_UNSWAP_RALT_RGUI) {
keymap_config.swap_ralt_rgui = 0;
} else if (keycode == MAGIC_UNNO_GUI) {
keymap_config.no_gui = 0;
} else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) {
keymap_config.swap_grave_esc = 0;
} else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) {
keymap_config.swap_backslash_backspace = 0;
} else if (keycode == MAGIC_UNHOST_NKRO) {
keymap_config.nkro = 0;
} else if (keycode == MAGIC_UNSWAP_ALT_GUI) {
keymap_config.swap_lalt_lgui = 0;
keymap_config.swap_ralt_rgui = 0;
}
eeconfig_update_keymap(keymap_config.raw);
break;
case 0x5100 ... 0x5FFF: ;
// Layer movement shortcuts
// See .h to see constraints/usage
int type = (keycode >> 0x8) & 0xF;
if (type == 0x1) {
// Layer set "GOTO"
int when = (keycode >> 0x4) & 0x3;
int layer = keycode & 0xF;
action.code = ACTION_LAYER_SET(layer, when);
} else if (type == 0x2) {
// Momentary layer
int layer = keycode & 0xFF;
action.code = ACTION_LAYER_MOMENTARY(layer);
} else if (type == 0x3) {
// Set default layer
int layer = keycode & 0xFF;
action.code = ACTION_DEFAULT_LAYER_SET(layer);
} else if (type == 0x4) {
// Set default layer
int layer = keycode & 0xFF;
action.code = ACTION_LAYER_TOGGLE(layer);
}
break;
#ifdef MIDI_ENABLE
case 0x6000 ... 0x6FFF:
action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
break;
#endif
case 0x7000 ... 0x7FFF:
action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
break;
case 0x8000 ... 0x8FFF:
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
break;
#ifdef UNICODE_ENABLE
case 0x8000000 ... 0x8FFFFFF:
uint16_t unicode = keycode & ~(0x8000);
action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
break;
#endif
default: default:
action.code = ACTION_NO; action.code = ACTION_NO;
break; break;
@ -276,7 +298,7 @@ static action_t keycode_to_action(uint16_t keycode)
/* translates key to keycode */ /* translates key to keycode */
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{ {
// Read entire word (16bits) // Read entire word (16bits)
return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]);
} }
@ -288,6 +310,14 @@ action_t keymap_fn_to_action(uint16_t keycode)
action_t keymap_func_to_action(uint16_t keycode) action_t keymap_func_to_action(uint16_t keycode)
{ {
// For FUNC without 8bit limit // For FUNC without 8bit limit
return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
} }
void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
layer_on(layer3);
} else {
layer_off(layer3);
}
}

@ -30,7 +30,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #include "print.h" // #include "print.h"
#include "debug.h" #include "debug.h"
#ifdef BOOTMAGIC_ENABLE
/* NOTE: Not portable. Bit field order depends on implementation */ /* NOTE: Not portable. Bit field order depends on implementation */
typedef union { typedef union {
uint16_t raw; uint16_t raw;
@ -45,8 +44,6 @@ typedef union {
bool nkro:1; bool nkro:1;
}; };
} keymap_config_t; } keymap_config_t;
keymap_config_t keymap_config;
#endif
/* translates key to keycode */ /* translates key to keycode */
@ -168,6 +165,30 @@ extern const uint16_t fn_actions[];
#define RESET 0x5000 #define RESET 0x5000
#define DEBUG 0x5001 #define DEBUG 0x5001
// MAGIC keycodes
#define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002
#define MAGIC_UNSWAP_CONTROL_CAPSLOCK 0x5003
#define MAGIC_CAPSLOCK_TO_CONTROL 0x5004
#define MAGIC_UNCAPSLOCK_TO_CONTROL 0x5005
#define MAGIC_SWAP_LALT_LGUI 0x5006
#define MAGIC_UNSWAP_LALT_LGUI 0x5007
#define MAGIC_SWAP_RALT_RGUI 0x5008
#define MAGIC_UNSWAP_RALT_RGUI 0x5009
#define MAGIC_NO_GUI 0x500a
#define MAGIC_UNNO_GUI 0x500b
#define MAGIC_SWAP_GRAVE_ESC 0x500c
#define MAGIC_UNSWAP_GRAVE_ESC 0x500d
#define MAGIC_SWAP_BACKSLASH_BACKSPACE 0x500e
#define MAGIC_UNSWAP_BACKSLASH_BACKSPACE 0x500f
#define MAGIC_HOST_NKRO 0x5010
#define MAGIC_UNHOST_NKRO 0x5011
#define MAGIC_SWAP_ALT_GUI 0x5012
#define MAGIC_UNSWAP_ALT_GUI 0x5013
#define AG_SWAP MAGIC_SWAP_ALT_GUI
#define AG_NORM MAGIC_UNSWAP_ALT_GUI
// GOTO layer - 16 layers max // GOTO layer - 16 layers max
// when: // when:
// ON_PRESS = 1 // ON_PRESS = 1
@ -184,8 +205,6 @@ extern const uint16_t fn_actions[];
// Toggle to layer - 256 layer max // Toggle to layer - 256 layer max
#define TG(layer) (layer | 0x5400) #define TG(layer) (layer | 0x5400)
#define MIDI(n) (n | 0x6000)
// M-od, T-ap - 256 keycode max // M-od, T-ap - 256 keycode max
#define MT(mod, kc) (kc | 0x7000 | ((mod & 0xF) << 8)) #define MT(mod, kc) (kc | 0x7000 | ((mod & 0xF) << 8))
#define CTL_T(kc) MT(0x1, kc) #define CTL_T(kc) MT(0x1, kc)
@ -194,7 +213,7 @@ extern const uint16_t fn_actions[];
#define GUI_T(kc) MT(0x8, kc) #define GUI_T(kc) MT(0x8, kc)
#define C_S_T(kc) MT(0x3, kc) // Control + Shift e.g. for gnome-terminal #define C_S_T(kc) MT(0x3, kc) // Control + Shift e.g. for gnome-terminal
#define MEH_T(kc) MT(0x7, kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl #define MEH_T(kc) MT(0x7, kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl
#define LCAG_T(kc) MT(0xD, kc) // Left control alt and gui #define LCAG_T(kc) MT(0xD, kc) // Left control alt and gui
#define ALL_T(kc) MT(0xF, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ #define ALL_T(kc) MT(0xF, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/
// Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap
@ -210,5 +229,10 @@ extern const uint16_t fn_actions[];
#define UNICODE(n) (n | 0x8000) #define UNICODE(n) (n | 0x8000)
#define UC(n) UNICODE(n) #define UC(n) UNICODE(n)
// For tri-layer
void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3);
#define IS_LAYER_ON(layer) (layer_state & (1UL << (layer)))
#define IS_LAYER_OFF(layer) (~layer_state & (1UL << (layer)))
#endif #endif

@ -85,8 +85,8 @@
#define DE_OSX_UNDS LSFT(DE_OSX_MINS) // _ #define DE_OSX_UNDS LSFT(DE_OSX_MINS) // _
// Alt-ed characters // Alt-ed characters
#define DE_OSX_SQ2 LALT(KC_2) // ² //#define DE_OSX_SQ2 LALT(KC_2) // ²
#define DE_OSX_SQ3 LALT(KC_3) // ³ //#define DE_OSX_SQ3 LALT(KC_3) // ³
#define DE_OSX_LCBR LALT(KC_8) // { #define DE_OSX_LCBR LALT(KC_8) // {
#define DE_OSX_LBRC LALT(KC_5) // [ #define DE_OSX_LBRC LALT(KC_5) // [
#define DE_OSX_RBRC LALT(KC_6) // ] #define DE_OSX_RBRC LALT(KC_6) // ]

@ -0,0 +1,32 @@
#ifndef KEYMAP_PLOVER_H
#define KEYMAP_PLOVER_H
#include "keymap_common.h"
#define PV_NUM KC_1
#define PV_LS KC_Q
#define PV_LT KC_W
#define PV_LP KC_E
#define PV_LH KC_R
#define PV_LK KC_S
#define PV_LW KC_D
#define PV_LR KC_F
#define PV_STAR KC_Y
#define PV_RF KC_U
#define PV_RP KC_I
#define PV_RL KC_O
#define PV_RT KC_P
#define PV_RD KC_LBRC
#define PV_RR KC_J
#define PV_RB KC_K
#define PV_RG KC_L
#define PV_RS KC_SCLN
#define PV_RZ KC_QUOT
#define PV_A KC_C
#define PV_O KC_V
#define PV_E KC_N
#define PV_U KC_M
#endif

@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <lufa.h> #include <lufa.h>
#define MIDI 0x6000 #define MIDI(n) ((n) | 0x6000)
#define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000 #define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000
#define CHNL(note, channel) (note + (channel << 8)) #define CHNL(note, channel) (note + (channel << 8))

@ -24,6 +24,7 @@ void led_set_kb(uint8_t usb_led) {
} }
__attribute__ ((weak))
void led_set(uint8_t usb_led) void led_set(uint8_t usb_led)
{ {

@ -23,19 +23,19 @@ ifndef CUSTOM_MATRIX
SRC += $(QUANTUM_DIR)/matrix.c SRC += $(QUANTUM_DIR)/matrix.c
endif endif
ifdef MIDI_ENABLE ifeq ($(strip $(MIDI_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/keymap_midi.c SRC += $(QUANTUM_DIR)/keymap_midi.c
endif endif
ifdef AUDIO_ENABLE ifeq ($(strip $(AUDIO_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/audio.c SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/voices.c
endif endif
ifdef UNICODE_ENABLE ifeq ($(strip $(UNICODE_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/keymap_unicode.c SRC += $(QUANTUM_DIR)/keymap_unicode.c
endif endif
ifdef RGBLIGHT_ENABLE ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/light_ws2812.c SRC += $(QUANTUM_DIR)/light_ws2812.c
SRC += $(QUANTUM_DIR)/rgblight.c SRC += $(QUANTUM_DIR)/rgblight.c
OPT_DEFS += -DRGBLIGHT_ENABLE OPT_DEFS += -DRGBLIGHT_ENABLE
@ -46,6 +46,8 @@ endif
# Search Path # Search Path
VPATH += $(TOP_DIR)/$(QUANTUM_DIR) VPATH += $(TOP_DIR)/$(QUANTUM_DIR)
VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras
VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/audio
include $(TMK_DIR)/protocol/lufa.mk include $(TMK_DIR)/protocol/lufa.mk

@ -107,17 +107,17 @@ void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1) {
uint32_t eeconfig_read_rgblight(void) { uint32_t eeconfig_read_rgblight(void) {
return eeprom_read_dword(EECONFIG_RGBLIGHT); return eeprom_read_dword(EECONFIG_RGBLIGHT);
} }
void eeconfig_write_rgblight(uint32_t val) { void eeconfig_update_rgblight(uint32_t val) {
eeprom_write_dword(EECONFIG_RGBLIGHT, val); eeprom_update_dword(EECONFIG_RGBLIGHT, val);
} }
void eeconfig_write_rgblight_default(void) { void eeconfig_update_rgblight_default(void) {
dprintf("eeconfig_write_rgblight_default\n"); dprintf("eeconfig_update_rgblight_default\n");
rgblight_config.enable = 1; rgblight_config.enable = 1;
rgblight_config.mode = 1; rgblight_config.mode = 1;
rgblight_config.hue = 200; rgblight_config.hue = 200;
rgblight_config.sat = 204; rgblight_config.sat = 204;
rgblight_config.val = 204; rgblight_config.val = 204;
eeconfig_write_rgblight(rgblight_config.raw); eeconfig_update_rgblight(rgblight_config.raw);
} }
void eeconfig_debug_rgblight(void) { void eeconfig_debug_rgblight(void) {
dprintf("rgblight_config eprom\n"); dprintf("rgblight_config eprom\n");
@ -136,12 +136,12 @@ void rgblight_init(void) {
if (!eeconfig_is_enabled()) { if (!eeconfig_is_enabled()) {
dprintf("rgblight_init eeconfig is not enabled.\n"); dprintf("rgblight_init eeconfig is not enabled.\n");
eeconfig_init(); eeconfig_init();
eeconfig_write_rgblight_default(); eeconfig_update_rgblight_default();
} }
rgblight_config.raw = eeconfig_read_rgblight(); rgblight_config.raw = eeconfig_read_rgblight();
if (!rgblight_config.mode) { if (!rgblight_config.mode) {
dprintf("rgblight_init rgblight_config.mode = 0. Write default values to EEPROM.\n"); dprintf("rgblight_init rgblight_config.mode = 0. Write default values to EEPROM.\n");
eeconfig_write_rgblight_default(); eeconfig_update_rgblight_default();
rgblight_config.raw = eeconfig_read_rgblight(); rgblight_config.raw = eeconfig_read_rgblight();
} }
eeconfig_debug_rgblight(); // display current eeprom values eeconfig_debug_rgblight(); // display current eeprom values
@ -189,8 +189,8 @@ void rgblight_mode(uint8_t mode) {
} else { } else {
rgblight_config.mode = mode; rgblight_config.mode = mode;
} }
eeconfig_write_rgblight(rgblight_config.raw); eeconfig_update_rgblight(rgblight_config.raw);
dprintf("rgblight mode: %u\n", rgblight_config.mode); xprintf("rgblight mode: %u\n", rgblight_config.mode);
if (rgblight_config.mode == 1) { if (rgblight_config.mode == 1) {
rgblight_timer_disable(); rgblight_timer_disable();
} else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) { } else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) {
@ -206,8 +206,8 @@ void rgblight_mode(uint8_t mode) {
void rgblight_toggle(void) { void rgblight_toggle(void) {
rgblight_config.enable ^= 1; rgblight_config.enable ^= 1;
eeconfig_write_rgblight(rgblight_config.raw); eeconfig_update_rgblight(rgblight_config.raw);
dprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable); xprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable);
if (rgblight_config.enable) { if (rgblight_config.enable) {
rgblight_mode(rgblight_config.mode); rgblight_mode(rgblight_config.mode);
} else { } else {
@ -299,8 +299,8 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val){
rgblight_config.hue = hue; rgblight_config.hue = hue;
rgblight_config.sat = sat; rgblight_config.sat = sat;
rgblight_config.val = val; rgblight_config.val = val;
eeconfig_write_rgblight(rgblight_config.raw); eeconfig_update_rgblight(rgblight_config.raw);
dprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); xprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
} }
} }

@ -66,8 +66,8 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b);
#define EECONFIG_RGBLIGHT (uint8_t *)7 #define EECONFIG_RGBLIGHT (uint8_t *)7
uint32_t eeconfig_read_rgblight(void); uint32_t eeconfig_read_rgblight(void);
void eeconfig_write_rgblight(uint32_t val); void eeconfig_update_rgblight(uint32_t val);
void eeconfig_write_rgblight_default(void); void eeconfig_update_rgblight_default(void);
void eeconfig_debug_rgblight(void); void eeconfig_debug_rgblight(void);
void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1); void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1);

@ -0,0 +1,6 @@
`eeprom_reset.hex` is to reset the eeprom on the Atmega32u4, like this:
dfu-programmer atmega32u4 erase
dfu-programmer atmega32u4 flash --eeprom eeprom-reset.bin
You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom.

@ -0,0 +1,9 @@
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:00000001FF

@ -17,66 +17,70 @@ SRC += $(COMMON_DIR)/host.c \
# Option modules # Option modules
ifdef BOOTMAGIC_ENABLE ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes)
SRC += $(COMMON_DIR)/bootmagic.c SRC += $(COMMON_DIR)/bootmagic.c
SRC += $(COMMON_DIR)/avr/eeconfig.c SRC += $(COMMON_DIR)/avr/eeconfig.c
OPT_DEFS += -DBOOTMAGIC_ENABLE OPT_DEFS += -DBOOTMAGIC_ENABLE
else
SRC += $(COMMON_DIR)/magic.c
SRC += $(COMMON_DIR)/avr/eeconfig.c
endif endif
ifdef MOUSEKEY_ENABLE ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
SRC += $(COMMON_DIR)/mousekey.c SRC += $(COMMON_DIR)/mousekey.c
OPT_DEFS += -DMOUSEKEY_ENABLE OPT_DEFS += -DMOUSEKEY_ENABLE
OPT_DEFS += -DMOUSE_ENABLE OPT_DEFS += -DMOUSE_ENABLE
endif endif
ifdef EXTRAKEY_ENABLE ifeq ($(strip $(EXTRAKEY_ENABLE)), yes)
OPT_DEFS += -DEXTRAKEY_ENABLE OPT_DEFS += -DEXTRAKEY_ENABLE
endif endif
ifdef CONSOLE_ENABLE ifeq ($(strip $(CONSOLE_ENABLE)), yes)
OPT_DEFS += -DCONSOLE_ENABLE OPT_DEFS += -DCONSOLE_ENABLE
else else
OPT_DEFS += -DNO_PRINT OPT_DEFS += -DNO_PRINT
OPT_DEFS += -DNO_DEBUG OPT_DEFS += -DNO_DEBUG
endif endif
ifdef COMMAND_ENABLE ifeq ($(strip $(COMMAND_ENABLE)), yes)
SRC += $(COMMON_DIR)/command.c SRC += $(COMMON_DIR)/command.c
OPT_DEFS += -DCOMMAND_ENABLE OPT_DEFS += -DCOMMAND_ENABLE
endif endif
ifdef NKRO_ENABLE ifeq ($(strip $(NKRO_ENABLE)), yes)
OPT_DEFS += -DNKRO_ENABLE OPT_DEFS += -DNKRO_ENABLE
endif endif
ifdef MIDI_ENABLE ifeq ($(strip $(MIDI_ENABLE)), yes)
OPT_DEFS += -DMIDI_ENABLE OPT_DEFS += -DMIDI_ENABLE
endif endif
ifdef AUDIO_ENABLE ifeq ($(strip $(AUDIO_ENABLE)), yes)
OPT_DEFS += -DAUDIO_ENABLE OPT_DEFS += -DAUDIO_ENABLE
endif endif
ifdef USB_6KRO_ENABLE ifeq ($(strip $(USB_6KRO_ENABLE)), yes)
OPT_DEFS += -DUSB_6KRO_ENABLE OPT_DEFS += -DUSB_6KRO_ENABLE
endif endif
ifdef SLEEP_LED_ENABLE ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
SRC += $(COMMON_DIR)/sleep_led.c SRC += $(COMMON_DIR)/sleep_led.c
OPT_DEFS += -DSLEEP_LED_ENABLE OPT_DEFS += -DSLEEP_LED_ENABLE
OPT_DEFS += -DNO_SUSPEND_POWER_DOWN OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
endif endif
ifdef BACKLIGHT_ENABLE ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
SRC += $(COMMON_DIR)/backlight.c SRC += $(COMMON_DIR)/backlight.c
SRC += $(COMMON_DIR)/avr/eeconfig.c
OPT_DEFS += -DBACKLIGHT_ENABLE OPT_DEFS += -DBACKLIGHT_ENABLE
endif endif
ifdef BLUETOOTH_ENABLE ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
OPT_DEFS += -DBLUETOOTH_ENABLE OPT_DEFS += -DBLUETOOTH_ENABLE
endif endif
ifdef KEYMAP_SECTION_ENABLE ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes)
OPT_DEFS += -DKEYMAP_SECTION_ENABLE OPT_DEFS += -DKEYMAP_SECTION_ENABLE
ifeq ($(strip $(MCU)),atmega32u2) ifeq ($(strip $(MCU)),atmega32u2)

@ -27,11 +27,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_util.h" #include "action_util.h"
#include "action.h" #include "action.h"
#ifdef DEBUG_ACTION //#ifdef DEBUG_ACTION
#include "debug.h" #include "debug.h"
#else //#else
#include "nodebug.h" //#include "nodebug.h"
#endif //#endif
void action_exec(keyevent_t event) void action_exec(keyevent_t event)

@ -301,7 +301,7 @@ enum backlight_opt {
#define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE << 8) #define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE << 8)
#define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE << 8) #define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE << 8)
#define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8) #define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8)
#define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | level) #define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | (level))
/* Command */ /* Command */
#define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr)) #define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr))
/* Function */ /* Function */

@ -4,14 +4,14 @@
#include "util.h" #include "util.h"
#include "action_layer.h" #include "action_layer.h"
#ifdef DEBUG_ACTION //#ifdef DEBUG_ACTION
#include "debug.h" #include "debug.h"
#else //#else
#include "nodebug.h" //#include "nodebug.h"
#endif //#endif
/* /*
* Default Layer State * Default Layer State
*/ */
uint32_t default_layer_state = 0; uint32_t default_layer_state = 0;
@ -52,7 +52,7 @@ void default_layer_xor(uint32_t state)
#ifndef NO_ACTION_LAYER #ifndef NO_ACTION_LAYER
/* /*
* Keymap Layer State * Keymap Layer State
*/ */
uint32_t layer_state = 0; uint32_t layer_state = 0;
@ -111,7 +111,7 @@ void layer_debug(void)
#endif #endif
#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
uint8_t source_layers_cache[MAX_LAYER_BITS][(MATRIX_ROWS * MATRIX_COLS + 7) / 8] = {0}; uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {0};
void update_source_layers_cache(keypos_t key, uint8_t layer) void update_source_layers_cache(keypos_t key, uint8_t layer)
{ {
@ -120,9 +120,9 @@ void update_source_layers_cache(keypos_t key, uint8_t layer)
const uint8_t storage_bit = key_number % 8; const uint8_t storage_bit = key_number % 8;
for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) { for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
source_layers_cache[bit_number][storage_row] ^= source_layers_cache[storage_row][bit_number] ^=
(-((layer & (1U << bit_number)) != 0) (-((layer & (1U << bit_number)) != 0)
^ source_layers_cache[bit_number][storage_row]) ^ source_layers_cache[storage_row][bit_number])
& (1U << storage_bit); & (1U << storage_bit);
} }
} }
@ -136,7 +136,7 @@ uint8_t read_source_layers_cache(keypos_t key)
for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) { for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
layer |= layer |=
((source_layers_cache[bit_number][storage_row] ((source_layers_cache[storage_row][bit_number]
& (1U << storage_bit)) != 0) & (1U << storage_bit)) != 0)
<< bit_number; << bit_number;
} }

@ -68,6 +68,7 @@ void layer_xor(uint32_t state);
#define layer_and(state) #define layer_and(state)
#define layer_xor(state) #define layer_xor(state)
#define layer_debug() #define layer_debug()
#endif #endif
/* pressed actions cache */ /* pressed actions cache */

@ -19,11 +19,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_macro.h" #include "action_macro.h"
#include "wait.h" #include "wait.h"
#ifdef DEBUG_ACTION //#ifdef DEBUG_ACTION
#include "debug.h" #include "debug.h"
#else //#else
#include "nodebug.h" //#include "nodebug.h"
#endif //#endif
#ifndef NO_ACTION_MACRO #ifndef NO_ACTION_MACRO

@ -6,11 +6,11 @@
#include "keycode.h" #include "keycode.h"
#include "timer.h" #include "timer.h"
#ifdef DEBUG_ACTION //#ifdef DEBUG_ACTION
#include "debug.h" #include "debug.h"
#else //#else
#include "nodebug.h" //#include "nodebug.h"
#endif //#endif
#ifndef NO_ACTION_TAPPING #ifndef NO_ACTION_TAPPING
@ -139,7 +139,7 @@ bool process_tapping(keyrecord_t *keyp)
if (event.pressed) { if (event.pressed) {
tapping_key.tap.interrupted = true; tapping_key.tap.interrupted = true;
} }
// enqueue // enqueue
return false; return false;
} }
} }
@ -324,6 +324,7 @@ bool waiting_buffer_typed(keyevent_t event)
return false; return false;
} }
__attribute__((unused))
bool waiting_buffer_has_anykey_pressed(void) bool waiting_buffer_has_anykey_pressed(void)
{ {
for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) { for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) {

@ -5,24 +5,27 @@
void eeconfig_init(void) void eeconfig_init(void)
{ {
eeprom_write_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
eeprom_write_byte(EECONFIG_DEBUG, 0); eeprom_update_byte(EECONFIG_DEBUG, 0);
eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0); eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0);
eeprom_write_byte(EECONFIG_KEYMAP, 0); eeprom_update_byte(EECONFIG_KEYMAP, 0);
eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0); eeprom_update_byte(EECONFIG_MOUSEKEY_ACCEL, 0);
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
eeprom_write_byte(EECONFIG_BACKLIGHT, 0); eeprom_update_byte(EECONFIG_BACKLIGHT, 0);
#endif
#ifdef AUDIO_ENABLE
eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default
#endif #endif
} }
void eeconfig_enable(void) void eeconfig_enable(void)
{ {
eeprom_write_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
} }
void eeconfig_disable(void) void eeconfig_disable(void)
{ {
eeprom_write_word(EECONFIG_MAGIC, 0xFFFF); eeprom_update_word(EECONFIG_MAGIC, 0xFFFF);
} }
bool eeconfig_is_enabled(void) bool eeconfig_is_enabled(void)
@ -31,15 +34,20 @@ bool eeconfig_is_enabled(void)
} }
uint8_t eeconfig_read_debug(void) { return eeprom_read_byte(EECONFIG_DEBUG); } uint8_t eeconfig_read_debug(void) { return eeprom_read_byte(EECONFIG_DEBUG); }
void eeconfig_write_debug(uint8_t val) { eeprom_write_byte(EECONFIG_DEBUG, val); } void eeconfig_update_debug(uint8_t val) { eeprom_update_byte(EECONFIG_DEBUG, val); }
uint8_t eeconfig_read_default_layer(void) { return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); } uint8_t eeconfig_read_default_layer(void) { return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); }
void eeconfig_write_default_layer(uint8_t val) { eeprom_write_byte(EECONFIG_DEFAULT_LAYER, val); } void eeconfig_update_default_layer(uint8_t val) { eeprom_update_byte(EECONFIG_DEFAULT_LAYER, val); }
uint8_t eeconfig_read_keymap(void) { return eeprom_read_byte(EECONFIG_KEYMAP); } uint8_t eeconfig_read_keymap(void) { return eeprom_read_byte(EECONFIG_KEYMAP); }
void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val); } void eeconfig_update_keymap(uint8_t val) { eeprom_update_byte(EECONFIG_KEYMAP, val); }
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); } uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); } void eeconfig_update_backlight(uint8_t val) { eeprom_update_byte(EECONFIG_BACKLIGHT, val); }
#endif
#ifdef AUDIO_ENABLE
uint8_t eeconfig_read_audio(void) { return eeprom_read_byte(EECONFIG_AUDIO); }
void eeconfig_update_audio(uint8_t val) { eeprom_update_byte(EECONFIG_AUDIO, val); }
#endif #endif

@ -9,10 +9,16 @@
#include "suspend.h" #include "suspend.h"
#include "timer.h" #include "timer.h"
#include "led.h" #include "led.h"
#ifdef PROTOCOL_LUFA #ifdef PROTOCOL_LUFA
#include "lufa.h" #include "lufa.h"
#endif #endif
#ifdef AUDIO_ENABLE
#include "audio.h"
#endif /* AUDIO_ENABLE */
#define wdt_intr_enable(value) \ #define wdt_intr_enable(value) \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
@ -72,6 +78,11 @@ static void power_down(uint8_t wdto)
// Turn off LED indicators // Turn off LED indicators
led_set(0); led_set(0);
#ifdef AUDIO_ENABLE
// This sometimes disables the start-up noise, so it's been disabled
// stop_all_notes();
#endif /* AUDIO_ENABLE */
// TODO: more power saving // TODO: more power saving
// See PicoPower application note // See PicoPower application note
// - I/O port input with pullup // - I/O port input with pullup

@ -37,7 +37,7 @@ void backlight_increase(void)
{ {
backlight_config.level++; backlight_config.level++;
backlight_config.enable = 1; backlight_config.enable = 1;
eeconfig_write_backlight(backlight_config.raw); eeconfig_update_backlight(backlight_config.raw);
} }
dprintf("backlight increase: %u\n", backlight_config.level); dprintf("backlight increase: %u\n", backlight_config.level);
backlight_set(backlight_config.level); backlight_set(backlight_config.level);
@ -49,7 +49,7 @@ void backlight_decrease(void)
{ {
backlight_config.level--; backlight_config.level--;
backlight_config.enable = !!backlight_config.level; backlight_config.enable = !!backlight_config.level;
eeconfig_write_backlight(backlight_config.raw); eeconfig_update_backlight(backlight_config.raw);
} }
dprintf("backlight decrease: %u\n", backlight_config.level); dprintf("backlight decrease: %u\n", backlight_config.level);
backlight_set(backlight_config.level); backlight_set(backlight_config.level);
@ -58,7 +58,7 @@ void backlight_decrease(void)
void backlight_toggle(void) void backlight_toggle(void)
{ {
backlight_config.enable ^= 1; backlight_config.enable ^= 1;
eeconfig_write_backlight(backlight_config.raw); eeconfig_update_backlight(backlight_config.raw);
dprintf("backlight toggle: %u\n", backlight_config.enable); dprintf("backlight toggle: %u\n", backlight_config.enable);
backlight_set(backlight_config.enable ? backlight_config.level : 0); backlight_set(backlight_config.enable ? backlight_config.level : 0);
} }
@ -71,7 +71,7 @@ void backlight_step(void)
backlight_config.level = 0; backlight_config.level = 0;
} }
backlight_config.enable = !!backlight_config.level; backlight_config.enable = !!backlight_config.level;
eeconfig_write_backlight(backlight_config.raw); eeconfig_update_backlight(backlight_config.raw);
dprintf("backlight step: %u\n", backlight_config.level); dprintf("backlight step: %u\n", backlight_config.level);
backlight_set(backlight_config.level); backlight_set(backlight_config.level);
} }
@ -80,6 +80,6 @@ void backlight_level(uint8_t level)
{ {
backlight_config.level ^= level; backlight_config.level ^= level;
backlight_config.enable = !!backlight_config.level; backlight_config.enable = !!backlight_config.level;
eeconfig_write_backlight(backlight_config.raw); eeconfig_update_backlight(backlight_config.raw);
backlight_set(backlight_config.level); backlight_set(backlight_config.level);
} }

@ -52,7 +52,7 @@ void bootmagic(void)
debug_config.enable = !debug_config.enable; debug_config.enable = !debug_config.enable;
} }
} }
eeconfig_write_debug(debug_config.raw); eeconfig_update_debug(debug_config.raw);
/* keymap config */ /* keymap config */
keymap_config.raw = eeconfig_read_keymap(); keymap_config.raw = eeconfig_read_keymap();
@ -80,7 +80,7 @@ void bootmagic(void)
if (bootmagic_scan_keycode(BOOTMAGIC_HOST_NKRO)) { if (bootmagic_scan_keycode(BOOTMAGIC_HOST_NKRO)) {
keymap_config.nkro = !keymap_config.nkro; keymap_config.nkro = !keymap_config.nkro;
} }
eeconfig_write_keymap(keymap_config.raw); eeconfig_update_keymap(keymap_config.raw);
#ifdef NKRO_ENABLE #ifdef NKRO_ENABLE
keyboard_nkro = keymap_config.nkro; keyboard_nkro = keymap_config.nkro;
@ -97,7 +97,7 @@ void bootmagic(void)
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_6)) { default_layer |= (1<<6); } if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_6)) { default_layer |= (1<<6); }
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_7)) { default_layer |= (1<<7); } if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_7)) { default_layer |= (1<<7); }
if (default_layer) { if (default_layer) {
eeconfig_write_default_layer(default_layer); eeconfig_update_default_layer(default_layer);
default_layer_set((uint32_t)default_layer); default_layer_set((uint32_t)default_layer);
} else { } else {
default_layer = eeconfig_read_default_layer(); default_layer = eeconfig_read_default_layer();

@ -49,6 +49,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "usbdrv.h" # include "usbdrv.h"
#endif #endif
#ifdef AUDIO_ENABLE
#include "audio.h"
#endif /* AUDIO_ENABLE */
static bool command_common(uint8_t code); static bool command_common(uint8_t code);
static void command_common_help(void); static void command_common_help(void);
@ -122,7 +126,7 @@ static void command_common_help(void)
STR(MAGIC_KEY_VERSION ) ": Version\n" STR(MAGIC_KEY_VERSION ) ": Version\n"
STR(MAGIC_KEY_STATUS ) ": Status\n" STR(MAGIC_KEY_STATUS ) ": Status\n"
STR(MAGIC_KEY_CONSOLE ) ": Activate Console Mode\n" STR(MAGIC_KEY_CONSOLE ) ": Activate Console Mode\n"
#if MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM #if MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
STR(MAGIC_KEY_LAYER0 ) ": Switch to Layer 0\n" STR(MAGIC_KEY_LAYER0 ) ": Switch to Layer 0\n"
STR(MAGIC_KEY_LAYER1 ) ": Switch to Layer 1\n" STR(MAGIC_KEY_LAYER1 ) ": Switch to Layer 1\n"
@ -136,11 +140,11 @@ static void command_common_help(void)
STR(MAGIC_KEY_LAYER9 ) ": Switch to Layer 9\n" STR(MAGIC_KEY_LAYER9 ) ": Switch to Layer 9\n"
#endif #endif
#if MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS #if MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
"F1-F10: Switch to Layer 0-9 (F10 = L0)\n" "F1-F10: Switch to Layer 0-9 (F10 = L0)\n"
#endif #endif
#if MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS #if MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
"0-9: Switch to Layer 0-9\n" "0-9: Switch to Layer 0-9\n"
#endif #endif
@ -251,6 +255,7 @@ static void print_status(void)
#ifdef BOOTMAGIC_ENABLE #ifdef BOOTMAGIC_ENABLE
static void print_eeconfig(void) static void print_eeconfig(void)
{ {
#ifndef NO_PRINT
print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n"); print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n");
debug_config_t dc; debug_config_t dc;
@ -279,9 +284,12 @@ static void print_eeconfig(void)
print("backlight_config.raw: "); print_hex8(bc.raw); print("\n"); print("backlight_config.raw: "); print_hex8(bc.raw); print("\n");
print(".enable: "); print_dec(bc.enable); print("\n"); print(".enable: "); print_dec(bc.enable); print("\n");
print(".level: "); print_dec(bc.level); print("\n"); print(".level: "); print_dec(bc.level); print("\n");
#endif #endif /* BACKLIGHT_ENABLE */
#endif /* !NO_PRINT */
} }
#endif #endif /* BOOTMAGIC_ENABLE */
static bool command_common(uint8_t code) static bool command_common(uint8_t code)
{ {
@ -305,7 +313,7 @@ static bool command_common(uint8_t code)
#ifdef BOOTMAGIC_ENABLE #ifdef BOOTMAGIC_ENABLE
// print stored eeprom config // print stored eeprom config
case MAGIC_KC(MAGIC_KEY_EEPROM): case MAGIC_KC(MAGIC_KEY_EEPROM):
print("eeconfig:\n"); print("eeconfig:\n");
print_eeconfig(); print_eeconfig();
break; break;
@ -348,6 +356,9 @@ static bool command_common(uint8_t code)
case MAGIC_KC(MAGIC_KEY_BOOTLOADER): case MAGIC_KC(MAGIC_KEY_BOOTLOADER):
clear_keyboard(); // clear to prevent stuck keys clear_keyboard(); // clear to prevent stuck keys
print("\n\nJumping to bootloader... "); print("\n\nJumping to bootloader... ");
#ifdef AUDIO_ENABLE
play_goodbye_tone();
#endif
_delay_ms(1000); _delay_ms(1000);
bootloader_jump(); // not return bootloader_jump(); // not return
break; break;
@ -369,7 +380,7 @@ static bool command_common(uint8_t code)
break; break;
// debug matrix toggle // debug matrix toggle
case MAGIC_KC(MAGIC_KEY_DEBUG_MATRIX): case MAGIC_KC(MAGIC_KEY_DEBUG_MATRIX):
debug_matrix = !debug_matrix; debug_matrix = !debug_matrix;
if (debug_matrix) { if (debug_matrix) {
print("\nmatrix: on\n"); print("\nmatrix: on\n");
@ -380,7 +391,7 @@ static bool command_common(uint8_t code)
break; break;
// debug keyboard toggle // debug keyboard toggle
case MAGIC_KC(MAGIC_KEY_DEBUG_KBD): case MAGIC_KC(MAGIC_KEY_DEBUG_KBD):
debug_keyboard = !debug_keyboard; debug_keyboard = !debug_keyboard;
if (debug_keyboard) { if (debug_keyboard) {
print("\nkeyboard: on\n"); print("\nkeyboard: on\n");
@ -551,6 +562,7 @@ static uint8_t mousekey_param = 0;
static void mousekey_param_print(void) static void mousekey_param_print(void)
{ {
#ifndef NO_PRINT
print("\n\t- Values -\n"); print("\n\t- Values -\n");
print("1: delay(*10ms): "); pdec(mk_delay); print("\n"); print("1: delay(*10ms): "); pdec(mk_delay); print("\n");
print("2: interval(ms): "); pdec(mk_interval); print("\n"); print("2: interval(ms): "); pdec(mk_interval); print("\n");
@ -558,6 +570,8 @@ static void mousekey_param_print(void)
print("4: time_to_max: "); pdec(mk_time_to_max); print("\n"); print("4: time_to_max: "); pdec(mk_time_to_max); print("\n");
print("5: wheel_max_speed: "); pdec(mk_wheel_max_speed); print("\n"); print("5: wheel_max_speed: "); pdec(mk_wheel_max_speed); print("\n");
print("6: wheel_time_to_max: "); pdec(mk_wheel_time_to_max); print("\n"); print("6: wheel_time_to_max: "); pdec(mk_wheel_time_to_max); print("\n");
#endif /* !NO_PRINT */
} }
//#define PRINT_SET_VAL(v) print(#v " = "); print_dec(v); print("\n"); //#define PRINT_SET_VAL(v) print(#v " = "); print_dec(v); print("\n");
@ -677,7 +691,7 @@ static void mousekey_console_help(void)
"pgdown: -10\n" "pgdown: -10\n"
"\n" "\n"
"speed = delta * max_speed * (repeat / time_to_max)\n"); "speed = delta * max_speed * (repeat / time_to_max)\n");
xprintf("where delta: cursor=%d, wheel=%d\n" xprintf("where delta: cursor=%d, wheel=%d\n"
"See http://en.wikipedia.org/wiki/Mouse_keys\n", MOUSEKEY_MOVE_DELTA, MOUSEKEY_WHEEL_DELTA); "See http://en.wikipedia.org/wiki/Mouse_keys\n", MOUSEKEY_MOVE_DELTA, MOUSEKEY_WHEEL_DELTA);
} }

@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define EECONFIG_KEYMAP (uint8_t *)4 #define EECONFIG_KEYMAP (uint8_t *)4
#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 #define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5
#define EECONFIG_BACKLIGHT (uint8_t *)6 #define EECONFIG_BACKLIGHT (uint8_t *)6
#define EECONFIG_AUDIO (uint8_t *)7
/* debug bit */ /* debug bit */
@ -59,17 +60,22 @@ void eeconfig_enable(void);
void eeconfig_disable(void); void eeconfig_disable(void);
uint8_t eeconfig_read_debug(void); uint8_t eeconfig_read_debug(void);
void eeconfig_write_debug(uint8_t val); void eeconfig_update_debug(uint8_t val);
uint8_t eeconfig_read_default_layer(void); uint8_t eeconfig_read_default_layer(void);
void eeconfig_write_default_layer(uint8_t val); void eeconfig_update_default_layer(uint8_t val);
uint8_t eeconfig_read_keymap(void); uint8_t eeconfig_read_keymap(void);
void eeconfig_write_keymap(uint8_t val); void eeconfig_update_keymap(uint8_t val);
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
uint8_t eeconfig_read_backlight(void); uint8_t eeconfig_read_backlight(void);
void eeconfig_write_backlight(uint8_t val); void eeconfig_update_backlight(uint8_t val);
#endif
#ifdef AUDIO_ENABLE
uint8_t eeconfig_read_audio(void);
void eeconfig_update_audio(uint8_t val);
#endif #endif
#endif #endif

@ -27,7 +27,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "command.h" #include "command.h"
#include "util.h" #include "util.h"
#include "sendchar.h" #include "sendchar.h"
#include "bootmagic.h" #ifdef BOOTMAGIC_ENABLE
#include "bootmagic.h"
#else
#include "magic.h"
#endif
#include "eeconfig.h" #include "eeconfig.h"
#include "backlight.h" #include "backlight.h"
#ifdef MOUSEKEY_ENABLE #ifdef MOUSEKEY_ENABLE
@ -86,6 +90,8 @@ void keyboard_init(void)
#ifdef BOOTMAGIC_ENABLE #ifdef BOOTMAGIC_ENABLE
bootmagic(); bootmagic();
#else
magic();
#endif #endif
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE

@ -22,7 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_macro.h" #include "action_macro.h"
#include "wait.h" #include "wait.h"
#include "debug.h" #include "debug.h"
#include "bootloader.h"
static action_t keycode_to_action(uint8_t keycode); static action_t keycode_to_action(uint8_t keycode);
@ -143,6 +143,7 @@ static action_t keycode_to_action(uint8_t keycode)
action.code = ACTION_TRANSPARENT; action.code = ACTION_TRANSPARENT;
break; break;
case KC_BOOTLOADER: case KC_BOOTLOADER:
action.code = ACTION_NO;
clear_keyboard(); clear_keyboard();
wait_ms(50); wait_ms(50);
bootloader_jump(); // not return bootloader_jump(); // not return

@ -22,8 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdbool.h> #include <stdbool.h>
#include "action.h" #include "action.h"
#ifdef BOOTMAGIC_ENABLE
/* NOTE: Not portable. Bit field order depends on implementation */ /* NOTE: Not portable. Bit field order depends on implementation */
typedef union { typedef union {
uint8_t raw; uint8_t raw;
@ -39,7 +37,6 @@ typedef union {
}; };
} keymap_config_t; } keymap_config_t;
keymap_config_t keymap_config; keymap_config_t keymap_config;
#endif
/* translates key to keycode */ /* translates key to keycode */

@ -0,0 +1,36 @@
#include <stdint.h>
#include <stdbool.h>
#include <util/delay.h>
#include "matrix.h"
#include "bootloader.h"
#include "debug.h"
#include "keymap.h"
#include "host.h"
#include "action_layer.h"
#include "eeconfig.h"
#include "magic.h"
keymap_config_t keymap_config;
void magic(void)
{
/* check signature */
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
/* debug enable */
debug_config.raw = eeconfig_read_debug();
/* keymap config */
keymap_config.raw = eeconfig_read_keymap();
#ifdef NKRO_ENABLE
keyboard_nkro = keymap_config.nkro;
#endif
uint8_t default_layer = 0;
default_layer = eeconfig_read_default_layer();
default_layer_set((uint32_t)default_layer);
}

@ -0,0 +1,6 @@
#ifndef MAGIC_H
#define MAGIC_H
void magic(void);
#endif

@ -2,17 +2,17 @@
/* Very basic print functions, intended to be used with usb_debug_only.c /* Very basic print functions, intended to be used with usb_debug_only.c
* http://www.pjrc.com/teensy/ * http://www.pjrc.com/teensy/
* Copyright (c) 2008 PJRC.COM, LLC * Copyright (c) 2008 PJRC.COM, LLC
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights * in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is * copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions: * furnished to do so, subject to the following conditions:
* *
* The above copyright notice and this permission notice shall be included in * The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@ -91,9 +91,9 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
#else /* NO_PRINT */ #else /* NO_PRINT */
#define xprintf #define xprintf(fmt, ...)
#define print #define print(s)
#define println #define println(s)
#define print_set_sendchar(func) #define print_set_sendchar(func)
#define print_dec(data) #define print_dec(data)
#define print_decs(data) #define print_decs(data)

@ -17,7 +17,7 @@ LUFA_SRC = $(LUFA_DIR)/lufa.c \
$(LUFA_DIR)/descriptor.c \ $(LUFA_DIR)/descriptor.c \
$(LUFA_SRC_USB) $(LUFA_SRC_USB)
ifdef MIDI_ENABLE ifeq ($(strip $(MIDI_ENABLE)), yes)
LUFA_SRC += $(LUFA_DIR)/midi/midi.c \ LUFA_SRC += $(LUFA_DIR)/midi/midi.c \
$(LUFA_DIR)/midi/midi_device.c \ $(LUFA_DIR)/midi/midi_device.c \
$(LUFA_DIR)/midi/bytequeue/bytequeue.c \ $(LUFA_DIR)/midi/bytequeue/bytequeue.c \
@ -25,7 +25,7 @@ ifdef MIDI_ENABLE
$(LUFA_SRC_USBCLASS) $(LUFA_SRC_USBCLASS)
endif endif
ifdef BLUETOOTH_ENABLE ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ LUFA_SRC += $(LUFA_DIR)/bluetooth.c \
$(TMK_DIR)/protocol/serial_uart.c $(TMK_DIR)/protocol/serial_uart.c
endif endif

@ -327,7 +327,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
else else
{ {
/* Write the next EEPROM byte from the endpoint */ /* Write the next EEPROM byte from the endpoint */
eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); eeprom_update_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte());
/* Increment the address counter after use */ /* Increment the address counter after use */
CurrAddress += 2; CurrAddress += 2;
@ -581,7 +581,7 @@ static void CDC_Task(void)
else if (Command == AVR109_COMMAND_WriteEEPROM) else if (Command == AVR109_COMMAND_WriteEEPROM)
{ {
/* Read the byte from the endpoint and write it to the EEPROM */ /* Read the byte from the endpoint and write it to the EEPROM */
eeprom_write_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); eeprom_update_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte());
/* Increment the address after use */ /* Increment the address after use */
CurrAddress += 2; CurrAddress += 2;

@ -370,7 +370,7 @@ void EVENT_USB_Device_ControlRequest(void)
} }
/* Read the byte from the USB interface and write to to the EEPROM */ /* Read the byte from the USB interface and write to to the EEPROM */
eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_8()); eeprom_update_byte((uint8_t*)StartAddr, Endpoint_Read_8());
/* Adjust counters */ /* Adjust counters */
StartAddr++; StartAddr++;

@ -1,4 +1,4 @@
/* /*
* Copyright 2012 Jun Wako <wakojun@gmail.com> * Copyright 2012 Jun Wako <wakojun@gmail.com>
* This file is based on: * This file is based on:
* LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
@ -152,10 +152,10 @@ static void Console_Task(void)
{ {
/* Create a temporary buffer to hold the read in report from the host */ /* Create a temporary buffer to hold the read in report from the host */
uint8_t ConsoleData[CONSOLE_EPSIZE]; uint8_t ConsoleData[CONSOLE_EPSIZE];
/* Read Console Report Data */ /* Read Console Report Data */
Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
/* Process Console Report Data */ /* Process Console Report Data */
//ProcessConsoleHIDReport(ConsoleData); //ProcessConsoleHIDReport(ConsoleData);
} }
@ -183,10 +183,6 @@ static void Console_Task(void)
Endpoint_SelectEndpoint(ep); Endpoint_SelectEndpoint(ep);
} }
#else
static void Console_Task(void)
{
}
#endif #endif
@ -216,7 +212,7 @@ void EVENT_USB_Device_Disconnect(void)
print("[D]"); print("[D]");
/* For battery powered device */ /* For battery powered device */
USB_IsInitialized = false; USB_IsInitialized = false;
/* TODO: This doesn't work. After several plug in/outs can not be enumerated. /* TODO: This doesn't work. After several plug in/outs can not be enumerated.
if (USB_IsInitialized) { if (USB_IsInitialized) {
USB_Disable(); // Disable all interrupts USB_Disable(); // Disable all interrupts
USB_Controller_Enable(); USB_Controller_Enable();
@ -313,7 +309,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)
#ifdef MIDI_ENABLE #ifdef MIDI_ENABLE
ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
#endif #endif
} }
@ -439,7 +435,7 @@ void EVENT_USB_Device_ControlRequest(void)
} }
/******************************************************************************* /*******************************************************************************
* Host driver * Host driver
******************************************************************************/ ******************************************************************************/
static uint8_t keyboard_leds(void) static uint8_t keyboard_leds(void)
{ {
@ -563,7 +559,7 @@ static void send_consumer(uint16_t data)
bluefruit_serial_send(0x00); bluefruit_serial_send(0x00);
bluefruit_serial_send(0x02); bluefruit_serial_send(0x02);
bluefruit_serial_send((bitmap>>8)&0xFF); bluefruit_serial_send((bitmap>>8)&0xFF);
bluefruit_serial_send(bitmap&0xFF); bluefruit_serial_send(bitmap&0xFF);
bluefruit_serial_send(0x00); bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00); bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00); bluefruit_serial_send(0x00);

Loading…
Cancel
Save