Merge remote-tracking branch 'upstream/master' into develop

master
fauxpark 2020-12-18 02:15:28 +11:00
commit 7797070b37
15 changed files with 550 additions and 570 deletions

View File

@ -118,7 +118,7 @@
* *
* @return The bit index * @return The bit index
*/ */
# define WS2812_RED_BIT(led, bit) WS2812_BIT((led), 1, (bit)) # define WS2812_RED_BIT(led, bit) WS2812_BIT((led), 1, (bit))
/** /**
* @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given green bit * @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given green bit
@ -130,7 +130,7 @@
* *
* @return The bit index * @return The bit index
*/ */
# define WS2812_GREEN_BIT(led, bit) WS2812_BIT((led), 0, (bit)) # define WS2812_GREEN_BIT(led, bit) WS2812_BIT((led), 0, (bit))
/** /**
* @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given blue bit * @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given blue bit
@ -142,7 +142,7 @@
* *
* @return The bit index * @return The bit index
*/ */
# define WS2812_BLUE_BIT(led, bit) WS2812_BIT((led), 2, (bit)) # define WS2812_BLUE_BIT(led, bit) WS2812_BIT((led), 2, (bit))
#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB) #elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB)
/** /**
@ -155,7 +155,7 @@
* *
* @return The bit index * @return The bit index
*/ */
# define WS2812_RED_BIT(led, bit) WS2812_BIT((led), 0, (bit)) # define WS2812_RED_BIT(led, bit) WS2812_BIT((led), 0, (bit))
/** /**
* @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given green bit * @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given green bit
@ -167,7 +167,7 @@
* *
* @return The bit index * @return The bit index
*/ */
# define WS2812_GREEN_BIT(led, bit) WS2812_BIT((led), 1, (bit)) # define WS2812_GREEN_BIT(led, bit) WS2812_BIT((led), 1, (bit))
/** /**
* @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given blue bit * @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given blue bit
@ -179,7 +179,7 @@
* *
* @return The bit index * @return The bit index
*/ */
# define WS2812_BLUE_BIT(led, bit) WS2812_BIT((led), 2, (bit)) # define WS2812_BLUE_BIT(led, bit) WS2812_BIT((led), 2, (bit))
#endif #endif
/* --- PRIVATE VARIABLES ---------------------------------------------------- */ /* --- PRIVATE VARIABLES ---------------------------------------------------- */

View File

@ -69,7 +69,7 @@ static void set_led_color_rgb(LED_TYPE color, int pos) {
#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB) #elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB)
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.r, j); for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.r, j);
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j); for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j);
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.b, j); for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.b, j);
#endif #endif
} }

View File

@ -75,7 +75,7 @@ uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}};
#elif LED_DRIVER_COUNT == 4 #elif LED_DRIVER_COUNT == 4
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}}; uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}};
#endif #endif
bool g_led_control_registers_update_required[LED_DRIVER_COUNT] = {false}; bool g_led_control_registers_update_required[LED_DRIVER_COUNT] = {false};
// This is the bit pattern in the LED control registers // This is the bit pattern in the LED control registers
// (for matrix A, add one to register for matrix B) // (for matrix A, add one to register for matrix B)

View File

@ -1,3 +1,3 @@
# Default mt4rgb Layout # Default mt4rgb Layout
This is the default layout that comes flashed on every mt64rgb. All key pins are shown in the file. This is the default layout that comes flashed on every mt64rgb. All key pins are shown in the file.

View File

@ -1,16 +1,16 @@
# mt64rgb # mt64rgb
![mt64rgb](https://i.imgur.com/kxGGUg9.jpg?1) ![mt64rgb](https://i.imgur.com/kxGGUg9.jpg?1)
A 60% keyboard PCB made by MT. A 60% keyboard PCB made by MT.
It supports an ANSI-based 64-key layout, with hotswap sockets and per-key RGB backlight. It supports an ANSI-based 64-key layout, with hotswap sockets and per-key RGB backlight.
* Keyboard Maintainer: [MT](https://github.com/704340378) * Keyboard Maintainer: [MT](https://github.com/704340378)
* Hardware Supported: mt64rgb (atmega32u4) * Hardware Supported: mt64rgb (atmega32u4)
* Hardware Availability: [麦田外设](https://shop110310565.taobao.com) * Hardware Availability: [麦田外设](https://shop110310565.taobao.com)
Make example for this keyboard (after setting up your build environment): Make example for this keyboard (after setting up your build environment):
make mt64rgb:default make mt64rgb:default
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

View File

@ -1,4 +1,4 @@
# The Default Zinc Layout # The Default Zinc Layout
## layout ## layout
### Qwerty ### Qwerty

View File

@ -38,12 +38,12 @@ static bool counters_need_update;
#define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1)
static uint8_t wrapping_timer_read(void) { static uint8_t wrapping_timer_read(void) {
static uint16_t time = 0; static uint16_t time = 0;
static uint8_t last_result = 0; static uint8_t last_result = 0;
uint16_t new_time = timer_read(); uint16_t new_time = timer_read();
uint16_t diff = new_time - time; uint16_t diff = new_time - time;
time = new_time; time = new_time;
last_result = (last_result + diff) % (MAX_DEBOUNCE + 1); last_result = (last_result + diff) % (MAX_DEBOUNCE + 1);
return last_result; return last_result;
} }

View File

@ -40,9 +40,7 @@ static inline void setPinOutput_writeLow(pin_t pin) {
} }
static inline void setPinInputHigh_atomic(pin_t pin) { static inline void setPinInputHigh_atomic(pin_t pin) {
ATOMIC_BLOCK_FORCEON { ATOMIC_BLOCK_FORCEON { setPinInputHigh(pin); }
setPinInputHigh(pin);
}
} }
// matrix code // matrix code
@ -82,13 +80,9 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
#elif defined(DIODE_DIRECTION) #elif defined(DIODE_DIRECTION)
# if (DIODE_DIRECTION == COL2ROW) # if (DIODE_DIRECTION == COL2ROW)
static void select_row(uint8_t row) { static void select_row(uint8_t row) { setPinOutput_writeLow(row_pins[row]); }
setPinOutput_writeLow(row_pins[row]);
}
static void unselect_row(uint8_t row) { static void unselect_row(uint8_t row) { setPinInputHigh_atomic(row_pins[row]); }
setPinInputHigh_atomic(row_pins[row]);
}
static void unselect_rows(void) { static void unselect_rows(void) {
for (uint8_t x = 0; x < MATRIX_ROWS; x++) { for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
@ -133,13 +127,9 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
# elif (DIODE_DIRECTION == ROW2COL) # elif (DIODE_DIRECTION == ROW2COL)
static void select_col(uint8_t col) { static void select_col(uint8_t col) { setPinOutput_writeLow(col_pins[col]); }
setPinOutput_writeLow(col_pins[col]);
}
static void unselect_col(uint8_t col) { static void unselect_col(uint8_t col) { setPinInputHigh_atomic(col_pins[col]); }
setPinInputHigh_atomic(col_pins[col]);
}
static void unselect_cols(void) { static void unselect_cols(void) {
for (uint8_t x = 0; x < MATRIX_COLS; x++) { for (uint8_t x = 0; x < MATRIX_COLS; x++) {

View File

@ -53,9 +53,7 @@ static inline void setPinOutput_writeLow(pin_t pin) {
} }
static inline void setPinInputHigh_atomic(pin_t pin) { static inline void setPinInputHigh_atomic(pin_t pin) {
ATOMIC_BLOCK_FORCEON { ATOMIC_BLOCK_FORCEON { setPinInputHigh(pin); }
setPinInputHigh(pin);
}
} }
// matrix code // matrix code
@ -95,13 +93,9 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
#elif defined(DIODE_DIRECTION) #elif defined(DIODE_DIRECTION)
# if (DIODE_DIRECTION == COL2ROW) # if (DIODE_DIRECTION == COL2ROW)
static void select_row(uint8_t row) { static void select_row(uint8_t row) { setPinOutput_writeLow(row_pins[row]); }
setPinOutput_writeLow(row_pins[row]);
}
static void unselect_row(uint8_t row) { static void unselect_row(uint8_t row) { setPinInputHigh_atomic(row_pins[row]); }
setPinInputHigh_atomic(row_pins[row]);
}
static void unselect_rows(void) { static void unselect_rows(void) {
for (uint8_t x = 0; x < ROWS_PER_HAND; x++) { for (uint8_t x = 0; x < ROWS_PER_HAND; x++) {
@ -146,13 +140,9 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
# elif (DIODE_DIRECTION == ROW2COL) # elif (DIODE_DIRECTION == ROW2COL)
static void select_col(uint8_t col) { static void select_col(uint8_t col) { setPinOutput_writeLow(col_pins[col]); }
setPinOutput_writeLow(col_pins[col]);
}
static void unselect_col(uint8_t col) { static void unselect_col(uint8_t col) { setPinInputHigh_atomic(col_pins[col]); }
setPinInputHigh_atomic(col_pins[col]);
}
static void unselect_cols(void) { static void unselect_cols(void) {
for (uint8_t x = 0; x < MATRIX_COLS; x++) { for (uint8_t x = 0; x < MATRIX_COLS; x++) {

View File

@ -95,7 +95,7 @@ static uint8_t peek_matrix_intersection(pin_t out_pin, pin_t in_pin) {
uint8_t pin_state = readPin(in_pin); uint8_t pin_state = readPin(in_pin);
// Set out_pin to a setting that is less susceptible to noise. // Set out_pin to a setting that is less susceptible to noise.
setPinInputHigh(out_pin); setPinInputHigh(out_pin);
matrix_io_delay(); // Wait for the pull-up to go HIGH. matrix_io_delay(); // Wait for the pull-up to go HIGH.
return pin_state; return pin_state;
} }
#endif #endif
@ -106,11 +106,11 @@ __attribute__((weak)) bool is_keyboard_left(void) {
setPinInput(SPLIT_HAND_PIN); setPinInput(SPLIT_HAND_PIN);
return readPin(SPLIT_HAND_PIN); return readPin(SPLIT_HAND_PIN);
#elif defined(SPLIT_HAND_MATRIX_GRID) #elif defined(SPLIT_HAND_MATRIX_GRID)
# ifdef SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT # ifdef SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT
return peek_matrix_intersection(SPLIT_HAND_MATRIX_GRID); return peek_matrix_intersection(SPLIT_HAND_MATRIX_GRID);
# else # else
return !peek_matrix_intersection(SPLIT_HAND_MATRIX_GRID); return !peek_matrix_intersection(SPLIT_HAND_MATRIX_GRID);
# endif # endif
#elif defined(EE_HANDS) #elif defined(EE_HANDS)
return eeconfig_read_handedness(); return eeconfig_read_handedness();
#elif defined(MASTER_RIGHT) #elif defined(MASTER_RIGHT)

View File

@ -291,7 +291,7 @@ typedef struct {
extern uint8_t udi_hid_kbd_report_set; extern uint8_t udi_hid_kbd_report_set;
// report buffer (to host) // report buffer (to host)
# define UDI_HID_KBD_REPORT_SIZE 8 #define UDI_HID_KBD_REPORT_SIZE 8
extern uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE]; extern uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE];
COMPILER_PACK_RESET() COMPILER_PACK_RESET()
@ -784,7 +784,7 @@ COMPILER_PACK_RESET()
COMPILER_PACK_SET(1) COMPILER_PACK_SET(1)
typedef struct { typedef struct {
usb_conf_desc_t conf; usb_conf_desc_t conf;
udi_hid_kbd_desc_t hid_kbd; udi_hid_kbd_desc_t hid_kbd;
#ifdef MOUSE_ENABLE #ifdef MOUSE_ENABLE
udi_hid_mou_desc_t hid_mou; udi_hid_mou_desc_t hid_mou;

View File

@ -83,7 +83,7 @@ UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = {.bLength = sizeof(usb
#ifdef USB_DEVICE_PRODUCT_NAME #ifdef USB_DEVICE_PRODUCT_NAME
.iProduct = 2, .iProduct = 2,
#else #else
.iProduct = 0, // No product string .iProduct = 0, // No product string
#endif #endif
#if (defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER) #if (defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER)
.iSerialNumber = 3, .iSerialNumber = 3,
@ -120,7 +120,7 @@ UDC_DESC_STORAGE udc_desc_t udc_desc = {
.conf.iConfiguration = 0, .conf.iConfiguration = 0,
.conf.bmAttributes = /* USB_CONFIG_ATTR_MUST_SET | */ USB_DEVICE_ATTR, .conf.bmAttributes = /* USB_CONFIG_ATTR_MUST_SET | */ USB_DEVICE_ATTR,
.conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER),
.hid_kbd = UDI_HID_KBD_DESC, .hid_kbd = UDI_HID_KBD_DESC,
#ifdef RAW_ENABLE #ifdef RAW_ENABLE
.hid_raw = UDI_HID_RAW_DESC, .hid_raw = UDI_HID_RAW_DESC,
#endif #endif

View File

@ -194,107 +194,107 @@ typedef struct {
#if STM32_USB_USE_OTG1 #if STM32_USB_USE_OTG1
/* Reusable initialization structure - see USBEndpointConfig comment at top of file */ /* Reusable initialization structure - see USBEndpointConfig comment at top of file */
#define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \ # define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \
{ \ { \
.queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \ .queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \
.inout_ep_config = \ .inout_ep_config = \
{ \ { \
stream##_IN_MODE, /* Interrupt EP */ \ stream##_IN_MODE, /* Interrupt EP */ \
NULL, /* SETUP packet notification callback */ \ NULL, /* SETUP packet notification callback */ \
qmkusbDataTransmitted, /* IN notification callback */ \ qmkusbDataTransmitted, /* IN notification callback */ \
qmkusbDataReceived, /* OUT notification callback */ \ qmkusbDataReceived, /* OUT notification callback */ \
stream##_EPSIZE, /* IN maximum packet size */ \ stream##_EPSIZE, /* IN maximum packet size */ \
stream##_EPSIZE, /* OUT maximum packet size */ \ stream##_EPSIZE, /* OUT maximum packet size */ \
NULL, /* IN Endpoint state */ \ NULL, /* IN Endpoint state */ \
NULL, /* OUT endpoint state */ \ NULL, /* OUT endpoint state */ \
2, /* IN multiplier */ \ 2, /* IN multiplier */ \
NULL /* SETUP buffer (not a SETUP endpoint) */ \ NULL /* SETUP buffer (not a SETUP endpoint) */ \
}, \ }, \
.int_ep_config = \ .int_ep_config = \
{ \ { \
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \ USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \
NULL, /* SETUP packet notification callback */ \ NULL, /* SETUP packet notification callback */ \
qmkusbInterruptTransmitted, /* IN notification callback */ \ qmkusbInterruptTransmitted, /* IN notification callback */ \
NULL, /* OUT notification callback */ \ NULL, /* OUT notification callback */ \
CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \ CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \
0, /* OUT maximum packet size */ \ 0, /* OUT maximum packet size */ \
NULL, /* IN Endpoint state */ \ NULL, /* IN Endpoint state */ \
NULL, /* OUT endpoint state */ \ NULL, /* OUT endpoint state */ \
2, /* IN multiplier */ \ 2, /* IN multiplier */ \
NULL, /* SETUP buffer (not a SETUP endpoint) */ \ NULL, /* SETUP buffer (not a SETUP endpoint) */ \
}, \ }, \
.config = { \ .config = { \
.usbp = &USB_DRIVER, \ .usbp = &USB_DRIVER, \
.bulk_in = stream##_IN_EPNUM, \ .bulk_in = stream##_IN_EPNUM, \
.bulk_out = stream##_OUT_EPNUM, \ .bulk_out = stream##_OUT_EPNUM, \
.int_in = notification, \ .int_in = notification, \
.in_buffers = stream##_IN_CAPACITY, \ .in_buffers = stream##_IN_CAPACITY, \
.out_buffers = stream##_OUT_CAPACITY, \ .out_buffers = stream##_OUT_CAPACITY, \
.in_size = stream##_EPSIZE, \ .in_size = stream##_EPSIZE, \
.out_size = stream##_EPSIZE, \ .out_size = stream##_EPSIZE, \
.fixed_size = fixedsize, \ .fixed_size = fixedsize, \
.ib = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \ .ib = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \
.ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \ .ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \
} \ } \
} }
#else #else
/* Reusable initialization structure - see USBEndpointConfig comment at top of file */ /* Reusable initialization structure - see USBEndpointConfig comment at top of file */
#define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \ # define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \
{ \ { \
.queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \ .queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \
.in_ep_config = \ .in_ep_config = \
{ \ { \
stream##_IN_MODE, /* Interrupt EP */ \ stream##_IN_MODE, /* Interrupt EP */ \
NULL, /* SETUP packet notification callback */ \ NULL, /* SETUP packet notification callback */ \
qmkusbDataTransmitted, /* IN notification callback */ \ qmkusbDataTransmitted, /* IN notification callback */ \
NULL, /* OUT notification callback */ \ NULL, /* OUT notification callback */ \
stream##_EPSIZE, /* IN maximum packet size */ \ stream##_EPSIZE, /* IN maximum packet size */ \
0, /* OUT maximum packet size */ \ 0, /* OUT maximum packet size */ \
NULL, /* IN Endpoint state */ \ NULL, /* IN Endpoint state */ \
NULL, /* OUT endpoint state */ \ NULL, /* OUT endpoint state */ \
2, /* IN multiplier */ \ 2, /* IN multiplier */ \
NULL /* SETUP buffer (not a SETUP endpoint) */ \ NULL /* SETUP buffer (not a SETUP endpoint) */ \
}, \ }, \
.out_ep_config = \ .out_ep_config = \
{ \ { \
stream##_OUT_MODE, /* Interrupt EP */ \ stream##_OUT_MODE, /* Interrupt EP */ \
NULL, /* SETUP packet notification callback */ \ NULL, /* SETUP packet notification callback */ \
NULL, /* IN notification callback */ \ NULL, /* IN notification callback */ \
qmkusbDataReceived, /* OUT notification callback */ \ qmkusbDataReceived, /* OUT notification callback */ \
0, /* IN maximum packet size */ \ 0, /* IN maximum packet size */ \
stream##_EPSIZE, /* OUT maximum packet size */ \ stream##_EPSIZE, /* OUT maximum packet size */ \
NULL, /* IN Endpoint state */ \ NULL, /* IN Endpoint state */ \
NULL, /* OUT endpoint state */ \ NULL, /* OUT endpoint state */ \
2, /* IN multiplier */ \ 2, /* IN multiplier */ \
NULL, /* SETUP buffer (not a SETUP endpoint) */ \ NULL, /* SETUP buffer (not a SETUP endpoint) */ \
}, \ }, \
.int_ep_config = \ .int_ep_config = \
{ \ { \
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \ USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \
NULL, /* SETUP packet notification callback */ \ NULL, /* SETUP packet notification callback */ \
qmkusbInterruptTransmitted, /* IN notification callback */ \ qmkusbInterruptTransmitted, /* IN notification callback */ \
NULL, /* OUT notification callback */ \ NULL, /* OUT notification callback */ \
CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \ CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \
0, /* OUT maximum packet size */ \ 0, /* OUT maximum packet size */ \
NULL, /* IN Endpoint state */ \ NULL, /* IN Endpoint state */ \
NULL, /* OUT endpoint state */ \ NULL, /* OUT endpoint state */ \
2, /* IN multiplier */ \ 2, /* IN multiplier */ \
NULL, /* SETUP buffer (not a SETUP endpoint) */ \ NULL, /* SETUP buffer (not a SETUP endpoint) */ \
}, \ }, \
.config = { \ .config = { \
.usbp = &USB_DRIVER, \ .usbp = &USB_DRIVER, \
.bulk_in = stream##_IN_EPNUM, \ .bulk_in = stream##_IN_EPNUM, \
.bulk_out = stream##_OUT_EPNUM, \ .bulk_out = stream##_OUT_EPNUM, \
.int_in = notification, \ .int_in = notification, \
.in_buffers = stream##_IN_CAPACITY, \ .in_buffers = stream##_IN_CAPACITY, \
.out_buffers = stream##_OUT_CAPACITY, \ .out_buffers = stream##_OUT_CAPACITY, \
.in_size = stream##_EPSIZE, \ .in_size = stream##_EPSIZE, \
.out_size = stream##_EPSIZE, \ .out_size = stream##_EPSIZE, \
.fixed_size = fixedsize, \ .fixed_size = fixedsize, \
.ib = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \ .ib = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \
.ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \ .ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \
} \ } \
} }
#endif #endif
typedef struct { typedef struct {
@ -388,12 +388,12 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) {
usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config); usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config);
#endif #endif
for (int i = 0; i < NUM_USB_DRIVERS; i++) { for (int i = 0; i < NUM_USB_DRIVERS; i++) {
#if STM32_USB_USE_OTG1 #if STM32_USB_USE_OTG1
usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].inout_ep_config); usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].inout_ep_config);
#else #else
usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].in_ep_config); usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].in_ep_config);
usbInitEndpointI(usbp, drivers.array[i].config.bulk_out, &drivers.array[i].out_ep_config); usbInitEndpointI(usbp, drivers.array[i].config.bulk_out, &drivers.array[i].out_ep_config);
#endif #endif
if (drivers.array[i].config.int_in) { if (drivers.array[i].config.int_in) {
usbInitEndpointI(usbp, drivers.array[i].config.int_in, &drivers.array[i].int_ep_config); usbInitEndpointI(usbp, drivers.array[i].config.int_in, &drivers.array[i].int_ep_config);
} }
@ -544,7 +544,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
#ifdef NKRO_ENABLE #ifdef NKRO_ENABLE
keymap_config.nkro = !!keyboard_protocol; keymap_config.nkro = !!keyboard_protocol;
if (!keymap_config.nkro && keyboard_idle) { if (!keymap_config.nkro && keyboard_idle) {
#else /* NKRO_ENABLE */ #else /* NKRO_ENABLE */
if (keyboard_idle) { if (keyboard_idle) {
#endif /* NKRO_ENABLE */ #endif /* NKRO_ENABLE */
/* arm the idle timer if boot protocol & idle */ /* arm the idle timer if boot protocol & idle */
@ -562,7 +562,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
/* arm the timer */ /* arm the timer */
#ifdef NKRO_ENABLE #ifdef NKRO_ENABLE
if (!keymap_config.nkro && keyboard_idle) { if (!keymap_config.nkro && keyboard_idle) {
#else /* NKRO_ENABLE */ #else /* NKRO_ENABLE */
if (keyboard_idle) { if (keyboard_idle) {
#endif /* NKRO_ENABLE */ #endif /* NKRO_ENABLE */
osalSysLockFromISR(); osalSysLockFromISR();
@ -618,21 +618,21 @@ static const USBConfig usbcfg = {
*/ */
void init_usb_driver(USBDriver *usbp) { void init_usb_driver(USBDriver *usbp) {
for (int i = 0; i < NUM_USB_DRIVERS; i++) { for (int i = 0; i < NUM_USB_DRIVERS; i++) {
#if STM32_USB_USE_OTG1 #if STM32_USB_USE_OTG1
QMKUSBDriver *driver = &drivers.array[i].driver; QMKUSBDriver *driver = &drivers.array[i].driver;
drivers.array[i].inout_ep_config.in_state = &drivers.array[i].in_ep_state; drivers.array[i].inout_ep_config.in_state = &drivers.array[i].in_ep_state;
drivers.array[i].inout_ep_config.out_state = &drivers.array[i].out_ep_state; drivers.array[i].inout_ep_config.out_state = &drivers.array[i].out_ep_state;
drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state; drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state;
qmkusbObjectInit(driver, &drivers.array[i].config); qmkusbObjectInit(driver, &drivers.array[i].config);
qmkusbStart(driver, &drivers.array[i].config); qmkusbStart(driver, &drivers.array[i].config);
#else #else
QMKUSBDriver *driver = &drivers.array[i].driver; QMKUSBDriver *driver = &drivers.array[i].driver;
drivers.array[i].in_ep_config.in_state = &drivers.array[i].in_ep_state; drivers.array[i].in_ep_config.in_state = &drivers.array[i].in_ep_state;
drivers.array[i].out_ep_config.out_state = &drivers.array[i].out_ep_state; drivers.array[i].out_ep_config.out_state = &drivers.array[i].out_ep_state;
drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state; drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state;
qmkusbObjectInit(driver, &drivers.array[i].config); qmkusbObjectInit(driver, &drivers.array[i].config);
qmkusbStart(driver, &drivers.array[i].config); qmkusbStart(driver, &drivers.array[i].config);
#endif #endif
} }
/* /*
@ -689,7 +689,7 @@ static void keyboard_idle_timer_cb(void *arg) {
#ifdef NKRO_ENABLE #ifdef NKRO_ENABLE
if (!keymap_config.nkro && keyboard_idle && keyboard_protocol) { if (!keymap_config.nkro && keyboard_idle && keyboard_protocol) {
#else /* NKRO_ENABLE */ #else /* NKRO_ENABLE */
if (keyboard_idle && keyboard_protocol) { if (keyboard_idle && keyboard_protocol) {
#endif /* NKRO_ENABLE */ #endif /* NKRO_ENABLE */
/* TODO: are we sure we want the KBD_ENDPOINT? */ /* TODO: are we sure we want the KBD_ENDPOINT? */
@ -738,7 +738,7 @@ void send_keyboard(report_keyboard_t *report) {
usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(struct nkro_report)); usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(struct nkro_report));
} else } else
#endif /* NKRO_ENABLE */ #endif /* NKRO_ENABLE */
{ /* regular protocol */ { /* regular protocol */
/* need to wait until the previous packet has made it through */ /* need to wait until the previous packet has made it through */
/* busy wait, should be short and not very common */ /* busy wait, should be short and not very common */
if (usbGetTransmitStatusI(&USB_DRIVER, KEYBOARD_IN_EPNUM)) { if (usbGetTransmitStatusI(&USB_DRIVER, KEYBOARD_IN_EPNUM)) {
@ -805,7 +805,7 @@ void send_mouse(report_mouse_t *report) {
osalSysUnlock(); osalSysUnlock();
} }
#else /* MOUSE_ENABLE */ #else /* MOUSE_ENABLE */
void send_mouse(report_mouse_t *report) { (void)report; } void send_mouse(report_mouse_t *report) { (void)report; }
#endif /* MOUSE_ENABLE */ #endif /* MOUSE_ENABLE */
@ -885,7 +885,7 @@ void console_task(void) {
} while (size > 0); } while (size > 0);
} }
#else /* CONSOLE_ENABLE */ #else /* CONSOLE_ENABLE */
int8_t sendchar(uint8_t c) { int8_t sendchar(uint8_t c) {
(void)c; (void)c;
return 0; return 0;

View File

@ -204,12 +204,12 @@ enum usb_endpoints {
#endif #endif
#ifdef RAW_ENABLE #ifdef RAW_ENABLE
RAW_IN_EPNUM = NEXT_EPNUM, RAW_IN_EPNUM = NEXT_EPNUM,
#if STM32_USB_USE_OTG1 # if STM32_USB_USE_OTG1
#define RAW_OUT_EPNUM RAW_IN_EPNUM # define RAW_OUT_EPNUM RAW_IN_EPNUM
#else # else
RAW_OUT_EPNUM = NEXT_EPNUM, RAW_OUT_EPNUM = NEXT_EPNUM,
#endif # endif
#endif #endif
#ifdef SHARED_EP_ENABLE #ifdef SHARED_EP_ENABLE
@ -220,44 +220,44 @@ enum usb_endpoints {
CONSOLE_IN_EPNUM = NEXT_EPNUM, CONSOLE_IN_EPNUM = NEXT_EPNUM,
# ifdef PROTOCOL_CHIBIOS # ifdef PROTOCOL_CHIBIOS
// ChibiOS has enough memory and descriptor to actually enable the endpoint // ChibiOS has enough memory and descriptor to actually enable the endpoint
// It could use the same endpoint numbers, as that's supported by ChibiOS // It could use the same endpoint numbers, as that's supported by ChibiOS
// But the QMK code currently assumes that the endpoint numbers are different // But the QMK code currently assumes that the endpoint numbers are different
#if STM32_USB_USE_OTG1 # if STM32_USB_USE_OTG1
#define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM # define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM
#else # else
CONSOLE_OUT_EPNUM = NEXT_EPNUM, CONSOLE_OUT_EPNUM = NEXT_EPNUM,
#endif # endif
# else # else
# define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM # define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM
# endif # endif
#endif #endif
#ifdef MIDI_ENABLE #ifdef MIDI_ENABLE
MIDI_STREAM_IN_EPNUM = NEXT_EPNUM, MIDI_STREAM_IN_EPNUM = NEXT_EPNUM,
#if STM32_USB_USE_OTG1 # if STM32_USB_USE_OTG1
#define MIDI_STREAM_OUT_EPNUM MIDI_STREAM_IN_EPNUM # define MIDI_STREAM_OUT_EPNUM MIDI_STREAM_IN_EPNUM
#else # else
MIDI_STREAM_OUT_EPNUM = NEXT_EPNUM, MIDI_STREAM_OUT_EPNUM = NEXT_EPNUM,
#endif # endif
#endif #endif
#ifdef VIRTSER_ENABLE #ifdef VIRTSER_ENABLE
CDC_NOTIFICATION_EPNUM = NEXT_EPNUM, CDC_NOTIFICATION_EPNUM = NEXT_EPNUM,
CDC_IN_EPNUM = NEXT_EPNUM, CDC_IN_EPNUM = NEXT_EPNUM,
#if STM32_USB_USE_OTG1 # if STM32_USB_USE_OTG1
#define CDC_OUT_EPNUM CDC_IN_EPNUM # define CDC_OUT_EPNUM CDC_IN_EPNUM
#else # else
CDC_OUT_EPNUM = NEXT_EPNUM, CDC_OUT_EPNUM = NEXT_EPNUM,
#endif # endif
#endif #endif
#ifdef JOYSTICK_ENABLE #ifdef JOYSTICK_ENABLE
JOYSTICK_IN_EPNUM = NEXT_EPNUM, JOYSTICK_IN_EPNUM = NEXT_EPNUM,
#if STM32_USB_USE_OTG1 # if STM32_USB_USE_OTG1
JOYSTICK_OUT_EPNUM = JOYSTICK_IN_EPNUM, JOYSTICK_OUT_EPNUM = JOYSTICK_IN_EPNUM,
#else # else
JOYSTICK_OUT_EPNUM = NEXT_EPNUM, JOYSTICK_OUT_EPNUM = NEXT_EPNUM,
#endif # endif
#endif #endif
}; };

View File

@ -1,362 +1,362 @@
:10000000BDC00000E3C00000E1C00000DFC0000090 :10000000BDC00000E3C00000E1C00000DFC0000090
:10001000DDC00000DBC00000D9C00000D7C0000078 :10001000DDC00000DBC00000D9C00000D7C0000078
:10002000D5C00000D3C000003AC70000B1C700002F :10002000D5C00000D3C000003AC70000B1C700002F
:10003000CDC00000CBC00000C9C00000C7C0000098 :10003000CDC00000CBC00000C9C00000C7C0000098
:10004000C5C00000C3C00000C1C00000BFC00000A8 :10004000C5C00000C3C00000C1C00000BFC00000A8
:10005000BDC00000BBC00000B9C000007FC60000EA :10005000BDC00000BBC00000B9C000007FC60000EA
:10006000B5C00000B3C00000B1C00000AFC00000C8 :10006000B5C00000B3C00000B1C00000AFC00000C8
:10007000ADC00000ABC00000A9C00000A7C00000D8 :10007000ADC00000ABC00000A9C00000A7C00000D8
:10008000A5C00000A3C00000A1C000009FC00000E8 :10008000A5C00000A3C00000A1C000009FC00000E8
:100090009DC000009BC0000099C0000097C00000F8 :100090009DC000009BC0000099C0000097C00000F8
:1000A00095C0000093C0000091C000000001000056 :1000A00095C0000093C0000091C000000001000056
:1000B0005D0112000200001A014300030000160156 :1000B0005D0112000200001A014300030000160156
:1000C0000401030904FC001802030904E4001603F8 :1000C0000401030904FC001802030904E4001603F8
:1000D000030904D6000C0C03310032003300340055 :1000D000030904D6000C0C03310032003300340055
:1000E0003500000016035500530042002000530065 :1000E0003500000016035500530042002000530065
:1000F00065007200690061006C0000001803540084 :1000F00065007200690061006C0000001803540084
:10010000650065006E007300790064007500690089 :10010000650065006E007300790064007500690089
:100110006E006F000000040309040902430002019D :100110006E006F000000040309040902430002019D
:1001200000C0320904000001020201000524001091 :1001200000C0320904000001020201000524001091
:10013000010524010001042402060524060001072C :10013000010524010001042402060524060001072C
:1001400005820308004009040100020A00000007BC :1001400005820308004009040100020A00000007BC
:100150000503024000000705840240000012010070 :100150000503024000000705840240000012010070
:100160000202000020C01683040001010203010006 :100160000202000020C01683040001010203010006
:1001700001C10201803601813600110B11241FBE1E :1001700001C10201803601813600110B11241FBE1E
:10018000CFEFDAE0DEBFCDBF11E0A0E0B1E0EAE5FD :10018000CFEFDAE0DEBFCDBF11E0A0E0B1E0EAE5FD
:10019000F6E102C005900D92A232B107D9F722E034 :10019000F6E102C005900D92A232B107D9F722E034
:1001A000A2E2B1E001C01D92A935B207E1F710E06B :1001A000A2E2B1E001C01D92A935B207E1F710E06B
:1001B000CEEBD0E004C02197FE010E94250BCD3B81 :1001B000CEEBD0E004C02197FE010E94250BCD3B81
:1001C000D107C9F70E942D090C942B0B19CFDC0124 :1001C000D107C9F70E942D090C942B0B19CFDC0124
:1001D000ED91FC910190F081E02D09948EBD00001D :1001D000ED91FC910190F081E02D09948EBD00001D
:1001E0000DB407FEFDCF8EB508950F931F930FB684 :1001E0000DB407FEFDCF8EB508950F931F930FB684
:1001F000F8948091440290914502A0914602B091FA :1001F000F8948091440290914502A0914602B091FA
:1002000047020FBE409122015091230160912401C9 :1002000047020FBE409122015091230160912401C9
:10021000709125018C019D01041B150B260B370BDA :10021000709125018C019D01041B150B260B370BDA
:100220000832110521053105F0F0809322019093E9 :100220000832110521053105F0F0809322019093E9
:100230002301A0932401B09325012091010180EEB8 :100230002301A0932401B09325012091010180EEB8
:10024000820F813A28F090910001919590930001DE :10024000820F813A28F090910001919590930001DE
:1002500080910001820F80930101529A803810F43E :1002500080910001820F80930101529A803810F43E
:100260005A9801C05A9A1F910F91089590912601B2 :100260005A9801C05A9A1F910F91089590912601B2
:10027000882319F0911103C004C0911102C02E9A75 :10027000882319F0911103C004C0911102C02E9A75
:1002800001C02E98809180008F7D8093800008951A :1002800001C02E98809180008F7D8093800008951A
:100290000F931F93CF93DF938B01EC01DD27FE01BA :100290000F931F93CF93DF938B01EC01DD27FE01BA
:1002A0009ED46EE170E080E090E098D5FE019DD490 :1002A0009ED46EE170E080E090E098D5FE019DD490
:1002B0006EE170E080E090E091D50150110978F78F :1002B0006EE170E080E090E091D50150110978F78F
:1002C000DF91CF911F910F91089540E05BE460E0D2 :1002C000DF91CF911F910F91089540E05BE460E0D2
:1002D00070E08FE492E00E94AA0A509A62E070E017 :1002D00070E08FE492E00E94AA0A509A62E070E017
:1002E00085E090E0D5DF519A62E070E086E090E032 :1002E00085E090E0D5DF519A62E070E086E090E032
:1002F000CFDF529A62E070E087E090E0C9CF8823B8 :1002F000CFDF529A62E070E087E090E0C9CF8823B8
:1003000011F0589A01C0589884B58F7D84BD089526 :1003000011F0589A01C0589884B58F7D84BD089526
:10031000CF93DF9300D01F92CDB7DEB72B834A83F4 :10031000CF93DF9300D01F92CDB7DEB72B834A83F4
:1003200069835CDF6981862F59DF4A81842F56DF1C :1003200069835CDF6981862F59DF4A81842F56DF1C
:100330002B81822F0F900F900F90DF91CF914ECF96 :100330002B81822F0F900F900F90DF91CF914ECF96
:1003400020913A012093270180913B01809328015D :1003400020913A012093270180913B01809328015D
:1003500080913C018093290180913D0180932A0185 :1003500080913C018093290180913D0180932A0185
:1003600080913E0180932B0180913F0180932C016D :1003600080913E0180932B0180913F0180932C016D
:100370008091400180932D018091410180932E0155 :100370008091400180932D018091410180932E0155
:100380008091420180932F018091440190E0982F49 :100380008091420180932F018091440190E0982F49
:10039000882730914501830F911D909331018093FF :10039000882730914501830F911D909331018093FF
:1003A00030018091460190E0982F882730914701D5 :1003A00030018091460190E0982F882730914701D5
:1003B000830F911D90933301809332018091480106 :1003B000830F911D90933301809332018091480106
:1003C00090E0982F882730914901830F911D9093D9 :1003C00090E0982F882730914901830F911D9093D9
:1003D00035018093340180914A0190E0A0E0B0E0C3 :1003D00035018093340180914A0190E0A0E0B0E0C3
:1003E000BA2FA92F982F882730914B01830F911D89 :1003E000BA2FA92F982F882730914B01830F911D89
:1003F000A11DB11DDC019927882740914C0150E0D7 :1003F000A11DB11DDC019927882740914C0150E0D7
:10040000542F4427052E000C660B770B840F951F85 :10040000542F4427052E000C660B770B840F951F85
:10041000A61FB71F30914D01830F911DA11DB11D66 :10041000A61FB71F30914D01830F911DA11DB11D66
:100420008093360190933701A0933801B09339013E :100420008093360190933701A0933801B09339013E
:1004300081E0203E08F480E080932601089581E069 :1004300081E0203E08F480E080932601089581E069
:1004400015DF269A6DD380914202882381F0813096 :1004400015DF269A6DD380914202882381F0813096
:1004500051F48DB3809340029DB380914102809509 :1004500051F48DB3809340029DB380914102809509
:1004600089238DBB04C08FB7F8948093400283E545 :1004600089238DBB04C08FB7F8948093400283E545
:100470008CBD1DBC299864E170E080E090E0AED4B2 :100470008CBD1DBC299864E170E080E090E0AED4B2
:1004800080E0F4DE80E991E00197F1F781E0EEDEB3 :1004800080E0F4DE80E991E00197F1F781E0EEDEB3
:1004900062E370E080E090E0A1D420E040E063E51A :1004900062E370E080E090E0A1D420E040E063E51A
:1004A0008CEA36DF81E090E090933D0280933C023D :1004A0008CEA36DF81E090E090933D0280933C023D
:1004B000089541D322982A982198299880E0D6DE81 :1004B000089541D322982A982198299880E0D6DE81
:1004C00026982E98EDE7F0E080818F7D8083109252 :1004C00026982E98EDE7F0E080818F7D8083109252
:1004D0003D0210923C020895242F880F880F880F48 :1004D0003D0210923C020895242F880F880F880F48
:1004E000462F672F805C14CFCF93DF9300D0CDB71A :1004E000462F672F805C14CFCF93DF9300D0CDB71A
:1004F000DEB7482F692F80E090E049836A83FFDEF2 :1004F000DEB7482F692F80E090E049836A83FFDEF2
:1005000020E049816A818CE403DF6EE170E080E0E5 :1005000020E049816A818CE403DF6EE170E080E0E5
:1005100090E064D481E090E00F900F90DF91CF9154 :1005100090E064D481E090E00F900F90DF91CF9154
:10052000EECE209132013091330180913A029091C8 :10052000EECE209132013091330180913A029091C8
:100530003B022032310511F4807F089520343105CB :100530003B022032310511F4807F089520343105CB
:1005400011F4807E08952038310511F4807C0895DF :1005400011F4807E08952038310511F4807C0895DF
:100550002115314009F480780895CF92DF92EF920F :100550002115314009F480780895CF92DF92EF920F
:10056000FF920F931F93CF93DF936C01DADF8C011F :10056000FF920F931F93CF93DF936C01DADF8C011F
:10057000C0E0D0E0CC15DD0554F5D3DF7C010817D1 :10057000C0E0D0E0CC15DD0554F5D3DF7C010817D1
:10058000190721F0C801B0DFCCDF7C01FE01E65C79 :10058000190721F0C801B0DFCCDF7C01FE01E65C79
:10059000FE4F60913A0270913B02408180E09CDF07 :10059000FE4F60913A0270913B02408180E09CDF07
:1005A0002296FE01E75CFE4F60913A0270913B0299 :1005A0002296FE01E75CFE4F60913A0270913B0299
:1005B000408181E091DF20913A0230913B022F5F30 :1005B000408181E091DF20913A0230913B022F5F30
:1005C0003F4F30933B0220933A028701D3CFC801BB :1005C0003F4F30933B0220933A028701D3CFC801BB
:1005D0008BDF80E1DF91CF911F910F91FF90EF9022 :1005D0008BDF80E1DF91CF911F910F91FF90EF9022
:1005E000DF90CF900895462F880F880F880F20E066 :1005E000DF90CF900895462F880F880F880F20E066
:1005F000672F805E8DCE0F931F93CF93DF938C0177 :1005F000672F805E8DCE0F931F93CF93DF938C0177
:10060000C0E0D0E0C017D10704F560913A027091C4 :10060000C0E0D0E0C017D10704F560913A027091C4
:100610003B0280E0E8DF682F8FE492E0D8DD609154 :100610003B0280E0E8DF682F8FE492E0D8DD609154
:100620003A0270913B0281E0DEDF682F8FE492E0B6 :100620003A0270913B0281E0DEDF682F8FE492E0B6
:10063000CEDD20913A0230913B022F5F3F4F309345 :10063000CEDD20913A0230913B022F5F3F4F309345
:100640003B0220933A022296DDCF80E1DF91CF91E9 :100640003B0220933A022296DDCF80E1DF91CF91E9
:100650001F910F910895EF92FF920F931F93CF93E5 :100650001F910F910895EF92FF920F931F93CF93E5
:10066000DF937C0100913A0210913B02000F111FB1 :10066000DF937C0100913A0210913B02000F111FB1
:10067000E801CE01801B910B8E159F055CF42FEFD6 :10067000E801CE01801B910B8E159F055CF42FEFD6
:100680004C2F6D2F80EA44DE682F8FE492E09FDDCF :100680004C2F6D2F80EA44DE682F8FE492E09FDDCF
:100690002196EFCF80E1DF91CF911F910F91FF90D5 :100690002196EFCF80E1DF91CF911F910F91FF90D5
:1006A000EF9008958FE492E0F2D5892BD9F38FE48F :1006A000EF9008958FE492E0F2D5892BD9F38FE48F
:1006B00092E026C608950F931F93CF93DF938C018A :1006B00092E026C608950F931F93CF93DF938C018A
:1006C000CAE3D1E0CE018A539140801791071CF410 :1006C000CAE3D1E0CE018A539140801791071CF410
:1006D000E9DF8993F7CFDF91CF911F910F910895B3 :1006D000E9DF8993F7CFDF91CF911F910F910895B3
:1006E000EF92FF920F931F93CF93DF93EC018B0157 :1006E000EF92FF920F931F93CF93DF93EC018B0157
:1006F000CB01E1DF80E090E002DE8AE3E82E81E0DA :1006F000CB01E1DF80E090E002DE8AE3E82E81E0DA
:10070000F82E0C0F1D1FC017D10771F0F7012191B2 :10070000F82E0C0F1D1FC017D10771F0F7012191B2
:100710007F014C2F6D2F80ECFBDD6DE270E080E0FF :100710007F014C2F6D2F80ECFBDD6DE270E080E0FF
:1007200090E05CD32196EFCF81E090E0E8DD80E1BE :1007200090E05CD32196EFCF81E090E0E8DD80E1BE
:10073000DF91CF911F910F91FF90EF9008950F934C :10073000DF91CF911F910F91FF90EF9008950F934C
:100740001F93CF93DF938C01C0913A02D0913B026B :100740001F93CF93DF938C01C0913A02D0913B026B
:1007500080913401909135018017910718F0CC0FEA :1007500080913401909135018017910718F0CC0FEA
:10076000DD1F0BC080913E0290913F020196909355 :10076000DD1F0BC080913E0290913F020196909355
:100770003F0280933E0281E10FC00132110540F03B :100770003F0280933E0281E10FC00132110540F03B
:1007800060E270E0CE01ACDFA09600521109F5CF17 :1007800060E270E0CE01ACDFA09600521109F5CF17
:10079000B801CE01A5DF80E1DF91CF911F910F91CC :10079000B801CE01A5DF80E1DF91CF911F910F91CC
:1007A000089580DF803231F464E18FE492E00FDD60 :1007A000089580DF803231F464E18FE492E00FDD60
:1007B00060E10AC080913E0290913F0201969093C1 :1007B00060E10AC080913E0290913F0201969093C1
:1007C0003F0280933E0265E18FE492E000CDCF933B :1007C0003F0280933E0265E18FE492E000CDCF933B
:1007D000C82F68DF803251F464E18FE492E0F7DCE7 :1007D000C82F68DF803251F464E18FE492E0F7DCE7
:1007E0006C2F8FE492E0F3DC60E10AC080913E025E :1007E0006C2F8FE492E0F3DC60E10AC080913E025E
:1007F00090913F02019690933F0280933E0265E103 :1007F00090913F02019690933F0280933E0265E103
:100800008FE492E0CF91E3CC813859F020F4803826 :100800008FE492E0CF91E3CC813859F020F4803826
:1008100061F482E00BC0823831F0833931F483E532 :1008100061F482E00BC0823831F0833931F483E532
:1008200005C081E003C082E101C080E0D0CF84E058 :1008200005C081E003C082E101C080E0D0CF84E058
:1008300090E041DFEAE3F1E0238142816181808140 :1008300090E041DFEAE3F1E0238142816181808140
:1008400067DDC5CFCF93DF93EC0135DF2BDF80323F :1008400067DDC5CFCF93DF93EC0135DF2BDF80323F
:1008500041F464E18FE492E0BADCCE017EDE682FE1 :1008500041F464E18FE492E0BADCCE017EDE682FE1
:100860000AC080913E0290913F02019690933F0210 :100860000AC080913E0290913F02019690933F0210
:1008700080933E0265E18FE492E0DF91CF91A7CCB7 :1008700080933E0265E18FE492E0DF91CF91A7CCB7
:10088000CF93DF930FDFC82FD0E0DC2FCC270ADF18 :10088000CF93DF930FDFC82FD0E0DC2FCC270ADF18
:10089000C80FD11D07DF863421F4CE01DF91CF913F :10089000C80FD11D07DF863421F4CE01DF91CF913F
:1008A000D1CF8534B9F4CE014ADFC82FFBDE8032C8 :1008A000D1CF8534B9F4CE014ADFC82FFBDE8032C8
:1008B00031F464E18FE492E08ADC6C2F0CC080910B :1008B00031F464E18FE492E08ADC6C2F0CC080910B
:1008C0003E0290913F02019690933F0280933E0238 :1008C0003E0290913F02019690933F0280933E0238
:1008D00065E101C061E18FE492E0DF91CF9177CCD7 :1008D00065E101C061E18FE492E0DF91CF9177CCD7
:1008E0000F931F93CF93DF93DDDEC82FDBDE082F3E :1008E0000F931F93CF93DF93DDDEC82FDBDE082F3E
:1008F000D9DE182FD7DE803259F080913E029091D8 :1008F000D9DE182FD7DE803259F080913E029091D8
:100900003F02019690933F0280933E0265E115C03D :100900003F02019690933F0280933E0265E115C03D
:10091000D0E0DC2FCC27C00FD11D64E18FE492E042 :10091000D0E0DC2FCC27C00FD11D64E18FE492E042
:1009200056DC163419F4CE0166DE06C0153419F40F :1009200056DC163419F4CE0166DE06C0153419F40F
:10093000CE0191DE01C081E1682F8FE492E0DF916A :10093000CE0191DE01C081E1682F8FE492E0DF916A
:10094000CF911F910F9143CCADDE803259F0809151 :10094000CF911F910F9143CCADDE803259F0809151
:100950003E0290913F02019690933F0280933E02A7 :100950003E0290913F02019690933F0280933E02A7
:1009600065E120C064E18FE492E031DC20E040E00A :1009600065E120C064E18FE492E031DC20E040E00A
:1009700060E080E3CDDC682F8FE492E028DC20E0AB :1009700060E080E3CDDC682F8FE492E028DC20E0AB
:1009800041E060E080E3C4DC682F8FE492E01FDC8C :1009800041E060E080E3C4DC682F8FE492E01FDC8C
:1009900020E042E060E080E3BBDC682F8FE492E07F :1009900020E042E060E080E3BBDC682F8FE492E07F
:1009A00016DC60E18FE492E012CC7CDE813509F444 :1009A00016DC60E18FE492E012CC7CDE813509F444
:1009B00077C0E0F4813409F460C050F4803309F466 :1009B00077C0E0F4813409F460C050F4803309F466
:1009C00040C0813309F442C0803209F07AC06FC060 :1009C00040C0813309F442C0803209F07AC06FC060
:1009D000853409F454C0803509F455C0823409F0D7 :1009D000853409F454C0803509F455C0823409F0D7
:1009E00070C084E190E067DEABDC4CC0813609F476 :1009E00070C084E190E067DEABDC4CC0813609F476
:1009F00053C0F0F4863509F452C0803609F44BC078 :1009F00053C0F0F4863509F452C0803609F44BC078
:100A0000853509F05EC04EDE90E090933B02809306 :100A0000853509F05EC04EDE90E090933B02809306
:100A10003A0248DE90E0982F882720913A023091E0 :100A10003A0248DE90E0982F882720913A023091E0
:100A20003B02820F931F90933B0280933A022AC0AD :100A20003B02820F931F90933B0280933A022AC0AD
:100A30008437A1F1853709F439C0843609F041C003 :100A30008437A1F1853709F439C0843609F041C003
:100A40001FCF10923F0210923E021CC02BDE80325C :100A40001FCF10923F0210923E021CC02BDE80325C
:100A500071F564E18FE492E0BADBE0914F02F0912E :100A500071F564E18FE492E0BADBE0914F02F0912E
:100A600050020280F381E02D47E050E069E071E040 :100A600050020280F381E02D47E050E069E071E040
:100A70008FE492E0099560E133C014DEC5CE85E0D5 :100A70008FE492E0099560E133C014DEC5CE85E0D5
:100A800090E019DE8ECE80913C0290913D02892B40 :100A800090E019DE8ECE80913C0290913D02892B40
:100A9000C9F7D5DCF7CF06DE05DEF4CF21CFC7CE10 :100A9000C9F7D5DCF7CF06DE05DEF4CF21CFC7CE10
:100AA00010923F0210923E0204DDECCF4DCF8091B8 :100AA00010923F0210923E0204DDECCF4DCF8091B8
:100AB0003E0290913F02019690933F0280933E0246 :100AB0003E0290913F02019690933F0280933E0246
:100AC0000EC080913E0290913F02019690933F02AA :100AC0000EC080913E0290913F02019690933F02AA
:100AD00080933E02E7DD803211F462E101C065E1FE :100AD00080933E02E7DD803211F462E101C065E1FE
:100AE0008FE492E074CB80913C0290913D02892B7F :100AE0008FE492E074CB80913C0290913D02892B7F
:100AF00011F0589A01C0589884B58F7D84BD8091BB :100AF00011F0589A01C0589884B58F7D84BD8091BB
:100B00003E0290913F02892B11F0599A01C05998E9 :100B00003E0290913F02892B11F0599A01C05998E9
:100B10006CDB8FE492E0BBD3892B09F046CF0895BC :100B10006CDB8FE492E0BBD3892B09F046CF0895BC
:100B2000289A209A8CB580618CBD8CB580648CBD70 :100B2000289A209A8CB580618CBD8CB580648CBD70
:100B3000219A229A08958CB58F7B8CBD08951DBA99 :100B3000219A229A08958CB58F7B8CBD08951DBA99
:100B4000109268001CBC10BE1FBA10927A0010925E :100B4000109268001CBC10BE1FBA10927A0010925E
:100B50006E0010926F00109271001092720010924D :100B50006E0010926F00109271001092720010924D
:100B6000C900ECEBF0E0108214B817B81AB81DB841 :100B6000C900ECEBF0E0108214B817B81AB81DB841
:100B700010BA108215B818B81BB81EB811BA08956B :100B700010BA108215B818B81BB81EB811BA08956B
:100B8000F894E1E6F0E020E82083108283E084BD61 :100B8000F894E1E6F0E020E82083108283E084BD61
:100B900085BDEEE6F0E080818160808381E0809316 :100B900085BDEEE6F0E080818160808381E0809316
:100BA000800092E090938100809390009093910058 :100BA000800092E090938100809390009093910058
:100BB0009093C00094E09093C1008093C200809312 :100BB0009093C00094E09093C1008093C200809312
:100BC000C3001092C40086E880937A0020937B00D3 :100BC000C3001092C40086E880937A0020937B00D3
:100BD00010927E0010927D0040D178940895E93102 :100BD00010927E0010927D0040D178940895E93102
:100BE00050F4EE0FE450FA4F0994E93120F4EE0F7F :100BE00050F4EE0FE450FA4F0994E93120F4EE0F7F
:100BF000E25DF94F09940895289A0895299A089575 :100BF000E25DF94F09940895289A0895299A089575
:100C00002A9A08952B9A08952F9A6AC0589A58C024 :100C00002A9A08952B9A08952F9A6AC0589A58C024
:100C1000599A08955A9A08955B9A0895469A66C01B :100C1000599A08955A9A08955B9A0895469A66C01B
:100C2000479A6AC05E9A08955F9A6CC02C9A08959C :100C2000479A6AC05E9A08955F9A6CC02C9A08959C
:100C30002D9A4AC02E9A4EC08F9A08958E9A089582 :100C30002D9A4AC02E9A4EC08F9A08958E9A089582
:100C40008D9A08958C9A0895899A0895889A08959E :100C40008D9A08958C9A0895899A0895889A08959E
:100C50005C9A08955D9A0895769A08952898089563 :100C50005C9A08955D9A0895769A08952898089563
:100C6000299808952A9808952B9808952F9838C0A8 :100C6000299808952A9808952B9808952F9838C0A8
:100C7000589826C0599808955A9808955B980895F1 :100C7000589826C0599808955A9808955B980895F1
:100C8000469834C0479838C05E9808955F983AC037 :100C8000469834C0479838C05E9808955F983AC037
:100C90002C9808952D9818C02E981CC08F980895F0 :100C90002C9808952D9818C02E981CC08F980895F0
:100CA0008E9808958D9808958C9808958998089540 :100CA0008E9808958D9808958C9808958998089540
:100CB000889808955C9808955D98089576980895A9 :100CB000889808955C9808955D98089576980895A9
:100CC000E4B5EF7DE4BD0895E0918000EF77E09317 :100CC000E4B5EF7DE4BD0895E0918000EF77E09317
:100CD00080000895E0918000EF7DE093800008950A :100CD00080000895E0918000EF7DE093800008950A
:100CE000E0918000E77FE09380000895E09190001C :100CE000E0918000E77FE09380000895E09190001C
:100CF000EF77E09390000895E091C000EF77E093E4 :100CF000EF77E09390000895E091C000EF77E093E4
:100D0000C0000895E091C200E77FE093C20008951B :100D0000C0000895E091C200E77FE093C20008951B
:100D1000F89484B7877F84BF80916000806180935E :100D1000F89484B7877F84BF80916000806180935E
:100D200060001092600080E29EE40197F1F781E09C :100D200060001092600080E29EE40197F1F781E09C
:100D30008093E00080E28093D80080E69AEE0197ED :100D30008093E00080E28093D80080E69AEE0197ED
:100D4000F1F7FDDE0C94003FFFCFF894F8DE80E66B :100D4000F1F7FDDE0C94003FFFCFF894F8DE80E66B
:100D50009AEE0197F1F70C940000FFCF8F938FB7B5 :100D50009AEE0197F1F70C940000FFCF8F938FB7B5
:100D60008F93809143028D5F8D37D0F4809343023F :100D60008F93809143028D5F8D37D0F4809343023F
:100D7000809144028F5F80934402D8F080914502B5 :100D7000809144028F5F80934402D8F080914502B5
:100D80008F4F80934502A8F0809146028F4F809349 :100D80008F4F80934502A8F0809146028F4F809349
:100D9000460278F0809147028F4F8093470209C046 :100D9000460278F0809147028F4F8093470209C046
:100DA0008D5780934302809144028E5F809344026A :100DA0008D5780934302809144028E5F809344026A
:100DB00028F7809148028C5F8093480258F0809118 :100DB00028F7809148028C5F8093480258F0809118
:100DC00049028F4F8093490228F080914A028F4F49 :100DC00049028F4F8093490228F080914A028F4F49
:100DD00080934A028F918FBF8F911895CF92DF92A7 :100DD00080934A028F918FBF8F911895CF92DF92A7
:100DE000EF92FF926B017C0119D09B01C114D104D9 :100DE000EF92FF926B017C0119D09B01C114D104D9
:100DF000E104F10471F012D0621B730B683E734082 :100DF000E104F10471F012D0621B730B683E734082
:100E0000A8F381E0C81AD108E108F10828513C4F45 :100E0000A8F381E0C81AD108E108F10828513C4F45
:100E1000EDCFFF90EF90DF90CF9008950FB6F8944C :100E1000EDCFFF90EF90DF90CF9008950FB6F8944C
:100E200066B515B2709148028091490290914A02CC :100E200066B515B2709148028091490290914A02CC
:100E30000FBE10FE05C06F3F19F07C5F8F4F9F4FB4 :100E30000FBE10FE05C06F3F19F07C5F8F4F9F4FB4
:100E400011240024660F001C660F001C70290895F1 :100E400011240024660F001C660F001C70290895F1
:100E50008091E80080FFFCCF08958091D80087FF43 :100E50008091E80080FFFCCF08958091D80087FF43
:100E600002C085FF1BC081E08093D70080EA809399 :100E600002C085FF1BC081E08093D70080EA809399
:100E7000D80082E189BD09B400FEFDCF80E98093EE :100E7000D80082E189BD09B400FEFDCF80E98093EE
:100E8000D8001092E00010925B0210925A02109269 :100E8000D8001092E00010925B0210925A02109269
:100E900059021092E1008DE08093E20008951F92C4 :100E900059021092E1008DE08093E20008951F92C4
:100EA0000F920FB60F9211242F933F934F935F939E :100EA0000F920FB60F9211242F933F934F935F939E
:100EB0006F937F938F939F93AF93BF93EF93FF9322 :100EB0006F937F938F939F93AF93BF93EF93FF9322
:100EC0009091E1001092E10093FF11C01092E900AF :100EC0009091E1001092E10093FF11C01092E900AF
:100ED00081E08093EB001092EC0082E28093ED00C1 :100ED00081E08093EB001092EC0082E28093ED00C1
:100EE00088E08093F00010925B021092590292FF0A :100EE00088E08093F00010925B021092590292FF0A
:100EF0001DC080915B028823C9F080914E02882337 :100EF0001DC080915B028823C9F080914E02882337
:100F000059F0815080934E02811106C084E0809395 :100F000059F0815080934E02811106C084E0809395
:100F1000E9008AE38093E80080914D02882331F054 :100F1000E9008AE38093E80080914D02882331F054
:100F2000815080934D02811101C0F2DE90FF0CC010 :100F2000815080934D02811101C0F2DE90FF0CC010
:100F300080E18093E20010925B0281E080935A028C :100F300080E18093E20010925B0281E080935A028C
:100F400080EA8093D80019BC80915A02882379F0F6 :100F400080EA8093D80019BC80915A02882379F0F6
:100F500094FF0DC082E189BD09B400FEFDCF80E998 :100F500094FF0DC082E189BD09B400FEFDCF80E998
:100F60008093D8008DE08093E20010925A02FF91A6 :100F60008093D8008DE08093E20010925A02FF91A6
:100F7000EF91BF91AF919F918F917F916F915F9111 :100F7000EF91BF91AF919F918F917F916F915F9111
:100F80004F913F912F910F900FBE0F901F9018958A :100F80004F913F912F910F900FBE0F901F9018958A
:100F90001F920F920FB60F921124EF92FF920F93B0 :100F90001F920F920FB60F921124EF92FF920F93B0
:100FA0001F932F933F934F935F936F937F938F93F1 :100FA0001F932F933F934F935F936F937F938F93F1
:100FB0009F93AF93BF93CF93EF93FF931092E9006A :100FB0009F93AF93BF93CF93EF93FF931092E9006A
:100FC0008091E80083FF30C1C091F1008091F10071 :100FC0008091E80083FF30C1C091F1008091F10071
:100FD000E090F100F090F1000091F1001091F1002B :100FD000E090F100F090F1000091F1001091F1002B
:100FE0002091F1003091F10092EF9093E80086306B :100FE0002091F1003091F10092EF9093E80086306B
:100FF00009F03FC086E0ECEAF0E0459155914E15CE :100FF00009F03FC086E0ECEAF0E0459155914E15CE
:101000005F0511F0359615C0459155914017510770 :101000005F0511F0359615C0459155914017510770
:1010100011F033960EC04591559184912F3F3105C3 :1010100011F033960EC04591559184912F3F3105C3
:1010200019F010F02FEF30E0281708F4822F3EEF70 :1010200019F010F02FEF30E0281708F4822F3EEF70
:1010300008C0815011F7F8C0891B3093E80088235D :1010300008C0815011F7F8C0891B3093E80088235D
:10104000A9F09091E800292F2570D9F392FDEFC007 :10104000A9F09091E800292F2570D9F392FDEFC007
:10105000982F813208F090E2292F222369F3FA01B8 :10105000982F813208F090E2292F222369F3FA01B8
:1010600045914093F100AF012150F7CF903249F301 :1010600045914093F100AF012150F7CF903249F301
:10107000DEC0853049F48EEF8093E800E9DE8E2DE6 :10107000DEC0853049F48EEF8093E800E9DE8E2DE6
:1010800080688093E300D3C0893001F5C111CCC0E2 :1010800080688093E300D3C0893001F5C111CCC0E2
:10109000E0925B021092590210924E028EEF809302 :10109000E0925B021092590210924E028EEF809302
:1010A000E80081E0EFE6F1E08093E900959190930C :1010A000E80081E0EFE6F1E08093E900959190930C
:1010B000EB00992331F095919093EC0095919093EA :1010B000EB00992331F095919093EC0095919093EA
:1010C000ED008F5F853081F78EE1A9C0883049F44B :1010C000ED008F5F853081F78EE1A9C0883049F44B
:1010D000C03809F0A9C0BCDE80915B028093F100AA :1010D000C03809F0A9C0BCDE80915B028093F100AA
:1010E0007DC0813279F4C13A09F09EC0B1DEE2E000 :1010E0007DC0813279F4C13A09F09EC0B1DEE2E000
:1010F000F1E087E08E0F90819093F10031968E138E :1010F000F1E087E08E0F90819093F10031968E138E
:10110000FACF6CC0803209F047C0C13209F08CC000 :10110000FACF6CC0803209F047C0C13209F08CC000
:101110008091E80082FFFCCFE2E0F1E087E08E0FF3 :101110008091E80082FFFCCFE2E0F1E087E08E0FF3
:101120009091F100908331968E13FACF8BEF8093DC :101120009091F100908331968E13FACF8BEF8093DC
:10113000E8008EEF8093E8003091020140910301B6 :10113000E8008EEF8093E8003091020140910301B6
:10114000809104012091050190E0A0E0B0E0DC0175 :10114000809104012091050190E0A0E0B0E0DC0175
:1011500099278827942B832BB22B86389105A105DC :1011500099278827942B832BB22B86389105A105DC
:10116000B10521F48FE080934D0261C0863991056D :10116000B10521F48FE080934D0261C0863991056D
:10117000A105B10509F05BC084E08093E9009FEF11 :10117000A105B10509F05BC084E08093E9009FEF11
:101180008091EE00837039F09093E8008091E80040 :101180008091EE00837039F09093E8008091E80040
:1011900082FDFCCFF5CFD9DD823231F4C13209F0C6 :1011900082FDFCCFF5CFD9DD823231F4C13209F0C6
:1011A00043C0E092590204C0833221F4C132E1F518 :1011A00043C0E092590204C0833221F4C132E1F518
:1011B0004FDE14C0811116C04BDEC23851F40093CB :1011B0004FDE14C0811116C04BDEC23851F40093CB
:1011C000E9008091EB0085FB882780F91092E90007 :1011C000E9008091EB0085FB882780F91092E90007
:1011D00001C080E08093F1001092F1008EEF8093C7 :1011D00001C080E08093F1001092F1008EEF8093C7
:1011E000E80025C0982F9D7F9130F1F4C230E1F4E2 :1011E000E80025C0982F9D7F9130F1F4C230E1F4E2
:1011F000EF28D1F40F779FEF900F9630A8F49EEF71 :1011F000EF28D1F40F779FEF900F9630A8F49EEF71
:101200009093E8000093E900833071F089E18093C6 :101200009093E8000093E900833071F089E18093C6
:10121000EB0081E090E001C0880F0A95EAF7809327 :10121000EB0081E090E001C0880F0A95EAF7809327
:10122000EA001092EA0003C081E28093EB00FF9194 :10122000EA001092EA0003C081E28093EB00FF9194
:10123000EF91CF91BF91AF919F918F917F916F91DE :10123000EF91CF91BF91AF919F918F917F916F91DE
:101240005F914F913F912F911F910F91FF90EF90E0 :101240005F914F913F912F911F910F91FF90EF90E0
:101250000F900FBE0F901F90189592DC36D843DC8C :101250000F900FBE0F901F90189592DC36D843DC8C
:10126000FECFCF93DF931F92CDB7DEB76983DC014A :10126000FECFCF93DF931F92CDB7DEB76983DC014A
:10127000ED91FC910280F381E02D41E050E0BE0150 :10127000ED91FC910280F381E02D41E050E0BE0150
:101280006F5F7F4F09950F90DF91CF910895FC011B :101280006F5F7F4F09950F90DF91CF910895FC011B
:101290008FB7F89490915B02911102C090E010C05A :101290008FB7F89490915B02911102C090E010C05A
:1012A00093E09093E9009091F200911109C0209190 :1012A00093E09093E9009091F200911109C0209190
:1012B000E80022FFF3CF25FDF1CF2BE62093E800D5 :1012B000E80022FFF3CF25FDF1CF2BE62093E800D5
:1012C0008FBF2085318537FD03C09F3F09F09F5FA9 :1012C0008FBF2085318537FD03C09F3F09F09F5FA9
:1012D000892F90E00895CF93DF93EC01888599855D :1012D000892F90E00895CF93DF93EC01888599855D
:1012E00097FF09C0E881F9810680F781E02DCE01E2 :1012E00097FF09C0E881F9810680F781E02DCE01E2
:1012F00009959987888788859985DF91CF91089589 :1012F00009959987888788859985DF91CF91089589
:10130000FC012085318537FD07C04FEF5FEF518726 :10130000FC012085318537FD07C04FEF5FEF518726
:101310004087C901992708959FB7F89480915B028F :101310004087C901992708959FB7F89480915B028F
:10132000882369F083E08093E9002BE68091E80050 :10132000882369F083E08093E9002BE68091E80050
:1013300085FD09C082FF03C02093E800F7CF9FBF5F :1013300085FD09C082FF03C02093E800F7CF9FBF5F
:101340008FEF9FEF08958091F1002091E80025FD37 :101340008FEF9FEF08958091F1002091E80025FD37
:1013500003C02BE62093E8009FBF90E00895DF9242 :1013500003C02BE62093E8009FBF90E00895DF9242
:10136000EF92FF920F931F93CF93DF938C01EB01CA :10136000EF92FF920F931F93CF93DF938C01EB01CA
:1013700080915B02882371F07FB7F89484E08093BA :1013700080915B02882371F07FB7F89484E08093BA
:10138000E90080914C02882369F08091E80085FD96 :10138000E90080914C02882369F08091E80085FD96
:1013900007C07FBF81E0F801828320E030E0D1C048 :1013900007C07FBF81E0F801828320E030E0D1C048
:1013A00010924C0220E030E064E080E4F82EA1EFDF :1013A00010924C0220E030E064E080E4F82EA1EFDF
:1013B000B0E09AE3E92EE3E0DE2E4115510509F491 :1013B000B0E09AE3E92EE3E0DE2E4115510509F491
:1013C000BFC08091E400815F9091E80095FD16C058 :1013C000BFC08091E400815F9091E80095FD16C058
:1013D0007FBF9091E400981304C081E080934C0299 :1013D0007FBF9091E400981304C081E080934C0299
:1013E00005C090915B02911104C081E0F8018283F5 :1013E00005C090915B02911104C081E0F8018283F5
:1013F000A8C07FB7F8946093E900E6CF8091F2002F :1013F000A8C07FB7F8946093E900E6CF8091F2002F
:101400009F2D981BE92FF0E04E175F0708F4942FEB :101400009F2D981BE92FF0E04E175F0708F4942FEB
:10141000E92FF0E04E1B5F0B2E0F3F1FE0E4E91BAE :10141000E92FF0E04E1B5F0B2E0F3F1FE0E4E91BAE
:10142000E03428F4EE0FFF27E85EF54F099480C002 :10142000E03428F4EE0FFF27E85EF54F099480C002
:1014300099919C9399919C9399919C9399919C9348 :1014300099919C9399919C9399919C9399919C9348
:1014400099919C9399919C9399919C9399919C9338 :1014400099919C9399919C9399919C9399919C9338
:1014500099919C9399919C9399919C9399919C9328 :1014500099919C9399919C9399919C9399919C9328
:1014600099919C9399919C9399919C9399919C9318 :1014600099919C9399919C9399919C9399919C9318
:1014700099919C9399919C9399919C9399919C9308 :1014700099919C9399919C9399919C9399919C9308
:1014800099919C9399919C9399919C9399919C93F8 :1014800099919C9399919C9399919C9399919C93F8
:1014900099919C9399919C9399919C9399919C93E8 :1014900099919C9399919C9399919C9399919C93E8
:1014A00099919C9399919C9399919C9399919C93D8 :1014A00099919C9399919C9399919C9399919C93D8
:1014B00099919C9399919C9399919C9399919C93C8 :1014B00099919C9399919C9399919C9399919C93C8
:1014C00099919C9399919C9399919C9399919C93B8 :1014C00099919C9399919C9399919C9399919C93B8
:1014D00099919C9399919C9399919C9399919C93A8 :1014D00099919C9399919C9399919C9399919C93A8
:1014E00099919C9399919C9399919C9399919C9398 :1014E00099919C9399919C9399919C9399919C9398
:1014F00099919C9399919C9399919C9399919C9388 :1014F00099919C9399919C9399919C9399919C9388
:1015000099919C9399919C9399919C9399919C9377 :1015000099919C9399919C9399919C9399919C9377
:1015100099919C9399919C9399919C9399919C9367 :1015100099919C9399919C9399919C9399919C9367
:1015200099919C9399919C9399919C9399919C9357 :1015200099919C9399919C9399919C9399919C9357
:101530008091E80085FFE092E800D0924E023DCF16 :101530008091E80085FFE092E800D0924E023DCF16
:101540007FBFC901DF91CF911F910F91FF90EF9065 :101540007FBFC901DF91CF911F910F91FF90EF9065
:10155000DF9008952FEF3FEFFC01318720877DDC7E :10155000DF9008952FEF3FEFFC01318720877DDC7E
:101560000FB6F8948091440290914502A0914602F2 :101560000FB6F8948091440290914502A0914602F2
:10157000B09147020FBE9C0180915B02882329F045 :10157000B09147020FBE9C0180915B02882329F045
:1015800068EC70E080E090E029CC80915A028823DA :1015800068EC70E080E090E029CC80915A028823DA
:1015900001F10FB6F8948091440290914502A09118 :1015900001F10FB6F8948091440290914502A09118
:1015A0004602B09147020FBE40915A02442389F08F :1015A0004602B09147020FBE40915A02442389F08F
:1015B0000FB6F89440914402509145026091460262 :1015B0000FB6F89440914402509145026091460262
:1015C000709147020FBE481B590B4B3F510560F30A :1015C000709147020FBE481B590B4B3F510560F30A
:1015D00011C00FB6F8948091440290914502A091F9 :1015D00011C00FB6F8948091440290914502A091F9
:1015E0004602B09147020FBE821B930B853C994087 :1015E0004602B09147020FBE821B930B853C994087
:1015F00008F4C2CF08959FB7F89480915B028823C6 :1015F00008F4C2CF08959FB7F89480915B028823C6
:1016000021F080914E02811102C09FBF089584E0B5 :1016000021F080914E02811102C09FBF089584E0B5
:101610008093E9008AE38093E80010924E02F5CFB0 :101610008093E9008AE38093E80010924E02F5CFB0
:10162000EACFEFE4F2E08AE0DF011D928A95E9F764 :10162000EACFEFE4F2E08AE0DF011D928A95E9F764
:1016300088EE93E0A0E0B0E083839483A583B68333 :1016300088EE93E0A0E0B0E083839483A583B68333
:1016400085E191E0918380830895EE0FFF1F05905F :1016400085E191E0918380830895EE0FFF1F05905F
:0A165000F491E02D0994F894FFCF07 :0A165000F491E02D0994F894FFCF07
:10165A00088000E10000000008415652204953501A :10165A00088000E10000000008415652204953501A
:10166A0000000000003109AF09470980096B091021 :10166A0000000000003109AF09470980096B091021
:02167A000B0063 :02167A000B0063
:00000001FF :00000001FF