From 22b6e15a179031afb7c3534cf7b109b0668b602c Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 10 Dec 2016 10:29:51 +0900 Subject: [PATCH 01/10] Squashed 'tmk_core/' changes from 8da1898..e5f9940 e5f9940 Merge commit '1bc3dd200b023cecf063a0cb3ba347f77f6d759d' into core_update da03c50 Add note for L/R side bit being ignored e80f3c1 Add in basic documentation for Macro system 35e8a76 core: Swap position of PEQL and PENT in unimap 00751f1 Merge pull request #406 from 39aldo39/patch-1 e50d7de V-USB remote wakeup 4340997 core: Fix typo in definition AC_g 958144d core: Debug print for system and consumer keys e7e1030 core: Fix sleep_led 0866323 core: Change matrix_init and matrix_print 0dbf73d core: Add matrix_clear() and default impl. 3202ca3 core: Add suspend mode options 4cda3aa core: Fix suspend/wake for converters #386 4e15247 core: LUFA_DEBUG_SUART for serial debug b9cf8e7 core: Fix mechanical locking supoort #390 12aa0fd Merge branch 'nemith-master' fccb3fa core: Fix OPT_DEFS for mbed build 2e2d2c8 Merge branch 'master' of github.com:leizzer/tmk_keyboard f1d3634 Change .gitignore for ChibiOS 3aab802 core: Fix build config in protocol.mk 5e43da0 core: Add short names in unimap 7a56998 core: Fix dfu wait in rules.mk 6d9c500 Merge branch 'mediakey-fix' 08382ac core: Fix 'make dfu' message 78cb04e Fix OS X Recognizing keyboard as Mouse/Tablet a114714 core: 'make dfu' waits for bootloader to start d0a8f13 core: Fix unimap UNIMAP_NO case e17abef core: Change lufa NKRO report size 16 to 32 bytes 375b20f core: Fix common.mk for build options 394fdff core: Fix unimap layout comment 912326c core: Add unimap support 00f4011 core: Fix doc/keymap.md for new keymap framework ddbd7b4 core: Add default implemenation of keymap read 671cacc core: action codes are action_t struct now b4fdb27 core: Change chibios repo directory names 7daed10 core: Fix keycode.txt 90399d7 core: Fix USB remote wakeup on ATmega32U2 #361 3677e84 usb_usb: Add multiple keyboard support 54d5b26 core: Fix Logical Maximum in report descriptor bd0d372 core: Fix LUFA report descriptor 95327b5 Merge pull request #355 from papodaca/XT 62bf548 core: change API of adb.c to accept device address 3097c9e Fix function name in host.h 836e209 Merge branch 'core_split_160522' 3918ea2 Merge commit '20b787fc1284176834cbe7ca2134e4b36bec5828' 7f87b11 core: Add comment of register 3 of ADB ef6478a core: Add adb_host_talk() 5c665b4 update macro names in bluefruit 4f2c5bf Merge commit '71381457fa1311dfa0b58ba882a96db740640871' 53a9c08 Merge pull request #321 from njbair/master f08a656 core: Fix media/consumer keys d526de8 Clean up wording in keymap example 0bb3dbb Clarify layer precedence d915c75 clarify layer documentation 72070d4 ps2_usb: Fix for VUSB configuration 170e2dc Mostly working. Is unstable, will emit bad codes after a while. c8e45b5 core: Actionmap support aabaa24 Codes appear to be detected correctly, the break codes are broken. git-subtree-dir: tmk_core git-subtree-split: e5f994033cbc8700745ac0c6d12772820492eed0 --- README.md | 3 + common.mk | 36 ++- common/action.c | 7 + common/action_code.h | 10 +- common/action_layer.c | 5 +- common/actionmap.c | 44 ++++ common/actionmap.h | 455 +++++++++++++++++++++++++++++++++ common/avr/sleep_led.c | 17 +- common/avr/suart.S | 156 +++++++++++ common/avr/suart.h | 8 + common/avr/suspend.c | 51 +++- common/bootmagic.c | 66 +++-- common/bootmagic.h | 2 +- common/command.c | 12 +- common/host.c | 12 +- common/host.h | 2 +- common/keyboard.c | 1 - common/keycode.h | 10 +- common/keymap.c | 87 +++++-- common/matrix.c | 95 +++++++ common/matrix.h | 9 + common/report.h | 68 ++--- common/sleep_led.h | 14 +- common/unimap.c | 59 +++++ common/unimap.h | 272 ++++++++++++++++++++ common/util.h | 8 + doc/keycode.txt | 52 ++-- doc/keymap.md | 70 +++-- doc/unimap.txt | 51 ++++ protocol.mk | 25 +- protocol/adb.c | 132 +++++----- protocol/adb.h | 34 ++- protocol/bluefruit/bluefruit.c | 38 +-- protocol/chibios/README.md | 8 +- protocol/chibios/usb_main.c | 4 +- protocol/lufa.mk | 9 + protocol/lufa/descriptor.c | 14 +- protocol/lufa/descriptor.h | 2 +- protocol/lufa/lufa.c | 84 +++++- protocol/mbed/HIDKeyboard.cpp | 2 +- protocol/pbuff.h | 57 +++++ protocol/pjrc/usb.c | 4 +- protocol/ps2_interrupt.c | 60 +---- protocol/usb_hid/parser.cpp | 24 +- protocol/usb_hid/parser.h | 5 +- protocol/vusb/main.c | 33 ++- protocol/vusb/vusb.c | 4 +- protocol/xt.h | 75 ++++++ protocol/xt_interrupt.c | 94 +++++++ protocol/xt_io.h | 7 + protocol/xt_io_avr.c | 34 +++ rules.mk | 7 + tool/chibios/.gitignore | 4 +- tool/chibios/chibios.mk | 4 +- tool/mbed/gcc.mk | 1 + 55 files changed, 2042 insertions(+), 405 deletions(-) create mode 100644 common/actionmap.c create mode 100644 common/actionmap.h create mode 100644 common/avr/suart.S create mode 100644 common/avr/suart.h create mode 100644 common/matrix.c create mode 100644 common/unimap.c create mode 100644 common/unimap.h create mode 100644 doc/unimap.txt create mode 100644 protocol/pbuff.h create mode 100644 protocol/xt.h create mode 100644 protocol/xt_interrupt.c create mode 100644 protocol/xt_io.h create mode 100644 protocol/xt_io_avr.c diff --git a/README.md b/README.md index f460d0ed..c9c2eda4 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,9 @@ Source code is available here: Updates ------- +#### 2016/06/26 +Keymap framework was updated. `fn_actions[]` should be defined as `action_t` instead of `uint16_t`. And default code for keymap handling is now included in core you just need define `uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]` and `action_t fn_actions[]`. + #### 2016/02/10 flabbergast's Chibios protocol was merged from . See [protocol/chibios/README.md](protocol/chibios/README.md). Chibios protocol supports Cortex-M such as STM32 and Kinetis. diff --git a/common.mk b/common.mk index 6d4be85f..69be0e13 100644 --- a/common.mk +++ b/common.mk @@ -1,12 +1,12 @@ COMMON_DIR = common SRC += $(COMMON_DIR)/host.c \ $(COMMON_DIR)/keyboard.c \ + $(COMMON_DIR)/matrix.c \ $(COMMON_DIR)/action.c \ $(COMMON_DIR)/action_tapping.c \ $(COMMON_DIR)/action_macro.c \ $(COMMON_DIR)/action_layer.c \ $(COMMON_DIR)/action_util.c \ - $(COMMON_DIR)/keymap.c \ $(COMMON_DIR)/print.c \ $(COMMON_DIR)/debug.c \ $(COMMON_DIR)/util.c \ @@ -18,58 +18,70 @@ SRC += $(COMMON_DIR)/host.c \ # Option modules -ifdef BOOTMAGIC_ENABLE +ifeq (yes,$(strip $(UNIMAP_ENABLE))) + SRC += $(COMMON_DIR)/unimap.c + OPT_DEFS += -DUNIMAP_ENABLE +else + ifeq (yes,$(strip $(ACTIONMAP_ENABLE))) + SRC += $(COMMON_DIR)/actionmap.c + OPT_DEFS += -DACTIONMAP_ENABLE + else + SRC += $(COMMON_DIR)/keymap.c + endif +endif + +ifeq (yes,$(strip $(BOOTMAGIC_ENABLE))) SRC += $(COMMON_DIR)/bootmagic.c SRC += $(COMMON_DIR)/avr/eeconfig.c OPT_DEFS += -DBOOTMAGIC_ENABLE endif -ifdef MOUSEKEY_ENABLE +ifeq (yes,$(strip $(MOUSEKEY_ENABLE))) SRC += $(COMMON_DIR)/mousekey.c OPT_DEFS += -DMOUSEKEY_ENABLE OPT_DEFS += -DMOUSE_ENABLE endif -ifdef EXTRAKEY_ENABLE +ifeq (yes,$(strip $(EXTRAKEY_ENABLE))) OPT_DEFS += -DEXTRAKEY_ENABLE endif -ifdef CONSOLE_ENABLE +ifeq (yes,$(strip $(CONSOLE_ENABLE))) OPT_DEFS += -DCONSOLE_ENABLE else OPT_DEFS += -DNO_PRINT OPT_DEFS += -DNO_DEBUG endif -ifdef COMMAND_ENABLE +ifeq (yes,$(strip $(COMMAND_ENABLE))) SRC += $(COMMON_DIR)/command.c OPT_DEFS += -DCOMMAND_ENABLE endif -ifdef NKRO_ENABLE +ifeq (yes,$(strip $(NKRO_ENABLE))) OPT_DEFS += -DNKRO_ENABLE endif -ifdef USB_6KRO_ENABLE +ifeq (yes,$(strip $(USB_6KRO_ENABLE))) OPT_DEFS += -DUSB_6KRO_ENABLE endif -ifdef KEYBOARD_LOCK_ENABLE +ifeq (yes, $(strip $(KEYBOARD_LOCK_ENABLE))) OPT_DEFS += -DKEYBOARD_LOCK_ENABLE endif -ifdef SLEEP_LED_ENABLE +ifeq (yes,$(strip $(SLEEP_LED_ENABLE))) SRC += $(COMMON_DIR)/avr/sleep_led.c OPT_DEFS += -DSLEEP_LED_ENABLE OPT_DEFS += -DNO_SUSPEND_POWER_DOWN endif -ifdef BACKLIGHT_ENABLE +ifeq (yes,$(strip $(BACKLIGHT_ENABLE))) SRC += $(COMMON_DIR)/backlight.c OPT_DEFS += -DBACKLIGHT_ENABLE endif -ifdef KEYMAP_SECTION_ENABLE +ifeq (yes,$(strip $(KEYMAP_SECTION_ENABLE))) OPT_DEFS += -DKEYMAP_SECTION_ENABLE ifeq ($(strip $(MCU)),atmega32u2) diff --git a/common/action.c b/common/action.c index b9040f5b..3a3c4014 100644 --- a/common/action.c +++ b/common/action.c @@ -27,6 +27,7 @@ along with this program. If not, see . #include "action_util.h" #include "action.h" #include "hook.h" +#include "wait.h" #ifdef DEBUG_ACTION #include "debug.h" @@ -365,6 +366,7 @@ void register_code(uint8_t code) #endif add_key(KC_CAPSLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_CAPSLOCK); send_keyboard_report(); } @@ -375,6 +377,7 @@ void register_code(uint8_t code) #endif add_key(KC_NUMLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_NUMLOCK); send_keyboard_report(); } @@ -385,6 +388,7 @@ void register_code(uint8_t code) #endif add_key(KC_SCROLLLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_SCROLLLOCK); send_keyboard_report(); } @@ -440,6 +444,7 @@ void unregister_code(uint8_t code) #endif add_key(KC_CAPSLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_CAPSLOCK); send_keyboard_report(); } @@ -450,6 +455,7 @@ void unregister_code(uint8_t code) #endif add_key(KC_NUMLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_NUMLOCK); send_keyboard_report(); } @@ -460,6 +466,7 @@ void unregister_code(uint8_t code) #endif add_key(KC_SCROLLLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_SCROLLLOCK); send_keyboard_report(); } diff --git a/common/action_code.h b/common/action_code.h index da93f77b..8dad38b9 100644 --- a/common/action_code.h +++ b/common/action_code.h @@ -181,9 +181,9 @@ typedef union { /* action utility */ -#define ACTION_NO 0 -#define ACTION_TRANSPARENT 1 -#define ACTION(kind, param) ((kind)<<12 | (param)) +#define ACTION_NO { .code = 0 } +#define ACTION_TRANSPARENT { .code = 1 } +#define ACTION(kind, param) { .code = ((kind)<<12 | (param)) } /* @@ -251,8 +251,8 @@ enum layer_pram_tap_op { OP_OFF_ON, OP_SET_CLEAR, }; -#define ACTION_LAYER_BITOP(op, part, bits, on) (ACT_LAYER<<12 | (op)<<10 | (on)<<8 | (part)<<5 | ((bits)&0x1f)) -#define ACTION_LAYER_TAP(layer, key) (ACT_LAYER_TAP<<12 | (layer)<<8 | (key)) +#define ACTION_LAYER_BITOP(op, part, bits, on) ACTION(ACT_LAYER, (op)<<10 | (on)<<8 | (part)<<5 | ((bits)&0x1f)) +#define ACTION_LAYER_TAP(layer, key) ACTION(ACT_LAYER_TAP, (layer)<<8 | (key)) /* Default Layer */ #define ACTION_DEFAULT_LAYER_SET(layer) ACTION_DEFAULT_LAYER_BIT_SET((layer)/4, 1<<((layer)%4)) #define ACTION_DEFAULT_LAYER_TOGGLE(layer) ACTION_DEFAULT_LAYER_BIT_XOR((layer)/4, 1<<((layer)%4)) diff --git a/common/action_layer.c b/common/action_layer.c index 6c0be46f..6b5a7fd2 100644 --- a/common/action_layer.c +++ b/common/action_layer.c @@ -117,8 +117,7 @@ void layer_debug(void) action_t layer_switch_get_action(keypos_t key) { - action_t action; - action.code = ACTION_TRANSPARENT; + action_t action = ACTION_TRANSPARENT; #ifndef NO_ACTION_LAYER uint32_t layers = layer_state | default_layer_state; @@ -126,7 +125,7 @@ action_t layer_switch_get_action(keypos_t key) for (int8_t i = 31; i >= 0; i--) { if (layers & (1UL< + +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 . +*/ +#include +#include "action_code.h" +#include "actionmap.h" + + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][MATRIX_ROWS][MATRIX_COLS]; + + +/* Converts key to action */ +__attribute__ ((weak)) +action_t action_for_key(uint8_t layer, keypos_t key) +{ + return (action_t)pgm_read_word(&actionmaps[(layer)][(key.row)][(key.col)]); +} + +/* Macro */ +__attribute__ ((weak)) +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + return MACRO_NONE; +} + +/* Function */ +__attribute__ ((weak)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +} diff --git a/common/actionmap.h b/common/actionmap.h new file mode 100644 index 00000000..2ebfb0d0 --- /dev/null +++ b/common/actionmap.h @@ -0,0 +1,455 @@ +/* +Copyright 2015 Jun Wako + +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 . +*/ +#ifndef ACTIONMAP_H +#define ACTIONMAP_H + +#include "keyboard.h" +#include "report.h" +#include "keycode.h" +#include "action_code.h" +#include "action.h" + + +/* Modified key */ +#define AC_c(kc) ACTION_MODS_KEY(MOD_LCTL, KC_##kc) +#define AC_s(kc) ACTION_MODS_KEY(MOD_LSFT, KC_##kc) +#define AC_a(kc) ACTION_MODS_KEY(MOD_LALT, KC_##kc) +#define AC_g(kc) ACTION_MODS_KEY(MOD_LGUI, KC_##kc) + +/* Normal key */ +#define AC_NO ACTION_KEY(KC_NO) +#define AC_TRANSPARENT ACTION_KEY(KC_TRANSPARENT) +#define AC_ROLL_OVER ACTION_KEY(KC_ROLL_OVER) +#define AC_POST_FAIL ACTION_KEY(KC_POST_FAIL) +#define AC_UNDEFINED ACTION_KEY(KC_UNDEFINED) +#define AC_A ACTION_KEY(KC_A) +#define AC_B ACTION_KEY(KC_B) +#define AC_C ACTION_KEY(KC_C) +#define AC_D ACTION_KEY(KC_D) +#define AC_E ACTION_KEY(KC_E) +#define AC_F ACTION_KEY(KC_F) +#define AC_G ACTION_KEY(KC_G) +#define AC_H ACTION_KEY(KC_H) +#define AC_I ACTION_KEY(KC_I) +#define AC_J ACTION_KEY(KC_J) +#define AC_K ACTION_KEY(KC_K) +#define AC_L ACTION_KEY(KC_L) +#define AC_M ACTION_KEY(KC_M) +#define AC_N ACTION_KEY(KC_N) +#define AC_O ACTION_KEY(KC_O) +#define AC_P ACTION_KEY(KC_P) +#define AC_Q ACTION_KEY(KC_Q) +#define AC_R ACTION_KEY(KC_R) +#define AC_S ACTION_KEY(KC_S) +#define AC_T ACTION_KEY(KC_T) +#define AC_U ACTION_KEY(KC_U) +#define AC_V ACTION_KEY(KC_V) +#define AC_W ACTION_KEY(KC_W) +#define AC_X ACTION_KEY(KC_X) +#define AC_Y ACTION_KEY(KC_Y) +#define AC_Z ACTION_KEY(KC_Z) +#define AC_1 ACTION_KEY(KC_1) +#define AC_2 ACTION_KEY(KC_2) +#define AC_3 ACTION_KEY(KC_3) +#define AC_4 ACTION_KEY(KC_4) +#define AC_5 ACTION_KEY(KC_5) +#define AC_6 ACTION_KEY(KC_6) +#define AC_7 ACTION_KEY(KC_7) +#define AC_8 ACTION_KEY(KC_8) +#define AC_9 ACTION_KEY(KC_9) +#define AC_0 ACTION_KEY(KC_0) +#define AC_ENTER ACTION_KEY(KC_ENTER) +#define AC_ESCAPE ACTION_KEY(KC_ESCAPE) +#define AC_BSPACE ACTION_KEY(KC_BSPACE) +#define AC_TAB ACTION_KEY(KC_TAB) +#define AC_SPACE ACTION_KEY(KC_SPACE) +#define AC_MINUS ACTION_KEY(KC_MINUS) +#define AC_EQUAL ACTION_KEY(KC_EQUAL) +#define AC_LBRACKET ACTION_KEY(KC_LBRACKET) +#define AC_RBRACKET ACTION_KEY(KC_RBRACKET) +#define AC_BSLASH ACTION_KEY(KC_BSLASH) +#define AC_NONUS_HASH ACTION_KEY(KC_NONUS_HASH) +#define AC_SCOLON ACTION_KEY(KC_SCOLON) +#define AC_QUOTE ACTION_KEY(KC_QUOTE) +#define AC_GRAVE ACTION_KEY(KC_GRAVE) +#define AC_COMMA ACTION_KEY(KC_COMMA) +#define AC_DOT ACTION_KEY(KC_DOT) +#define AC_SLASH ACTION_KEY(KC_SLASH) +#define AC_CAPSLOCK ACTION_KEY(KC_CAPSLOCK) +#define AC_F1 ACTION_KEY(KC_F1) +#define AC_F2 ACTION_KEY(KC_F2) +#define AC_F3 ACTION_KEY(KC_F3) +#define AC_F4 ACTION_KEY(KC_F4) +#define AC_F5 ACTION_KEY(KC_F5) +#define AC_F6 ACTION_KEY(KC_F6) +#define AC_F7 ACTION_KEY(KC_F7) +#define AC_F8 ACTION_KEY(KC_F8) +#define AC_F9 ACTION_KEY(KC_F9) +#define AC_F10 ACTION_KEY(KC_F10) +#define AC_F11 ACTION_KEY(KC_F11) +#define AC_F12 ACTION_KEY(KC_F12) +#define AC_PSCREEN ACTION_KEY(KC_PSCREEN) +#define AC_SCROLLLOCK ACTION_KEY(KC_SCROLLLOCK) +#define AC_PAUSE ACTION_KEY(KC_PAUSE) +#define AC_INSERT ACTION_KEY(KC_INSERT) +#define AC_HOME ACTION_KEY(KC_HOME) +#define AC_PGUP ACTION_KEY(KC_PGUP) +#define AC_DELETE ACTION_KEY(KC_DELETE) +#define AC_END ACTION_KEY(KC_END) +#define AC_PGDOWN ACTION_KEY(KC_PGDOWN) +#define AC_RIGHT ACTION_KEY(KC_RIGHT) +#define AC_LEFT ACTION_KEY(KC_LEFT) +#define AC_DOWN ACTION_KEY(KC_DOWN) +#define AC_UP ACTION_KEY(KC_UP) +#define AC_NUMLOCK ACTION_KEY(KC_NUMLOCK) +#define AC_KP_SLASH ACTION_KEY(KC_KP_SLASH) +#define AC_KP_ASTERISK ACTION_KEY(KC_KP_ASTERISK) +#define AC_KP_MINUS ACTION_KEY(KC_KP_MINUS) +#define AC_KP_PLUS ACTION_KEY(KC_KP_PLUS) +#define AC_KP_ENTER ACTION_KEY(KC_KP_ENTER) +#define AC_KP_1 ACTION_KEY(KC_KP_1) +#define AC_KP_2 ACTION_KEY(KC_KP_2) +#define AC_KP_3 ACTION_KEY(KC_KP_3) +#define AC_KP_4 ACTION_KEY(KC_KP_4) +#define AC_KP_5 ACTION_KEY(KC_KP_5) +#define AC_KP_6 ACTION_KEY(KC_KP_6) +#define AC_KP_7 ACTION_KEY(KC_KP_7) +#define AC_KP_8 ACTION_KEY(KC_KP_8) +#define AC_KP_9 ACTION_KEY(KC_KP_9) +#define AC_KP_0 ACTION_KEY(KC_KP_0) +#define AC_KP_DOT ACTION_KEY(KC_KP_DOT) +#define AC_NONUS_BSLASH ACTION_KEY(KC_NONUS_BSLASH) +#define AC_APPLICATION ACTION_KEY(KC_APPLICATION) +#define AC_POWER ACTION_KEY(KC_POWER) +#define AC_KP_EQUAL ACTION_KEY(KC_KP_EQUAL) +#define AC_F13 ACTION_KEY(KC_F13) +#define AC_F14 ACTION_KEY(KC_F14) +#define AC_F15 ACTION_KEY(KC_F15) +#define AC_F16 ACTION_KEY(KC_F16) +#define AC_F17 ACTION_KEY(KC_F17) +#define AC_F18 ACTION_KEY(KC_F18) +#define AC_F19 ACTION_KEY(KC_F19) +#define AC_F20 ACTION_KEY(KC_F20) +#define AC_F21 ACTION_KEY(KC_F21) +#define AC_F22 ACTION_KEY(KC_F22) +#define AC_F23 ACTION_KEY(KC_F23) +#define AC_F24 ACTION_KEY(KC_F24) +#define AC_EXECUTE ACTION_KEY(KC_EXECUTE) +#define AC_HELP ACTION_KEY(KC_HELP) +#define AC_MENU ACTION_KEY(KC_MENU) +#define AC_SELECT ACTION_KEY(KC_SELECT) +#define AC_STOP ACTION_KEY(KC_STOP) +#define AC_AGAIN ACTION_KEY(KC_AGAIN) +#define AC_UNDO ACTION_KEY(KC_UNDO) +#define AC_CUT ACTION_KEY(KC_CUT) +#define AC_COPY ACTION_KEY(KC_COPY) +#define AC_PASTE ACTION_KEY(KC_PASTE) +#define AC_FIND ACTION_KEY(KC_FIND) +#define AC__MUTE ACTION_KEY(KC__MUTE) +#define AC__VOLUP ACTION_KEY(KC__VOLUP) +#define AC__VOLDOWN ACTION_KEY(KC__VOLDOWN) +#define AC_LOCKING_CAPS ACTION_KEY(KC_LOCKING_CAPS) +#define AC_LOCKING_NUM ACTION_KEY(KC_LOCKING_NUM) +#define AC_LOCKING_SCROLL ACTION_KEY(KC_LOCKING_SCROLL) +#define AC_KP_COMMA ACTION_KEY(KC_KP_COMMA) +#define AC_KP_EQUAL_AS400 ACTION_KEY(KC_KP_EQUAL_AS400) +#define AC_INT1 ACTION_KEY(KC_INT1) +#define AC_INT2 ACTION_KEY(KC_INT2) +#define AC_INT3 ACTION_KEY(KC_INT3) +#define AC_INT4 ACTION_KEY(KC_INT4) +#define AC_INT5 ACTION_KEY(KC_INT5) +#define AC_INT6 ACTION_KEY(KC_INT6) +#define AC_INT7 ACTION_KEY(KC_INT7) +#define AC_INT8 ACTION_KEY(KC_INT8) +#define AC_INT9 ACTION_KEY(KC_INT9) +#define AC_LANG1 ACTION_KEY(KC_LANG1) +#define AC_LANG2 ACTION_KEY(KC_LANG2) +#define AC_LANG3 ACTION_KEY(KC_LANG3) +#define AC_LANG4 ACTION_KEY(KC_LANG4) +#define AC_LANG5 ACTION_KEY(KC_LANG5) +#define AC_LANG6 ACTION_KEY(KC_LANG6) +#define AC_LANG7 ACTION_KEY(KC_LANG7) +#define AC_LANG8 ACTION_KEY(KC_LANG8) +#define AC_LANG9 ACTION_KEY(KC_LANG9) +#define AC_ALT_ERASE ACTION_KEY(KC_ALT_ERASE) +#define AC_SYSREQ ACTION_KEY(KC_SYSREQ) +#define AC_CANCEL ACTION_KEY(KC_CANCEL) +#define AC_CLEAR ACTION_KEY(KC_CLEAR) +#define AC_PRIOR ACTION_KEY(KC_PRIOR) +#define AC_RETURN ACTION_KEY(KC_RETURN) +#define AC_SEPARATOR ACTION_KEY(KC_SEPARATOR) +#define AC_OUT ACTION_KEY(KC_OUT) +#define AC_OPER ACTION_KEY(KC_OPER) +#define AC_CLEAR_AGAIN ACTION_KEY(KC_CLEAR_AGAIN) +#define AC_CRSEL ACTION_KEY(KC_CRSEL) +#define AC_EXSEL ACTION_KEY(KC_EXSEL) +#define AC_KP_00 ACTION_KEY(KC_KP_00) +#define AC_KP_000 ACTION_KEY(KC_KP_000) +#define AC_THOUSANDS_SEPARATOR ACTION_KEY(KC_THOUSANDS_SEPARATOR) +#define AC_DECIMAL_SEPARATOR ACTION_KEY(KC_DECIMAL_SEPARATOR) +#define AC_CURRENCY_UNIT ACTION_KEY(KC_CURRENCY_UNIT) +#define AC_CURRENCY_SUB_UNIT ACTION_KEY(KC_CURRENCY_SUB_UNIT) +#define AC_KP_LPAREN ACTION_KEY(KC_KP_LPAREN) +#define AC_KP_RPAREN ACTION_KEY(KC_KP_RPAREN) +#define AC_KP_LCBRACKET ACTION_KEY(KC_KP_LCBRACKET) +#define AC_KP_RCBRACKET ACTION_KEY(KC_KP_RCBRACKET) +#define AC_KP_TAB ACTION_KEY(KC_KP_TAB) +#define AC_KP_BSPACE ACTION_KEY(KC_KP_BSPACE) +#define AC_KP_A ACTION_KEY(KC_KP_A) +#define AC_KP_B ACTION_KEY(KC_KP_B) +#define AC_KP_C ACTION_KEY(KC_KP_C) +#define AC_KP_D ACTION_KEY(KC_KP_D) +#define AC_KP_E ACTION_KEY(KC_KP_E) +#define AC_KP_F ACTION_KEY(KC_KP_F) +#define AC_KP_XOR ACTION_KEY(KC_KP_XOR) +#define AC_KP_HAT ACTION_KEY(KC_KP_HAT) +#define AC_KP_PERC ACTION_KEY(KC_KP_PERC) +#define AC_KP_LT ACTION_KEY(KC_KP_LT) +#define AC_KP_GT ACTION_KEY(KC_KP_GT) +#define AC_KP_AND ACTION_KEY(KC_KP_AND) +#define AC_KP_LAZYAND ACTION_KEY(KC_KP_LAZYAND) +#define AC_KP_OR ACTION_KEY(KC_KP_OR) +#define AC_KP_LAZYOR ACTION_KEY(KC_KP_LAZYOR) +#define AC_KP_COLON ACTION_KEY(KC_KP_COLON) +#define AC_KP_HASH ACTION_KEY(KC_KP_HASH) +#define AC_KP_SPACE ACTION_KEY(KC_KP_SPACE) +#define AC_KP_ATMARK ACTION_KEY(KC_KP_ATMARK) +#define AC_KP_EXCLAMATION ACTION_KEY(KC_KP_EXCLAMATION) +#define AC_KP_MEM_STORE ACTION_KEY(KC_KP_MEM_STORE) +#define AC_KP_MEM_RECALL ACTION_KEY(KC_KP_MEM_RECALL) +#define AC_KP_MEM_CLEAR ACTION_KEY(KC_KP_MEM_CLEAR) +#define AC_KP_MEM_ADD ACTION_KEY(KC_KP_MEM_ADD) +#define AC_KP_MEM_SUB ACTION_KEY(KC_KP_MEM_SUB) +#define AC_KP_MEM_MUL ACTION_KEY(KC_KP_MEM_MUL) +#define AC_KP_MEM_DIV ACTION_KEY(KC_KP_MEM_DIV) +#define AC_KP_PLUS_MINUS ACTION_KEY(KC_KP_PLUS_MINUS) +#define AC_KP_CLEAR ACTION_KEY(KC_KP_CLEAR) +#define AC_KP_CLEAR_ENTRY ACTION_KEY(KC_KP_CLEAR_ENTRY) +#define AC_KP_BINARY ACTION_KEY(KC_KP_BINARY) +#define AC_KP_OCTAL ACTION_KEY(KC_KP_OCTAL) +#define AC_KP_DECIMAL ACTION_KEY(KC_KP_DECIMAL) +#define AC_KP_HEXADECIMAL ACTION_KEY(KC_KP_HEXADECIMAL) + +/* Modifiers */ +#define AC_LCTRL ACTION_KEY(KC_LCTRL) +#define AC_LSHIFT ACTION_KEY(KC_LSHIFT) +#define AC_LALT ACTION_KEY(KC_LALT) +#define AC_LGUI ACTION_KEY(KC_LGUI) +#define AC_RCTRL ACTION_KEY(KC_RCTRL) +#define AC_RSHIFT ACTION_KEY(KC_RSHIFT) +#define AC_RALT ACTION_KEY(KC_RALT) +#define AC_RGUI ACTION_KEY(KC_RGUI) + +/* + * TMK extensions + */ +/* Sytem Control */ +#define AC_SYSTEM_POWER ACTION_USAGE_SYSTEM(SYSTEM_POWER_DOWN) +#define AC_SYSTEM_SLEEP ACTION_USAGE_SYSTEM(SYSTEM_SLEEP) +#define AC_SYSTEM_WAKE ACTION_USAGE_SYSTEM(SYSTEM_WAKE_UP) +/* Consumer Page */ +#define AC_AUDIO_MUTE ACTION_USAGE_CONSUMER(AUDIO_MUTE) +#define AC_AUDIO_VOL_UP ACTION_USAGE_CONSUMER(AUDIO_VOL_UP) +#define AC_AUDIO_VOL_DOWN ACTION_USAGE_CONSUMER(AUDIO_VOL_DOWN) +#define AC_MEDIA_NEXT_TRACK ACTION_USAGE_CONSUMER(TRANSPORT_NEXT_TRACK) +#define AC_MEDIA_PREV_TRACK ACTION_USAGE_CONSUMER(TRANSPORT_PREV_TRACK) +#define AC_MEDIA_FAST_FORWARD ACTION_USAGE_CONSUMER(TRANSPORT_FAST_FORWARD) +#define AC_MEDIA_REWIND ACTION_USAGE_CONSUMER(TRANSPORT_REWIND) +#define AC_MEDIA_STOP ACTION_USAGE_CONSUMER(TRANSPORT_STOP) +#define AC_MEDIA_PLAY_PAUSE ACTION_USAGE_CONSUMER(TRANSPORT_PLAY_PAUSE) +#define AC_MEDIA_EJECT ACTION_USAGE_CONSUMER(TRANSPORT_STOP_EJECT) +#define AC_MEDIA_SELECT ACTION_USAGE_CONSUMER(APPLAUNCH_CC_CONFIG) +#define AC_MAIL ACTION_USAGE_CONSUMER(APPLAUNCH_EMAIL) +#define AC_CALCULATOR ACTION_USAGE_CONSUMER(APPLAUNCH_CALCULATOR) +#define AC_MY_COMPUTER ACTION_USAGE_CONSUMER(APPLAUNCH_LOCAL_BROWSER) +#define AC_WWW_SEARCH ACTION_USAGE_CONSUMER(APPCONTROL_SEARCH) +#define AC_WWW_HOME ACTION_USAGE_CONSUMER(APPCONTROL_HOME) +#define AC_WWW_BACK ACTION_USAGE_CONSUMER(APPCONTROL_BACK) +#define AC_WWW_FORWARD ACTION_USAGE_CONSUMER(APPCONTROL_FORWARD) +#define AC_WWW_STOP ACTION_USAGE_CONSUMER(APPCONTROL_STOP) +#define AC_WWW_REFRESH ACTION_USAGE_CONSUMER(APPCONTROL_REFRESH) +#define AC_WWW_FAVORITES ACTION_USAGE_CONSUMER(APPCONTROL_BOOKMARKS) +/* Jump to bootloader */ +#define AC_BOOTLOADER ACTION_KEY(KC_BOOTLOADER) +/* Fn key */ +/* +#define AC_FN0 ACTION_KEY(KC_FN0) +#define AC_FN1 ACTION_KEY(KC_FN1) +#define AC_FN2 ACTION_KEY(KC_FN2) +#define AC_FN3 ACTION_KEY(KC_FN3) +#define AC_FN4 ACTION_KEY(KC_FN4) +#define AC_FN5 ACTION_KEY(KC_FN5) +#define AC_FN6 ACTION_KEY(KC_FN6) +#define AC_FN7 ACTION_KEY(KC_FN7) +#define AC_FN8 ACTION_KEY(KC_FN8) +#define AC_FN9 ACTION_KEY(KC_FN9) +#define AC_FN10 ACTION_KEY(KC_FN10) +#define AC_FN11 ACTION_KEY(KC_FN11) +#define AC_FN12 ACTION_KEY(KC_FN12) +#define AC_FN13 ACTION_KEY(KC_FN13) +#define AC_FN14 ACTION_KEY(KC_FN14) +#define AC_FN15 ACTION_KEY(KC_FN15) +#define AC_FN16 ACTION_KEY(KC_FN16) +#define AC_FN17 ACTION_KEY(KC_FN17) +#define AC_FN18 ACTION_KEY(KC_FN18) +#define AC_FN19 ACTION_KEY(KC_FN19) +#define AC_FN20 ACTION_KEY(KC_FN20) +#define AC_FN21 ACTION_KEY(KC_FN21) +#define AC_FN22 ACTION_KEY(KC_FN22) +#define AC_FN23 ACTION_KEY(KC_FN23) +#define AC_FN24 ACTION_KEY(KC_FN24) +#define AC_FN25 ACTION_KEY(KC_FN25) +#define AC_FN26 ACTION_KEY(KC_FN26) +#define AC_FN27 ACTION_KEY(KC_FN27) +#define AC_FN28 ACTION_KEY(KC_FN28) +#define AC_FN29 ACTION_KEY(KC_FN29) +#define AC_FN30 ACTION_KEY(KC_FN30) +#define AC_FN31 ACTION_KEY(KC_FN31) +*/ +/* Mousekey */ +#define AC_MS_UP ACTION_MOUSEKEY(KC_MS_UP) +#define AC_MS_DOWN ACTION_MOUSEKEY(KC_MS_DOWN) +#define AC_MS_LEFT ACTION_MOUSEKEY(KC_MS_LEFT) +#define AC_MS_RIGHT ACTION_MOUSEKEY(KC_MS_RIGHT) +#define AC_MS_BTN1 ACTION_MOUSEKEY(KC_MS_BTN1) +#define AC_MS_BTN2 ACTION_MOUSEKEY(KC_MS_BTN2) +#define AC_MS_BTN3 ACTION_MOUSEKEY(KC_MS_BTN3) +#define AC_MS_BTN4 ACTION_MOUSEKEY(KC_MS_BTN4) +#define AC_MS_BTN5 ACTION_MOUSEKEY(KC_MS_BTN5) +#define AC_MS_WH_UP ACTION_MOUSEKEY(KC_MS_WH_UP) +#define AC_MS_WH_DOWN ACTION_MOUSEKEY(KC_MS_WH_DOWN) +#define AC_MS_WH_LEFT ACTION_MOUSEKEY(KC_MS_WH_LEFT) +#define AC_MS_WH_RIGHT ACTION_MOUSEKEY(KC_MS_WH_RIGHT) +#define AC_MS_ACCEL0 ACTION_MOUSEKEY(KC_MS_ACCEL0) +#define AC_MS_ACCEL1 ACTION_MOUSEKEY(KC_MS_ACCEL1) +#define AC_MS_ACCEL2 ACTION_MOUSEKEY(KC_MS_ACCEL2) + +/* + * Short names + */ +#define AC_LCTL ACTION_KEY(KC_LCTRL) +#define AC_RCTL ACTION_KEY(KC_RCTRL) +#define AC_LSFT ACTION_KEY(KC_LSHIFT) +#define AC_RSFT ACTION_KEY(KC_RSHIFT) +#define AC_ESC ACTION_KEY(KC_ESCAPE) +#define AC_BSPC ACTION_KEY(KC_BSPACE) +#define AC_ENT ACTION_KEY(KC_ENTER) +#define AC_DEL ACTION_KEY(KC_DELETE) +#define AC_INS ACTION_KEY(KC_INSERT) +#define AC_CAPS ACTION_KEY(KC_CAPSLOCK) +#define AC_CLCK ACTION_KEY(KC_CAPSLOCK) +#define AC_RGHT ACTION_KEY(KC_RIGHT) +#define AC_PGDN ACTION_KEY(KC_PGDOWN) +#define AC_PSCR ACTION_KEY(KC_PSCREEN) +#define AC_SLCK ACTION_KEY(KC_SCROLLLOCK) +#define AC_PAUS ACTION_KEY(KC_PAUSE) +#define AC_BRK ACTION_KEY(KC_PAUSE) +#define AC_NLCK ACTION_KEY(KC_NUMLOCK) +#define AC_SPC ACTION_KEY(KC_SPACE) +#define AC_MINS ACTION_KEY(KC_MINUS) +#define AC_EQL ACTION_KEY(KC_EQUAL) +#define AC_GRV ACTION_KEY(KC_GRAVE) +#define AC_RBRC ACTION_KEY(KC_RBRACKET) +#define AC_LBRC ACTION_KEY(KC_LBRACKET) +#define AC_COMM ACTION_KEY(KC_COMMA) +#define AC_BSLS ACTION_KEY(KC_BSLASH) +#define AC_SLSH ACTION_KEY(KC_SLASH) +#define AC_SCLN ACTION_KEY(KC_SCOLON) +#define AC_QUOT ACTION_KEY(KC_QUOTE) +#define AC_APP ACTION_KEY(KC_APPLICATION) +#define AC_NUHS ACTION_KEY(KC_NONUS_HASH) +#define AC_NUBS ACTION_KEY(KC_NONUS_BSLASH) +#define AC_LCAP ACTION_KEY(KC_LOCKING_CAPS) +#define AC_LNUM ACTION_KEY(KC_LOCKING_NUM) +#define AC_LSCR ACTION_KEY(KC_LOCKING_SCROLL) +#define AC_ERAS ACTION_KEY(KC_ALT_ERASE,) +#define AC_CLR ACTION_KEY(KC_CLEAR) +/* Japanese specific */ +#define AC_ZKHK ACTION_KEY(KC_GRAVE) +#define AC_RO ACTION_KEY(KC_INT1) +#define AC_KANA ACTION_KEY(KC_INT2) +#define AC_JYEN ACTION_KEY(KC_INT3) +#define AC_HENK ACTION_KEY(KC_INT4) +#define AC_MHEN ACTION_KEY(KC_INT5) +/* Keypad */ +#define AC_P1 ACTION_KEY(KC_KP_1) +#define AC_P2 ACTION_KEY(KC_KP_2) +#define AC_P3 ACTION_KEY(KC_KP_3) +#define AC_P4 ACTION_KEY(KC_KP_4) +#define AC_P5 ACTION_KEY(KC_KP_5) +#define AC_P6 ACTION_KEY(KC_KP_6) +#define AC_P7 ACTION_KEY(KC_KP_7) +#define AC_P8 ACTION_KEY(KC_KP_8) +#define AC_P9 ACTION_KEY(KC_KP_9) +#define AC_P0 ACTION_KEY(KC_KP_0) +#define AC_PDOT ACTION_KEY(KC_KP_DOT) +#define AC_PCMM ACTION_KEY(KC_KP_COMMA) +#define AC_PSLS ACTION_KEY(KC_KP_SLASH) +#define AC_PAST ACTION_KEY(KC_KP_ASTERISK) +#define AC_PMNS ACTION_KEY(KC_KP_MINUS) +#define AC_PPLS ACTION_KEY(KC_KP_PLUS) +#define AC_PEQL ACTION_KEY(KC_KP_EQUAL) +#define AC_PENT ACTION_KEY(KC_KP_ENTER) +/* Mousekey */ +#define AC_MS_U ACTION_MOUSEKEY(KC_MS_UP) +#define AC_MS_D ACTION_MOUSEKEY(KC_MS_DOWN) +#define AC_MS_L ACTION_MOUSEKEY(KC_MS_LEFT) +#define AC_MS_R ACTION_MOUSEKEY(KC_MS_RIGHT) +#define AC_BTN1 ACTION_MOUSEKEY(KC_MS_BTN1) +#define AC_BTN2 ACTION_MOUSEKEY(KC_MS_BTN2) +#define AC_BTN3 ACTION_MOUSEKEY(KC_MS_BTN3) +#define AC_BTN4 ACTION_MOUSEKEY(KC_MS_BTN4) +#define AC_BTN5 ACTION_MOUSEKEY(KC_MS_BTN5) +#define AC_WH_U ACTION_MOUSEKEY(KC_MS_WH_UP) +#define AC_WH_D ACTION_MOUSEKEY(KC_MS_WH_DOWN) +#define AC_WH_L ACTION_MOUSEKEY(KC_MS_WH_LEFT) +#define AC_WH_R ACTION_MOUSEKEY(KC_MS_WH_RIGHT) +#define AC_ACL0 ACTION_MOUSEKEY(KC_MS_ACCEL0) +#define AC_ACL1 ACTION_MOUSEKEY(KC_MS_ACCEL1) +#define AC_ACL2 ACTION_MOUSEKEY(KC_MS_ACCEL2) +/* Sytem Control */ +#define AC_PWR ACTION_USAGE_SYSTEM(SYSTEM_POWER_DOWN) +#define AC_SLEP ACTION_USAGE_SYSTEM(SYSTEM_SLEEP) +#define AC_WAKE ACTION_USAGE_SYSTEM(SYSTEM_WAKE_UP) +/* Consumer Page */ +#define AC_MUTE ACTION_USAGE_CONSUMER(AUDIO_MUTE) +#define AC_VOLU ACTION_USAGE_CONSUMER(AUDIO_VOL_UP) +#define AC_VOLD ACTION_USAGE_CONSUMER(AUDIO_VOL_DOWN) +#define AC_MNXT ACTION_USAGE_CONSUMER(TRANSPORT_NEXT_TRACK) +#define AC_MPRV ACTION_USAGE_CONSUMER(TRANSPORT_PREV_TRACK) +#define AC_MFFD ACTION_USAGE_CONSUMER(TRANSPORT_FAST_FORWARD) +#define AC_MRWD ACTION_USAGE_CONSUMER(TRANSPORT_REWIND) +#define AC_MSTP ACTION_USAGE_CONSUMER(TRANSPORT_STOP) +#define AC_MPLY ACTION_USAGE_CONSUMER(TRANSPORT_PLAY_PAUSE) +#define AC_EJCT ACTION_USAGE_CONSUMER(TRANSPORT_STOP_EJECT) +#define AC_MSEL ACTION_USAGE_CONSUMER(APPLAUNCH_CC_CONFIG) +#define AC_MAIL ACTION_USAGE_CONSUMER(APPLAUNCH_EMAIL) +#define AC_CALC ACTION_USAGE_CONSUMER(APPLAUNCH_CALCULATOR) +#define AC_MYCM ACTION_USAGE_CONSUMER(APPLAUNCH_LOCAL_BROWSER) +#define AC_WSCH ACTION_USAGE_CONSUMER(APPCONTROL_SEARCH) +#define AC_WHOM ACTION_USAGE_CONSUMER(APPCONTROL_HOME) +#define AC_WBAK ACTION_USAGE_CONSUMER(APPCONTROL_BACK) +#define AC_WFWD ACTION_USAGE_CONSUMER(APPCONTROL_FORWARD) +#define AC_WSTP ACTION_USAGE_CONSUMER(APPCONTROL_STOP) +#define AC_WREF ACTION_USAGE_CONSUMER(APPCONTROL_REFRESH) +#define AC_WFAV ACTION_USAGE_CONSUMER(APPCONTROL_BOOKMARKS) +/* Jump to bootloader */ +#define AC_BTLD ACTION_KEY(KC_BOOTLOADER) +/* Transparent */ +#define AC_TRNS ACTION_KEY(KC_TRANSPARENT) + +#endif diff --git a/common/avr/sleep_led.c b/common/avr/sleep_led.c index dab3eb0f..37c2cf1b 100644 --- a/common/avr/sleep_led.c +++ b/common/avr/sleep_led.c @@ -45,10 +45,17 @@ void sleep_led_disable(void) TIMSK1 &= ~_BV(OCIE1A); } -void sleep_led_toggle(void) + +__attribute__ ((weak)) +void sleep_led_on(void) { - /* Disable Compare Match Interrupt */ - TIMSK1 ^= _BV(OCIE1A); + led_set(1< +.list + +#define BPS 44 /* Bit delay. (see above table) */ +#define BIDIR 0 /* 0:Separated Tx/Rx, 1:Shared Tx/Rx */ + +#define OUT_1 sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 1 */ +#define OUT_0 cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 0 */ +#define SKIP_IN_1 sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT /* Skip if 1 */ +#define SKIP_IN_0 sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT /* Skip if 0 */ + + + +#ifdef SPM_PAGESIZE +.macro _LPMI reg + lpm \reg, Z+ +.endm +.macro _MOVW dh,dl, sh,sl + movw \dl, \sl +.endm +#else +.macro _LPMI reg + lpm + mov \reg, r0 + adiw ZL, 1 +.endm +.macro _MOVW dh,dl, sh,sl + mov \dl, \sl + mov \dh, \sh +.endm +#endif + + + +;---------------------------------------------------------------------------; +; Transmit a byte in serial format of N81 +; +;Prototype: void xmit (uint8_t data); +;Size: 16 words + +.global xmit +.func xmit +xmit: +#if BIDIR + ldi r23, BPS-1 ;Pre-idle time for bidirectional data line +5: dec r23 ; + brne 5b ;/ +#endif + in r0, _SFR_IO_ADDR(SREG) ;Save flags + + com r24 ;C = start bit + ldi r25, 10 ;Bit counter + cli ;Start critical section + +1: ldi r23, BPS-1 ;----- Bit transferring loop +2: dec r23 ;Wait for a bit time + brne 2b ;/ + brcs 3f ;MISO = bit to be sent + OUT_1 ; +3: brcc 4f ; + OUT_0 ;/ +4: lsr r24 ;Get next bit into C + dec r25 ;All bits sent? + brne 1b ; no, coutinue + + out _SFR_IO_ADDR(SREG), r0 ;End of critical section + ret +.endfunc + + + +;---------------------------------------------------------------------------; +; Receive a byte +; +;Prototype: uint8_t rcvr (void); +;Size: 19 words + +.global rcvr +.func rcvr +rcvr: + in r0, _SFR_IO_ADDR(SREG) ;Save flags + + ldi r24, 0x80 ;Receiving shift reg + cli ;Start critical section + +1: SKIP_IN_1 ;Wait for idle + rjmp 1b +2: SKIP_IN_0 ;Wait for start bit + rjmp 2b + ldi r25, BPS/2 ;Wait for half bit time +3: dec r25 + brne 3b + +4: ldi r25, BPS ;----- Bit receiving loop +5: dec r25 ;Wait for a bit time + brne 5b ;/ + lsr r24 ;Next bit + SKIP_IN_0 ;Get a data bit into r24.7 + ori r24, 0x80 + brcc 4b ;All bits received? no, continue + + out _SFR_IO_ADDR(SREG), r0 ;End of critical section + ret +.endfunc + + +; Not wait for start bit. This should be called after detecting start bit. +.global recv +.func recv +recv: + in r0, _SFR_IO_ADDR(SREG) ;Save flags + + ldi r24, 0x80 ;Receiving shift reg + cli ;Start critical section + +;1: SKIP_IN_1 ;Wait for idle +; rjmp 1b +;2: SKIP_IN_0 ;Wait for start bit +; rjmp 2b + ldi r25, BPS/2 ;Wait for half bit time +3: dec r25 + brne 3b + +4: ldi r25, BPS ;----- Bit receiving loop +5: dec r25 ;Wait for a bit time + brne 5b ;/ + lsr r24 ;Next bit + SKIP_IN_0 ;Get a data bit into r24.7 + ori r24, 0x80 + brcc 4b ;All bits received? no, continue + + ldi r25, BPS/2 ;Wait for half bit time +6: dec r25 + brne 6b +7: SKIP_IN_1 ;Wait for stop bit + rjmp 7b + + out _SFR_IO_ADDR(SREG), r0 ;End of critical section + ret +.endfunc diff --git a/common/avr/suart.h b/common/avr/suart.h new file mode 100644 index 00000000..72725b99 --- /dev/null +++ b/common/avr/suart.h @@ -0,0 +1,8 @@ +#ifndef SUART +#define SUART + +void xmit(uint8_t); +uint8_t rcvr(void); +uint8_t recv(void); + +#endif /* SUART */ diff --git a/common/avr/suspend.c b/common/avr/suspend.c index af99f52b..02d7e4c9 100644 --- a/common/avr/suspend.c +++ b/common/avr/suspend.c @@ -30,16 +30,6 @@ __asm__ __volatile__ ( \ ) -void suspend_idle(uint8_t time) -{ - cli(); - set_sleep_mode(SLEEP_MODE_IDLE); - sleep_enable(); - sei(); - sleep_cpu(); - sleep_disable(); -} - /* Power down MCU with watchdog timer * wdto: watchdog timer timeout defined in * WDTO_15MS @@ -80,13 +70,45 @@ static void power_down(uint8_t wdto) wdt_disable(); } -void suspend_power_down(void) +static void standby(void) { - power_down(WDTO_15MS); + set_sleep_mode(SLEEP_MODE_STANDBY); + sleep_enable(); + sei(); + sleep_cpu(); + sleep_disable(); +} + +static void idle(void) +{ + set_sleep_mode(SLEEP_MODE_IDLE); + sleep_enable(); + sei(); + sleep_cpu(); + sleep_disable(); +} + + +void suspend_idle(uint8_t time) +{ + idle(); +} + +void suspend_power_down(void) +{ +#ifdef NO_SUSPEND_POWER_DOWN + ; +#elif defined(SUSPEND_MODE_NOPOWERSAVE) + ; +#elif defined(SUSPEND_MODE_STANDBY) + standby(); +#elif defined(SUSPEND_MODE_IDLE) + idle(); +#else + power_down(WDTO_15MS); +#endif } -__attribute__ ((weak)) void matrix_power_up(void) {} -__attribute__ ((weak)) void matrix_power_down(void) {} bool suspend_wakeup_condition(void) { matrix_power_up(); @@ -102,6 +124,7 @@ bool suspend_wakeup_condition(void) void suspend_wakeup_init(void) { // clear keyboard state + matrix_clear(); clear_keyboard(); #ifdef BACKLIGHT_ENABLE backlight_init(); diff --git a/common/bootmagic.c b/common/bootmagic.c index 056806f2..eb06d787 100644 --- a/common/bootmagic.c +++ b/common/bootmagic.c @@ -5,6 +5,7 @@ #include "bootloader.h" #include "debug.h" #include "keymap.h" +#include "actionmap.h" #include "host.h" #include "action_layer.h" #include "eeconfig.h" @@ -27,17 +28,17 @@ void bootmagic(void) print("done.\n"); /* bootmagic skip */ - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SKIP)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_SKIP)) { return; } /* eeconfig clear */ - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_EEPROM_CLEAR)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_EEPROM_CLEAR)) { eeconfig_init(); } /* bootloader */ - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_BOOTLOADER)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_BOOTLOADER)) { bootloader_jump(); } @@ -46,12 +47,12 @@ void bootmagic(void) /* debug enable */ debug_config.raw = eeconfig_read_debug(); - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_ENABLE)) { - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_MATRIX)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_ENABLE)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_MATRIX)) { debug_config.matrix = !debug_config.matrix; - } else if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_KEYBOARD)) { + } else if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_KEYBOARD)) { debug_config.keyboard = !debug_config.keyboard; - } else if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_MOUSE)) { + } else if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_MOUSE)) { debug_config.mouse = !debug_config.mouse; } else { debug_config.enable = !debug_config.enable; @@ -61,28 +62,28 @@ void bootmagic(void) /* keymap config */ keymap_config.raw = eeconfig_read_keymap(); - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK)) { keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock; } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) { keymap_config.capslock_to_control = !keymap_config.capslock_to_control; } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) { keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) { keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui; } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_NO_GUI)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_NO_GUI)) { keymap_config.no_gui = !keymap_config.no_gui; } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) { keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc; } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) { + if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) { keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace; } - if (bootmagic_scan_keycode(BOOTMAGIC_HOST_NKRO)) { + if (bootmagic_scan_key(BOOTMAGIC_HOST_NKRO)) { keymap_config.nkro = !keymap_config.nkro; } eeconfig_write_keymap(keymap_config.raw); @@ -93,14 +94,14 @@ void bootmagic(void) /* default layer */ uint8_t default_layer = 0; - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_0)) { default_layer |= (1<<0); } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_1)) { default_layer |= (1<<1); } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_2)) { default_layer |= (1<<2); } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_3)) { default_layer |= (1<<3); } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_4)) { default_layer |= (1<<4); } - if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_5)) { default_layer |= (1<<5); } - 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_key(BOOTMAGIC_KEY_DEFAULT_LAYER_0)) { default_layer |= (1<<0); } + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_1)) { default_layer |= (1<<1); } + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_2)) { default_layer |= (1<<2); } + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_3)) { default_layer |= (1<<3); } + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_4)) { default_layer |= (1<<4); } + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_5)) { default_layer |= (1<<5); } + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_6)) { default_layer |= (1<<6); } + if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_7)) { default_layer |= (1<<7); } if (default_layer) { eeconfig_write_default_layer(default_layer); default_layer_set((uint32_t)default_layer); @@ -110,13 +111,22 @@ void bootmagic(void) } } -static bool scan_keycode(uint8_t keycode) +static bool scan_key(uint16_t code) { for (uint8_t r = 0; r < MATRIX_ROWS; r++) { matrix_row_t matrix_row = matrix_get_row(r); for (uint8_t c = 0; c < MATRIX_COLS; c++) { if (matrix_row & ((matrix_row_t)1<send_keyboard)(report); if (debug_keyboard) { - dprint("keyboard_report: "); + dprint("keyboard: "); for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) { dprintf("%02X ", report->raw[i]); } @@ -75,6 +75,10 @@ void host_system_send(uint16_t report) if (!driver) return; (*driver->send_system)(report); + + if (debug_keyboard) { + dprintf("system: %04X\n", report); + } } void host_consumer_send(uint16_t report) @@ -84,9 +88,13 @@ void host_consumer_send(uint16_t report) if (!driver) return; (*driver->send_consumer)(report); + + if (debug_keyboard) { + dprintf("consumer: %04X\n", report); + } } -uint16_t host_last_sysytem_report(void) +uint16_t host_last_system_report(void) { return last_system_report; } diff --git a/common/host.h b/common/host.h index 918af69e..9814b10d 100644 --- a/common/host.h +++ b/common/host.h @@ -47,7 +47,7 @@ void host_mouse_send(report_mouse_t *report); void host_system_send(uint16_t data); void host_consumer_send(uint16_t data); -uint16_t host_last_sysytem_report(void); +uint16_t host_last_system_report(void); uint16_t host_last_consumer_report(void); #ifdef __cplusplus diff --git a/common/keyboard.c b/common/keyboard.c index 707351bc..b0319369 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -63,7 +63,6 @@ static bool has_ghost_in_row(uint8_t row) #endif -__attribute__ ((weak)) void matrix_setup(void) {} void keyboard_setup(void) { matrix_setup(); diff --git a/common/keycode.h b/common/keycode.h index f3402712..51c91950 100644 --- a/common/keycode.h +++ b/common/keycode.h @@ -153,8 +153,8 @@ along with this program. If not, see . #define KC_MRWD KC_MEDIA_REWIND #define KC_MSTP KC_MEDIA_STOP #define KC_MPLY KC_MEDIA_PLAY_PAUSE -#define KC_MSEL KC_MEDIA_SELECT #define KC_EJCT KC_MEDIA_EJECT +#define KC_MSEL KC_MEDIA_SELECT #define KC_MAIL KC_MAIL #define KC_CALC KC_CALCULATOR #define KC_MYCM KC_MY_COMPUTER @@ -420,10 +420,12 @@ enum internal_special_keycodes { KC_AUDIO_VOL_DOWN, KC_MEDIA_NEXT_TRACK, KC_MEDIA_PREV_TRACK, + KC_MEDIA_FAST_FORWARD, + KC_MEDIA_REWIND, KC_MEDIA_STOP, KC_MEDIA_PLAY_PAUSE, - KC_MEDIA_SELECT, KC_MEDIA_EJECT, + KC_MEDIA_SELECT, KC_MAIL, KC_CALCULATOR, KC_MY_COMPUTER, @@ -433,9 +435,7 @@ enum internal_special_keycodes { KC_WWW_FORWARD, KC_WWW_STOP, KC_WWW_REFRESH, - KC_WWW_FAVORITES, - KC_MEDIA_FAST_FORWARD, - KC_MEDIA_REWIND, /* 0xBC */ + KC_WWW_FAVORITES, /* 0xBC */ /* Jump to bootloader */ KC_BOOTLOADER = 0xBF, diff --git a/common/keymap.c b/common/keymap.c index 25161748..01c6e642 100644 --- a/common/keymap.c +++ b/common/keymap.c @@ -1,5 +1,5 @@ /* -Copyright 2013 Jun Wako +Copyright 2013,2016 Jun Wako 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 @@ -23,6 +23,9 @@ along with this program. If not, see . #include "wait.h" #include "debug.h" #include "bootloader.h" +#if defined(__AVR__) +#include +#endif #ifdef BOOTMAGIC_ENABLE extern keymap_config_t keymap_config; @@ -32,6 +35,7 @@ static action_t keycode_to_action(uint8_t keycode); /* converts key to action */ +__attribute__ ((weak)) action_t action_for_key(uint8_t layer, keypos_t key) { uint8_t keycode = keymap_key_to_keycode(layer, key); @@ -53,7 +57,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) case KC_LALT: if (keymap_config.swap_lalt_lgui) { if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_LGUI); } @@ -63,13 +67,13 @@ action_t action_for_key(uint8_t layer, keypos_t key) return keycode_to_action(KC_LALT); } if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_LGUI); case KC_RALT: if (keymap_config.swap_ralt_rgui) { if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_RGUI); } @@ -79,7 +83,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) return keycode_to_action(KC_RALT); } if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_RGUI); case KC_GRAVE: @@ -133,23 +137,22 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) /* translates keycode to action */ static action_t keycode_to_action(uint8_t keycode) { - action_t action = {}; switch (keycode) { case KC_A ... KC_EXSEL: case KC_LCTRL ... KC_RGUI: - action.code = ACTION_KEY(keycode); + return (action_t)ACTION_KEY(keycode); break; case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: - action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); + return (action_t)ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); break; case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: - action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); + return (action_t)ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); break; case KC_MS_UP ... KC_MS_ACCEL2: - action.code = ACTION_MOUSEKEY(keycode); + return (action_t)ACTION_MOUSEKEY(keycode); break; case KC_TRNS: - action.code = ACTION_TRANSPARENT; + return (action_t)ACTION_TRANSPARENT; break; case KC_BOOTLOADER: clear_keyboard(); @@ -157,10 +160,10 @@ static action_t keycode_to_action(uint8_t keycode) bootloader_jump(); // not return break; default: - action.code = ACTION_NO; + return (action_t)ACTION_NO; break; } - return action; + return (action_t)ACTION_NO; } @@ -170,6 +173,28 @@ static action_t keycode_to_action(uint8_t keycode) * Legacy keymap support * Consider using new keymap API instead. */ +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint8_t fn_layer[]; +extern const uint8_t fn_keycode[]; + +__attribute__ ((weak)) +uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) +{ + return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); +} + +__attribute__ ((weak)) +uint8_t keymap_fn_layer(uint8_t index) +{ + return pgm_read_byte(&fn_layer[index]); +} + +__attribute__ ((weak)) +uint8_t keymap_fn_keycode(uint8_t index) +{ + return pgm_read_byte(&fn_keycode[index]); +} + __attribute__ ((weak)) uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { @@ -181,21 +206,47 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) __attribute__ ((weak)) action_t keymap_fn_to_action(uint8_t keycode) { - action_t action = { .code = ACTION_NO }; switch (keycode) { case KC_FN0 ... KC_FN31: { uint8_t layer = keymap_fn_layer(FN_INDEX(keycode)); uint8_t key = keymap_fn_keycode(FN_INDEX(keycode)); if (key) { - action.code = ACTION_LAYER_TAP_KEY(layer, key); + return (action_t)ACTION_LAYER_TAP_KEY(layer, key); } else { - action.code = ACTION_LAYER_MOMENTARY(layer); + return (action_t)ACTION_LAYER_MOMENTARY(layer); } } - return action; + return (action_t)ACTION_NO; default: - return action; + return (action_t)ACTION_NO; } } + +#else + +/* user keymaps should be defined somewhere */ +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const action_t fn_actions[]; + +__attribute__ ((weak)) +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ +#if defined(__AVR__) + return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); +#else + return keymaps[(layer)][(key.row)][(key.col)]; +#endif +} + +__attribute__ ((weak)) +action_t keymap_fn_to_action(uint8_t keycode) +{ +#if defined(__AVR__) + return (action_t)pgm_read_word(&fn_actions[FN_INDEX(keycode)]); +#else + return fn_actions[FN_INDEX(keycode)]; +#endif +} + #endif diff --git a/common/matrix.c b/common/matrix.c new file mode 100644 index 00000000..9939307a --- /dev/null +++ b/common/matrix.c @@ -0,0 +1,95 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#include "print.h" +#include "matrix.h" + + +__attribute__ ((weak)) +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +__attribute__ ((weak)) +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +__attribute__ ((weak)) +void matrix_clear(void) +{ +} + +__attribute__ ((weak)) +void matrix_setup(void) {} + +__attribute__ ((weak)) +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix_get_row(row) & (1< 255) +#error "MATRIX_ROWS must not exceed 255" +#endif + #define MATRIX_IS_ON(row, col) (matrix_get_row(row) && (1<. #define TRANSPORT_STOP_EJECT 0x00CC #define TRANSPORT_PLAY_PAUSE 0x00CD /* application launch */ -#define AL_CC_CONFIG 0x0183 -#define AL_EMAIL 0x018A -#define AL_CALCULATOR 0x0192 -#define AL_LOCAL_BROWSER 0x0194 +#define APPLAUNCH_CC_CONFIG 0x0183 +#define APPLAUNCH_EMAIL 0x018A +#define APPLAUNCH_CALCULATOR 0x0192 +#define APPLAUNCH_LOCAL_BROWSER 0x0194 /* application control */ -#define AC_SEARCH 0x0221 -#define AC_HOME 0x0223 -#define AC_BACK 0x0224 -#define AC_FORWARD 0x0225 -#define AC_STOP 0x0226 -#define AC_REFRESH 0x0227 -#define AC_BOOKMARKS 0x022A +#define APPCONTROL_SEARCH 0x0221 +#define APPCONTROL_HOME 0x0223 +#define APPCONTROL_BACK 0x0224 +#define APPCONTROL_FORWARD 0x0225 +#define APPCONTROL_STOP 0x0226 +#define APPCONTROL_REFRESH 0x0227 +#define APPCONTROL_BOOKMARKS 0x022A /* supplement for Bluegiga iWRAP HID(not supported by Windows?) */ -#define AL_LOCK 0x019E +#define APPLAUNCH_LOCK 0x019E #define TRANSPORT_RECORD 0x00B2 #define TRANSPORT_FAST_FORWARD 0x00B3 #define TRANSPORT_REWIND 0x00B4 #define TRANSPORT_EJECT 0x00B8 -#define AC_MINIMIZE 0x0206 +#define APPCONTROL_MINIMIZE 0x0206 /* Generic Desktop Page(0x01) - system power control */ #define SYSTEM_POWER_DOWN 0x0081 @@ -159,27 +159,27 @@ typedef struct { /* keycode to consumer usage */ #define KEYCODE2CONSUMER(key) \ - (key == KC_AUDIO_MUTE ? AUDIO_MUTE : \ - (key == KC_AUDIO_VOL_UP ? AUDIO_VOL_UP : \ - (key == KC_AUDIO_VOL_DOWN ? AUDIO_VOL_DOWN : \ - (key == KC_MEDIA_NEXT_TRACK ? TRANSPORT_NEXT_TRACK : \ - (key == KC_MEDIA_PREV_TRACK ? TRANSPORT_PREV_TRACK : \ - (key == KC_MEDIA_FAST_FORWARD ? TRANSPORT_FAST_FORWARD : \ - (key == KC_MEDIA_REWIND ? TRANSPORT_REWIND : \ - (key == KC_MEDIA_STOP ? TRANSPORT_STOP : \ - (key == KC_MEDIA_EJECT ? TRANSPORT_STOP_EJECT : \ - (key == KC_MEDIA_PLAY_PAUSE ? TRANSPORT_PLAY_PAUSE : \ - (key == KC_MEDIA_SELECT ? AL_CC_CONFIG : \ - (key == KC_MAIL ? AL_EMAIL : \ - (key == KC_CALCULATOR ? AL_CALCULATOR : \ - (key == KC_MY_COMPUTER ? AL_LOCAL_BROWSER : \ - (key == KC_WWW_SEARCH ? AC_SEARCH : \ - (key == KC_WWW_HOME ? AC_HOME : \ - (key == KC_WWW_BACK ? AC_BACK : \ - (key == KC_WWW_FORWARD ? AC_FORWARD : \ - (key == KC_WWW_STOP ? AC_STOP : \ - (key == KC_WWW_REFRESH ? AC_REFRESH : \ - (key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0))))))))))))))))))))) + (key == KC_AUDIO_MUTE ? AUDIO_MUTE : \ + (key == KC_AUDIO_VOL_UP ? AUDIO_VOL_UP : \ + (key == KC_AUDIO_VOL_DOWN ? AUDIO_VOL_DOWN : \ + (key == KC_MEDIA_NEXT_TRACK ? TRANSPORT_NEXT_TRACK : \ + (key == KC_MEDIA_PREV_TRACK ? TRANSPORT_PREV_TRACK : \ + (key == KC_MEDIA_FAST_FORWARD ? TRANSPORT_FAST_FORWARD : \ + (key == KC_MEDIA_REWIND ? TRANSPORT_REWIND : \ + (key == KC_MEDIA_STOP ? TRANSPORT_STOP : \ + (key == KC_MEDIA_EJECT ? TRANSPORT_STOP_EJECT : \ + (key == KC_MEDIA_PLAY_PAUSE ? TRANSPORT_PLAY_PAUSE : \ + (key == KC_MEDIA_SELECT ? APPLAUNCH_CC_CONFIG : \ + (key == KC_MAIL ? APPLAUNCH_EMAIL : \ + (key == KC_CALCULATOR ? APPLAUNCH_CALCULATOR : \ + (key == KC_MY_COMPUTER ? APPLAUNCH_LOCAL_BROWSER : \ + (key == KC_WWW_SEARCH ? APPCONTROL_SEARCH : \ + (key == KC_WWW_HOME ? APPCONTROL_HOME : \ + (key == KC_WWW_BACK ? APPCONTROL_BACK : \ + (key == KC_WWW_FORWARD ? APPCONTROL_FORWARD : \ + (key == KC_WWW_STOP ? APPCONTROL_STOP : \ + (key == KC_WWW_REFRESH ? APPCONTROL_REFRESH : \ + (key == KC_WWW_FAVORITES ? APPCONTROL_BOOKMARKS : 0))))))))))))))))))))) #ifdef __cplusplus } diff --git a/common/sleep_led.h b/common/sleep_led.h index 6bdcf558..585c0d99 100644 --- a/common/sleep_led.h +++ b/common/sleep_led.h @@ -2,20 +2,10 @@ #define SLEEP_LED_H -#ifdef SLEEP_LED_ENABLE - void sleep_led_init(void); void sleep_led_enable(void); void sleep_led_disable(void); -void sleep_led_toggle(void); - -#else - -#define sleep_led_init() -#define sleep_led_enable() -#define sleep_led_disable() -#define sleep_led_toggle() - -#endif +void sleep_led_on(void); +void sleep_led_off(void); #endif diff --git a/common/unimap.c b/common/unimap.c new file mode 100644 index 00000000..84109b5a --- /dev/null +++ b/common/unimap.c @@ -0,0 +1,59 @@ +#include "keyboard.h" +#include "action.h" +#include "unimap.h" +#include "print.h" +#if defined(__AVR__) +# include +#endif + + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; + +// table translates matrix to universal keymap +extern const uint8_t unimap_trans[MATRIX_ROWS][MATRIX_COLS]; + + + +// translates raw matrix to universal map +keypos_t unimap_translate(keypos_t key) +{ + uint8_t unimap_pos = +#if defined(__AVR__) + pgm_read_byte(&unimap_trans[key.row][key.col]); +#else + unimap_trans[key.row][key.col]; +#endif + return (keypos_t) { + .row = ((unimap_pos & 0xf0) >> 4), + .col = (unimap_pos & 0x0f) + }; +} + +/* Converts key to action */ +__attribute__ ((weak)) +action_t action_for_key(uint8_t layer, keypos_t key) +{ + keypos_t uni = unimap_translate(key); + if ((uni.row << 4 | uni.col) == UNIMAP_NO) { + return (action_t)ACTION_NO; + } +#if defined(__AVR__) + return (action_t)pgm_read_word(&actionmaps[(layer)][(uni.row & 0x7)][(uni.col)]); +#else + return actionmaps[(layer)][(uni.row & 0x7)][(uni.col)]; +#endif +} + +/* Macro */ +__attribute__ ((weak)) +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + return MACRO_NONE; +} + +/* Function */ +__attribute__ ((weak)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +} diff --git a/common/unimap.h b/common/unimap.h new file mode 100644 index 00000000..6a78d885 --- /dev/null +++ b/common/unimap.h @@ -0,0 +1,272 @@ +/* +Copyright 2016 Jun Wako +*/ +#ifndef _UNIMAP_H_ +#define _UNIMAP_H_ + +#include +#include +#include "action.h" +#include "action_code.h" +#include "actionmap.h" + + +// Universal map table: 8x16=128key +#define UNIMAP_ROWS 8 +#define UNIMAP_COLS 16 + +/* Universal 128-key keyboard layout(8x16) + ,-----------------------------------------------. + |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| +,---. |-----------------------------------------------| ,-----------. ,-----------. +|Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| +`---' `-----------------------------------------------' `-----------' `-----------' +,-----------------------------------------------------------. ,-----------. ,---------------. +| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| +|-----------------------------------------------------------| |-----------| |---------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| +|-----------------------------------------------------------| `-----------' |---------------| +|CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Entr| | 4| 5| 6|KP,| +|-----------------------------------------------------------| ,---. |---------------| +|Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|Ent| +|-----------------------------------------------------------| ,-----------. |---------------| +|Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|KP=| +`-----------------------------------------------------------' `-----------' `---------------' +App: Windows Menu key +Gui: Windows key, Mac ⌘ key or Meta key +VDn Vup Mut: Volume control +< #: ISO keys(in UK legend) +KP=: Keypad = for Mac +KP,: Brazilian Keypad Comma +JPY: Japanese Yen(¥) +RO: Japanese ろ(Ro) or Brazilian /(Slash) +MHEN: Japanese 無変換(Non Conversion) or Korean Hanja +HENK: Japanese 変換(Conversion) or Korean Hangul/English +KANA: Japanese かな(Hiragana/Katakana) +https://en.wikipedia.org/wiki/Keyboard_layout#Japanese +https://en.wikipedia.org/wiki/Keyboard_layout#Hangul_.28for_Korean.29 +*/ +#define UNIMAP( \ + K68,K69,K6A,K6B,K6C,K6D,K6E,K6F,K70,K71,K72,K73, \ + K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, K01,K02,K03, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, K4C,K4D,K4E, K5F,K60,K61,K57, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, K5C,K5D,K5E,K66, \ + K79,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K75,K7D, K52, K59,K5A,K5B,K58, \ + K78,K7B,K7A,K77, K2C, K76,K00,K7E,K7F,K65,K7C, K50,K51,K4F, K62,K63,K67 \ +) { \ + { AC_##K00, AC_##K01, AC_##K02, AC_##K03, AC_##K04, AC_##K05, AC_##K06, AC_##K07, /* 00-07 */ \ + AC_##K08, AC_##K09, AC_##K0A, AC_##K0B, AC_##K0C, AC_##K0D, AC_##K0E, AC_##K0F }, /* 08-0F */ \ + { AC_##K10, AC_##K11, AC_##K12, AC_##K13, AC_##K14, AC_##K15, AC_##K16, AC_##K17, /* 10-17 */ \ + AC_##K18, AC_##K19, AC_##K1A, AC_##K1B, AC_##K1C, AC_##K1D, AC_##K1E, AC_##K1F }, /* 18-1F */ \ + { AC_##K20, AC_##K21, AC_##K22, AC_##K23, AC_##K24, AC_##K25, AC_##K26, AC_##K27, /* 20-27 */ \ + AC_##K28, AC_##K29, AC_##K2A, AC_##K2B, AC_##K2C, AC_##K2D, AC_##K2E, AC_##K2F }, /* 28-2F */ \ + { AC_##K30, AC_##K31, AC_##K32, AC_##K33, AC_##K34, AC_##K35, AC_##K36, AC_##K37, /* 30-37 */ \ + AC_##K38, AC_##K39, AC_##K3A, AC_##K3B, AC_##K3C, AC_##K3D, AC_##K3E, AC_##K3F }, /* 38-3F */ \ + { AC_##K40, AC_##K41, AC_##K42, AC_##K43, AC_##K44, AC_##K45, AC_##K46, AC_##K47, /* 40-47 */ \ + AC_##K48, AC_##K49, AC_##K4A, AC_##K4B, AC_##K4C, AC_##K4D, AC_##K4E, AC_##K4F }, /* 48-4F */ \ + { AC_##K50, AC_##K51, AC_##K52, AC_##K53, AC_##K54, AC_##K55, AC_##K56, AC_##K57, /* 50-57 */ \ + AC_##K58, AC_##K59, AC_##K5A, AC_##K5B, AC_##K5C, AC_##K5D, AC_##K5E, AC_##K5F }, /* 58-5F */ \ + { AC_##K60, AC_##K61, AC_##K62, AC_##K63, AC_##K64, AC_##K65, AC_##K66, AC_##K67, /* 60-67 */ \ + AC_##K68, AC_##K69, AC_##K6A, AC_##K6B, AC_##K6C, AC_##K6D, AC_##K6E, AC_##K6F }, /* 68-6F */ \ + { AC_##K70, AC_##K71, AC_##K72, AC_##K73, AC_##K74, AC_##K75, AC_##K76, AC_##K77, /* 70-77 */ \ + AC_##K78, AC_##K79, AC_##K7A, AC_##K7B, AC_##K7C, AC_##K7D, AC_##K7E, AC_##K7F } /* 78-7F */ \ +} + +// Universal map position codes +enum unimap_position_codes { +// logical name position(row << 4 | col) +// ------------------------------------------------ + UNIMAP_KANA, // 0x00 + UNIMAP_VOLUME_DOWN, // 0x01 + UNIMAP_VOLUME_UP, // 0x02 + UNIMAP_VOLUME_MUTE, // 0x03 + UNIMAP_A, // 0x04 + UNIMAP_B, // 0x05 + UNIMAP_C, // 0x06 + UNIMAP_D, // 0x07 + UNIMAP_E, // 0x08 + UNIMAP_F, // 0x09 + UNIMAP_G, // 0x0A + UNIMAP_H, // 0x0B + UNIMAP_I, // 0x0C + UNIMAP_J, // 0x0D + UNIMAP_K, // 0x0E + UNIMAP_L, // 0x0F + UNIMAP_M, // 0x10 + UNIMAP_N, // 0x11 + UNIMAP_O, // 0x12 + UNIMAP_P, // 0x13 + UNIMAP_Q, // 0x14 + UNIMAP_R, // 0x15 + UNIMAP_S, // 0x16 + UNIMAP_T, // 0x17 + UNIMAP_U, // 0x18 + UNIMAP_V, // 0x19 + UNIMAP_W, // 0x1A + UNIMAP_X, // 0x1B + UNIMAP_Y, // 0x1C + UNIMAP_Z, // 0x1D + UNIMAP_1, // 0x1E + UNIMAP_2, // 0x1F + UNIMAP_3, // 0x20 + UNIMAP_4, // 0x21 + UNIMAP_5, // 0x22 + UNIMAP_6, // 0x23 + UNIMAP_7, // 0x24 + UNIMAP_8, // 0x25 + UNIMAP_9, // 0x26 + UNIMAP_0, // 0x27 + UNIMAP_ENTER, // 0x28 + UNIMAP_ESCAPE, // 0x29 + UNIMAP_BSPACE, // 0x2A + UNIMAP_TAB, // 0x2B + UNIMAP_SPACE, // 0x2C + UNIMAP_MINUS, // 0x2D + UNIMAP_EQUAL, // 0x2E + UNIMAP_LBRACKET, // 0x2F + UNIMAP_RBRACKET, // 0x30 + UNIMAP_BSLASH, // 0x31 + UNIMAP_NONUS_HASH, // 0x32 ISO UK hasu + UNIMAP_SCOLON, // 0x33 + UNIMAP_QUOTE, // 0x34 + UNIMAP_GRAVE, // 0x35 + UNIMAP_COMMA, // 0x36 + UNIMAP_DOT, // 0x37 + UNIMAP_SLASH, // 0x38 + UNIMAP_CAPSLOCK, // 0x39 + UNIMAP_F1, // 0x3A + UNIMAP_F2, // 0x3B + UNIMAP_F3, // 0x3C + UNIMAP_F4, // 0x3D + UNIMAP_F5, // 0x3E + UNIMAP_F6, // 0x3F + UNIMAP_F7, // 0x40 + UNIMAP_F8, // 0x41 + UNIMAP_F9, // 0x42 + UNIMAP_F10, // 0x43 + UNIMAP_F11, // 0x44 + UNIMAP_F12, // 0x45 + UNIMAP_PSCREEN, // 0x46 + UNIMAP_SCROLLLOCK, // 0x47 + UNIMAP_PAUSE, // 0x48 + UNIMAP_INSERT, // 0x49 + UNIMAP_HOME, // 0x4A + UNIMAP_PGUP, // 0x4B + UNIMAP_DELETE, // 0x4C + UNIMAP_END, // 0x4D + UNIMAP_PGDOWN, // 0x4E + UNIMAP_RIGHT, // 0x4F + UNIMAP_LEFT, // 0x50 + UNIMAP_DOWN, // 0x51 + UNIMAP_UP, // 0x52 + UNIMAP_NUMLOCK, // 0x53 + UNIMAP_KP_SLASH, // 0x54 + UNIMAP_KP_ASTERISK, // 0x55 + UNIMAP_KP_MINUS, // 0x56 + UNIMAP_KP_PLUS, // 0x57 + UNIMAP_KP_ENTER, // 0x58 + UNIMAP_KP_1, // 0x59 + UNIMAP_KP_2, // 0x5A + UNIMAP_KP_3, // 0x5B + UNIMAP_KP_4, // 0x5C + UNIMAP_KP_5, // 0x5D + UNIMAP_KP_6, // 0x5E + UNIMAP_KP_7, // 0x5F + UNIMAP_KP_8, // 0x60 + UNIMAP_KP_9, // 0x61 + UNIMAP_KP_0, // 0x62 + UNIMAP_KP_DOT, // 0x63 + UNIMAP_NONUS_BSLASH, // 0x64 ISO UK backslash + UNIMAP_APPLICATION, // 0x65 + UNIMAP_KP_COMMA, // 0x66 + UNIMAP_KP_EQUAL, // 0x67 + UNIMAP_F13, // 0x68 + UNIMAP_F14, // 0x69 + UNIMAP_F15, // 0x6A + UNIMAP_F16, // 0x6B + UNIMAP_F17, // 0x6C + UNIMAP_F18, // 0x6D + UNIMAP_F19, // 0x6E + UNIMAP_F20, // 0x6F + UNIMAP_F21, // 0x70 + UNIMAP_F22, // 0x71 + UNIMAP_F23, // 0x72 + UNIMAP_F24, // 0x73 + UNIMAP_JYEN, // 0x74 + UNIMAP_RO, // 0x75 + UNIMAP_HENK, // 0x76 + UNIMAP_MHEN, // 0x77 + UNIMAP_LCTRL, // 0x78 + UNIMAP_LSHIFT, // 0x79 + UNIMAP_LALT, // 0x7A + UNIMAP_LGUI, // 0x7B + UNIMAP_RCTRL, // 0x7C + UNIMAP_RSHIFT, // 0x7D + UNIMAP_RALT, // 0x7E + UNIMAP_RGUI, // 0x7F + UNIMAP_NO, // 0x80 +}; + +/* + * Short names + */ +#define UNIMAP_LCTL UNIMAP_LCTRL +#define UNIMAP_RCTL UNIMAP_RCTRL +#define UNIMAP_LSFT UNIMAP_LSHIFT +#define UNIMAP_RSFT UNIMAP_RSHIFT +#define UNIMAP_ESC UNIMAP_ESCAPE +#define UNIMAP_BSPC UNIMAP_BSPACE +#define UNIMAP_ENT UNIMAP_ENTER +#define UNIMAP_DEL UNIMAP_DELETE +#define UNIMAP_INS UNIMAP_INSERT +#define UNIMAP_CAPS UNIMAP_CAPSLOCK +#define UNIMAP_CLCK UNIMAP_CAPSLOCK +#define UNIMAP_RGHT UNIMAP_RIGHT +#define UNIMAP_PGDN UNIMAP_PGDOWN +#define UNIMAP_PSCR UNIMAP_PSCREEN +#define UNIMAP_SLCK UNIMAP_SCROLLLOCK +#define UNIMAP_PAUS UNIMAP_PAUSE +#define UNIMAP_BRK UNIMAP_PAUSE +#define UNIMAP_NLCK UNIMAP_NUMLOCK +#define UNIMAP_SPC UNIMAP_SPACE +#define UNIMAP_MINS UNIMAP_MINUS +#define UNIMAP_EQL UNIMAP_EQUAL +#define UNIMAP_GRV UNIMAP_GRAVE +#define UNIMAP_RBRC UNIMAP_RBRACKET +#define UNIMAP_LBRC UNIMAP_LBRACKET +#define UNIMAP_COMM UNIMAP_COMMA +#define UNIMAP_BSLS UNIMAP_BSLASH +#define UNIMAP_SLSH UNIMAP_SLASH +#define UNIMAP_SCLN UNIMAP_SCOLON +#define UNIMAP_QUOT UNIMAP_QUOTE +#define UNIMAP_APP UNIMAP_APPLICATION +#define UNIMAP_NUHS UNIMAP_NONUS_HASH +#define UNIMAP_NUBS UNIMAP_NONUS_BSLASH +/* Japanese specific */ +#define UNIMAP_ZKHK UNIMAP_GRAVE +/* Keypad */ +#define UNIMAP_P1 UNIMAP_KP_1 +#define UNIMAP_P2 UNIMAP_KP_2 +#define UNIMAP_P3 UNIMAP_KP_3 +#define UNIMAP_P4 UNIMAP_KP_4 +#define UNIMAP_P5 UNIMAP_KP_5 +#define UNIMAP_P6 UNIMAP_KP_6 +#define UNIMAP_P7 UNIMAP_KP_7 +#define UNIMAP_P8 UNIMAP_KP_8 +#define UNIMAP_P9 UNIMAP_KP_9 +#define UNIMAP_P0 UNIMAP_KP_0 +#define UNIMAP_PDOT UNIMAP_KP_DOT +#define UNIMAP_PCMM UNIMAP_KP_COMMA +#define UNIMAP_PSLS UNIMAP_KP_SLASH +#define UNIMAP_PAST UNIMAP_KP_ASTERISK +#define UNIMAP_PMNS UNIMAP_KP_MINUS +#define UNIMAP_PPLS UNIMAP_KP_PLUS +#define UNIMAP_PEQL UNIMAP_KP_EQUAL +#define UNIMAP_PENT UNIMAP_KP_ENTER +/* Consumer Page */ +#define UNIMAP_MUTE UNIMAP_VOLUME_MUTE +#define UNIMAP_VOLU UNIMAP_VOLUME_UP +#define UNIMAP_VOLD UNIMAP_VOLUME_DOWN + +#endif diff --git a/common/util.h b/common/util.h index 7451cc08..3e01a93d 100644 --- a/common/util.h +++ b/common/util.h @@ -28,6 +28,10 @@ along with this program. If not, see . #define XSTR(s) #s +#ifdef __cplusplus +extern "C" { +#endif + uint8_t bitpop(uint8_t bits); uint8_t bitpop16(uint16_t bits); uint8_t bitpop32(uint32_t bits); @@ -40,4 +44,8 @@ uint8_t bitrev(uint8_t bits); uint16_t bitrev16(uint16_t bits); uint32_t bitrev32(uint32_t bits); +#ifdef __cplusplus +} +#endif + #endif diff --git a/doc/keycode.txt b/doc/keycode.txt index 44d7e27c..1712929c 100644 --- a/doc/keycode.txt +++ b/doc/keycode.txt @@ -1,7 +1,7 @@ Keycode Symbol Table ==================== Keycodes are defined in `common/keycode.h`. -Range of 00-A4 and E0-E7 are identical with HID Usage: +Range of 00-A4 and E0-E7 are identical with HID Usage of Keyboard/Keypad Page(0x07): Virtual keycodes are defined out of above range to support special actions. @@ -186,30 +186,35 @@ KC_RGUI E7 Keyboard Right GUI(Windows/Apple/Meta key /* * Virtual keycodes */ -/* System Control */ +/* Generic Desktop Page(0x01) - System Control */ KC_SYSTEM_POWER KC_PWR System Power Down KC_SYSTEM_SLEEP KC_SLEP System Sleep KC_SYSTEM_WAKE KC_WAKE System Wake -/* Consumer Page */ -KC_AUDIO_MUTE KC_MUTE -KC_AUDIO_VOL_UP KC_VOLU -KC_AUDIO_VOL_DOWN KC_VOLD -KC_MEDIA_NEXT_TRACK KC_MNXT -KC_MEDIA_PREV_TRACK KC_MPRV -KC_MEDIA_STOP KC_MSTP -KC_MEDIA_PLAY_PAUSE KC_MPLY -KC_MEDIA_SELECT KC_MSEL -KC_MAIL KC_MAIL -KC_CALCULATOR KC_CALC -KC_MY_COMPUTER KC_MYCM -KC_WWW_SEARCH KC_WSCH -KC_WWW_HOME KC_WHOM -KC_WWW_BACK KC_WBAK -KC_WWW_FORWARD KC_WFWD -KC_WWW_STOP KC_WSTP -KC_WWW_REFRESH KC_WREF -KC_WWW_FAVORITES KC_WFAV -/* Mousekey */ + +/* Consumer Page(0x07) */ +KC_AUDIO_MUTE KC_MUTE Mute +KC_AUDIO_VOL_UP KC_VOLU Volume Increment +KC_AUDIO_VOL_DOWN KC_VOLD Volume Decrement +KC_MEDIA_NEXT_TRACK KC_MNXT Scan Next Track +KC_MEDIA_PREV_TRACK KC_MPRV Scan Previous Track +KC_MEDIA_STOP KC_MSTP Stop +KC_MEDIA_FAST_FORWARD KC_MFFD Fast Forward +KC_MEDIA_REWIND KC_MRWD Rewind +KC_MEDIA_PLAY_PAUSE KC_MPLY Play/Pause +KC_EJCT KC_MEDIA_EJECT Stop/Eject +KC_MEDIA_SELECT KC_MSEL AL Consumer Control Configuration +KC_MAIL KC_MAIL AL Email Reader +KC_CALCULATOR KC_CALC AL Calculator +KC_MY_COMPUTER KC_MYCM AL Local Machine Browser +KC_WWW_SEARCH KC_WSCH AC Search +KC_WWW_HOME KC_WHOM AC Home +KC_WWW_BACK KC_WBAK AC Back +KC_WWW_FORWARD KC_WFWD AC Forward +KC_WWW_STOP KC_WSTP AC Stop +KC_WWW_REFRESH KC_WREF AC Refresh +KC_WWW_FAVORITES KC_WFAV AC Bookmarks + +/* Mousekey - TMK specific */ KC_MS_UP KC_MS_U Mouse Cursor Up KC_MS_DOWN KC_MS_D Mouse Cursor Down KC_MS_LEFT KC_MS_L Mouse Cursor Left @@ -226,7 +231,8 @@ KC_MS_WH_RIGHT KC_WH_R Mouse Wheel Right KC_MS_ACCEL0 KC_ACL0 Mouse Acceleration 0 KC_MS_ACCEL1 KC_ACL1 Mouse Acceleration 1 KC_MS_ACCEL2 KC_ACL2 Mouse Acceleration 2 -/* Fn key */ + +/* Fn key - TMK specific */ KC_FN0 KC_FN1 KC_FN2 diff --git a/doc/keymap.md b/doc/keymap.md index 3a196a2d..87b72e05 100644 --- a/doc/keymap.md +++ b/doc/keymap.md @@ -95,7 +95,7 @@ Note that ***higher layers have priority in the layer stack***. The firmware sta ### 0.3 Keymap Example -The keymap is defined in the **`keymaps[]`** array, a 2-dimensional array of rows and columns corresponding to positions in the keyboard matrix. But most often the layers are defined using C macros to allow for easier reading and editing of the keymap files. To use complex actions you need to define `Fn` keycodes in the **`fn_actions[]`** array. +The keymap is defined in the **`uint8_t keymaps[]`** array, a 2-dimensional array of rows and columns corresponding to positions in the keyboard matrix. But most often the layers are defined using C macros to allow for easier reading and editing of the keymap files. To use complex actions you need to define `Fn` action in the **`action_t fn_actions[]`** array. This is a keymap example for the [HHKB](http://en.wikipedia.org/wiki/Happy_Hacking_Keyboard) keyboard. This example has three layers: the QWERTY base layer, and two overlay layers for cursor and mousekey control, respectively. @@ -109,7 +109,7 @@ In this example, You can find other keymap definitions in file `keymap.c` located on project directories. - static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: Qwerty * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| @@ -167,7 +167,7 @@ You can find other keymap definitions in file `keymap.c` located on project dire LGUI,LALT, BTN1, RALT,TRNS), }; - static const uint16_t PROGMEM fn_actions[] = { + const action_t PROGMEM fn_actions[] = { ACTION_LAYER_MOMENTARY(1), // FN0 ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN1 ACTION_LAYER_TOGGLE(2), // FN2 @@ -214,7 +214,7 @@ There are 8 modifiers which has discrimination between left and right. - `KC_WSCH`, `KC_WHOM`, `KC_WBAK`, `KC_WFWD`, `KC_WSTP`, `KC_WREF`, `KC_WFAV` for web browser operation ### 1.5 Fn key -`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.*** +`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `action_t fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.*** ### 1.6 Keycode Table See keycode table in [`doc/keycode.txt`](./keycode.txt) for description of keycodes. @@ -379,19 +379,33 @@ Default Layer also has bitwise operations, they are executed when key is release ACTION_DEFAULT_LAYER_BIT_SET(part, bits) - ### 2.3 Macro action -***TBD*** +`Macro` actions allow you to register a complex sequence of keystrokes when a key is pressed, where macros are simple sequences of keypresses. -`Macro` action indicates complex key strokes. - - MACRO( D(LSHIFT), D(D), END ) - MACRO( U(D), U(LSHIFT), END ) - MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ) + ACTION_MACRO(id) + ACTION_MACRO_TAP(id) -#### 2.3.1 Macro Commands -- **MACRO()** -- **MACRO_NONE** +`id` is an 8-bit user-defined value the macro getter function can use to pick the specific macro. + + +#### 2.3.1 Implementing Macro getter function +To implement `macro` functions, the macro lookup list must be implemented: + + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt); + +The function must always return a valid macro, and default implementation of `action_get_macro` always returns `MACRO_NONE` which has no effect. + +#### 2.3.1.1 Limitations +Similar to the Function Action system, the selector functions is passed a `keyrecord_t` object, so it can inspect the key state (e.g. different macros on key press or release), and key itself. + +Unlike the Function Action system,`macros` are pre-recorded key sequences, so you can only select from a list. If you want to use dynamic macros then you should look at the more complex function action system. + +#### 2.3.2 Implementing/Defining Macro sequences +Macros are of the form (must be wrapped by the `MACRO` function, and end with an `END` mark) + + MACRO( ..., END ) + +Within each macro, the following commands can be used: - **I()** change interval of stroke. - **D()** press key @@ -401,19 +415,25 @@ Default Layer also has bitwise operations, they are executed when key is release - **SM()** store modifier state - **RM()** restore modifier state - **CM()** clear modifier state -- **END** end mark + +e.g.: + + MACRO( D(LSHIFT), D(D), END ) // hold down LSHIFT and D - will print 'D' + MACRO( U(D), U(LSHIFT), END ) // release U and LSHIFT keys (an event.pressed == False counterpart for the one above) + MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ) // slowly print out h-e-l-l---o #### 2.3.2 Examples -***TBD*** + +in keymap.c, define `action_get_macro` const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { switch (id) { - case HELLO: + case 0: return (record->event.pressed ? MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : MACRO_NONE ); - case ALT_TAB: + case 1: return (record->event.pressed ? MACRO( D(LALT), D(TAB), END ) : MACRO( U(TAB), END )); @@ -421,7 +441,12 @@ Default Layer also has bitwise operations, they are executed when key is release return MACRO_NONE; } - +in keymap.c, bind items in `fn_actions` to the macro function + + const action_t PROGMEM fn_actions[] = { + [0] = ACTION_MACRO(0), // will print 'hello' for example + [1] = ACTION_MACRO(1), + }; ### 2.4 Function action @@ -443,7 +468,7 @@ To define tappable `Function` action in keymap use this. #### 2.4.3 Implement user function `Function` actions can be defined freely with C by user in callback function: - void keymap_call_function(keyrecord_t *event, uint8_t id, uint8_t opt) + void action_function(keyrecord_t *record, uint8_t id, uint8_t opt); This C function is called every time key is operated, argument `id` selects action to be performed and `opt` can be used for option. Function `id` can be 0-255 and `opt` can be 0-15. @@ -544,6 +569,7 @@ This registers modifier key(s) simultaneously with layer switching. ACTION_LAYER_MODS(2, MOD_LSFT | MOD_LALT) +This function can only register left-sided modifiers. The handedness of the modifier (left/right) is an extra bit that is not able to be passed through into the layer system. See: [`common/action_code.h`](../common/action_code.h), the spec for ACT_LAYER_TAP only allows four bits for the mods, whereas the mods themselves require five bits, with the high bit being the left/right handedness. ## 4. Tapping @@ -598,13 +624,13 @@ Legacy Keymap uses two arrays `fn_layer[]` and `fn_keycode[]` to define Fn key. In following setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 respectively. `Fn2` registers `Space` key when tapping while `Fn0` and `Fn1` doesn't send any key. - static const uint8_t PROGMEM fn_layer[] = { + const uint8_t PROGMEM fn_layer[] = { 1, // Fn0 2, // Fn1 2, // Fn2 }; - static const uint8_t PROGMEM fn_keycode[] = { + const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_NO, // Fn1 KC_SPC, // Fn2 diff --git a/doc/unimap.txt b/doc/unimap.txt new file mode 100644 index 00000000..0db038e6 --- /dev/null +++ b/doc/unimap.txt @@ -0,0 +1,51 @@ +Unimap +====== +universal keymapping framework +using logical 128-key keyboard layout independent from physical keyboad matrix + +unimap is actually an actionmap whose size is row:8xcol:16. + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; + +/* Universal 128-key keyboard layout(8x16) + ,-----------------------------------------------. + |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| +,---. |-----------------------------------------------| ,-----------. ,-----------. +|Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| +`---' `-----------------------------------------------' `-----------' `-----------' +,-----------------------------------------------------------. ,-----------. ,---------------. +| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| +|-----------------------------------------------------------| |-----------| |---------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| +|-----------------------------------------------------------| `-----------' |---------------| +|CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| | 4| 5| 6|KP,| +|-----------------------------------------------------------| ,---. |---------------| +|Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| +|-----------------------------------------------------------| ,-----------. |---------------| +|Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| +`-----------------------------------------------------------' `-----------' `---------------' +App: Windows Menu key +Gui: Windows key, Mac ⌘ key or Meta key +VDn Vup Mut: Volume control +< #: ISO keys(in UK legend) +KP=: Keypad = for Mac +KP,: Brazilian Keypad Comma +JPY: Japanese Yen(¥) +RO: Japanese ろ(Ro) or Brazilian /(Slash) +MHEN: Japanese 無変換(Non Conversion) or Korean Hanja +HENK: Japanese 変換(Conversion) or Korean Hangul/English +KANA: Japanese かな(Hiragana/Katakana) +https://en.wikipedia.org/wiki/Keyboard_layout#Japanese +https://en.wikipedia.org/wiki/Keyboard_layout#Hangul_.28for_Korean.29 +*/ + + +when refering to keymapping physical matrix position needed to be translated into logical one on unimap +the translation is defined in unimap array + +row and col of unimap positon is encoded as follows +position = (row << 4) | col + +// table translates matrix to universal keymap +extern const uint8_t unimap_trans[MATRIX_ROWS][MATRIX_COLS]; diff --git a/protocol.mk b/protocol.mk index 54913329..2bf05742 100644 --- a/protocol.mk +++ b/protocol.mk @@ -1,52 +1,59 @@ PROTOCOL_DIR = protocol -ifdef PS2_MOUSE_ENABLE +ifeq (yes,$(strip $(PS2_MOUSE_ENABLE))) SRC += $(PROTOCOL_DIR)/ps2_mouse.c OPT_DEFS += -DPS2_MOUSE_ENABLE OPT_DEFS += -DMOUSE_ENABLE endif -ifdef PS2_USE_BUSYWAIT +ifeq (yes,$(strip $(PS2_USE_BUSYWAIT))) SRC += protocol/ps2_busywait.c SRC += protocol/ps2_io_avr.c OPT_DEFS += -DPS2_USE_BUSYWAIT endif -ifdef PS2_USE_INT +ifeq (yes,$(strip $(PS2_USE_INT))) SRC += protocol/ps2_interrupt.c SRC += protocol/ps2_io_avr.c OPT_DEFS += -DPS2_USE_INT endif -ifdef PS2_USE_USART +ifeq (yes,$(strip $(PS2_USE_USART))) SRC += protocol/ps2_usart.c SRC += protocol/ps2_io_avr.c OPT_DEFS += -DPS2_USE_USART endif -ifdef SERIAL_MOUSE_MICROSOFT_ENABLE +ifeq (yes,$(strip $(XT_USE_INT))) + SRC += protocol/xt_interrupt.c + SRC += protocol/xt_io_avr.c + OPT_DEFS += -DXT_USE_INT +endif + + +ifeq (yes,$(strip $(SERIAL_MOUSE_MICROSOFT_ENABLE))) SRC += $(PROTOCOL_DIR)/serial_mouse_microsoft.c OPT_DEFS += -DSERIAL_MOUSE_ENABLE -DSERIAL_MOUSE_MICROSOFT \ -DMOUSE_ENABLE endif -ifdef SERIAL_MOUSE_MOUSESYSTEMS_ENABLE +ifeq (yes,$(strip $(SERIAL_MOUSE_MOUSESYSTEMS_ENABLE))) SRC += $(PROTOCOL_DIR)/serial_mouse_mousesystems.c OPT_DEFS += -DSERIAL_MOUSE_ENABLE -DSERIAL_MOUSE_MOUSESYSTEMS \ -DMOUSE_ENABLE endif -ifdef SERIAL_MOUSE_USE_SOFT +ifeq (yes,$(strip $(SERIAL_MOUSE_USE_SOFT))) SRC += $(PROTOCOL_DIR)/serial_soft.c endif -ifdef SERIAL_MOUSE_USE_UART +ifeq (yes,$(strip $(SERIAL_MOUSE_USE_UART))) SRC += $(PROTOCOL_DIR)/serial_uart.c endif -ifdef ADB_MOUSE_ENABLE +ifeq (yes,$(strip $(ADB_MOUSE_ENABLE))) OPT_DEFS += -DADB_MOUSE_ENABLE -DMOUSE_ENABLE endif diff --git a/protocol/adb.c b/protocol/adb.c index 5c6c99b4..164255ef 100644 --- a/protocol/adb.c +++ b/protocol/adb.c @@ -60,7 +60,6 @@ static inline void place_bit1(void); static inline void send_byte(uint8_t data); static inline uint16_t wait_data_lo(uint16_t us); static inline uint16_t wait_data_hi(uint16_t us); -static inline uint16_t adb_host_dev_recv(uint8_t device); void adb_host_init(void) @@ -87,49 +86,9 @@ bool adb_host_psw(void) * * */ - -// ADB Bit Cells -// -// bit cell time: 70-130us -// low part of bit0: 60-70% of bit cell -// low part of bit1: 30-40% of bit cell -// -// bit cell time 70us 130us -// -------------------------------------------- -// low part of bit0 42-49 78-91 -// high part of bit0 21-28 39-52 -// low part of bit1 21-28 39-52 -// high part of bit1 42-49 78-91 -// -// -// bit0: -// 70us bit cell: -// ____________~~~~~~ -// 42-49 21-28 -// -// 130us bit cell: -// ____________~~~~~~ -// 78-91 39-52 -// -// bit1: -// 70us bit cell: -// ______~~~~~~~~~~~~ -// 21-28 42-49 -// -// 130us bit cell: -// ______~~~~~~~~~~~~ -// 39-52 78-91 -// -// [from Apple IIgs Hardware Reference Second Edition] - -enum { - ADDR_KEYB = 0x20, - ADDR_MOUSE = 0x30 -}; - -uint16_t adb_host_kbd_recv(void) +uint16_t adb_host_kbd_recv(uint8_t addr) { - return adb_host_dev_recv(ADDR_KEYB); + return adb_host_talk(addr, ADB_REG_0); } #ifdef ADB_MOUSE_ENABLE @@ -139,16 +98,16 @@ void adb_mouse_init(void) { uint16_t adb_host_mouse_recv(void) { - return adb_host_dev_recv(ADDR_MOUSE); + return adb_host_talk(ADB_ADDR_MOUSE, ADB_REG_0); } #endif -static inline uint16_t adb_host_dev_recv(uint8_t device) +uint16_t adb_host_talk(uint8_t addr, uint8_t reg) { uint16_t data = 0; cli(); attention(); - send_byte(device|0x0C); // Addr:Keyboard(0010)/Mouse(0011), Cmd:Talk(11), Register0(00) + send_byte((addr<<4) | (ADB_CMD_TALK<<2) | reg); place_bit0(); // Stopbit(0) if (!wait_data_hi(500)) { // Service Request(310us Adjustable Keyboard): just ignored sei(); @@ -158,20 +117,20 @@ static inline uint16_t adb_host_dev_recv(uint8_t device) sei(); return 0; // No data to send } - + uint8_t n = 17; // start bit + 16 data bits do { uint8_t lo = (uint8_t) wait_data_hi(130); if (!lo) goto error; - + uint8_t hi = (uint8_t) wait_data_lo(lo); if (!hi) goto error; - + hi = lo - hi; lo = 130 - lo; - + data <<= 1; if (lo < hi) { data |= 1; @@ -197,27 +156,27 @@ error: return -n; } -void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l) +void adb_host_listen(uint8_t addr, uint8_t reg, uint8_t data_h, uint8_t data_l) { cli(); attention(); - send_byte(cmd); + send_byte((addr<<4) | (ADB_CMD_LISTEN<<2) | reg); place_bit0(); // Stopbit(0) _delay_us(200); // Tlt/Stop to Start place_bit1(); // Startbit(1) - send_byte(data_h); + send_byte(data_h); send_byte(data_l); place_bit0(); // Stopbit(0); sei(); } // send state of LEDs -void adb_host_kbd_led(uint8_t led) +void adb_host_kbd_led(uint8_t addr, uint8_t led) { - // Addr:Keyboard(0010), Cmd:Listen(10), Register2(10) - // send upper byte (not used) - // send lower byte (bit2: ScrollLock, bit1: CapsLock, bit0: - adb_host_listen(0x2A,0,led&0x07); + // Listen Register2 + // upper byte: not used + // lower byte: bit2=ScrollLock, bit1=CapsLock, bit0=NumLock + adb_host_listen(addr, 2, 0, led & 0x07); } @@ -366,7 +325,7 @@ Commands bits commands ------------------------------------------------------ - - - - - 0 0 0 0 Send Request(reset all devices) + - - - - 0 0 0 0 Send Reset(reset all devices) A A A A 0 0 0 1 Flush(reset a device) - - - - 0 0 1 0 Reserved - - - - 0 0 1 1 Reserved @@ -375,7 +334,7 @@ Commands A A A A 1 1 R R Talk(read from a device) The command to read keycodes from keyboard is 0x2C which - consist of keyboard address 2 and Talk against register 0. + consist of keyboard address 2 and Talk against register 0. Address: 2: keyboard @@ -457,7 +416,7 @@ Keyboard Data(Register0) Keyboard LEDs & state of keys(Register2) This register hold current state of three LEDs and nine keys. The state of LEDs can be changed by sending Listen command. - + 1514 . . . . . . 7 6 5 . 3 2 1 0 | | | | | | | | | | | | | | | +- LED1(NumLock) | | | | | | | | | | | | | | +--- LED2(CapsLock) @@ -474,5 +433,56 @@ Keyboard LEDs & state of keys(Register2) | +----------------------------- Delete +------------------------------- Reserved +Address, Handler ID and bits(Register3) + 1514131211 . . 8 7 . . . . . . 0 + | | | | | | | | | | | | | | | | + | | | | | | | | +-+-+-+-+-+-+-+- Handler ID + | | | | +-+-+-+----------------- Address + | | | +------------------------- 0 + | | +--------------------------- Service request enable(1 = enabled) + | +----------------------------- Exceptional event(alwyas 1 if not used) + +------------------------------- 0 + +ADB Bit Cells + bit cell time: 70-130us + low part of bit0: 60-70% of bit cell + low part of bit1: 30-40% of bit cell + + bit cell time 70us 130us + -------------------------------------------- + low part of bit0 42-49 78-91 + high part of bit0 21-28 39-52 + low part of bit1 21-28 39-52 + high part of bit1 42-49 78-91 + + + bit0: + 70us bit cell: + ____________~~~~~~ + 42-49 21-28 + + 130us bit cell: + ____________~~~~~~ + 78-91 39-52 + + bit1: + 70us bit cell: + ______~~~~~~~~~~~~ + 21-28 42-49 + + 130us bit cell: + ______~~~~~~~~~~~~ + 39-52 78-91 + + [from Apple IIgs Hardware Reference Second Edition] + +Keyboard Handle ID + Apple Standard Keyboard M0116: 0x01 + Apple Extended Keyboard M0115: 0x02 + Apple Extended Keyboard II M3501: 0x02 + Apple Adjustable Keybaord: 0x10 + + http://lxr.free-electrons.com/source/drivers/macintosh/adbhid.c?v=4.4#L802 + END_OF_ADB */ diff --git a/protocol/adb.h b/protocol/adb.h index b4b3633c..a8b97ea5 100644 --- a/protocol/adb.h +++ b/protocol/adb.h @@ -52,13 +52,41 @@ POSSIBILITY OF SUCH DAMAGE. #define ADB_CAPS 0x39 +/* ADB commands */ +// Default Address +#define ADB_ADDR_DONGLE 1 +#define ADB_ADDR_KEYBOARD 2 +#define ADB_ADDR_MOUSE 3 +#define ADB_ADDR_TABLET 4 +#define ADB_ADDR_APPLIANCE 7 +// Command Type +#define ADB_CMD_RESET 0 +#define ADB_CMD_FLUSH 1 +#define ADB_CMD_LISTEN 2 +#define ADB_CMD_TALK 3 +// Register +#define ADB_REG_0 0 +#define ADB_REG_1 1 +#define ADB_REG_2 2 +#define ADB_REG_3 3 + +/* ADB keyboard handler id */ +#define ADB_HANDLER_M0116 0x01 +#define ADB_HANDLER_IIGS 0x01 +#define ADB_HANDLER_M0115 0x02 +#define ADB_HANDLER_M3501 0x02 +#define ADB_HANDLER_M1242_ANSI 0x10 +#define ADB_HANDLER_EXTENDED_PROTOCOL 0x03 + + // ADB host void adb_host_init(void); bool adb_host_psw(void); -uint16_t adb_host_kbd_recv(void); +uint16_t adb_host_kbd_recv(uint8_t addr); uint16_t adb_host_mouse_recv(void); -void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l); -void adb_host_kbd_led(uint8_t led); +uint16_t adb_host_talk(uint8_t addr, uint8_t reg); +void adb_host_listen(uint8_t addr, uint8_t reg, uint8_t data_h, uint8_t data_l); +void adb_host_kbd_led(uint8_t addr, uint8_t led); void adb_mouse_task(void); void adb_mouse_init(void); diff --git a/protocol/bluefruit/bluefruit.c b/protocol/bluefruit/bluefruit.c index cf26b83d..7f7d0625 100644 --- a/protocol/bluefruit/bluefruit.c +++ b/protocol/bluefruit/bluefruit.c @@ -150,25 +150,25 @@ static void send_system(uint16_t data) +-------------------------------------+-------+ */ #define CONSUMER2BLUEFRUIT(usage) \ - (usage == AUDIO_MUTE ? 0x0000 : \ - (usage == AUDIO_VOL_UP ? 0x1000 : \ - (usage == AUDIO_VOL_DOWN ? 0x2000 : \ - (usage == TRANSPORT_NEXT_TRACK ? 0x0002 : \ - (usage == TRANSPORT_PREV_TRACK ? 0x0004 : \ - (usage == TRANSPORT_STOP ? 0x0010 : \ - (usage == TRANSPORT_STOP_EJECT ? 0x0000 : \ - (usage == TRANSPORT_PLAY_PAUSE ? 0x4000 : \ - (usage == AL_CC_CONFIG ? 0x0000 : \ - (usage == AL_EMAIL ? 0x0000 : \ - (usage == AL_CALCULATOR ? 0x0000 : \ - (usage == AL_LOCAL_BROWSER ? 0x0000 : \ - (usage == AC_SEARCH ? 0x0400 : \ - (usage == AC_HOME ? 0x0100 : \ - (usage == AC_BACK ? 0x0000 : \ - (usage == AC_FORWARD ? 0x0000 : \ - (usage == AC_STOP ? 0x0000 : \ - (usage == AC_REFRESH ? 0x0000 : \ - (usage == AC_BOOKMARKS ? 0x0000 : 0))))))))))))))))))) + (usage == AUDIO_MUTE ? 0x0000 : \ + (usage == AUDIO_VOL_UP ? 0x1000 : \ + (usage == AUDIO_VOL_DOWN ? 0x2000 : \ + (usage == TRANSPORT_NEXT_TRACK ? 0x0002 : \ + (usage == TRANSPORT_PREV_TRACK ? 0x0004 : \ + (usage == TRANSPORT_STOP ? 0x0010 : \ + (usage == TRANSPORT_STOP_EJECT ? 0x0000 : \ + (usage == TRANSPORT_PLAY_PAUSE ? 0x4000 : \ + (usage == APPLAUNCH_CC_CONFIG ? 0x0000 : \ + (usage == APPLAUNCH_EMAIL ? 0x0000 : \ + (usage == APPLAUNCH_CALCULATOR ? 0x0000 : \ + (usage == APPLAUNCH_LOCAL_BROWSER ? 0x0000 : \ + (usage == APPCONTROL_SEARCH ? 0x0400 : \ + (usage == APPCONTROL_HOME ? 0x0100 : \ + (usage == APPCONTROL_BACK ? 0x0000 : \ + (usage == APPCONTROL_FORWARD ? 0x0000 : \ + (usage == APPCONTROL_STOP ? 0x0000 : \ + (usage == APPCONTROL_REFRESH ? 0x0000 : \ + (usage == APPCONTROL_BOOKMARKS ? 0x0000 : 0))))))))))))))))))) static void send_consumer(uint16_t data) { diff --git a/protocol/chibios/README.md b/protocol/chibios/README.md index 63e6641f..2fadc799 100644 --- a/protocol/chibios/README.md +++ b/protocol/chibios/README.md @@ -1,16 +1,16 @@ ## TMK running on top of ChibiOS -This code can be used to run TMK keyboard logic on top of [ChibiOS], meaning that you can run TMK on whatever [ChibiOS] supports. The notable examples are ARM-based Teensies (3.x and LC) and on the boards with STM32 MCUs. +This code can be used to run TMK keyboard logic on top of [ChibiOS], meaning that you can run TMK on whatever ChibiOS supports. The notable examples are PJRC Teensies(3.x and LC) with NXP Kinetis and dev boards with ST Micro STM32 MCUs. ### Usage -- To use, [get a zip of chibios](https://github.com/ChibiOS/ChibiOS/archive/a7df9a891067621e8e1a5c2a2c0ceada82403afe.zip) and unpack/rename it to `tmk_core/tool/chibios/chibios`; or you can just clone [the repo](https://github.com/ChibiOS/ChibiOS) there. For Freescale/NXP Kinetis support (meaning ARM Teensies and the Infinity keyboard), you'll also need [a zip of chibios-contrib](https://github.com/ChibiOS/ChibiOS-Contrib/archive/e1311c4db6cd366cf760673f769e925741ac0ad3.zip), unpacked/renamed to `tmk_core/tool/chibios/chibios-contrib`. Likewise, for git-savvy people, just clone [the repo](https://github.com/ChibiOS/ChibiOS-Contrib) there. -- Note: the abovementioned directories are the defaults. You can have the two chibios repositories wherever you want, just define their location in `CHIBIOS` and `CHIBIOS_CONTRIB` variables in your `Makefile`. +- To use, get a [zip file](https://github.com/ChibiOS/ChibiOS/archive/a7df9a891067621e8e1a5c2a2c0ceada82403afe.zip) of ChibiOS and unpack/rename it to `tmk_core/tool/chibios/ChibiOS`; or you can just clone [ChibiOS repo](https://github.com/ChibiOS/ChibiOS) there. For Freescale/NXP Kinetis support (meaning Teensies 3.x/LC and the Infinity keyboard), you'll also need a [zip](https://github.com/ChibiOS/ChibiOS-Contrib/archive/e1311c4db6cd366cf760673f769e925741ac0ad3.zip) of ChibiOS-Contrib, unpacked/renamed to `tmk_core/tool/chibios/ChibiOS-Contrib`. Likewise, for git-savvy people, just clone [ChibiOS-Contrib repo](https://github.com/ChibiOS/ChibiOS-Contrib) there. +- Note: the above mentioned directories are the defaults. You can have the two ChibiOS repositories wherever you want, just define their location in `CHIBIOS` and `CHIBIOS_CONTRIB` variables in your `Makefile`. - You will also need to install an ARM toolchain, for instance from [here](https://launchpad.net/gcc-arm-embedded). On linux, this is usually also present as a package for your distribution (as `gcc-arm` or something similar). On OS X, you can use [homebrew](http://brew.sh/) with an appropriate tap. ### Notes -- Some comments about ChibiOS syntax and the most commonly used GPIO functions are, as well as an example for ARM Teensies, is [here](https://github.com/tmk/tmk_keyboard/blob/master/keyboard/teensy_lc_onekey/instructions.md). +- Some comments about ChibiOS syntax and the most commonly used GPIO functions are, as well as an example for Teensies, is [here](https://github.com/tmk/tmk_keyboard/blob/master/keyboard/teensy_lc_onekey/instructions.md). - For gcc options, inspect `tmk_core/tool/chibios/chibios.mk`. For instance, I enabled `-Wno-missing-field-initializers`, because TMK common bits generated a lot of warnings on that. - For debugging, it is sometimes useful disable gcc optimisations, you can do that by adding `-O0` to `OPT_DEFS` in your `Makefile`. - USB string descriptors are messy. I did not find a way to cleanly generate the right structures from actual strings, so the definitions in individual keyboards' `config.h` are ugly as heck. diff --git a/protocol/chibios/usb_main.c b/protocol/chibios/usb_main.c index 106ce087..fbf0ceba 100644 --- a/protocol/chibios/usb_main.c +++ b/protocol/chibios/usb_main.c @@ -153,7 +153,7 @@ static const uint8_t keyboard_hid_report_desc_data[] = { 0x95, KBD_REPORT_KEYS, // Report Count (), 0x75, 0x08, // Report Size (8), 0x15, 0x00, // Logical Minimum (0), - 0x25, 0xFF, // Logical Maximum(255), + 0x26, 0xFF, 0x00, // Logical Maximum(255), 0x05, 0x07, // Usage Page (Key Codes), 0x19, 0x00, // Usage Minimum (0), 0x29, 0xFF, // Usage Maximum (255), @@ -299,7 +299,7 @@ static const uint8_t extra_hid_report_desc_data[] = { 0xa1, 0x01, // COLLECTION (Application) 0x85, REPORT_ID_SYSTEM, // REPORT_ID (2) 0x15, 0x01, // LOGICAL_MINIMUM (0x1) - 0x25, 0xb7, // LOGICAL_MAXIMUM (0xb7) + 0x26, 0xb7, 0x00, // LOGICAL_MAXIMUM (0xb7) 0x19, 0x01, // USAGE_MINIMUM (0x1) 0x29, 0xb7, // USAGE_MAXIMUM (0xb7) 0x75, 0x10, // REPORT_SIZE (16) diff --git a/protocol/lufa.mk b/protocol/lufa.mk index 87386be9..1b529bde 100644 --- a/protocol/lufa.mk +++ b/protocol/lufa.mk @@ -37,6 +37,10 @@ LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABL #LUFA_OPTS += -DINTERRUPT_CONTROL_ENDPOINT LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1 +# Remote wakeup fix for ATmega32U2 https://github.com/tmk/tmk_keyboard/issues/361 +ifeq ($(MCU),atmega32u2) + LUFA_OPTS += -DNO_LIMITED_CONTROLLER_CONNECT +endif OPT_DEFS += -DF_USB=$(F_USB)UL OPT_DEFS += -DARCH=ARCH_$(ARCH) @@ -44,3 +48,8 @@ OPT_DEFS += $(LUFA_OPTS) # This indicates using LUFA stack OPT_DEFS += -DPROTOCOL_LUFA + +ifeq (yes,$(strip $(LUFA_DEBUG_SUART))) + SRC += common/avr/suart.S + LUFA_OPTS += -DLUFA_DEBUG_SUART +endif diff --git a/protocol/lufa/descriptor.c b/protocol/lufa/descriptor.c index c13a81bd..4fb5219d 100644 --- a/protocol/lufa/descriptor.c +++ b/protocol/lufa/descriptor.c @@ -73,10 +73,10 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = HID_RI_OUTPUT(8, HID_IOF_CONSTANT), HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */ - HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */ - HID_RI_USAGE_MAXIMUM(8, 0xFF), /* Keyboard Application */ + HID_RI_USAGE_MINIMUM(8, 0x00), + HID_RI_USAGE_MAXIMUM(8, 0xFF), /* Usage ID 0x00-0xFF */ HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), /* needs 16 bit to indicate positive value */ HID_RI_REPORT_COUNT(8, 0x06), HID_RI_REPORT_SIZE(8, 0x08), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), @@ -140,9 +140,9 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = HID_RI_USAGE(8, 0x80), /* System Control */ HID_RI_COLLECTION(8, 0x01), /* Application */ HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), - HID_RI_LOGICAL_MINIMUM(16, 0x0001), + HID_RI_LOGICAL_MINIMUM(16, 0x0081), HID_RI_LOGICAL_MAXIMUM(16, 0x00B7), - HID_RI_USAGE_MINIMUM(16, 0x0001), /* System Power Down */ + HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */ HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */ HID_RI_REPORT_SIZE(8, 16), HID_RI_REPORT_COUNT(8, 1), @@ -172,13 +172,13 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = HID_RI_COLLECTION(8, 0x01), /* Application */ HID_RI_USAGE(8, 0x75), /* Vendor Usage 0x75 */ HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), HID_RI_REPORT_SIZE(8, 0x08), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), HID_RI_USAGE(8, 0x76), /* Vendor Usage 0x76 */ HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0xFF), + HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), HID_RI_REPORT_SIZE(8, 0x08), HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), diff --git a/protocol/lufa/descriptor.h b/protocol/lufa/descriptor.h index 42af0791..119f4298 100644 --- a/protocol/lufa/descriptor.h +++ b/protocol/lufa/descriptor.h @@ -155,7 +155,7 @@ typedef struct #define MOUSE_EPSIZE 8 #define EXTRAKEY_EPSIZE 8 #define CONSOLE_EPSIZE 32 -#define NKRO_EPSIZE 16 +#define NKRO_EPSIZE 32 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index beec6b2b..93fe9a2f 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 Jun Wako * This file is based on: * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse @@ -50,9 +50,18 @@ #include "suspend.h" #include "hook.h" +#ifdef LUFA_DEBUG_SUART +#include "avr/suart.h" +#endif + +#include "matrix.h" #include "descriptor.h" #include "lufa.h" + +//#define LUFA_DEBUG + + uint8_t keyboard_idle = 0; /* 0: Boot Protocol, 1: Report Protocol(default) */ uint8_t keyboard_protocol = 1; @@ -100,10 +109,10 @@ static void Console_Task(void) { /* Create a temporary buffer to hold the read in report from the host */ uint8_t ConsoleData[CONSOLE_EPSIZE]; - + /* Read Console Report Data */ Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); - + /* Process Console Report Data */ //ProcessConsoleHIDReport(ConsoleData); } @@ -164,7 +173,7 @@ void EVENT_USB_Device_Disconnect(void) print("[D]"); /* For battery powered device */ 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) { USB_Disable(); // Disable all interrupts USB_Controller_Enable(); @@ -175,18 +184,24 @@ void EVENT_USB_Device_Disconnect(void) void EVENT_USB_Device_Reset(void) { +#ifdef LUFA_DEBUG print("[R]"); +#endif } void EVENT_USB_Device_Suspend() { +#ifdef LUFA_DEBUG print("[S]"); +#endif hook_usb_suspend_entry(); } void EVENT_USB_Device_WakeUp() { +#ifdef LUFA_DEBUG print("[W]"); +#endif hook_usb_wakeup(); } @@ -217,6 +232,9 @@ void EVENT_USB_Device_StartOfFrame(void) */ void EVENT_USB_Device_ConfigurationChanged(void) { +#ifdef LUFA_DEBUG + print("[c]"); +#endif bool ConfigSuccess = true; /* Setup Keyboard HID Report Endpoints */ @@ -293,6 +311,9 @@ void EVENT_USB_Device_ControlRequest(void) /* Write the report data to the control endpoint */ Endpoint_Write_Control_Stream_LE(ReportData, ReportSize); Endpoint_ClearOUT(); +#ifdef LUFA_DEBUG + xprintf("[r%d]", USB_ControlRequest.wIndex); +#endif } break; @@ -316,6 +337,9 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_ClearOUT(); Endpoint_ClearStatusStage(); +#ifdef LUFA_DEBUG + xprintf("[L%d]", USB_ControlRequest.wIndex); +#endif break; } @@ -332,6 +356,9 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_Write_8(keyboard_protocol); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); +#ifdef LUFA_DEBUG + print("[p]"); +#endif } } @@ -345,6 +372,9 @@ void EVENT_USB_Device_ControlRequest(void) keyboard_protocol = (USB_ControlRequest.wValue & 0xFF); clear_keyboard(); +#ifdef LUFA_DEBUG + print("[P]"); +#endif } } @@ -356,6 +386,9 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_ClearStatusStage(); keyboard_idle = ((USB_ControlRequest.wValue & 0xFF00) >> 8); +#ifdef LUFA_DEBUG + xprintf("[I%d]%d", USB_ControlRequest.wIndex, (USB_ControlRequest.wValue & 0xFF00) >> 8); +#endif } break; @@ -367,6 +400,9 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_Write_8(keyboard_idle); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); +#ifdef LUFA_DEBUG + print("[i]"); +#endif } break; @@ -374,7 +410,7 @@ void EVENT_USB_Device_ControlRequest(void) } /******************************************************************************* - * Host driver + * Host driver ******************************************************************************/ static uint8_t keyboard_leds(void) { @@ -494,6 +530,9 @@ static void send_consumer(uint16_t data) #define SEND_TIMEOUT 5 int8_t sendchar(uint8_t c) { +#ifdef LUFA_DEBUG_SUART + xmit(c); +#endif // Not wait once timeouted. // Because sendchar() is called so many times, waiting each call causes big lag. static bool timeouted = false; @@ -551,6 +590,9 @@ ERROR_EXIT: #else int8_t sendchar(uint8_t c) { +#ifdef LUFA_DEBUG_SUART + xmit(c); +#endif return 0; } #endif @@ -578,13 +620,20 @@ static void setup_usb(void) // for Console_Task USB_Device_EnableSOFEvents(); - print_set_sendchar(sendchar); } int main(void) __attribute__ ((weak)); int main(void) { setup_mcu(); + +#ifdef LUFA_DEBUG_SUART + SUART_OUT_DDR |= (1< #include #include +#include "pbuff.h" #include "ps2.h" #include "ps2_io.h" #include "print.h" @@ -57,13 +58,6 @@ POSSIBILITY OF SUCH DAMAGE. uint8_t ps2_error = PS2_ERR_NONE; - -static inline uint8_t pbuf_dequeue(void); -static inline void pbuf_enqueue(uint8_t data); -static inline bool pbuf_has_data(void); -static inline void pbuf_clear(void); - - void ps2_host_init(void) { idle(); @@ -225,55 +219,3 @@ void ps2_host_set_led(uint8_t led) ps2_host_send(0xED); ps2_host_send(led); } - - -/*-------------------------------------------------------------------- - * Ring buffer to store scan codes from keyboard - *------------------------------------------------------------------*/ -#define PBUF_SIZE 32 -static uint8_t pbuf[PBUF_SIZE]; -static uint8_t pbuf_head = 0; -static uint8_t pbuf_tail = 0; -static inline void pbuf_enqueue(uint8_t data) -{ - uint8_t sreg = SREG; - cli(); - uint8_t next = (pbuf_head + 1) % PBUF_SIZE; - if (next != pbuf_tail) { - pbuf[pbuf_head] = data; - pbuf_head = next; - } else { - print("pbuf: full\n"); - } - SREG = sreg; -} -static inline uint8_t pbuf_dequeue(void) -{ - uint8_t val = 0; - - uint8_t sreg = SREG; - cli(); - if (pbuf_head != pbuf_tail) { - val = pbuf[pbuf_tail]; - pbuf_tail = (pbuf_tail + 1) % PBUF_SIZE; - } - SREG = sreg; - - return val; -} -static inline bool pbuf_has_data(void) -{ - uint8_t sreg = SREG; - cli(); - bool has_data = (pbuf_head != pbuf_tail); - SREG = sreg; - return has_data; -} -static inline void pbuf_clear(void) -{ - uint8_t sreg = SREG; - cli(); - pbuf_head = pbuf_tail = 0; - SREG = sreg; -} - diff --git a/protocol/usb_hid/parser.cpp b/protocol/usb_hid/parser.cpp index fe002c0d..94e747ca 100644 --- a/protocol/usb_hid/parser.cpp +++ b/protocol/usb_hid/parser.cpp @@ -4,30 +4,14 @@ #include "debug.h" -report_keyboard_t usb_hid_keyboard_report; -uint16_t usb_hid_time_stamp; - - void KBDReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) { - bool is_error = false; - report_keyboard_t *report = (report_keyboard_t *)buf; + ::memcpy(&report, buf, sizeof(report_keyboard_t)); + time_stamp = millis(); - dprintf("keyboard input: %02X %02X", report->mods, report->reserved); + dprintf("input %d: %02X %02X", hid->GetAddress(), report.mods, report.reserved); for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ERROR(report->keys[i])) { - is_error = true; - } - dprintf(" %02X", report->keys[i]); + dprintf(" %02X", report.keys[i]); } dprint("\r\n"); - - // ignore error and not send report to computer - if (is_error) { - dprint("Error usage! \r\n"); - return; - } - - ::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); - usb_hid_time_stamp = millis(); } diff --git a/protocol/usb_hid/parser.h b/protocol/usb_hid/parser.h index 703eb1ed..036281fa 100644 --- a/protocol/usb_hid/parser.h +++ b/protocol/usb_hid/parser.h @@ -2,11 +2,14 @@ #define PARSER_H #include "hid.h" +#include "report.h" class KBDReportParser : public HIDReportParser { public: - virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf); + report_keyboard_t report; + uint16_t time_stamp; + virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf); }; #endif diff --git a/protocol/vusb/main.c b/protocol/vusb/main.c index 0d809536..794e4000 100644 --- a/protocol/vusb/main.c +++ b/protocol/vusb/main.c @@ -20,6 +20,7 @@ #include "timer.h" #include "uart.h" #include "debug.h" +#include "suspend.h" #define UART_BAUD_RATE 115200 @@ -41,6 +42,23 @@ static void initForUsbConnectivity(void) sei(); } +void usb_remote_wakeup(void) { + cli(); + + int8_t ddr_orig = USBDDR; + USBOUT |= (1 << USBMINUS); + USBDDR = ddr_orig | USBMASK; + USBOUT ^= USBMASK; + + _delay_ms(25); + + USBOUT ^= USBMASK; + USBDDR = ddr_orig; + USBOUT &= ~(1 << USBMINUS); + + sei(); +} + int main(void) { bool suspended = false; @@ -70,19 +88,6 @@ int main(void) // Suspend when no SOF in 3ms-10ms(7.1.7.4 Suspending of USB1.1) if (timer_elapsed(last_timer) > 5) { suspended = true; -/* - uart_putchar('S'); - _delay_ms(1); - cli(); - set_sleep_mode(SLEEP_MODE_PWR_DOWN); - sleep_enable(); - sleep_bod_disable(); - sei(); - sleep_cpu(); - sleep_disable(); - _delay_ms(10); - uart_putchar('W'); -*/ } } #endif @@ -95,6 +100,8 @@ int main(void) keyboard_task(); } vusb_transfer_keyboard(); + } else if (suspend_wakeup_condition()) { + usb_remote_wakeup(); } } } diff --git a/protocol/vusb/vusb.c b/protocol/vusb/vusb.c index 7d0292ed..5d00165c 100644 --- a/protocol/vusb/vusb.c +++ b/protocol/vusb/vusb.c @@ -266,7 +266,7 @@ const PROGMEM uchar keyboard_hid_report[] = { 0x95, 0x06, // Report Count (6), 0x75, 0x08, // Report Size (8), 0x15, 0x00, // Logical Minimum (0), - 0x25, 0xFF, // Logical Maximum(255), + 0x26, 0xFF, 0x00, // Logical Maximum(255), 0x05, 0x07, // Usage Page (Key Codes), 0x19, 0x00, // Usage Minimum (0), 0x29, 0xFF, // Usage Maximum (255), @@ -336,7 +336,7 @@ const PROGMEM uchar mouse_hid_report[] = { 0xa1, 0x01, // COLLECTION (Application) 0x85, REPORT_ID_SYSTEM, // REPORT_ID (2) 0x15, 0x01, // LOGICAL_MINIMUM (0x1) - 0x25, 0xb7, // LOGICAL_MAXIMUM (0xb7) + 0x26, 0xb7, 0x00, // LOGICAL_MAXIMUM (0xb7) 0x19, 0x01, // USAGE_MINIMUM (0x1) 0x29, 0xb7, // USAGE_MAXIMUM (0xb7) 0x75, 0x10, // REPORT_SIZE (16) diff --git a/protocol/xt.h b/protocol/xt.h new file mode 100644 index 00000000..55efd75d --- /dev/null +++ b/protocol/xt.h @@ -0,0 +1,75 @@ +/* +Copyright 2010,2011,2012,2013 Jun WAKO +Copyright 2016 Ethan Apodaca + +This software is licensed with a Modified BSD License. +All of this is supposed to be Free Software, Open Source, DFSG-free, +GPL-compatible, and OK to use in both free and proprietary applications. +Additions and corrections to this file are welcome. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef XT_H +#define XT_H + +#include +#include "wait.h" +#include "xt_io.h" +#include "print.h" + +void xt_host_init(void); +uint8_t xt_host_recv(void); + + +/*-------------------------------------------------------------------- + * static functions + *------------------------------------------------------------------*/ +static inline uint16_t wait_clock_lo(uint16_t us) +{ + while (clock_in() && us) { asm(""); wait_us(1); us--; } + return us; +} +static inline uint16_t wait_clock_hi(uint16_t us) +{ + while (!clock_in() && us) { asm(""); wait_us(1); us--; } + return us; +} +static inline uint16_t wait_data_lo(uint16_t us) +{ + while (data_in() && us) { asm(""); wait_us(1); us--; } + return us; +} +static inline uint16_t wait_data_hi(uint16_t us) +{ + while (!data_in() && us) { asm(""); wait_us(1); us--; } + return us; +} + +#endif diff --git a/protocol/xt_interrupt.c b/protocol/xt_interrupt.c new file mode 100644 index 00000000..94b47db4 --- /dev/null +++ b/protocol/xt_interrupt.c @@ -0,0 +1,94 @@ +/* +Copyright 2010,2011,2012,2013 Jun WAKO + +This software is licensed with a Modified BSD License. +All of this is supposed to be Free Software, Open Source, DFSG-free, +GPL-compatible, and OK to use in both free and proprietary applications. +Additions and corrections to this file are welcome. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * PS/2 protocol Pin interrupt version + */ + +#include +#include +#include +#include "pbuff.h" +#include "xt.h" +#include "xt_io.h" +#include "wait.h" +#include "print.h" + +void xt_host_init(void) +{ + XT_INT_INIT(); + XT_INT_ON(); +} + +/* get data received by interrupt */ +uint8_t xt_host_recv(void) +{ + if (pbuf_has_data()) { + return pbuf_dequeue(); + } else { + return 0; + } +} + +ISR(XT_INT_VECT) +{ + static uint8_t state = 0; + static uint8_t data = 0; + + if (state == 0) { + if (data_in()) + state++; + } else if (state >= 1 && state <= 8) { + wait_clock_lo(20); + data >>= 1; + if (data_in()) + data |= 0x80; + if (state == 8) + goto END; + state++; + } else { + goto DONE; + } + goto RETURN; +END: + pbuf_enqueue(data); +DONE: + state = 0; + data = 0; +RETURN: + return; +} diff --git a/protocol/xt_io.h b/protocol/xt_io.h new file mode 100644 index 00000000..2e5f31b2 --- /dev/null +++ b/protocol/xt_io.h @@ -0,0 +1,7 @@ +#ifndef XT_IO_H +#define XT_IO_H + +bool clock_in(void); +bool data_in(void); + +#endif diff --git a/protocol/xt_io_avr.c b/protocol/xt_io_avr.c new file mode 100644 index 00000000..6cd153a1 --- /dev/null +++ b/protocol/xt_io_avr.c @@ -0,0 +1,34 @@ +#include +#include +#include + +/* Check port settings for clock and data line */ +#if !(defined(XT_CLOCK_PORT) && \ + defined(XT_CLOCK_PIN) && \ + defined(XT_CLOCK_DDR) && \ + defined(XT_CLOCK_BIT)) +# error "XT clock port setting is required in config.h" +#endif + +#if !(defined(XT_DATA_PORT) && \ + defined(XT_DATA_PIN) && \ + defined(XT_DATA_DDR) && \ + defined(XT_DATA_BIT)) +# error "XT data port setting is required in config.h" +#endif + +bool clock_in(void) +{ + XT_CLOCK_DDR &= ~(1< /dev/null 2>&1; do \ + echo -n "."; \ + sleep 1; \ + done + @echo + ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) dfu-programmer $(MCU) erase --force else diff --git a/tool/chibios/.gitignore b/tool/chibios/.gitignore index 88bbafe3..6be9cf9e 100644 --- a/tool/chibios/.gitignore +++ b/tool/chibios/.gitignore @@ -1,2 +1,2 @@ -chibios -chibios-contrib +ChibiOS +ChibiOS-Contrib diff --git a/tool/chibios/chibios.mk b/tool/chibios/chibios.mk index f2fedd22..88ba94ae 100644 --- a/tool/chibios/chibios.mk +++ b/tool/chibios/chibios.mk @@ -83,8 +83,8 @@ endif # # Imported source files and paths -CHIBIOS ?= $(TMK_DIR)/tool/chibios/chibios -CHIBIOS_CONTRIB ?= $(TMK_DIR)/tool/chibios/chibios-contrib +CHIBIOS ?= $(TMK_DIR)/tool/chibios/ChibiOS +CHIBIOS_CONTRIB ?= $(TMK_DIR)/tool/chibios/ChibiOS-Contrib # Startup files. Try a few different locations, for compability with old versions and # for things hardware in the contrib repository STARTUP_MK = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk diff --git a/tool/mbed/gcc.mk b/tool/mbed/gcc.mk index b8c7336b..596fbc8a 100644 --- a/tool/mbed/gcc.mk +++ b/tool/mbed/gcc.mk @@ -23,6 +23,7 @@ CC_FLAGS += \ -fdata-sections \ -fomit-frame-pointer CC_FLAGS += -MMD -MP +CC_FLAGS += $(OPT_DEFS) LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs #LD_FLAGS += -u _printf_float -u _scanf_float From 62e92645e6fd2d900e3a9c5b1fcfd2842ea55dc8 Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 10 Dec 2016 13:10:33 +0900 Subject: [PATCH 02/10] sun_usb: Turn out LED after matrix init --- converter/sun_usb/matrix.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/converter/sun_usb/matrix.c b/converter/sun_usb/matrix.c index c2b38ae0..0cea3700 100644 --- a/converter/sun_usb/matrix.c +++ b/converter/sun_usb/matrix.c @@ -75,6 +75,8 @@ void matrix_init(void) } } print(" Done\n"); + + PORTD &= ~(1<<6); return; } From af667a055030693d43ad6b77bb8a1b8b5a8762a7 Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 29 Sep 2016 10:29:44 +0900 Subject: [PATCH 03/10] adb_usb: set_led at startup --- .../adb_usb/binary/adb_usb_rev1_unimap.hex | 2242 ++++++++--------- .../adb_usb/binary/adb_usb_rev2_unimap.hex | 2226 ++++++++-------- converter/adb_usb/matrix.c | 3 + 3 files changed, 2237 insertions(+), 2234 deletions(-) diff --git a/converter/adb_usb/binary/adb_usb_rev1_unimap.hex b/converter/adb_usb/binary/adb_usb_rev1_unimap.hex index 0c5774ac..73bd26a1 100644 --- a/converter/adb_usb/binary/adb_usb_rev1_unimap.hex +++ b/converter/adb_usb/binary/adb_usb_rev1_unimap.hex @@ -1,17 +1,17 @@ -:100000000C945B050C94A2050C94A2050C94A2051B -:100010000C94A2050C94A2050C94A2050C94A205C4 -:100020000C94A2050C94A2050C94AB0F0C947D10BB -:100030000C94611E0C94A2050C94A2050C94A205CC -:100040000C94A2050C94A2050C94A2050C94A20594 -:100050000C94A2050C94D51E0C94A2050C94A20538 -:100060000C94A2050C94A2050C94A2050C94A20574 -:100070000C94A2050C94A2050C94A2050C94A20564 -:100080000C94A2050C94A2050C94A2050C94A20554 -:100090000C94A2050C94A2050C94A2050C94A20544 -:1000A0000C94A2050C94A2050C94A205EA100C1164 -:1000B000FA110C11FA1151117411FA11C911DC1154 -:1000C000501550157D157D15D81514160C180C18E3 -:1000D0002C160C1827172717E2170C180C18F817EE +:100000000C9458050C949F050C949F050C949F0527 +:100010000C949F050C949F050C949F050C949F05D0 +:100020000C949F050C949F050C94AC0F0C947E10BF +:100030000C94621E0C949F050C949F050C949F05D4 +:100040000C949F050C949F050C949F050C949F05A0 +:100050000C949F050C94D61E0C949F050C949F0540 +:100060000C949F050C949F050C949F050C949F0580 +:100070000C949F050C949F050C949F050C949F0570 +:100080000C949F050C949F050C949F050C949F0560 +:100090000C949F050C949F050C949F050C949F0550 +:1000A0000C949F050C949F050C949F05EB100D116B +:1000B000FB110D11FB1152117511FB11CA11DD114C +:1000C000511551157E157E15D91515160D180D18DB +:1000D0002D160D1828172817E3170D180D18F917E6 :1000E000041607090B0A1D1B06196405141A0815C6 :1000F0001C171E1F202123222E26242D25273012D7 :10010000182F0C13280F0D340E33313638111037D9 @@ -151,1113 +151,1113 @@ :10096000592045585452414B455920434F4E534FFF :100970004C4520434F4D4D414E44204B45594D4130 :10098000505F53454354494F4E20343039360A00A6 -:100990004255494C443A20383863393536312D6454 -:1009A00069727479202830393A30303A343820531B -:1009B00065702032362032303136290A00564944DB -:1009C0003A2030784645454428742E6D2E6B2E29EA -:1009D000205049443A203078304144422841444232 -:1009E000206B6579626F61726420636F6E766572E9 -:1009F00074657229205645523A20307830313031B2 -:100A00000A00444553433A20636F6E766572742042 -:100A1000414442206B6579626F61726420746F207B -:100A20005553420A000A092D2056657273696F6E8C -:100A3000202D0A000A6D6F7573653A206F66660A8D -:100A4000000A6D6F7573653A206F6E0A000A6B6558 -:100A500079626F6172643A206F66660A000A6B659C -:100A600079626F6172643A206F6E0A000A6D617478 -:100A70007269783A206F66660A000A6D617472695D -:100A8000783A206F6E0A000A64656275673A206FD3 -:100A90006E0A000A64656275673A206F66660A002E -:100AA0000A0A626F6F746C6F616465722E2E2E205D -:100AB00000433E20000011241FBECFEFDAE0DEBF6E -:100AC000CDBF04B603FE27C08091DC019091DD010B -:100AD000A091DE01B091DF018730904BA740B04B71 -:100AE000D1F41092DC011092DD011092DE0110921F -:100AF000DF0114BE84B7877F84BF0FB6F894A89532 -:100B000080916000886180936000109260000FBE49 -:100B1000E0E0F8E3099511E0A0E0B1E0ECE7FEE4E5 -:100B200002C005900D92A433B107D9F721E0A4E3E8 -:100B3000B1E001C01D92AC3DB207E1F70E94DA0CB2 -:100B40000C943C270C940000FF93EF93E091340148 -:100B5000F0913501309709F00995EF91FF910895D3 -:100B6000FC018591803011F0EFDFFBCF0895FF2766 -:100B7000E0E230E247FF0CC0419597FF09C0EDE28B -:100B80006095709580959095611D711D811D911DD9 -:100B900027FF02C0219530E350E2AA27660F771F96 -:100BA000881F991FAA1FA41710F0A41B63955A95BC -:100BB000A9F7AA3008F0A95FA05DAF93F39561157E -:100BC00071058105910541F7ED3211F4EF93F3952D -:100BD000F21718F43F93F395FBCF8F91B5DFFA9599 -:100BE000E1F70895E991F9918591803021F08532FE -:100BF00019F0AADFF9CF089520E0E8945591553215 -:100C0000C1F3503311F4689455915A3348F450535A -:100C100090F3220F022E220F220F200D250FF4CF6A -:100C20000EF4219589919991533619F3533729F18F -:100C3000533559F1BC0188279927E8945C3621F493 -:100C40008991999168945591543639F446EF7EF024 -:100C500077FF0DC08FEF9FEF0AC055374AE039F09C -:100C6000583540E121F0523642E009F00895FF93F3 -:100C7000EF937DDFEF91FF91B7CFFF93EF93FC01EF -:100C800081918030B9F360DFFBCFFF93EF9368DF92 -:100C9000F1CFDF93CF93CDB7DEB72596A3DFCF910A -:100CA000DF910895282F2770E82FE695E695E695C1 -:100CB000EF70F0E0E95CFE4F87FF0AC081E090E052 -:100CC00001C0880F2A95EAF780959081892308C092 -:100CD00081E090E001C0880F2A95EAF79081892B86 -:100CE000808381E080934C0108950F931F93CF93ED -:100CF000DF93569A5E9A0E94BE092FEF87EA91E62B -:100D0000215080409040E1F700C0000088E892E068 -:100D10009F938F930E9449060F900F90C1E0D0E0FF -:100D20000EE612E063E08C2F0E94C209009771F07A -:100D30009F938F93DF93CF931F930F930E94490646 -:100D40000F900F900F900F900F900F909FEF29EF43 -:100D500080E0915020408040E1F700C000002196E3 -:100D6000C031D105F9F663E082E00E94C209813109 -:100D7000910511F170F487309105F1F020F404979A -:100D80000297F0F419C089309105B1F00D97C1F4C4 -:100D900013C08D31910581F030F48431910561F0FB -:100DA000499771F409C0843C910531F0873C910565 -:100DB00019F0813C910521F481E080934D0102C03E -:100DC00010924D0163E087E00E94C20991E08230F9 -:100DD00009F090E090934E01992341F08BE592E069 -:100DE0009F938F930E9449060F900F9023E042E05B -:100DF00063E082E00E94420A8EE492E09F938F9328 -:100E00000E9449060F900F90C1E0D0E004E312E089 -:100E100063E08C2F0E94C209009771F09F938F931B -:100E2000DF93CF931F930F930E9449060F900F906B -:100E30000F900F900F900F908FEF99EF20E081505F -:100E400090402040E1F700C000002196C031D1055C -:100E5000F9F6E7E3F1E080E18E0F11928E13FDCFFA -:100E60008091BE0181608093BE0184E292E00E9485 -:100E7000B005569A5E98DF91CF911F910F9108951A -:100E8000CF93DF938FE79BEB0197F1F700C0000052 -:100E90000E943E0AEC01009711F481E0C3C097FD67 -:100EA00005C080914701816080934701D7FF05C04D -:100EB000809147018E7F809347012D2F33272F7319 -:100EC0003327BE016F737727C6FF02C060547109D4 -:100ED000D6FF02C02054310940913601042E000C87 -:100EE000550B649FC001659F900D749F900D112458 -:100EF00081386FEF960714F481E89FEF9195819503 -:100F0000910981386FEF960714F481E89FEF81957E -:100F100080934801249FC001259F900D349F900D20 -:100F2000112481382FEF920714F481E89FEF9195F7 -:100F30008195910981386FEF960714F481E89FEF4E -:100F40008195809349018091BE0183FF60C08EE04E -:100F500092E00E94B005DF93CF9388E092E09F93E8 -:100F60008F930E94490686E092E00E94B00585EFCB -:100F700091E00E94B00580913601282F082E000CC8 -:100F8000330B3F938F9380EF91E09F938F930E9459 -:100F900049068EEE91E00E94B005809147011F92B4 -:100FA0008F9389EE91E09F938F930E94490687EE7D -:100FB00091E00E94B00580914801282F082E000C76 -:100FC000330B3F938F9384EE91E09F938F930E9416 -:100FD000490682EE91E00E94B00580914901282FD8 -:100FE000082E000C330B3F938F938FED91E09F936E -:100FF0008F930E9449068CED91E00E94B0058DB759 -:101000009EB744960FB6F8949EBF0FBE8DBF87E47F -:1010100091E00E946C128091360191E088300CF0D2 -:1010200090E0890F80933601DF91CF9108951F934F -:10103000CF93DF9310924C01C0910001D091010138 -:101040008FEF9FEF9093010180930001CF3F8FEFCF -:10105000D80709F06AC08FE79BEB0197F1F700C052 -:10106000000082E00E943B0AEC01892B09F05DC080 -:1010700080914E01882309F458C087E00E943B0A02 -:10108000009709F452C09C012F7733272230310595 -:10109000A1F048F42115310569F02130310599F4AA -:1010A00080788A641AC02330310551F02F3731051A -:1010B000A1F009C08078826410C0807889640DC076 -:1010C000807888640AC089EC91E09F938F930E9496 -:1010D00049060F900F9081E18FC0292F33272F777A -:1010E00033272130310579F050F02230310579F085 -:1010F0002330310581F4EC01D078D86416C0EC01BE -:10110000D078D26412C0EC01D078DA640EC0EC0161 -:10111000D078D9640AC086EB91E09F938F930E94A8 -:1011200049060F900F9080E167C08091BE0181FF5A -:1011300018C0209709F45DC082EA91E00E94B005D2 -:10114000DF93CF938DE991E09F938F930E9449069F -:101150008BE991E00E94B0050F900F900F900F90D7 -:1011600003C0209709F445C0CF379FE7D90711F492 -:101170008FE705C0CF3F8FEFD80721F48FEF0E9494 -:10118000520639C02D2F3327822F1C2F2F3F3105B8 -:1011900081F4DF93CF938DE791E09F938F930E942B -:1011A00049060E9475060F900F900F900F908C2F9C -:1011B00023C090914D01992381F0A9014F775527C4 -:1011C0004233510521F42078822F8A6006C04A30CC -:1011D000510519F42078822F82630E9452061F3F26 -:1011E00051F0DC2FCC27CF6FD0930101C0930001C9 -:1011F00002C080E001C081E0DF91CF911F9108958E -:10120000E82FF0E0E95CFE4F2081822F90E021E0A2 -:1012100030E002C0220F331F6A95E2F728233923FA -:1012200081E0232B09F480E00895E82FF0E0E95CE9 -:10123000FE4F80810895CF92DF92EF92FF920F933D -:101240001F93CF93DF938091BE0181FF35C08FE65E -:1012500091E00E94B00587E3E82E81E0F82EC0E01F -:10126000D0E09AE6C92E91E0D92E02E611E0DF9394 -:10127000CF93DF92CF920E94490687E691E00E94C9 -:10128000B005F70181917F010E94F61D1F928F9397 -:101290001F930F930E94490680E691E00E94B005DB -:1012A00021968DB79EB708960FB6F8949EBF0FBED5 -:1012B0008DBFC031D105D9F6DF91CF911F910F912C -:1012C000FF90EF90DF90CF900895682F609582E0B7 -:1012D0000C947C0A509A83E091E00197F1F700C0EA -:1012E000000050989AEB9A95F1F700C00895509A33 -:1012F0008AEB8A95F1F700C0509883E091E001975E -:10130000F1F700C000000895EF92FF920F931F9332 -:10131000CF93DF93C0E0D0E090E8E92EF12C082FC6 -:1013200010E0C7010C2E02C0959587950A94E2F74C -:1013300080239123892B19F00E94770902C00E9413 -:101340006A092196C830D10561F7DF91CF911F91CD -:101350000F91FF90EF900895489B06C023E02A95D7 -:10136000F1F700000197C1F70895489906C023E0FE -:101370002A95F1F700000197C1F708955898509801 -:1013800008950895CF92DF92EF92FF920F931F93EB -:10139000CF93DF931F92CDB7DEB7182FF894509AF2 -:1013A00083EF9BE00197F1F700C0000069830E9482 -:1013B000770969816C6020E1129FC0011124862B9E -:1013C0000E9484090E946A0984EF91E00E94B50995 -:1013D000892B21F4789482EE9FEF43C084EF91E053 -:1013E0000E94AC09009711F478943BC011E1C12C24 -:1013F000D12C02E882E890E00E94B5097C018823A4 -:1014000051F199270E94AC09882329F1CC0CDD1CED -:10141000902F9E19E81A9E1518F46894C0F806C01B -:10142000113121F478948CEE9FEF1BC0115011F70D -:101430008FE591E00E94B509892B21F478948BEE19 -:101440009FEF0FC08BE590E00E94AC09892BB1F7AC -:101450007894C60106C07894812F90E0919581958B -:1014600091090F90DF91CF911F910F91FF90EF9015 -:10147000DF90CF90089560E00C94C20960E083E0B3 -:101480000C94C2091F93CF93DF9300D01F92CDB766 -:10149000DEB7182FF894509A83EF9BE00197F1F78D -:1014A00000C000002B834A8369830E947709698109 -:1014B000686030E1139FC0011124862B0E948409CB -:1014C0000E946A098FE193E00197F1F700C00000E4 -:1014D0000E9477094A81842F0E9484092B81822FE0 -:1014E0000E9484090E946A0978940F900F900F90CF -:1014F000DF91CF911F910895262F277040E062E081 -:101500000C94420A80915A0108959FB7F894109262 -:1015100051019FBF9091D301943009F057C0909131 -:10152000E9009F703091EC00232F217030FD20E8FE -:10153000922B24E02093E9002091EB0020FF43C090 -:101540002091EE0027FF3FC020914F01222321F080 -:101550002091E80025FF37C010924F0126E030911E -:10156000E80035FD15C03091D301343061F530917C -:10157000EB0035FD28C0215021F481E080934F011C -:1015800022C0EFE9FFE03197F1F700C00000E7CF9C -:101590008093F1008091E80085FD0AC08091E80009 -:1015A00080FFFCCF8091E8008E778093E80006C032 -:1015B0008FB7F89421E0209351018FBF9F709093D3 -:1015C000E90080E008959F709093E9008FEF0895FF -:1015D000CF93DF9300D01F92CDB7DEB79C018091EF -:1015E000D301843019F593E099833B832A83909348 -:1015F000E9008FEF9091E800815095FD06C095EDD0 -:101600009A95F1F700008111F5CF8091E80085FFF0 -:101610000DC040E050E063E070E0CE0101960E9412 -:101620009B0D8091E8008E778093E8000F900F90DB -:101630000F90DF91CF910895CF93DF9300D01F9249 -:10164000CDB7DEB72091D301243021F522E02983E4 -:101650009B838A8383E08093E9008FEF9091E80079 -:10166000815095FD06C095ED9A95F1F70000811126 -:10167000F5CF8091E80085FF0DC040E050E063E0C9 -:1016800070E0CE0101960E949B0D8091E8008E775C -:101690008093E8000F900F900F90DF91CF91089505 -:1016A0002091D3012430F1F422E02093E9002FEFC0 -:1016B0003091E800215035FD06C035ED3A95F1F73F -:1016C00000002111F5CF2091E80025FF0BC040E07C -:1016D00050E065E070E00E949B0D8091E8008E77FD -:1016E0008093E8000895CF93DF932091D3012430B5 -:1016F00039F521E02093E9002FEF3091E8002150E7 -:1017000035FD06C035ED3A95F1F700002111F5CF12 -:101710002091E80025FF14C0EC0140E050E068E0B3 -:1017200070E00E949B0D8091E8008E778093E80026 -:1017300088E0FE01A2E5B1E001900D928A95E1F703 -:10174000DF91CF9108958CEC92E00E94B0058091DA -:10175000D201811109C00E94300F0E948D0F80912B -:10176000E20084608093E200089588EC92E00E9499 -:10177000B0051092D201089584EC92E00C94B0056B -:10178000209150012F5F822F62E30E94022799234C -:1017900019F0209350010895109250018091510149 -:1017A000882371F18091D301843041F58091E90063 -:1017B0008F702091EC00922F917020FD90E8892B82 -:1017C00094E09093E9009091EB0090FF14C0909109 -:1017D000EE0097FF10C09091E80095FF03C01092B3 -:1017E000F100F9CF9091E80090FF05C09091E800DA -:1017F0009E779093E8008F708093E90010925101DA -:10180000089542E061EC81E00E94AA0E42E061ECA2 -:1018100082E00E94AA0E42E061EC83E00E94AA0EE0 -:1018200042E261EC84E00C94AA0E8091D5018330F1 -:1018300009F453C030F4813071F0823009F48CC067 -:1018400008958A3009F478C08B3009F45EC089307D -:1018500009F09AC020C08091D401813A09F094C067 -:101860008091E800877F8093E8008091D801909173 -:10187000D901892B21F468E082E591E003C060E0A2 -:1018800080E090E070E00E94E60D8091E8008B77A8 -:101890008093E80008958091D401813209F074C0EA -:1018A0008091D8019091D901892B09F06DC0809168 -:1018B000E800877F8093E8008091E80082FD05C002 -:1018C0008091D3018111F8CF5FC08091F1008093A6 -:1018D0005A018091E8008B7753C08091D401813AFE -:1018E00009F052C08091D8019091D901892B09F05B -:1018F0004BC08091E800877F8093E8008091E800EA -:1019000080FFFCCF80910C0136C08091D4018132E0 -:10191000D9F58091D8019091D901892BA9F58091B1 -:10192000E800877F8093E8000E94DF0E8091D60157 -:1019300080930C010C942D188091D401813221F5F3 -:101940008091E800877F8093E8000E94DF0E8091FD -:10195000D70180935B0108958091D401813AA1F46D -:101960008091E800877F8093E8008091E80080FF05 -:10197000FCCF80915B018093F1008091E8008E772D -:101980008093E8000C94DF0E08950895089508955B -:1019900080EC92E00E94B0050C94C70C0E94201EBF -:1019A0008091D101882329F00E944B1E81110C9453 -:1019B000850D089584B7877F84BF0FB6F894A895E6 -:1019C00080916000886180936000109260000FBE7B -:1019D00090E080E80FB6F8948093610090936100E6 -:1019E0000FBE0E94C50C0E94A4120E94300F0E94DC -:1019F0008D0F8091E20084608093E20085E89AE098 -:101A00000E94F11D78948091D3018430E1F78BEA34 -:101A100092E00E94B0050E94A61282E091E00E942E -:101A200012128AE992E00E94B0050E94C60C8091D1 -:101A3000D301853039F486E992E00E94B0050E9416 -:101A4000CE0CF5CF0E94AC12F2CF0C945F1E8CEB43 -:101A500092E00E94B0050C94250D292F33272330E6 -:101A60003105C9F064F42130310581F022303105AF -:101A700009F043C084E790E024E133E042C0213222 -:101A80003105F1F02232310541F137C082E190E0B9 -:101A900028E833E036C099278130910541F0823043 -:101AA000910541F0892B49F5E0E1F3E005C0E0E064 -:101AB000F3E002C0E0EDF2E0849190E09F0121C0EC -:101AC0006430D8F4E62FF0E0EE0FFF1FEF5DFE4F1D -:101AD0002081318189E090E014C0643070F470E0BE -:101AE000FB01EE0FFF1FE75EFE4F20813181FB01FE -:101AF000EB5EFE4F808190E004C080E090E020E04B -:101B000030E0FA0131832083089580E189BD82E1CC -:101B100089BD09B400FEFDCF8091D8008F7D8093F0 -:101B2000D8008091E00082608093E0008091E00026 -:101B300081FDFCCF0895CF92DF92EF92FF920F9339 -:101B40001F93CF93DF93EC018B016A010E94FE0E7D -:101B5000811133C0C114D10439F0F6018081918123 -:101B6000081B190BC80FD91FE12CF12C0115110509 -:101B700019F18091E80085FD16C08091E8008E770C -:101B80008093E800C114D10449F0F601808191816D -:101B9000E80EF91EF182E08285E00FC00E94FE0E81 -:101BA000882321F30AC089918093F1000150110923 -:101BB000FFEFEF1AFF0ADACF80E0DF91CF911F919C -:101BC0000F91FF90EF90DF90CF9008952091DA0170 -:101BD0003091DB012617370748F06115710539F49C -:101BE0002091E8002E772093E80001C0B90140E081 -:101BF00061157105A9F12091D301222309F443C095 -:101C0000253009F442C02091E80023FD40C0209116 -:101C1000E80022FD32C02091E80020FFE9CF40918A -:101C2000F3002091F20030E0342BFC01CF0161156C -:101C3000710559F02830310540F481918093F1000D -:101C4000615071092F5F3F4FF1CF41E028303105DE -:101C500009F040E02091E8002E772093E800C8CFFB -:101C60004111C9CF0AC08091D301882361F085302A -:101C700061F08091E80083FD0AC08091E80082FF56 -:101C8000F2CF80E0089582E0089583E0089581E036 -:101C900008952091DA013091DB012617370748F0CB -:101CA0006115710539F42091E8002E772093E80042 -:101CB00001C0B901FC0120E06115710591F180912D -:101CC000D301882309F440C0853009F43FC08091D6 -:101CD000E80083FD3DC08091E80082FD2FC0809127 -:101CE000E80080FFE9CF2091F3008091F20090E0BE -:101CF000922B6115710559F08830910540F42491BB -:101D00002093F1003196615071090196F2CF21E0E4 -:101D1000089709F020E08091E8008E778093E80032 -:101D2000CBCF2111CCCF0AC08091D301882361F0A1 -:101D3000853061F08091E80083FD0AC08091E80061 -:101D400082FFF2CF80E0089582E0089583E0089555 -:101D500081E00895982F973058F59093E9009817EF -:101D600039F07091EC002091ED005091F00003C02B -:101D7000242F762F50E021FF19C03091EB003E7FD9 -:101D80003093EB003091ED003D7F3093ED003091CA -:101D9000EB0031603093EB007093EC002093ED008A -:101DA0005093F0002091EE0027FF07C09F5FD3CF34 -:101DB0008F708093E90081E0089580E0089580911C -:101DC000D40187FF11C08091E80082FD05C0809199 -:101DD000D3018111F8CF11C08091E8008B770BC03F -:101DE0008091D301882349F08091E80080FFF8CFEB -:101DF0008091E8008E778093E80008952091E400B8 -:101E00003091E50095E64091EC00842F817040FF11 -:101E100022C08091E80080FD1CC08091D3018823FE -:101E200091F0853091F08091EB0085FD10C04091DC -:101E3000E4005091E5004217530729F39A019150AD -:101E400011F784E0089582E0089583E0089581E029 -:101E5000089580E008954091E80042FFDECF0895A4 -:101E60000E949E0F0E94A60FE0EEF0E0808181604C -:101E70008083E8EDF0E080818F77808319BCA7ED47 -:101E8000B0E08C918E7F8C9380818F7E80831092C6 -:101E9000D20108950F931F93CF93DF930E949E0F5B -:101EA0000E94A60FC8EDD0E088818F778883888153 -:101EB0008068888388818F7D888319BC1092D301C4 -:101EC0001092CF011092D1011092D00100EE10E0DB -:101ED000F80180818B7F808388818160888342E0E4 -:101EE00060E080E00E94AA0EE1EEF0E080818E7F4B -:101EF0008083E2EEF0E08081816080838081886071 -:101F00008083F80180818E7F8083888180618883CF -:101F1000DF91CF911F910F910895E8EDF0E080815E -:101F20008F7E8083E7EDF0E080818160808384E0B4 -:101F300082BF81E08093D2010C944A0FE8EDF0E07B -:101F400080818E7F80831092E20008951092DA00E3 -:101F50001092E10008951F920F920FB60F92112474 -:101F60002F933F934F935F936F937F938F939F93A1 -:101F7000AF93BF93EF93FF938091E10082FF0BC07B -:101F80008091E20082FF07C08091E1008B7F809307 -:101F9000E1000E94C00B8091DA0080FF1FC0809199 -:101FA000D80080FF1BC08091DA008E7F8093DA001A -:101FB0008091D90080FF0DC080E189BD82E189BD9B -:101FC00009B400FEFDCF81E08093D3010E94A30BF2 -:101FD00005C019BC1092D3010E94B50B8091E1009D -:101FE00080FF19C08091E20080FF15C08091E2005F -:101FF0008E7F8093E2008091E20080618093E20016 -:102000008091D80080628093D80019BC85E08093CD -:10201000D3010E94C80C8091E10084FF30C0809100 -:10202000E20084FF2CC080E189BD82E189BD09B452 -:1020300000FEFDCF8091D8008F7D8093D8008091E5 -:10204000E1008F7E8093E1008091E2008F7E80939B -:10205000E2008091E20081608093E2008091CF01F4 -:10206000882311F084E007C08091E30087FD02C05F -:1020700081E001C083E08093D3010E94270D80910D -:10208000E10083FF29C08091E20083FF25C0809199 -:10209000E100877F8093E10082E08093D30110927A -:1020A000CF018091E1008E7F8093E1008091E2007A -:1020B0008E7F8093E2008091E20080618093E20055 -:1020C00042E060E080E00E94AA0E8091F00088600B -:1020D0008093F0000E94BC0BFF91EF91BF91AF91F4 -:1020E0009F918F917F916F915F914F913F912F9130 -:1020F0000F900FBE0F901F9018951F920F920FB662 -:102100000F9211242F933F934F935F936F937F937D -:102110008F939F93AF93BF93CF93DF93EF93FF93EF -:10212000C091E900CF708091EC00D82FD17080FD74 -:10213000D0E81092E9008091F000877F8093F00052 -:1021400078940E94C1101092E9008091F00088609C -:102150008093F000CD2BCF70C093E900FF91EF91F9 -:10216000DF91CF91BF91AF919F918F917F916F91AF -:102170005F914F913F912F910F900FBE0F901F9045 -:1021800018951F93CF93DF93CDB7DEB7AA970FB6FD -:10219000F894DEBF0FBECDBFE4EDF1E088E08E0F16 -:1021A0009091F10091938E13FBCF0E94150C8091BA -:1021B000E80083FF1FC18091D4019091D501492F80 -:1021C00050E04A30510508F015C1FA01EA5AFF4FB4 -:1021D0000C942227803881F0823809F00BC180915D -:1021E000D8018F708093E9008091EB0085FB8827F0 -:1021F00080F91092E90006C08091D0019091D10140 -:10220000911182609091E800977F9093E80080930D -:10221000F1001092F100C8C0282F2D7F09F0EAC00C -:10222000882319F0823061F0E5C08091D6018130B9 -:1022300009F0E0C0933009F080E08093D1012BC019 -:102240008091D601811127C08091D8018F7009F447 -:10225000D1C08093E9002091EB0020FF1CC0933097 -:1022600021F48091EB00806214C09091EB009061AA -:102270009093EB0021E030E0A90102C0440F551F0C -:102280008A95E2F74093EA001092EA008091EB0011 -:1022900088608093EB001092E9008091E800877FCE -:1022A00086C08111A7C01091D6011F778091E300ED -:1022B0008078812B8093E3008091E800877F809372 -:1022C000E8000E94DF0E8091E80080FFFCCF809143 -:1022D000E30080688093E300111102C082E001C036 -:1022E00083E08093D30186C08058823008F082C09A -:1022F0008091D6019091D7018C3D53E0950779F5F7 -:1023000083E08A838AE289834FB7F894DE011396CB -:1023100020E03EE051E2E32FF0E050935700E491DB -:1023200020FF03C0E295EF703F5FEF708E2F90E0CB -:10233000EA3010F0C79601C0C0968D939D932F5F31 -:10234000243149F74FBF8091E800877F8093E800F0 -:102350006AE270E0CE0101960E94E60D14C0AE0163 -:102360004F5F5F4F6091D8010E942D0DBC01892BFA -:1023700009F440C09091E800977F9093E80089812C -:102380009A810E94490E8091E8008B778093E80043 -:1023900031C0803879F58091E800877F8093E8002C -:1023A0008091CF018093F1008091E8008E77809337 -:1023B000E8000E94DF0E1EC081111CC09091D60162 -:1023C0009230C0F48091E800877F8093E80090937A -:1023D000CF010E94DF0E8091CF01811106C0809154 -:1023E000E30087FD02C081E001C084E08093D30157 -:1023F0000E94010C8091E80083FF0AC08091E800F0 -:10240000877F8093E8008091EB0080628093EB00EF -:10241000AA960FB6F894DEBF0FBECDBFDF91CF9165 -:102420001F91089590936101809360010895E09158 -:102430006001F0916101309721F00190F081E02D71 -:10244000099480E00895EF92FF920F931F93CF932A -:10245000DF93E0916001F09161013097B1F18C015F -:102460000280F381E02D09958091BE0182FF2DC08D -:1024700080FF04C087E894E00E94B005E80118E0FE -:1024800081E8E82E84E0F82E8091BE0180FF0BC029 -:1024900088811F928F93FF92EF920E9449060F90BE -:1024A0000F900F900F90115021961111EDCF809148 -:1024B000BE0180FF0AC08FE794E0DF91CF911F91AA -:1024C0000F91FF90EF900C94B005DF91CF911F9189 -:1024D0000F91FF90EF900895E0916001F0916101FC -:1024E000309721F00480F581E02D09940895209122 -:1024F0005E0130915F018217930771F090935F0145 -:1025000080935E01E0916001F0916101309721F0CC -:102510000680F781E02D0994089520915C013091A7 -:102520005D018217930771F090935D0180935C01C8 -:10253000E0916001F0916101309721F00084F18514 -:10254000E02D0994089508950C94A3120E948A1E08 -:102550000E9475060C94C109CF92DF92EF92FF9210 -:102560000F931F93CF93DF9300D000D000D0CDB74F -:10257000DEB70E94170883E6C82E81E0D82E00E05F -:1025800010E0E02E802F0E941509F60141916F01A5 -:10259000F42EF826B1F40F5F1F4F0031110589F7B3 -:1025A0008FEF89838A831B820E94931E8160782F1C -:1025B0009D838C8349815A816B818D810E946D132B -:1025C00047C09091BE0191FF04C08E830E941B09F9 -:1025D0008E8120E030E04F2D50E0922FBA01022E84 -:1025E00002C0759567950A94E2F760FF2BC02983B6 -:1025F000EA8221E030E0690102C0CC0CDD1C9A9532 -:10260000E2F790E08C219D21892B09F420E02B83B7 -:102610000E94931E8160782F9D838C8349815A810B -:102620006B818D810E946D1349815A816B817C8100 -:102630008D810E940D1EF801ED59FE4F8081C82644 -:10264000C08206C02F5F3F4F2830310531F6A3CF3F -:102650000E940C1E0E9454210E94400710916201AA -:102660000E941712181741F10E94171280936201FD -:102670009091BE0192FF0EC090FF0CC01F928F93ED -:1026800089E994E09F938F930E9449060F900F90E1 -:102690000F900F908091620126960FB6F894DEBFDE -:1026A0000FBECDBFDF91CF911F910F91FF90EF90A3 -:1026B000DF90CF900C941E1E26960FB6F894DEBFC6 -:1026C0000FBECDBFDF91CF911F910F91FF90EF9083 -:1026D000DF90CF9008950C946509CF93DF93CDB729 -:1026E000DEB72B970FB6F894DEBF0FBECDBF942F89 -:1026F0004F83252F588769877A878B874A855B8523 -:10270000452B21F02F3F09F59F3FF9F4DE0111968B -:1027100086E0FD0111928A95E9F785E0FE01379682 -:1027200001900D928A95E1F749815A816B817C81F4 -:102730008D819E810E94C71A2B960FB6F894DEBF3A -:102740000FBECDBFDF91CF9108954F815885698528 -:102750007A858B850E940D1ED9CFCF93882309F4EB -:10276000E8C0C82F8238A1F40E94171281FDE1C091 -:1027700089E30E94521D0E94CB1D2FEF81EE94E051 -:10278000215080409040E1F700C0000089E315C06F -:102790008338C1F40E94171280FDCBC083E50E94EC -:1027A000521D0E94CB1D2FEF81EE94E021508040FE -:1027B0009040E1F700C0000083E50E946F1DCF91BB -:1027C0000C94CB1D8438A1F40E94171282FDB1C075 -:1027D00087E40E94521D0E94CB1D2FEF81EE94E0F2 -:1027E000215080409040E1F700C0000087E4E5CF31 -:1027F0008CEF8C0F813A48F48C2F0E947E2481113B -:1028000098C08C2F0E94521DDACF80E28C0F883046 -:1028100048F4C77081E001C0880FCA95EAF70E94AA -:10282000911DCDCF8BE58C0F833078F4C53A29F01C -:10283000C63A31F083E890E005C081E890E002C03C -:1028400082E890E0CF910C94771288E58C0F853167 -:1028500008F06FC0C83A61F1C93A69F1CA3A71F13A -:10286000CB3A79F1CC3A81F1CD3A89F1CE3A91F176 -:10287000CF3A99F1C13BA1F1C03BA9F1C23BB1F103 -:10288000C33BB9F1C43BC1F1C53BC9F1C63BD1F172 -:10289000C73BD9F1C83BE1F1C93BE9F1CA3BF1F1D2 -:1028A000CB3BF9F1CC3B09F43FC080E090E03EC067 -:1028B00082EE90E03BC089EE90E038C08AEE90E076 -:1028C00035C085EB90E032C086EB90E02FC083EB03 -:1028D00090E02CC084EB90E029C087EB90E026C00C -:1028E0008CEC90E023C08DEC90E020C083E891E078 -:1028F0001DC08AE891E01AC082E991E017C084E91E -:1029000091E014C081E292E011C083E292E00EC037 -:1029100084E292E00BC085E292E008C086E292E099 -:1029200005C087E292E002C08AE292E0CF910C9467 -:102930008D12CF910895882309F466C08238A1F4DE -:102940000E94171281FF60C089E30E94521D0E94FD -:10295000CB1D2FEF81EE94E0215080409040E1F7B5 -:1029600000C0000089E315C08338B9F40E94171233 -:1029700080FF4AC083E50E94521D0E94CB1D2FEFAD -:1029800081EE94E0215080409040E1F700C00000CB -:1029900083E50E946F1D0C94CB1D8438A1F40E9426 -:1029A000171282FF31C087E40E94521D0E94CB1D86 -:1029B0002FEF81EE94E0215080409040E1F700C07D -:1029C000000087E4E6CF9CEF980F913A10F390E275 -:1029D000980F983050F4877091E001C0990F8A9554 -:1029E000EAF7892F0E94971DD6CF9BE5980F933069 -:1029F00020F480E090E00C947712885A853120F41E -:102A000080E090E00C948D120895882321F00E94BC -:102A1000911D0C94CB1D0895882321F00E94971DD1 -:102A20000C94CB1D0895CF92DF92EF92FF920F93FB -:102A30001F93CF93DF9300D000D000D0CDB7DEB787 -:102A400025E0FC01DE01119601900D922A95E1F737 -:102A5000FC0140813181F280258122952F706381B4 -:102A60007481672B09F4D8C23F3F19F44F3F09F432 -:102A7000D3C26C0149833A8389819A812E830E9453 -:102A8000111D182F092F0E94101D0E94201CE02FDD -:102A9000E295EF70F0E0E05AFF4F2E810C94222770 -:102AA000802F807F902F9F70092F882311F002952F -:102AB000007FFF2049F0002309F45FC2802F0E94AD -:102AC000A41D0E94CB1D59C2812F0E949B1400237C -:102AD00009F4A2C2802F0E94AA1D26960FB6F89470 -:102AE000DEBF0FBECDBFDF91CF911F910F91FF9041 -:102AF000EF90DF90CF900C94CB1D802F807F902F94 -:102B00009F70092F803211F00295007F112319F078 -:102B1000113001F129C0FF20A9F0802F222349F1B3 -:102B2000213039F526960FB6F894DEBF0FBECDBF23 -:102B3000DF91CF911F910F91FF90EF90DF90CF9099 -:102B40000C94B41D222319F0213009F465C20E94AF -:102B5000B71D2CC0FF20E9F0263008F05DC20E94AE -:102B60008E1D802329F022C0FF20F1F0211115C015 -:102B7000802F26960FB6F894DEBF0FBECDBFDF9133 -:102B8000CF911F910F91FF90EF90DF90CF900C9419 -:102B90000515253008F040C209C0F601858180FF87 -:102BA000ECC18F708583E4CF2111FBC1802F69C1F7 -:102BB000202F26952695237030E02115310521F030 -:102BC00021303105C9F028C2FF2021F0812F902F3C -:102BD000937002C080E090E026960FB6F894DEBFB6 -:102BE0000FBECDBFDF91CF911F910F91FF90EF905E -:102BF000DF90CF900C947712FF2021F0812F902F3F -:102C0000937002C080E090E026960FB6F894DEBF85 -:102C10000FBECDBFDF91CF911F910F91FF90EF902D -:102C2000DF90CF900C948D12812FFF2019F00E941D -:102C3000DA1F02C00E94422026960FB6F894DEBF2B -:102C40000FBECDBFDF91CF911F910F91FF90EF90FD -:102C5000DF90CF900C94C720802F837009F078C04C -:102C6000F110DAC1812F829586958770880F880FC1 -:102C7000912F9F70C92ED12CE12CF12C082E04C06D -:102C8000CC0CDD1CEE1CFF1C0A94D2F714FF12C002 -:102C90004FE050E060E070E004C0440F551F661F35 -:102CA000771F8A95D2F7CB01BA0160957095809510 -:102CB000909503C060E070E0CB01202F269526950B -:102CC0002370422F50E042305105D1F0433051057E -:102CD00059F16C297D298E299F294130510541F1F7 -:102CE00026960FB6F894DEBF0FBECDBFDF91CF9111 -:102CF0001F910F91FF90EF90DF90CF900C94351CB7 -:102D00006C297D298E299F2926960FB6F894DEBF5F -:102D10000FBECDBFDF91CF911F910F91FF90EF902C -:102D2000DF90CF900C94471C0E94351CC701B60160 -:102D300026960FB6F894DEBF0FBECDBFDF91CF91C0 -:102D40001F910F91FF90EF90DF90CF900C94231C78 -:102D5000FF2019F0802F817001C08695882309F427 -:102D60005BC1812F829586958770880F880F912F80 -:102D70009F70C92ED12CE12CF12C082E04C0CC0C54 -:102D8000DD1CEE1CFF1C0A94D2F714FF12C04FE0AA -:102D900050E060E070E004C0440F551F661F771FCD -:102DA0008A95D2F7CB01BA01609570958095909580 -:102DB00003C060E070E0CB01202F2695269523709C -:102DC000422F50E042305105D1F04330510559F1C6 -:102DD0006C297D298E299F294130510541F1269684 -:102DE0000FB6F894DEBF0FBECDBFDF91CF911F911C -:102DF0000F91FF90EF90DF90CF900C94EC1C6C291A -:102E00007D298E299F2926960FB6F894DEBF0FBE26 -:102E1000CDBFDF91CF911F910F91FF90EF90DF9089 -:102E2000CF900C94FE1C0E94EC1CC701B6012696A4 -:102E30000FB6F894DEBF0FBECDBFDF91CF911F91CB -:102E40000F91FF90EF90DF90CF900C94DA1C103F21 -:102E500041F118F4103E48F48BC0123F09F450C001 -:102E6000D8F1133F09F460C083C01F70802F8F71A9 -:102E7000FF2021F00E94731C812F7BCE0E94941CA6 -:102E8000812F26960FB6F894DEBF0FBECDBFDF911F -:102E9000CF911F910F91FF90EF90DF90CF900C9406 -:102EA0000C15FF20A9F0253008F0B6C0802F8F71D7 -:102EB00026960FB6F894DEBF0FBECDBFDF91CF913F -:102EC0001F910F91FF90EF90DF90CF900C94B91C61 -:102ED000263008F0A1C0EACFFF20A1F0802F8F712B -:102EE00026960FB6F894DEBF0FBECDBFDF91CF910F -:102EF0001F910F91FF90EF90DF90CF900C94731C77 -:102F0000FF2061F3802F8F7126960FB6F894DEBFF5 -:102F10000FBECDBFDF91CF911F910F91FF90EF902A -:102F2000DF90CF900C94941CFF2091F0802F8F7134 -:102F300026960FB6F894DEBF0FBECDBFDF91CF91BE -:102F40001F910F91FF90EF90DF90CF900C945E1C3B -:102F500026960FB6F894DEBF0FBECDBFDF91CF919E -:102F60001F910F91FF90EF90DF90CF900C94591C20 -:102F7000FF20A1F0222309F4B1CF812F26960FB6AE -:102F8000F894DEBF0FBECDBFDF91CF911F910F919F -:102F9000FF90EF90DF90CF900C94AD13222309F4B3 -:102FA000B1CF812F26960FB6F894DEBF0FBECDBFEE -:102FB000DF91CF911F910F91FF90EF90DF90CF9015 -:102FC0000C949B14402F4F70612FC6010E94541F18 -:102FD00026960FB6F894DEBF0FBECDBFDF91CF911E -:102FE0001F910F91FF90EF90DF90CF900C946B1B8F -:102FF000402F4F70612FC60126960FB6F894DEBFA2 -:103000000FBECDBFDF91CF911F910F91FF90EF9039 -:10301000DF90CF900C94571F26960FB6F894DEBF22 -:103020000FBECDBFDF91CF911F910F91FF90EF9019 -:10303000DF90CF9008950E94B11D0E94801D0E94D4 -:10304000CB1D0E94F9210E94C72080E090E00E94E1 -:10305000771280E090E00C948D120E94A11D0C94D8 -:103060001B180E94111D292F22952F7030E02C3043 -:1030700031054CF42A3031056CF4225031092230EC -:10308000310588F407C02C30310549F02F30310567 -:1030900031F009C0803E48F0803F29F406C093FB20 -:1030A000882780F9089580E0089581E00895CF93FE -:1030B000DF9300D000D01F92CDB7DEB70F900F90F6 -:1030C0000F900F900F90DF91CF910895CF93DF93E2 -:1030D00000D000D000D0CDB7DEB726960FB6F8945A -:1030E000DEBF0FBECDBFDF91CF9108951F93CF9369 -:1030F000DF93C091730116E080917401C81799F0B5 -:10310000D0E01C9FF0011D9FF00D1124EB58FE4FE5 -:103110004081518162817381848195810E9466180A -:103120002196C770E9CFDF91CF911F91089540910B -:10313000A5015091A6016091A7017091A80180910D -:10314000A9019091AA010C9466188091AA01829518 -:103150008F7009F054C08091A701882309F44FC0F3 -:1031600080917301A09174016091A5017091A601F5 -:103170004091A8015091A901B6E08A1709F43FC017 -:1031800090E041155105C1F17F3F11F46F3FA1F16E -:10319000B89FF001B99FF00D1124EB58FE4F21812B -:1031A00072132AC02081621327C02281211124C0FA -:1031B000238134812417350710F421503109241B51 -:1031C000350B283C3105C0F42091AA012F702061F5 -:1031D0002093AA0126E0289FF001299FF00D1124D9 -:1031E000E658FE4F80818F708061808385EA91E090 -:1031F0000E9413150C94761801968770BECF08951F -:10320000CF92DF92EF92FF920F931F93CF93DF93B2 -:10321000CDB7DEB762970FB6F894DEBF0FBECDBF55 -:103220008C0185E0F801DE011D9601900D928A95D2 -:10323000E1F7D8014C9111965C91119712966C911F -:1032400012971396CD90DC9014973091A501709150 -:10325000A6018091A8019091A901009709F46BC182 -:103260007F3F19F43F3F09F466C1E090A701EE20CB -:1032700009F4C0C02091AA01C816D90628F0F601A9 -:10328000E81BF90BCF0104C0809590958C0D9D1D16 -:10329000FF24F394883C910578F0F12C207F09F00D -:1032A000C6C07C2DD98AC88A89890E94571885EAA8 -:1032B00091E00E941315B1C0822F807F09F046C0B3 -:1032C000751314C0341312C0611110C02F70206127 -:1032D0002093AA010E94971885EA91E00E94131595 -:1032E0008091AA01D80115968C932EC0CD2819F192 -:1032F0005F3F11F44F3FF9F0F62E61111CC0809131 -:1033000073012091740136E0821709F45AC090E0ED -:10331000389FF001399FF00D1124EB58FE4F718159 -:10332000571306C07081471303C07281711103C027 -:1033300001968770E9CFF62E662309F418C18091B3 -:10334000AA0181608093AA01F12C11C1751308C0F4 -:10335000341306C0611104C08091AA01D801C3C012 -:103360004D875E878D859E856A8B0E9431186A899C -:103370008823E1F16623D1F12091AA01822F829561 -:103380008F7090E0029774F08091A5019091A60152 -:1033900098878F831986DB86CA862C87CE0107968D -:1033A0000E94131586E0F801A5EAB1E001900D92A4 -:1033B0008A95E1F70E94A5180E949718FF24F394BC -:1033C000D6C04D875E878D859E850E94111D292F51 -:1033D00022952F7030E0223031050CF0BCC09F7078 -:1033E00009F0B6C0805E883008F4C1C0C8010E94F0 -:1033F0001315E4CFC816D90608F453C0F601E81B2C -:10340000F90BCF01883C910508F450C0F12C7C2DBC -:10341000D98AC88A89890E945718E5EAF1E086E0CE -:10342000DF011D928A95E9F70E949718A0C07513D5 -:1034300014C0341312C0611110C08091AA01F801A8 -:103440008583C8010E94131586E0E5EAF1E0DF01FB -:103450001D928A95E9F7FE2C8AC04D875E878D857F -:103460009E856A8B0E9431186A89882309F4BECF31 -:10347000662309F4BBCF2091AA01822F82958F7019 -:1034800090E002970CF48ECF8091A5019091A60157 -:103490009A8389831B82DD82CC822E83CE010196A2 -:1034A0007FCF809590958C0D9D1DACCFF62E662319 -:1034B00009F49CCF75132EC034132CC02091AA019F -:1034C00020FD1FC0822F82958F70D9F0D8011596EC -:1034D0002C9315978F3049F08F5F982F9295907F9E -:1034E000822F8F70892B15968C93C8010E9413151B -:1034F00086E0F801A5EAB1E001900D928A95E1F726 -:1035000093CF86E0F801A5EAB1E001900D928A958B -:10351000E1F72DC04D875E878D859E850E9431180D -:10352000811140CF8091AA0181608093AA01C801D6 -:103530000E9413151CC0662309F458CF4D875E877F -:103540008D859E850E943118882309F44FCF2ACF9C -:10355000811148CF0CC0243031050CF047CF9F704B -:1035600009F440CFF8019581907F09F03BCF8F2D72 -:1035700062960FB6F894DEBF0FBECDBFDF91CF913C -:103580001F910F91FF90EF90DF90CF9008951F93C0 -:10359000CF93DF93CDB7DEB72C970FB6F894DEBF8D -:1035A0000FBECDBF4F83588769877A878B879C87EB -:1035B000CE0107960E940019882369F08F819885B3 -:1035C0002A853B85232BF1F19F3F09F063C08F3F94 -:1035D00009F060C037C086E0FE013796DE01119623 -:1035E00001900D928A95E1F76F817885EA85FB85D8 -:1035F000309741F17F3F11F46F3F21F12091740129 -:1036000030E0C9010196877099274091730150E01D -:103610008417950709F447C069837A83FD83EC8397 -:1036200096E0929FD001939FB00D1124AB58BE4FEE -:10363000FE01319601900D929A95E1F78093740105 -:103640000E94761816E08091730190917401891799 -:10365000C1F1189FC00111248B589E4F0E94001980 -:10366000882379F1E09173011E9FF0011124EB583A -:10367000FE4F4081518162817381848195810E94D6 -:1036800066188091730190E0019687709927809366 -:103690007301D9CF4F81588569857A858B859C8543 -:1036A0000E946618CFCF0E942D18109274011092BC -:1036B0007301E5EAF1E086E0DF011D928A95E9F702 -:1036C000C1CF2C960FB6F894DEBF0FBECDBFDF91F1 -:1036D000CF911F910895DF92EF92FF920F931F9366 -:1036E000CF93DF93FC01892B09F48AC0E12CF12CE4 -:1036F000DD24D394EF0121968491853709F461C0CC -:1037000058F4843708F04EC0843008F06AC0813025 -:10371000D1F0823071F174C0883709F45DC050F483 -:10372000863709F455C0873709F06AC08E2D0E948C -:103730009E1D54C09CE7980F903708F061C08F77AA -:103740000E949B1450C08F010E5F1F4FFE01849199 -:1037500090E2980F983050F48770FD2D01C0FF0F54 -:103760008A95EAF78F2F0E94A41D14C00E94AD1302 -:1037700013C08F010E5F1F4FFE01C49180E28C0FBA -:10378000883060F4C7708D2D01C0880FCA95EAF7A4 -:103790000E94AA1D0E94CB1DE80125C08C2F0E940B -:1037A0009B14FACF9F012E5F3F4FFE01C491CC23A3 -:1037B00069F08FE99FE00197F1F700C00000C15068 -:1037C000F6CF9F012E5F3F4FFE01F490E9010BC041 -:1037D0000E948E1DE82E07C00E94A11D0E94CB1DD5 -:1037E00002C00E94AD138F2D882341F0EFE9FFE066 -:1037F0003197F1F700C000008150F6CFFE017ACF7B -:10380000DF91CF911F910F91FF90EF90DF9008957E -:103810006093AF017093B0018093B1019093B201B6 -:103820000E941C1E0C941B186093AB017093AC019A -:103830008093AD019093AE010E941D1E0C941B1845 -:1038400008950C94081C0F931F930091AF011091E1 -:10385000B0012091B1013091B201602B712B822B0C -:10386000932B1F910F910C94081C0F931F930091A1 -:10387000AF011091B0012091B1013091B2016023EC -:103880007123822393231F910F910C94081C0F9393 -:103890001F930091AF011091B0012091B1013091BF -:1038A000B20160277127822793271F910F910C94F3 -:1038B000081C60E070E0CB010C94141C0F931F9364 -:1038C00041E050E060E070E08A019B0104C0000F1D -:1038D000111F221F331F8A95D2F7C901B8011F910A -:1038E0000F910C94141C0F931F9341E050E060E083 -:1038F00070E004C0440F551F661F771F8A95D2F7EA -:103900008091AB019091AC01A091AD01B091AE015D -:103910008A019B01082B192B2A2B3B2BC901B801CB -:103920001F910F910C94141C0F931F9341E050E0D2 -:1039300060E070E004C0440F551F661F771F8A9532 -:10394000D2F740955095609570958091AB0190911C -:10395000AC01A091AD01B091AE018A019B01082399 -:1039600019232A233B23C901B8011F910F910C94FD -:10397000141C0F931F9341E050E060E070E004C01E -:10398000440F551F661F771F8A95D2F78091AB01B0 -:103990009091AC01A091AD01B091AE018A019B0163 -:1039A000082719272A273B27C901B8011F910F9122 -:1039B0000C94141C0F931F930091AB011091AC0158 -:1039C0002091AD013091AE01602B712B822B932B96 -:1039D0001F910F910C94141C0F931F930091AB0136 -:1039E0001091AC012091AD013091AE0160237123A3 -:1039F000822393231F910F910C94141C0F931F93F8 -:103A00000091AB011091AC012091AD013091AE015C -:103A100060277127822793271F910F910C94141C04 -:103A20000895CF92DF92EF92FF920F931F93CF935F -:103A3000DF938C01C090AF01D090B001E090B10154 -:103A4000F090B2014091AB015091AC016091AD0199 -:103A50007091AE01C42AD52AE62AF72ACFE1D0E038 -:103A6000D701C6010C2E04C0B695A79597958795EA -:103A70000A94D2F780FF07C0B8018C2F0E942A1F3A -:103A80008130910531F4219758F7B80180E00E9408 -:103A90002A1FDF91CF911F910F91FF90EF90DF9040 -:103AA000CF90089520910D0130910E01F9013296C9 -:103AB0009FEF40E05191581789F09F3F19F4511141 -:103AC00001C0942F4F5F4630A9F79F3F39F0F901AD -:103AD000E90FF11D97FDFA958283089508952091CD -:103AE0000D0130910E01F9013296285F3F4F908110 -:103AF000981301C010823196E217F307C1F70895B9 -:103B000081E090E0E0910D01F0910E01E80FF91FC6 -:103B10001082019688309105A9F708958091BD0122 -:103B200008959091BD01892B8093BD0108958095E2 -:103B30009091BD0189238093BD0108958093BD01BB -:103B400008951092BD0108959091BC01892B809336 -:103B5000BC01089580959091BC0189238093BC019C -:103B600008951092BC0108958093B30108951092B6 -:103B7000B301089580910D0190910E01FC013196E1 -:103B80009C01285F3F4F80E0919191118F5FE21778 -:103B9000F307D1F70895E0910D01F0910E018091A6 -:103BA000BD018083E0910D01F0910E019081809123 -:103BB000BC01892B80838091B301882361F0E0915F -:103BC0000D01F0910E019081892B80830E94BA1D16 -:103BD00081111092B30180910D0190910E010C940E -:103BE0002312909335018093340108958295982F84 -:103BF0009C7C392F36953695282F237344E0249FDB -:103C0000C0011124932F982B292F2A7A2695892FCA -:103C10008575880F822B08950895CF93DF9300D088 -:103C200000D01F92CDB7DEB70F900F900F900F907E -:103C30000F90DF91CF910895089508950C946B1320 -:103C40008091D301843021F11092BF0120E488E1FA -:103C500090E00FB6F894A895809360000FBE209373 -:103C6000600083B7817F846083BF83B7816083BF37 -:103C70007894889583B78E7F83BF0FB6F894A89504 -:103C800080916000886180936000109260000FBE98 -:103C9000089508950895CF930E94491E0E94170821 -:103CA0000E944A1EC0E08C2F0E941509811104C099 -:103CB000CF5FC031C1F701C081E0CF9108950C946E -:103CC0002D181F920F920FB60F9211248F939F936E -:103CD000AF93BF938091BF01811113C08091C00148 -:103CE0009091C101A091C201B091C3014196A11D63 -:103CF000B11D8093C0019093C101A093C201B09304 -:103D0000C301BF91AF919F918F910F900FBE0F9004 -:103D10001F90189582E084BD93E095BD9AEF97BD02 -:103D200080936E0008952FB7F8948091C001909110 -:103D3000C101A091C201B091C3012FBF08952FB757 -:103D4000F8946091C0017091C1018091C20190917D -:103D5000C3012FBF0895CF92DF92EF92FF920F938E -:103D60001F932FB7F8944091C0015091C101609109 -:103D7000C2017091C3012FBF6A017B01EE24FF24B1 -:103D80008C0120E030E0C016D106E206F30610F404 -:103D9000415051099A01281B390BC9011F910F91FC -:103DA000FF90EF90DF90CF9008951F920F920FB683 -:103DB0000F9211248F939F93AF93BF938091C00173 -:103DC0009091C101A091C201B091C3010196A11DC2 -:103DD000B11D8093C0019093C101A093C201B09323 -:103DE000C301BF91AF919F918F910F900FBE0F9024 -:103DF0001F9018950E94300FF8942FEF87EA91E6F4 -:103E0000215080409040E1F700C0000087E090EB37 -:103E1000DC018093DC019093DD01A093DE01B0937F -:103E2000DF019CE088E10FB6F894A89580936000CC -:103E30000FBE90936000FFCF28E0929FF001112405 -:103E4000E80FF11DE052FF4F9491892F8F709295EA -:103E50009F700895CF93C82FCB010E941C1F282F5D -:103E600030E080E1989FA0011124422B532B403871 -:103E7000510519F480E090E015C09770E92FF0E04B -:103E800088E0C89FE00DF11D112484E0EE0FFF1FB4 -:103E90008A95E1F7E20FF31FEE0FFF1FE050F8499C -:103EA00085919491CF91089580E090E008950895D0 -:103EB0008091C60180FF0BC06091120185E0689F70 -:103EC000B001112475956795759567952BC081FF95 -:103ED00009C06091120185E0689FB00111247595B9 -:103EE000679520C082FF07C06091120185E0689F3E -:103EF000B001112417C09091C7019923D1F06091AE -:103F00001101961788F72091120185E0289F9001F2 -:103F10001124929FA001939F500D112470E0CA01BB -:103F20000E940E276038710540F46115710539F063 -:103F300002C065E070E0862F08958FE7089581E064 -:103F400008958091C60180FF08C06091100170E063 -:103F5000759567957595679521C081FF06C060913D -:103F6000100170E07595679519C082FF04C06091DB -:103F7000100170E010C09091C7019923C1F06091C9 -:103F80000F019617A0F780911001899FC00111249D -:103F900070E00E940E276038710528F461157105E4 -:103FA00021F0862F08958FE7089581E0089561E05C -:103FB00070E0F4CF803F21F40E94581F819504C027 -:103FC000813F29F40E94581F8093CA010895823FBF -:103FD00021F40E94581F819504C0833F29F40E9458 -:103FE000581F8093C9010895893F19F40E94A11FA9 -:103FF00005C08A3F31F40E94A11F81958093CB01B7 -:1040000008958B3F21F40E94A11F819504C08C3F2D -:1040100029F40E94A11F8093CC010895843F21F4CC -:104020008091C801816017C0853F21F48091C8014B -:10403000826011C0863F21F48091C80184600BC06A -:10404000873F21F48091C801886005C0883F31F422 -:104050008091C80180618093C80108958D3F21F44B -:104060008091C60181600BC08E3F21F48091C60112 -:10407000826005C08F3F29F48091C60184608093DF -:10408000C6010895803F39F48091CA0187FF6CC052 -:104090001092CA0169C0813F29F48091CA011816A3 -:1040A000BCF362C09091C901823F29F497FF5CC0C4 -:1040B0001092C90159C0833F19F41916CCF354C0AA -:1040C000893F41F48091CB0118160CF04DC010923D -:1040D000CB014AC08A3F29F48091CB0187FF44C0BD -:1040E000F6CF8B3F39F48091CC0187FF3DC0109211 -:1040F000CC013AC08C3F29F48091CC011816BCF356 -:1041000033C0843F21F48091C8018E7F17C0853F62 -:1041100021F48091C8018D7F11C0863F21F48091E8 -:10412000C8018B7F0BC0873F21F48091C801877F36 -:1041300005C0883F31F48091C8018F7E8093C8010B -:1041400013C08D3F21F48091C6018E7F0BC08E3F3E -:1041500021F48091C6018D7F05C08F3F29F48091A5 -:10416000C6018B7F8093C6018091C90181110EC069 -:104170008091CA0181110AC08091CB01811106C0D2 -:104180008091CC01811102C01092C70108958091E5 -:10419000BE0183FF7EC08BEC94E00E94B00580914D -:1041A000C8011F928F9386EC94E09F938F930E9497 -:1041B000490684EC94E00E94B0058091C901282F43 -:1041C000082E000C330B3F938F9381EC94E09F9368 -:1041D0008F930E9449068FEB94E00E94B005809176 -:1041E000CA01282F082E000C330B3F938F938CEBC2 -:1041F00094E09F938F930E9449068AEB94E00E947B -:10420000B0058091CB01282F082E000C330B3F9373 -:104210008F9387EB94E09F938F930E94490685EBE1 -:1042200094E00E94B0058091CC01282F082E000C4C -:10423000330B3F938F9382EB94E09F938F930E9475 -:1042400049068FEA94E00E94B0058091C7011F9251 -:104250008F938CEA94E09F938F930E9449068AEA99 -:1042600094E00E94B0058091C6011F928F9387EA67 -:1042700094E09F938F930E94490684EA94E00E9401 -:10428000B0058DB79EB74C960FB6F8949EBF0FBE83 -:104290008DBF88EC91E00E946C120E94931E909357 -:1042A000C5018093C40108951F93CF93DF9380913C -:1042B000C4019091C5010E94AB1EAC019091C70151 -:1042C000992321F02091130130E006C020911401C0 -:1042D0008AE0289F900111244217530708F485C0F3 -:1042E0008091C901C091CA01D091CB011091CC013C -:1042F000811107C0C11175C0D11173C0111171C0F6 -:1043000074C09F3F19F09F5F9093C701181624F463 -:104310000E94581F8093C9018091C90187FF05C081 -:104320000E94581F81958093C9011C1624F40E9495 -:10433000581F8093CA018091CA0187FF05C00E945F -:10434000581F81958093CA016091C901662331F19C -:10435000C091CA01CC2311F1062E000C770B880BFB -:10436000990B0E94092623E333E343E35FE30E94B2 -:104370006D260E94D1256093C9016C2FCC0F770B5D -:10438000880B990B0E94092623E333E343E35FE3A1 -:104390000E946D260E94D1256093CA011D1624F447 -:1043A0000E94A11F8093CB018091CB0187FF05C0A4 -:1043B0000E94A11F81958093CB01111624F40E94C5 -:1043C000A11F8093CC018091CC0187FF05C00E9482 -:1043D000A11F81958093CC01DF91CF911F910C9407 -:1043E000C7209F3F09F08FCF97CFDF91CF911F91CB -:1043F0000895E8ECF1E085E0DF011D928A95E9F788 -:104400001092C7011092C60108958EEE96E00E94A8 -:10441000B0051F9281E08F931F9285E08F9380EA11 -:1044200096E09F938F930E9449060F900F900F90F4 -:104430000F900F900F9008958330E9F128F48130A8 -:1044400061F0823009F10895853009F462C008F402 -:1044500049C0863009F474C0089580911401262F54 -:1044600030E0280F311D2F3F310524F4680F609391 -:10447000140103C08FEF80931401809114011F92E7 -:104480008F9389ED95E072C080911301262F30E063 -:10449000280F311D2F3F310524F4680F609313015D -:1044A00003C08FEF80931301809113011F928F93AC -:1044B00087EC95E05BC080911201262F30E0280F39 -:1044C000311D2F3F310524F4680F6093120103C0A2 -:1044D0008FEF80931201809112011F928F9384EBD2 -:1044E00095E044C080911101262F30E0280F311D46 -:1044F0002F3F310524F4680F6093110103C08FEF43 -:1045000080931101809111011F928F938FE995E0A3 -:104510002DC080911001262F30E0280F311D2F3F34 -:10452000310524F4680F6093100103C08FEF80936E -:104530001001809110011F928F9386E895E016C0BC -:1045400080910F01262F30E0280F311D2F3F3105BC -:1045500024F4680F60930F0103C08FEF80930F0165 -:1045600080910F011F928F938BE695E09F938F931D -:104570000E9449060F900F900F900F90089583307E -:1045800081F128F4813059F08230D1F008958530DE -:1045900009F449C0B8F1863009F456C008958091F5 -:1045A0001401681720F4861B8093140102C0109236 -:1045B0001401809114011F928F938CE595E054C0F3 -:1045C00080911301681720F4861B8093130102C0A9 -:1045D00010921301809113011F928F938AE495E04A -:1045E00043C080911201681720F4861B809312014A -:1045F00002C010921201809112011F928F9387E3E3 -:1046000095E032C080911101681720F4861B8093D9 -:10461000110102C010921101809111011F928F931C -:1046200082E295E021C080911001681720F4861B7A -:104630008093100102C010921001809110011F920E -:104640008F9389E095E010C080910F01681720F4E6 -:10465000861B80930F0102C010920F0180910F0101 -:104660001F928F938EEE94E09F938F930E94490642 -:104670000F900F900F900F900895CF93C82F1F9217 -:104680008F9383EF97E09F938F930E94490681E079 -:1046900090E0A0E0B0E0BC01CD0104C0660F771F40 -:1046A000881F991FCA95D2F70E94211C0F900F9066 -:1046B0000F900F90CF910C942D18CF93873288F5DF -:1046C0008E3108F00BC18E3009F487C0D8F48730E2 -:1046D00009F460C08B3009F44FC0863009F002C184 -:1046E0008091BE01817F8E7F8093BE0188EF97E02D -:1046F0000E94B00581EB9AE00E94B00581E08093B2 -:10470000CE0146C0863109F4B0C020F4803109F4EE -:104710007AC0E8C0893109F491C08B3109F449C0ED -:10472000E1C0883349F150F4893209F4D5C08533AA -:1047300009F4D2C0873209F0D5C0CEC0833409F461 -:10474000CBC028F48A3308F4CDC08953C8C088345C -:1047500009F0C8C00E942D1880EA9AE00E94B005B6 -:104760002FEF83ED90E3215080409040E1F700C0AF -:1047700000000E94FA1E0CC08FE198E041C087E85B -:104780009AE00E94B0058091BE0181608093BE01D5 -:10479000C1E0ADC08091BE01C82FC17080FFEFCFD6 -:1047A00083E99AE00E94B0058091BE01817F8E7FEF -:1047B0003FC09091BE0191FBCC27C0F981E0C82792 -:1047C000892FC0FB81F98093BE01CC2319F08AE7C1 -:1047D0009AE029C08CE69AE013C09091BE0192FB4A -:1047E000CC27C0F981E0C827892FC0FB82F98093CC -:1047F000BE01CC2319F08DE59AE015C08DE49AE056 -:104800000E94B005C5CF9091BE0193FBCC27C0F9A3 -:1048100081E0C827892FC0FB83F98093BE01CC2398 -:1048200051F081E49AE00E94B0058091BE01816060 -:104830008093BE015CC084E39AE0E2CF85E29AE017 -:104840000E94B00582E09AE00E94B0058DEB99E0ED -:104850000E94B00580E999E00E94B0058BE499E0E0 -:104860000E94B0058DE199E0CBCF8FE099E00E94E6 -:10487000B0050E9417121F928F9385EF98E09F93C7 -:104880008F930E94490680910C011F928F938EEDA9 -:1048900098E09F938F930E94490680915B011F923D -:1048A0008F938BEC98E09F938F930E9449060E9410 -:1048B0009F1E9F938F937F936F9384EB98E09F93BA -:1048C0008F930E9449068DB79EB742960FB6F89413 -:1048D0009EBF0FBE8DBF5CCF80E001C08D510E9496 -:1048E0003D2356CF82EB98E00E94B005C0E08C2FAC -:1048F000CF91089580E0089580E00895CF93C82F68 -:104900008091CE01813069F020F0823009F449C0F5 -:1049100040C167E08FE00E940009882309F43FC18D -:1049200006C067E08FE00E940009882361F08C2FA9 -:104930000E947A24811104C08C2F0E945D232FC015 -:1049400081E090E02CC08C2F0E947C24811126C035 -:10495000C431E1F070F4CB3081F0C031D1F40E9469 -:1049600005228BEE97E00E94B00582E08093CE0195 -:1049700015C0C93259F0C83361F488EF97E00E943E -:10498000B0058FEE97E00E94B00508C01092CE01EE -:1049900004C189EE97E00E94B005FFC081E08170FC -:1049A000FEC0C43228F5CE3108F0C1C0CB30A1F131 -:1049B000D0F4C73009F0D3C08EE18093140182E3B4 -:1049C000809313018AE08093120184E180931101A6 -:1049D00088E08093100188E280930F018FE896E0D1 -:1049E0000E94B005BFC0C33149F1C431C1F0B7C0A6 -:1049F000CB3409F4A9C028F4C93289F0C83361F076 -:104A0000AEC0C13509F49EC0C23509F499C0CE3498 -:104A100009F0A5C06AE09EC00E940522A3C0809153 -:104A2000CD01882319F01092CD019CC08CE996E04D -:104A30000E94B00581E08093CE01B1C086E796E088 -:104A40000E94B00584E696E00E94B00580911401B2 -:104A50001F928F9381E696E09F938F930E94490661 -:104A60008FE596E00E94B0058DE496E00E94B005C7 -:104A7000809113011F928F938AE496E09F938F9306 -:104A80000E94490688E496E00E94B00589E396E01A -:104A90000E94B005809112011F928F9386E396E0E9 -:104AA0009F938F930E94490684E396E00E94B0058D -:104AB00083E296E00E94B005809111011F928F93CE -:104AC00080E296E09F938F930E9449068EE196E0E4 -:104AD0000E94B00589E096E00E94B0058091100127 -:104AE0001F928F9386E096E09F938F930E944906D2 -:104AF00084E096E00E94B0058DEE95E00E94B0053E -:104B000080910F011F928F938AEE95E09F938F9370 -:104B10000E94490688EE95E00E94B0058DB79EB7C9 -:104B200048960FB6F8949EBF0FBE8DBF1BC0CE51E6 -:104B3000EC2FF0E0E75DFE4F80818093CD0112C045 -:104B400061E003C061E006C06AE08091CD010E948F -:104B50001C2208C08091CD010E94BF2203C08DE8B5 -:104B600096E013C08091CD01882369F01F928F9346 -:104B700087E896E09F938F930E9449060F900F90CD -:104B80000F900F9004C084E896E00E94B00581E089 -:104B900006C01092CE0180E002C080E000CFCF912D -:104BA00008950E94D8256894B1110C946726089541 -:104BB0000E944C2688F09F5798F0B92F9927B7513B -:104BC000B0F0E1F0660F771F881F991F1AF0BA95B1 -:104BD000C9F714C0B13091F00E946626B1E0089583 -:104BE0000C946626672F782F8827B85F39F0B93F75 -:104BF000CCF3869577956795B395D9F73EF4909564 -:104C00008095709561957F4F8F4F9F4F0895E894E1 -:104C100009C097FB3EF490958095709561957F4F04 -:104C20008F4F9F4F9923A9F0F92F96E9BB279395B2 -:104C3000F695879577956795B795F111F8CFFAF4C2 -:104C4000BB0F11F460FF1BC06F5F7F4F8F4F9F4FF3 -:104C500016C0882311F096E911C0772321F09EE851 -:104C6000872F762F05C0662371F096E8862F70E0B7 -:104C700060E02AF09A95660F771F881FDAF7880F91 -:104C80009695879597F9089557FD9058440F551FAD -:104C900059F05F3F71F04795880F97FB991F61F0BE -:104CA0009F3F79F087950895121613061406551F35 -:104CB000F2CF4695F1DF08C0161617061806991FA1 -:104CC000F1CF86957105610508940895E894BB2796 -:104CD00066277727CB0197F908950E9480260C94C8 -:104CE000F1260E94E32638F00E94EA2620F0952360 -:104CF00011F00C94DA260C94E02611240C9467260B -:104D00000E94442670F3959FC1F3950F50E0551F04 -:104D1000629FF001729FBB27F00DB11D639FAA2710 -:104D2000F00DB11DAA1F649F6627B00DA11D661F5F -:104D3000829F2227B00DA11D621F739FB00DA11D80 -:104D4000621F839FA00D611D221F749F3327A00D3A -:104D5000611D231F849F600D211D822F762F6A2FD6 -:104D600011249F5750409AF0F1F088234AF0EE0F3B -:104D7000FF1FBB1F661F771F881F91505040A9F768 -:104D80009E3F510580F00C94DA260C9467265F3F15 -:104D9000E4F3983ED4F3869577956795B795F795A4 -:104DA000E7959F5FC1F7FE2B880F911D969587951C -:104DB00097F9089597F99F6780E870E060E008959B -:104DC0009FEF80EC089500240A9416161706180623 -:104DD0000906089500240A941216130614060506FF -:104DE0000895092E0394000C11F4882352F0BB0F90 -:104DF00040F4BF2B11F460FF04C06F5F7F4F8F4FF3 -:104E00009F4F0895991B79E004C0991F961708F0E9 -:104E1000961B881F7A95C9F78095089597FB072EF2 -:104E200016F4009407D077FD09D00E94282707FCCC -:104E300005D03EF4909581959F4F089570956195AA -:104E40007F4F0895EE0FFF1F0590F491E02D099418 -:104E5000AA1BBB1B51E107C0AA1FBB1FA617B707A0 -:104E600010F0A61BB70B881F991F5A95A9F78095BC -:0C4E70009095BC01CD010895F894FFCF8F -:104E7C00FFFF820A730B500B1C0BE80A01B40128CC -:104E8C0008140A321E404D36223F04F203BC039A2A -:104E9C000326033F035803710301020304050607AD -:044EAC0008090000F1 +:100990004255494C443A2033306131666431202855 +:1009A00031303A33303A34372053657020323920B1 +:1009B00032303136290A005649443A2030784645CB +:1009C000454428742E6D2E6B2E29205049443A2020 +:1009D00030783041444228414442206B6579626F4F +:1009E00061726420636F6E76657274657229205639 +:1009F00045523A203078303130310A004445534373 +:100A00003A20636F6E7665727420414442206B65B4 +:100A100079626F61726420746F205553420A000A34 +:100A2000092D2056657273696F6E202D0A000A6DBC +:100A30006F7573653A206F66660A000A6D6F75738D +:100A4000653A206F6E0A000A6B6579626F617264A5 +:100A50003A206F66660A000A6B6579626F6172649C +:100A60003A206F6E0A000A6D61747269783A206FDD +:100A700066660A000A6D61747269783A206F6E0AC0 +:100A8000000A64656275673A206F6E0A000A646541 +:100A90006275673A206F66660A000A0A626F6F74B1 +:100AA0006C6F616465722E2E2E2000433E20000084 +:100AB00011241FBECFEFDAE0DEBFCDBF04B603FEC8 +:100AC00027C08091DC019091DD01A091DE01B09101 +:100AD000DF018730904BA740B04BD1F41092DC017E +:100AE0001092DD011092DE011092DF0114BE84B776 +:100AF000877F84BF0FB6F894A895809160008861C5 +:100B000080936000109260000FBEE0E0F8E309956A +:100B100011E0A0E0B1E0EEE7FEE402C005900D9226 +:100B2000A433B107D9F721E0A4E3B1E001C01D92DD +:100B3000AC3DB207E1F70E94DB0C0C943D270C940E +:100B40000000FF93EF93E0913401F091350130976D +:100B500009F00995EF91FF910895FC01859180308E +:100B600011F0EFDFFBCF0895FF27E0E230E247FF0F +:100B70000CC0419597FF09C0EDE260957095809596 +:100B80009095611D711D811D911D27FF02C021954A +:100B900030E350E2AA27660F771F881F991FAA1F0C +:100BA000A41710F0A41B63955A95A9F7AA3008F072 +:100BB000A95FA05DAF93F39561157105810591055E +:100BC00041F7ED3211F4EF93F395F21718F43F93D8 +:100BD000F395FBCF8F91B5DFFA95E1F70895E99191 +:100BE000F9918591803021F0853219F0AADFF9CF93 +:100BF000089520E0E89455915532C1F3503311F433 +:100C0000689455915A3348F4505390F3220F022EB2 +:100C1000220F220F200D250FF4CF0EF4219589917C +:100C20009991533619F3533729F1533559F1BC01D2 +:100C300088279927E8945C3621F4899199916894E2 +:100C40005591543639F446EF7EF077FF0DC08FEFA3 +:100C50009FEF0AC055374AE039F0583540E121F09E +:100C6000523642E009F00895FF93EF937DDFEF9154 +:100C7000FF91B7CFFF93EF93FC0181918030B9F3DF +:100C800060DFFBCFFF93EF9368DFF1CFDF93CF936C +:100C9000CDB7DEB72596A3DFCF91DF910895282F3A +:100CA0002770E82FE695E695E695EF70F0E0E95CB1 +:100CB000FE4F87FF0AC081E090E001C0880F2A95AF +:100CC000EAF780959081892308C081E090E001C017 +:100CD000880F2A95EAF79081892B808381E08093A1 +:100CE0004C0108950F931F93CF93DF93569A5E9A0A +:100CF0000E94BF092FEF87EA91E621508040904083 +:100D0000E1F700C0000088E892E09F938F930E9473 +:100D100046060F900F90C1E0D0E00EE612E063E0CF +:100D20008C2F0E94C309009771F09F938F93DF93DC +:100D3000CF931F930F930E9446060F900F900F9032 +:100D40000F900F900F909FEF29EF80E0915020407F +:100D50008040E1F700C000002196C031D105F9F6CE +:100D600063E082E00E94C3098131910511F170F4C2 +:100D700087309105F1F020F404970297F0F419C040 +:100D800089309105B1F00D97C1F413C08D319105F3 +:100D900081F030F48431910561F0499771F409C014 +:100DA000843C910531F0873C910519F0813C910517 +:100DB00021F481E080934D0102C010924D0163E067 +:100DC00087E00E94C30991E0823009F090E090939F +:100DD0004E01992341F08BE592E09F938F930E94FF +:100DE00046060F900F9023E042E063E082E00E940D +:100DF000430A8EE492E09F938F930E9446060F90E1 +:100E00000F90C1E0D0E004E312E063E08C2F0E9479 +:100E1000C309009771F09F938F93DF93CF931F9334 +:100E20000F930E9446060F900F900F900F900F9017 +:100E30000F908FEF99EF20E0815090402040E1F734 +:100E400000C000002196C031D105F9F6E7E3F1E0DA +:100E500080E18E0F11928E13FDCF0E9418120E9416 +:100E600066098091BE0181608093BE0184E292E0B8 +:100E70000E94AD05569A5E98DF91CF911F910F9118 +:100E80000895CF93DF938FE79BEB0197F1F700C0B5 +:100E900000000E943F0AEC01009711F481E0C3C0FA +:100EA00097FD05C080914701816080934701D7FF7E +:100EB00005C0809147018E7F809347012D2F3327F6 +:100EC0002F733327BE016F737727C6FF02C06054AC +:100ED0007109D6FF02C02054310940913601042E19 +:100EE000000C550B649FC001659F900D749F900D81 +:100EF000112481386FEF960714F481E89FEF9195E4 +:100F00008195910981386FEF960714F481E89FEF7E +:100F1000819580934801249FC001259F900D349FA7 +:100F2000900D112481382FEF920714F481E89FEF80 +:100F300091958195910981386FEF960714F481E8B6 +:100F40009FEF8195809349018091BE0183FF60C02E +:100F50008EE092E00E94AD05DF93CF9388E092E0AF +:100F60009F938F930E94460686E092E00E94AD0513 +:100F700085EF91E00E94AD0580913601282F082E63 +:100F8000000C330B3F938F9380EF91E09F938F93EF +:100F90000E9446068EEE91E00E94AD0580914701C9 +:100FA0001F928F9389EE91E09F938F930E94460644 +:100FB00087EE91E00E94AD0580914801282F082E10 +:100FC000000C330B3F938F9384EE91E09F938F93AC +:100FD0000E94460682EE91E00E94AD058091490193 +:100FE000282F082E000C330B3F938F938FED91E049 +:100FF0009F938F930E9446068CED91E00E94AD0571 +:101000008DB79EB744960FB6F8949EBF0FBE8DBFA6 +:1010100087E491E00E946D128091360191E0883062 +:101020000CF090E0890F80933601DF91CF91089505 +:101030001F93CF93DF9310924C01C0910001D09188 +:1010400001018FEF9FEF9093010180930001CF3F4B +:101050008FEFD80709F06AC08FE79BEB0197F1F794 +:1010600000C0000082E00E943C0AEC01892B09F0DC +:101070005DC080914E01882309F458C087E00E942A +:101080003C0A009709F452C09C012F773327223085 +:101090003105A1F048F42115310569F02130310501 +:1010A00099F480788A641AC02330310551F02F37C3 +:1010B0003105A1F009C08078826410C0807889640D +:1010C0000DC0807888640AC089EC91E09F938F936B +:1010D0000E9446060F900F9081E18FC0292F332781 +:1010E0002F7733272130310579F050F02230310548 +:1010F00079F02330310581F4EC01D078D86416C042 +:10110000EC01D078D26412C0EC01D078DA640EC061 +:10111000EC01D078D9640AC086EB91E09F938F935D +:101120000E9446060F900F9080E167C08091BE013B +:1011300081FF18C0209709F45DC082EA91E00E9407 +:10114000AD05DF93CF938DE991E09F938F930E943C +:1011500046068BE991E00E94AD050F900F900F902D +:101160000F9003C0209709F445C0CF379FE7D907F8 +:1011700011F48FE705C0CF3F8FEFD80721F48FEF31 +:101180000E944F0639C02D2F3327822F1C2F2F3F4F +:10119000310581F4DF93CF938DE791E09F938F9397 +:1011A0000E9446060E9472060F900F900F900F90BB +:1011B0008C2F23C090914D01992381F0A9014F7785 +:1011C00055274233510521F42078822F8A6006C0CA +:1011D0004A30510519F42078822F82630E944F060D +:1011E0001F3F51F0DC2FCC27CF6FD0930101C0936C +:1011F000000102C080E001C081E0DF91CF911F912A +:101200000895E82FF0E0E95CFE4F2081822F90E006 +:1012100021E030E002C0220F331F6A95E2F7282355 +:10122000392381E0232B09F480E00895E82FF0E0D2 +:10123000E95CFE4F80810895CF92DF92EF92FF929A +:101240000F931F93CF93DF938091BE0181FF35C031 +:101250008FE691E00E94AD0587E3E82E81E0F82E4D +:10126000C0E0D0E09AE6C92E91E0D92E02E611E066 +:10127000DF93CF93DF92CF920E94460687E691E0FC +:101280000E94AD05F70181917F010E94F71D1F9219 +:101290008F931F930F930E94460680E691E00E9471 +:1012A000AD0521968DB79EB708960FB6F8949EBFF0 +:1012B0000FBE8DBFC031D105D9F6DF91CF911F91FF +:1012C0000F91FF90EF90DF90CF900895682F609579 +:1012D00082E00C947D0A509A83E091E00197F1F747 +:1012E00000C0000050989AEB9A95F1F700C008955D +:1012F000509A8AEB8A95F1F700C0509883E091E00C +:101300000197F1F700C000000895EF92FF920F934C +:101310001F93CF93DF93C0E0D0E090E8E92EF12C4B +:10132000082F10E0C7010C2E02C0959587950A94EE +:10133000E2F780239123892B19F00E94780902C0DB +:101340000E946B092196C830D10561F7DF91CF91DA +:101350001F910F91FF90EF900895489B06C023E0E6 +:101360002A95F1F700000197C1F70895489906C042 +:1013700023E02A95F1F700000197C1F708955898E6 +:10138000509808950895CF92DF92EF92FF920F93B5 +:101390001F93CF93DF931F92CDB7DEB7182FF8942A +:1013A000509A83EF9BE00197F1F700C0000069833A +:1013B0000E94780969816C6020E1129FC0011124AC +:1013C000862B0E9485090E946B0984EF91E00E94A0 +:1013D000B609892B21F4789482EE9FEF43C084EF05 +:1013E00091E00E94AD09009711F478943BC011E19F +:1013F000C12CD12C02E882E890E00E94B6097C0161 +:10140000882351F199270E94AD09882329F1CC0C3A +:10141000DD1C902F9E19E81A9E1518F46894C0F8E8 +:1014200006C0113121F478948CEE9FEF1BC011504F +:1014300011F78FE591E00E94B609892B21F4789489 +:101440008BEE9FEF0FC08BE590E00E94AD09892BDA +:10145000B1F77894C60106C07894812F90E09195F9 +:10146000819591090F90DF91CF911F910F91FF907E +:10147000EF90DF90CF90089560E00C94C30960E096 +:1014800083E00C94C3091F93CF93DF9300D01F9286 +:10149000CDB7DEB7182FF894509A83EF9BE00197F1 +:1014A000F1F700C000002B834A8369830E9478090A +:1014B0006981686030E1139FC0011124862B0E946E +:1014C00085090E946B098FE193E00197F1F700C055 +:1014D00000000E9478094A81842F0E9485092B818F +:1014E000822F0E9485090E946B0978940F900F90BB +:1014F0000F90DF91CF911F910895262F277040E024 +:1015000062E00C94430A80915A0108959FB7F894C1 +:10151000109251019FBF9091D301943009F057C0B0 +:101520009091E9009F703091EC00232F217030FDE5 +:1015300020E8922B24E02093E9002091EB0020FF8B +:1015400043C02091EE0027FF3FC020914F0122238E +:1015500021F02091E80025FF37C010924F0126E0CE +:101560003091E80035FD15C03091D301343061F57C +:101570003091EB0035FD28C0215021F481E08093AB +:101580004F0122C0EFE9FFE03197F1F700C0000002 +:10159000E7CF8093F1008091E80085FD0AC080913B +:1015A000E80080FFFCCF8091E8008E778093E80010 +:1015B00006C08FB7F89421E0209351018FBF9F7030 +:1015C0009093E90080E008959F709093E9008FEF79 +:1015D0000895CF93DF9300D01F92CDB7DEB79C0163 +:1015E0008091D301843019F593E099833B832A835A +:1015F0009093E9008FEF9091E800815095FD06C02F +:1016000095ED9A95F1F700008111F5CF8091E800F2 +:1016100085FF0DC040E050E063E070E0CE01019630 +:101620000E949C0D8091E8008E778093E8000F90D7 +:101630000F900F90DF91CF910895CF93DF9300D05B +:101640001F92CDB7DEB72091D301243021F522E0DF +:1016500029839B838A8383E08093E9008FEF9091B5 +:10166000E800815095FD06C095ED9A95F1F70000D0 +:101670008111F5CF8091E80085FF0DC040E050E07A +:1016800063E070E0CE0101960E949C0D8091E8001D +:101690008E778093E8000F900F900F90DF91CF919D +:1016A00008952091D3012430F1F422E02093E90041 +:1016B0002FEF3091E800215035FD06C035ED3A9509 +:1016C000F1F700002111F5CF2091E80025FF0BC0B4 +:1016D00040E050E065E070E00E949C0D8091E800E1 +:1016E0008E778093E8000895CF93DF932091D30104 +:1016F000243039F521E02093E9002FEF3091E80004 +:10170000215035FD06C035ED3A95F1F70000211165 +:10171000F5CF2091E80025FF14C0EC0140E050E037 +:1017200068E070E00E949C0D8091E8008E778093C5 +:10173000E80088E0FE01A2E5B1E001900D928A95F3 +:10174000E1F7DF91CF9108958CEC92E00E94AD0516 +:101750008091D201811109C00E94310F0E948E0F29 +:101760008091E20084608093E200089588EC92E02A +:101770000E94AD051092D201089584EC92E00C9481 +:10178000AD05209150012F5F822F62E30E94032755 +:10179000992319F0209350010895109250018091DF +:1017A0005101882371F18091D301843041F58091FA +:1017B000E9008F702091EC00922F917020FD90E84D +:1017C000892B94E09093E9009091EB0090FF14C076 +:1017D0009091EE0097FF10C09091E80095FF03C034 +:1017E0001092F100F9CF9091E80090FF05C0909120 +:1017F000E8009E779093E8008F708093E900109244 +:101800005101089542E061EC81E00E94AB0E42E09C +:1018100061EC82E00E94AB0E42E061EC83E00E944A +:10182000AB0E42E261EC84E00C94AB0E8091D501EA +:10183000833009F453C030F4813071F0823009F400 +:101840008CC008958A3009F478C08B3009F45EC0EA +:10185000893009F09AC020C08091D401813A09F002 +:1018600094C08091E800877F8093E8008091D80140 +:101870009091D901892B21F468E082E591E003C0C1 +:1018800060E080E090E070E00E94E70D8091E80069 +:101890008B778093E80008958091D401813209F01C +:1018A00074C08091D8019091D901892B09F06DC045 +:1018B0008091E800877F8093E8008091E80082FDB6 +:1018C00005C08091D3018111F8CF5FC08091F100F4 +:1018D00080935A018091E8008B7753C08091D401A6 +:1018E000813A09F052C08091D8019091D901892B99 +:1018F00009F04BC08091E800877F8093E8008091D9 +:10190000E80080FFFCCF80910C0136C08091D401AB +:101910008132D9F58091D8019091D901892BA9F50F +:101920008091E800877F8093E8000E94E00E80911C +:10193000D60180930C010C942E188091D401813231 +:1019400021F58091E800877F8093E8000E94E00EF7 +:101950008091D70180935B0108958091D401813AF1 +:10196000A1F48091E800877F8093E8008091E800EF +:1019700080FFFCCF80915B018093F1008091E800B3 +:101980008E778093E8000C94E00E089508950895F2 +:10199000089580EC92E00E94AD050C94C80C0E9462 +:1019A000211E8091D101882329F00E944C1E8111B3 +:1019B0000C94860D089584B7877F84BF0FB6F89482 +:1019C000A89580916000886180936000109260000B +:1019D0000FBE90E080E80FB6F8948093610090937A +:1019E00061000FBE0E94C60C0E94A5120E94310F1A +:1019F0000E948E0F8091E20084608093E20086E86E +:101A00009AE00E94F21D78948091D3018430E1F72E +:101A10008BEA92E00E94AD050E94A71282E091E05D +:101A20000E9413128AE992E00E94AD050E94C70C41 +:101A30008091D301853039F486E992E00E94AD05AA +:101A40000E94CF0CF5CF0E94AD12F2CF0C94601E15 +:101A50008CEB92E00E94AD050C94260D292F3327C4 +:101A600023303105C9F064F42130310581F0223092 +:101A7000310509F043C084E790E024E133E042C03F +:101A800021323105F1F02232310541F137C082E1D6 +:101A900090E028E833E036C099278130910541F085 +:101AA0008230910541F0892B49F5E0E1F3E005C072 +:101AB000E0E0F3E002C0E0EDF2E0849190E09F010D +:101AC00021C06430D8F4E62FF0E0EE0FFF1FEF5D89 +:101AD000FE4F2081318189E090E014C0643070F4C1 +:101AE00070E0FB01EE0FFF1FE75EFE4F20813181AA +:101AF000FB01EB5EFE4F808190E004C080E090E04F +:101B000020E030E0FA0131832083089580E189BD2F +:101B100082E189BD09B400FEFDCF8091D8008F7DA0 +:101B20008093D8008091E00082608093E0008091F3 +:101B3000E00081FDFCCF0895CF92DF92EF92FF92FB +:101B40000F931F93CF93DF93EC018B016A010E94E7 +:101B5000FF0E811133C0C114D10439F0F601808128 +:101B60009181081B190BC80FD91FE12CF12C01150D +:101B7000110519F18091E80085FD16C08091E800FB +:101B80008E778093E800C114D10449F0F60180817A +:101B90009181E80EF91EF182E08285E00FC00E947B +:101BA000FF0E882321F30AC089918093F100015030 +:101BB0001109FFEFEF1AFF0ADACF80E0DF91CF9132 +:101BC0001F910F91FF90EF90DF90CF90089520919B +:101BD000DA013091DB012617370748F061157105EE +:101BE00039F42091E8002E772093E80001C0B90174 +:101BF00040E061157105A9F12091D301222309F478 +:101C000043C0253009F442C02091E80023FD40C0C4 +:101C10002091E80022FD32C02091E80020FFE9CFAA +:101C20004091F3002091F20030E0342BFC01CF0111 +:101C30006115710559F02830310540F48191809388 +:101C4000F100615071092F5F3F4FF1CF41E0283023 +:101C5000310509F040E02091E8002E772093E8005C +:101C6000C8CF4111C9CF0AC08091D301882361F048 +:101C7000853061F08091E80083FD0AC08091E80022 +:101C800082FFF2CF80E0089582E0089583E0089516 +:101C900081E008952091DA013091DB0126173707A2 +:101CA00048F06115710539F42091E8002E772093F2 +:101CB000E80001C0B901FC0120E06115710591F156 +:101CC0008091D301882309F440C0853009F43FC0D6 +:101CD0008091E80083FD3DC08091E80082FD2FC027 +:101CE0008091E80080FFE9CF2091F3008091F2001D +:101CF00090E0922B6115710559F08830910540F400 +:101D000024912093F1003196615071090196F2CF30 +:101D100021E0089709F020E08091E8008E77809319 +:101D2000E800CBCF2111CCCF0AC08091D30188230A +:101D300061F0853061F08091E80083FD0AC08091F8 +:101D4000E80082FFF2CF80E0089582E0089583E00A +:101D5000089581E00895982F973058F59093E90001 +:101D6000981739F07091EC002091ED005091F0003F +:101D700003C0242F762F50E021FF19C03091EB00D3 +:101D80003E7F3093EB003091ED003D7F3093ED00CE +:101D90003091EB0031603093EB007093EC002093B6 +:101DA000ED005093F0002091EE0027FF07C09F5FE9 +:101DB000D3CF8F708093E90081E0089580E008958B +:101DC0008091D40187FF11C08091E80082FD05C099 +:101DD0008091D3018111F8CF11C08091E8008B77F9 +:101DE0000BC08091D301882349F08091E80080FFE7 +:101DF000F8CF8091E8008E778093E80008952091D5 +:101E0000E4003091E50095E64091EC00842F81706C +:101E100040FF22C08091E80080FD1CC08091D3016A +:101E2000882391F0853091F08091EB0085FD10C002 +:101E30004091E4005091E5004217530729F39A01BD +:101E4000915011F784E0089582E0089583E00895A9 +:101E500081E0089580E008954091E80042FFDECFE0 +:101E600008950E949F0F0E94A70FE0EEF0E080818E +:101E700081608083E8EDF0E080818F77808319BCFA +:101E8000A7EDB0E08C918E7F8C9380818F7E8083D4 +:101E90001092D20108950F931F93CF93DF930E9466 +:101EA0009F0F0E94A70FC8EDD0E088818F778883AD +:101EB00088818068888388818F7D888319BC10928F +:101EC000D3011092CF011092D1011092D00100EEF7 +:101ED00010E0F80180818B7F808388818160888316 +:101EE00042E060E080E00E94AB0EE1EEF0E0808135 +:101EF0008E7F8083E2EEF0E080818160808380814C +:101F000088608083F80180818E7F808388818061F2 +:101F10008883DF91CF911F910F910895E8EDF0E054 +:101F200080818F7E8083E7EDF0E080818160808317 +:101F300084E082BF81E08093D2010C944B0FE8EDE6 +:101F4000F0E080818E7F80831092E20008951092ED +:101F5000DA001092E10008951F920F920FB60F92CF +:101F600011242F933F934F935F936F937F938F939E +:101F70009F93AF93BF93EF93FF938091E10082FF14 +:101F80000BC08091E20082FF07C08091E1008B7F4F +:101F90008093E1000E94C10B8091DA0080FF1FC096 +:101FA0008091D80080FF1BC08091DA008E7F8093E3 +:101FB000DA008091D90080FF0DC080E189BD82E107 +:101FC00089BD09B400FEFDCF81E08093D3010E945A +:101FD000A40B05C019BC1092D3010E94B60B8091CE +:101FE000E10080FF19C08091E20080FF15C0809160 +:101FF000E2008E7F8093E2008091E2008061809316 +:10200000E2008091D80080628093D80019BC85E0FE +:102010008093D3010E94C90C8091E10084FF30C0FD +:102020008091E20084FF2CC080E189BD82E189BDFE +:1020300009B400FEFDCF8091D8008F7D8093D80039 +:102040008091E1008F7E8093E1008091E2008F7E9D +:102050008093E2008091E20081608093E2008091B1 +:10206000CF01882311F084E007C08091E30087FD51 +:1020700002C081E001C083E08093D3010E94280D5B +:102080008091E10083FF29C08091E20083FF25C099 +:102090008091E100877F8093E10082E08093D3010B +:1020A0001092CF018091E1008E7F8093E1008091BA +:1020B000E2008E7F8093E2008091E2008061809355 +:1020C000E20042E060E080E00E94AB0E8091F00010 +:1020D00088608093F0000E94BD0BFF91EF91BF914B +:1020E000AF919F918F917F916F915F914F913F91B0 +:1020F0002F910F900FBE0F901F9018951F920F9267 +:102100000FB60F9211242F933F934F935F936F93CA +:102110007F938F939F93AF93BF93CF93DF93EF936F +:10212000FF93C091E900CF708091EC00D82FD1705F +:1021300080FDD0E81092E9008091F000877F8093C5 +:10214000F00078940E94C2101092E9008091F00093 +:1021500088608093F000CD2BCF70C093E900FF9191 +:10216000EF91DF91CF91BF91AF919F918F917F912F +:102170006F915F914F913F912F910F900FBE0F90F4 +:102180001F9018951F93CF93DF93CDB7DEB7AA9713 +:102190000FB6F894DEBF0FBECDBFE4EDF1E088E0EE +:1021A0008E0F9091F10091938E13FBCF0E94160C2D +:1021B0008091E80083FF1FC18091D4019091D501E7 +:1021C000492F50E04A30510508F015C1FA01EA5A8A +:1021D000FF4F0C942327803881F0823809F00BC11F +:1021E0008091D8018F708093E9008091EB0085FB8E +:1021F000882780F91092E90006C08091D001909163 +:10220000D101911182609091E800977F9093E8004E +:102210008093F1001092F100C8C0282F2D7F09F0A3 +:10222000EAC0882319F0823061F0E5C08091D601C0 +:10223000813009F0E0C0933009F080E08093D10153 +:102240002BC08091D601811127C08091D8018F7059 +:1022500009F4D1C08093E9002091EB0020FF1CC05D +:10226000933021F48091EB00806214C09091EB00D8 +:1022700090619093EB0021E030E0A90102C0440F8F +:10228000551F8A95E2F74093EA001092EA00809188 +:10229000EB0088608093EB001092E9008091E800E9 +:1022A000877F86C08111A7C01091D6011F778091CA +:1022B000E3008078812B8093E3008091E800877FA2 +:1022C0008093E8000E94E00E8091E80080FFFCCF40 +:1022D0008091E30080688093E300111102C082E0E6 +:1022E00001C083E08093D30186C08058823008F01B +:1022F00082C08091D6019091D7018C3D53E0950723 +:1023000079F583E08A838AE289834FB7F894DE0106 +:10231000139620E03EE051E2E32FF0E050935700A7 +:10232000E49120FF03C0E295EF703F5FEF708E2FC6 +:1023300090E0EA3010F0C79601C0C0968D939D934F +:102340002F5F243149F74FBF8091E800877F80934A +:10235000E8006AE270E0CE0101960E94E70D14C029 +:10236000AE014F5F5F4F6091D8010E942E0DBC01FE +:10237000892B09F440C09091E800977F9093E80082 +:1023800089819A810E944A0E8091E8008B77809320 +:10239000E80031C0803879F58091E800877F80932C +:1023A000E8008091CF018093F1008091E8008E7762 +:1023B0008093E8000E94E00E1EC081111CC0909125 +:1023C000D6019230C0F48091E800877F8093E800C6 +:1023D0009093CF010E94E00E8091CF01811106C041 +:1023E0008091E30087FD02C081E001C084E080931A +:1023F000D3010E94020C8091E80083FF0AC0809103 +:10240000E800877F8093E8008091EB0080628093F2 +:10241000EB00AA960FB6F894DEBF0FBECDBFDF91DA +:10242000CF911F9108959093610180936001089569 +:10243000E0916001F0916101309721F00190F0810D +:10244000E02D099480E00895EF92FF920F931F937F +:10245000CF93DF93E0916001F09161013097B1F18A +:102460008C010280F381E02D09958091BE0182FFED +:102470002DC080FF04C087E894E00E94AD05E8010C +:1024800018E081E8E82E84E0F82E8091BE0180FFFC +:102490000BC088811F928F93FF92EF920E94460695 +:1024A0000F900F900F900F90115021961111EDCFBA +:1024B0008091BE0180FF0AC08FE794E0DF91CF9149 +:1024C0001F910F91FF90EF900C94AD05DF91CF918C +:1024D0001F910F91FF90EF900895E0916001F091AE +:1024E0006101309721F00480F581E02D0994089571 +:1024F00020915E0130915F018217930771F09093F4 +:102500005F0180935E01E0916001F091610130977D +:1025100021F00680F781E02D0994089520915C0157 +:1025200030915D018217930771F090935D01809364 +:102530005C01E0916001F0916101309721F000842D +:10254000F185E02D0994089508950C94A4120E9439 +:102550008B1E0E9472060C94C209CF92DF92EF92FA +:10256000FF920F931F93CF93DF9300D000D000D042 +:10257000CDB7DEB70E94180883E6C82E81E0D82EBA +:1025800000E010E0E02E802F0E941609F601419134 +:102590006F01F42EF826B1F40F5F1F4F00311105C3 +:1025A00089F78FEF89838A831B820E94941E816042 +:1025B000782F9D838C8349815A816B818D810E9404 +:1025C0006E1347C09091BE0191FF04C08E830E949C +:1025D0001C098E8120E030E04F2D50E0922FBA018F +:1025E000022E02C0759567950A94E2F760FF2BC032 +:1025F0002983EA8221E030E0690102C0CC0CDD1CB5 +:102600009A95E2F790E08C219D21892B09F420E036 +:102610002B830E94941E8160782F9D838C83498137 +:102620005A816B818D810E946E1349815A816B8121 +:102630007C818D810E940E1EF801ED59FE4F808134 +:10264000C826C08206C02F5F3F4F2830310531F6C3 +:10265000A3CF0E940D1E0E9455210E944107109198 +:1026600062010E941812181741F10E9418128093FB +:1026700062019091BE0192FF0EC090FF0CC01F92AC +:102680008F9389E994E09F938F930E9446060F9061 +:102690000F900F900F908091620126960FB6F894DC +:1026A000DEBF0FBECDBFDF91CF911F910F91FF9085 +:1026B000EF90DF90CF900C941F1E26960FB6F894E3 +:1026C000DEBF0FBECDBFDF91CF911F910F91FF9065 +:1026D000EF90DF90CF9008950C946609CF93DF932D +:1026E000CDB7DEB72B970FB6F894DEBF0FBECDBFC8 +:1026F000942F4F83252F588769877A878B874A8540 +:102700005B85452B21F02F3F09F59F3FF9F4DE0152 +:10271000119686E0FD0111928A95E9F785E0FE01A8 +:10272000379601900D928A95E1F749815A816B8124 +:102730007C818D819E810E94C81A2B960FB6F894D9 +:10274000DEBF0FBECDBFDF91CF9108954F81588579 +:1027500069857A858B850E940E1ED9CFCF938823F9 +:1027600009F4E8C0C82F8238A1F40E94181281FD34 +:10277000E1C089E30E94531D0E94CC1D2FEF81EE22 +:1027800094E0215080409040E1F700C0000089E3D0 +:1027900015C08338C1F40E94181280FDCBC083E5B8 +:1027A0000E94531D0E94CC1D2FEF81EE94E021501A +:1027B00080409040E1F700C0000083E50E94701D5A +:1027C000CF910C94CC1D8438A1F40E94181282FD84 +:1027D000B1C087E40E94531D0E94CC1D2FEF81EEF3 +:1027E00094E0215080409040E1F700C0000087E471 +:1027F000E5CF8CEF8C0F813A48F48C2F0E947F2418 +:10280000811198C08C2F0E94531DDACF80E28C0F6B +:10281000883048F4C77081E001C0880FCA95EAF794 +:102820000E94921DCDCF8BE58C0F833078F4C53A92 +:1028300029F0C63A31F083E890E005C081E890E0E5 +:1028400002C082E890E0CF910C94781288E58C0F5A +:10285000853108F06FC0C83A61F1C93A69F1CA3AE6 +:1028600071F1CB3A79F1CC3A81F1CD3A89F1CE3A96 +:1028700091F1CF3A99F1C13BA1F1C03BA9F1C23B23 +:10288000B1F1C33BB9F1C43BC1F1C53BC9F1C63B92 +:10289000D1F1C73BD9F1C83BE1F1C93BE9F1CA3BF2 +:1028A000F1F1CB3BF9F1CC3B09F43FC080E090E083 +:1028B0003EC082EE90E03BC089EE90E038C08AEEE8 +:1028C00090E035C085EB90E032C086EB90E02FC001 +:1028D00083EB90E02CC084EB90E029C087EB90E084 +:1028E00026C08CEC90E023C08DEC90E020C083E803 +:1028F00091E01DC08AE891E01AC082E991E017C01A +:1029000084E991E014C081E292E011C083E292E098 +:102910000EC084E292E00BC085E292E008C086E23D +:1029200092E005C087E292E002C08AE292E0CF9195 +:102930000C948E12CF910895882309F466C08238D2 +:10294000A1F40E94181281FF60C089E30E94531D08 +:102950000E94CC1D2FEF81EE94E0215080409040EA +:10296000E1F700C0000089E315C08338B9F40E9484 +:10297000181280FF4AC083E50E94531D0E94CC1D9F +:102980002FEF81EE94E0215080409040E1F700C0AD +:10299000000083E50E94701D0C94CC1D8438A1F4C6 +:1029A0000E94181282FF31C087E40E94531D0E94CA +:1029B000CC1D2FEF81EE94E0215080409040E1F754 +:1029C00000C0000087E4E6CF9CEF980F913A10F327 +:1029D00090E2980F983050F4877091E001C0990F01 +:1029E0008A95EAF7892F0E94981DD6CF9BE5980F0C +:1029F000933020F480E090E00C947812885A85316E +:102A000020F480E090E00C948E120895882321F049 +:102A10000E94921D0C94CC1D0895882321F00E94E1 +:102A2000981D0C94CC1D0895CF92DF92EF92FF92E7 +:102A30000F931F93CF93DF9300D000D000D0CDB77A +:102A4000DEB725E0FC01DE01119601900D922A957A +:102A5000E1F7FC0140813181F280258122952F70C0 +:102A600063817481672B09F4D8C23F3F19F44F3F4B +:102A700009F4D3C26C0149833A8389819A812E83F8 +:102A80000E94121D182F092F0E94111D0E94211C47 +:102A9000E02FE295EF70F0E0E05AFF4F2E810C94AA +:102AA0002327802F807F902F9F70092F882311F07C +:102AB0000295007FFF2049F0002309F45FC2802FB8 +:102AC0000E94A51D0E94CC1D59C2812F0E949C14FA +:102AD000002309F4A2C2802F0E94AB1D26960FB6D8 +:102AE000F894DEBF0FBECDBFDF91CF911F910F9144 +:102AF000FF90EF90DF90CF900C94CC1D802F807FC3 +:102B0000902F9F70092F803211F00295007F1123C2 +:102B100019F0113001F129C0FF20A9F0802F2223E4 +:102B200049F1213039F526960FB6F894DEBF0FBE75 +:102B3000CDBFDF91CF911F910F91FF90EF90DF906C +:102B4000CF900C94B51D222319F0213009F465C2F1 +:102B50000E94B81D2CC0FF20E9F0263008F05DC2AD +:102B60000E948F1D802329F022C0FF20F1F0211147 +:102B700015C0802F26960FB6F894DEBF0FBECDBFCE +:102B8000DF91CF911F910F91FF90EF90DF90CF9049 +:102B90000C940615253008F040C209C0F601858165 +:102BA00080FFECC18F708583E4CF2111FBC1802FA2 +:102BB00069C1202F26952695237030E02115310517 +:102BC00021F021303105C9F028C2FF2021F0812FEA +:102BD000902F937002C080E090E026960FB6F89494 +:102BE000DEBF0FBECDBFDF91CF911F910F91FF9040 +:102BF000EF90DF90CF900C947812FF2021F0812F7E +:102C0000902F937002C080E090E026960FB6F89463 +:102C1000DEBF0FBECDBFDF91CF911F910F91FF900F +:102C2000EF90DF90CF900C948E12812FFF2019F03F +:102C30000E94DB1F02C00E94432026960FB6F89424 +:102C4000DEBF0FBECDBFDF91CF911F910F91FF90DF +:102C5000EF90DF90CF900C94C820802F837009F004 +:102C600078C0F110DAC1812F829586958770880F20 +:102C7000880F912F9F70C92ED12CE12CF12C082E9A +:102C800004C0CC0CDD1CEE1CFF1C0A94D2F714FF10 +:102C900012C04FE050E060E070E004C0440F551FE8 +:102CA000661F771F8A95D2F7CB01BA0160957095A0 +:102CB0008095909503C060E070E0CB01202F2695B1 +:102CC00026952370422F50E042305105D1F0433019 +:102CD000510559F16C297D298E299F2941305105D3 +:102CE00041F126960FB6F894DEBF0FBECDBFDF913F +:102CF000CF911F910F91FF90EF90DF90CF900C94A8 +:102D0000361C6C297D298E299F2926960FB6F894AA +:102D1000DEBF0FBECDBFDF91CF911F910F91FF900E +:102D2000EF90DF90CF900C94481C0E94361CC70196 +:102D3000B60126960FB6F894DEBF0FBECDBFDF9169 +:102D4000CF911F910F91FF90EF90DF90CF900C9457 +:102D5000241CFF2019F0802F817001C086958823E4 +:102D600009F45BC1812F829586958770880F880F43 +:102D7000912F9F70C92ED12CE12CF12C082E04C06C +:102D8000CC0CDD1CEE1CFF1C0A94D2F714FF12C001 +:102D90004FE050E060E070E004C0440F551F661F34 +:102DA000771F8A95D2F7CB01BA016095709580950F +:102DB000909503C060E070E0CB01202F269526950A +:102DC0002370422F50E042305105D1F0433051057D +:102DD00059F16C297D298E299F294130510541F1F6 +:102DE00026960FB6F894DEBF0FBECDBFDF91CF9110 +:102DF0001F910F91FF90EF90DF90CF900C94ED1CFE +:102E00006C297D298E299F2926960FB6F894DEBF5E +:102E10000FBECDBFDF91CF911F910F91FF90EF902B +:102E2000DF90CF900C94FF1C0E94ED1CC701B601EF +:102E300026960FB6F894DEBF0FBECDBFDF91CF91BF +:102E40001F910F91FF90EF90DF90CF900C94DB1CBF +:102E5000103F41F118F4103E48F48BC0123F09F4C2 +:102E600050C0D8F1133F09F460C083C01F70802F99 +:102E70008F71FF2021F00E94741C812F7BCE0E9455 +:102E8000951C812F26960FB6F894DEBF0FBECDBFDE +:102E9000DF91CF911F910F91FF90EF90DF90CF9036 +:102EA0000C940D15FF20A9F0253008F0B6C0802F36 +:102EB0008F7126960FB6F894DEBF0FBECDBFDF919F +:102EC000CF911F910F91FF90EF90DF90CF900C94D6 +:102ED000BA1C263008F0A1C0EACFFF20A1F0802F55 +:102EE0008F7126960FB6F894DEBF0FBECDBFDF916F +:102EF000CF911F910F91FF90EF90DF90CF900C94A6 +:102F0000741CFF2061F3802F8F7126960FB6F89402 +:102F1000DEBF0FBECDBFDF91CF911F910F91FF900C +:102F2000EF90DF90CF900C94951CFF2091F0802FB4 +:102F30008F7126960FB6F894DEBF0FBECDBFDF911E +:102F4000CF911F910F91FF90EF90DF90CF900C9455 +:102F50005F1C26960FB6F894DEBF0FBECDBFDF9183 +:102F6000CF911F910F91FF90EF90DF90CF900C9435 +:102F70005A1CFF20A1F0222309F4B1CF812F2696FD +:102F80000FB6F894DEBF0FBECDBFDF91CF911F917A +:102F90000F91FF90EF90DF90CF900C94AE1322230F +:102FA00009F4B1CF812F26960FB6F894DEBF0FBE7D +:102FB000CDBFDF91CF911F910F91FF90EF90DF90E8 +:102FC000CF900C949C14402F4F70612FC6010E942B +:102FD000551F26960FB6F894DEBF0FBECDBFDF910A +:102FE000CF911F910F91FF90EF90DF90CF900C94B5 +:102FF0006C1B402F4F70612FC60126960FB6F894B8 +:10300000DEBF0FBECDBFDF91CF911F910F91FF901B +:10301000EF90DF90CF900C94581F26960FB6F8943F +:10302000DEBF0FBECDBFDF91CF911F910F91FF90FB +:10303000EF90DF90CF9008950E94B21D0E94811DF5 +:103040000E94CC1D0E94FA210E94C82080E090E0DE +:103050000E94781280E090E00C948E120E94A21DD3 +:103060000C941C180E94121D292F22952F7030E0FD +:103070002C3031054CF42A3031056CF422503109E2 +:103080002230310588F407C02C30310549F02F304B +:10309000310531F009C0803E48F0803F29F406C078 +:1030A00093FB882780F9089580E0089581E00895D2 +:1030B000CF93DF9300D000D01F92CDB7DEB70F9033 +:1030C0000F900F900F900F90DF91CF910895CF93B5 +:1030D000DF9300D000D000D0CDB7DEB726960FB674 +:1030E000F894DEBF0FBECDBFDF91CF9108951F933F +:1030F000CF93DF93C091730116E080917401C817DC +:1031000099F0D0E01C9FF0011D9FF00D1124EB58A9 +:10311000FE4F4081518162817381848195810E943B +:1031200067182196C770E9CFDF91CF911F9108955D +:103130004091A5015091A6016091A7017091A8014D +:103140008091A9019091AA010C9467188091AA011D +:1031500082958F7009F054C08091A701882309F4EB +:103160004FC080917301A09174016091A50170918D +:10317000A6014091A8015091A901B6E08A1709F46F +:103180003FC090E041155105C1F17F3F11F46F3F01 +:10319000A1F1B89FF001B99FF00D1124EB58FE4F3B +:1031A000218172132AC02081621327C0228121113C +:1031B00024C0238134812417350710F421503109AC +:1031C000241B350B283C3105C0F42091AA012F7037 +:1031D00020612093AA0126E0289FF001299FF00D8D +:1031E0001124E658FE4F80818F708061808385EACC +:1031F00091E00E9414150C94771801968770BECF49 +:103200000895CF92DF92EF92FF920F931F93CF9387 +:10321000DF93CDB7DEB762970FB6F894DEBF0FBE6F +:10322000CDBF8C0185E0F801DE011D9601900D9265 +:103230008A95E1F7D8014C9111965C9111971296FD +:103240006C9112971396CD90DC9014973091A50154 +:103250007091A6018091A8019091A901009709F4AD +:103260006BC17F3F19F43F3F09F466C1E090A701AD +:10327000EE2009F4C0C02091AA01C816D90628F092 +:10328000F601E81BF90BCF0104C0809590958C0DD9 +:103290009D1DFF24F394883C910578F0F12C207F4C +:1032A00009F0C6C07C2DD98AC88A89890E9458181D +:1032B00085EA91E00E941415B1C0822F807F09F049 +:1032C00046C0751314C0341312C0611110C02F70A2 +:1032D00020612093AA010E94981885EA91E00E943B +:1032E00014158091AA01D80115968C932EC0CD2873 +:1032F00019F15F3F11F44F3FF9F0F62E61111CC038 +:10330000809173012091740136E0821709F45AC04C +:1033100090E0389FF001399FF00D1124EB58FE4FDB +:103320007181571306C07081471303C072817111F8 +:1033300003C001968770E9CFF62E662309F418C101 +:103340008091AA0181608093AA01F12C11C17513AB +:1033500008C0341306C0611104C08091AA01D801CD +:10336000C3C04D875E878D859E856A8B0E9432180B +:103370006A898823E1F16623D1F12091AA01822F85 +:1033800082958F7090E0029774F08091A5019091E2 +:10339000A60198878F831986DB86CA862C87CE0183 +:1033A00007960E94141586E0F801A5EAB1E00190A5 +:1033B0000D928A95E1F70E94A6180E949818FF24A2 +:1033C000F394D6C04D875E878D859E850E94121D21 +:1033D000292F22952F7030E0223031050CF0BCC02F +:1033E0009F7009F0B6C0805E883008F4C1C0C80183 +:1033F0000E941415E4CFC816D90608F453C0F6018C +:10340000E81BF90BCF01883C910508F450C0F12C62 +:103410007C2DD98AC88A89890E945818E5EAF1E08A +:1034200086E0DF011D928A95E9F70E949818A0C0F6 +:10343000751314C0341312C0611110C08091AA0119 +:10344000F8018583C8010E94141586E0E5EAF1E0E1 +:10345000DF011D928A95E9F7FE2C8AC04D875E87B1 +:103460008D859E856A8B0E9432186A89882309F4AB +:10347000BECF662309F4BBCF2091AA01822F82958B +:103480008F7090E002970CF48ECF8091A5019091FF +:10349000A6019A8389831B82DD82CC822E83CE0192 +:1034A00001967FCF809590958C0D9D1DACCFF62E0B +:1034B000662309F49CCF75132EC034132CC02091C1 +:1034C000AA0120FD1FC0822F82958F70D9F0D801EC +:1034D00015962C9315978F3049F08F5F982F929502 +:1034E000907F822F8F70892B15968C93C8010E9434 +:1034F000141586E0F801A5EAB1E001900D928A95D5 +:10350000E1F793CF86E0F801A5EAB1E001900D92D2 +:103510008A95E1F72DC04D875E878D859E850E9437 +:103520003218811140CF8091AA0181608093AA0155 +:10353000C8010E9414151CC0662309F458CF4D879A +:103540005E878D859E850E943218882309F44FCFAF +:103550002ACF811148CF0CC0243031050CF047CF61 +:103560009F7009F440CFF8019581907F09F03BCF1F +:103570008F2D62960FB6F894DEBF0FBECDBFDF91E0 +:10358000CF911F910F91FF90EF90DF90CF90089512 +:103590001F93CF93DF93CDB7DEB72C970FB6F89478 +:1035A000DEBF0FBECDBF4F83588769877A878B8771 +:1035B0009C87CE0107960E940119882369F08F81AC +:1035C00098852A853B85232BF1F19F3F09F063C045 +:1035D0008F3F09F060C037C086E0FE013796DE01FC +:1035E000119601900D928A95E1F76F817885EA85B1 +:1035F000FB85309741F17F3F11F46F3F21F120911E +:10360000740130E0C90101968770992740917301D8 +:1036100050E08417950709F447C069837A83FD83D6 +:10362000EC8396E0929FD001939FB00D1124AB588C +:10363000BE4FFE01319601900D929A95E1F780936D +:1036400074010E94771816E08091730190917401C3 +:103650008917C1F1189FC00111248B589E4F0E94F9 +:103660000119882379F1E09173011E9FF001112463 +:10367000EB58FE4F40815181628173818481958135 +:103680000E9467188091730190E0019687709927D6 +:1036900080937301D9CF4F81588569857A858B8551 +:1036A0009C850E946718CFCF0E942E18109274013B +:1036B00010927301E5EAF1E086E0DF011D928A9540 +:1036C000E9F7C1CF2C960FB6F894DEBF0FBECDBF81 +:1036D000DF91CF911F910895DF92EF92FF920F93A8 +:1036E0001F93CF93DF93FC01892B09F48AC0E12C4F +:1036F000F12CDD24D394EF0121968491853709F4D0 +:1037000061C058F4843708F04EC0843008F06AC0B5 +:103710008130D1F0823071F174C0883709F45DC016 +:1037200050F4863709F455C0873709F06AC08E2DEA +:103730000E949F1D54C09CE7980F903708F061C00D +:103740008F770E949C1450C08F010E5F1F4FFE01A7 +:10375000849190E2980F983050F48770FD2D01C04D +:10376000FF0F8A95EAF78F2F0E94A51D14C00E94B3 +:10377000AE1313C08F010E5F1F4FFE01C49180E294 +:103780008C0F883060F4C7708D2D01C0880FCA95EA +:10379000EAF70E94AB1D0E94CC1DE80125C08C2FCA +:1037A0000E949C14FACF9F012E5F3F4FFE01C491EF +:1037B000CC2369F08FE99FE00197F1F700C000008A +:1037C000C150F6CF9F012E5F3F4FFE01F490E901FB +:1037D0000BC00E948F1DE82E07C00E94A21D0E94F0 +:1037E000CC1D02C00E94AE138F2D882341F0EFE95B +:1037F000FFE03197F1F700C000008150F6CFFE01E5 +:103800007ACFDF91CF911F910F91FF90EF90DF90D2 +:1038100008956093AF017093B0018093B1019093CC +:10382000B2010E941D1E0C941C186093AB01709392 +:10383000AC018093AD019093AE010E941E1E0C94CA +:103840001C1808950C94091C0F931F930091AF014D +:103850001091B0012091B1013091B201602B712B18 +:10386000822B932B1F910F910C94091C0F931F9384 +:103870000091AF011091B0012091B1013091B201DE +:1038800060237123822393231F910F910C94091CB1 +:103890000F931F930091AF011091B0012091B101DE +:1038A0003091B20160277127822793271F910F91D2 +:1038B0000C94091C60E070E0CB010C94151C0F9374 +:1038C0001F9341E050E060E070E08A019B0104C07A +:1038D000000F111F221F331F8A95D2F7C901B801AB +:1038E0001F910F910C94151C0F931F9341E050E012 +:1038F00060E070E004C0440F551F661F771F8A9573 +:10390000D2F78091AB019091AC01A091AD01B09143 +:10391000AE018A019B01082B192B2A2B3B2BC901D5 +:10392000B8011F910F910C94151C0F931F9341E048 +:1039300050E060E070E004C0440F551F661F771F21 +:103940008A95D2F740955095609570958091AB011E +:103950009091AC01A091AD01B091AE018A019B01A3 +:10396000082319232A233B23C901B8011F910F9172 +:103970000C94151C0F931F9341E050E060E070E041 +:1039800004C0440F551F661F771F8A95D2F7809198 +:10399000AB019091AC01A091AD01B091AE018A0153 +:1039A0009B01082719272A273B27C901B8011F9126 +:1039B0000F910C94151C0F931F930091AB01109164 +:1039C000AC012091AD013091AE01602B712B822BA7 +:1039D000932B1F910F910C94151C0F931F93009123 +:1039E000AB011091AC012091AD013091AE0160238B +:1039F0007123822393231F910F910C94151C0F9315 +:103A00001F930091AB011091AC012091AD01309159 +:103A1000AE0160277127822793271F910F910C9485 +:103A2000151C0895CF92DF92EF92FF920F931F9390 +:103A3000CF93DF938C01C090AF01D090B001E090A4 +:103A4000B101F090B2014091AB015091AC01609195 +:103A5000AD017091AE01C42AD52AE62AF72ACFE13A +:103A6000D0E0D701C6010C2E04C0B695A795979556 +:103A700087950A94D2F780FF07C0B8018C2F0E9467 +:103A80002B1F8130910531F4219758F7B80180E060 +:103A90000E942B1FDF91CF911F910F91FF90EF900C +:103AA000DF90CF90089520910D0130910E01F90122 +:103AB00032969FEF40E05191581789F09F3F19F4DB +:103AC000511101C0942F4F5F4630A9F79F3F39F045 +:103AD000F901E90FF11D97FDFA9582830895089584 +:103AE00020910D0130910E01F9013296285F3F4F70 +:103AF0009081981301C010823196E217F307C1F745 +:103B0000089581E090E0E0910D01F0910E01E80F41 +:103B1000F91F1082019688309105A9F708958091C8 +:103B2000BD0108959091BD01892B8093BD01089539 +:103B300080959091BD0189238093BD010895809364 +:103B4000BD0108951092BD0108959091BC01892B8B +:103B50008093BC01089580959091BC018923809346 +:103B6000BC0108951092BC0108958093B30108959B +:103B70001092B301089580910D0190910E01FC0106 +:103B800031969C01285F3F4F80E0919191118F5FAA +:103B9000E217F307D1F70895E0910D01F0910E01BE +:103BA0008091BD018083E0910D01F0910E01908123 +:103BB0008091BC01892B80838091B301882361F0BF +:103BC000E0910D01F0910E019081892B80830E947C +:103BD000BB1D81111092B30180910D0190910E01D6 +:103BE0000C942412909335018093340108958295AA +:103BF000982F9C7C392F36953695282F237344E0D7 +:103C0000249FC0011124932F982B292F2A7A2695BF +:103C1000892F8575880F822B08950895CF93DF93A0 +:103C200000D000D01F92CDB7DEB70F900F900F904D +:103C30000F900F90DF91CF910895089508950C94FF +:103C40006C138091D301843021F11092BF0120E4E4 +:103C500088E190E00FB6F894A895809360000FBEBD +:103C60002093600083B7817F846083BF83B78160C6 +:103C700083BF7894889583B78E7F83BF0FB6F894FF +:103C8000A895809160008861809360001092600028 +:103C90000FBE089508950895CF930E944A1E0E9472 +:103CA00018080E944B1EC0E08C2F0E94160981113B +:103CB00004C0CF5FC031C1F701C081E0CF9108954A +:103CC0000C942E181F920F920FB60F9211248F93FF +:103CD0009F93AF93BF938091BF01811113C08091D7 +:103CE000C0019091C101A091C201B091C301419660 +:103CF000A11DB11D8093C0019093C101A093C20189 +:103D0000B093C301BF91AF919F918F910F900FBE60 +:103D10000F901F90189582E084BD93E095BD9AEFB7 +:103D200097BD80936E0008952FB7F8948091C001DD +:103D30009091C101A091C201B091C3012FBF08951C +:103D40002FB7F8946091C0017091C1018091C201B8 +:103D50009091C3012FBF0895CF92DF92EF92FF920F +:103D60000F931F932FB7F8944091C0015091C10158 +:103D70006091C2017091C3012FBF6A017B01EE24E3 +:103D8000FF248C0120E030E0C016D106E206F306E5 +:103D900010F4415051099A01281B390BC9011F9198 +:103DA0000F91FF90EF90DF90CF9008951F920F92A8 +:103DB0000FB60F9211248F939F93AF93BF9380916F +:103DC000C0019091C101A091C201B091C3010196BF +:103DD000A11DB11D8093C0019093C101A093C201A8 +:103DE000B093C301BF91AF919F918F910F900FBE80 +:103DF0000F901F9018950E94310FF8942FEF87EACB +:103E000091E6215080409040E1F700C0000087E03B +:103E100090EBDC018093DC019093DD01A093DE0147 +:103E2000B093DF019CE088E10FB6F894A8958093E9 +:103E300060000FBE90936000FFCF28E0929FF001DA +:103E40001124E80FF11DE052FF4F9491892F8F70DC +:103E500092959F700895CF93C82FCB010E941D1F8C +:103E6000282F30E080E1989FA0011124422B532B92 +:103E70004038510519F480E090E015C09770E92FA3 +:103E8000F0E088E0C89FE00DF11D112484E0EE0F02 +:103E9000FF1F8A95E1F7E20FF31FEE0FFF1FE050BF +:103EA000F84985919491CF91089580E090E008952C +:103EB00008958091C60180FF0BC06091120185E0DA +:103EC000689FB001112475956795759567952BC00E +:103ED00081FF09C06091120185E0689FB001112443 +:103EE0007595679520C082FF07C06091120185E03B +:103EF000689FB001112417C09091C7019923D1F098 +:103F000060911101961788F72091120185E0289F92 +:103F100090011124929FA001939F500D112470E0F5 +:103F2000CA010E940F276038710540F461157105C0 +:103F300039F002C065E070E0862F08958FE708959C +:103F400081E008958091C60180FF08C06091100152 +:103F500070E0759567957595679521C081FF06C0DE +:103F60006091100170E07595679519C082FF04C0DB +:103F70006091100170E010C09091C7019923C1F0C9 +:103F800060910F019617A0F780911001899FC001E1 +:103F9000112470E00E940F276038710528F4611524 +:103FA000710521F0862F08958FE7089581E0089527 +:103FB00061E070E0F4CF803F21F40E94591F8195A9 +:103FC00004C0813F29F40E94591F8093CA010895BB +:103FD000823F21F40E94591F819504C0833F29F438 +:103FE0000E94591F8093C9010895893F19F40E94C6 +:103FF000A21F05C08A3F31F40E94A21F81958093C1 +:10400000CB0108958B3F21F40E94A21F819504C02B +:104010008C3F29F40E94A21F8093CC010895843F15 +:1040200021F48091C801816017C0853F21F48091FF +:10403000C801826011C0863F21F48091C80184606C +:104040000BC0873F21F48091C801886005C0883F7C +:1040500031F48091C80180618093C80108958D3F3B +:1040600021F48091C60181600BC08E3F21F48091C4 +:10407000C601826005C08F3F29F48091C60184602B +:104080008093C6010895803F39F48091CA0187FF6B +:104090006CC01092CA0169C0813F29F48091CA01A5 +:1040A0001816BCF362C09091C901823F29F497FFB2 +:1040B0005CC01092C90159C0833F19F41916CCF3A2 +:1040C00054C0893F41F48091CB0118160CF04DC0CB +:1040D0001092CB014AC08A3F29F48091CB0187FF1F +:1040E00044C0F6CF8B3F39F48091CC0187FF3DC0AF +:1040F0001092CC013AC08C3F29F48091CC01181663 +:10410000BCF333C0843F21F48091C8018E7F17C077 +:10411000853F21F48091C8018D7F11C0863F21F435 +:104120008091C8018B7F0BC0873F21F48091C8012B +:10413000877F05C0883F31F48091C8018F7E8093CE +:10414000C80113C08D3F21F48091C6018E7F0BC042 +:104150008E3F21F48091C6018D7F05C08F3F29F4E9 +:104160008091C6018B7F8093C6018091C901811126 +:104170000EC08091CA0181110AC08091CB018111CA +:1041800006C08091CC01811102C01092C701089530 +:104190008091BE0183FF7EC08BEC94E00E94AD0550 +:1041A0008091C8011F928F9386EC94E09F938F9328 +:1041B0000E94460684EC94E00E94AD058091C901FE +:1041C000282F082E000C330B3F938F9381EC94E043 +:1041D0009F938F930E9446068FEB94E00E94AD055B +:1041E0008091CA01282F082E000C330B3F938F9328 +:1041F0008CEB94E09F938F930E9446068AEB94E0A9 +:104200000E94AD058091CB01282F082E000C330BA6 +:104210003F938F9387EB94E09F938F930E94460682 +:1042200085EB94E00E94AD058091CC01282F082EEB +:10423000000C330B3F938F9382EB94E09F938F930B +:104240000E9446068FEA94E00E94AD058091C70166 +:104250001F928F938CEA94E09F938F930E9446065F +:104260008AEA94E00E94AD058091C6011F928F9367 +:1042700087EA94E09F938F930E94460684EA94E035 +:104280000E94AD058DB79EB74C960FB6F8949EBFB1 +:104290000FBE8DBF88EC91E00E946D120E94941EAB +:1042A0009093C5018093C40108951F93CF93DF932A +:1042B0008091C4019091C5010E94AC1EAC01909107 +:1042C000C701992321F02091130130E006C020910D +:1042D00014018AE0289F900111244217530708F423 +:1042E00085C08091C901C091CA01D091CB011091C4 +:1042F000CC01811107C0C11175C0D11173C011115A +:1043000071C074C09F3F19F09F5F9093C70118164A +:1043100024F40E94591F8093C9018091C90187FF2D +:1043200005C00E94591F81958093C9011C1624F471 +:104330000E94591F8093CA018091CA0187FF05C05E +:104340000E94591F81958093CA016091C90166231B +:1043500031F1C091CA01CC2311F1062E000C770B6C +:10436000880B990B0E940A2623E333E343E35FE3C0 +:104370000E946E260E94D2256093C9016C2FCC0F3B +:10438000770B880B990B0E940A2623E333E343E360 +:104390005FE30E946E260E94D2256093CA011D161B +:1043A00024F40E94A21F8093CB018091CB0187FF50 +:1043B00005C00E94A21F81958093CB01111624F4A1 +:1043C0000E94A21F8093CC018091CC0187FF05C081 +:1043D0000E94A21F81958093CC01DF91CF911F9104 +:1043E0000C94C8209F3F09F08FCF97CFDF91CF91DA +:1043F0001F910895E8ECF1E085E0DF011D928A95B8 +:10440000E9F71092C7011092C60108958EEE96E06A +:104410000E94AD051F9281E08F931F9285E08F93DC +:1044200080EA96E09F938F930E9446060F900F902C +:104430000F900F900F900F9008958330E9F128F4BA +:10444000813061F0823009F10895853009F462C04D +:1044500008F449C0863009F474C0089580911401AD +:10446000262F30E0280F311D2F3F310524F4680F2F +:104470006093140103C08FEF8093140180911401A5 +:104480001F928F9389ED95E072C080911301262FC2 +:1044900030E0280F311D2F3F310524F4680F609361 +:1044A000130103C08FEF80931301809113011F92BA +:1044B0008F9387EC95E05BC080911201262F30E04E +:1044C000280F311D2F3F310524F4680F609312012E +:1044D00003C08FEF80931201809112011F928F937E +:1044E00084EB95E044C080911101262F30E0280F25 +:1044F000311D2F3F310524F4680F6093110103C073 +:104500008FEF80931101809111011F928F938FE99A +:1045100095E02DC080911001262F30E0280F311D2D +:104520002F3F310524F4680F6093100103C08FEF13 +:1045300080931001809110011F928F9386E895E07F +:1045400016C080910F01262F30E0280F311D2F3F1C +:10455000310524F4680F60930F0103C08FEF80933F +:104560000F0180910F011F928F938BE695E09F932F +:104570008F930E9446060F900F900F900F90089512 +:10458000833081F128F4813059F08230D1F00895E0 +:10459000853009F449C0B8F1863009F456C0089551 +:1045A00080911401681720F4861B8093140102C0C7 +:1045B00010921401809114011F928F938CE595E065 +:1045C00054C080911301681720F4861B8093130157 +:1045D00002C010921301809113011F928F938AE4FD +:1045E00095E043C080911201681720F4861B8093E8 +:1045F000120102C010921201809112011F928F933A +:1046000087E395E032C080911101681720F4861B82 +:104610008093110102C010921101809111011F922B +:104620008F9382E295E021C080911001681720F4F9 +:10463000861B8093100102C010921001809110011E +:104640001F928F9389E095E010C080910F01681749 +:1046500020F4861B80930F0102C010920F018091FD +:104660000F011F928F938EEE94E09F938F930E9481 +:1046700046060F900F900F900F900895CF93C82F7C +:104680001F928F9383EF97E09F938F930E9446062C +:1046900081E090E0A0E0B0E0BC01CD0104C0660F75 +:1046A000771F881F991FCA95D2F70E94221C0F906E +:1046B0000F900F900F90CF910C942E18CF938732BC +:1046C00088F58E3108F00BC18E3009F487C0D8F41C +:1046D000873009F460C08B3009F44FC0863009F090 +:1046E00002C18091BE01817F8E7F8093BE0188EFE1 +:1046F00097E00E94AD058BEA9AE00E94AD0581E04B +:104700008093CE0146C0863109F4B0C020F48031D8 +:1047100009F47AC0E8C0893109F491C08B3109F4F9 +:1047200049C0E1C0883349F150F4893209F4D5C059 +:10473000853309F4D2C0873209F0D5C0CEC08334A6 +:1047400009F4CBC028F48A3308F4CDC08953C8C01B +:10475000883409F0C8C00E942E188AE99AE00E94A5 +:10476000AD052FEF83ED90E3215080409040E1F7BD +:1047700000C000000E94FB1E0CC08FE198E041C009 +:1047800081E89AE00E94AD058091BE01816080932E +:10479000BE01C1E0ADC08091BE01C82FC17080FFD5 +:1047A000EFCF8DE89AE00E94AD058091BE01817F38 +:1047B0008E7F3FC09091BE0191FBCC27C0F981E074 +:1047C000C827892FC0FB81F98093BE01CC2319F043 +:1047D00084E79AE029C086E69AE013C09091BE0172 +:1047E00092FBCC27C0F981E0C827892FC0FB82F952 +:1047F0008093BE01CC2319F087E59AE015C087E4C9 +:104800009AE00E94AD05C5CF9091BE0193FBCC27E5 +:10481000C0F981E0C827892FC0FB83F98093BE01CE +:10482000CC2351F08BE39AE00E94AD058091BE014C +:1048300081608093BE015CC08EE29AE0E2CF8FE19E +:104840009AE00E94AD058CEF99E00E94AD0587EBE0 +:1048500099E00E94AD0580E999E00E94AD058BE4E6 +:1048600099E00E94AD058DE199E0CBCF8FE099E012 +:104870000E94AD050E9418121F928F9385EF98E059 +:104880009F938F930E94460680910C011F928F93F5 +:104890008EED98E09F938F930E94460680915B0176 +:1048A0001F928F938BEC98E09F938F930E94460604 +:1048B0000E94A01E9F938F937F936F9384EB98E049 +:1048C0009F938F930E9446068DB79EB742960FB670 +:1048D000F8949EBF0FBE8DBF5CCF80E001C08D51AC +:1048E0000E943E2356CF82EB98E00E94AD05C0E0C7 +:1048F0008C2FCF91089580E0089580E00895CF93A4 +:10490000C82F8091CE01813069F020F0823009F407 +:1049100049C040C167E08FE00E940109882309F483 +:104920003FC106C067E08FE00E940109882361F063 +:104930008C2F0E947B24811104C08C2F0E945E2347 +:104940002FC081E090E02CC08C2F0E947D2481112B +:1049500026C0C431E1F070F4CB3081F0C031D1F425 +:104960000E9406228BEE97E00E94AD0582E08093C4 +:10497000CE0115C0C93259F0C83361F488EF97E011 +:104980000E94AD058FEE97E00E94AD0508C0109221 +:10499000CE0104C189EE97E00E94AD05FFC081E021 +:1049A0008170FEC0C43228F5CE3108F0C1C0CB30D2 +:1049B000A1F1D0F4C73009F0D3C08EE18093140187 +:1049C00082E3809313018AE08093120184E1809353 +:1049D000110188E08093100188E280930F018FE835 +:1049E00096E00E94AD05BFC0C33149F1C431C1F0AA +:1049F000B7C0CB3409F4A9C028F4C93289F0C83350 +:104A000061F0AEC0C13509F49EC0C23509F499C049 +:104A1000CE3409F0A5C06AE09EC00E940622A3C061 +:104A20008091CD01882319F01092CD019CC08CE9B2 +:104A300096E00E94AD0581E08093CE01B1C086E78B +:104A400096E00E94AD0584E696E00E94AD05809157 +:104A500014011F928F9381E696E09F938F930E949B +:104A600046068FE596E00E94AD058DE496E00E9433 +:104A7000AD05809113011F928F938AE496E09F9376 +:104A80008F930E94460688E496E00E94AD0589E374 +:104A900096E00E94AD05809112011F928F9386E3EC +:104AA00096E09F938F930E94460684E396E00E94CF +:104AB000AD0583E296E00E94AD05809111011F9241 +:104AC0008F9380E296E09F938F930E9446068EE13B +:104AD00096E00E94AD0589E096E00E94AD058091C8 +:104AE00010011F928F9386E096E09F938F930E9410 +:104AF000460684E096E00E94AD058DEE95E00E94AA +:104B0000AD0580910F011F928F938AEE95E09F93E0 +:104B10008F930E94460688EE95E00E94AD058DB702 +:104B20009EB748960FB6F8949EBF0FBE8DBF1BC0B0 +:104B3000CE51EC2FF0E0E75DFE4F80818093CD01F8 +:104B400012C061E003C061E006C06AE08091CD015F +:104B50000E941D2208C08091CD010E94C02203C086 +:104B60008DE896E013C08091CD01882369F01F92F3 +:104B70008F9387E896E09F938F930E9446060F904D +:104B80000F900F900F9004C084E896E00E94AD054E +:104B900081E006C01092CE0180E002C080E000CF2C +:104BA000CF9108950E94D9256894B1110C9468267C +:104BB00008950E944D2688F09F5798F0B92F9927A5 +:104BC000B751B0F0E1F0660F771F881F991F1AF0F8 +:104BD000BA95C9F714C0B13091F00E946726B1E0D0 +:104BE00008950C946726672F782F8827B85F39F0CF +:104BF000B93FCCF3869577956795B395D9F73EF491 +:104C000090958095709561957F4F8F4F9F4F089538 +:104C1000E89409C097FB3EF4909580957095619556 +:104C20007F4F8F4F9F4F9923A9F0F92F96E9BB270C +:104C30009395F695879577956795B795F111F8CF88 +:104C4000FAF4BB0F11F460FF1BC06F5F7F4F8F4FF3 +:104C50009F4F16C0882311F096E911C0772321F0E9 +:104C60009EE8872F762F05C0662371F096E8862F81 +:104C700070E060E02AF09A95660F771F881FDAF7D8 +:104C8000880F9695879597F9089557FD9058440F8A +:104C9000551F59F05F3F71F04795880F97FB991F9B +:104CA00061F09F3F79F08795089512161306140658 +:104CB000551FF2CF4695F1DF08C0161617061806E5 +:104CC000991FF1CF86957105610508940895E894C0 +:104CD000BB2766277727CB0197F908950E94812685 +:104CE0000C94F2260E94E42638F00E94EB2620F075 +:104CF000952311F00C94DB260C94E12611240C94DE +:104D000068260E94452670F3959FC1F3950F50E0E9 +:104D1000551F629FF001729FBB27F00DB11D639F6D +:104D2000AA27F00DB11DAA1F649F6627B00DA11D13 +:104D3000661F829F2227B00DA11D621F739FB00DB9 +:104D4000A11D621F839FA00D611D221F749F332729 +:104D5000A00D611D231F849F600D211D822F762FC2 +:104D60006A2F11249F5750409AF0F1F088234AF09F +:104D7000EE0FFF1FBB1F661F771F881F915050400B +:104D8000A9F79E3F510580F00C94DB260C94682611 +:104D90005F3FE4F3983ED4F3869577956795B79592 +:104DA000F795E7959F5FC1F7FE2B880F911D9695AC +:104DB000879597F9089597F99F6780E870E060E01C +:104DC00008959FEF80EC089500240A9416161706A4 +:104DD00018060906089500240A94121613061406EC +:104DE00005060895092E0394000C11F4882352F04F +:104DF000BB0F40F4BF2B11F460FF04C06F5F7F4F07 +:104E00008F4F9F4F0895991B79E004C0991F961703 +:104E100008F0961B881F7A95C9F78095089597FB2F +:104E2000072E16F4009407D077FD09D00E94292799 +:104E300007FC05D03EF4909581959F4F089570959D +:104E400061957F4F0895EE0FFF1F0590F491E02DBF +:104E50000994AA1BBB1B51E107C0AA1FBB1FA617C1 +:104E6000B70710F0A61BB70B881F991F5A95A9F713 +:0E4E700080959095BC01CD010895F894FFCF78 +:104E7E00FFFF830A740B510B1D0BE90A01B40128C5 +:104E8E0008140A321E404D36223F04F203BC039A28 +:104E9E000326033F035803710301020304050607AB +:044EAE0008090000EF :106800000000EA44E944E2440400050006000700F1 :10681000080009000A000B000C000D000E000F001C :1068200010001100120013001400150016001700CC diff --git a/converter/adb_usb/binary/adb_usb_rev2_unimap.hex b/converter/adb_usb/binary/adb_usb_rev2_unimap.hex index 0ba96424..ea1254ee 100644 --- a/converter/adb_usb/binary/adb_usb_rev2_unimap.hex +++ b/converter/adb_usb/binary/adb_usb_rev2_unimap.hex @@ -1,14 +1,14 @@ -:100000000C943B050C9482050C9482050C9482059B -:100010000C9482050C9482050C9482050C94820544 -:100020000C9482050C9482050C9482050C944D0F5F -:100030000C94FC0F0C94EF1D0C9482050C9482051B -:100040000C9482050C9482050C9482050C94631E1A -:100050000C9482050C9482050C9482050C94820504 -:100060000C9482050C9482050C9482050C948205F4 -:100070000C94820569108B1079118B107911D010B6 -:10008000F310791148115B11CF14CF14FC14FC1438 -:10009000571593158B178B17AB158B17A616A6162E -:1000A00061178B178B177717041607090B0A1D1B8F +:100000000C9438050C947F050C947F050C947F05A7 +:100010000C947F050C947F050C947F050C947F0550 +:100020000C947F050C947F050C947F050C944E0F67 +:100030000C94FD0F0C94F01D0C947F050C947F051F +:100040000C947F050C947F050C947F050C94641E22 +:100050000C947F050C947F050C947F050C947F0510 +:100060000C947F050C947F050C947F050C947F0500 +:100070000C947F056A108C107A118C107A11D110B3 +:10008000F4107A1149115C11D014D014FD14FD1430 +:10009000581594158C178C17AC158C17A716A71626 +:1000A00062178C178C177817041607090B0A1D1B8B :1000B00006196405141A08151C171E1F2021232277 :1000C0002E26242D25273012182F0C13280F0D341F :1000D0000E333136381110372B2C352A5829787BBE @@ -147,1108 +147,1108 @@ :1009200045592045585452414B455920434F4E5349 :100930004F4C4520434F4D4D414E44204B45594D62 :1009400041505F53454354494F4E20343039360AA5 -:10095000004255494C443A20323139666666332D9F -:100960006469727479202830383A33393A34372040 -:100970005365702032362032303136290A0056490C -:10098000443A2030784645454428742E6D2E6B2E0F -:1009900029205049443A203078304144422841448B -:1009A00042206B6579626F61726420636F6E766559 -:1009B0007274657229205645523A203078303130B1 -:1009C000310A00444553433A20636F6E7665727472 -:1009D00020414442206B6579626F61726420746FBC -:1009E000205553420A000A092D2056657273696F1B -:1009F0006E202D0A000A6D6F7573653A206F66666A -:100A00000A000A6D6F7573653A206F6E0A000A6BF3 -:100A10006579626F6172643A206F66660A000A6BDC -:100A20006579626F6172643A206F6E0A000A6D61C7 -:100A3000747269783A206F66660A000A6D61747292 -:100A400069783A206F6E0A000A64656275673A2019 -:100A50006F6E0A000A64656275673A206F66660AFF -:100A6000000A0A626F6F746C6F616465722E2E2EBD -:100A70002000433E200011241FBECFEFD4E0DEBF94 -:100A8000CDBF04B603FE27C08091DC019091DD014B -:100A9000A091DE01B091DF018730904BA740B04BB1 -:100AA000D1F41092DC011092DD011092DE0110925F -:100AB000DF0114BE84B7877F84BF0FB6F894A89572 -:100AC00080916000886180936000109260000FBE8A -:100AD000E0E0F8E3099511E0A0E0B1E0E6EEFDE426 -:100AE00002C005900D92A433B107D9F721E0A4E329 -:100AF000B1E001C01D92AC3DB207E1F70E949A0C33 -:100B00000C94F1260C940000FF93EF93E0913401D4 -:100B1000F0913501309709F00995EF91FF91089513 -:100B2000FC018591803011F0EFDFFBCF0895FF27A6 -:100B3000E0E230E247FF0CC0419597FF09C0EDE2CB -:100B40006095709580959095611D711D811D911D19 -:100B500027FF02C0219530E350E2AA27660F771FD6 -:100B6000881F991FAA1FA41710F0A41B63955A95FC -:100B7000A9F7AA3008F0A95FA05DAF93F3956115BE -:100B800071058105910541F7ED3211F4EF93F3956D -:100B9000F21718F43F93F395FBCF8F91B5DFFA95D9 -:100BA000E1F70895E991F9918591803021F085323E -:100BB00019F0AADFF9CF089520E0E8945591553255 -:100BC000C1F3503311F4689455915A3348F450539B -:100BD00090F3220F022E220F220F200D250FF4CFAB -:100BE0000EF4219589919991533619F3533729F1D0 -:100BF000533559F1BC0188279927E8945C3621F4D4 -:100C00008991999168945591543639F446EF7EF064 -:100C100077FF0DC08FEF9FEF0AC055374AE039F0DC -:100C2000583540E121F0523642E009F00895FF9333 -:100C3000EF937DDFEF91FF91B7CFFF93EF93FC012F -:100C400081918030B9F360DFFBCFFF93EF9368DFD2 -:100C5000F1CFDF93CF93CDB7DEB72596A3DFCF914A -:100C6000DF910895282F2770E82FE695E695E69501 -:100C7000EF70F0E0E95CFE4F87FF0AC081E090E092 -:100C800001C0880F2A95EAF780959081892308C0D2 -:100C900081E090E001C0880F2A95EAF79081892BC6 -:100CA000808381E080934C0108950F931F93CF932D -:100CB000DF93569A5E9A0E9498092FEF87EA91E691 -:100CC000215080409040E1F700C0000080E592E0B4 -:100CD0009F938F930E9429060F900F90C1E0D0E060 -:100CE00006E312E063E08C2F0E949C09009771F0EC -:100CF0009F938F93DF93CF931F930F930E942906A7 -:100D00000F900F900F900F900F900F909FEF29EF83 -:100D100080E0915020408040E1F700C00000219623 -:100D2000C031D105F9F663E082E00E949C0981316F -:100D3000910511F170F487309105F1F020F40497DA -:100D40000297F0F419C089309105B1F00D97C1F404 -:100D500013C08D31910581F030F48431910561F03B -:100D6000499771F409C0843C910531F0873C9105A5 -:100D700019F0813C910521F481E080934D0102C07E -:100D800010924D0163E087E00E949C0991E082305F -:100D900009F090E090934E01992341F083E292E0B4 -:100DA0009F938F930E9429060F900F9023E042E0BB -:100DB00063E082E00E941C0A86E192E09F938F9399 -:100DC0000E9429060F900F90C1E0D0E00CEF11E0D7 -:100DD00063E08C2F0E949C09009771F09F938F9382 -:100DE000DF93CF931F930F930E9429060F900F90CC -:100DF0000F900F900F900F908FEF99EF20E08150A0 -:100E000090402040E1F700C000002196C031D1059C -:100E1000F9F6E7E3F1E080E18E0F11928E13FDCF3A -:100E20008091BE0181608093BE018CEE91E00E94B2 -:100E30009005569A5E98DF91CF911F910F9108957A -:100E4000CF93DF938FE79BEB0197F1F700C0000092 -:100E50000E94180AEC01009711F481E0BDC097FDD3 -:100E600005C080914701816080934701D7FF05C08D -:100E7000809147018E7F80934701ED2FFF27EF730D -:100E8000FF27CE018F739927C6FF02C080549109B6 -:100E9000D6FF02C0E054F109A09136010A2E000CE1 -:100EA000BB0BBD010E94A62681382FEF920714F4D8 -:100EB00081E89FEF22273327281B390B21388FEF3A -:100EC000380714F421E83FEF219520934801CF0122 -:100ED000BD010E94A62681382FEF920714F481E805 -:100EE0009FEF91958195910981382FEF920714F426 -:100EF00081E89FEF8195809349018091BE0183FF36 -:100F000060C086ED91E00E949005DF93CF9380ED65 -:100F100091E09F938F930E9429068EEC91E00E94AE -:100F200090058DEB91E00E94900580913601282F6D -:100F3000082E000C330B3F938F9388EB91E09F9327 -:100F40008F930E94290686EB91E00E949005809184 -:100F500047011F928F9381EB91E09F938F930E94A3 -:100F600029068FEA91E00E94900580914801282F80 -:100F7000082E000C330B3F938F938CEA91E09F93E4 -:100F80008F930E9429068AEA91E00E949005809141 -:100F90004901282F082E000C330B3F938F9387EACB -:100FA00091E09F938F930E94290684EA91E00E942A -:100FB00090058DB79EB744960FB6F8949EBF0FBEAE -:100FC0008DBF87E491E00E94EB118091360191E0A2 -:100FD00088300CF090E0890F80933601DF91CF913B -:100FE00008951F93CF93DF9310924C01C09100019D -:100FF000D09101018FEF9FEF909301018093000149 -:10100000CF3F8FEFD80709F06AC08FE79BEB0197BE -:10101000F1F700C0000082E00E94150AEC01892B64 -:1010200009F05DC080914E01882309F458C087E023 -:101030000E94150A009709F452C09C012F773327AC -:1010400022303105A1F048F42115310569F0213035 -:10105000310599F480788A641AC02330310551F043 -:101060002F373105A1F009C08078826410C08078E4 -:1010700089640DC0807888640AC081E991E09F93FB -:101080008F930E9429060F900F9081E18FC0292F26 -:1010900033272F7733272130310579F050F0223074 -:1010A000310579F02330310581F4EC01D078D86432 -:1010B00016C0EC01D078D26412C0EC01D078DA64AA -:1010C0000EC0EC01D078D9640AC08EE791E09F93FE -:1010D0008F930E9429060F900F9080E167C0809146 -:1010E000BE0181FF18C0209709F45DC08AE691E037 -:1010F0000E949005DF93CF9385E691E09F938F93B5 -:101100000E94290683E691E00E9490050F900F90BF -:101110000F900F9003C0209709F445C0CF379FE789 -:10112000D90711F48FE705C0CF3F8FEFD80721F41F -:101130008FEF0E94320639C02D2F3327822F1C2FAC -:101140002F3F310581F4DF93CF9385E491E09F93A6 -:101150008F930E9429060E9455060F900F900F90C2 -:101160000F908C2F23C090914D01992381F0A901FC -:101170004F7755274233510521F42078822F8A601A -:1011800006C04A30510519F42078822F82630E94EC -:1011900032061F3F51F0DC2FCC27CF6FD0930101D7 -:1011A000C093000102C080E001C081E0DF91CF91D7 -:1011B0001F910895E82FF0E0E95CFE4F2081822F17 -:1011C00090E021E030E002C0220F331F6A95E2F781 -:1011D0002823392381E0232B09F480E00895E82FA8 -:1011E000F0E0E95CFE4F80810895CF92DF92EF92AC -:1011F000FF920F931F93CF93DF938091BE0181FFE6 -:1012000035C087E391E00E94900587E3E82E81E0F6 -:10121000F82EC0E0D0E092E3C92E91E0D92E0AE288 -:1012200011E0DF93CF93DF92CF920E9429068FE2E5 -:1012300091E00E949005F70181917F010E94881D35 -:101240001F928F931F930F930E94290688E291E0CB -:101250000E94900521968DB79EB708960FB6F89418 -:101260009EBF0FBE8DBFC031D105D9F6DF91CF91A2 -:101270001F910F91FF90EF90DF90CF900895682F0E -:10128000609582E00C94550A509A83E091E00197B2 -:10129000F1F700C0000050989AEB9A95F1F700C062 -:1012A0000895509A8AEB8A95F1F700C0509883E030 -:1012B00091E00197F1F700C000000895EF92FF92CE -:1012C0000F931F93CF93DF93C0E0D0E090E8E92E17 -:1012D000F12C082F10E0C7010C2E02C095958795C0 -:1012E0000A94E2F780239123892B19F00E94510977 -:1012F00002C00E9444092196C830D10561F7DF91F0 -:10130000CF911F910F91FF90EF900895489B06C0D9 -:1013100023E02A95F1F700000197C1F70895489955 -:1013200006C023E02A95F1F700000197C1F7089560 -:101330005898509808950895CF92DF92EF92FF92B7 -:101340000F931F93CF93DF9300D0CDB7DEB7F89400 -:10135000509AE3EFFBE03197F1F700C000006A8399 -:1013600089830E9451096A816C6089818295807F9E -:10137000862B0E945E090E94440984EF91E00E943E -:101380008F09892B21F4789482EE9FEF43C084EF7C -:1013900091E00E948609009711F478943BC011E116 -:1013A000C12CD12C02E882E890E00E948F097C01D8 -:1013B000882351F199270E948609882329F1CC0CB2 -:1013C000DD1C902F9E19E81A9E1518F46894C0F839 -:1013D00006C0113121F478948CEE9FEF1BC01150A0 -:1013E00011F78FE591E00E948F09892B21F4789401 -:1013F0008BEE9FEF0FC08BE590E00E948609892B52 -:10140000B1F77894C60106C07894812F90E0919549 -:10141000819591090F900F90DF91CF911F910F91BE -:10142000FF90EF90DF90CF90089560E00C949C09BE -:1014300060E083E00C949C091F93CF93DF9300D06E -:101440001F92CDB7DEB7182FF894509A83EF9BE028 -:101450000197F1F700C000002B834A8369830E9443 -:1014600051096981862F88601295107F812B0E9417 -:101470005E090E9444098FE193E00197F1F700C0F3 -:1014800000000E9451094A81842F0E945E092B812D -:10149000822F0E945E090E94440978940F900F9059 -:1014A0000F90DF91CF911F910895262F277040E074 -:1014B00062E00C941C0A80915A0108959FB7F89439 -:1014C000109251019FBF9091D301943009F057C001 -:1014D0009091E9009F703091EC00232F217030FD36 -:1014E00020E8922B24E02093E9002091EB0020FFDC -:1014F00043C02091EE0027FF3FC020914F012223DF -:1015000021F02091E80025FF37C010924F0126E01E -:101510003091E80035FD15C03091D301343061F5CC -:101520003091EB0035FD28C0215021F481E08093FB -:101530004F0122C0EFE9FFE03197F1F700C0000052 -:10154000E7CF8093F1008091E80085FD0AC080918B -:10155000E80080FFFCCF8091E8008E778093E80060 -:1015600006C08FB7F89421E0209351018FBF9F7080 -:101570009093E90080E008959F709093E9008FEFC9 -:101580000895CF93DF9300D01F92CDB7DEB79C01B3 -:101590008091D301843019F593E099833B832A83AA -:1015A0009093E9008FEF9091E800815095FD06C07F -:1015B00095ED9A95F1F700008111F5CF8091E80043 -:1015C00085FF0DC040E050E063E070E0CE01019681 -:1015D0000E945B0D8091E8008E778093E8000F9069 -:1015E0000F900F90DF91CF910895CF93DF9300D0AC -:1015F0001F92CDB7DEB72091D301243021F522E030 -:1016000029839B838A8383E08093E9008FEF909105 -:10161000E800815095FD06C095ED9A95F1F7000020 -:101620008111F5CF8091E80085FF0DC040E050E0CA -:1016300063E070E0CE0101960E945B0D8091E800AE -:101640008E778093E8000F900F900F90DF91CF91ED -:1016500008952091D3012430F1F422E02093E90091 -:101660002FEF3091E800215035FD06C035ED3A9559 -:10167000F1F700002111F5CF2091E80025FF0BC004 -:1016800040E050E065E070E00E945B0D8091E80072 -:101690008E778093E8000895CF93DF932091D30154 -:1016A000243039F521E02093E9002FEF3091E80054 -:1016B000215035FD06C035ED3A95F1F700002111B6 -:1016C000F5CF2091E80025FF14C0EC0140E050E088 -:1016D00068E070E00E945B0D8091E8008E77809357 -:1016E000E80088E0FE01A2E5B1E001900D928A9544 -:1016F000E1F7DF91CF9108958CE892E00C9490058A -:10170000209150012F5F822F62E30E94B726992318 -:1017100019F02093500108951092500180915101C9 -:10172000882371F18091D301843041F58091E900E3 -:101730008F702091EC00922F917020FD90E8892B02 -:1017400094E09093E9009091EB0090FF14C0909189 -:10175000EE0097FF10C09091E80095FF03C0109233 -:10176000F100F9CF9091E80090FF05C09091E8005A -:101770009E779093E8008F708093E900109251015A -:10178000089542E061EC81E00E94640E42E061EC69 -:1017900082E00E94640E42E061EC83E00E94640EED -:1017A00042E261EC84E00C94640E8091D5018330B8 -:1017B00009F453C030F4813071F0823009F48CC0E8 -:1017C00008958A3009F478C08B3009F45EC08930FE -:1017D00009F09AC020C08091D401813A09F094C0E8 -:1017E0008091E800877F8093E8008091D8019091F4 -:1017F000D901892B21F468E082E591E003C060E023 -:1018000080E090E070E00E94A60D8091E8008B7768 -:101810008093E80008958091D401813209F074C06A -:101820008091D8019091D901892B09F06DC08091E8 -:10183000E800877F8093E8008091E80082FD05C082 -:101840008091D3018111F8CF5FC08091F100809326 -:101850005A018091E8008B7753C08091D401813A7E -:1018600009F052C08091D8019091D901892B09F0DB -:101870004BC08091E800877F8093E8008091E8006A -:1018800080FFFCCF80910C0136C08091D401813261 -:10189000D9F58091D8019091D901892BA9F5809132 -:1018A000E800877F8093E8000E94990E8091D6011E -:1018B00080930C010C94AC178091D401813221F5F6 -:1018C0008091E800877F8093E8000E94990E8091C4 -:1018D000D70180935B0108958091D401813AA1F4EE -:1018E0008091E800877F8093E8008091E80080FF86 -:1018F000FCCF80915B018093F1008091E8008E77AE -:101900008093E8000C94990E089508950895089521 -:1019100088E892E00E9490050C94870C0E94AE1D0E -:101920008091D101882329F00E94D91D81110C9446 -:10193000450D089584B7877F84BF0FB6F894A895A6 -:1019400080916000886180936000109260000FBEFB -:1019500090E080E80FB6F894809361009093610066 -:101960000FBE0E94850C0E9423120E94EA0E0E9464 -:101970003D0F8091E20084608093E2008EE59AE062 -:101980000E94831D78948091D3018430E1F783E72E -:1019900092E00E9490050E94251282E091E00E9450 -:1019A000911182E692E00E9490050E94860C80913F -:1019B000D301853039F48EE592E00E9490050E94B3 -:1019C0008E0CF5CF0E942B12F2CF0C94ED1D84E803 -:1019D00092E00E9490050C94E50C292F33272330C8 -:1019E0003105C9F064F42130310581F02230310530 -:1019F00009F043C084E790E024ED32E042C0213298 -:101A00003105F1F02232310541F137C082E190E039 -:101A100028E433E036C099278130910541F08230C7 -:101A2000910541F0892B49F5E0EDF2E005C0E0ECCD -:101A3000F2E002C0E0E9F2E0849190E09F0121C071 -:101A40006430D8F4E62FF0E0EE0FFF1FEF5DFE4F9D -:101A50002081318189E090E014C0643070F470E03E -:101A6000FB01EE0FFF1FE75EFE4F20813181FB017E -:101A7000EB5EFE4F808190E004C080E090E020E0CB -:101A800030E0FA0131832083089584E089BD86E047 -:101A900089BD09B400FEFDCF8091D8008F7D809371 -:101AA000D8008091E00082608093E0008091E000A7 -:101AB00081FDFCCF0895CF92DF92EF92FF920F93BA -:101AC0001F93CF93DF93EC018B016A010E94B80E44 -:101AD000811133C0C114D10439F0F60180819181A4 -:101AE000081B190BC80FD91FE12CF12C011511058A -:101AF00019F18091E80085FD16C08091E8008E778D -:101B00008093E800C114D10449F0F60180819181ED -:101B1000E80EF91EF182E08285E00FC00E94B80E47 -:101B2000882321F30AC089918093F10001501109A3 -:101B3000FFEFEF1AFF0ADACF80E0DF91CF911F911C -:101B40000F91FF90EF90DF90CF9008952091DA01F0 -:101B50003091DB012617370748F06115710539F41C -:101B60002091E8002E772093E80001C0B90140E001 -:101B70006115710591F12091D301222309F440C030 -:101B8000253009F43FC02091E80023FD3DC020919D -:101B9000E80022FD2FC02091E80020FFE9CF20912E -:101BA000F20030E0FC01CF016115710559F02830D9 -:101BB000310540F481918093F100615071092F5FEC -:101BC0003F4FF1CF41E02830310509F040E020914E -:101BD000E8002E772093E800CBCF4111CCCF0AC08C -:101BE0008091D301882361F0853061F08091E80015 -:101BF00083FD0AC08091E80082FFF2CF80E0089563 -:101C000082E0089583E0089581E008952091DA014B -:101C10003091DB012617370748F06115710539F45B -:101C20002091E8002E772093E80001C0B901FC0163 -:101C300020E06115710579F18091D301882309F4C1 -:101C40003DC0853009F43CC08091E80083FD3AC076 -:101C50008091E80082FD2CC08091E80080FFE9CFF0 -:101C60008091F20090E06115710559F0883091057E -:101C700040F424912093F10031966150710901964E -:101C8000F2CF21E0089709F020E08091E8008E77FC -:101C90008093E800CECF2111CFCF0AC08091D3012D -:101CA000882361F0853061F08091E80083FD0AC0EF -:101CB0008091E80082FFF2CF80E0089582E00895ED -:101CC00083E0089581E00895982F953058F590931A -:101CD000E900981739F07091EC002091ED005091D7 -:101CE000F00003C0242F762F50E021FF19C030915F -:101CF000EB003E7F3093EB003091ED003D7F309361 -:101D0000ED003091EB0031603093EB007093EC000C -:101D10002093ED005093F0002091EE0027FF07C0C4 -:101D20009F5FD3CF8F708093E90081E0089580E0BA -:101D300008958091D40187FF11C08091E80082FD51 -:101D400005C08091D3018111F8CF11C08091E800C6 -:101D50008B770BC08091D301882349F08091E800F4 -:101D600080FFF8CF8091E8008E778093E800089597 -:101D70002091E4003091E50095E64091EC00842F3D -:101D8000817040FF22C08091E80080FD1CC08091DE -:101D9000D301882391F0853091F08091EB0085FD8F -:101DA00010C04091E4005091E5004217530729F319 -:101DB0009A01915011F784E0089582E0089583E03C -:101DC000089581E0089580E008954091E80042FF81 -:101DD000DECF08950E94470F0E944A0FE0EEF0E028 -:101DE000808181608083E8EDF0E080818F7780835F -:101DF00019BCE3E6F0E08081816080831092D2011B -:101E000008950E94470F0E944A0F8091D8008F7753 -:101E10008093D8008091D80080688093D80080910A -:101E2000D8008F7D8093D80084E089BD86E089BD8D -:101E300009B400FEFDCF1092D3011092CF01109291 -:101E4000D1011092D00142E060E080E00E94640E77 -:101E50008091E1008E7F8093E1008091E2008160BB -:101E60008093E2008091E20088608093E20080919C -:101E7000E0008E7F8093E0000895E3E6F0E080814B -:101E80008E7F808381E08093D2010C94010F1092A9 -:101E9000E20008951092E10008951F920F920FB68C -:101EA0000F9211242F933F934F935F936F937F93E0 -:101EB0008F939F93AF93BF93EF93FF938091E10034 -:101EC00082FF0BC08091E20082FF07C08091E10099 -:101ED0008B7F8093E1000E94800B8091E10080FF66 -:101EE00019C08091E20080FF15C08091E2008E7FD2 -:101EF0008093E2008091E20080618093E200809113 -:101F0000D80080628093D80019BC85E08093D3010B -:101F10000E94880C8091E10084FF30C08091E20033 -:101F200084FF2CC084E089BD86E089BD09B400FE31 -:101F3000FDCF8091D8008F7D8093D8008091E10003 -:101F40008F7E8093E1008091E2008F7E8093E2009B -:101F50008091E20081608093E2008091CF0188232C -:101F600011F084E007C08091E30087FD02C081E0AA -:101F700001C083E08093D3010E94E70C8091E100CF -:101F800083FF29C08091E20083FF25C08091E1009A -:101F9000877F8093E10082E08093D3011092CF018C -:101FA0008091E1008E7F8093E1008091E2008E7F3E -:101FB0008093E2008091E20080618093E20042E041 -:101FC00060E080E00E94640E8091F0008860809361 -:101FD000F0000E947C0BFF91EF91BF91AF919F9118 -:101FE0008F917F916F915F914F913F912F910F90C2 -:101FF0000FBE0F901F9018951F920F920FB60F9261 -:1020000011242F933F934F935F936F937F938F93FD -:102010009F93AF93BF93CF93DF93EF93FF93C091C1 -:10202000E900CF708091EC00D82FD17080FDD0E80E -:102030001092E9008091F000877F8093F0007894FF -:102040000E9440101092E9008091F0008860809317 -:10205000F000CD2BCF70C093E900FF91EF91DF919D -:10206000CF91BF91AF919F918F917F916F915F9130 -:102070004F913F912F910F900FBE0F901F90189589 -:102080001F93CF93DF93CDB7DEB7AA970FB6F8941F -:10209000DEBF0FBECDBFE4EDF1E088E08E0F909182 -:1020A000F10091938E13FBCF0E94D50B8091E80035 -:1020B00083FF1FC18091D4019091D501492F50E039 -:1020C0004A30510508F015C1FA01E65CFF4F0C9447 -:1020D000D726803881F0823809F00BC18091D80171 -:1020E0008F708093E9008091EB0085FB882780F951 -:1020F0001092E90006C08091D0019091D101911118 -:1021000082609091E800977F9093E8008093F100BF -:102110001092F100C8C0282F2D7F09F0EAC0882353 -:1021200019F0823061F0E5C08091D601813009F06C -:10213000E0C0933009F080E08093D1012BC0809102 -:10214000D601811127C08091D8018F7009F4D1C0C8 -:102150008093E9002091EB0020FF1CC0933021F414 -:102160008091EB00806214C09091EB00906190939D -:10217000EB0021E030E0A90102C0440F551F8A9511 -:10218000E2F74093EA001092EA008091EB00886049 -:102190008093EB001092E9008091E800877F86C071 -:1021A0008111A7C01091D6011F778091E30080783C -:1021B000812B8093E3008091E800877F8093E80083 -:1021C0000E94990E8091E80080FFFCCF8091E3008F -:1021D00080688093E300111102C082E001C083E0B7 -:1021E0008093D30186C08058823008F082C08091ED -:1021F000D6019091D7018C3D53E0950779F583E0A6 -:102200008A838AE289834FB7F894DE01139620E02F -:102210003EE051E2E32FF0E050935700E49120FFBD -:1022200003C0E295EF703F5FEF708E2F90E0EA30D1 -:1022300010F0C79601C0C0968D939D932F5F2431F7 -:1022400049F74FBF8091E800877F8093E8006AE2FA -:1022500070E0CE0101960E94A60D14C0AE014F5F42 -:102260005F4F6091D8010E94ED0CBC01892B09F4ED -:1022700040C09091E800977F9093E80089819A810F -:102280000E94060E8091E8008B778093E80031C0B1 -:10229000803879F58091E800877F8093E80080910D -:1022A000CF018093F1008091E8008E778093E80061 -:1022B0000E94990E1EC081111CC09091D6019230CF -:1022C000C0F48091E800877F8093E8009093CF016D -:1022D0000E94990E8091CF01811106C08091E30088 -:1022E00087FD02C081E001C084E08093D3010E9499 -:1022F000C10B8091E80083FF0AC08091E800877FCE -:102300008093E8008091EB0080628093EB00AA96B6 -:102310000FB6F894DEBF0FBECDBFDF91CF911F91F6 -:10232000089590936101809360010895E0916001A8 -:10233000F0916101309721F00190F081E02D099436 -:1023400080E00895EF92FF920F931F93CF93DF9356 -:10235000E0916001F09161013097B1F18C01028050 -:10236000F381E02D09958091BE0182FF2DC080FF91 -:1023700004C087E494E00E949005E80118E081E43D -:10238000E82E84E0F82E8091BE0180FF0BC088818A -:102390001F928F93FF92EF920E9429060F900F9049 -:1023A0000F900F90115021961111EDCF8091BE0129 -:1023B00080FF0AC08FE394E0DF91CF911F910F91CE -:1023C000FF90EF900C949005DF91CF911F910F91AA -:1023D000FF90EF900895E0916001F09161013097D6 -:1023E00021F00480F581E02D0994089520915E018B -:1023F00030915F018217930771F090935F01809392 -:102400005E01E0916001F0916101309721F006805A -:10241000F781E02D0994089520915C0130915D01D0 -:102420008217930771F090935D0180935C01E091B6 -:102430006001F0916101309721F00084F185E02D79 -:102440000994089508950C9422120E94181E0E9467 -:1024500055060C949B09CF92DF92EF92FF920F9357 -:102460001F93CF93DF9300D000D000D0CDB7DEB75D -:102470000E94F10783E6C82E81E0D82E00E010E02C -:10248000E02E802F0E94EF08F60141916F01F42E9B -:10249000F826B1F40F5F1F4F0031110589F78FEF58 -:1024A00089838A831B820E94211E8160782F9D83ED -:1024B0008C8349815A816B818D810E94EC1247C0C7 -:1024C0009091BE0191FF04C08E830E94F5088E8119 -:1024D00020E030E04F2D50E0922FBA01022E02C0D2 -:1024E000759567950A94E2F760FF2BC02983EA820D -:1024F00021E030E0690102C0CC0CDD1C9A95E2F7C6 -:1025000090E08C219D21892B09F420E02B830E94EF -:10251000211E8160782F9D838C8349815A816B8134 -:102520008D810E94EC1249815A816B817C818D8161 -:102530000E949B1DF801ED59FE4F8081C826C08284 -:1025400006C02F5F3F4F2830310531F6A3CF0E94E0 -:102550009A1D0E94EE200E942007109162010E94A5 -:102560009611181741F10E94961180936201909183 -:10257000BE0192FF0EC090FF0CC01F928F9389E5A1 -:1025800094E09F938F930E9429060F900F900F90D5 -:102590000F908091620126960FB6F894DEBF0FBEB1 -:1025A000CDBFDF91CF911F910F91FF90EF90DF9002 -:1025B000CF900C94AC1D26960FB6F894DEBF0FBEDC -:1025C000CDBFDF91CF911F910F91FF90EF90DF90E2 -:1025D000CF9008950C943F09CF93DF93CDB7DEB72A -:1025E0002B970FB6F894DEBF0FBECDBF942F4F834D -:1025F000252F588769877A878B874A855B85452B86 -:1026000021F02F3F09F59F3FF9F4DE01119686E096 -:10261000FD0111928A95E9F785E0FE013796019058 -:102620000D928A95E1F749815A816B817C818D8178 -:102630009E810E94551A2B960FB6F894DEBF0FBEEE -:10264000CDBFDF91CF9108954F81588569857A85F7 -:102650008B850E949B1DD9CFCF93882309F4E8C0B6 -:10266000C82F8238A1F40E94961181FDE1C089E350 -:102670000E94E41C0E945D1D2FEF81EE94E021502A -:1026800080409040E1F700C0000089E315C0833826 -:10269000C1F40E94961180FDCBC083E50E94E41C2A -:1026A0000E945D1D2FEF81EE94E02150804090400C -:1026B000E1F700C0000083E50E94011DCF910C945A -:1026C0005D1D8438A1F40E94961182FDB1C087E49B -:1026D0000E94E41C0E945D1D2FEF81EE94E02150CA -:1026E00080409040E1F700C0000087E4E5CF8CEF28 -:1026F0008C0F813A48F48C2F0E941A24811198C0C3 -:102700008C2F0E94E41CDACF80E28C0F883048F4D2 -:10271000C77081E001C0880FCA95EAF70E94231DA7 -:10272000CDCF8BE58C0F833078F4C53A29F0C63ACB -:1027300031F083E890E005C081E890E002C082E8D3 -:1027400090E0CF910C94F61188E58C0F853108F05C -:102750006FC0C83A61F1C93A69F1CA3A71F1CB3A2E -:1027600079F1CC3A81F1CD3A89F1CE3A91F1CF3A73 -:1027700099F1C13BA1F1C03BA9F1C23BB1F1C33B0F -:10278000B9F1C43BC1F1C53BC9F1C63BD1F1C73B6F -:10279000D9F1C83BE1F1C93BE9F1CA3BF1F1CB3BCF -:1027A000F9F1CC3B09F43FC080E090E03EC082EEFE -:1027B00090E03BC089EE90E038C08AEE90E035C0F2 -:1027C00085EB90E032C086EB90E02FC083EB90E089 -:1027D0002CC084EB90E029C087EB90E026C08CEC05 -:1027E00090E023C08DEC90E020C083E891E01DC014 -:1027F0008AE891E01AC082E991E017C084E991E08B -:1028000014C081E292E011C083E292E00EC084E243 -:1028100092E00BC085E292E008C086E292E005C03B -:1028200087E292E002C08AE292E0CF910C940C120F -:10283000CF910895882309F466C08238A1F40E94DC -:10284000961181FF60C089E30E94E41C0E945D1D17 -:102850002FEF81EE94E0215080409040E1F700C0DE -:10286000000089E315C08338B9F40E94961180FFF7 -:102870004AC083E50E94E41C0E945D1D2FEF81EE9B -:1028800094E0215080409040E1F700C0000083E5D3 -:102890000E94011D0C945D1D8438A1F40E949611C4 -:1028A00082FF31C087E40E94E41C0E945D1D2FEF6F -:1028B00081EE94E0215080409040E1F700C000009C -:1028C00087E4E6CF9CEF980F913A10F390E2980FCF -:1028D000983050F4877091E001C0990F8A95EAF71B -:1028E000892F0E94291DD6CF9BE5980F933020F4A5 -:1028F00080E090E00C94F611885A853120F480E055 -:1029000090E00C940C120895882321F00E94231D5E -:102910000C945D1D0895882321F00E94291D0C94BC -:102920005D1D0895CF92DF92EF92FF920F931F9358 -:10293000CF93DF9300D000D000D0CDB7DEB725E035 -:10294000FC01DE01119601900D922A95E1F7FC0140 -:1029500040813181F280258122952F7063817481BD -:10296000672B09F4D8C23F3F19F44F3F09F4D3C293 -:102970006C0149833A8389819A812E830E94A31C2A -:10298000182F092F0E94A21C0E94B21BE02FE29573 -:10299000EF70F0E0EC5BFF4F2E810C94D726802F78 -:1029A000807F902F9F70092F882311F00295007F60 -:1029B000FF2049F0002309F45FC2802F0E94361DDA -:1029C0000E945D1D59C2812F0E941A14002309F430 -:1029D000A2C2802F0E943C1D26960FB6F894DEBF3F -:1029E0000FBECDBFDF91CF911F910F91FF90EF9060 -:1029F000DF90CF900C945D1D802F807F902F9F7073 -:102A0000092F803211F00295007F112319F0113047 -:102A100001F129C0FF20A9F0802F222349F12130A4 -:102A200039F526960FB6F894DEBF0FBECDBFDF9105 -:102A3000CF911F910F91FF90EF90DF90CF900C946A -:102A4000461D222319F0213009F465C20E94491D58 -:102A50002CC0FF20E9F0263008F05DC20E94201D46 -:102A6000802329F022C0FF20F1F0211115C0802F12 -:102A700026960FB6F894DEBF0FBECDBFDF91CF9183 -:102A80001F910F91FF90EF90DF90CF900C948414E2 -:102A9000253008F040C209C0F601858180FFECC1F5 -:102AA0008F708583E4CF2111FBC1802F69C1202F56 -:102AB00026952695237030E02115310521F021302F -:102AC0003105C9F028C2FF2021F0812F902F93708B -:102AD00002C080E090E026960FB6F894DEBF0FBEED -:102AE000CDBFDF91CF911F910F91FF90EF90DF90BD -:102AF000CF900C94F611FF2021F0812F902F93702E -:102B000002C080E090E026960FB6F894DEBF0FBEBC -:102B1000CDBFDF91CF911F910F91FF90EF90DF908C -:102B2000CF900C940C12812FFF2019F00E94741F7B -:102B300002C00E94DC1F26960FB6F894DEBF0FBEBF -:102B4000CDBFDF91CF911F910F91FF90EF90DF905C -:102B5000CF900C946120802F837009F078C0F11021 -:102B6000DAC1812F829586958770880F880F912F03 -:102B70009F70C92ED12CE12CF12C082E04C0CC0C56 -:102B8000DD1CEE1CFF1C0A94D2F714FF12C04FE0AC -:102B900050E060E070E004C0440F551F661F771FCF -:102BA0008A95D2F7CB01BA01609570958095909582 -:102BB00003C060E070E0CB01202F2695269523709E -:102BC000422F50E042305105D1F04330510559F1C8 -:102BD0006C297D298E299F294130510541F1269686 -:102BE0000FB6F894DEBF0FBECDBFDF91CF911F911E -:102BF0000F91FF90EF90DF90CF900C94C71B6C2942 -:102C00007D298E299F2926960FB6F894DEBF0FBE28 -:102C1000CDBFDF91CF911F910F91FF90EF90DF908B -:102C2000CF900C94D91B0E94C71BC701B6012696F2 -:102C30000FB6F894DEBF0FBECDBFDF91CF911F91CD -:102C40000F91FF90EF90DF90CF900C94B51BFF2079 -:102C500019F0802F817001C08695882309F45BC12B -:102C6000812F829586958770880F880F912F9F708E -:102C7000C92ED12CE12CF12C082E04C0CC0CDD1C6B -:102C8000EE1CFF1C0A94D2F714FF12C04FE050E074 -:102C900060E070E004C0440F551F661F771F8A95DF -:102CA000D2F7CB01BA01609570958095909503C0DD -:102CB00060E070E0CB01202F269526952370422FEF -:102CC00050E042305105D1F04330510559F16C29A3 -:102CD0007D298E299F294130510541F126960FB655 -:102CE000F894DEBF0FBECDBFDF91CF911F910F9142 -:102CF000FF90EF90DF90CF900C947E1C6C297D2983 -:102D00008E299F2926960FB6F894DEBF0FBECDBF41 -:102D1000DF91CF911F910F91FF90EF90DF90CF90B7 -:102D20000C94901C0E947E1CC701B60126960FB61B -:102D3000F894DEBF0FBECDBFDF91CF911F910F91F1 -:102D4000FF90EF90DF90CF900C946C1C103F41F1FE -:102D500018F4103E48F48BC0123F09F450C0D8F16B -:102D6000133F09F460C083C01F70802F8F71FF2054 -:102D700021F00E94051C812F7BCE0E94261C812FF2 -:102D800026960FB6F894DEBF0FBECDBFDF91CF9170 -:102D90001F910F91FF90EF90DF90CF900C948B14C8 -:102DA000FF20A9F0253008F0B6C0802F8F7126963D -:102DB0000FB6F894DEBF0FBECDBFDF91CF911F914C -:102DC0000F91FF90EF90DF90CF900C944B1C26302A -:102DD00008F0A1C0EACFFF20A1F0802F8F712696C6 -:102DE0000FB6F894DEBF0FBECDBFDF91CF911F911C -:102DF0000F91FF90EF90DF90CF900C94051CFF2077 -:102E000061F3802F8F7126960FB6F894DEBF0FBE48 -:102E1000CDBFDF91CF911F910F91FF90EF90DF9089 -:102E2000CF900C94261CFF2091F0802F8F71269656 -:102E30000FB6F894DEBF0FBECDBFDF91CF911F91CB -:102E40000F91FF90EF90DF90CF900C94F01B26969F -:102E50000FB6F894DEBF0FBECDBFDF91CF911F91AB -:102E60000F91FF90EF90DF90CF900C94EB1BFF2021 -:102E7000A1F0222309F4B1CF812F26960FB6F89442 -:102E8000DEBF0FBECDBFDF91CF911F910F91FF909D -:102E9000EF90DF90CF900C942C13222309F4B1CF44 -:102EA000812F26960FB6F894DEBF0FBECDBFDF91FF -:102EB000CF911F910F91FF90EF90DF90CF900C94E6 -:102EC0001A14402F4F70612FC6010E94EA1E2696E9 -:102ED0000FB6F894DEBF0FBECDBFDF91CF911F912B -:102EE0000F91FF90EF90DF90CF900C94FD1A402F40 -:102EF0004F70612FC60126960FB6F894DEBF0FBE45 -:102F0000CDBFDF91CF911F910F91FF90EF90DF9098 -:102F1000CF900C94ED1E26960FB6F894DEBF0FBE30 -:102F2000CDBFDF91CF911F910F91FF90EF90DF9078 -:102F3000CF9008950E94431D0E94121D0E945D1DA6 -:102F40000E9495210E94612080E090E00E94F6118D -:102F500080E090E00C940C120E94331D0C949A17A0 -:102F60000E94A31C292F22952F7030E02C303105B0 -:102F70004CF42A3031056CF42250310922303105ED -:102F800088F407C02C30310549F02F30310531F07D -:102F900009C0803E48F0803F29F406C093FB882793 -:102FA00080F9089580E0089581E00895CF93DF933C -:102FB00000D000D01F92CDB7DEB70F900F900F90CA -:102FC0000F900F90DF91CF910895CF93DF9300D0B2 -:102FD00000D000D0CDB7DEB726960FB6F894DEBF8E -:102FE0000FBECDBFDF91CF910895CF93DF93C091F6 -:102FF000730180917401C817A1F0D0E0CE0166E0A2 -:1030000070E00E94A626FC01EB58FE4F40815181E2 -:1030100062817381848195810E94E5172196C77032 -:10302000E8CFDF91CF9108954091A5015091A6017D -:103030006091A7017091A8018091A9019091AA01C6 -:103040000C94E517CF93DF938091AA0182958F703E -:1030500009F05CC08091A701882309F457C0209132 -:103060007301D09174014091A501C091A601E09136 -:10307000A801F091A9012D1709F448C030E030975C -:1030800009F440C0CF3F11F44F3FE1F1C90166E0C0 -:1030900070E00E94A626DC01AB58BE4F11968C91C1 -:1030A0001197C8132FC08C9148132CC012968C9185 -:1030B0001297811127C013968D919C9114978E17AA -:1030C0009F0708F401978E1B9F0B883C9105D0F455 -:1030D0008091AA018F7080618093AA01C90166E086 -:1030E00070E00E94A626FC01E658FE4F90819F707A -:1030F0009061908385EA91E00E949214DF91CF91D4 -:103100000C94F5172F5F3F4F2770B5CFDF91CF910C -:103110000895BF92CF92DF92EF92FF920F931F9389 -:10312000CF93DF93CDB7DEB761970FB6F894DEBFCC -:103130000FBECDBF8C0185E0F801DE011D96019028 -:103140000D928A95E1F7D8014C9111962C91119727 -:103150001296EC9012971396CD90DC9014975091A4 -:10316000A5016091A6018091A8019091A901009705 -:1031700009F46EC16F3F19F45F3F09F469C1B09063 -:10318000A701BB2009F4C3C03091AA01C816D90613 -:1031900028F0F601E81BF90BCF0104C0809590954B -:1031A0008C0D9D1DFF24F394883C910588F0F12C33 -:1031B000307F09F0CBC07C2DD98AC88A522F6E2D62 -:1031C00089890E94D61785EA91E00E949214B4C0C2 -:1031D000832F807F09F049C0621314C0541312C0BA -:1031E000E11010C03F7030613093AA010E941418A2 -:1031F00085EA91E00E9492148091AA01D801159667 -:103200008C9331C0CD2831F12F3F11F44F3F11F194 -:10321000FE2CE1101FC0E091730130917401E3179F -:1032200009F45CC0F0E0CF0166E070E00E94A626E1 -:10323000DC01AB58BE4F11968C911197281307C033 -:103240008C91481304C012968C91811103C0319661 -:10325000E770E5CFFE2CEE2009F416C18091AA019B -:1032600081608093AA01F12C0FC1621308C054132E -:1032700006C0E11004C08091AA01D801C1C04D87E9 -:103280002E878D859E850E94B0178823E1F1EE2060 -:10329000D1F12091AA01822F82958F7090E0029740 -:1032A00074F08091A5019091A60198878F8319866B -:1032B000DB86CA862C87CE0107960E94921486E090 -:1032C000F801A5EAB1E001900D928A95E1F70E941C -:1032D00022180E941418FF24F394D6C04D872E871D -:1032E0008D859E850E94A31C292F22952F7030E08A -:1032F000223031050CF0BCC09F7009F0B6C0805E72 -:10330000883008F4C1C0C8010E949214E4CFC816E6 -:10331000D90608F453C0F601E81BF90BCF01883C2D -:10332000910508F450C0F12C7C2DD98AC88A522FFF -:103330006E2D89890E94D617E5EAF1E086E0DF016B -:103340001D928A95E9F70E9414189EC0621314C05A -:10335000541312C0E11010C08091AA01F8018583B6 -:10336000C8010E94921486E0E5EAF1E0DF011D92B7 -:103370008A95E9F7FB2C88C04D872E878D859E8521 -:103380000E94B017882309F4BECFEE2009F4BBCF0A -:103390002091AA01822F82958F7090E002970CF401 -:1033A0008ECF8091A5019091A6019A8389831B827B -:1033B000DD82CC822E83CE0101967FCF80959095C1 -:1033C0008C0D9D1DACCFFE2CEE2009F49CCF62131A -:1033D0002EC054132CC02091AA0120FD1FC0822FA3 -:1033E00082958F70D9F0D80115962C9315978F3050 -:1033F00049F08F5F982F9295907F822F8F70892B45 -:1034000015968C93C8010E94921486E0F801A5EAF3 -:10341000B1E001900D928A95E1F795CF86E0F80131 -:10342000A5EAB1E001900D928A95E1F72DC04D8794 -:103430002E878D859E850E94B017811140CF809187 -:10344000AA0181608093AA01C8010E9492141CC045 -:10345000EE2009F458CF4D872E878D859E850E94DA -:10346000B017882309F44FCF2ACF811148CF0CC061 -:10347000243031050CF047CF9F7009F440CFF8019C -:103480009581907F09F03BCF8F2D61960FB6F89410 -:10349000DEBF0FBECDBFDF91CF911F910F91FF9087 -:1034A000EF90DF90CF90BF900895CF93DF93CDB78B -:1034B000DEB72C970FB6F894DEBF0FBECDBF4F839B -:1034C000588769877A878B879C87CE0107960E94E9 -:1034D0008918882371F08F8198852A853B85232B55 -:1034E00009F43FC09F3F09F068C08F3F09F065C0F5 -:1034F00038C086E0FE013796DE01119601900D92EC -:103500008A95E1F76F817885EA85FB85309749F1E7 -:103510007F3F11F46F3F29F18091740190E09C018D -:103520002F5F3F4F277033274091730150E02417DE -:10353000350709F44BC069837A83FD83EC8366E029 -:1035400070E00E94A626DC01AB58BE4F96E0FE015B -:10355000319601900D929A95E1F7209374010E94A3 -:10356000F51780917301909174018917E9F190E04A -:1035700066E070E00E94A6268B589E4F0E94891834 -:10358000882391F18091730190E066E070E00E94E1 -:10359000A626FC01EB58FE4F408151816281738168 -:1035A000848195810E94E5178091730190E00196D6 -:1035B0008770992780937301D4CF4F81588569858F -:1035C0007A858B859C850E94E517CBCF0E94AC172E -:1035D0001092740110927301E5EAF1E086E0DF01D8 -:1035E0001D928A95E9F7BDCF2C960FB6F894DEBFF1 -:1035F0000FBECDBFDF91CF910895DF92EF92FF9282 -:103600000F931F93CF93DF93FC01892B09F48AC09A -:10361000E12CF12CDD24D394EF01219684918537A0 -:1036200009F461C058F4843708F04EC0843008F0C3 -:103630006AC08130D1F0823071F174C0883709F4EA -:103640005DC050F4863709F455C0873709F06AC069 -:103650008E2D0E94301D54C09CE7980F903708F0C3 -:1036600061C08F770E941A1450C08F010E5F1F4FE8 -:10367000FE01849190E2980F983050F48770FD2DF0 -:1036800001C0FF0F8A95EAF78F2F0E94361D14C0E4 -:103690000E942C1313C08F010E5F1F4FFE01C491B7 -:1036A00080E28C0F883060F4C7708D2D01C0880FC8 -:1036B000CA95EAF70E943C1D0E945D1DE80125C0E5 -:1036C0008C2F0E941A14FACF9F012E5F3F4FFE01EC -:1036D000C491CC2369F08FE99FE00197F1F700C016 -:1036E0000000C150F6CF9F012E5F3F4FFE01F490C6 -:1036F000E9010BC00E94201DE82E07C00E94331D67 -:103700000E945D1D02C00E942C138F2D882341F062 -:10371000EFE9FFE03197F1F700C000008150F6CFEC -:10372000FE017ACFDF91CF911F910F91FF90EF9023 -:10373000DF9008956093AF017093B0018093B10161 -:103740009093B2010E94AA1D0C949A176093AB014A -:103750007093AC018093AD019093AE010E94AB1DBC -:103760000C949A1708950C949A1B0F931F93009131 -:10377000AF011091B0012091B1013091B201602BE5 -:10378000712B822B932B1F910F910C949A1B0F93EB -:103790001F930091AF011091B0012091B1013091C0 -:1037A000B20160237123822393231F910F910C9404 -:1037B0009A1B0F931F930091AF011091B0012091BC -:1037C000B1013091B20160277127822793271F91A1 -:1037D0000F910C949A1B60E070E0CB010C94A61B37 -:1037E0000F931F9341E050E060E070E08A019B017D -:1037F00004C0000F111F221F331F8A95D2F7C90181 -:10380000B8011F910F910C94A61B0F931F9341E0D9 -:1038100050E060E070E004C0440F551F661F771F42 -:103820008A95D2F78091AB019091AC01A091AD0146 -:10383000B091AE018A019B01082B192B2A2B3B2B3F -:10384000C901B8011F910F910C94A61B0F931F93F0 -:1038500041E050E060E070E004C0440F551F661F77 -:10386000771F8A95D2F74095509560957095809115 -:10387000AB019091AC01A091AD01B091AE018A0174 -:103880009B01082319232A233B23C901B8011F9157 -:103890000F910C94A61B0F931F9341E050E060E042 -:1038A00070E004C0440F551F661F771F8A95D2F73A -:1038B0008091AB019091AC01A091AD01B091AE01AE -:1038C0008A019B01082719272A273B27C901B8012C -:1038D0001F910F910C94A61B0F931F930091AB01A6 -:1038E0001091AC012091AD013091AE01602B712B94 -:1038F000822B932B1F910F910C94A61B0F931F9358 -:103900000091AB011091AC012091AD013091AE015D -:1039100060237123822393231F910F910C94A61B84 -:103920000F931F930091AB011091AC012091AD0159 -:103930003091AE0160277127822793271F910F9145 -:103940000C94A61B0895CF92DF92EF92FF920F93F3 -:103950001F93CF93DF938C01C090AF01D090B00143 -:10396000E090B101F090B2014091AB015091AC01F7 -:103970006091AD017091AE01C42AD52AE62AF72ADA -:10398000CFE1D0E0D701C6010C2E04C0B695A795B3 -:10399000979587950A94D2F780FF07C0B8018C2FBE -:1039A0000E94BB1E8130910531F4219758F7B80170 -:1039B00080E00E94BB1EDF91CF911F910F91FF907D -:1039C000EF90DF90CF90089520910D0130910E017E -:1039D000F90132969FEF40E05191581789F09F3FCF -:1039E00019F4511101C0942F4F5F4630A9F79F3F42 -:1039F00039F0F901E90FF11D97FDFA9582830895D9 -:103A0000089520910D0130910E01F9013296285F41 -:103A10003F4F9081981301C010823196E217F3074F -:103A2000C1F7089581E090E0E0910D01F0910E0161 -:103A3000E80FF91F1082019688309105A9F70895C3 -:103A40008091BD0108959091BD01892B8093BD01A6 -:103A5000089580959091BD0189238093BD010895BB -:103A60008093BD0108951092BD0108959091BC010D -:103A7000892B8093BC01089580959091BC01892386 -:103A80008093BC0108951092BC0108958093B30106 -:103A900008951092B301089580910D0190910E0147 -:103AA000FC0131969C01285F3F4F80E0919191117C -:103AB0008F5FE217F307D1F70895E0910D01F091C0 -:103AC0000E018091BD018083E0910D01F0910E0106 -:103AD00090818091BC01892B80838091B3018823E0 -:103AE00061F0E0910D01F0910E019081892B8083AE -:103AF0000E944C1D81111092B30180910D01909193 -:103B00000E010C94A2119093350180933401089515 -:103B10008295982F9C7C292F26952695982F937314 -:103B2000990F990F922B892F8A7A86959575990FFF -:103B3000892B08950895CF93DF9300D000D01F9272 -:103B4000CDB7DEB70F900F900F900F900F90DF91D1 -:103B5000CF910895089508950C94EA128091D301AD -:103B6000843021F11092BF0120E488E190E00FB68B -:103B7000F894A895809360000FBE2093600083B7EF -:103B8000817F846083BF83B7816083BF7894889589 -:103B900083B78E7F83BF0FB6F894A895809160009D -:103BA000886180936000109260000FBE08950895B0 -:103BB0000895CF930E94D71D0E94F1070E94D81D3F -:103BC000C0E08C2F0E94EF08811104C0CF5FC0318C -:103BD000C1F701C081E0CF9108950C94AC171F92FA -:103BE0000F920FB60F9211248F939F93AF93BF93B1 -:103BF0008091BF01811113C08091C0019091C101DA -:103C0000A091C201B091C3014196A11DB11D809345 -:103C1000C0019093C101A093C201B093C301BF91B1 -:103C2000AF919F918F910F900FBE0F901F9018959D -:103C300082E084BD93E095BD9AEF97BD80936E00BE -:103C400008952FB7F8948091C0019091C101A0917F -:103C5000C201B091C3012FBF08952FB7F8946091AE -:103C6000C0017091C1018091C2019091C3012FBF29 -:103C70000895CF92DF92EF92FF920F931F932FB789 -:103C8000F8944091C0015091C1016091C2017091BE -:103C9000C3012FBF6A017B01EE24FF248C0120E0C9 -:103CA00030E0C016D106E206F30610F44150510987 -:103CB0009A01281B390BC9011F910F91FF90EF90BA -:103CC000DF90CF9008951F920F920FB60F9211249C -:103CD0008F939F93AF93BF938091C0019091C10147 -:103CE000A091C201B091C3010196A11DB11D8093A5 -:103CF000C0019093C101A093C201B093C301BF91D1 -:103D0000AF919F918F910F900FBE0F901F901895BC -:103D10000E94EA0EF8942FEF87EA91E62150804046 -:103D20009040E1F700C0000087E090EBDC01809359 -:103D3000DC019093DD01A093DE01B093DF019CE0F4 -:103D400088E10FB6F894A895809360000FBE909319 -:103D50006000FFCFE92FF0E093E0EE0FFF1F9A9590 -:103D6000E1F7E80FF11DE855FF4F9491892F8F700F -:103D700092959F700895CF93C82FCB010E94AA1EE1 -:103D8000492F90E0242F30E054E0220F331F5A9542 -:103D9000E1F7282B392B2038310519F480E090E029 -:103DA00017C0EC2FF0E023E0EE0FFF1F2A95E1F79C -:103DB0004770E40FF11D34E0EE0FFF1F3A95E1F775 -:103DC000E80FF91FEE0FFF1FE050F849859194911D -:103DD000CF91089580E090E0089508958091C60104 -:103DE00080FF0CC08091120190E065E070E00E94BD -:103DF000A62695958795959587952EC081FF0AC033 -:103E00008091120190E065E070E00E94A6269595F1 -:103E1000879522C082FF08C08091120190E065E082 -:103E200070E00E94A62618C02091C7012223D1F07D -:103E300030911101231780F78091120190E065E025 -:103E400070E00E94A626622F70E00E94A626632FD3 -:103E500070E00E94C326CB018038910530F40097B2 -:103E600031F0089585E090E008958FE7089581E0AE -:103E700008958091C60180FF08C06091100170E034 -:103E8000759567957595679523C081FF06C060910C -:103E9000100170E0759567951BC082FF04C06091AA -:103EA000100170E012C06091C7016623D1F020912B -:103EB0000F016217A0F78091100170E090E00E945E -:103EC000A626622F70E00E94C3266038710528F490 -:103ED0006115710521F0862F08958FE7089581E01F -:103EE000089561E070E0F4CF803F21F40E94EE1E5F -:103EF000819504C0813F29F40E94EE1E8093CA017F -:103F00000895823F21F40E94EE1E819504C0833FF4 -:103F100029F40E94EE1E8093C9010895893F19F487 -:103F20000E94391F05C08A3F31F40E94391F8195D4 -:103F30008093CB0108958B3F21F40E94391F819516 -:103F400004C08C3F29F40E94391F8093CC0108954E -:103F5000843F21F48091C801816017C0853F21F41E -:103F60008091C801826011C0863F21F48091C80110 -:103F700084600BC0873F21F48091C801886005C030 -:103F8000883F31F48091C80180618093C801089511 -:103F90008D3F21F48091C60181600BC08E3F21F4DA -:103FA0008091C601826005C08F3F29F48091C601CF -:103FB00084608093C6010895803F39F48091CA01DE -:103FC00087FF6CC01092CA0169C0813F29F48091BB -:103FD000CA011816BCF362C09091C901823F29F44E -:103FE00097FF5CC01092C90159C0833F19F419169C -:103FF000CCF354C0893F41F48091CB0118160CF0EA -:104000004DC01092CB014AC08A3F29F48091CB0168 -:1040100087FF44C0F6CF8B3F39F48091CC0187FFF6 -:104020003DC01092CC013AC08C3F29F48091CC0164 -:104030001816BCF333C0843F21F48091C8018E7FF1 -:1040400017C0853F21F48091C8018D7F11C0863F44 -:1040500021F48091C8018B7F0BC0873F21F48091B0 -:10406000C801877F05C0883F31F48091C8018F7EE9 -:104070008093C80113C08D3F21F48091C6018E7FCB -:104080000BC08E3F21F48091C6018D7F05C08F3F0C -:1040900029F48091C6018B7F8093C6018091C9016C -:1040A00081110EC08091CA0181110AC08091CB019B -:1040B000811106C08091CC01811102C01092C7010C -:1040C00008958091BE0183FF7EC08BE894E00E943A -:1040D00090058091C8011F928F9386E894E09F938A -:1040E0008F930E94290684E894E00E9490058091B5 -:1040F000C901282F082E000C330B3F938F9381E8C2 -:1041000094E09F938F930E9429068FE794E00E948A -:1041100090058091CA01282F082E000C330B3F9385 -:104120008F938CE794E09F938F930E9429068AE7F0 -:1041300094E00E9490058091CB01282F082E000C5E -:10414000330B3F938F9387E794E09F938F930E9465 -:10415000290685E794E00E9490058091CC01282FE4 -:10416000082E000C330B3F938F9382E794E09F93CC -:104170008F930E9429068FE694E00E94900580911B -:10418000C7011F928F938CE694E09F938F930E94B8 -:1041900029068AE694E00E9490058091C6011F924C -:1041A0008F9387E694E09F938F930E94290684E67D -:1041B00094E00E9490058DB79EB74C960FB6F89488 -:1041C0009EBF0FBE8DBF88EC91E00E94EB110E9454 -:1041D000211E9093C5018093C40108951F93CF932E -:1041E000DF938091C4019091C5010E94391EFC01AA -:1041F0002091C701222329F090911301892F90E08B -:1042000007C08091140190E06AE070E00E94A62649 -:10421000E817F90708F485C08091C901C091CA0167 -:10422000D091CB011091CC01811107C0C11175C093 -:10423000D11173C0111171C074C02F3F19F02F5FDD -:104240002093C701181624F40E94EE1E8093C90122 -:104250008091C90187FF05C00E94EE1E8195809361 -:10426000C9011C1624F40E94EE1E8093CA0180919D -:10427000CA0187FF05C00E94EE1E81958093CA0186 -:104280006091C901662331F1C091CA01CC2311F1BB -:10429000062E000C770B880B990B0E94A52523E3B3 -:1042A00033E343E35FE30E9409260E946D25609398 -:1042B000C9016C2FCC0F770B880B990B0E94A52599 -:1042C00023E333E343E35FE30E9409260E946D2565 -:1042D0006093CA011D1624F40E94391F8093CB01FC -:1042E0008091CB0187FF05C00E94391F8195809383 -:1042F000CB01111624F40E94391F8093CC018091C8 -:10430000CC0187FF05C00E94391F81958093CC01A5 -:10431000DF91CF911F910C9461202F3F09F08FCF37 -:1043200097CFDF91CF911F910895E8ECF1E085E000 -:10433000DF011D928A95E9F71092C7011092C6011C -:1043400008958EEA96E00E9490051F9281E08F9377 -:104350001F9285E08F9380E696E09F938F930E9453 -:1043600029060F900F900F900F900F900F900895C7 -:104370008330E9F128F4813061F0823009F1089549 -:10438000853009F462C008F449C0863009F474C06D -:10439000089580911401262F30E0280F311D2F3F02 -:1043A000310524F4680F6093140103C08FEF8093EC -:1043B0001401809114011F928F9389E995E072C0D6 -:1043C00080911301262F30E0280F311D2F3F31053A -:1043D00024F4680F6093130103C08FEF80931301DF -:1043E000809113011F928F9387E895E05BC08091C5 -:1043F0001201262F30E0280F311D2F3F310524F404 -:10440000680F6093120103C08FEF809312018091B7 -:1044100012011F928F9384E795E044C080911101AF -:10442000262F30E0280F311D2F3F310524F4680F6F -:104430006093110103C08FEF8093110180911101EE -:104440001F928F938FE595E02DC080911001262F4C -:1044500030E0280F311D2F3F310524F4680F6093A1 -:10446000100103C08FEF80931001809110011F9203 -:104470008F9386E495E016C080910F01262F30E0DF -:10448000280F311D2F3F310524F4680F60930F0171 -:1044900003C08FEF80930F0180910F011F928F93C4 -:1044A0008BE295E09F938F930E9429060F900F90C7 -:1044B0000F900F900895833081F128F4813059F0E6 -:1044C0008230D1F00895853009F449C0B8F18630C2 -:1044D00009F456C0089580911401681720F4861BD2 -:1044E0008093140102C010921401809114011F9254 -:1044F0008F938CE195E054C080911301681720F4EC -:10450000861B8093130102C0109213018091130146 -:104510001F928F938AE095E043C080911201681743 -:1045200020F4861B8093120102C010921201809128 -:1045300012011F928F9387EF94E032C08091110196 -:10454000681720F4861B8093110102C0109211019C -:10455000809111011F928F9382EE94E021C080918F -:104560001001681720F4861B8093100102C010927E -:104570001001809110011F928F9389EC94E010C07C -:1045800080910F01681720F4861B80930F0102C0F1 -:1045900010920F0180910F011F928F938EEA94E089 -:1045A0009F938F930E9429060F900F900F900F906A -:1045B0000895CF93C82F1F928F9383EB97E09F931B -:1045C0008F930E94290681E090E0A0E0B0E0BC015A -:1045D000CD0104C0660F771F881F991FCA95D2F7B7 -:1045E0000E94B31B0F900F900F900F90CF910C94DF -:1045F000AC17CF93873288F58E3108F00BC18E301F -:1046000009F487C0D8F4873009F460C08B3009F40E -:104610004FC0863009F002C18091BE01817F8E7F3C -:104620008093BE0188EB97E00E94900582E79AE0B4 -:104630000E94900581E08093CE0146C0863109F446 -:10464000B0C020F4803109F47AC0E8C0893109F49F -:1046500091C08B3109F449C0E1C0883349F150F46D -:10466000893209F4D5C0853309F4D2C0873209F004 -:10467000D5C0CEC0833409F4CBC028F48A3308F403 -:10468000CDC08953C8C0883409F0C8C00E94AC1797 -:1046900081E69AE00E9490052FEF83ED90E3215090 -:1046A00080409040E1F700C000000E94881E0CC0CE -:1046B0008FED97E041C088E49AE00E9490058091D8 -:1046C000BE0181608093BE01C1E0ADC08091BE019A -:1046D000C82FC17080FFEFCF84E59AE00E9490055B -:1046E0008091BE01817F8E7F3FC09091BE0191FB82 -:1046F000CC27C0F981E0C827892FC0FB81F98093BE -:10470000BE01CC2319F08BE39AE029C08DE29AE038 -:1047100013C09091BE0192FBCC27C0F981E0C8275D -:10472000892FC0FB82F98093BE01CC2319F08EE162 -:104730009AE015C08EE09AE00E949005C5CF909156 -:10474000BE0193FBCC27C0F981E0C827892FC0FBAD -:1047500083F98093BE01CC2351F082E09AE00E945D -:1047600090058091BE0181608093BE015CC085EFA1 -:1047700099E0E2CF86EE99E00E94900583EC99E003 -:104780000E9490058EE799E00E94900581E599E0EE -:104790000E9490058CE099E00E9490058DED98E0D4 -:1047A000CBCF8FEC98E00E9490050E9496111F924B -:1047B0008F9385EB98E09F938F930E9429068091B9 -:1047C0000C011F928F938EE998E09F938F930E9424 -:1047D000290680915B011F928F938BE898E09F934D -:1047E0008F930E9429060E942D1E9F938F937F9383 -:1047F0006F9384E798E09F938F930E9429068DB76B -:104800009EB742960FB6F8949EBF0FBE8DBF5CCF89 -:1048100080E001C08D510E94D92256CF82E798E0F6 -:104820000E949005C0E08C2FCF91089580E00895FC -:1048300080E00895CF93C82F8091CE01813069F038 -:1048400020F0823009F449C040C167E08FE00E9447 -:10485000DA08882309F43FC106C067E08FE00E94B0 -:10486000DA08882361F08C2F0E941624811104C07D -:104870008C2F0E94F9222FC081E090E02CC08C2F59 -:104880000E941824811126C0C431E1F070F4CB30AD -:1048900081F0C031D1F40E94A1218BEA97E00E94FF -:1048A000900582E08093CE0115C0C93259F0C8331B -:1048B00061F488EB97E00E9490058FEA97E00E94F0 -:1048C000900508C01092CE0104C189EA97E00E94C9 -:1048D0009005FFC081E08170FEC0C43228F5CE3162 -:1048E00008F0C1C0CB30A1F1D0F4C73009F0D3C07B -:1048F0008EE18093140182E3809313018AE0809318 -:10490000120184E18093110188E08093100188E214 -:1049100080930F018FE496E00E949005BFC0C331E1 -:1049200049F1C431C1F0B7C0CB3409F4A9C028F4AF -:10493000C93289F0C83361F0AEC0C13509F49EC0F8 -:10494000C23509F499C0CE3409F0A5C06AE09EC012 -:104950000E94A121A3C08091CD01882319F010925B -:10496000CD019CC08CE596E00E94900581E080938B -:10497000CE01B1C086E396E00E94900584E296E005 -:104980000E949005809114011F928F9381E296E01E -:104990009F938F930E9429068FE196E00E949005D5 -:1049A0008DE096E00E949005809113011F928F93F5 -:1049B0008AE096E09F938F930E94290688E096E014 -:1049C0000E94900589EF95E00E9490058091120168 -:1049D0001F928F9386EF95E09F938F930E942906F5 -:1049E00084EF95E00E94900583EE95E00E9490058B -:1049F000809111011F928F9380EE95E09F938F938A -:104A00000E9429068EED95E00E94900589EC95E0C4 -:104A10000E949005809110011F928F9386EC95E083 -:104A20009F938F930E94290684EC95E00E94900545 -:104A30008DEA95E00E94900580910F011F928F935F -:104A40008AEA95E09F938F930E94290688EA95E071 -:104A50000E9490058DB79EB748960FB6F8949EBFFA -:104A60000FBE8DBF1BC0CE51EC2FF0E0E75DFE4FB7 -:104A700080818093CD0112C061E003C061E006C077 -:104A80006AE08091CD010E94B82108C08091CD01DB -:104A90000E945B2203C08DE496E013C08091CD019B -:104AA000882369F01F928F9387E496E09F938F93FA -:104AB0000E9429060F900F900F900F9004C084E47D -:104AC00096E00E94900581E006C01092CE0180E041 -:104AD00002C080E000CFCF9108950E9474256894B1 -:104AE000B1110C94032608950E94E82588F09F5781 -:104AF00098F0B92F9927B751B0F0E1F0660F771F02 -:104B0000881F991F1AF0BA95C9F714C0B13091F0F7 -:104B10000E940226B1E008950C940226672F782F98 -:104B20008827B85F39F0B93FCCF3869577956795BC -:104B3000B395D9F73EF490958095709561957F4F28 -:104B40008F4F9F4F0895E89409C097FB3EF49095CE -:104B50008095709561957F4F8F4F9F4F9923A9F056 -:104B6000F92F96E9BB279395F695879577956795E5 -:104B7000B795F111F8CFFAF4BB0F11F460FF1BC029 -:104B80006F5F7F4F8F4F9F4F16C0882311F096E9BC -:104B900011C0772321F09EE8872F762F05C066236A -:104BA00071F096E8862F70E060E02AF09A95660F23 -:104BB000771F881FDAF7880F9695879597F90895DC -:104BC00057FD9058440F551F59F05F3F71F04795BE -:104BD000880F97FB991F61F09F3F79F087950895A3 -:104BE000121613061406551FF2CF4695F1DF08C0C2 -:104BF000161617061806991FF1CF869571056105DF -:104C000008940895E894BB2766277727CB0197F986 -:104C100008950E941B260C9495260E94872638F042 -:104C20000E948E2620F0952311F00C947E260C9481 -:104C300084260C9403260E94E02578F39923C9F377 -:104C40005523B9F3950F50E0551FAA27EE27FF27EC -:104C5000BB2700240894679520F4E20FF31FB41FCC -:104C60000A1E220F331F441FAA1F6695A9F77795C6 -:104C700030F4F30FB41F0A1E121E08F46395330FAD -:104C8000441FAA1F221F769599F7879520F4B40F29 -:104C90000A1E121E631F440FAA1F221F331F869570 -:104CA000A9F7862F712D602D11249F5750409AF03F -:104CB000F1F088234AF0EE0FFF1FBB1F661F771F1E -:104CC000881F91505040A9F79E3F510580F00C94E9 -:104CD0007E260C9403265F3FE4F3983ED4F386953A -:104CE00077956795B795F795E7959F5FC1F7FE2B89 -:104CF000880F911D9695879597F9089597F99F6765 -:104D000080E870E060E008959FEF80EC0895002453 -:104D10000A941616170618060906089500240A9420 -:104D200012161306140605060895092E0394000CA6 -:104D300011F4882352F0BB0F40F4BF2B11F460FF35 -:104D400004C06F5F7F4F8F4F9F4F089500245527FA -:104D500004C0080E591F880F991F009729F07695F7 -:104D60006795B8F37105B9F7802D952F0895991BB4 -:104D700079E004C0991F961708F0961B881F7A9552 -:104D8000C9F78095089597FB072E16F4009407D075 -:104D900077FD09D00E94DD2607FC05D03EF49095F2 -:104DA00081959F4F0895709561957F4F0895EE0FFF -:104DB000FF1F0590F491E02D0994AA1BBB1B51E144 -:104DC00007C0AA1FBB1FA617B70710F0A61BB70B7B -:104DD000881F991F5A95A9F780959095BC01CD0120 -:064DE0000895F894FFCFD6 -:104DE600FFFF5B0A4C0B290BF50AC10A01B4012827 -:104DF60008140A321E404D3622FF03B2037C035AC2 -:104E060003E602FF02180331030102030405060745 -:044E16000809000087 +:10095000004255494C443A203330613166643120BD +:100960002831303A33303A333420536570203239ED +:100970002032303136290A005649443A2030784630 +:1009800045454428742E6D2E6B2E29205049443A3B +:100990002030783041444228414442206B657962DE +:1009A0006F61726420636F6E766572746572292060 +:1009B0005645523A203078303130310A00444553A0 +:1009C000433A20636F6E7665727420414442206B17 +:1009D0006579626F61726420746F205553420A001A +:1009E0000A092D2056657273696F6E202D0A000A60 +:1009F0006D6F7573653A206F66660A000A6D6F75D4 +:100A000073653A206F6E0A000A6B6579626F6172D6 +:100A1000643A206F66660A000A6B6579626F6172DC +:100A2000643A206F6E0A000A6D61747269783A2028 +:100A30006F66660A000A6D61747269783A206F6E9B +:100A40000A000A64656275673A206F6E0A000A64DC +:100A5000656275673A206F66660A000A0A626F6F00 +:100A6000746C6F616465722E2E2E2000433E200050 +:100A700011241FBECFEFD4E0DEBFCDBF04B603FE0E +:100A800027C08091DC019091DD01A091DE01B09141 +:100A9000DF018730904BA740B04BD1F41092DC01BE +:100AA0001092DD011092DE011092DF0114BE84B7B6 +:100AB000877F84BF0FB6F894A89580916000886105 +:100AC00080936000109260000FBEE0E0F8E30995AB +:100AD00011E0A0E0B1E0E8EEFDE402C005900D9267 +:100AE000A433B107D9F721E0A4E3B1E001C01D921E +:100AF000AC3DB207E1F70E949B0C0C94F2260C94DB +:100B00000000FF93EF93E0913401F09135013097AD +:100B100009F00995EF91FF910895FC0185918030CE +:100B200011F0EFDFFBCF0895FF27E0E230E247FF4F +:100B30000CC0419597FF09C0EDE2609570958095D6 +:100B40009095611D711D811D911D27FF02C021958A +:100B500030E350E2AA27660F771F881F991FAA1F4C +:100B6000A41710F0A41B63955A95A9F7AA3008F0B2 +:100B7000A95FA05DAF93F39561157105810591059E +:100B800041F7ED3211F4EF93F395F21718F43F9318 +:100B9000F395FBCF8F91B5DFFA95E1F70895E991D1 +:100BA000F9918591803021F0853219F0AADFF9CFD3 +:100BB000089520E0E89455915532C1F3503311F473 +:100BC000689455915A3348F4505390F3220F022EF3 +:100BD000220F220F200D250FF4CF0EF421958991BD +:100BE0009991533619F3533729F1533559F1BC0113 +:100BF00088279927E8945C3621F489919991689423 +:100C00005591543639F446EF7EF077FF0DC08FEFE3 +:100C10009FEF0AC055374AE039F0583540E121F0DE +:100C2000523642E009F00895FF93EF937DDFEF9194 +:100C3000FF91B7CFFF93EF93FC0181918030B9F31F +:100C400060DFFBCFFF93EF9368DFF1CFDF93CF93AC +:100C5000CDB7DEB72596A3DFCF91DF910895282F7A +:100C60002770E82FE695E695E695EF70F0E0E95CF1 +:100C7000FE4F87FF0AC081E090E001C0880F2A95EF +:100C8000EAF780959081892308C081E090E001C057 +:100C9000880F2A95EAF79081892B808381E08093E1 +:100CA0004C0108950F931F93CF93DF93569A5E9A4A +:100CB0000E9499092FEF87EA91E6215080409040E9 +:100CC000E1F700C0000080E592E09F938F930E94BF +:100CD00026060F900F90C1E0D0E006E312E063E03B +:100CE0008C2F0E949D09009771F09F938F93DF9343 +:100CF000CF931F930F930E9426060F900F900F9093 +:100D00000F900F900F909FEF29EF80E091502040BF +:100D10008040E1F700C000002196C031D105F9F60E +:100D200063E082E00E949D098131910511F170F428 +:100D300087309105F1F020F404970297F0F419C080 +:100D400089309105B1F00D97C1F413C08D31910533 +:100D500081F030F48431910561F0499771F409C054 +:100D6000843C910531F0873C910519F0813C910557 +:100D700021F481E080934D0102C010924D0163E0A7 +:100D800087E00E949D0991E0823009F090E0909305 +:100D90004E01992341F083E292E09F938F930E944A +:100DA00026060F900F9023E042E063E082E00E946D +:100DB0001D0A86E192E09F938F930E9426060F9072 +:100DC0000F90C1E0D0E00CEF11E063E08C2F0E94A7 +:100DD0009D09009771F09F938F93DF93CF931F939B +:100DE0000F930E9426060F900F900F900F900F9078 +:100DF0000F908FEF99EF20E0815090402040E1F775 +:100E000000C000002196C031D105F9F6E7E3F1E01A +:100E100080E18E0F11928E13FDCF0E9497110E94D8 +:100E200040098091BE0181608093BE018CEE91E00B +:100E30000E948D05569A5E98DF91CF911F910F9178 +:100E40000895CF93DF938FE79BEB0197F1F700C0F5 +:100E500000000E94190AEC01009711F481E0BDC066 +:100E600097FD05C080914701816080934701D7FFBE +:100E700005C0809147018E7F80934701ED2FFF27AA +:100E8000EF73FF27CE018F739927C6FF02C08054EE +:100E90009109D6FF02C0E054F109A09136010A2E53 +:100EA000000CBB0BBD010E94A72681382FEF9207D3 +:100EB00014F481E89FEF22273327281B390B2138B0 +:100EC0008FEF380714F421E83FEF21952093480174 +:100ED000CF01BD010E94A72681382FEF920714F49D +:100EE00081E89FEF91958195910981382FEF9207C5 +:100EF00014F481E89FEF8195809349018091BE01B0 +:100F000083FF60C086ED91E00E948D05DF93CF9353 +:100F100080ED91E09F938F930E9426068EEC91E0E6 +:100F20000E948D058DEB91E00E948D058091360128 +:100F3000282F082E000C330B3F938F9388EB91E002 +:100F40009F938F930E94260686EB91E00E948D0569 +:100F5000809147011F928F9381EB91E09F938F9334 +:100F60000E9426068FEA91E00E948D05809148013B +:100F7000282F082E000C330B3F938F938CEA91E0BF +:100F80009F938F930E9426068AEA91E00E948D0526 +:100F900080914901282F082E000C330B3F938F932B +:100FA00087EA91E09F938F930E94260684EA91E05E +:100FB0000E948D058DB79EB744960FB6F8949EBFDC +:100FC0000FBE8DBF87E491E00E94EC118091360145 +:100FD00091E088300CF090E0890F80933601DF912A +:100FE000CF9108951F93CF93DF9310924C01C0913E +:100FF0000001D09101018FEF9FEF90930101809349 +:101000000001CF3F8FEFD80709F06AC08FE79BEB55 +:101010000197F1F700C0000082E00E94160AEC017F +:10102000892B09F05DC080914E01882309F458C0D6 +:1010300087E00E94160A009709F452C09C012F779E +:10104000332722303105A1F048F42115310569F02C +:101050002130310599F480788A641AC02330310533 +:1010600051F02F373105A1F009C08078826410C09B +:10107000807889640DC0807888640AC081E991E035 +:101080009F938F930E9426060F900F9081E18FC04F +:10109000292F33272F7733272130310579F050F06E +:1010A0002230310579F02330310581F4EC01D0781C +:1010B000D86416C0EC01D078D26412C0EC01D078AC +:1010C000DA640EC0EC01D078D9640AC08EE791E0F2 +:1010D0009F938F930E9426060F900F9080E167C028 +:1010E0008091BE0181FF18C0209709F45DC08AE697 +:1010F00091E00E948D05DF93CF9385E691E09F9369 +:101100008F930E94260683E691E00E948D050F9042 +:101110000F900F900F9003C0209709F445C0CF3770 +:101120009FE7D90711F48FE705C0CF3F8FEFD807AE +:1011300021F48FEF0E942F0639C02D2F3327822FE5 +:101140001C2F2F3F310581F4DF93CF9385E491E08D +:101150009F938F930E9426060E9452060F900F9035 +:101160000F900F908C2F23C090914D01992381F007 +:10117000A9014F7755274233510521F42078822F5A +:101180008A6006C04A30510519F42078822F8263A4 +:101190000E942F061F3F51F0DC2FCC27CF6FD0933A +:1011A0000101C093000102C080E001C081E0DF9135 +:1011B000CF911F910895E82FF0E0E95CFE4F208168 +:1011C000822F90E021E030E002C0220F331F6A95A9 +:1011D000E2F72823392381E0232B09F480E00895E6 +:1011E000E82FF0E0E95CFE4F80810895CF92DF9216 +:1011F000EF92FF920F931F93CF93DF938091BE01E5 +:1012000081FF35C087E391E00E948D0587E3E82EDA +:1012100081E0F82EC0E0D0E092E3C92E91E0D92E13 +:101220000AE211E0DF93CF93DF92CF920E9426066D +:101230008FE291E00E948D05F70181917F010E946C +:10124000891D1F928F931F930F930E94260688E299 +:1012500091E00E948D0521968DB79EB708960FB636 +:10126000F8949EBF0FBE8DBFC031D105D9F6DF9176 +:10127000CF911F910F91FF90EF90DF90CF90089545 +:10128000682F609582E00C94560A509A83E091E0B2 +:101290000197F1F700C0000050989AEB9A95F1F78A +:1012A00000C00895509A8AEB8A95F1F700C05098D3 +:1012B00083E091E00197F1F700C000000895EF92FC +:1012C000FF920F931F93CF93DF93C0E0D0E090E89D +:1012D000E92EF12C082F10E0C7010C2E02C09595C5 +:1012E00087950A94E2F780239123892B19F00E94B5 +:1012F000520902C00E9445092196C830D10561F704 +:10130000DF91CF911F910F91FF90EF900895489B2F +:1013100006C023E02A95F1F700000197C1F7089570 +:10132000489906C023E02A95F1F700000197C1F71C +:1013300008955898509808950895CF92DF92EF92AB +:10134000FF920F931F93CF93DF9300D0CDB7DEB7FB +:10135000F894509AE3EFFBE03197F1F700C00000FA +:101360006A8389830E9452096A816C6089818295AF +:10137000807F862B0E945F090E94450984EF91E0DF +:101380000E949009892B21F4789482EE9FEF43C04C +:1013900084EF91E00E948709009711F478943BC094 +:1013A00011E1C12CD12C02E882E890E00E94900962 +:1013B0007C01882351F199270E948709882329F10C +:1013C000CC0CDD1C902F9E19E81A9E1518F4689419 +:1013D000C0F806C0113121F478948CEE9FEF1BC049 +:1013E000115011F78FE591E00E949009892B21F4AB +:1013F00078948BEE9FEF0FC08BE590E00E948709F9 +:10140000892BB1F77894C60106C07894812F90E0BB +:101410009195819591090F900F90DF91CF911F9138 +:101420000F91FF90EF90DF90CF90089560E00C94C3 +:101430009D0960E083E00C949D091F93CF93DF9397 +:1014400000D01F92CDB7DEB7182FF894509A83EFD3 +:101450009BE00197F1F700C000002B834A8369836A +:101460000E9452096981862F88601295107F812B16 +:101470000E945F090E9445098FE193E00197F1F70F +:1014800000C000000E9452094A81842F0E945F0917 +:101490002B81822F0E945F090E94450978940F904A +:1014A0000F900F90DF91CF911F910895262F2770F5 +:1014B00040E062E00C941D0A80915A0108959FB7A4 +:1014C000F894109251019FBF9091D301943009F08C +:1014D00057C09091E9009F703091EC00232F21704C +:1014E00030FD20E8922B24E02093E9002091EB00CE +:1014F00020FF43C02091EE0027FF3FC020914F0105 +:10150000222321F02091E80025FF37C010924F01DF +:1015100026E03091E80035FD15C03091D30134301C +:1015200061F53091EB0035FD28C0215021F481E0B8 +:1015300080934F0122C0EFE9FFE03197F1F700C03F +:101540000000E7CF8093F1008091E80085FD0AC09C +:101550008091E80080FFFCCF8091E8008E77809337 +:10156000E80006C08FB7F89421E0209351018FBFA7 +:101570009F709093E90080E008959F709093E90038 +:101580008FEF0895CF93DF9300D01F92CDB7DEB7D2 +:101590009C018091D301843019F593E099833B83BA +:1015A0002A839093E9008FEF9091E800815095FD98 +:1015B00006C095ED9A95F1F700008111F5CF809165 +:1015C000E80085FF0DC040E050E063E070E0CE0130 +:1015D00001960E945C0D8091E8008E778093E80070 +:1015E0000F900F900F90DF91CF910895CF93DF93DD +:1015F00000D01F92CDB7DEB72091D301243021F562 +:1016000022E029839B838A8383E08093E9008FEF24 +:101610009091E800815095FD06C095ED9A95F1F7FF +:1016200000008111F5CF8091E80085FF0DC040E0FA +:1016300050E063E070E0CE0101960E945C0D809165 +:10164000E8008E778093E8000F900F900F90DF9165 +:10165000CF9108952091D3012430F1F422E020931A +:10166000E9002FEF3091E800215035FD06C035ED3F +:101670003A95F1F700002111F5CF2091E80025FF00 +:101680000BC040E050E065E070E00E945C0D80918E +:10169000E8008E778093E8000895CF93DF93209140 +:1016A000D301243039F521E02093E9002FEF309168 +:1016B000E800215035FD06C035ED3A95F1F7000000 +:1016C0002111F5CF2091E80025FF14C0EC0140E086 +:1016D00050E068E070E00E945C0D8091E8008E7739 +:1016E0008093E80088E0FE01A2E5B1E001900D9250 +:1016F0008A95E1F7DF91CF9108958CE892E00C9400 +:101700008D05209150012F5F822F62E30E94B82641 +:10171000992319F02093500108951092500180915F +:101720005101882371F18091D301843041F580917A +:10173000E9008F702091EC00922F917020FD90E8CD +:10174000892B94E09093E9009091EB0090FF14C0F6 +:101750009091EE0097FF10C09091E80095FF03C0B4 +:101760001092F100F9CF9091E80090FF05C09091A0 +:10177000E8009E779093E8008F708093E9001092C4 +:101780005101089542E061EC81E00E94650E42E063 +:1017900061EC82E00E94650E42E061EC83E00E9411 +:1017A000650E42E261EC84E00C94650E8091D501F7 +:1017B000833009F453C030F4813071F0823009F481 +:1017C0008CC008958A3009F478C08B3009F45EC06B +:1017D000893009F09AC020C08091D401813A09F083 +:1017E00094C08091E800877F8093E8008091D801C1 +:1017F0009091D901892B21F468E082E591E003C042 +:1018000060E080E090E070E00E94A70D8091E80029 +:101810008B778093E80008958091D401813209F09C +:1018200074C08091D8019091D901892B09F06DC0C5 +:101830008091E800877F8093E8008091E80082FD36 +:1018400005C08091D3018111F8CF5FC08091F10074 +:1018500080935A018091E8008B7753C08091D40126 +:10186000813A09F052C08091D8019091D901892B19 +:1018700009F04BC08091E800877F8093E800809159 +:10188000E80080FFFCCF80910C0136C08091D4012C +:101890008132D9F58091D8019091D901892BA9F590 +:1018A0008091E800877F8093E8000E949A0E8091E3 +:1018B000D60180930C010C94AD178091D401813234 +:1018C00021F58091E800877F8093E8000E949A0EBE +:1018D0008091D70180935B0108958091D401813A72 +:1018E000A1F48091E800877F8093E8008091E80070 +:1018F00080FFFCCF80915B018093F1008091E80034 +:101900008E778093E8000C949A0E089508950895B8 +:10191000089588E892E00E948D050C94880C0E943E +:10192000AF1D8091D101882329F00E94DA1D811119 +:101930000C94460D089584B7877F84BF0FB6F89442 +:10194000A89580916000886180936000109260008B +:101950000FBE90E080E80FB6F894809361009093FA +:1019600061000FBE0E94860C0E9424120E94EB0EA2 +:101970000E943E0F8091E20084608093E2008FE538 +:101980009AE00E94841D78948091D3018430E1F71D +:1019900083E792E00E948D050E94261282E091E08A +:1019A0000E94921182E692E00E948D050E94870CAF +:1019B0008091D301853039F48EE592E00E948D0547 +:1019C0000E948F0CF5CF0E942C12F2CF0C94EE1DCA +:1019D00084E892E00E948D050C94E60C292F3327B1 +:1019E00023303105C9F064F42130310581F0223013 +:1019F000310509F043C084E790E024ED32E042C0B5 +:101A000021323105F1F02232310541F137C082E156 +:101A100090E028E433E036C099278130910541F009 +:101A20008230910541F0892B49F5E0EDF2E005C0E7 +:101A3000E0ECF2E002C0E0E9F2E0849190E09F0186 +:101A400021C06430D8F4E62FF0E0EE0FFF1FEF5D09 +:101A5000FE4F2081318189E090E014C0643070F441 +:101A600070E0FB01EE0FFF1FE75EFE4F208131812A +:101A7000FB01EB5EFE4F808190E004C080E090E0CF +:101A800020E030E0FA0131832083089584E089BDAD +:101A900086E089BD09B400FEFDCF8091D8008F7D1E +:101AA0008093D8008091E00082608093E000809174 +:101AB000E00081FDFCCF0895CF92DF92EF92FF927C +:101AC0000F931F93CF93DF93EC018B016A010E9468 +:101AD000B90E811133C0C114D10439F0F6018081EF +:101AE0009181081B190BC80FD91FE12CF12C01158E +:101AF000110519F18091E80085FD16C08091E8007C +:101B00008E778093E800C114D10449F0F6018081FA +:101B10009181E80EF91EF182E08285E00FC00E94FB +:101B2000B90E882321F30AC089918093F1000150F6 +:101B30001109FFEFEF1AFF0ADACF80E0DF91CF91B2 +:101B40001F910F91FF90EF90DF90CF90089520911B +:101B5000DA013091DB012617370748F0611571056E +:101B600039F42091E8002E772093E80001C0B901F4 +:101B700040E06115710591F12091D301222309F410 +:101B800040C0253009F43FC02091E80023FD3DC04E +:101B90002091E80022FD2FC02091E80020FFE9CF2E +:101BA0002091F20030E0FC01CF016115710559F080 +:101BB0002830310540F481918093F1006150710922 +:101BC0002F5F3F4FF1CF41E02830310509F040E071 +:101BD0002091E8002E772093E800CBCF4111CCCFA5 +:101BE0000AC08091D301882361F0853061F0809133 +:101BF000E80083FD0AC08091E80082FFF2CF80E018 +:101C0000089582E0089583E0089581E00895209189 +:101C1000DA013091DB012617370748F061157105AD +:101C200039F42091E8002E772093E80001C0B90133 +:101C3000FC0120E06115710579F18091D3018823C1 +:101C400009F43DC0853009F43CC08091E80083FD73 +:101C50003AC08091E80082FD2CC08091E80080FFAE +:101C6000E9CF8091F20090E06115710559F088305C +:101C7000910540F424912093F1003196615071094F +:101C80000196F2CF21E0089709F020E08091E8006A +:101C90008E778093E800CECF2111CFCF0AC08091FC +:101CA000D301882361F0853061F08091E80083FDE5 +:101CB0000AC08091E80082FFF2CF80E0089582E0C0 +:101CC000089583E0089581E00895982F953058F5A0 +:101CD0009093E900981739F07091EC002091ED0095 +:101CE0005091F00003C0242F762F50E021FF19C03F +:101CF0003091EB003E7F3093EB003091ED003D7F63 +:101D00003093ED003091EB0031603093EB00709335 +:101D1000EC002093ED005093F0002091EE0027FF9F +:101D200007C09F5FD3CF8F708093E90081E0089553 +:101D300080E008958091D40187FF11C08091E80070 +:101D400082FD05C08091D3018111F8CF11C080912F +:101D5000E8008B770BC08091D301882349F08091F4 +:101D6000E80080FFF8CF8091E8008E778093E8004C +:101D700008952091E4003091E50095E64091EC0053 +:101D8000842F817040FF22C08091E80080FD1CC03C +:101D90008091D301882391F0853091F08091EB0000 +:101DA00085FD10C04091E4005091E50042175307B3 +:101DB00029F39A01915011F784E0089582E0089583 +:101DC00083E0089581E0089580E008954091E8005F +:101DD00042FFDECF08950E94480F0E944B0FE0EEB5 +:101DE000F0E0808181608083E8EDF0E080818F7792 +:101DF000808319BCE3E6F0E08081816080831092EB +:101E0000D20108950E94480F0E944B0F8091D80084 +:101E10008F778093D8008091D80080688093D80015 +:101E20008091D8008F7D8093D80084E089BD86E0C2 +:101E300089BD09B400FEFDCF1092D3011092CF01ED +:101E40001092D1011092D00142E060E080E00E9447 +:101E5000650E8091E1008E7F8093E1008091E20029 +:101E600081608093E2008091E20088608093E200CC +:101E70008091E0008E7F8093E0000895E3E6F0E03B +:101E800080818E7F808381E08093D2010C94020F49 +:101E90001092E20008951092E10008951F920F92AF +:101EA0000FB60F9211242F933F934F935F936F932D +:101EB0007F938F939F93AF93BF93EF93FF93809103 +:101EC000E10082FF0BC08091E20082FF07C0809199 +:101ED000E1008B7F8093E1000E94810B8091E10003 +:101EE00080FF19C08091E20080FF15C08091E20060 +:101EF0008E7F8093E2008091E20080618093E20017 +:101F00008091D80080628093D80019BC85E08093CE +:101F1000D3010E94890C8091E10084FF30C0809140 +:101F2000E20084FF2CC084E089BD86E089BD09B44D +:101F300000FEFDCF8091D8008F7D8093D8008091E6 +:101F4000E1008F7E8093E1008091E2008F7E80939C +:101F5000E2008091E20081608093E2008091CF01F5 +:101F6000882311F084E007C08091E30087FD02C060 +:101F700081E001C083E08093D3010E94E80C80914E +:101F8000E10083FF29C08091E20083FF25C080919A +:101F9000E100877F8093E10082E08093D30110927B +:101FA000CF018091E1008E7F8093E1008091E2007B +:101FB0008E7F8093E2008091E20080618093E20056 +:101FC00042E060E080E00E94650E8091F000886051 +:101FD0008093F0000E947D0BFF91EF91BF91AF9134 +:101FE0009F918F917F916F915F914F913F912F9131 +:101FF0000F900FBE0F901F9018951F920F920FB663 +:102000000F9211242F933F934F935F936F937F937E +:102010008F939F93AF93BF93CF93DF93EF93FF93F0 +:10202000C091E900CF708091EC00D82FD17080FD75 +:10203000D0E81092E9008091F000877F8093F00053 +:1020400078940E9441101092E9008091F00088601D +:102050008093F000CD2BCF70C093E900FF91EF91FA +:10206000DF91CF91BF91AF919F918F917F916F91B0 +:102070005F914F913F912F910F900FBE0F901F9046 +:1020800018951F93CF93DF93CDB7DEB7AA970FB6FE +:10209000F894DEBF0FBECDBFE4EDF1E088E08E0F17 +:1020A0009091F10091938E13FBCF0E94D60B8091FB +:1020B000E80083FF1FC18091D4019091D501492F81 +:1020C00050E04A30510508F015C1FA01E65CFF4FB7 +:1020D0000C94D826803881F0823809F00BC18091A9 +:1020E000D8018F708093E9008091EB0085FB8827F1 +:1020F00080F91092E90006C08091D0019091D10141 +:10210000911182609091E800977F9093E80080930E +:10211000F1001092F100C8C0282F2D7F09F0EAC00D +:10212000882319F0823061F0E5C08091D6018130BA +:1021300009F0E0C0933009F080E08093D1012BC01A +:102140008091D601811127C08091D8018F7009F448 +:10215000D1C08093E9002091EB0020FF1CC0933098 +:1021600021F48091EB00806214C09091EB009061AB +:102170009093EB0021E030E0A90102C0440F551F0D +:102180008A95E2F74093EA001092EA008091EB0012 +:1021900088608093EB001092E9008091E800877FCF +:1021A00086C08111A7C01091D6011F778091E300EE +:1021B0008078812B8093E3008091E800877F809373 +:1021C000E8000E949A0E8091E80080FFFCCF809189 +:1021D000E30080688093E300111102C082E001C037 +:1021E00083E08093D30186C08058823008F082C09B +:1021F0008091D6019091D7018C3D53E0950779F5F8 +:1022000083E08A838AE289834FB7F894DE011396CC +:1022100020E03EE051E2E32FF0E050935700E491DC +:1022200020FF03C0E295EF703F5FEF708E2F90E0CC +:10223000EA3010F0C79601C0C0968D939D932F5F32 +:10224000243149F74FBF8091E800877F8093E800F1 +:102250006AE270E0CE0101960E94A70D14C0AE01A3 +:102260004F5F5F4F6091D8010E94EE0CBC01892B3B +:1022700009F440C09091E800977F9093E80089812D +:102280009A810E94070E8091E8008B778093E80086 +:1022900031C0803879F58091E800877F8093E8002D +:1022A0008091CF018093F1008091E8008E77809338 +:1022B000E8000E949A0E1EC081111CC09091D601A8 +:1022C0009230C0F48091E800877F8093E80090937B +:1022D000CF010E949A0E8091CF01811106C080919A +:1022E000E30087FD02C081E001C084E08093D30158 +:1022F0000E94C20B8091E80083FF0AC08091E80031 +:10230000877F8093E8008091EB0080628093EB00F0 +:10231000AA960FB6F894DEBF0FBECDBFDF91CF9166 +:102320001F91089590936101809360010895E09159 +:102330006001F0916101309721F00190F081E02D72 +:10234000099480E00895EF92FF920F931F93CF932B +:10235000DF93E0916001F09161013097B1F18C0160 +:102360000280F381E02D09958091BE0182FF2DC08E +:1023700080FF04C087E494E00E948D05E80118E026 +:1023800081E4E82E84E0F82E8091BE0180FF0BC02E +:1023900088811F928F93FF92EF920E9426060F90E2 +:1023A0000F900F900F90115021961111EDCF809149 +:1023B000BE0180FF0AC08FE394E0DF91CF911F91AF +:1023C0000F91FF90EF900C948D05DF91CF911F91AD +:1023D0000F91FF90EF900895E0916001F0916101FD +:1023E000309721F00480F581E02D09940895209123 +:1023F0005E0130915F018217930771F090935F0146 +:1024000080935E01E0916001F0916101309721F0CD +:102410000680F781E02D0994089520915C013091A8 +:102420005D018217930771F090935D0180935C01C9 +:10243000E0916001F0916101309721F00084F18515 +:10244000E02D0994089508950C9423120E94191EFA +:102450000E9452060C949C09CF92DF92EF92FF9259 +:102460000F931F93CF93DF9300D000D000D0CDB750 +:10247000DEB70E94F20783E6C82E81E0D82E00E086 +:1024800010E0E02E802F0E94F008F60141916F01CC +:10249000F42EF826B1F40F5F1F4F0031110589F7B4 +:1024A0008FEF89838A831B820E94221E8160782F8E +:1024B0009D838C8349815A816B818D810E94ED12AD +:1024C00047C09091BE0191FF04C08E830E94F60820 +:1024D0008E8120E030E04F2D50E0922FBA01022E85 +:1024E00002C0759567950A94E2F760FF2BC02983B7 +:1024F000EA8221E030E0690102C0CC0CDD1C9A9533 +:10250000E2F790E08C219D21892B09F420E02B83B8 +:102510000E94221E8160782F9D838C8349815A817D +:102520006B818D810E94ED1249815A816B817C8182 +:102530008D810E949C1DF801ED59FE4F8081C826B7 +:10254000C08206C02F5F3F4F2830310531F6A3CF40 +:102550000E949B1D0E94EF200E94210710916201A2 +:102560000E949711181741F10E9497118093620100 +:102570009091BE0192FF0EC090FF0CC01F928F93EE +:1025800089E594E09F938F930E9426060F900F9009 +:102590000F900F908091620126960FB6F894DEBFDF +:1025A0000FBECDBFDF91CF911F910F91FF90EF90A4 +:1025B000DF90CF900C94AD1D26960FB6F894DEBF39 +:1025C0000FBECDBFDF91CF911F910F91FF90EF9084 +:1025D000DF90CF9008950C944009CF93DF93CDB74F +:1025E000DEB72B970FB6F894DEBF0FBECDBF942F8A +:1025F0004F83252F588769877A878B874A855B8524 +:10260000452B21F02F3F09F59F3FF9F4DE0111968C +:1026100086E0FD0111928A95E9F785E0FE01379683 +:1026200001900D928A95E1F749815A816B817C81F5 +:102630008D819E810E94561A2B960FB6F894DEBFAC +:102640000FBECDBFDF91CF9108954F815885698529 +:102650007A858B850E949C1DD9CFCF93882309F45E +:10266000E8C0C82F8238A1F40E94971181FDE1C013 +:1026700089E30E94E51C0E945E1D2FEF81EE94E02D +:10268000215080409040E1F700C0000089E315C070 +:102690008338C1F40E94971180FDCBC083E50E946E +:1026A000E51C0E945E1D2FEF81EE94E021508040DA +:1026B0009040E1F700C0000083E50E94021DCF9129 +:1026C0000C945E1D8438A1F40E94971182FDB1C064 +:1026D00087E40E94E51C0E945E1D2FEF81EE94E0CE +:1026E000215080409040E1F700C0000087E4E5CF32 +:1026F0008CEF8C0F813A48F48C2F0E941B2481119F +:1027000098C08C2F0E94E51CDACF80E28C0F8830B5 +:1027100048F4C77081E001C0880FCA95EAF70E94AB +:10272000241DCDCF8BE58C0F833078F4C53A29F08A +:10273000C63A31F083E890E005C081E890E002C03D +:1027400082E890E0CF910C94F71188E58C0F8531E9 +:1027500008F06FC0C83A61F1C93A69F1CA3A71F13B +:10276000CB3A79F1CC3A81F1CD3A89F1CE3A91F177 +:10277000CF3A99F1C13BA1F1C03BA9F1C23BB1F104 +:10278000C33BB9F1C43BC1F1C53BC9F1C63BD1F173 +:10279000C73BD9F1C83BE1F1C93BE9F1CA3BF1F1D3 +:1027A000CB3BF9F1CC3B09F43FC080E090E03EC068 +:1027B00082EE90E03BC089EE90E038C08AEE90E077 +:1027C00035C085EB90E032C086EB90E02FC083EB04 +:1027D00090E02CC084EB90E029C087EB90E026C00D +:1027E0008CEC90E023C08DEC90E020C083E891E079 +:1027F0001DC08AE891E01AC082E991E017C084E91F +:1028000091E014C081E292E011C083E292E00EC038 +:1028100084E292E00BC085E292E008C086E292E09A +:1028200005C087E292E002C08AE292E0CF910C9468 +:102830000D12CF910895882309F466C08238A1F45F +:102840000E94971181FF60C089E30E94E51C0E94ED +:102850005E1D2FEF81EE94E0215080409040E1F723 +:1028600000C0000089E315C08338B9F40E949711B5 +:1028700080FF4AC083E50E94E51C0E945E1D2FEF89 +:1028800081EE94E0215080409040E1F700C00000CC +:1028900083E50E94021D0C945E1D8438A1F40E9401 +:1028A000971182FF31C087E40E94E51C0E945E1DE3 +:1028B0002FEF81EE94E0215080409040E1F700C07E +:1028C000000087E4E6CF9CEF980F913A10F390E276 +:1028D000980F983050F4877091E001C0990F8A9555 +:1028E000EAF7892F0E942A1DD6CF9BE5980F9330D7 +:1028F00020F480E090E00C94F711885A853120F4A0 +:1029000080E090E00C940D120895882321F00E943D +:10291000241D0C945E1D0895882321F00E942A1D19 +:102920000C945E1D0895CF92DF92EF92FF920F9369 +:102930001F93CF93DF9300D000D000D0CDB7DEB788 +:1029400025E0FC01DE01119601900D922A95E1F738 +:10295000FC0140813181F280258122952F706381B5 +:102960007481672B09F4D8C23F3F19F44F3F09F433 +:10297000D3C26C0149833A8389819A812E830E9454 +:10298000A41C182F092F0E94A31C0E94B31BE02F28 +:10299000E295EF70F0E0EC5BFF4F2E810C94D826AF +:1029A000802F807F902F9F70092F882311F0029530 +:1029B000007FFF2049F0002309F45FC2802F0E94AE +:1029C000371D0E945E1D59C2812F0E941B140023D7 +:1029D00009F4A2C2802F0E943D1D26960FB6F894DE +:1029E000DEBF0FBECDBFDF91CF911F910F91FF9042 +:1029F000EF90DF90CF900C945E1D802F807F902F02 +:102A00009F70092F803211F00295007F112319F079 +:102A1000113001F129C0FF20A9F0802F222349F1B4 +:102A2000213039F526960FB6F894DEBF0FBECDBF24 +:102A3000DF91CF911F910F91FF90EF90DF90CF909A +:102A40000C94471D222319F0213009F465C20E941D +:102A50004A1D2CC0FF20E9F0263008F05DC20E941C +:102A6000211D802329F022C0FF20F1F0211115C083 +:102A7000802F26960FB6F894DEBF0FBECDBFDF9134 +:102A8000CF911F910F91FF90EF90DF90CF900C941A +:102A90008514253008F040C209C0F601858180FF09 +:102AA000ECC18F708583E4CF2111FBC1802F69C1F8 +:102AB000202F26952695237030E02115310521F031 +:102AC00021303105C9F028C2FF2021F0812F902F3D +:102AD000937002C080E090E026960FB6F894DEBFB7 +:102AE0000FBECDBFDF91CF911F910F91FF90EF905F +:102AF000DF90CF900C94F711FF2021F0812F902FC1 +:102B0000937002C080E090E026960FB6F894DEBF86 +:102B10000FBECDBFDF91CF911F910F91FF90EF902E +:102B2000DF90CF900C940D12812FFF2019F00E949E +:102B3000751F02C00E94DD1F26960FB6F894DEBFF7 +:102B40000FBECDBFDF91CF911F910F91FF90EF90FE +:102B5000DF90CF900C946220802F837009F078C0B2 +:102B6000F110DAC1812F829586958770880F880FC2 +:102B7000912F9F70C92ED12CE12CF12C082E04C06E +:102B8000CC0CDD1CEE1CFF1C0A94D2F714FF12C003 +:102B90004FE050E060E070E004C0440F551F661F36 +:102BA000771F8A95D2F7CB01BA0160957095809511 +:102BB000909503C060E070E0CB01202F269526950C +:102BC0002370422F50E042305105D1F0433051057F +:102BD00059F16C297D298E299F294130510541F1F8 +:102BE00026960FB6F894DEBF0FBECDBFDF91CF9112 +:102BF0001F910F91FF90EF90DF90CF900C94C81B26 +:102C00006C297D298E299F2926960FB6F894DEBF60 +:102C10000FBECDBFDF91CF911F910F91FF90EF902D +:102C2000DF90CF900C94DA1B0E94C81BC701B6013D +:102C300026960FB6F894DEBF0FBECDBFDF91CF91C1 +:102C40001F910F91FF90EF90DF90CF900C94B61BE7 +:102C5000FF2019F0802F817001C08695882309F428 +:102C60005BC1812F829586958770880F880F912F81 +:102C70009F70C92ED12CE12CF12C082E04C0CC0C55 +:102C8000DD1CEE1CFF1C0A94D2F714FF12C04FE0AB +:102C900050E060E070E004C0440F551F661F771FCE +:102CA0008A95D2F7CB01BA01609570958095909581 +:102CB00003C060E070E0CB01202F2695269523709D +:102CC000422F50E042305105D1F04330510559F1C7 +:102CD0006C297D298E299F294130510541F1269685 +:102CE0000FB6F894DEBF0FBECDBFDF91CF911F911D +:102CF0000F91FF90EF90DF90CF900C947F1C6C2988 +:102D00007D298E299F2926960FB6F894DEBF0FBE27 +:102D1000CDBFDF91CF911F910F91FF90EF90DF908A +:102D2000CF900C94911C0E947F1CC701B60126967F +:102D30000FB6F894DEBF0FBECDBFDF91CF911F91CC +:102D40000F91FF90EF90DF90CF900C946D1C103F8F +:102D500041F118F4103E48F48BC0123F09F450C002 +:102D6000D8F1133F09F460C083C01F70802F8F71AA +:102D7000FF2021F00E94061C812F7BCE0E94271C81 +:102D8000812F26960FB6F894DEBF0FBECDBFDF9120 +:102D9000CF911F910F91FF90EF90DF90CF900C9407 +:102DA0008C14FF20A9F0253008F0B6C0802F8F7159 +:102DB00026960FB6F894DEBF0FBECDBFDF91CF9140 +:102DC0001F910F91FF90EF90DF90CF900C944C1CCF +:102DD000263008F0A1C0EACFFF20A1F0802F8F712C +:102DE00026960FB6F894DEBF0FBECDBFDF91CF9110 +:102DF0001F910F91FF90EF90DF90CF900C94061CE5 +:102E0000FF2061F3802F8F7126960FB6F894DEBFF6 +:102E10000FBECDBFDF91CF911F910F91FF90EF902B +:102E2000DF90CF900C94271CFF2091F0802F8F71A2 +:102E300026960FB6F894DEBF0FBECDBFDF91CF91BF +:102E40001F910F91FF90EF90DF90CF900C94F11BAA +:102E500026960FB6F894DEBF0FBECDBFDF91CF919F +:102E60001F910F91FF90EF90DF90CF900C94EC1B8F +:102E7000FF20A1F0222309F4B1CF812F26960FB6AF +:102E8000F894DEBF0FBECDBFDF91CF911F910F91A0 +:102E9000FF90EF90DF90CF900C942D13222309F434 +:102EA000B1CF812F26960FB6F894DEBF0FBECDBFEF +:102EB000DF91CF911F910F91FF90EF90DF90CF9016 +:102EC0000C941B14402F4F70612FC6010E94EB1E03 +:102ED00026960FB6F894DEBF0FBECDBFDF91CF911F +:102EE0001F910F91FF90EF90DF90CF900C94FE1AFE +:102EF000402F4F70612FC60126960FB6F894DEBFA3 +:102F00000FBECDBFDF91CF911F910F91FF90EF903A +:102F1000DF90CF900C94EE1E26960FB6F894DEBF8D +:102F20000FBECDBFDF91CF911F910F91FF90EF901A +:102F3000DF90CF9008950E94441D0E94131D0E94AF +:102F40005E1D0E9496210E94622080E090E00E9417 +:102F5000F71180E090E00C940D120E94341D0C9447 +:102F60009B170E94A41C292F22952F7030E02C3033 +:102F700031054CF42A3031056CF4225031092230ED +:102F8000310588F407C02C30310549F02F30310568 +:102F900031F009C0803E48F0803F29F406C093FB21 +:102FA000882780F9089580E0089581E00895CF93FF +:102FB000DF9300D000D01F92CDB7DEB70F900F90F7 +:102FC0000F900F900F90DF91CF910895CF93DF93E3 +:102FD00000D000D000D0CDB7DEB726960FB6F8945B +:102FE000DEBF0FBECDBFDF91CF910895CF93DF93AA +:102FF000C091730180917401C817A1F0D0E0CE0197 +:1030000066E070E00E94A726FC01EB58FE4F40816D +:10301000518162817381848195810E94E617219696 +:10302000C770E8CFDF91CF9108954091A5015091ED +:10303000A6016091A7017091A8018091A9019091CA +:10304000AA010C94E617CF93DF938091AA01829591 +:103050008F7009F05CC08091A701882309F457C0E4 +:1030600020917301D09174014091A501C091A601F6 +:10307000E091A801F091A9012D1709F448C030E0B2 +:10308000309709F440C0CF3F11F44F3FE1F1C9013F +:1030900066E070E00E94A726DC01AB58BE4F119697 +:1030A0008C911197C8132FC08C9148132CC0129685 +:1030B0008C911297811127C013968D919C91149732 +:1030C0008E179F0708F401978E1B9F0B883C910574 +:1030D000D0F48091AA018F7080618093AA01C90108 +:1030E00066E070E00E94A726FC01E658FE4F908142 +:1030F0009F709061908385EA91E00E949314DF9124 +:10310000CF910C94F6172F5F3F4F2770B5CFDF910B +:10311000CF910895BF92CF92DF92EF92FF920F93DB +:103120001F93CF93DF93CDB7DEB761970FB6F894B7 +:10313000DEBF0FBECDBF8C0185E0F801DE011D961C +:1031400001900D928A95E1F7D8014C9111962C913E +:1031500011971296EC9012971396CD90DC901497DD +:103160005091A5016091A6018091A8019091A901BB +:10317000009709F46EC16F3F19F45F3F09F469C10C +:10318000B090A701BB2009F4C3C03091AA01C816B2 +:10319000D90628F0F601E81BF90BCF0104C0809591 +:1031A00090958C0D9D1DFF24F394883C910588F02B +:1031B000F12C307F09F0CBC07C2DD98AC88A522FE0 +:1031C0006E2D89890E94D71785EA91E00E94931499 +:1031D000B4C0832F807F09F049C0621314C0541318 +:1031E00012C0E11010C03F7030613093AA010E94FC +:1031F000151885EA91E00E9493148091AA01D801E4 +:1032000015968C9331C0CD2831F12F3F11F44F3FEB +:1032100011F1FE2CE1101FC0E09173013091740197 +:10322000E31709F45CC0F0E0CF0166E070E00E94B3 +:10323000A726DC01AB58BE4F11968C91119728132D +:1032400007C08C91481304C012968C91811103C061 +:103250003196E770E5CFFE2CEE2009F416C180917F +:10326000AA0181608093AA01F12C0FC1621308C0EA +:10327000541306C0E11004C08091AA01D801C1C056 +:103280004D872E878D859E850E94B1178823E1F199 +:10329000EE20D1F12091AA01822F82958F7090E0CB +:1032A000029774F08091A5019091A60198878F8371 +:1032B0001986DB86CA862C87CE0107960E94931456 +:1032C00086E0F801A5EAB1E001900D928A95E1F758 +:1032D0000E9423180E941518FF24F394D6C04D872E +:1032E0002E878D859E850E94A41C292F22952F70E4 +:1032F00030E0223031050CF0BCC09F7009F0B6C040 +:10330000805E883008F4C1C0C8010E949314E4CFE5 +:10331000C816D90608F453C0F601E81BF90BCF0113 +:10332000883C910508F450C0F12C7C2DD98AC88ABC +:10333000522F6E2D89890E94D717E5EAF1E086E0C9 +:10334000DF011D928A95E9F70E9415189EC062134D +:1033500014C0541312C0E11010C08091AA01F801EA +:103360008583C8010E94931486E0E5EAF1E0DF015D +:103370001D928A95E9F7FB2C88C04D872E878D8595 +:103380009E850E94B117882309F4BECFEE2009F470 +:10339000BBCF2091AA01822F82958F7090E0029777 +:1033A0000CF48ECF8091A5019091A6019A83898318 +:1033B0001B82DD82CC822E83CE0101967FCF809549 +:1033C00090958C0D9D1DACCFFE2CEE2009F49CCF6A +:1033D00062132EC054132CC02091AA0120FD1FC0DF +:1033E000822F82958F70D9F0D80115962C9315975E +:1033F0008F3049F08F5F982F9295907F822F8F703A +:10340000892B15968C93C8010E94931486E0F801CD +:10341000A5EAB1E001900D928A95E1F795CF86E09B +:10342000F801A5EAB1E001900D928A95E1F72DC06F +:103430004D872E878D859E850E94B117811140CFC3 +:103440008091AA0181608093AA01C8010E9493140F +:103450001CC0EE2009F458CF4D872E878D859E85A0 +:103460000E94B117882309F44FCF2ACF811148CF8A +:103470000CC0243031050CF047CF9F7009F440CFC9 +:10348000F8019581907F09F03BCF8F2D61960FB6A3 +:10349000F894DEBF0FBECDBFDF91CF911F910F918A +:1034A000FF90EF90DF90CF90BF900895CF93DF9380 +:1034B000CDB7DEB72C970FB6F894DEBF0FBECDBFE9 +:1034C0004F83588769877A878B879C87CE010796B9 +:1034D0000E948A18882371F08F8198852A853B8500 +:1034E000232B09F43FC09F3F09F068C08F3F09F0CC +:1034F00065C038C086E0FE013796DE011196019066 +:103500000D928A95E1F76F817885EA85FB85309782 +:1035100049F17F3F11F46F3F29F18091740190E0F0 +:103520009C012F5F3F4F277033274091730150E07C +:103530002417350709F44BC069837A83FD83EC8334 +:1035400066E070E00E94A726DC01AB58BE4F96E013 +:10355000FE01319601900D929A95E1F72093740146 +:103560000E94F61780917301909174018917E9F117 +:1035700090E066E070E00E94A7268B589E4F0E9464 +:103580008A18882391F18091730190E066E070E0E1 +:103590000E94A726FC01EB58FE4F408151816281B9 +:1035A0007381848195810E94E6178091730190E078 +:1035B00001968770992780937301D4CF4F815885E6 +:1035C00069857A858B859C850E94E617CBCF0E9402 +:1035D000AD171092740110927301E5EAF1E086E0F4 +:1035E000DF011D928A95E9F7BDCF2C960FB6F894AE +:1035F000DEBF0FBECDBFDF91CF910895DF92EF9276 +:10360000FF920F931F93CF93DF93FC01892B09F453 +:103610008AC0E12CF12CDD24D394EF012196849112 +:10362000853709F461C058F4843708F04EC08430FF +:1036300008F06AC08130D1F0823071F174C08837EF +:1036400009F45DC050F4863709F455C0873709F096 +:103650006AC08E2D0E94311D54C09CE7980F903790 +:1036600008F061C08F770E941B1450C08F010E5F5D +:103670001F4FFE01849190E2980F983050F48770AC +:10368000FD2D01C0FF0F8A95EAF78F2F0E94371D8D +:1036900014C00E942D1313C08F010E5F1F4FFE0137 +:1036A000C49180E28C0F883060F4C7708D2D01C00A +:1036B000880FCA95EAF70E943D1D0E945E1DE80131 +:1036C00025C08C2F0E941B14FACF9F012E5F3F4F05 +:1036D000FE01C491CC2369F08FE99FE00197F1F7D7 +:1036E00000C00000C150F6CF9F012E5F3F4FFE018A +:1036F000F490E9010BC00E94211DE82E07C00E9432 +:10370000341D0E945E1D02C00E942D138F2D882340 +:1037100041F0EFE9FFE03197F1F700C00000815080 +:10372000F6CFFE017ACFDF91CF911F910F91FF90DD +:10373000EF90DF9008956093AF017093B001809394 +:10374000B1019093B2010E94AB1D0C949B17609342 +:10375000AB017093AC018093AD019093AE010E94D8 +:10376000AC1D0C949B1708950C949B1B0F931F93F7 +:103770000091AF011091B0012091B1013091B201DF +:10378000602B712B822B932B1F910F910C949B1B01 +:103790000F931F930091AF011091B0012091B101DF +:1037A0003091B20160237123822393231F910F91E3 +:1037B0000C949B1B0F931F930091AF011091B001CC +:1037C0002091B1013091B2016027712782279327A0 +:1037D0001F910F910C949B1B60E070E0CB010C9447 +:1037E000A71B0F931F9341E050E060E070E08A0157 +:1037F0009B0104C0000F111F221F331F8A95D2F7AF +:10380000C901B8011F910F910C94A71B0F931F932F +:1038100041E050E060E070E004C0440F551F661FB7 +:10382000771F8A95D2F78091AB019091AC01A0915E +:10383000AD01B091AE018A019B01082B192B2A2BF7 +:103840003B2BC901B8011F910F910C94A71B0F933B +:103850001F9341E050E060E070E004C0440F551F4A +:10386000661F771F8A95D2F74095509560957095A1 +:103870008091AB019091AC01A091AD01B091AE01EE +:103880008A019B01082319232A233B23C901B8017C +:103890001F910F910C94A71B0F931F9341E050E0D1 +:1038A00060E070E004C0440F551F661F771F8A95C3 +:1038B000D2F78091AB019091AC01A091AD01B09194 +:1038C000AE018A019B01082719272A273B27C90136 +:1038D000B8011F910F910C94A71B0F931F93009198 +:1038E000AB011091AC012091AD013091AE01602B84 +:1038F000712B822B932B1F910F910C94A71B0F936D +:103900001F930091AB011091AC012091AD0130915A +:10391000AE0160237123822393231F910F910C9496 +:10392000A71B0F931F930091AB011091AC01209145 +:10393000AD013091AE0160277127822793271F9137 +:103940000F910C94A71B0895CF92DF92EF92FF92F4 +:103950000F931F93CF93DF938C01C090AF01D09052 +:10396000B001E090B101F090B2014091AB015091F3 +:10397000AC016091AD017091AE01C42AD52AE62A4E +:10398000F72ACFE1D0E0D701C6010C2E04C0B695CE +:10399000A795979587950A94D2F780FF07C0B8013D +:1039A0008C2F0E94BC1E8130910531F4219758F76D +:1039B000B80180E00E94BC1EDF91CF911F910F9152 +:1039C000FF90EF90DF90CF90089520910D013091FE +:1039D0000E01F90132969FEF40E05191581789F09E +:1039E0009F3F19F4511101C0942F4F5F4630A9F742 +:1039F0009F3F39F0F901E90FF11D97FDFA95828398 +:103A00000895089520910D0130910E01F90132962B +:103A1000285F3F4F9081981301C010823196E217C2 +:103A2000F307C1F7089581E090E0E0910D01F09176 +:103A30000E01E80FF91F1082019688309105A9F751 +:103A400008958091BD0108959091BD01892B8093C7 +:103A5000BD01089580959091BD0189238093BD019A +:103A600008958093BD0108951092BD01089590912D +:103A7000BC01892B8093BC01089580959091BC0175 +:103A800089238093BC0108951092BC01089580930E +:103A9000B30108951092B301089580910D019091A2 +:103AA0000E01FC0131969C01285F3F4F80E091910F +:103AB00091118F5FE217F307D1F70895E0910D019F +:103AC000F0910E018091BD018083E0910D01F09194 +:103AD0000E0190818091BC01892B80838091B3017C +:103AE000882361F0E0910D01F0910E019081892B06 +:103AF00080830E944D1D81111092B30180910D01B0 +:103B000090910E010C94A311909335018093340190 +:103B100008958295982F9C7C292F26952695982F7D +:103B20009373990F990F922B892F8A7A86959575A1 +:103B3000990F892B08950895CF93DF9300D000D07B +:103B40001F92CDB7DEB70F900F900F900F900F9090 +:103B5000DF91CF910895089508950C94EB12809110 +:103B6000D301843021F11092BF0120E488E190E07C +:103B70000FB6F894A895809360000FBE2093600064 +:103B800083B7817F846083BF83B7816083BF78946C +:103B9000889583B78E7F83BF0FB6F894A8958091E0 +:103BA0006000886180936000109260000FBE0895ED +:103BB00008950895CF930E94D81D0E94F2070E9495 +:103BC000D91DC0E08C2F0E94F008811104C0CF5F86 +:103BD000C031C1F701C081E0CF9108950C94AD17B9 +:103BE0001F920F920FB60F9211248F939F93AF9352 +:103BF000BF938091BF01811113C08091C00190914A +:103C0000C101A091C201B091C3014196A11DB11D96 +:103C10008093C0019093C101A093C201B093C301EE +:103C2000BF91AF919F918F910F900FBE0F901F90FA +:103C3000189582E084BD93E095BD9AEF97BD80937F +:103C40006E0008952FB7F8948091C0019091C10142 +:103C5000A091C201B091C3012FBF08952FB7F8946E +:103C60006091C0017091C1018091C2019091C30126 +:103C70002FBF0895CF92DF92EF92FF920F931F9381 +:103C80002FB7F8944091C0015091C1016091C201D9 +:103C90007091C3012FBF6A017B01EE24FF248C01C8 +:103CA00020E030E0C016D106E206F30610F44150E1 +:103CB00051099A01281B390BC9011F910F91FF90DF +:103CC000EF90DF90CF9008951F920F920FB60F9252 +:103CD00011248F939F93AF93BF938091C0019091D4 +:103CE000C101A091C201B091C3010196A11DB11DF6 +:103CF0008093C0019093C101A093C201B093C3010E +:103D0000BF91AF919F918F910F900FBE0F901F9019 +:103D100018950E94EB0EF8942FEF87EA91E6215058 +:103D200080409040E1F700C0000087E090EBDC01AC +:103D30008093DC019093DD01A093DE01B093DF015D +:103D40009CE088E10FB6F894A895809360000FBEC0 +:103D500090936000FFCFE92FF0E093E0EE0FFF1F9C +:103D60009A95E1F7E80FF11DE855FF4F9491892FDF +:103D70008F7092959F700895CF93C82FCB010E94AA +:103D8000AB1E492F90E0242F30E054E0220F331F68 +:103D90005A95E1F7282B392B2038310519F480E0AA +:103DA00090E017C0EC2FF0E023E0EE0FFF1F2A9504 +:103DB000E1F74770E40FF11D34E0EE0FFF1F3A9575 +:103DC000E1F7E80FF91FEE0FFF1FE050F84985916A +:103DD0009491CF91089580E090E0089508958091A6 +:103DE000C60180FF0CC08091120190E065E070E098 +:103DF0000E94A72695958795959587952EC081FF5A +:103E00000AC08091120190E065E070E00E94A72650 +:103E10009595879522C082FF08C08091120190E09D +:103E200065E070E00E94A72618C02091C7012223F8 +:103E3000D1F030911101231780F78091120190E0A9 +:103E400065E070E00E94A726622F70E00E94A7261E +:103E5000632F70E00E94C426CB018038910530F4B6 +:103E6000009731F0089585E090E008958FE7089578 +:103E700081E008958091C60180FF08C06091100123 +:103E800070E0759567957595679523C081FF06C0AD +:103E90006091100170E0759567951BC082FF04C0AA +:103EA0006091100170E012C06091C7016623D1F0EB +:103EB00020910F016217A0F78091100170E090E04F +:103EC0000E94A726622F70E00E94C4266038710508 +:103ED00028F46115710521F0862F08958FE7089564 +:103EE00081E0089561E070E0F4CF803F21F40E940A +:103EF000EF1E819504C0813F29F40E94EF1E80933C +:103F0000CA010895823F21F40E94EF1E819504C0EA +:103F1000833F29F40E94EF1E8093C9010895893FD1 +:103F200019F40E943A1F05C08A3F31F40E943A1FDB +:103F300081958093CB0108958B3F21F40E943A1F15 +:103F4000819504C08C3F29F40E943A1F8093CC01D4 +:103F50000895843F21F48091C801816017C0853F96 +:103F600021F48091C801826011C0863F21F48091C4 +:103F7000C80184600BC0873F21F48091C80188602C +:103F800005C0883F31F48091C80180618093C801E9 +:103F900008958D3F21F48091C60181600BC08E3F52 +:103FA00021F48091C601826005C08F3F29F4809181 +:103FB000C60184608093C6010895803F39F48091E2 +:103FC000CA0187FF6CC01092CA0169C0813F29F401 +:103FD0008091CA011816BCF362C09091C901823F5A +:103FE00029F497FF5CC01092C90159C0833F19F4AE +:103FF0001916CCF354C0893F41F48091CB011816B7 +:104000000CF04DC01092CB014AC08A3F29F4809138 +:10401000CB0187FF44C0F6CF8B3F39F48091CC01B0 +:1040200087FF3DC01092CC013AC08C3F29F48091AB +:10403000CC011816BCF333C0843F21F48091C80131 +:104040008E7F17C0853F21F48091C8018D7F11C0FC +:10405000863F21F48091C8018B7F0BC0873F21F4FC +:104060008091C801877F05C0883F31F48091C801E5 +:104070008F7E8093C80113C08D3F21F48091C601CB +:104080008E7F0BC08E3F21F48091C6018D7F05C0CD +:104090008F3F29F48091C6018B7F8093C601809168 +:1040A000C90181110EC08091CA0181110AC080919D +:1040B000CB01811106C08091CC01811102C0109208 +:1040C000C70108958091BE0183FF7EC08BE894E014 +:1040D0000E948D058091C8011F928F9386E894E01D +:1040E0009F938F930E94260684E894E00E948D059A +:1040F0008091C901282F082E000C330B3F938F931A +:1041000081E894E09F938F930E9426068FE794E0C6 +:104110000E948D058091CA01282F082E000C330BB8 +:104120003F938F938CE794E09F938F930E94260692 +:104130008AE794E00E948D058091CB01282F082EFC +:10414000000C330B3F938F9387E794E09F938F93FB +:104150000E94260685E794E00E948D058091CC019F +:10416000282F082E000C330B3F938F9382E794E0A7 +:104170009F938F930E9426068FE694E00E948D0500 +:104180008091C7011F928F938CE694E09F938F9349 +:104190000E9426068AE694E00E948D058091C60161 +:1041A0001F928F9387E694E09F938F930E94260639 +:1041B00084E694E00E948D058DB79EB74C960FB6AD +:1041C000F8949EBF0FBE8DBF88EC91E00E94EC1169 +:1041D0000E94221E9093C5018093C40108951F93ED +:1041E000CF93DF938091C4019091C5010E943A1E44 +:1041F000FC012091C701222329F090911301892FFE +:1042000090E007C08091140190E06AE070E00E94A5 +:10421000A726E817F90708F485C08091C901C09165 +:10422000CA01D091CB011091CC01811107C0C111FD +:1042300075C0D11173C0111171C074C02F3F19F036 +:104240002F5F2093C701181624F40E94EF1E80935D +:10425000C9018091C90187FF05C00E94EF1E8195A9 +:104260008093C9011C1624F40E94EF1E8093CA019A +:104270008091CA0187FF05C00E94EF1E819580933F +:10428000CA016091C901662331F1C091CA01CC23F2 +:1042900011F1062E000C770B880B990B0E94A625B6 +:1042A00023E333E343E35FE30E940A260E946E2583 +:1042B0006093C9016C2FCC0F770B880B990B0E9470 +:1042C000A62523E333E343E35FE30E940A260E942B +:1042D0006E256093CA011D1624F40E943A1F809334 +:1042E000CB018091CB0187FF05C00E943A1F8195C9 +:1042F0008093CB01111624F40E943A1F8093CC01C5 +:104300008091CC0187FF05C00E943A1F8195809360 +:10431000CC01DF91CF911F910C9462202F3F09F0C7 +:104320008FCF97CFDF91CF911F910895E8ECF1E007 +:1043300085E0DF011D928A95E9F71092C70110927E +:10434000C60108958EEA96E00E948D051F9281E0D5 +:104350008F931F9285E08F9380E696E09F938F93D3 +:104360000E9426060F900F900F900F900F900F90C5 +:1043700008958330E9F128F4813061F0823009F149 +:104380000895853009F462C008F449C0863009F404 +:1043900074C0089580911401262F30E0280F311D3C +:1043A0002F3F310524F4680F6093140103C08FEF91 +:1043B00080931401809114011F928F9389E995E0F5 +:1043C00072C080911301262F30E0280F311D2F3F3E +:1043D000310524F4680F6093130103C08FEF8093BD +:1043E0001301809113011F928F9387E895E05BC0C2 +:1043F00080911201262F30E0280F311D2F3F31050B +:1044000024F4680F6093120103C08FEF80931201B0 +:10441000809112011F928F9384E795E044C08091B0 +:104420001101262F30E0280F311D2F3F310524F4D4 +:10443000680F6093110103C08FEF80931101809189 +:1044400011011F928F938FE595E02DC0809110018F +:10445000262F30E0280F311D2F3F310524F4680F3F +:104460006093100103C08FEF8093100180911001C1 +:104470001F928F9386E495E016C080910F01262F3E +:1044800030E0280F311D2F3F310524F4680F609371 +:104490000F0103C08FEF80930F0180910F011F92D6 +:1044A0008F938BE295E09F938F930E9426060F9047 +:1044B0000F900F900F900895833081F128F4813090 +:1044C00059F08230D1F00895853009F449C0B8F12F +:1044D000863009F456C0089580911401681720F4BD +:1044E000861B8093140102C0109214018091140164 +:1044F0001F928F938CE195E054C08091130168174F +:1045000020F4861B8093130102C010921301809146 +:1045100013011F928F938AE095E043C080911201AE +:10452000681720F4861B8093120102C010921201BA +:10453000809112011F928F9387EF94E032C0809197 +:104540001101681720F4861B8093110102C010929C +:104550001101809111011F928F9382EE94E021C08E +:1045600080911001681720F4861B8093100102C00F +:1045700010921001809110011F928F9389EC94E0AA +:1045800010C080910F01681720F4861B80930F01E3 +:1045900002C010920F0180910F011F928F938EEA3B +:1045A00094E09F938F930E9426060F900F900F9098 +:1045B0000F900895CF93C82F1F928F9383EB97E0AE +:1045C0009F938F930E94260681E090E0A0E0B0E0E8 +:1045D000BC01CD0104C0660F771F881F991FCA95C3 +:1045E000D2F70E94B41B0F900F900F900F90CF91B5 +:1045F0000C94AD17CF93873288F58E3108F00BC13C +:104600008E3009F487C0D8F4873009F460C08B304D +:1046100009F44FC0863009F002C18091BE01817F4C +:104620008E7F8093BE0188EB97E00E948D058CE61B +:104630009AE00E948D0581E08093CE0146C08631CC +:1046400009F4B0C020F4803109F47AC0E8C089319F +:1046500009F491C08B3109F449C0E1C0883349F1B4 +:1046600050F4893209F4D5C0853309F4D2C08732B9 +:1046700009F0D5C0CEC0833409F4CBC028F48A3306 +:1046800008F4CDC08953C8C0883409F0C8C00E945E +:10469000AD178BE59AE00E948D052FEF83ED90E337 +:1046A000215080409040E1F700C000000E94891E28 +:1046B0000CC08FED97E041C082E49AE00E948D0526 +:1046C0008091BE0181608093BE01C1E0ADC0809148 +:1046D000BE01C82FC17080FFEFCF8EE49AE00E9428 +:1046E0008D058091BE01817F8E7F3FC09091BE017C +:1046F00091FBCC27C0F981E0C827892FC0FB81F945 +:104700008093BE01CC2319F085E39AE029C087E2AB +:104710009AE013C09091BE0192FBCC27C0F981E0D2 +:10472000C827892FC0FB82F98093BE01CC2319F0E2 +:1047300088E19AE015C088E09AE00E948D05C5CF17 +:104740009091BE0193FBCC27C0F981E0C827892F47 +:10475000C0FB83F98093BE01CC2351F08CEF99E02C +:104760000E948D058091BE0181608093BE015CC076 +:104770008FEE99E0E2CF80EE99E00E948D058DEBFF +:1047800099E00E948D0588E799E00E948D0581E5FA +:1047900099E00E948D058CE099E00E948D058DEDD9 +:1047A00098E0CBCF8FEC98E00E948D050E94971186 +:1047B0001F928F9385EB98E09F938F930E9426061C +:1047C00080910C011F928F938EE998E09F938F93B5 +:1047D0000E94260680915B011F928F938BE898E0E0 +:1047E0009F938F930E9426060E942E1E9F938F9365 +:1047F0007F936F9384E798E09F938F930E942606A0 +:104800008DB79EB742960FB6F8949EBF0FBE8DBF70 +:104810005CCF80E001C08D510E94DA2256CF82E742 +:1048200098E00E948D05C0E08C2FCF91089580E024 +:10483000089580E00895CF93C82F8091CE018130F4 +:1048400069F020F0823009F449C040C167E08FE090 +:104850000E94DB08882309F43FC106C067E08FE0AF +:104860000E94DB08882361F08C2F0E94172481119D +:1048700004C08C2F0E94FA222FC081E090E02CC04F +:104880008C2F0E941924811126C0C431E1F070F4EC +:10489000CB3081F0C031D1F40E94A2218BEA97E0A5 +:1048A0000E948D0582E08093CE0115C0C93259F077 +:1048B000C83361F488EB97E00E948D058FEA97E09A +:1048C0000E948D0508C01092CE0104C189EA97E0CC +:1048D0000E948D05FFC081E08170FEC0C43228F5C2 +:1048E000CE3108F0C1C0CB30A1F1D0F4C73009F00F +:1048F000D3C08EE18093140182E3809313018AE098 +:104900008093120184E18093110188E0809310016B +:1049100088E280930F018FE496E00E948D05BFC06E +:10492000C33149F1C431C1F0B7C0CB3409F4A9C0D7 +:1049300028F4C93289F0C83361F0AEC0C13509F43A +:104940009EC0C23509F499C0CE3409F0A5C06AE012 +:104950009EC00E94A221A3C08091CD01882319F09E +:104960001092CD019CC08CE596E00E948D0581E0FF +:104970008093CE01B1C086E396E00E948D0584E26B +:1049800096E00E948D05809114011F928F9381E221 +:1049900096E09F938F930E9426068FE196E00E94F7 +:1049A0008D058DE096E00E948D05809113011F9288 +:1049B0008F938AE096E09F938F930E94260688E06B +:1049C00096E00E948D0589EF95E00E948D0580910B +:1049D00012011F928F9386EF95E09F938F930E9411 +:1049E000260684EF95E00E948D0583EE95E00E94F7 +:1049F0008D05809111011F928F9380EE95E09F931A +:104A00008F930E9426068EED95E00E948D0589EC1D +:104A100095E00E948D05809110011F928F9386EC86 +:104A200095E09F938F930E94260684EC95E00E9468 +:104A30008D058DEA95E00E948D0580910F011F92F2 +:104A40008F938AEA95E09F938F930E94260688EAC7 +:104A500095E00E948D058DB79EB748960FB6F894E5 +:104A60009EBF0FBE8DBF1BC0CE51EC2FF0E0E75DA7 +:104A7000FE4F80818093CD0112C061E003C061E0F0 +:104A800006C06AE08091CD010E94B92108C08091E2 +:104A9000CD010E945C2203C08DE496E013C080919A +:104AA000CD01882369F01F928F9387E496E09F934E +:104AB0008F930E9426060F900F900F900F9004C0C6 +:104AC00084E496E00E948D0581E006C01092CE013C +:104AD00080E002C080E000CFCF9108950E9475254C +:104AE0006894B1110C94042608950E94E92588F079 +:104AF0009F5798F0B92F9927B751B0F0E1F0660FA2 +:104B0000771F881F991F1AF0BA95C9F714C0B130E2 +:104B100091F00E940326B1E008950C940326672FBC +:104B2000782F8827B85F39F0B93FCCF38695779511 +:104B30006795B395D9F73EF49095809570956195FA +:104B40007F4F8F4F9F4F0895E89409C097FB3EF425 +:104B500090958095709561957F4F8F4F9F4F9923CA +:104B6000A9F0F92F96E9BB279395F6958795779548 +:104B70006795B795F111F8CFFAF4BB0F11F460FF08 +:104B80001BC06F5F7F4F8F4F9F4F16C0882311F060 +:104B900096E911C0772321F09EE8872F762F05C074 +:104BA000662371F096E8862F70E060E02AF09A950F +:104BB000660F771F881FDAF7880F9695879597F904 +:104BC000089557FD9058440F551F59F05F3F71F0FD +:104BD0004795880F97FB991F61F09F3F79F0879564 +:104BE0000895121613061406551FF2CF4695F1DFED +:104BF00008C0161617061806991FF1CF869571057D +:104C0000610508940895E894BB2766277727CB01B0 +:104C100097F908950E941C260C9496260E948826D7 +:104C200038F00E948F2620F0952311F00C947F26F7 +:104C30000C9485260C9404260E94E12578F3992390 +:104C4000C9F35523B9F3950F50E0551FAA27EE2756 +:104C5000FF27BB2700240894679520F4E20FF31F79 +:104C6000B41F0A1E220F331F441FAA1F6695A9F7FF +:104C7000779530F4F30FB41F0A1E121E08F46395E3 +:104C8000330F441FAA1F221F769599F7879520F4AA +:104C9000B40F0A1E121E631F440FAA1F221F331FC8 +:104CA0008695A9F7862F712D602D11249F575040AE +:104CB0009AF0F1F088234AF0EE0FFF1FBB1F661F2A +:104CC000771F881F91505040A9F79E3F510580F0F3 +:104CD0000C947F260C9404265F3FE4F3983ED4F3B3 +:104CE000869577956795B795F795E7959F5FC1F797 +:104CF000FE2B880F911D9695879597F9089597F942 +:104D00009F6780E870E060E008959FEF80EC089571 +:104D100000240A941616170618060906089500249A +:104D20000A9412161306140605060895092E039414 +:104D3000000C11F4882352F0BB0F40F4BF2B11F488 +:104D400060FF04C06F5F7F4F8F4F9F4F0895002417 +:104D5000552704C0080E591F880F991F009729F086 +:104D600076956795B8F37105B9F7802D952F08955D +:104D7000991B79E004C0991F961708F0961B881FAD +:104D80007A95C9F78095089597FB072E16F400943D +:104D900007D077FD09D00E94DE2607FC05D03EF43F +:104DA000909581959F4F0895709561957F4F0895D7 +:104DB000EE0FFF1F0590F491E02D0994AA1BBB1B79 +:104DC00051E107C0AA1FBB1FA617B70710F0A61B0B +:104DD000B70B881F991F5A95A9F780959095BC012C +:084DE000CD010895F894FFCF06 +:104DE800FFFF5C0A4D0B2A0BF60AC20A01B4012820 +:104DF80008140A321E404D3622FF03B2037C035AC0 +:104E080003E602FF02180331030102030405060743 +:044E18000809000085 :106800000000EA44E944E2440400050006000700F1 :10681000080009000A000B000C000D000E000F001C :1068200010001100120013001400150016001700CC diff --git a/converter/adb_usb/matrix.c b/converter/adb_usb/matrix.c index 8f6a0dc9..febd1c63 100644 --- a/converter/adb_usb/matrix.c +++ b/converter/adb_usb/matrix.c @@ -29,6 +29,7 @@ along with this program. If not, see . #include "matrix.h" #include "report.h" #include "host.h" +#include "led.h" @@ -101,6 +102,8 @@ void matrix_init(void) // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + led_set(host_keyboard_leds()); + debug_enable = true; //debug_matrix = true; //debug_keyboard = true; From 8727b9645f5c2eb35482001de2bdfb0799630f5a Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 18 Dec 2016 08:05:03 +0900 Subject: [PATCH 04/10] adb_usb: Fix keymap macro --- converter/adb_usb/keymap_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/converter/adb_usb/keymap_common.h b/converter/adb_usb/keymap_common.h index 49581d79..4a1931b7 100644 --- a/converter/adb_usb/keymap_common.h +++ b/converter/adb_usb/keymap_common.h @@ -225,7 +225,7 @@ along with this program. If not, see . K36,K3A,K37, K31, K3B,K3C,K3D, K52, K41,K4C \ ) { \ { 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_##K0E, KC_##K0F }, \ + { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ { 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_##K1E, KC_##K1F }, \ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ From cccd4186f43ee89a8841373fa1557daf48ae7181 Mon Sep 17 00:00:00 2001 From: Louis Rousseau Date: Mon, 19 Dec 2016 01:51:11 -0500 Subject: [PATCH 05/10] adb_usb/matrix.c : changed size of handler_id from uint16_t to uint8_t --- converter/adb_usb/matrix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/converter/adb_usb/matrix.c b/converter/adb_usb/matrix.c index febd1c63..83f46041 100644 --- a/converter/adb_usb/matrix.c +++ b/converter/adb_usb/matrix.c @@ -65,7 +65,7 @@ void matrix_init(void) // Determine ISO keyboard by handler id // http://lxr.free-electrons.com/source/drivers/macintosh/adbhid.c?v=4.4#L815 - uint16_t handler_id = adb_host_talk(ADB_ADDR_KEYBOARD, ADB_REG_3); + uint8_t handler_id = (uint8_t) adb_host_talk(ADB_ADDR_KEYBOARD, ADB_REG_3); switch (handler_id) { case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D: case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1: From d5689296abf15f2a5210f1dbf2c13f6dc1d9926d Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 2 Dec 2016 10:11:46 +0900 Subject: [PATCH 06/10] core: Fix for ChibiOS update #411 --- tmk_core/protocol/chibios/usb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index fbf0ceba..e8f103a2 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -1033,7 +1033,7 @@ void init_usb_driver(USBDriver *usbp) { chVTObjectInit(&keyboard_idle_timer); #ifdef CONSOLE_ENABLE - obqObjectInit(&console_buf_queue, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); + obqObjectInit(&console_buf_queue, true, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); chVTObjectInit(&console_flush_timer); #endif } From 503666215197fa2fae1acbf983e5b09ceeaf5e27 Mon Sep 17 00:00:00 2001 From: Aristeu Rozanski Date: Tue, 20 Dec 2016 14:44:44 -0500 Subject: [PATCH 07/10] sun_usb: support US ESC key Model 5 can also have ESC button between HELP and F1. --- converter/sun_usb/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/converter/sun_usb/keymap.c b/converter/sun_usb/keymap.c index f94fe5c7..f9cd4de5 100644 --- a/converter/sun_usb/keymap.c +++ b/converter/sun_usb/keymap.c @@ -26,7 +26,7 @@ along with this program. If not, see . /* Sun type 5 keyboard ,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. -| 76 | | | | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| +| 76 | | 0F| | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| `-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' ,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. | 01| 03| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2C| 34| 60| | 62| 2E| 2F| 47| @@ -41,7 +41,7 @@ along with this program. If not, see . `-------' `-----------------------------------------------------------' `-----------' `---------------' */ #define KEYMAP( \ - K76, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K76, K0F, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ @@ -49,7 +49,7 @@ along with this program. If not, see . K5F,K61, K77,K13, K78, K73, K79, K74, K75, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ ) { \ { KC_NO, 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_##K0E, KC_NO, }, \ + { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F,}, \ { 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_##K1E, KC_##K1F }, \ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ @@ -76,7 +76,7 @@ along with this program. If not, see . K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K0D,K14,K6E, \ K77,K13, K78, K79, K7A,K43,K62,K18,K1B,K1C \ ) KEYMAP( \ - HELP, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,K30, \ + HELP, NO, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,K30, \ K01, AGAIN, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C, K34, K60, K62, PSLS,PAST,PMNS, \ MENU, UNDO, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42, K4A, K7B, P7, P8, P9, PPLS, \ SELECT, K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \ From 1713aaa6ff0c6c05602cd9261f911a61b883785e Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 21 Dec 2016 11:06:47 +0900 Subject: [PATCH 08/10] sun_usb: Fix keymap code --- converter/sun_usb/keymap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/converter/sun_usb/keymap.c b/converter/sun_usb/keymap.c index f9cd4de5..a106d1a3 100644 --- a/converter/sun_usb/keymap.c +++ b/converter/sun_usb/keymap.c @@ -41,7 +41,7 @@ along with this program. If not, see . `-------' `-----------------------------------------------------------' `-----------' `---------------' */ #define KEYMAP( \ - K76, K0F, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K76, K0F, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ @@ -76,12 +76,12 @@ along with this program. If not, see . K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K0D,K14,K6E, \ K77,K13, K78, K79, K7A,K43,K62,K18,K1B,K1C \ ) KEYMAP( \ - HELP, NO, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,K30, \ + HELP, NO, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,K30, \ K01, AGAIN, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C, K34, K60, K62, PSLS,PAST,PMNS, \ - MENU, UNDO, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42, K4A, K7B, P7, P8, P9, PPLS, \ - SELECT, K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \ - EXECUTE,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, P1, P2, P3, PENT, \ - FIND, K61, K77,K13, K78, HENK, K79, MHEN, KANA, K7A,K43,K0D, K18, K1B, K1C, P0, PDOT \ + MENU, UNDO, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42, K4A, K7B, P7, P8, P9, PPLS, \ + SELECT, K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \ + EXECUTE,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, P1, P2, P3, PENT, \ + FIND, K61, K77,K13, K78, HENK, K79, MHEN, KANA, K7A,K43,K0D, K18, K1B, K1C, P0, PDOT \ ) From f4a20304e46d71e67c730bd57f7de201934adb35 Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 21 Dec 2016 13:53:20 +0900 Subject: [PATCH 09/10] hhkb: Pin setting for power saving --- keyboard/hhkb/hhkb_avr.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/keyboard/hhkb/hhkb_avr.h b/keyboard/hhkb/hhkb_avr.h index 7ea6322c..5cb1d0d7 100644 --- a/keyboard/hhkb/hhkb_avr.h +++ b/keyboard/hhkb/hhkb_avr.h @@ -71,6 +71,10 @@ static inline void KEY_INIT(void) /* row extention for HHKB JP */ DDRC |= (1<<6|1<<7); PORTC |= (1<<6|1<<7); +#else + /* input with pull up to save power */ + DDRC &= ~(1<<6|1<<7); + PORTC |= (1<<6|1<<7); #endif KEY_UNABLE(); KEY_PREV_OFF(); From 2e464737aa9f83fb08dbd7a252b75d028475aa04 Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 26 Dec 2016 12:15:39 +0900 Subject: [PATCH 10/10] hhkb: Move functions which communicate with RN42 --- keyboard/hhkb/rn42/rn42.c | 28 ++++++++++++++++++++++++++ keyboard/hhkb/rn42/rn42.h | 7 +++++++ keyboard/hhkb/rn42/rn42_task.c | 36 +--------------------------------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/keyboard/hhkb/rn42/rn42.c b/keyboard/hhkb/rn42/rn42.c index 710169ef..88951be4 100644 --- a/keyboard/hhkb/rn42/rn42.c +++ b/keyboard/hhkb/rn42/rn42.c @@ -134,6 +134,34 @@ static uint8_t leds = 0; static uint8_t keyboard_leds(void) { return leds; } void rn42_set_leds(uint8_t l) { leds = l; } + +void rn42_send_str(const char *str) +{ + uint8_t c; + while ((c = pgm_read_byte(str++))) + rn42_putc(c); +} + +const char *rn42_send_command(const char *cmd) +{ + static const char *s; + rn42_send_str(cmd); + wait_ms(500); + s = rn42_gets(100); + xprintf("%s\r\n", s); + rn42_print_response(); + return s; +} + +void rn42_print_response(void) +{ + int16_t c; + while ((c = rn42_getc()) != -1) { + xprintf("%c", c); + } +} + + static void send_keyboard(report_keyboard_t *report) { // wake from deep sleep diff --git a/keyboard/hhkb/rn42/rn42.h b/keyboard/hhkb/rn42/rn42.h index db6916fe..dee214cc 100644 --- a/keyboard/hhkb/rn42/rn42.h +++ b/keyboard/hhkb/rn42/rn42.h @@ -2,6 +2,7 @@ #define RN42_H #include +#include "host_driver.h" host_driver_t rn42_driver; host_driver_t rn42_config_driver; @@ -20,4 +21,10 @@ void rn42_cts_lo(void); bool rn42_linked(void); void rn42_set_leds(uint8_t l); +const char *rn42_send_command(const char *cmd); +void rn42_send_str(const char *str); +void rn42_print_response(void); +#define SEND_STR(str) rn42_send_str(PSTR(str)) +#define SEND_COMMAND(cmd) rn42_send_command(PSTR(cmd)) + #endif diff --git a/keyboard/hhkb/rn42/rn42_task.c b/keyboard/hhkb/rn42/rn42_task.c index 5107fef4..cef6a547 100644 --- a/keyboard/hhkb/rn42/rn42_task.c +++ b/keyboard/hhkb/rn42/rn42_task.c @@ -125,40 +125,6 @@ void rn42_task(void) ******************************************************************************/ static host_driver_t *prev_driver = &rn42_driver; -static void print_rn42(void) -{ - int16_t c; - while ((c = rn42_getc()) != -1) { - xprintf("%c", c); - } -} - -static void clear_rn42(void) -{ - while (rn42_getc() != -1) ; -} - -#define SEND_STR(str) send_str(PSTR(str)) -#define SEND_COMMAND(cmd) send_command(PSTR(cmd)) - -static void send_str(const char *str) -{ - uint8_t c; - while ((c = pgm_read_byte(str++))) - rn42_putc(c); -} - -static const char *send_command(const char *cmd) -{ - static const char *s; - send_str(cmd); - wait_ms(500); - s = rn42_gets(100); - xprintf("%s\r\n", s); - print_rn42(); - return s; -} - static void enter_command_mode(void) { prev_driver = host_get_driver(); @@ -171,7 +137,7 @@ static void enter_command_mode(void) wait_ms(1100); // need 1 sec SEND_COMMAND("$$$"); wait_ms(600); // need 1 sec - print_rn42(); + rn42_print_response(); const char *s = SEND_COMMAND("v\r\n"); if (strncmp("v", s, 1) != 0) SEND_COMMAND("+\r\n"); // local echo on }