diff options
author | Matthieu Leurent <mleurent@semtech.com> | 2015-03-11 20:15:40 +0100 |
---|---|---|
committer | Matthieu Leurent <mleurent@semtech.com> | 2015-03-11 20:15:40 +0100 |
commit | 45be5ff473ad1f39829bfcebc641201ae46c1c80 (patch) | |
tree | 5d0720fb06e9bb35ce2c8c2f0749b41a7b42c41a | |
parent | be5c8ac770bc5b142e2c6a47702d9ac653141371 (diff) | |
download | lora_gateway-45be5ff473ad1f39829bfcebc641201ae46c1c80.tar.gz lora_gateway-45be5ff473ad1f39829bfcebc641201ae46c1c80.tar.bz2 lora_gateway-45be5ff473ad1f39829bfcebc641201ae46c1c80.zip |
- Added support for Kerlink 868 27dBm gateway
- Updated global_conf.eu868.json (in packet logger) to new LoRaWAN frequency plan
- Added version numbers to AGC, arbiter and calibration firmware (those versions are checked at startup)
- Added test_loragw_cal to test radio calibrations
- Fixed minor bug in error coverage in register read/write functions
/!\ warning: Kerlink 868 27dBm gateway includes a FPGA that MUST be programmed before running any application
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | libloragw/Makefile | 12 | ||||
-rw-r--r-- | libloragw/inc/loragw_hal.h | 2 | ||||
-rw-r--r-- | libloragw/library.cfg | 1 | ||||
-rw-r--r-- | libloragw/src/agc_fw.var | 350 | ||||
-rw-r--r-- | libloragw/src/arb_fw.var | 98 | ||||
-rw-r--r-- | libloragw/src/cal_fw.var | 734 | ||||
-rw-r--r-- | libloragw/src/loragw_hal.c | 91 | ||||
-rw-r--r-- | libloragw/src/loragw_reg.c | 8 | ||||
-rw-r--r-- | libloragw/tst/test_loragw_cal.c | 700 | ||||
-rw-r--r-- | readme.md | 10 | ||||
-rw-r--r-- | util_pkt_logger/cfg/global_conf.eu868.json | 68 |
12 files changed, 1441 insertions, 635 deletions
@@ -1 +1 @@ -1.7.0
\ No newline at end of file +2.0.0
\ No newline at end of file diff --git a/libloragw/Makefile b/libloragw/Makefile index 2b2090e..4a1f5ca 100644 --- a/libloragw/Makefile +++ b/libloragw/Makefile @@ -99,6 +99,9 @@ else ifeq ($(CFG_BRD),ref_1301_433) else ifeq ($(CFG_BRD),kerlink_868) CFG_BRD_MSG := Kerlink LoRa 868MHz gateway CFG_BRD_OPT := CFG_BRD_KERLINK868 +else ifeq ($(CFG_BRD),kerlink_868_27dbm) + CFG_BRD_MSG := Kerlink LoRa 868MHz gateway with 27dBm capability + CFG_BRD_OPT := CFG_BRD_KERLINK868_27DBM else ifeq ($(CFG_BRD),kerlink_433) CFG_BRD_MSG := Kerlink LoRa 433MHz gateway CFG_BRD_OPT := CFG_BRD_KERLINK433 @@ -132,14 +135,14 @@ endif ### linking options ifeq ($(CFG_SPI),native) - LIBS := -lloragw -lrt + LIBS := -lloragw -lrt -lm else ifeq ($(CFG_SPI),ftdi) - LIBS := -lloragw -lrt -lmpsse + LIBS := -lloragw -lrt -lmpsse -lm endif ### general build targets -all: libloragw.a test_loragw_spi test_loragw_reg test_loragw_hal test_loragw_gps +all: libloragw.a test_loragw_spi test_loragw_reg test_loragw_hal test_loragw_gps test_loragw_cal clean: rm -f libloragw.a @@ -227,4 +230,7 @@ test_loragw_hal: tst/test_loragw_hal.c libloragw.a test_loragw_gps: tst/test_loragw_gps.c libloragw.a $(CC) $(CFLAGS) -L. $< -o $@ $(LIBS) +test_loragw_cal: tst/test_loragw_cal.c libloragw.a src/cal_fw.var + $(CC) $(CFLAGS) -L. $< -o $@ $(LIBS) + ### EOF
\ No newline at end of file diff --git a/libloragw/inc/loragw_hal.h b/libloragw/inc/loragw_hal.h index 1516b65..8196f70 100644 --- a/libloragw/inc/loragw_hal.h +++ b/libloragw/inc/loragw_hal.h @@ -141,7 +141,7 @@ Maintainer: Sylvain Miermont #if (CFG_BRD_NANO868 == 1) #define LGW_RF_TX_ENABLE { true, true} /* both radio A and B are usable in TX */ #define LGW_RF_CLKOUT { true, true} /* both radios have clkout enabled */ -#elif ((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1) || (CFG_BRD_KERLINK868 == 1) || (CFG_BRD_KERLINK433 == 1)) +#elif ((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1) || (CFG_BRD_KERLINK868 == 1) || (CFG_BRD_KERLINK868_27DBM == 1) || (CFG_BRD_KERLINK433 == 1)) #define LGW_RF_TX_ENABLE { true,false} /* radio B TX output is disconnected */ #define LGW_RF_CLKOUT {false, true} /* radio A clkout disabled for spur optimization */ #elif ((CFG_BRD_CISCO433 == 1) || (CFG_BRD_CISCO470 == 1) || (CFG_BRD_CISCO780 == 1)) diff --git a/libloragw/library.cfg b/libloragw/library.cfg index 52ca305..748aafb 100644 --- a/libloragw/library.cfg +++ b/libloragw/library.cfg @@ -42,6 +42,7 @@ CFG_BAND= eu868 # ref_1301_868 SX1301 reference board with SX1257 radios, 868 MHz filters # ref_1301_433 SX1301 reference board with SX1255 radios, 433 MHz filters # kerlink_868 Kerlink LoRa 868MHz gateway +# kerlink_868_27dbm Kerlink LoRa 868MHz gateway with 27dBm capability # kerlink_433 Kerlink LoRa 433MHz gateway # cisco_433 Cisco LoRa 433MHz gateway # cisco_470 Cisco LoRa 470MHz gateway diff --git a/libloragw/src/agc_fw.var b/libloragw/src/agc_fw.var index 626f172..5083a0e 100644 --- a/libloragw/src/agc_fw.var +++ b/libloragw/src/agc_fw.var @@ -16,186 +16,186 @@ Maintainer: Matthieu Leurent static uint8_t agc_firmware[MCU_AGC_FW_BYTE] = { 0x8A, 0x51, 0x11, 0x28, 0xFF, 0xBF, 0xFF, 0xBF, 0x80, 0x40, 0x03, 0x4E, 0x83, 0x52, 0x03, 0x53, 0xAC, 0x00, 0x04, 0x88, 0xAD, 0x40, 0x0A, 0xC8, 0xAE, 0x40, 0x01, 0x88, 0xAF, 0x80, 0x8A, 0x51, -0x13, 0x68, 0x8A, 0x51, 0x57, 0x6D, 0x8B, 0xDC, 0x1A, 0x68, 0x9F, 0xE0, 0x8A, 0x51, 0x27, 0x60, +0x13, 0x68, 0x8A, 0x51, 0x59, 0x2D, 0x8B, 0xDC, 0x1A, 0x68, 0xA0, 0xE0, 0x8A, 0x51, 0x27, 0x60, 0x40, 0xF0, 0x9B, 0x40, 0x10, 0xF0, 0x8B, 0x00, 0x2F, 0x88, 0x81, 0x80, 0x2E, 0x48, 0x8A, 0xC0, 0x2D, 0x48, 0x84, 0x80, 0x2C, 0x8E, 0x83, 0xC0, 0x80, 0x0E, 0x00, 0xCE, 0x09, 0x80, 0x95, 0x41, 0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x9E, 0x81, -0x19, 0x54, 0x19, 0x95, 0x8B, 0x41, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, 0x58, 0x68, -0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x80, 0x81, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, -0x07, 0x70, 0x80, 0x40, 0x54, 0x08, 0x71, 0x60, 0x8A, 0x51, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, -0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x54, 0x9C, 0x51, 0x68, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, -0x54, 0x68, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0xD4, 0x8A, 0x34, 0x68, -0xD3, 0x81, 0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x6E, 0xE8, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, -0x04, 0xF0, 0x83, 0x93, 0x80, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, -0x53, 0x48, 0x95, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD3, 0xCA, 0x59, 0xA8, 0x10, 0xF0, 0x9B, 0x40, -0x08, 0x40, 0xAB, 0x40, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xAA, 0x00, 0x23, 0x3E, 0x84, 0x80, -0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xA7, 0x40, 0x05, 0x30, 0x03, 0xD0, 0xA7, 0x0D, 0xFF, 0x7E, -0x03, 0x9D, 0x7D, 0x28, 0x2A, 0x08, 0x2D, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, -0xA8, 0xC0, 0x28, 0x47, 0x27, 0x44, 0x01, 0x38, 0xA9, 0x00, 0x2B, 0x48, 0x22, 0xFE, 0x84, 0x80, -0x29, 0x08, 0x80, 0x40, 0x2B, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x83, 0x96, 0xA0, 0x80, -0x83, 0x52, 0x2B, 0x48, 0x83, 0x96, 0xA1, 0xC0, 0x0C, 0x30, 0xD2, 0xA1, 0x08, 0x40, 0x18, 0x12, -0x80, 0xF0, 0x9B, 0x40, 0x10, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0xAA, 0xA8, 0x83, 0x52, 0x03, 0x53, -0x18, 0x14, 0xAD, 0xE8, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x92, 0x1F, 0xB3, 0xE8, 0x83, 0x96, -0x03, 0x53, 0xA4, 0x54, 0xB6, 0xE8, 0x83, 0x96, 0x03, 0x53, 0xA4, 0x10, 0x83, 0x52, 0x12, 0xDF, -0xBD, 0x28, 0x83, 0x96, 0x03, 0x53, 0x24, 0x14, 0xC0, 0x28, 0x83, 0x96, 0x03, 0x53, 0x24, 0xD0, -0x83, 0x52, 0x5F, 0xC8, 0xA7, 0x40, 0x06, 0x30, 0x03, 0xD0, 0xA7, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, -0xC4, 0x68, 0x12, 0xC8, 0x3F, 0xB9, 0x27, 0x44, 0xA5, 0x00, 0x83, 0x96, 0x24, 0x5C, 0xD2, 0xA8, -0x83, 0x52, 0x9E, 0x15, 0x83, 0x52, 0x13, 0x08, 0x0F, 0x39, 0x3F, 0xFE, 0x84, 0x80, 0x83, 0x93, -0x00, 0x48, 0xA1, 0xC0, 0x21, 0xC8, 0xA9, 0x00, 0x3F, 0x30, 0xA9, 0x85, 0x29, 0x08, 0x83, 0x96, -0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x08, 0xF0, -0xD2, 0xA1, 0x8A, 0x51, 0x21, 0xDF, 0xF0, 0xA8, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, 0xF3, 0x28, -0x83, 0x52, 0x03, 0x53, 0x19, 0x52, 0xA1, 0x1F, 0xF9, 0x28, 0x83, 0x52, 0x03, 0x53, 0x99, 0xD6, -0xFC, 0x28, 0x83, 0x52, 0x03, 0x53, 0x99, 0x92, 0x83, 0x96, 0xA4, 0x9C, 0x0C, 0x69, 0x6C, 0xB0, -0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x0A, 0x30, -0xD2, 0xA1, 0x8A, 0x51, 0x04, 0xF0, 0x18, 0x69, 0x60, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, -0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x0A, 0x30, 0xD2, 0xA1, 0x8A, 0x51, 0x05, 0x30, -0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, -0x0B, 0x70, 0xD2, 0xA1, 0x8A, 0x51, 0x25, 0x08, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, -0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x04, 0xF0, 0xD2, 0xA1, 0x8A, 0x51, 0x11, 0xC8, +0x19, 0x54, 0x19, 0x95, 0x18, 0x56, 0x8B, 0x41, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, +0x59, 0xA8, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x80, 0x81, 0x54, 0x08, 0x5D, 0xBE, +0x84, 0x80, 0x07, 0x70, 0x80, 0x40, 0x54, 0x08, 0x72, 0x60, 0x8A, 0x51, 0x54, 0x08, 0x5D, 0xBE, +0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x54, 0x9C, 0x52, 0x68, 0x83, 0x52, 0x03, 0x53, +0x18, 0x14, 0x55, 0xA8, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0xD4, 0x8A, +0x35, 0xA8, 0xD3, 0x81, 0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x6F, 0x28, 0x53, 0x48, 0x55, 0x7E, +0x84, 0x80, 0x04, 0xF0, 0x83, 0x93, 0x80, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, +0x96, 0x00, 0x53, 0x48, 0x95, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD3, 0xCA, 0x5A, 0xA8, 0x10, 0xF0, +0x9B, 0x40, 0x08, 0x40, 0xAB, 0x40, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xAA, 0x00, 0x23, 0x3E, +0x84, 0x80, 0x8A, 0x51, 0x1D, 0xE5, 0x8A, 0x51, 0xA7, 0x40, 0x05, 0x30, 0x03, 0xD0, 0xA7, 0x0D, +0xFF, 0x7E, 0x03, 0x9D, 0x7E, 0x28, 0x2A, 0x08, 0x2D, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x1D, 0xE5, +0x8A, 0x51, 0xA8, 0xC0, 0x28, 0x47, 0x27, 0x44, 0x01, 0x38, 0xA9, 0x00, 0x2B, 0x48, 0x22, 0xFE, +0x84, 0x80, 0x29, 0x08, 0x80, 0x40, 0x2B, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x83, 0x96, +0xA0, 0x80, 0x83, 0x52, 0x2B, 0x48, 0x83, 0x96, 0xA1, 0xC0, 0x0C, 0x30, 0xD3, 0xE1, 0x08, 0x40, +0x18, 0x12, 0x80, 0xF0, 0x9B, 0x40, 0x10, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0xAB, 0xE8, 0x83, 0x52, +0x03, 0x53, 0x18, 0x14, 0xAE, 0xE8, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x92, 0x1F, 0xB4, 0xA8, +0x83, 0x96, 0x03, 0x53, 0xA4, 0x54, 0xB7, 0x28, 0x83, 0x96, 0x03, 0x53, 0xA4, 0x10, 0x83, 0x52, +0x12, 0xDF, 0xBE, 0x28, 0x83, 0x96, 0x03, 0x53, 0x24, 0x14, 0xC1, 0x68, 0x83, 0x96, 0x03, 0x53, +0x24, 0xD0, 0x83, 0x52, 0x5F, 0xC8, 0xA7, 0x40, 0x06, 0x30, 0x03, 0xD0, 0xA7, 0x0D, 0xFF, 0x7E, +0x03, 0x9D, 0xC5, 0xA8, 0x12, 0xC8, 0x3F, 0xB9, 0x27, 0x44, 0xA5, 0x00, 0x83, 0x96, 0x24, 0x5C, +0xD3, 0xE8, 0x83, 0x52, 0x9E, 0x15, 0x83, 0x52, 0x13, 0x08, 0x0F, 0x39, 0x3F, 0xFE, 0x84, 0x80, +0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, 0x21, 0xC8, 0xA9, 0x00, 0x3F, 0x30, 0xA9, 0x85, 0x29, 0x08, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, -0x05, 0x30, 0xD2, 0xA1, 0x8A, 0x51, 0x10, 0x88, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, -0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x06, 0x30, 0xD2, 0xA1, 0x8A, 0x51, 0x83, 0x96, -0x00, 0xB0, 0xA0, 0xC1, 0xA0, 0x0A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, -0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x35, 0xB0, 0xA7, 0x40, 0xA7, 0x0B, 0x55, 0xE9, 0x05, 0x30, -0x83, 0x96, 0x03, 0x53, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, -0xA1, 0xC0, 0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x03, 0x30, 0xA8, 0xC0, 0x7D, 0x30, 0xA7, 0x40, -0xA7, 0x0B, 0x68, 0xA9, 0xA8, 0x8B, 0x68, 0xA9, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x72, 0xE9, -0x19, 0x51, 0x73, 0x29, 0x19, 0x10, 0x05, 0x30, 0xA7, 0x40, 0xA7, 0x0B, 0x75, 0x29, 0x83, 0x52, -0x03, 0x53, 0x13, 0x1F, 0x7D, 0x69, 0x99, 0xD5, 0x7E, 0x69, 0x99, 0x94, 0x15, 0x70, 0xA8, 0xC0, -0xC6, 0xB0, 0xA7, 0x40, 0xA7, 0x0B, 0x82, 0x69, 0xA8, 0x8B, 0x82, 0x69, 0x00, 0x00, 0x0D, 0x70, -0x83, 0x96, 0x03, 0x53, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, -0xA1, 0xC0, 0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x93, 0x1B, 0x94, 0xA9, 0x99, 0x92, 0x19, 0x52, +0x08, 0xF0, 0xD3, 0xE1, 0x8A, 0x51, 0x21, 0xDF, 0xF1, 0xE8, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, +0xF4, 0xE8, 0x83, 0x52, 0x03, 0x53, 0x19, 0x52, 0xA1, 0x1F, 0xFA, 0x28, 0x83, 0x52, 0x03, 0x53, +0x99, 0xD6, 0xFD, 0x68, 0x83, 0x52, 0x03, 0x53, 0x99, 0x92, 0x83, 0x96, 0xA4, 0x9C, 0x0D, 0xA9, +0x6C, 0xB0, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, +0x0A, 0x30, 0xD3, 0xE1, 0x8A, 0x51, 0x04, 0xF0, 0x19, 0xA9, 0x60, 0x30, 0xA0, 0x80, 0x00, 0xB0, +0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x0A, 0x30, 0xD3, 0xE1, 0x8A, 0x51, +0x05, 0x30, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA1, 0xC0, 0x0B, 0x70, 0xD3, 0xE1, 0x8A, 0x51, 0x25, 0x08, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, +0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x04, 0xF0, 0xD3, 0xE1, 0x8A, 0x51, +0x11, 0xC8, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA1, 0xC0, 0x05, 0x30, 0xD3, 0xE1, 0x8A, 0x51, 0x10, 0x88, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, +0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA1, 0xC0, 0x06, 0x30, 0xD3, 0xE1, 0x8A, 0x51, 0x83, 0x96, 0x00, 0xB0, 0xA0, 0xC1, 0xA0, 0x0A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, -0xA1, 0xC0, 0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x13, 0x1F, 0xA8, 0xA9, 0x99, 0x91, 0xA9, 0xE9, -0x99, 0x50, 0xE4, 0xB0, 0xA7, 0x40, 0xAC, 0xE9, 0xAD, 0x29, 0xA7, 0x0B, 0xAB, 0x29, 0xB0, 0xA9, -0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0xB7, 0x69, 0x19, 0x95, 0xB8, 0xE9, 0x19, 0x54, -0x03, 0x30, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, -0xA1, 0xC0, 0x00, 0xB0, 0xD2, 0xA1, 0x8A, 0x51, 0x05, 0x30, 0xA8, 0xC0, 0x26, 0x70, 0xA7, 0x40, -0xA7, 0x0B, 0xC8, 0xA9, 0xA8, 0x8B, 0xC8, 0xA9, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56, -0x9E, 0x81, 0x08, 0x40, 0x83, 0x52, 0xA6, 0x00, 0x83, 0x96, 0x21, 0xC8, 0x03, 0x59, 0xDF, 0xA9, -0x20, 0x88, 0x83, 0x52, 0x88, 0x80, 0x26, 0x08, 0x80, 0x38, 0x86, 0xC0, 0x08, 0x40, 0x20, 0x88, -0x83, 0x52, 0x88, 0x80, 0x26, 0x08, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, 0x95, 0x41, 0x96, 0x41, -0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x9E, 0x81, 0x19, 0x54, -0x19, 0x95, 0x8B, 0x41, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, 0x17, 0xEA, 0x54, 0x08, -0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x80, 0x81, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x07, 0x70, -0x80, 0x40, 0x54, 0x08, 0x30, 0x22, 0x8A, 0x51, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x00, 0xCE, -0xF0, 0x39, 0x96, 0x00, 0x54, 0x9C, 0x10, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x13, 0xAA, -0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0xD4, 0x8A, 0xF3, 0x69, 0xD3, 0x81, -0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x2D, 0xEA, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x04, 0xF0, -0x83, 0x93, 0x80, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x53, 0x48, -0x95, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD3, 0xCA, 0x18, 0x6A, 0x10, 0xF0, 0x9B, 0x40, 0x08, 0x40, -0xB5, 0x40, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xB4, 0x00, 0x23, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x1B, 0xE5, 0x8A, 0x51, 0xB1, 0x00, 0x05, 0x30, 0x03, 0xD0, 0xB1, 0xCD, 0xFF, 0x7E, 0x03, 0x9D, -0x3C, 0xEA, 0x34, 0x08, 0x2D, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xB2, 0x00, -0x32, 0x87, 0x31, 0x04, 0x01, 0x38, 0xB3, 0x40, 0x35, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x33, 0x48, -0x80, 0x40, 0x35, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x83, 0x96, 0xA2, 0xC0, 0x83, 0x52, -0x35, 0x48, 0x83, 0x96, 0xA3, 0x00, 0x0C, 0x30, 0x90, 0xAB, 0x18, 0x12, 0x80, 0xF0, 0x9B, 0x40, -0x10, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0x68, 0xAA, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x6B, 0x2A, -0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x92, 0x1F, 0x71, 0xEA, 0x83, 0x96, 0x03, 0x53, 0xA4, 0x54, -0x74, 0xEA, 0x83, 0x96, 0x03, 0x53, 0xA4, 0x10, 0x83, 0x52, 0x12, 0xDF, 0x7B, 0x6A, 0x83, 0x96, -0x03, 0x53, 0x24, 0x14, 0x7E, 0x6A, 0x83, 0x96, 0x03, 0x53, 0x24, 0xD0, 0x83, 0x52, 0x5F, 0xC8, -0xB1, 0x00, 0x06, 0x30, 0x03, 0xD0, 0xB1, 0xCD, 0xFF, 0x7E, 0x03, 0x9D, 0x82, 0x6A, 0x12, 0xC8, -0x3F, 0xB9, 0x31, 0x04, 0xA5, 0x00, 0x83, 0x96, 0x24, 0x5C, 0x90, 0x6A, 0x83, 0x52, 0x9E, 0x15, -0x83, 0x52, 0x13, 0x08, 0x0F, 0x39, 0x3F, 0xFE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, -0x21, 0xC8, 0xB3, 0x40, 0x3F, 0x30, 0xB3, 0xC5, 0x33, 0x48, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, -0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x08, 0xF0, 0x90, 0x63, 0x8A, 0x51, -0x21, 0xDF, 0xAE, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, 0xB1, 0xEA, 0x83, 0x52, 0x03, 0x53, -0x19, 0x52, 0xA1, 0x1F, 0xB7, 0x6A, 0x83, 0x52, 0x03, 0x53, 0x99, 0xD6, 0xBA, 0x2A, 0x83, 0x52, -0x03, 0x53, 0x99, 0x92, 0x83, 0x96, 0xA4, 0x9C, 0xCA, 0xEA, 0x6C, 0xB0, 0xA2, 0xC0, 0x00, 0xB0, -0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x0A, 0x30, 0x90, 0x63, 0x8A, 0x51, -0x04, 0xF0, 0xD6, 0x2A, 0x60, 0x30, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, -0x83, 0x96, 0xA3, 0x00, 0x0A, 0x30, 0x90, 0x63, 0x8A, 0x51, 0x05, 0x30, 0x83, 0x96, 0xA2, 0xC0, -0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x0B, 0x70, 0x90, 0x63, -0x8A, 0x51, 0x25, 0x08, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, -0x83, 0x96, 0xA3, 0x00, 0x04, 0xF0, 0x90, 0x63, 0x8A, 0x51, 0x11, 0xC8, 0x83, 0x96, 0xA2, 0xC0, -0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x05, 0x30, 0x90, 0x63, -0x8A, 0x51, 0x10, 0x88, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, -0x83, 0x96, 0xA3, 0x00, 0x06, 0x30, 0x90, 0x63, 0x8A, 0x51, 0x83, 0x96, 0x00, 0xB0, 0xA2, 0x01, -0xA2, 0x4A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, 0x90, 0x63, -0x8A, 0x51, 0x35, 0xB0, 0xB1, 0x00, 0xB1, 0xCB, 0x13, 0xEB, 0x05, 0x30, 0x83, 0x96, 0x03, 0x53, -0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, -0x90, 0x63, 0x8A, 0x51, 0x03, 0x30, 0xB2, 0x00, 0x7D, 0x30, 0xB1, 0x00, 0xB1, 0xCB, 0x26, 0xEB, -0xB2, 0xCB, 0x26, 0xEB, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x30, 0xAB, 0x19, 0x51, 0x31, 0xEB, -0x19, 0x10, 0x05, 0x30, 0xB1, 0x00, 0xB1, 0xCB, 0x33, 0x2B, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, -0x3B, 0x6B, 0x99, 0xD5, 0x3C, 0x2B, 0x99, 0x94, 0x15, 0x70, 0xB2, 0x00, 0xC6, 0xB0, 0xB1, 0x00, -0xB1, 0xCB, 0x40, 0x6B, 0xB2, 0xCB, 0x40, 0x6B, 0x00, 0x00, 0x0D, 0x70, 0x83, 0x96, 0x03, 0x53, -0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, -0x90, 0x63, 0x8A, 0x51, 0x93, 0x1B, 0x52, 0xEB, 0x99, 0x92, 0x19, 0x52, 0x83, 0x96, 0x00, 0xB0, -0xA2, 0x01, 0xA2, 0x4A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, -0x90, 0x63, 0x8A, 0x51, 0x13, 0x1F, 0x66, 0x2B, 0x99, 0x91, 0x67, 0x6B, 0x99, 0x50, 0xE4, 0xB0, -0xB1, 0x00, 0x6A, 0x2B, 0x6B, 0x6B, 0xB1, 0xCB, 0x69, 0x2B, 0x6E, 0x6B, 0x00, 0x00, 0x83, 0x52, -0x03, 0x53, 0x13, 0x1F, 0x75, 0x6B, 0x19, 0x95, 0x76, 0x6B, 0x19, 0x54, 0x03, 0x30, 0x83, 0x96, -0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x00, 0xB0, -0x90, 0x63, 0x8A, 0x51, 0x05, 0x30, 0xB2, 0x00, 0x26, 0x70, 0xB1, 0x00, 0xB1, 0xCB, 0x86, 0xEB, -0xB2, 0xCB, 0x86, 0xEB, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56, 0x9E, 0x81, 0x08, 0x40, -0x83, 0x52, 0xB0, 0xC0, 0x83, 0x96, 0x23, 0x08, 0x03, 0x59, 0x9D, 0x6B, 0x22, 0xC8, 0x83, 0x52, -0x88, 0x80, 0x30, 0xC8, 0x80, 0x38, 0x86, 0xC0, 0x08, 0x40, 0x22, 0xC8, 0x83, 0x52, 0x88, 0x80, -0x30, 0xC8, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, 0x11, 0x30, 0xBE, 0x80, 0x03, 0x30, 0xA0, 0x80, -0x8A, 0x51, 0xE6, 0xE1, 0x8A, 0x51, 0xBD, 0xC1, 0x10, 0xF0, 0x3D, 0x82, 0x03, 0x18, 0xDB, 0xAB, -0x3E, 0x88, 0x10, 0x7A, 0x03, 0x59, 0xB9, 0x6B, 0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, -0xB0, 0xEB, 0x3D, 0x88, 0x20, 0x38, 0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0xC5, 0x2B, -0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, 0xBC, 0x6B, 0x3E, 0x88, 0x11, 0xBA, 0x03, 0x9D, -0xCC, 0x2B, 0x30, 0x30, 0x9B, 0x40, 0xDB, 0xAB, 0x3D, 0x88, 0x3F, 0xFE, 0x84, 0x80, 0x3E, 0x88, -0x83, 0x93, 0x80, 0x40, 0x3D, 0x88, 0x30, 0x78, 0x9B, 0x40, 0xBD, 0x0A, 0xAC, 0x2B, 0x8A, 0x51, -0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0xD7, 0xAB, 0x20, 0xF0, -0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0xEA, 0x6B, 0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, -0xBE, 0x80, 0xE1, 0x2B, 0x3E, 0x88, 0xDF, 0xC0, 0x5F, 0xC8, 0x30, 0x78, 0x9B, 0x40, 0x3E, 0x88, -0x10, 0x7A, 0x03, 0x59, 0xF8, 0x6B, 0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, 0xEF, 0xEB, -0x20, 0xF0, 0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0x03, 0x6C, 0x8A, 0x51, 0x88, 0x65, -0x8A, 0x51, 0xBE, 0x80, 0xFA, 0xAB, 0x3E, 0x88, 0xBC, 0x40, 0x30, 0x78, 0x9B, 0x40, 0x3E, 0x88, -0x10, 0x7A, 0x03, 0x59, 0x10, 0x2C, 0x8A, 0x51, 0x88, 0x65, 0x8A, 0x51, 0xBE, 0x80, 0x07, 0xAC, -0x40, 0xF0, 0x9B, 0x40, 0x93, 0x5F, 0x19, 0xAC, 0x8A, 0x51, 0x5D, 0xE2, 0x8A, 0x51, 0x40, 0xF0, -0x9B, 0x40, 0xD3, 0x81, 0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x51, 0xAC, 0x53, 0x48, 0x95, 0x00, -0x85, 0x70, 0x0D, 0x02, 0x03, 0x5C, 0x31, 0xAC, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x0E, 0x70, -0x83, 0x93, 0x00, 0x42, 0x03, 0x18, 0x31, 0xAC, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x8A, -0x42, 0x6C, 0x34, 0x70, 0x0D, 0x02, 0x03, 0x18, 0x4F, 0x2C, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, -0x05, 0x30, 0x83, 0x93, 0x00, 0x42, 0x03, 0x5C, 0x4F, 0x2C, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, -0x00, 0x48, 0xFF, 0x7E, 0xB6, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x36, 0x48, 0x80, 0x40, -0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD3, 0xCA, -0x1A, 0xAC, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, 0xC5, 0xEC, 0x54, 0x9C, 0x5C, 0xEC, -0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x5F, 0x6C, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x54, 0x08, -0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0x03, 0x9D, 0x68, 0xAC, 0x64, 0x70, 0x69, 0xEC, -0x73, 0xF0, 0xB7, 0x80, 0x0E, 0x08, 0x37, 0x82, 0x03, 0x18, 0x7A, 0x2C, 0x54, 0x08, 0x5D, 0xBE, -0x84, 0x80, 0x0B, 0x70, 0x00, 0x42, 0x03, 0x18, 0x7A, 0x2C, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, -0x00, 0x8A, 0x8A, 0xAC, 0x2D, 0xB0, 0x0E, 0x02, 0x03, 0x18, 0x98, 0xAC, 0x54, 0x08, 0x5D, 0xBE, -0x84, 0x80, 0x08, 0xF0, 0x00, 0x42, 0x03, 0x5C, 0x98, 0xAC, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, -0x00, 0x48, 0xFF, 0x7E, 0xB6, 0x40, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x36, 0x48, 0x80, 0x40, -0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, -0x24, 0x30, 0x0F, 0x42, 0x03, 0x5C, 0xA8, 0xAC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x09, 0x30, -0x00, 0x42, 0x03, 0x18, 0xA8, 0xAC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x8A, 0xB7, 0x6C, -0x10, 0xF0, 0x0F, 0x42, 0x03, 0x18, 0xC3, 0xEC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x80, 0x88, -0x03, 0x59, 0xC3, 0xEC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xB6, 0x40, -0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x36, 0x48, 0x80, 0x40, 0x54, 0x08, 0x8A, 0x51, 0x30, 0x22, -0x8A, 0x51, 0x98, 0x95, 0x98, 0x51, 0xD4, 0x8A, 0x52, 0xAC, 0x51, 0x08, 0x19, 0x3E, 0x84, 0x80, -0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xBA, 0x40, 0x06, 0x30, 0xE0, 0xC0, 0x5D, 0x88, 0xF9, 0xFE, -0x8A, 0x51, 0x97, 0x25, 0x8A, 0x51, 0xBB, 0x80, 0x3A, 0xC7, 0x97, 0x40, 0x52, 0x08, 0x19, 0x3E, -0x84, 0x80, 0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xBA, 0x40, 0x06, 0x30, 0xE0, 0xC0, 0x5E, 0x88, -0xF9, 0xFE, 0x8A, 0x51, 0x97, 0x25, 0x8A, 0x51, 0xBB, 0x80, 0x3A, 0xC7, 0x9C, 0x00, 0x3C, 0x48, -0x95, 0x00, 0x0D, 0x08, 0xB6, 0x40, 0x03, 0xD0, 0xB6, 0xCC, 0x03, 0xD0, 0xB6, 0xCC, 0x03, 0xD0, -0xB6, 0xCC, 0x36, 0x48, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x1B, 0xE5, 0x8A, 0x51, 0xB9, 0x40, -0x06, 0x30, 0xE0, 0xC0, 0x3C, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xFC, 0xFE, -0x8A, 0x51, 0x97, 0x25, 0x8A, 0x51, 0xB8, 0x00, 0x01, 0xF0, 0xB6, 0x40, 0x3C, 0x8A, 0x0A, 0xAD, -0x03, 0xD0, 0xB6, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, 0x08, 0x6D, 0x36, 0x48, 0x14, 0x05, 0x03, 0x59, -0x14, 0xAD, 0x38, 0x08, 0x1C, 0x87, 0x16, 0xED, 0x38, 0x08, 0x17, 0xC7, 0xB6, 0x40, 0x39, 0x48, -0x36, 0xC7, 0x9A, 0x00, 0x12, 0x6C, 0x05, 0x30, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, -0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x02, 0x34, 0x04, 0x34, -0x05, 0x74, 0x06, 0x74, 0x07, 0xB4, 0x08, 0x34, 0x09, 0x74, 0x0A, 0x74, 0x0A, 0x74, 0x0B, 0xB4, -0x0B, 0xB4, 0x0C, 0x74, 0x0D, 0xB4, 0x0D, 0xB4, 0x0E, 0xB4, 0x0E, 0xB4, 0x0E, 0xB4, 0x0F, 0xF4, -0x0F, 0xF4, 0x00, 0xF4, 0x06, 0x74, 0x0C, 0x74, 0x12, 0x74, 0x18, 0x74, 0x1E, 0xF4, 0x24, 0x74, -0x2A, 0xB4, 0x30, 0x74, 0x36, 0xF4, 0x01, 0x34, 0x01, 0x34, 0x01, 0x34, 0x02, 0x34, 0x03, 0x74, -0x04, 0x34, 0x05, 0x74, 0x05, 0x74, 0x06, 0x74, 0x06, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x09, 0x74, -0x09, 0x74, 0x09, 0x74, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x83, 0x93, -0x51, 0x70, 0x84, 0x80, 0x60, 0x30, 0x8A, 0x51, 0xA5, 0xE5, 0x8A, 0x51, 0x83, 0x96, 0xA4, 0x01, -0x83, 0x52, 0x38, 0x70, 0xBF, 0xC0, 0x3A, 0xB0, 0xC0, 0x80, 0x3C, 0xB0, 0xC1, 0xC0, 0x78, 0xB0, -0xC2, 0xC0, 0x7A, 0xF0, 0xC3, 0x00, 0x7C, 0xF0, 0xC4, 0xC0, 0x7D, 0x30, 0xC5, 0x00, 0x7F, 0x70, -0xC6, 0x00, 0xB9, 0xF0, 0xC7, 0x40, 0xBA, 0xF0, 0xC8, 0xC0, 0xBB, 0x30, 0xC9, 0x00, 0xFA, 0x30, -0xCA, 0x00, 0xFB, 0x70, 0xCB, 0x40, 0xFC, 0x30, 0xCC, 0x00, 0xFD, 0x70, 0xCD, 0x40, 0xFF, 0xB0, -0xCE, 0x40, 0x00, 0xB0, 0xCF, 0x80, 0x01, 0xF0, 0xD0, 0xC0, 0x83, 0x01, 0x8A, 0x51, 0xA4, 0xEB, -0x50, 0xC8, 0xB1, 0x00, 0x4F, 0x88, 0xB0, 0xC0, 0x31, 0x08, 0x30, 0x06, 0x03, 0x59, 0x95, 0x2D, -0x14, 0xC8, 0xB0, 0xC0, 0x14, 0xC8, 0xB1, 0x00, 0x8C, 0xED, 0x31, 0x08, 0x08, 0x40, 0xB1, 0x00, -0xB0, 0x01, 0x60, 0xC8, 0x31, 0x58, 0xB0, 0x87, 0x03, 0xD0, 0xE0, 0x8D, 0x03, 0xD0, 0xB1, 0x8C, -0xB1, 0x48, 0x03, 0x9D, 0x99, 0x2D, 0x30, 0xC8, 0x08, 0x40, 0x64, 0xC0, 0x80, 0x81, 0x84, 0x0A, -0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0xA6, 0x2D, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xA1, 0xC0, 0x00, 0xB0, 0xD3, 0xE1, 0x8A, 0x51, 0x35, 0xB0, 0xA7, 0x40, 0xA7, 0x0B, 0x56, 0xE9, +0x05, 0x30, 0x83, 0x96, 0x03, 0x53, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, +0x83, 0x96, 0xA1, 0xC0, 0x00, 0xB0, 0xD3, 0xE1, 0x8A, 0x51, 0x03, 0x30, 0xA8, 0xC0, 0x7D, 0x30, +0xA7, 0x40, 0xA7, 0x0B, 0x69, 0xE9, 0xA8, 0x8B, 0x69, 0xE9, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, +0x73, 0x29, 0x19, 0x51, 0x74, 0xE9, 0x19, 0x10, 0x05, 0x30, 0xA7, 0x40, 0xA7, 0x0B, 0x76, 0x29, +0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x7E, 0x69, 0x99, 0xD5, 0x7F, 0xA9, 0x99, 0x94, 0x15, 0x70, +0xA8, 0xC0, 0xC6, 0xB0, 0xA7, 0x40, 0xA7, 0x0B, 0x83, 0xA9, 0xA8, 0x8B, 0x83, 0xA9, 0x00, 0x00, +0x0D, 0x70, 0x83, 0x96, 0x03, 0x53, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, +0x83, 0x96, 0xA1, 0xC0, 0x00, 0xB0, 0xD3, 0xE1, 0x8A, 0x51, 0x93, 0x1B, 0x95, 0xE9, 0x99, 0x92, +0x19, 0x52, 0x83, 0x96, 0x00, 0xB0, 0xA0, 0xC1, 0xA0, 0x0A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, +0x83, 0x96, 0xA1, 0xC0, 0x00, 0xB0, 0xD3, 0xE1, 0x8A, 0x51, 0x13, 0x1F, 0xA9, 0xE9, 0x99, 0x91, +0xAA, 0xE9, 0x99, 0x50, 0xE4, 0xB0, 0xA7, 0x40, 0xAD, 0x29, 0xAE, 0x29, 0xA7, 0x0B, 0xAC, 0xE9, +0xB1, 0xE9, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0xB8, 0xE9, 0x19, 0x95, 0xB9, 0x29, +0x19, 0x54, 0x03, 0x30, 0x83, 0x96, 0xA0, 0x80, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, +0x83, 0x96, 0xA1, 0xC0, 0x00, 0xB0, 0xD3, 0xE1, 0x8A, 0x51, 0x05, 0x30, 0xA8, 0xC0, 0x26, 0x70, +0xA7, 0x40, 0xA7, 0x0B, 0xC9, 0xE9, 0xA8, 0x8B, 0xC9, 0xE9, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, +0x18, 0x56, 0x9E, 0x81, 0x08, 0x40, 0x83, 0x52, 0xA6, 0x00, 0x83, 0x96, 0x21, 0xC8, 0x03, 0x59, +0xE0, 0xA9, 0x20, 0x88, 0x83, 0x52, 0x88, 0x80, 0x26, 0x08, 0x80, 0x38, 0x86, 0xC0, 0x08, 0x40, +0x20, 0x88, 0x83, 0x52, 0x88, 0x80, 0x26, 0x08, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, 0x95, 0x41, +0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x9E, 0x81, +0x19, 0x54, 0x19, 0x95, 0x18, 0x56, 0x8B, 0x41, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, +0x19, 0xAA, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x80, 0x81, 0x54, 0x08, 0x5D, 0xBE, +0x84, 0x80, 0x07, 0x70, 0x80, 0x40, 0x54, 0x08, 0x32, 0x62, 0x8A, 0x51, 0x54, 0x08, 0x5D, 0xBE, +0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x54, 0x9C, 0x12, 0x6A, 0x83, 0x52, 0x03, 0x53, +0x18, 0x14, 0x15, 0xAA, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x18, 0x55, 0x18, 0x11, 0xD4, 0x8A, +0xF5, 0x69, 0xD3, 0x81, 0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x2F, 0x2A, 0x53, 0x48, 0x55, 0x7E, +0x84, 0x80, 0x04, 0xF0, 0x83, 0x93, 0x80, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, +0x96, 0x00, 0x53, 0x48, 0x95, 0x00, 0x98, 0x54, 0x98, 0x10, 0xD3, 0xCA, 0x1A, 0xAA, 0x10, 0xF0, +0x9B, 0x40, 0x08, 0x40, 0xB5, 0x40, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xB4, 0x00, 0x23, 0x3E, +0x84, 0x80, 0x8A, 0x51, 0x1D, 0xE5, 0x8A, 0x51, 0xB1, 0x00, 0x05, 0x30, 0x03, 0xD0, 0xB1, 0xCD, +0xFF, 0x7E, 0x03, 0x9D, 0x3E, 0x2A, 0x34, 0x08, 0x2D, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x1D, 0xE5, +0x8A, 0x51, 0xB2, 0x00, 0x32, 0x87, 0x31, 0x04, 0x01, 0x38, 0xB3, 0x40, 0x35, 0x48, 0x22, 0xFE, +0x84, 0x80, 0x33, 0x48, 0x80, 0x40, 0x35, 0x48, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x83, 0x96, +0xA2, 0xC0, 0x83, 0x52, 0x35, 0x48, 0x83, 0x96, 0xA3, 0x00, 0x0C, 0x30, 0x92, 0xEB, 0x18, 0x12, +0x80, 0xF0, 0x9B, 0x40, 0x10, 0xF0, 0x9E, 0x40, 0x13, 0x1F, 0x6A, 0xEA, 0x83, 0x52, 0x03, 0x53, +0x18, 0x14, 0x6D, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x92, 0x1F, 0x73, 0x2A, 0x83, 0x96, +0x03, 0x53, 0xA4, 0x54, 0x76, 0x2A, 0x83, 0x96, 0x03, 0x53, 0xA4, 0x10, 0x83, 0x52, 0x12, 0xDF, +0x7D, 0x6A, 0x83, 0x96, 0x03, 0x53, 0x24, 0x14, 0x80, 0x2A, 0x83, 0x96, 0x03, 0x53, 0x24, 0xD0, +0x83, 0x52, 0x5F, 0xC8, 0xB1, 0x00, 0x06, 0x30, 0x03, 0xD0, 0xB1, 0xCD, 0xFF, 0x7E, 0x03, 0x9D, +0x84, 0x6A, 0x12, 0xC8, 0x3F, 0xB9, 0x31, 0x04, 0xA5, 0x00, 0x83, 0x96, 0x24, 0x5C, 0x92, 0xAA, +0x83, 0x52, 0x9E, 0x15, 0x83, 0x52, 0x13, 0x08, 0x0F, 0x39, 0x3F, 0xFE, 0x84, 0x80, 0x83, 0x93, +0x00, 0x48, 0xA1, 0xC0, 0x21, 0xC8, 0xB3, 0x40, 0x3F, 0x30, 0xB3, 0xC5, 0x33, 0x48, 0x83, 0x96, +0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x08, 0xF0, +0x92, 0xA3, 0x8A, 0x51, 0x21, 0xDF, 0xB0, 0xAA, 0x83, 0x52, 0x03, 0x53, 0x19, 0x96, 0xB3, 0x2A, +0x83, 0x52, 0x03, 0x53, 0x19, 0x52, 0xA1, 0x1F, 0xB9, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x99, 0xD6, +0xBC, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x99, 0x92, 0x83, 0x96, 0xA4, 0x9C, 0xCC, 0xEA, 0x6C, 0xB0, +0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x0A, 0x30, +0x92, 0xA3, 0x8A, 0x51, 0x04, 0xF0, 0xD8, 0xEA, 0x60, 0x30, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, +0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x0A, 0x30, 0x92, 0xA3, 0x8A, 0x51, 0x05, 0x30, +0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, +0x0B, 0x70, 0x92, 0xA3, 0x8A, 0x51, 0x25, 0x08, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, +0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x04, 0xF0, 0x92, 0xA3, 0x8A, 0x51, 0x11, 0xC8, +0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, +0x05, 0x30, 0x92, 0xA3, 0x8A, 0x51, 0x10, 0x88, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, +0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, 0x06, 0x30, 0x92, 0xA3, 0x8A, 0x51, 0x83, 0x96, +0x00, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, 0xA3, 0x00, +0x00, 0xB0, 0x92, 0xA3, 0x8A, 0x51, 0x35, 0xB0, 0xB1, 0x00, 0xB1, 0xCB, 0x15, 0xEB, 0x05, 0x30, +0x83, 0x96, 0x03, 0x53, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA3, 0x00, 0x00, 0xB0, 0x92, 0xA3, 0x8A, 0x51, 0x03, 0x30, 0xB2, 0x00, 0x7D, 0x30, 0xB1, 0x00, +0xB1, 0xCB, 0x28, 0xAB, 0xB2, 0xCB, 0x28, 0xAB, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x32, 0xEB, +0x19, 0x51, 0x33, 0x2B, 0x19, 0x10, 0x05, 0x30, 0xB1, 0x00, 0xB1, 0xCB, 0x35, 0x2B, 0x83, 0x52, +0x03, 0x53, 0x13, 0x1F, 0x3D, 0x6B, 0x99, 0xD5, 0x3E, 0x6B, 0x99, 0x94, 0x15, 0x70, 0xB2, 0x00, +0xC6, 0xB0, 0xB1, 0x00, 0xB1, 0xCB, 0x42, 0xAB, 0xB2, 0xCB, 0x42, 0xAB, 0x00, 0x00, 0x0D, 0x70, +0x83, 0x96, 0x03, 0x53, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA3, 0x00, 0x00, 0xB0, 0x92, 0xA3, 0x8A, 0x51, 0x93, 0x1B, 0x54, 0xEB, 0x99, 0x92, 0x19, 0x52, +0x83, 0x96, 0x00, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA3, 0x00, 0x00, 0xB0, 0x92, 0xA3, 0x8A, 0x51, 0x13, 0x1F, 0x68, 0xEB, 0x99, 0x91, 0x69, 0x2B, +0x99, 0x50, 0xE4, 0xB0, 0xB1, 0x00, 0x6C, 0x2B, 0x6D, 0x6B, 0xB1, 0xCB, 0x6B, 0x6B, 0x70, 0xEB, +0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x13, 0x1F, 0x77, 0xAB, 0x19, 0x95, 0x78, 0x2B, 0x19, 0x54, +0x03, 0x30, 0x83, 0x96, 0xA2, 0xC0, 0x00, 0xB0, 0x83, 0x52, 0x13, 0xDB, 0x01, 0xF0, 0x83, 0x96, +0xA3, 0x00, 0x00, 0xB0, 0x92, 0xA3, 0x8A, 0x51, 0x05, 0x30, 0xB2, 0x00, 0x26, 0x70, 0xB1, 0x00, +0xB1, 0xCB, 0x88, 0xAB, 0xB2, 0xCB, 0x88, 0xAB, 0x00, 0x00, 0x83, 0x52, 0x03, 0x53, 0x18, 0x56, +0x9E, 0x81, 0x08, 0x40, 0x83, 0x52, 0xB0, 0xC0, 0x83, 0x96, 0x23, 0x08, 0x03, 0x59, 0x9F, 0xAB, +0x22, 0xC8, 0x83, 0x52, 0x88, 0x80, 0x30, 0xC8, 0x80, 0x38, 0x86, 0xC0, 0x08, 0x40, 0x22, 0xC8, +0x83, 0x52, 0x88, 0x80, 0x30, 0xC8, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, 0x11, 0x30, 0xBE, 0x80, +0x04, 0xF0, 0xA0, 0x80, 0x8A, 0x51, 0xE7, 0x21, 0x8A, 0x51, 0xBD, 0xC1, 0x10, 0xF0, 0x3D, 0x82, +0x03, 0x18, 0xDD, 0xAB, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x59, 0xBB, 0xAB, 0x8A, 0x51, 0x8A, 0xA5, +0x8A, 0x51, 0xBE, 0x80, 0xB2, 0x2B, 0x3D, 0x88, 0x20, 0x38, 0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, +0x03, 0x9D, 0xC7, 0x6B, 0x8A, 0x51, 0x8A, 0xA5, 0x8A, 0x51, 0xBE, 0x80, 0xBE, 0xAB, 0x3E, 0x88, +0x11, 0xBA, 0x03, 0x9D, 0xCE, 0x6B, 0x30, 0x30, 0x9B, 0x40, 0xDD, 0xAB, 0x3D, 0x88, 0x3F, 0xFE, +0x84, 0x80, 0x3E, 0x88, 0x83, 0x93, 0x80, 0x40, 0x3D, 0x88, 0x30, 0x78, 0x9B, 0x40, 0xBD, 0x0A, +0xAE, 0x6B, 0x8A, 0x51, 0x8A, 0xA5, 0x8A, 0x51, 0xBE, 0x80, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, +0xD9, 0x6B, 0x20, 0xF0, 0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0xEC, 0x6B, 0x8A, 0x51, +0x8A, 0xA5, 0x8A, 0x51, 0xBE, 0x80, 0xE3, 0x6B, 0x3E, 0x88, 0xDF, 0xC0, 0x5F, 0xC8, 0x30, 0x78, +0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x59, 0xFA, 0xAB, 0x8A, 0x51, 0x8A, 0xA5, 0x8A, 0x51, +0xBE, 0x80, 0xF1, 0x6B, 0x20, 0xF0, 0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x9D, 0x05, 0x6C, +0x8A, 0x51, 0x8A, 0xA5, 0x8A, 0x51, 0xBE, 0x80, 0xFC, 0xAB, 0x3E, 0x88, 0xBC, 0x40, 0x30, 0x78, +0x9B, 0x40, 0x3E, 0x88, 0x10, 0x7A, 0x03, 0x59, 0x12, 0x6C, 0x8A, 0x51, 0x8A, 0xA5, 0x8A, 0x51, +0xBE, 0x80, 0x09, 0x6C, 0x40, 0xF0, 0x9B, 0x40, 0x93, 0x5F, 0x1B, 0xEC, 0x8A, 0x51, 0x5F, 0x22, +0x8A, 0x51, 0x40, 0xF0, 0x9B, 0x40, 0xD3, 0x81, 0x08, 0xF0, 0x53, 0x42, 0x03, 0x18, 0x53, 0xEC, +0x53, 0x48, 0x95, 0x00, 0x85, 0x70, 0x0D, 0x02, 0x03, 0x5C, 0x33, 0xEC, 0x53, 0x48, 0x55, 0x7E, +0x84, 0x80, 0x0E, 0x70, 0x83, 0x93, 0x00, 0x42, 0x03, 0x18, 0x33, 0xEC, 0x53, 0x48, 0x55, 0x7E, +0x84, 0x80, 0x00, 0x8A, 0x44, 0x6C, 0x34, 0x70, 0x0D, 0x02, 0x03, 0x18, 0x51, 0xAC, 0x53, 0x48, +0x55, 0x7E, 0x84, 0x80, 0x05, 0x30, 0x83, 0x93, 0x00, 0x42, 0x03, 0x5C, 0x51, 0xAC, 0x53, 0x48, +0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xB6, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, +0x36, 0x48, 0x80, 0x40, 0x53, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x96, 0x00, 0x98, 0x54, +0x98, 0x10, 0xD3, 0xCA, 0x1C, 0xAC, 0xD4, 0x41, 0x02, 0xF0, 0x54, 0x02, 0x03, 0x18, 0xC7, 0x2C, +0x54, 0x9C, 0x5E, 0x2C, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0x61, 0xAC, 0x83, 0x52, 0x03, 0x53, +0x18, 0xD0, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0x03, 0x9D, 0x6A, 0xEC, +0x64, 0x70, 0x6B, 0x2C, 0x73, 0xF0, 0xB7, 0x80, 0x0E, 0x08, 0x37, 0x82, 0x03, 0x18, 0x7C, 0x2C, +0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x0B, 0x70, 0x00, 0x42, 0x03, 0x18, 0x7C, 0x2C, 0x54, 0x08, +0x5D, 0xBE, 0x84, 0x80, 0x00, 0x8A, 0x8C, 0xAC, 0x2D, 0xB0, 0x0E, 0x02, 0x03, 0x18, 0x9A, 0xEC, +0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x08, 0xF0, 0x00, 0x42, 0x03, 0x5C, 0x9A, 0xEC, 0x54, 0x08, +0x5D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xFF, 0x7E, 0xB6, 0x40, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, +0x36, 0x48, 0x80, 0x40, 0x54, 0x08, 0x5D, 0xBE, 0x84, 0x80, 0x00, 0xCE, 0xF0, 0x39, 0x96, 0x00, +0x18, 0x55, 0x18, 0x11, 0x24, 0x30, 0x0F, 0x42, 0x03, 0x5C, 0xAA, 0xEC, 0x54, 0x08, 0x51, 0x3E, +0x84, 0x80, 0x09, 0x30, 0x00, 0x42, 0x03, 0x18, 0xAA, 0xEC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, +0x00, 0x8A, 0xB9, 0x2C, 0x10, 0xF0, 0x0F, 0x42, 0x03, 0x18, 0xC5, 0xEC, 0x54, 0x08, 0x51, 0x3E, +0x84, 0x80, 0x80, 0x88, 0x03, 0x59, 0xC5, 0xEC, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, +0xFF, 0x7E, 0xB6, 0x40, 0x54, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x36, 0x48, 0x80, 0x40, 0x54, 0x08, +0x8A, 0x51, 0x32, 0x62, 0x8A, 0x51, 0x98, 0x95, 0x98, 0x51, 0xD4, 0x8A, 0x54, 0xAC, 0x51, 0x08, +0x19, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x1D, 0xE5, 0x8A, 0x51, 0xBA, 0x40, 0x06, 0x30, 0xE0, 0xC0, +0x5D, 0x88, 0xF9, 0xFE, 0x8A, 0x51, 0x99, 0xE5, 0x8A, 0x51, 0xBB, 0x80, 0x3A, 0xC7, 0x97, 0x40, +0x52, 0x08, 0x19, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x1D, 0xE5, 0x8A, 0x51, 0xBA, 0x40, 0x06, 0x30, +0xE0, 0xC0, 0x5E, 0x88, 0xF9, 0xFE, 0x8A, 0x51, 0x99, 0xE5, 0x8A, 0x51, 0xBB, 0x80, 0x3A, 0xC7, +0x9C, 0x00, 0x3C, 0x48, 0x95, 0x00, 0x0D, 0x08, 0xB6, 0x40, 0x03, 0xD0, 0xB6, 0xCC, 0x03, 0xD0, +0xB6, 0xCC, 0x03, 0xD0, 0xB6, 0xCC, 0x36, 0x48, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x1D, 0xE5, +0x8A, 0x51, 0xB9, 0x40, 0x06, 0x30, 0xE0, 0xC0, 0x3C, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x83, 0x93, +0x00, 0x48, 0xFC, 0xFE, 0x8A, 0x51, 0x99, 0xE5, 0x8A, 0x51, 0xB8, 0x00, 0x01, 0xF0, 0xB6, 0x40, +0x3C, 0x8A, 0x0C, 0xAD, 0x03, 0xD0, 0xB6, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, 0x0A, 0xAD, 0x36, 0x48, +0x14, 0x05, 0x03, 0x59, 0x16, 0xED, 0x38, 0x08, 0x1C, 0x87, 0x18, 0xAD, 0x38, 0x08, 0x17, 0xC7, +0xB6, 0x40, 0x39, 0x48, 0x36, 0xC7, 0x9A, 0x00, 0x14, 0x6C, 0x05, 0x30, 0x8A, 0xC0, 0x04, 0x88, +0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF4, +0x02, 0x34, 0x04, 0x34, 0x05, 0x74, 0x06, 0x74, 0x07, 0xB4, 0x08, 0x34, 0x09, 0x74, 0x0A, 0x74, +0x0A, 0x74, 0x0B, 0xB4, 0x0B, 0xB4, 0x0C, 0x74, 0x0D, 0xB4, 0x0D, 0xB4, 0x0E, 0xB4, 0x0E, 0xB4, +0x0E, 0xB4, 0x0F, 0xF4, 0x0F, 0xF4, 0x00, 0xF4, 0x06, 0x74, 0x0C, 0x74, 0x12, 0x74, 0x18, 0x74, +0x1E, 0xF4, 0x24, 0x74, 0x2A, 0xB4, 0x30, 0x74, 0x36, 0xF4, 0x01, 0x34, 0x01, 0x34, 0x01, 0x34, +0x02, 0x34, 0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x05, 0x74, 0x06, 0x74, 0x06, 0x74, 0x0F, 0xF4, +0x0C, 0x74, 0x09, 0x74, 0x09, 0x74, 0x09, 0x74, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x0F, 0xF4, +0x0C, 0x74, 0x83, 0x93, 0x51, 0x70, 0x84, 0x80, 0x60, 0x30, 0x8A, 0x51, 0xA7, 0x25, 0x8A, 0x51, +0x83, 0x96, 0xA4, 0x01, 0x83, 0x52, 0x38, 0x70, 0xBF, 0xC0, 0x3A, 0xB0, 0xC0, 0x80, 0x3C, 0xB0, +0xC1, 0xC0, 0x78, 0xB0, 0xC2, 0xC0, 0x7A, 0xF0, 0xC3, 0x00, 0x7C, 0xF0, 0xC4, 0xC0, 0x7D, 0x30, +0xC5, 0x00, 0x7F, 0x70, 0xC6, 0x00, 0xB9, 0xF0, 0xC7, 0x40, 0xBA, 0xF0, 0xC8, 0xC0, 0xBB, 0x30, +0xC9, 0x00, 0xFA, 0x30, 0xCA, 0x00, 0xFB, 0x70, 0xCB, 0x40, 0xFC, 0x30, 0xCC, 0x00, 0xFD, 0x70, +0xCD, 0x40, 0xFF, 0xB0, 0xCE, 0x40, 0x00, 0xB0, 0xCF, 0x80, 0x01, 0xF0, 0xD0, 0xC0, 0x83, 0x01, +0x8A, 0x51, 0xA6, 0x2B, 0x50, 0xC8, 0xB1, 0x00, 0x4F, 0x88, 0xB0, 0xC0, 0x31, 0x08, 0x30, 0x06, +0x03, 0x59, 0x97, 0x6D, 0x14, 0xC8, 0xB0, 0xC0, 0x14, 0xC8, 0xB1, 0x00, 0x8E, 0x2D, 0x31, 0x08, +0x08, 0x40, 0xB1, 0x00, 0xB0, 0x01, 0x60, 0xC8, 0x31, 0x58, 0xB0, 0x87, 0x03, 0xD0, 0xE0, 0x8D, +0x03, 0xD0, 0xB1, 0x8C, 0xB1, 0x48, 0x03, 0x9D, 0x9B, 0x6D, 0x30, 0xC8, 0x08, 0x40, 0x64, 0xC0, +0x80, 0x81, 0x84, 0x0A, 0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0xA8, 0xED, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, diff --git a/libloragw/src/arb_fw.var b/libloragw/src/arb_fw.var index 326d7d7..7f06906 100644 --- a/libloragw/src/arb_fw.var +++ b/libloragw/src/arb_fw.var @@ -14,7 +14,7 @@ Maintainer: Matthieu Leurent */ static uint8_t arb_firmware[MCU_ARB_FW_BYTE] = { -0x8A, 0x51, 0x8F, 0x6E, 0x00, 0xB0, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4, +0x8A, 0x51, 0xAE, 0x6E, 0x00, 0xB0, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4, 0x07, 0xB4, 0x06, 0x74, 0x05, 0x74, 0x04, 0x34, 0x03, 0x74, 0x02, 0x34, 0x01, 0x34, 0x00, 0xF4, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, @@ -222,54 +222,54 @@ static uint8_t arb_firmware[MCU_ARB_FW_BYTE] = { 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0x64, 0xC0, -0x80, 0x81, 0x84, 0x0A, 0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0x88, 0xAE, 0xA1, 0x01, -0xA2, 0x01, 0xA3, 0x41, 0x83, 0x93, 0xBB, 0x30, 0x84, 0x80, 0xF0, 0xB0, 0x8A, 0x51, 0x87, 0xE6, -0x83, 0x01, 0x8A, 0x51, 0x9B, 0x6E, 0x8A, 0x51, 0xF0, 0xE6, 0x8A, 0x51, 0x83, 0x52, 0x0D, 0x58, -0xBA, 0x6E, 0x83, 0x96, 0xEC, 0x81, 0x83, 0x52, 0x21, 0x14, 0x83, 0x96, 0x6C, 0x48, 0x8A, 0x51, -0xC1, 0xA6, 0x8A, 0x51, 0x83, 0x52, 0x03, 0x53, 0xA1, 0x9C, 0xB1, 0x2E, 0x8A, 0x51, 0x78, 0x27, -0x8A, 0x51, 0x0D, 0x58, 0x9E, 0x6E, 0x83, 0x96, 0x08, 0xF0, 0xEC, 0xCA, 0x6C, 0x42, 0x03, 0x18, -0x9E, 0x6E, 0xA3, 0x2E, 0x21, 0x5C, 0x9E, 0x6E, 0x8A, 0x51, 0x25, 0xE7, 0x8A, 0x51, 0x21, 0xD0, -0x9E, 0x6E, 0x83, 0x52, 0xA5, 0x00, 0xA1, 0x10, 0x25, 0x08, 0x96, 0x00, 0x15, 0x70, 0xA4, 0xC0, -0xA4, 0x8B, 0xC8, 0xEE, 0x83, 0x52, 0x03, 0x53, 0x8D, 0xDC, 0x08, 0x40, 0xA1, 0x54, 0x15, 0x54, -0x15, 0x70, 0xA4, 0xC0, 0xA4, 0x8B, 0xD2, 0x2E, 0x83, 0x52, 0x03, 0x53, 0x0D, 0xDD, 0xD4, 0x2E, -0x10, 0x88, 0x83, 0x96, 0xED, 0x80, 0x83, 0x52, 0x11, 0xC8, 0x83, 0x96, 0xEE, 0x80, 0x83, 0x52, -0x0F, 0x48, 0xA2, 0xC0, 0x0E, 0x08, 0x83, 0x96, 0xEB, 0x80, 0x83, 0x52, 0x12, 0xC8, 0x83, 0x96, -0xEF, 0xC0, 0x83, 0x52, 0x15, 0x10, 0x15, 0x70, 0xA4, 0xC0, 0xA4, 0x8B, 0xED, 0xAE, 0x08, 0x40, -0x95, 0x41, 0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, -0x9E, 0x81, 0xA3, 0x41, 0x08, 0xF0, 0x23, 0x02, 0x03, 0x18, 0x18, 0xEF, 0x23, 0x08, 0xCB, 0xBE, -0x84, 0x80, 0x80, 0x81, 0x23, 0x08, 0xD3, 0xBE, 0x84, 0x80, 0x80, 0x81, 0x23, 0x08, 0xE3, 0xBE, -0x84, 0x80, 0x80, 0x81, 0x23, 0x08, 0xBB, 0xFE, 0x84, 0x80, 0x80, 0x81, 0x23, 0x08, 0xDB, 0xFE, -0x84, 0x80, 0x80, 0x81, 0x23, 0x08, 0xC3, 0x7E, 0x84, 0x80, 0x80, 0x81, 0xA3, 0x8A, 0xFA, 0xAE, -0x83, 0x96, 0xED, 0xC1, 0xEE, 0xC1, 0x83, 0x52, 0xA2, 0x01, 0x83, 0x96, 0xEB, 0xC1, 0xEF, 0x01, -0x83, 0x52, 0x21, 0xD0, 0xA1, 0x10, 0xA0, 0xC1, 0x08, 0x40, 0xA3, 0x41, 0x08, 0xF0, 0x23, 0x02, -0x03, 0x18, 0x08, 0x40, 0x23, 0x08, 0xC3, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0xCB, 0x76, 0xAF, -0x23, 0x08, 0xC3, 0x7E, 0x84, 0x80, 0x80, 0x81, 0x23, 0x08, 0xDB, 0xFE, 0x84, 0x80, 0x00, 0x48, -0x97, 0x40, 0x23, 0x08, 0xBB, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x98, 0xC0, 0x23, 0x08, 0xCB, 0xBE, -0x84, 0x80, 0x00, 0x48, 0x99, 0x00, 0x23, 0x08, 0xD3, 0xBE, 0x84, 0x80, 0x00, 0x48, 0x9A, 0x00, -0x23, 0x08, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x9B, 0x40, 0x23, 0x08, -0xE3, 0xBE, 0x84, 0x80, 0x00, 0x48, 0x9C, 0x00, 0x95, 0x94, 0x15, 0x70, 0xA4, 0xC0, 0xA4, 0x8B, -0x57, 0xAF, 0x83, 0x52, 0x03, 0x53, 0x95, 0x50, 0x15, 0x70, 0xA4, 0xC0, 0xA4, 0x8B, 0x5E, 0xAF, -0x01, 0xF0, 0x83, 0x52, 0x03, 0x53, 0xA4, 0xC0, 0x23, 0x08, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x01, 0xBE, 0x6E, 0xAF, 0x03, 0xD0, 0xA4, 0x8D, 0xFF, 0x7E, 0x03, 0x9D, -0x6C, 0x6F, 0x24, 0xC8, 0x13, 0x45, 0x03, 0x59, 0x60, 0xEF, 0xA0, 0x0A, 0xA3, 0x8A, 0x26, 0x2F, -0x21, 0x11, 0xA3, 0x41, 0x08, 0xF0, 0x23, 0x02, 0x03, 0x18, 0xB5, 0xAF, 0x0A, 0x30, 0x22, 0xC2, -0x03, 0x18, 0x85, 0x2F, 0x83, 0x52, 0x21, 0x55, 0xB0, 0x2F, 0x01, 0xF0, 0xA4, 0xC0, 0x23, 0x08, -0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x01, 0xBE, 0x91, 0x2F, 0x03, 0xD0, -0xA4, 0x8D, 0xFF, 0x7E, 0x03, 0x9D, 0x8F, 0xAF, 0x24, 0xC8, 0x13, 0x45, 0x03, 0x9D, 0x9E, 0xAF, -0x23, 0x08, 0xC3, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0xCB, 0xB0, 0x2F, 0x23, 0x08, 0xDB, 0xFE, -0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0x83, 0x96, 0x6F, 0x06, 0x03, 0x9D, 0xB0, 0x2F, 0x83, 0x52, -0x23, 0x08, 0xBB, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x83, 0x96, 0x6B, 0xC6, 0x03, 0x59, 0x82, 0xEF, -0x83, 0x52, 0x21, 0x59, 0xB5, 0xAF, 0xA3, 0x8A, 0x7A, 0xAF, 0x21, 0x59, 0x08, 0x40, 0xA3, 0x41, -0x08, 0xF0, 0x23, 0x02, 0x03, 0x18, 0x08, 0x40, 0x01, 0xF0, 0xA4, 0xC0, 0x23, 0x08, 0x01, 0xBE, -0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x01, 0xBE, 0xC8, 0x2F, 0x03, 0xD0, 0xA4, 0x8D, -0xFF, 0x7E, 0x03, 0x9D, 0xC6, 0x6F, 0x24, 0xC8, 0x13, 0x45, 0x03, 0x9D, 0xFE, 0x2F, 0x23, 0x08, -0xC3, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0x03, 0x9D, 0xFE, 0x2F, 0x23, 0x08, 0xCB, 0xBE, -0x84, 0x80, 0x83, 0x96, 0x6D, 0x88, 0x80, 0x40, 0x83, 0x52, 0x23, 0x08, 0xD3, 0xBE, 0x84, 0x80, -0x83, 0x96, 0x6E, 0x88, 0x80, 0x40, 0x83, 0x52, 0x23, 0x08, 0xE3, 0xBE, 0x84, 0x80, 0x22, 0xC8, -0x80, 0x40, 0x23, 0x08, 0xBB, 0xFE, 0x84, 0x80, 0x83, 0x96, 0x6B, 0x88, 0x80, 0x40, 0x83, 0x52, -0x23, 0x08, 0xDB, 0xFE, 0x84, 0x80, 0x83, 0x96, 0x6F, 0xC8, 0x80, 0x40, 0x83, 0x52, 0x23, 0x08, -0xC3, 0x7E, 0x84, 0x80, 0x01, 0xF0, 0x80, 0x40, 0x21, 0x55, 0x08, 0x40, 0xA3, 0x8A, 0xB8, 0x6F, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0x64, 0xC0, 0x80, 0x81, +0x84, 0x0A, 0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0xA7, 0x6E, 0xD9, 0x81, 0x83, 0x93, +0x22, 0x30, 0x84, 0x80, 0x59, 0xB0, 0x8A, 0x51, 0xA6, 0xE6, 0x83, 0x01, 0x8A, 0x51, 0xB8, 0x2E, +0x01, 0xF0, 0xA0, 0x80, 0x8A, 0x51, 0x01, 0x67, 0x8A, 0x51, 0x0D, 0x58, 0xD4, 0x2E, 0xD3, 0x81, +0x59, 0x94, 0x53, 0x48, 0x8A, 0x51, 0xDB, 0x66, 0x8A, 0x51, 0x83, 0x52, 0x03, 0x53, 0xD9, 0x1C, +0xCC, 0x2E, 0x8A, 0x51, 0x85, 0xE7, 0x8A, 0x51, 0x0D, 0x58, 0xBD, 0xAE, 0x08, 0xF0, 0xD3, 0xCA, +0x53, 0x42, 0x03, 0x18, 0xBD, 0xAE, 0xC0, 0xAE, 0x59, 0xDC, 0xBD, 0xAE, 0x8A, 0x51, 0x32, 0xE7, +0x8A, 0x51, 0x59, 0x50, 0xBD, 0xAE, 0xDB, 0x80, 0xD9, 0x90, 0x5B, 0x88, 0x96, 0x00, 0x15, 0x70, +0xDA, 0x40, 0xDA, 0x0B, 0xE1, 0x2E, 0x83, 0x52, 0x03, 0x53, 0x8D, 0xDC, 0x08, 0x40, 0xD9, 0xD4, +0x15, 0x54, 0x15, 0x70, 0xDA, 0x40, 0xDA, 0x0B, 0xEB, 0xAE, 0x83, 0x52, 0x03, 0x53, 0x0D, 0xDD, +0xED, 0xAE, 0x10, 0x88, 0xD4, 0x00, 0x11, 0xC8, 0xD5, 0x40, 0x0F, 0x48, 0xD7, 0x80, 0x0E, 0x08, +0xD2, 0x00, 0x12, 0xC8, 0xD6, 0x40, 0x15, 0x10, 0x15, 0x70, 0xDA, 0x40, 0xDA, 0x0B, 0xFE, 0xEE, +0x08, 0x40, 0x95, 0x41, 0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, +0x9C, 0x41, 0x9E, 0x81, 0xD8, 0x41, 0x08, 0xF0, 0x58, 0x02, 0x03, 0x18, 0x29, 0x2F, 0x58, 0x08, +0x32, 0x3E, 0x84, 0x80, 0x80, 0x81, 0x58, 0x08, 0x3A, 0x7E, 0x84, 0x80, 0x80, 0x81, 0x58, 0x08, +0x4A, 0x3E, 0x84, 0x80, 0x80, 0x81, 0x58, 0x08, 0x22, 0xFE, 0x84, 0x80, 0x80, 0x81, 0x58, 0x08, +0x42, 0xFE, 0x84, 0x80, 0x80, 0x81, 0x58, 0x08, 0x2A, 0x3E, 0x84, 0x80, 0x80, 0x81, 0xD8, 0x8A, +0x0B, 0x2F, 0xD4, 0x41, 0xD5, 0x81, 0xD7, 0xC1, 0xD2, 0x41, 0xD6, 0x81, 0x59, 0x50, 0xD9, 0x90, +0xA1, 0x01, 0x08, 0x40, 0xD8, 0x41, 0x08, 0xF0, 0x58, 0x02, 0x03, 0x18, 0x08, 0x40, 0x58, 0x08, +0x2A, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x00, 0xCB, 0x83, 0x2F, 0x58, 0x08, 0x2A, 0x3E, 0x84, 0x80, +0x80, 0x81, 0x58, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x97, 0x40, 0x58, 0x08, 0x22, 0xFE, +0x84, 0x80, 0x00, 0x48, 0x98, 0xC0, 0x58, 0x08, 0x32, 0x3E, 0x84, 0x80, 0x00, 0x48, 0x99, 0x00, +0x58, 0x08, 0x3A, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x9A, 0x00, 0x58, 0x08, 0x01, 0xBE, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x9B, 0x40, 0x58, 0x08, 0x4A, 0x3E, 0x84, 0x80, 0x00, 0x48, +0x9C, 0x00, 0x95, 0x94, 0x15, 0x70, 0xDA, 0x40, 0xDA, 0x0B, 0x64, 0x2F, 0x83, 0x52, 0x03, 0x53, +0x95, 0x50, 0x15, 0x70, 0xDA, 0x40, 0xDA, 0x0B, 0x6B, 0xAF, 0x01, 0xF0, 0x83, 0x52, 0x03, 0x53, +0xDA, 0x40, 0x58, 0x08, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x01, 0xBE, +0x7B, 0xEF, 0x03, 0xD0, 0xDA, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, 0x79, 0xAF, 0x5A, 0x48, 0x13, 0x45, +0x03, 0x59, 0x6D, 0xAF, 0xA1, 0x4A, 0xD8, 0x8A, 0x33, 0x6F, 0x59, 0x91, 0xD8, 0x41, 0x08, 0xF0, +0x58, 0x02, 0x03, 0x18, 0xBD, 0xEF, 0x0A, 0x30, 0x57, 0x82, 0x03, 0x18, 0x91, 0x2F, 0x59, 0xD5, +0xB9, 0xAF, 0x01, 0xF0, 0xDA, 0x40, 0x58, 0x08, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, +0x8A, 0x51, 0x01, 0xBE, 0x9D, 0xAF, 0x03, 0xD0, 0xDA, 0x0D, 0xFF, 0x7E, 0x03, 0x9D, 0x9B, 0xAF, +0x5A, 0x48, 0x13, 0x45, 0x03, 0x9D, 0xAA, 0x6F, 0x58, 0x08, 0x2A, 0x3E, 0x84, 0x80, 0x83, 0x93, +0x00, 0xCB, 0xB9, 0xAF, 0x58, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0x56, 0x86, +0x03, 0x9D, 0xB9, 0xAF, 0x58, 0x08, 0x22, 0xFE, 0x84, 0x80, 0x00, 0x48, 0x52, 0x46, 0x03, 0x59, +0x8F, 0xAF, 0x59, 0xD9, 0xBD, 0xEF, 0xD8, 0x8A, 0x87, 0x6F, 0x59, 0xD9, 0x08, 0x40, 0xD8, 0x41, +0x08, 0xF0, 0x58, 0x02, 0x03, 0x18, 0x08, 0x40, 0x01, 0xF0, 0xDA, 0x40, 0x58, 0x08, 0x01, 0xBE, +0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x01, 0xBE, 0xD0, 0x2F, 0x03, 0xD0, 0xDA, 0x0D, +0xFF, 0x7E, 0x03, 0x9D, 0xCE, 0xAF, 0x5A, 0x48, 0x13, 0x45, 0x03, 0x9D, 0xFE, 0x2F, 0x58, 0x08, +0x2A, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0x03, 0x9D, 0xFE, 0x2F, 0x58, 0x08, 0x32, 0x3E, +0x84, 0x80, 0x54, 0x08, 0x80, 0x40, 0x58, 0x08, 0x3A, 0x7E, 0x84, 0x80, 0x55, 0x48, 0x80, 0x40, +0x58, 0x08, 0x4A, 0x3E, 0x84, 0x80, 0x57, 0x88, 0x80, 0x40, 0x58, 0x08, 0x22, 0xFE, 0x84, 0x80, +0x52, 0x08, 0x80, 0x40, 0x58, 0x08, 0x42, 0xFE, 0x84, 0x80, 0x56, 0x48, 0x80, 0x40, 0x58, 0x08, +0x2A, 0x3E, 0x84, 0x80, 0x01, 0xF0, 0x80, 0x40, 0x59, 0xD5, 0x08, 0x40, 0xD8, 0x8A, 0xC0, 0xEF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, diff --git a/libloragw/src/cal_fw.var b/libloragw/src/cal_fw.var index 43b4c40..8c9389e 100644 --- a/libloragw/src/cal_fw.var +++ b/libloragw/src/cal_fw.var @@ -14,274 +14,262 @@ Maintainer: Matthieu Leurent */ static uint8_t cal_firmware[MCU_AGC_FW_BYTE] = { -0x8A, 0x51, 0x15, 0x68, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0x64, 0xC0, 0x80, 0x81, 0x84, 0x0A, -0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0x0E, 0x68, 0xE5, 0x81, 0xE6, 0x81, 0x83, 0x93, -0x54, 0x70, 0x84, 0x80, 0x65, 0xB0, 0x8A, 0x51, 0x0D, 0x20, 0x8A, 0x51, 0xDA, 0xF0, 0x84, 0x80, -0xEE, 0x30, 0x8A, 0x51, 0x0D, 0x20, 0x8A, 0x51, 0x83, 0xD7, 0xA0, 0x30, 0x84, 0x80, 0xAE, 0xF0, -0x8A, 0x51, 0x0D, 0x20, 0x83, 0x96, 0x01, 0xF0, 0xEE, 0x80, 0x83, 0x52, 0x01, 0xF0, 0xE7, 0x80, -0x07, 0x70, 0xE8, 0x00, 0x06, 0x30, 0xE9, 0x40, 0x0F, 0xB0, 0xEA, 0x40, 0x01, 0xF0, 0xEB, 0x80, -0x05, 0x30, 0xEC, 0x40, 0x01, 0xF0, 0xED, 0x80, 0x02, 0xF0, 0xEE, 0x80, 0x0E, 0x70, 0xEF, 0xC0, -0x83, 0x01, 0x8A, 0x51, 0xF6, 0xAB, 0xA2, 0x01, 0x22, 0xC8, 0xEA, 0xBE, 0x84, 0x80, 0x22, 0xC8, -0xA0, 0x80, 0x00, 0xB0, 0xCA, 0x60, 0x8A, 0x51, 0x83, 0x93, 0x80, 0x40, 0x22, 0xC8, 0xE0, 0x3E, -0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x01, 0xF0, 0xCA, 0x60, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, -0xDE, 0xFE, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x02, 0xF0, 0xCA, 0x60, 0x8A, 0x51, 0x80, 0x40, -0x22, 0xC8, 0xDA, 0xBE, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x03, 0x30, 0xCA, 0x60, 0x8A, 0x51, -0x80, 0x40, 0x22, 0xC8, 0xE8, 0x7E, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x04, 0xF0, 0xCA, 0x60, -0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xE6, 0xBE, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x05, 0x30, -0xCA, 0x60, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xE4, 0x7E, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, -0x06, 0x30, 0xCA, 0x60, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xAC, 0x7E, 0x84, 0x80, 0x22, 0xC8, -0xA0, 0x80, 0x08, 0xF0, 0xCA, 0x60, 0x8A, 0x51, 0x83, 0xD7, 0x80, 0x40, 0x22, 0xC8, 0xA8, 0x3E, -0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x0A, 0x30, 0xCA, 0x60, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, -0xAA, 0x7E, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x0B, 0x70, 0xCA, 0x60, 0x8A, 0x51, 0x80, 0x40, -0x22, 0xC8, 0xA2, 0x3E, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x0C, 0x30, 0xCA, 0x60, 0x8A, 0x51, -0x80, 0x40, 0x22, 0xC8, 0xA4, 0x3E, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x0D, 0x70, 0xCA, 0x60, -0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xA6, 0x7E, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, 0x0E, 0x70, -0xCA, 0x60, 0x8A, 0x51, 0x80, 0x40, 0x22, 0xC8, 0xA0, 0xFE, 0x84, 0x80, 0x22, 0xC8, 0xA0, 0x80, -0x10, 0xF0, 0xCA, 0x60, 0x8A, 0x51, 0x80, 0x40, 0x02, 0xF0, 0xA2, 0x4A, 0x22, 0xC2, 0x03, 0x18, -0x08, 0x40, 0x44, 0x28, 0xA1, 0xC0, 0x20, 0x88, 0x03, 0x59, 0xD3, 0xE8, 0x21, 0xC8, 0x86, 0xC0, -0x21, 0xC8, 0x86, 0xC0, 0xD7, 0x28, 0x21, 0xC8, 0x85, 0xC0, 0x21, 0xC8, 0x85, 0xC0, 0x08, 0x88, -0x08, 0x40, 0xB3, 0x40, 0x33, 0xCE, 0xF0, 0x39, 0x5F, 0xC4, 0x0C, 0x78, 0xB7, 0x80, 0xBA, 0x81, -0x37, 0x88, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x54, 0x70, 0x50, 0x63, 0x8A, 0x51, 0x37, 0x88, -0x02, 0xBE, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x54, 0x70, 0x50, 0x63, 0x8A, 0x51, 0x02, 0xF0, -0xA0, 0x80, 0x54, 0x70, 0xDA, 0x23, 0x8A, 0x51, 0xE4, 0x00, 0xE4, 0x5F, 0xEF, 0x68, 0x02, 0xF0, -0xA0, 0x80, 0x57, 0xF0, 0xDA, 0x23, 0x8A, 0x51, 0xB4, 0x00, 0x02, 0xF0, 0xA0, 0x80, 0x58, 0x70, -0xDA, 0x23, 0x8A, 0x51, 0xB5, 0x40, 0x3A, 0x48, 0x24, 0xFE, 0x84, 0x80, 0x34, 0x08, 0xEE, 0x63, -0x8A, 0x51, 0xA3, 0x00, 0x35, 0x48, 0xEE, 0x63, 0x8A, 0x51, 0x23, 0x87, 0x83, 0x93, 0x80, 0x40, -0x0F, 0xB0, 0xBA, 0xCA, 0x3A, 0x42, 0x03, 0x5C, 0xE0, 0x68, 0xB9, 0x81, 0x24, 0xC8, 0xB8, 0x00, -0xB6, 0x81, 0xBA, 0x81, 0x3A, 0x48, 0x24, 0xFE, 0x84, 0x80, 0x38, 0x08, 0x00, 0x42, 0x03, 0x18, -0x28, 0x69, 0x3A, 0x48, 0x24, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xB8, 0x00, 0x3A, 0x48, 0xB6, 0x40, -0x0F, 0xB0, 0xBA, 0xCA, 0x3A, 0x42, 0x03, 0x5C, 0x1A, 0xA9, 0x36, 0x48, 0x24, 0xFE, 0x84, 0x80, -0xFF, 0xB0, 0x80, 0x40, 0x08, 0xF0, 0xB9, 0xCA, 0x39, 0x42, 0x03, 0x5C, 0x16, 0xA9, 0x38, 0x08, -0x08, 0x40, 0xB1, 0x00, 0xC8, 0x01, 0xC9, 0x41, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x53, 0xB0, -0x50, 0x63, 0xC6, 0x41, 0x48, 0xC8, 0xB2, 0x00, 0x49, 0x08, 0xBB, 0x80, 0x46, 0x08, 0x4A, 0x3E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, 0x48, 0x47, 0xB3, 0x40, 0x46, 0x08, 0x4A, 0x3E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, 0x49, 0x87, 0xBC, 0x40, 0x46, 0x08, 0x4A, 0x3E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, 0x48, 0x47, 0xB4, 0x00, 0x46, 0x08, 0x4A, 0x3E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, 0x49, 0x02, 0xBD, 0x80, 0x46, 0x08, 0x4A, 0x3E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, 0x48, 0xC2, 0xB5, 0x40, 0x46, 0x08, 0x4A, 0x3E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, 0x49, 0x87, 0xBE, 0x80, 0x46, 0x08, 0x4A, 0x3E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, 0x48, 0xC2, 0xB6, 0x40, 0x46, 0x08, 0x4A, 0x3E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, 0x49, 0x02, 0xBF, 0xC0, 0xC7, 0x81, 0x47, 0x48, -0x32, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x50, 0x63, -0x8A, 0x51, 0x47, 0x48, 0x3B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x28, 0x30, 0xA1, 0x01, -0xA1, 0x4A, 0x50, 0x63, 0x46, 0x08, 0x43, 0x3E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x7B, 0x63, 0x8A, 0x51, 0xC5, 0x00, 0x47, 0x48, 0x03, 0x59, 0xAA, 0xE9, 0x44, 0xC8, 0x45, 0x02, -0x03, 0x18, 0xB6, 0x29, 0x45, 0x08, 0xC4, 0xC0, 0x47, 0x48, 0x32, 0x3E, 0x84, 0x80, 0x00, 0x48, -0xC8, 0xC0, 0x47, 0x48, 0x3B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xC9, 0x00, 0x05, 0x30, 0xC7, 0xCA, -0x47, 0x42, 0x03, 0x5C, 0x87, 0xE9, 0x07, 0x70, 0xC6, 0x8A, 0x46, 0x02, 0x48, 0xC8, 0xB2, 0x00, -0x49, 0x08, 0xBB, 0x80, 0x03, 0x5C, 0x46, 0xA9, 0x48, 0x0A, 0xB3, 0x40, 0x49, 0x4A, 0xBC, 0x40, -0x48, 0x0A, 0xB4, 0x00, 0x49, 0x43, 0xBD, 0x80, 0x48, 0x03, 0xB5, 0x40, 0x49, 0x4A, 0xBE, 0x80, -0x48, 0x03, 0xB6, 0x40, 0x49, 0x43, 0xBF, 0xC0, 0x48, 0xC8, 0xB7, 0x80, 0x49, 0x4A, 0xC0, 0x80, -0x48, 0xC8, 0xB8, 0x00, 0x49, 0x43, 0xC1, 0xC0, 0x48, 0x0A, 0xB9, 0x40, 0x49, 0x08, 0xC2, 0xC0, -0x48, 0x03, 0xBA, 0x40, 0x49, 0x08, 0xC3, 0x00, 0xC7, 0x81, 0x47, 0x48, 0x32, 0x3E, 0x84, 0x80, -0x00, 0x48, 0xA0, 0x80, 0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x50, 0x63, 0x8A, 0x51, 0x47, 0x48, -0x3B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A, 0x50, 0x63, -0x8A, 0x51, 0x07, 0x70, 0x7B, 0x63, 0x8A, 0x51, 0xC5, 0x00, 0x47, 0x48, 0x03, 0x59, 0x04, 0x2A, -0x44, 0xC8, 0x45, 0x02, 0x03, 0x18, 0x10, 0x2A, 0x45, 0x08, 0xC4, 0xC0, 0x47, 0x48, 0x32, 0x3E, -0x84, 0x80, 0x00, 0x48, 0xC8, 0xC0, 0x47, 0x48, 0x3B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xC9, 0x00, -0x09, 0x30, 0xC7, 0xCA, 0x47, 0x42, 0x03, 0x5C, 0xE5, 0x29, 0x48, 0xC8, 0xA0, 0x80, 0x27, 0xB0, -0xA1, 0x01, 0xA1, 0x4A, 0x50, 0x63, 0x8A, 0x51, 0x49, 0x08, 0xA0, 0x80, 0x28, 0x30, 0xA1, 0x01, -0xA1, 0x4A, 0x50, 0xAB, 0xB2, 0x00, 0xCA, 0x41, 0xCB, 0x81, 0x32, 0x8B, 0x2B, 0xEA, 0x74, 0xB0, -0xC6, 0x00, 0x75, 0xF0, 0x2E, 0xEA, 0x72, 0xB0, 0xC6, 0x00, 0x73, 0xF0, 0xC7, 0x40, 0x32, 0x08, -0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x53, 0xB0, 0x50, 0x63, 0xC9, 0x41, 0x4A, 0x08, 0xB4, 0x00, -0x4B, 0x48, 0xBD, 0x80, 0x49, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x4A, 0x87, 0xB5, 0x40, 0x49, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x4B, 0xC7, 0xBE, 0x80, 0x49, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x4A, 0x87, 0xB6, 0x40, 0x49, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x4B, 0x42, 0xBF, 0xC0, 0x49, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x4A, 0x02, 0xB7, 0x80, 0x49, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x4B, 0xC7, 0xC0, 0x80, 0x49, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x4A, 0x02, 0xB8, 0x00, 0x49, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x51, -0x4B, 0x42, 0xC1, 0xC0, 0xCC, 0x41, 0x1F, 0xF0, 0xA0, 0x80, 0xE0, 0x70, 0xA1, 0xC0, 0x4C, 0x08, -0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0x64, 0xA3, 0x8A, 0x51, 0xB1, 0x00, 0x4C, 0x08, 0x34, 0x3E, -0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x1F, 0xF0, 0xA0, 0x80, 0xE0, 0x70, 0xA1, 0xC0, 0x4C, 0x08, -0x3D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0x64, 0xA3, 0x8A, 0x51, 0xB1, 0x00, 0x4C, 0x08, 0x3D, 0xBE, -0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, -0xA1, 0x01, 0x46, 0x08, 0x50, 0x63, 0x8A, 0x51, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x00, 0x48, -0xA0, 0x80, 0xA1, 0x01, 0x47, 0x48, 0x50, 0x63, 0x49, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x8A, 0x95, -0x00, 0x60, 0x8A, 0x51, 0x7B, 0x63, 0x8A, 0x51, 0xC8, 0xC0, 0x4C, 0x08, 0x03, 0x59, 0xBC, 0x2A, -0x33, 0x48, 0x48, 0xC2, 0x03, 0x18, 0xC8, 0xAA, 0x48, 0xC8, 0xB3, 0x40, 0x4C, 0x08, 0x34, 0x3E, -0x84, 0x80, 0x00, 0x48, 0xCA, 0x00, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xCB, 0x40, -0x05, 0x30, 0xCC, 0x8A, 0x4C, 0x02, 0x03, 0x5C, 0x7B, 0x6A, 0x05, 0x30, 0xC9, 0x8A, 0x49, 0x02, -0x4A, 0x08, 0xB4, 0x00, 0x4B, 0x48, 0xBD, 0x80, 0x03, 0x5C, 0x3A, 0xEA, 0x4A, 0x4A, 0xB5, 0x40, -0x4B, 0x8A, 0xBE, 0x80, 0x4A, 0x4A, 0xB6, 0x40, 0x4B, 0x83, 0xBF, 0xC0, 0x4A, 0x43, 0xB7, 0x80, -0x4B, 0x8A, 0xC0, 0x80, 0x4A, 0x43, 0xB8, 0x00, 0x4B, 0x83, 0xC1, 0xC0, 0x4A, 0x08, 0xB9, 0x40, -0x4B, 0x8A, 0xC2, 0xC0, 0x4A, 0x08, 0xBA, 0x40, 0x4B, 0x83, 0xC3, 0x00, 0x4A, 0x4A, 0xBB, 0x80, -0x4B, 0x48, 0xC4, 0xC0, 0x4A, 0x43, 0xBC, 0x40, 0x4B, 0x48, 0xC5, 0x00, 0xCC, 0x41, 0x1F, 0xF0, -0xA0, 0x80, 0xE0, 0x70, 0xA1, 0xC0, 0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0x64, 0xA3, -0x8A, 0x51, 0xB1, 0x00, 0x4C, 0x08, 0x34, 0x3E, 0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x1F, 0xF0, -0xA0, 0x80, 0xE0, 0x70, 0xA1, 0xC0, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0x64, 0xA3, -0x8A, 0x51, 0xB1, 0x00, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x31, 0x08, 0x80, 0x40, 0x4C, 0x08, -0x34, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0xA1, 0x01, 0x46, 0x08, 0x50, 0x63, 0x8A, 0x51, -0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0xA1, 0x01, 0x47, 0x48, 0x50, 0x63, -0x8A, 0x51, 0x07, 0x70, 0x7B, 0x63, 0x8A, 0x51, 0xC8, 0xC0, 0x4C, 0x08, 0x03, 0x59, 0x34, 0xEB, -0x33, 0x48, 0x48, 0xC2, 0x03, 0x18, 0x40, 0x6B, 0x48, 0xC8, 0xB3, 0x40, 0x4C, 0x08, 0x34, 0x3E, -0x84, 0x80, 0x00, 0x48, 0xCA, 0x00, 0x4C, 0x08, 0x3D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xCB, 0x40, -0x09, 0x30, 0xCC, 0x8A, 0x4C, 0x02, 0x03, 0x5C, 0xF7, 0xAA, 0x4A, 0x08, 0xA0, 0x80, 0xA1, 0x01, -0x46, 0x08, 0x50, 0x63, 0x8A, 0x51, 0x4B, 0x48, 0xA0, 0x80, 0xA1, 0x01, 0x47, 0x48, 0x50, 0xAB, -0xA2, 0xC0, 0x21, 0x0A, 0x03, 0x59, 0x5E, 0x6B, 0x21, 0xC8, 0x62, 0x46, 0x03, 0x59, 0x5E, 0x6B, -0x21, 0xC8, 0x88, 0x80, 0x80, 0xF0, 0x8C, 0xC0, 0x21, 0xC8, 0xE2, 0x00, 0x20, 0x88, 0x88, 0x80, -0x22, 0xC8, 0x80, 0x38, 0x8C, 0xC0, 0x08, 0x40, 0xA3, 0x00, 0x20, 0x88, 0x80, 0x7A, 0xA2, 0xC0, -0x23, 0x08, 0x80, 0x7A, 0xA2, 0x02, 0x03, 0x18, 0x6F, 0xAB, 0x20, 0x88, 0x08, 0x40, 0x23, 0x08, -0x80, 0x7A, 0xA2, 0xC0, 0x21, 0xC8, 0x80, 0x7A, 0xA2, 0x02, 0x03, 0x18, 0x79, 0x6B, 0x21, 0xC8, -0x08, 0x40, 0x23, 0x08, 0x08, 0x40, 0xA9, 0x00, 0x29, 0x8E, 0xF0, 0x39, 0x5F, 0xC4, 0x0C, 0x78, -0xAD, 0x40, 0xB0, 0x01, 0x2D, 0x48, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x54, 0x70, 0x50, 0x63, -0x8A, 0x51, 0x2D, 0x48, 0x02, 0xBE, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x54, 0x70, 0x50, 0x63, -0x8A, 0x51, 0x02, 0xF0, 0xA0, 0x80, 0x54, 0x70, 0xDA, 0x23, 0x8A, 0x51, 0xE4, 0x00, 0xE4, 0x5F, -0x91, 0xEB, 0x02, 0xF0, 0xA0, 0x80, 0x57, 0xF0, 0xDA, 0x23, 0x8A, 0x51, 0xAA, 0x00, 0x02, 0xF0, -0xA0, 0x80, 0x58, 0x70, 0xDA, 0x23, 0x8A, 0x51, 0xAB, 0x40, 0x30, 0xC8, 0x24, 0xFE, 0x84, 0x80, -0x2A, 0x08, 0xEE, 0x63, 0x8A, 0x51, 0xA3, 0x00, 0x2B, 0x48, 0xEE, 0x63, 0x8A, 0x51, 0x23, 0x87, -0x80, 0x40, 0x05, 0x30, 0xB0, 0x4A, 0x30, 0xC2, 0x03, 0x5C, 0x82, 0xAB, 0xAF, 0xC1, 0x24, 0xC8, -0xAE, 0x40, 0xAC, 0x41, 0xB0, 0x01, 0x30, 0xC8, 0x24, 0xFE, 0x84, 0x80, 0x2E, 0x48, 0x00, 0x42, -0x03, 0x18, 0xC9, 0x2B, 0x30, 0xC8, 0x24, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xAE, 0x40, 0x30, 0xC8, -0xAC, 0x00, 0x05, 0x30, 0xB0, 0x4A, 0x30, 0xC2, 0x03, 0x5C, 0xBB, 0xAB, 0x2C, 0x08, 0x24, 0xFE, -0x84, 0x80, 0xFF, 0xB0, 0x80, 0x40, 0x03, 0x30, 0xAF, 0x0A, 0x2F, 0x82, 0x03, 0x5C, 0xB7, 0xAB, -0x2E, 0x48, 0x08, 0x40, 0xA1, 0xC0, 0x20, 0xCA, 0x03, 0x59, 0xE8, 0x2B, 0x20, 0x88, 0x62, 0x46, -0x03, 0x59, 0xE8, 0x2B, 0x20, 0x88, 0x88, 0x80, 0x80, 0xF0, 0x8C, 0xC0, 0x20, 0x88, 0xE2, 0x00, -0x21, 0xC8, 0x8C, 0xC0, 0x21, 0xC8, 0x8C, 0xC0, 0x08, 0x88, 0x08, 0x40, 0xA0, 0x80, 0xA0, 0xDF, -0xF4, 0x6B, 0x20, 0xC3, 0xFF, 0x3A, 0x08, 0x40, 0x20, 0x88, 0x08, 0x40, 0x95, 0x41, 0x96, 0x41, -0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x9E, 0x81, 0x8B, 0x41, -0x83, 0x96, 0xD0, 0x01, 0xD1, 0x41, 0x83, 0x52, 0xD3, 0x81, 0x53, 0x48, 0xA0, 0xFE, 0x84, 0x80, -0x80, 0x81, 0x53, 0x48, 0xA8, 0x3E, 0x84, 0x80, 0x80, 0x81, 0x53, 0x48, 0xB0, 0x3E, 0x84, 0x80, -0x80, 0x81, 0x53, 0x48, 0xB8, 0x7E, 0x84, 0x80, 0x80, 0x81, 0x53, 0x48, 0xC0, 0xFE, 0x84, 0x80, -0x80, 0x81, 0x53, 0x48, 0xC8, 0x3E, 0x84, 0x80, 0x80, 0x81, 0x53, 0x48, 0xD2, 0x7E, 0x84, 0x80, -0x08, 0xF0, 0x80, 0x81, 0xD3, 0xCA, 0x53, 0x42, 0x03, 0x5C, 0x05, 0x6C, 0x00, 0xB0, 0xA0, 0xC1, -0xA0, 0x03, 0x8A, 0x51, 0xDA, 0x23, 0x8A, 0x51, 0x03, 0xBA, 0x03, 0x9D, 0x26, 0xAC, 0x03, 0x30, -0xE2, 0x00, 0xC8, 0x70, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0x50, 0x63, -0x8A, 0x51, 0x02, 0xF0, 0xA0, 0x80, 0x56, 0xB0, 0x8A, 0x51, 0xDA, 0x23, 0x8A, 0x51, 0xE4, 0x00, -0xC8, 0xFA, 0x03, 0x59, 0x1B, 0x94, 0xC9, 0xB0, 0xA0, 0x80, 0x04, 0xF0, 0xA1, 0x01, 0x8A, 0x95, -0xF0, 0x27, 0x8A, 0x51, 0x04, 0xF0, 0xA0, 0xC1, 0x8A, 0x51, 0xCA, 0x60, 0x8A, 0x51, 0xE4, 0x00, -0xC9, 0x3A, 0x03, 0x59, 0x9B, 0xD4, 0xCA, 0xB0, 0xA0, 0x80, 0x04, 0xF0, 0xA1, 0x01, 0xA1, 0x4A, -0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x04, 0xF0, 0xA0, 0xC1, 0xA0, 0x0A, 0x8A, 0x51, 0xCA, 0x60, -0x8A, 0x51, 0xE4, 0x00, 0xCA, 0x3A, 0x03, 0x59, 0x1B, 0xD5, 0x14, 0xC8, 0xCD, 0x40, 0x06, 0x30, -0x03, 0xD0, 0xCD, 0xCC, 0xFF, 0x7E, 0x03, 0x9D, 0x68, 0xAC, 0x4D, 0x48, 0xD0, 0xC0, 0x14, 0x5C, -0x75, 0x2C, 0x83, 0x52, 0x03, 0x53, 0x65, 0xD6, 0x78, 0xEC, 0x83, 0x52, 0x03, 0x53, 0x65, 0x92, -0x94, 0x9C, 0x7E, 0x6C, 0x83, 0x52, 0x03, 0x53, 0xE5, 0x16, 0x81, 0x6C, 0x83, 0x52, 0x03, 0x53, -0xE5, 0xD2, 0x14, 0x9D, 0x87, 0xEC, 0x83, 0x52, 0x03, 0x53, 0xE5, 0x57, 0x8A, 0xAC, 0x83, 0x52, -0x03, 0x53, 0xE5, 0x13, 0x94, 0xDD, 0x90, 0x6C, 0x83, 0x52, 0x03, 0x53, 0x66, 0x94, 0x93, 0xEC, -0x83, 0x52, 0x03, 0x53, 0x66, 0x50, 0x14, 0x9E, 0x99, 0xEC, 0x83, 0x52, 0x03, 0x53, 0x65, 0x94, -0x9C, 0xEC, 0x83, 0x52, 0x03, 0x53, 0x65, 0x50, 0x94, 0xDE, 0xA2, 0xAC, 0x83, 0x52, 0x03, 0x53, -0x65, 0x17, 0xA5, 0xEC, 0x83, 0x52, 0x03, 0x53, 0x65, 0xD3, 0xD0, 0x08, 0x03, 0x9D, 0xAC, 0xEC, -0x83, 0x52, 0x03, 0x53, 0xE5, 0x15, 0xAF, 0x6C, 0x83, 0x52, 0x03, 0x53, 0xE5, 0xD1, 0x50, 0x4B, -0xB5, 0x2C, 0x83, 0x52, 0x03, 0x53, 0xE5, 0xD4, 0xB8, 0xEC, 0x83, 0x52, 0x03, 0x53, 0xE5, 0x90, -0x50, 0xC8, 0x02, 0x7A, 0x03, 0x9D, 0xC0, 0x6C, 0x83, 0x52, 0x03, 0x53, 0x65, 0xD5, 0xC3, 0xEC, -0x83, 0x52, 0x03, 0x53, 0x65, 0x91, 0x8A, 0x51, 0x43, 0x20, 0x8A, 0x51, 0xD3, 0x81, 0x53, 0x48, -0xE0, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xCD, 0x40, 0x53, 0x48, 0xE2, 0x7E, 0x84, 0x80, -0x4D, 0x48, 0x80, 0x40, 0x53, 0x48, 0xDE, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xCD, 0x40, 0x53, 0x48, -0x54, 0x3E, 0x84, 0x80, 0x4D, 0x48, 0x80, 0x40, 0x53, 0x48, 0xDA, 0xBE, 0x84, 0x80, 0x00, 0x48, -0xCD, 0x40, 0x53, 0x48, 0xDC, 0xBE, 0x84, 0x80, 0x4D, 0x48, 0x80, 0x40, 0x53, 0x48, 0xE8, 0x7E, -0x84, 0x80, 0x00, 0x48, 0xCD, 0x40, 0x53, 0x48, 0x5A, 0x7E, 0x84, 0x80, 0x4D, 0x48, 0x80, 0x40, -0x53, 0x48, 0xE6, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xCD, 0x40, 0x53, 0x48, 0x58, 0x3E, 0x84, 0x80, -0x4D, 0x48, 0x80, 0x40, 0x53, 0x48, 0xE4, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xCD, 0x40, 0x53, 0x48, -0x56, 0x7E, 0x84, 0x80, 0x4D, 0x48, 0x80, 0x40, 0x02, 0xF0, 0xD3, 0xCA, 0x53, 0x42, 0x03, 0x5C, -0xC7, 0x2C, 0x69, 0xB0, 0xA0, 0xC1, 0xA1, 0x01, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x19, 0x10, -0x19, 0x51, 0x99, 0x50, 0x99, 0x91, 0x21, 0x30, 0xA0, 0xC1, 0xA0, 0x0A, 0xA1, 0x01, 0xA1, 0x4A, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x21, 0x30, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, -0x50, 0x63, 0x8A, 0x51, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0, 0x55, 0xB0, 0x8A, 0x51, 0x50, 0x63, -0x8A, 0x51, 0x07, 0x70, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x30, 0x30, 0x8A, 0x51, 0x50, 0x63, -0x8A, 0x51, 0xE5, 0xD8, 0xE7, 0xC1, 0x65, 0x1E, 0xFD, 0xED, 0x27, 0xB0, 0xA0, 0xC1, 0xA1, 0x01, -0xA1, 0x4A, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x28, 0x30, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0xE5, 0x5D, 0x65, 0xD9, 0x48, 0xAD, 0xE5, 0x1C, 0x72, 0x2D, -0xDF, 0x01, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0, 0x54, 0x70, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, -0xE5, 0x1C, 0x67, 0x6D, 0x03, 0x30, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x2C, 0x70, 0x8A, 0x51, -0x50, 0x63, 0x8A, 0x51, 0x99, 0xD5, 0x29, 0x70, 0xCF, 0x80, 0x96, 0xB0, 0xCE, 0x40, 0xA6, 0xB0, -0xCD, 0x40, 0xCD, 0x0B, 0x61, 0xED, 0xCE, 0x0B, 0x61, 0xED, 0xCF, 0x4B, 0x61, 0xED, 0x03, 0x30, -0x83, 0x52, 0x03, 0x53, 0xEE, 0x80, 0x0F, 0xB0, 0xEF, 0xC0, 0x00, 0xB0, 0x8A, 0x95, 0x02, 0x26, -0x8A, 0x51, 0x86, 0xED, 0x18, 0xD0, 0x01, 0xF0, 0xDF, 0xC0, 0x02, 0xF0, 0xA0, 0xC1, 0xA0, 0x0A, -0xA1, 0xC0, 0x54, 0x70, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x02, 0xF0, 0xEE, 0x80, 0x0E, 0x70, -0xEF, 0xC0, 0x01, 0xF0, 0xA9, 0x41, 0x8A, 0x95, 0x75, 0x25, 0x8A, 0x51, 0x6B, 0x88, 0x83, 0x96, -0xD2, 0x00, 0x83, 0x52, 0x6A, 0x48, 0x83, 0x96, 0xD3, 0x40, 0x83, 0x52, 0x63, 0x48, 0x83, 0x96, -0xD4, 0x00, 0x83, 0x52, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0, 0x53, 0xB0, 0x8A, 0x51, 0x50, 0x63, -0x8A, 0x51, 0x14, 0x30, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0x50, 0x63, -0x8A, 0x51, 0x02, 0xF0, 0x8A, 0x51, 0xD9, 0xA0, 0x8A, 0x51, 0xD1, 0x00, 0xEC, 0xF0, 0xA0, 0x80, -0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x00, 0xB0, 0x8A, 0x51, -0x22, 0x22, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0xD9, 0xA0, 0x8A, 0x51, 0xD2, 0x00, 0x02, 0xF0, -0xA0, 0xC1, 0xA1, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x24, 0x30, 0xA0, 0x80, -0x02, 0xF0, 0xA1, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x2A, 0x70, 0xCE, 0x40, -0x8D, 0xB0, 0xCD, 0x40, 0xCD, 0x0B, 0xCA, 0x2D, 0xCE, 0x0B, 0xCA, 0x2D, 0xCF, 0xAD, 0x83, 0x52, -0x02, 0xF0, 0x03, 0x53, 0xA0, 0xC1, 0xA1, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, -0xE5, 0x5D, 0x65, 0xD9, 0xDD, 0xAD, 0xE5, 0x1C, 0xE4, 0x2D, 0x99, 0x91, 0x03, 0x30, 0xA0, 0x80, -0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0xE8, 0x2D, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, -0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x51, 0x08, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0xCD, 0x40, -0x52, 0x08, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0x4D, 0x42, 0x1E, 0x7E, 0x83, 0x96, 0xD0, 0xC0, -0x32, 0x70, 0x50, 0xC2, 0x83, 0x52, 0x03, 0x18, 0x9B, 0x15, 0x83, 0x52, 0xE5, 0x5E, 0xCC, 0x2E, -0x27, 0xB0, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x28, 0x30, -0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0xE5, 0x5D, 0x65, 0xD9, -0x13, 0xEE, 0xE5, 0x1C, 0x3D, 0x6E, 0xDF, 0x01, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0, 0x54, 0x70, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0xE5, 0x1C, 0x32, 0xEE, 0x03, 0x30, 0xA0, 0x80, 0x02, 0xF0, -0xA1, 0xC0, 0x2C, 0x70, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x99, 0x94, 0x29, 0x70, 0xCF, 0x80, -0x96, 0xB0, 0xCE, 0x40, 0xA6, 0xB0, 0xCD, 0x40, 0xCD, 0x0B, 0x2C, 0xEE, 0xCE, 0x0B, 0x2C, 0xEE, -0xCF, 0x4B, 0x2C, 0xEE, 0x03, 0x30, 0x83, 0x52, 0x03, 0x53, 0xEE, 0x80, 0x0F, 0xB0, 0xEF, 0xC0, -0x01, 0xF0, 0x8A, 0x95, 0x02, 0x26, 0x8A, 0x51, 0x52, 0xEE, 0x18, 0x14, 0x01, 0xF0, 0xDF, 0xC0, -0x02, 0xF0, 0xA0, 0xC1, 0xA0, 0x0A, 0xA1, 0xC0, 0x54, 0x70, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, -0x02, 0xF0, 0xEE, 0x80, 0x0E, 0x70, 0xEF, 0xC0, 0x01, 0xF0, 0xA9, 0x41, 0xA9, 0x8A, 0x8A, 0x95, -0x75, 0x25, 0x8A, 0x51, 0x6B, 0x88, 0x83, 0x96, 0xD2, 0x00, 0x83, 0x52, 0x6A, 0x48, 0x83, 0x96, -0xD3, 0x40, 0x83, 0x52, 0x63, 0x48, 0x83, 0x96, 0xD4, 0x00, 0x83, 0x52, 0x02, 0xF0, 0xA0, 0xC1, -0xA0, 0x0A, 0xA1, 0xC0, 0x53, 0xB0, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x14, 0x30, 0xA0, 0x80, -0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x02, 0xF0, 0x8A, 0x51, -0xD9, 0xA0, 0x8A, 0x51, 0xD1, 0x00, 0xEC, 0xF0, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x01, 0xF0, 0x8A, 0x51, 0x22, 0x22, 0x8A, 0x51, 0x07, 0x70, -0x8A, 0x51, 0xD9, 0xA0, 0x8A, 0x51, 0xD2, 0x00, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0, 0x2F, 0xF0, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x25, 0x70, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x2F, 0xF0, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x2A, 0x70, 0xCE, 0x40, 0x8D, 0xB0, 0xCD, 0x40, 0xCD, 0x0B, -0x97, 0x6E, 0xCE, 0x0B, 0x97, 0x6E, 0x9C, 0x2E, 0x83, 0x52, 0x02, 0xF0, 0x03, 0x53, 0xA0, 0xC1, -0xA1, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0xE5, 0x5D, 0x65, 0xD9, 0xAA, 0x2E, -0xE5, 0x1C, 0xB2, 0x2E, 0xE5, 0x1C, 0xAD, 0x6E, 0x99, 0x50, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, -0xA1, 0x01, 0xB7, 0xAE, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x95, -0xF0, 0x27, 0x8A, 0x51, 0x51, 0x08, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0xCD, 0x40, 0x52, 0x08, -0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0x4D, 0x42, 0x1E, 0x7E, 0x83, 0x96, 0xD1, 0x00, 0x32, 0x70, -0x51, 0x02, 0x83, 0x52, 0x03, 0x18, 0x1B, 0xD6, 0x83, 0x52, 0x65, 0xDC, 0xD1, 0x2E, 0x03, 0x30, -0xD2, 0x2E, 0x02, 0xF0, 0xEE, 0x80, 0x14, 0x30, 0xA0, 0x80, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0xE5, 0x9F, 0x60, 0xEF, 0x18, 0xD0, 0x02, 0xF0, 0xA0, 0xC1, -0xA1, 0xC0, 0x53, 0xB0, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x9B, 0x16, 0xD3, 0x81, 0x01, 0xF0, -0xDF, 0xC0, 0x02, 0xF0, 0xA0, 0xC1, 0xA0, 0x0A, 0xA1, 0xC0, 0x54, 0x70, 0x8A, 0x51, 0x50, 0x63, -0x8A, 0x51, 0x53, 0x48, 0x08, 0xBE, 0xEF, 0xC0, 0x00, 0xB0, 0xA9, 0x41, 0xD3, 0x88, 0x03, 0x59, -0x01, 0xF0, 0x8A, 0x95, 0x75, 0x25, 0x8A, 0x51, 0x53, 0x48, 0xD2, 0x7E, 0x84, 0x80, 0x6A, 0xCE, -0xF0, 0x39, 0x63, 0x44, 0x83, 0x93, 0x80, 0x40, 0xDF, 0x01, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0, -0x54, 0x70, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x27, 0xB0, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x28, 0x30, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, -0x50, 0x63, 0x8A, 0x51, 0x03, 0x30, 0x8A, 0x51, 0xD9, 0xA0, 0x8A, 0x51, 0xD1, 0x00, 0x00, 0xB0, -0x8A, 0x51, 0x39, 0xA1, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0xD9, 0xA0, 0x8A, 0x51, 0xD2, 0x00, -0x51, 0x08, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0xCD, 0x40, 0x52, 0x08, 0x8A, 0x95, 0xEB, 0x24, -0x8A, 0x51, 0x4D, 0x42, 0x18, 0xFE, 0xCE, 0x40, 0x53, 0x48, 0xC0, 0xFE, 0x84, 0x80, 0x4E, 0x48, -0x80, 0x40, 0x53, 0x48, 0xA0, 0xFE, 0x84, 0x80, 0x27, 0xB0, 0xA0, 0xC1, 0xA0, 0x0A, 0x8A, 0x51, -0xDA, 0x23, 0x8A, 0x51, 0x80, 0x40, 0x53, 0x48, 0xA8, 0x3E, 0x84, 0x80, 0x28, 0x30, 0xA0, 0xC1, -0xA0, 0x0A, 0x8A, 0x51, 0xDA, 0x23, 0x8A, 0x51, 0x80, 0x40, 0x53, 0x48, 0xC0, 0xFE, 0x84, 0x80, -0x14, 0x30, 0x00, 0x42, 0x03, 0x5C, 0x9B, 0xD2, 0x08, 0xF0, 0xD3, 0xCA, 0x53, 0x42, 0x03, 0x5C, -0xE7, 0xAE, 0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, -0x66, 0xDC, 0xE8, 0x6F, 0x18, 0x14, 0x02, 0xF0, 0xA0, 0xC1, 0xA0, 0x0A, 0xA1, 0xC0, 0x53, 0xB0, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x1B, 0x17, 0xD3, 0x81, 0x01, 0xF0, 0xDF, 0xC0, 0x02, 0xF0, -0xA0, 0xC1, 0xA0, 0x0A, 0xA1, 0xC0, 0x54, 0x70, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x53, 0x48, -0x08, 0xBE, 0xEF, 0xC0, 0x00, 0xB0, 0xA9, 0x41, 0xA9, 0x8A, 0xD3, 0x88, 0x03, 0x59, 0x01, 0xF0, -0x8A, 0x95, 0x75, 0x25, 0x8A, 0x51, 0x53, 0x48, 0xD2, 0x7E, 0x84, 0x80, 0x6A, 0xCE, 0xF0, 0x39, -0x63, 0x44, 0x83, 0x93, 0x80, 0x40, 0xDF, 0x01, 0x02, 0xF0, 0xA0, 0xC1, 0xA1, 0xC0, 0x54, 0x70, -0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x27, 0xB0, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, -0x50, 0x63, 0x8A, 0x51, 0x28, 0x30, 0xA0, 0xC1, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0x50, 0x63, -0x8A, 0x51, 0x03, 0x30, 0x8A, 0x51, 0xD9, 0xA0, 0x8A, 0x51, 0xD1, 0x00, 0x01, 0xF0, 0x8A, 0x51, -0x39, 0xA1, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0xD9, 0xA0, 0x8A, 0x51, 0xD2, 0x00, 0x51, 0x08, -0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0xCD, 0x40, 0x52, 0x08, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, -0x4D, 0x42, 0x18, 0xFE, 0xCE, 0x40, 0x53, 0x48, 0xC8, 0x3E, 0x84, 0x80, 0x4E, 0x48, 0x80, 0x40, -0x53, 0x48, 0xB0, 0x3E, 0x84, 0x80, 0x27, 0xB0, 0xA0, 0xC1, 0xA0, 0x0A, 0x8A, 0x51, 0xDA, 0x23, -0x8A, 0x51, 0x80, 0x40, 0x53, 0x48, 0xB8, 0x7E, 0x84, 0x80, 0x28, 0x30, 0xA0, 0xC1, 0xA0, 0x0A, -0x8A, 0x51, 0xDA, 0x23, 0x8A, 0x51, 0x80, 0x40, 0x53, 0x48, 0xC8, 0x3E, 0x84, 0x80, 0x14, 0x30, -0x00, 0x42, 0x03, 0x5C, 0x1B, 0xD3, 0x08, 0xF0, 0xD3, 0xCA, 0x53, 0x42, 0x03, 0x5C, 0x6D, 0xAF, -0x03, 0x30, 0xA0, 0x80, 0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, -0x18, 0x56, 0x18, 0x12, 0x8A, 0x95, 0x5B, 0x67, 0x8A, 0x51, 0xE4, 0xB0, 0xCD, 0x40, 0xF0, 0x6F, -0xF1, 0xAF, 0xCD, 0x0B, 0xEF, 0x2F, 0xF4, 0xAF, 0x00, 0x00, 0x0E, 0x70, 0x83, 0x52, 0x03, 0x53, -0xA0, 0x80, 0x69, 0xB0, 0xA1, 0x01, 0x8A, 0x51, 0x50, 0x63, 0x8A, 0x51, 0x9B, 0x57, 0xFF, 0x6F, -0x08, 0xF0, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4, 0x18, 0x74, 0x1C, 0xB4, -0x1E, 0xF4, 0x20, 0x34, 0x22, 0x74, 0x23, 0xB4, 0x24, 0x74, 0x25, 0xB4, 0x26, 0xB4, 0x27, 0xF4, -0x28, 0x74, 0x28, 0x74, 0x29, 0xB4, 0x2A, 0xB4, 0x2A, 0xB4, 0x2B, 0xF4, 0x2B, 0xF4, 0x2C, 0xB4, -0x2C, 0xB4, 0x2D, 0xF4, 0x2D, 0xF4, 0x2D, 0xF4, 0x2E, 0xF4, 0x2E, 0xF4, 0x2E, 0xF4, 0x2F, 0x34, -0x2F, 0x34, 0x2F, 0x34, 0x30, 0x74, 0x30, 0x74, 0x00, 0xF4, 0x00, 0xF4, 0x06, 0x74, 0x0A, 0x74, -0x0C, 0x74, 0x0E, 0xB4, 0x10, 0x34, 0x11, 0x74, 0x12, 0x74, 0x13, 0xB4, 0x14, 0x74, 0x15, 0xB4, -0x16, 0xB4, 0x16, 0xB4, 0x17, 0xF4, 0x18, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x09, 0x74, 0x09, 0x74, -0x09, 0x74, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x01, 0x34, 0x01, 0x34, -0x01, 0x34, 0x02, 0x34, 0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x05, 0x74, 0x06, 0x74, 0x06, 0x74, -0x02, 0x34, 0x02, 0x34, 0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x06, 0x74, 0x07, 0xB4, 0x40, 0x34, -0x20, 0x34, 0x10, 0x34, 0x08, 0x34, 0x04, 0x34, 0x02, 0x34, 0x01, 0x34, 0x06, 0x74, 0x06, 0x74, -0x07, 0xB4, 0x07, 0xB4, 0x07, 0xB4, 0x10, 0x34, 0x08, 0x34, 0x04, 0x34, 0x02, 0x34, 0x01, 0x34, +0x8A, 0x51, 0x6F, 0x28, 0x00, 0xB0, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4, +0x18, 0x74, 0x1C, 0xB4, 0x1E, 0xF4, 0x20, 0x34, 0x22, 0x74, 0x23, 0xB4, 0x24, 0x74, 0x25, 0xB4, +0x26, 0xB4, 0x27, 0xF4, 0x28, 0x74, 0x28, 0x74, 0x29, 0xB4, 0x2A, 0xB4, 0x2A, 0xB4, 0x2B, 0xF4, +0x2B, 0xF4, 0x2C, 0xB4, 0x2C, 0xB4, 0x2D, 0xF4, 0x2D, 0xF4, 0x2D, 0xF4, 0x2E, 0xF4, 0x2E, 0xF4, +0x2E, 0xF4, 0x2F, 0x34, 0x2F, 0x34, 0x2F, 0x34, 0x30, 0x74, 0x30, 0x74, 0x00, 0xF4, 0x00, 0xF4, +0x06, 0x74, 0x0A, 0x74, 0x0C, 0x74, 0x0E, 0xB4, 0x10, 0x34, 0x11, 0x74, 0x12, 0x74, 0x13, 0xB4, +0x14, 0x74, 0x15, 0xB4, 0x16, 0xB4, 0x16, 0xB4, 0x17, 0xF4, 0x18, 0x74, 0x0F, 0xF4, 0x0C, 0x74, +0x09, 0x74, 0x09, 0x74, 0x09, 0x74, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, +0x01, 0x34, 0x01, 0x34, 0x01, 0x34, 0x02, 0x34, 0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x05, 0x74, +0x06, 0x74, 0x06, 0x74, 0x02, 0x34, 0x02, 0x34, 0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x06, 0x74, +0x07, 0xB4, 0x40, 0x34, 0x20, 0x34, 0x10, 0x34, 0x08, 0x34, 0x04, 0x34, 0x02, 0x34, 0x01, 0x34, +0x06, 0x74, 0x06, 0x74, 0x07, 0xB4, 0x07, 0xB4, 0x07, 0xB4, 0x10, 0x34, 0x08, 0x34, 0x04, 0x34, +0x02, 0x34, 0x01, 0x34, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0x64, 0xC0, +0x80, 0x81, 0x84, 0x0A, 0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, 0x68, 0x68, 0xE6, 0x81, +0xE7, 0xC1, 0x83, 0x93, 0x55, 0xB0, 0x84, 0x80, 0x66, 0xB0, 0x8A, 0x51, 0x67, 0xA0, 0x8A, 0x51, +0xDA, 0xF0, 0x84, 0x80, 0xEE, 0x30, 0x8A, 0x51, 0x67, 0xA0, 0x8A, 0x51, 0x83, 0xD7, 0xA0, 0x30, +0x84, 0x80, 0xAE, 0xF0, 0x8A, 0x51, 0x67, 0xA0, 0x83, 0x96, 0x01, 0xF0, 0xEE, 0x80, 0x83, 0x52, +0x01, 0xF0, 0xE8, 0x00, 0x07, 0x70, 0xE9, 0x40, 0x06, 0x30, 0xEA, 0x40, 0x0F, 0xB0, 0xEB, 0x80, +0x01, 0xF0, 0xEC, 0x40, 0x05, 0x30, 0xED, 0x80, 0x02, 0xF0, 0xEE, 0x80, 0x0E, 0x70, 0xEF, 0xC0, +0x83, 0x01, 0x8A, 0x51, 0x4C, 0xAC, 0xA3, 0x41, 0x23, 0x08, 0xEA, 0xBE, 0x84, 0x80, 0x23, 0x08, +0xA1, 0xC0, 0x00, 0xB0, 0x22, 0x21, 0x8A, 0x51, 0x83, 0x93, 0x80, 0x40, 0x23, 0x08, 0xE0, 0x3E, +0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x01, 0xF0, 0x22, 0x21, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, +0xDE, 0xFE, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x02, 0xF0, 0x22, 0x21, 0x8A, 0x51, 0x80, 0x40, +0x23, 0x08, 0xDA, 0xBE, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x03, 0x30, 0x22, 0x21, 0x8A, 0x51, +0x80, 0x40, 0x23, 0x08, 0xE8, 0x7E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x04, 0xF0, 0x22, 0x21, +0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xE6, 0xBE, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x05, 0x30, +0x22, 0x21, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xE4, 0x7E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, +0x06, 0x30, 0x22, 0x21, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xAC, 0x7E, 0x84, 0x80, 0x23, 0x08, +0xA1, 0xC0, 0x08, 0xF0, 0x22, 0x21, 0x8A, 0x51, 0x83, 0xD7, 0x80, 0x40, 0x23, 0x08, 0xA8, 0x3E, +0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0A, 0x30, 0x22, 0x21, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, +0xAA, 0x7E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0B, 0x70, 0x22, 0x21, 0x8A, 0x51, 0x80, 0x40, +0x23, 0x08, 0xA2, 0x3E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0C, 0x30, 0x22, 0x21, 0x8A, 0x51, +0x80, 0x40, 0x23, 0x08, 0xA4, 0x3E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0D, 0x70, 0x22, 0x21, +0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xA6, 0x7E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0E, 0x70, +0x22, 0x21, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xA0, 0xFE, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, +0x10, 0xF0, 0x22, 0x21, 0x8A, 0x51, 0x80, 0x40, 0x02, 0xF0, 0xA3, 0x8A, 0x23, 0x02, 0x03, 0x18, +0x08, 0x40, 0x9C, 0xA8, 0xA2, 0xC0, 0x21, 0xC8, 0x03, 0x59, 0x2B, 0xE9, 0x22, 0xC8, 0x86, 0xC0, +0x22, 0xC8, 0x86, 0xC0, 0x2F, 0x29, 0x22, 0xC8, 0x85, 0xC0, 0x22, 0xC8, 0x85, 0xC0, 0x08, 0x88, +0x08, 0x40, 0xB4, 0x00, 0x34, 0x8E, 0xF0, 0x39, 0x0C, 0x78, 0xB8, 0x00, 0xBB, 0xC1, 0x38, 0x08, +0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x54, 0x70, 0xA7, 0x23, 0x8A, 0x51, 0x38, 0x08, 0x02, 0xBE, +0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x54, 0x70, 0xA7, 0x23, 0x8A, 0x51, 0x02, 0xF0, 0xA1, 0xC0, +0x54, 0x70, 0x30, 0x24, 0x8A, 0x51, 0xE5, 0x40, 0xE5, 0x9F, 0x46, 0xA9, 0x02, 0xF0, 0xA1, 0xC0, +0x57, 0xF0, 0x30, 0x24, 0x8A, 0x51, 0xB5, 0x40, 0x02, 0xF0, 0xA1, 0xC0, 0x58, 0x70, 0x30, 0x24, +0x8A, 0x51, 0xB6, 0x40, 0x3B, 0x88, 0x25, 0x3E, 0x84, 0x80, 0x35, 0x48, 0x44, 0x24, 0x8A, 0x51, +0xA4, 0xC0, 0x36, 0x48, 0x44, 0x24, 0x8A, 0x51, 0x24, 0x47, 0x83, 0x93, 0x80, 0x40, 0x0F, 0xB0, +0xBB, 0x0A, 0x3B, 0x82, 0x03, 0x5C, 0x37, 0x29, 0xBA, 0x81, 0x25, 0x08, 0xB9, 0x40, 0xB7, 0xC1, +0xBB, 0xC1, 0x3B, 0x88, 0x25, 0x3E, 0x84, 0x80, 0x39, 0x48, 0x00, 0x42, 0x03, 0x18, 0x7F, 0xA9, +0x3B, 0x88, 0x25, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xB9, 0x40, 0x3B, 0x88, 0xB7, 0x80, 0x0F, 0xB0, +0xBB, 0x0A, 0x3B, 0x82, 0x03, 0x5C, 0x71, 0xE9, 0x37, 0x88, 0x25, 0x3E, 0x84, 0x80, 0xFF, 0xB0, +0x80, 0x40, 0x08, 0xF0, 0xBA, 0xCA, 0x3A, 0x42, 0x03, 0x5C, 0x6D, 0x29, 0x39, 0x48, 0x08, 0x40, +0xB2, 0x00, 0xC9, 0x41, 0xCA, 0x41, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x53, 0xB0, 0xA7, 0x23, +0xC7, 0x81, 0x49, 0x08, 0xB3, 0x40, 0x4A, 0x08, 0xBC, 0x40, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x49, 0x87, 0xB4, 0x00, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x87, 0xBD, 0x80, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x49, 0x87, 0xB5, 0x40, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x02, 0xBE, 0x80, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x49, 0x02, 0xB6, 0x40, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x87, 0xBF, 0xC0, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x49, 0x02, 0xB7, 0x80, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x02, 0xC0, 0x80, 0xC8, 0x01, 0x48, 0xC8, 0x33, 0x7E, +0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x27, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, 0xA7, 0x23, 0x8A, 0x51, +0x48, 0xC8, 0x3C, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x28, 0x30, 0xA2, 0x01, 0xA2, 0x4A, +0xA7, 0x23, 0x47, 0x48, 0x43, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xD2, 0xE3, +0x8A, 0x51, 0xC6, 0x00, 0x48, 0xC8, 0x03, 0x59, 0x01, 0x2A, 0x45, 0x08, 0x46, 0x02, 0x03, 0x18, +0x0D, 0xAA, 0x46, 0x08, 0xC5, 0x00, 0x48, 0xC8, 0x33, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xC9, 0x00, +0x48, 0xC8, 0x3C, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xCA, 0x00, 0x05, 0x30, 0xC8, 0x4A, 0x48, 0xC2, +0x03, 0x5C, 0xDE, 0x69, 0x07, 0x70, 0xC7, 0xCA, 0x47, 0x42, 0x49, 0x08, 0xB3, 0x40, 0x4A, 0x08, +0xBC, 0x40, 0x03, 0x5C, 0x9D, 0x29, 0x49, 0x4A, 0xB4, 0x00, 0x4A, 0x4A, 0xBD, 0x80, 0x49, 0x4A, +0xB5, 0x40, 0x4A, 0x43, 0xBE, 0x80, 0x49, 0x43, 0xB6, 0x40, 0x4A, 0x4A, 0xBF, 0xC0, 0x49, 0x43, +0xB7, 0x80, 0x4A, 0x43, 0xC0, 0x80, 0x49, 0x08, 0xB8, 0x00, 0x4A, 0x4A, 0xC1, 0xC0, 0x49, 0x08, +0xB9, 0x40, 0x4A, 0x43, 0xC2, 0xC0, 0x49, 0x4A, 0xBA, 0x40, 0x4A, 0x08, 0xC3, 0x00, 0x49, 0x43, +0xBB, 0x80, 0x4A, 0x08, 0xC4, 0xC0, 0xC8, 0x01, 0x48, 0xC8, 0x33, 0x7E, 0x84, 0x80, 0x00, 0x48, +0xA1, 0xC0, 0x27, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, 0xA7, 0x23, 0x8A, 0x51, 0x48, 0xC8, 0x3C, 0x7E, +0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x28, 0x30, 0xA2, 0x01, 0xA2, 0x4A, 0xA7, 0x23, 0x8A, 0x51, +0x07, 0x70, 0xD2, 0xE3, 0x8A, 0x51, 0xC6, 0x00, 0x48, 0xC8, 0x03, 0x59, 0x5B, 0x2A, 0x45, 0x08, +0x46, 0x02, 0x03, 0x18, 0x67, 0x2A, 0x46, 0x08, 0xC5, 0x00, 0x48, 0xC8, 0x33, 0x7E, 0x84, 0x80, +0x00, 0x48, 0xC9, 0x00, 0x48, 0xC8, 0x3C, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xCA, 0x00, 0x09, 0x30, +0xC8, 0x4A, 0x48, 0xC2, 0x03, 0x5C, 0x3C, 0xEA, 0x49, 0x08, 0xA1, 0xC0, 0x27, 0xB0, 0xA2, 0x01, +0xA2, 0x4A, 0xA7, 0x23, 0x8A, 0x51, 0x4A, 0x08, 0xA1, 0xC0, 0x28, 0x30, 0xA2, 0x01, 0xA2, 0x4A, +0xA7, 0x6B, 0xB3, 0x40, 0xCB, 0x81, 0xCC, 0x41, 0x33, 0xCB, 0x82, 0x6A, 0x74, 0xB0, 0xC7, 0x40, +0x75, 0xF0, 0x85, 0xAA, 0x72, 0xB0, 0xC7, 0x40, 0x73, 0xF0, 0xC8, 0xC0, 0x33, 0x48, 0xA1, 0xC0, +0x02, 0xF0, 0xA2, 0xC0, 0x53, 0xB0, 0xA7, 0x23, 0xCA, 0x41, 0x4B, 0x48, 0xB5, 0x40, 0x4C, 0x08, +0xBE, 0x80, 0x4A, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4B, 0xC7, +0xB6, 0x40, 0x4A, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4C, 0x87, +0xBF, 0xC0, 0x4A, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4B, 0xC7, +0xB7, 0x80, 0x4A, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4C, 0x02, +0xC0, 0x80, 0x4A, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4B, 0x42, +0xB8, 0x00, 0x4A, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4C, 0x87, +0xC1, 0xC0, 0x4A, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4B, 0x42, +0xB9, 0x40, 0x4A, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x4C, 0x02, +0xC2, 0xC0, 0xCD, 0x81, 0x1F, 0xF0, 0xA1, 0xC0, 0xE0, 0x70, 0xA2, 0xC0, 0x4D, 0x48, 0x35, 0x7E, +0x84, 0x80, 0x00, 0x48, 0xBB, 0x63, 0x8A, 0x51, 0xB2, 0x00, 0x4D, 0x48, 0x35, 0x7E, 0x84, 0x80, +0x32, 0x08, 0x80, 0x40, 0x1F, 0xF0, 0xA1, 0xC0, 0xE0, 0x70, 0xA2, 0xC0, 0x4D, 0x48, 0x3E, 0xBE, +0x84, 0x80, 0x00, 0x48, 0xBB, 0x63, 0x8A, 0x51, 0xB2, 0x00, 0x4D, 0x48, 0x3E, 0xBE, 0x84, 0x80, +0x32, 0x08, 0x80, 0x40, 0x4D, 0x48, 0x35, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0xA2, 0x01, +0x47, 0x48, 0xA7, 0x23, 0x8A, 0x51, 0x4D, 0x48, 0x3E, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, +0xA2, 0x01, 0x48, 0xC8, 0xA7, 0x23, 0x4A, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, +0x8A, 0x51, 0xD2, 0xE3, 0x8A, 0x51, 0xC9, 0x00, 0x4D, 0x48, 0x03, 0x59, 0x13, 0xEB, 0x34, 0x08, +0x49, 0x02, 0x03, 0x18, 0x1F, 0x6B, 0x49, 0x08, 0xB4, 0x00, 0x4D, 0x48, 0x35, 0x7E, 0x84, 0x80, +0x00, 0x48, 0xCB, 0x40, 0x4D, 0x48, 0x3E, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xCC, 0x00, 0x05, 0x30, +0xCD, 0xCA, 0x4D, 0x42, 0x03, 0x5C, 0xD2, 0xEA, 0x05, 0x30, 0xCA, 0x8A, 0x4A, 0x02, 0x4B, 0x48, +0xB5, 0x40, 0x4C, 0x08, 0xBE, 0x80, 0x03, 0x5C, 0x91, 0xAA, 0x4B, 0x8A, 0xB6, 0x40, 0x4C, 0x4A, +0xBF, 0xC0, 0x4B, 0x8A, 0xB7, 0x80, 0x4C, 0x43, 0xC0, 0x80, 0x4B, 0x83, 0xB8, 0x00, 0x4C, 0x4A, +0xC1, 0xC0, 0x4B, 0x83, 0xB9, 0x40, 0x4C, 0x43, 0xC2, 0xC0, 0x4B, 0x48, 0xBA, 0x40, 0x4C, 0x4A, +0xC3, 0x00, 0x4B, 0x48, 0xBB, 0x80, 0x4C, 0x43, 0xC4, 0xC0, 0x4B, 0x8A, 0xBC, 0x40, 0x4C, 0x08, +0xC5, 0x00, 0x4B, 0x83, 0xBD, 0x80, 0x4C, 0x08, 0xC6, 0x00, 0xCD, 0x81, 0x1F, 0xF0, 0xA1, 0xC0, +0xE0, 0x70, 0xA2, 0xC0, 0x4D, 0x48, 0x35, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xBB, 0x63, 0x8A, 0x51, +0xB2, 0x00, 0x4D, 0x48, 0x35, 0x7E, 0x84, 0x80, 0x32, 0x08, 0x80, 0x40, 0x1F, 0xF0, 0xA1, 0xC0, +0xE0, 0x70, 0xA2, 0xC0, 0x4D, 0x48, 0x3E, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xBB, 0x63, 0x8A, 0x51, +0xB2, 0x00, 0x4D, 0x48, 0x3E, 0xBE, 0x84, 0x80, 0x32, 0x08, 0x80, 0x40, 0x4D, 0x48, 0x35, 0x7E, +0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0xA2, 0x01, 0x47, 0x48, 0xA7, 0x23, 0x8A, 0x51, 0x4D, 0x48, +0x3E, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0xA2, 0x01, 0x48, 0xC8, 0xA7, 0x23, 0x8A, 0x51, +0x07, 0x70, 0xD2, 0xE3, 0x8A, 0x51, 0xC9, 0x00, 0x4D, 0x48, 0x03, 0x59, 0x8B, 0x2B, 0x34, 0x08, +0x49, 0x02, 0x03, 0x18, 0x97, 0x6B, 0x49, 0x08, 0xB4, 0x00, 0x4D, 0x48, 0x35, 0x7E, 0x84, 0x80, +0x00, 0x48, 0xCB, 0x40, 0x4D, 0x48, 0x3E, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xCC, 0x00, 0x09, 0x30, +0xCD, 0xCA, 0x4D, 0x42, 0x03, 0x5C, 0x4E, 0x2B, 0x4B, 0x48, 0xA1, 0xC0, 0xA2, 0x01, 0x47, 0x48, +0xA7, 0x23, 0x8A, 0x51, 0x4C, 0x08, 0xA1, 0xC0, 0xA2, 0x01, 0x48, 0xC8, 0xA7, 0x6B, 0xA3, 0x00, +0x22, 0x0A, 0x03, 0x59, 0xB5, 0x6B, 0x22, 0xC8, 0x63, 0x86, 0x03, 0x59, 0xB5, 0x6B, 0x22, 0xC8, +0x88, 0x80, 0x80, 0xF0, 0x8C, 0xC0, 0x22, 0xC8, 0xE3, 0x40, 0x21, 0xC8, 0x88, 0x80, 0x23, 0x08, +0x80, 0x38, 0x8C, 0xC0, 0x08, 0x40, 0xA4, 0xC0, 0x21, 0xC8, 0x80, 0x7A, 0xA3, 0x00, 0x24, 0xC8, +0x80, 0x7A, 0xA3, 0x42, 0x03, 0x18, 0xC6, 0x2B, 0x21, 0xC8, 0x08, 0x40, 0x24, 0xC8, 0x80, 0x7A, +0xA3, 0x00, 0x22, 0xC8, 0x80, 0x7A, 0xA3, 0x42, 0x03, 0x18, 0xD0, 0xEB, 0x22, 0xC8, 0x08, 0x40, +0x24, 0xC8, 0x08, 0x40, 0xAA, 0x00, 0x2A, 0x8E, 0xF0, 0x39, 0x0C, 0x78, 0xAE, 0x40, 0xB1, 0x41, +0x2E, 0x48, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x54, 0x70, 0xA7, 0x23, 0x8A, 0x51, 0x2E, 0x48, +0x02, 0xBE, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x54, 0x70, 0xA7, 0x23, 0x8A, 0x51, 0x02, 0xF0, +0xA1, 0xC0, 0x54, 0x70, 0x30, 0x24, 0x8A, 0x51, 0xE5, 0x40, 0xE5, 0x9F, 0xE7, 0xAB, 0x02, 0xF0, +0xA1, 0xC0, 0x57, 0xF0, 0x30, 0x24, 0x8A, 0x51, 0xAB, 0x40, 0x02, 0xF0, 0xA1, 0xC0, 0x58, 0x70, +0x30, 0x24, 0x8A, 0x51, 0xAC, 0x00, 0x31, 0x08, 0x25, 0x3E, 0x84, 0x80, 0x2B, 0x48, 0x44, 0x24, +0x8A, 0x51, 0xA4, 0xC0, 0x2C, 0x08, 0x44, 0x24, 0x8A, 0x51, 0x24, 0x47, 0x80, 0x40, 0x05, 0x30, +0xB1, 0x8A, 0x31, 0x02, 0x03, 0x5C, 0xD8, 0x2B, 0xB0, 0x01, 0x25, 0x08, 0xAF, 0x80, 0xAD, 0x81, +0xB1, 0x41, 0x31, 0x08, 0x25, 0x3E, 0x84, 0x80, 0x2F, 0x88, 0x00, 0x42, 0x03, 0x18, 0x1F, 0x2C, +0x31, 0x08, 0x25, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xAF, 0x80, 0x31, 0x08, 0xAD, 0x40, 0x05, 0x30, +0xB1, 0x8A, 0x31, 0x02, 0x03, 0x5C, 0x11, 0x6C, 0x2D, 0x48, 0x25, 0x3E, 0x84, 0x80, 0xFF, 0xB0, +0x80, 0x40, 0x03, 0x30, 0xB0, 0x4A, 0x30, 0xC2, 0x03, 0x5C, 0x0D, 0xAC, 0x2F, 0x88, 0x08, 0x40, +0xA2, 0xC0, 0x21, 0x0A, 0x03, 0x59, 0x3E, 0x2C, 0x21, 0xC8, 0x63, 0x86, 0x03, 0x59, 0x3E, 0x2C, +0x21, 0xC8, 0x88, 0x80, 0x80, 0xF0, 0x8C, 0xC0, 0x21, 0xC8, 0xE3, 0x40, 0x22, 0xC8, 0x8C, 0xC0, +0x22, 0xC8, 0x8C, 0xC0, 0x08, 0x88, 0x08, 0x40, 0xA1, 0xC0, 0xA1, 0x1F, 0x4A, 0xAC, 0x21, 0x03, +0xFF, 0x3A, 0x08, 0x40, 0x21, 0xC8, 0x08, 0x40, 0x02, 0xF0, 0xA0, 0x80, 0x95, 0x41, 0x96, 0x41, +0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x10, 0xF0, 0x9E, 0x40, +0x8B, 0x41, 0x83, 0x96, 0xD0, 0x01, 0xD1, 0x41, 0x83, 0x52, 0xD4, 0x41, 0x54, 0x08, 0xA0, 0xFE, +0x84, 0x80, 0x80, 0x81, 0x54, 0x08, 0xA8, 0x3E, 0x84, 0x80, 0x80, 0x81, 0x54, 0x08, 0xB0, 0x3E, +0x84, 0x80, 0x80, 0x81, 0x54, 0x08, 0xB8, 0x7E, 0x84, 0x80, 0x80, 0x81, 0x54, 0x08, 0xC0, 0xFE, +0x84, 0x80, 0x80, 0x81, 0x54, 0x08, 0xC8, 0x3E, 0x84, 0x80, 0x80, 0x81, 0x54, 0x08, 0xD2, 0x7E, +0x84, 0x80, 0x08, 0xF0, 0x80, 0x81, 0xD4, 0x8A, 0x54, 0x02, 0x03, 0x5C, 0x5E, 0x2C, 0x00, 0xB0, +0xA1, 0x01, 0xA1, 0x43, 0x8A, 0x51, 0x30, 0x24, 0x8A, 0x51, 0x03, 0xBA, 0x03, 0x9D, 0x7F, 0xAC, +0x03, 0x30, 0xE3, 0x40, 0xC8, 0x70, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x56, 0xB0, 0x8A, 0x51, +0xA7, 0x23, 0x8A, 0x51, 0x02, 0xF0, 0xA1, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0x30, 0x24, 0x8A, 0x51, +0xE5, 0x40, 0xC8, 0xFA, 0x03, 0x59, 0x1B, 0x94, 0xC9, 0xB0, 0xA1, 0xC0, 0x04, 0xF0, 0xA2, 0x01, +0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x04, 0xF0, 0xA1, 0x01, 0x8A, 0x51, 0x22, 0x21, 0x8A, 0x51, +0xE5, 0x40, 0xC9, 0x3A, 0x03, 0x59, 0x9B, 0xD4, 0xCA, 0xB0, 0xA1, 0xC0, 0x04, 0xF0, 0xA2, 0x01, +0xA2, 0x4A, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x04, 0xF0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, +0x22, 0x21, 0x8A, 0x51, 0xE5, 0x40, 0xCA, 0x3A, 0x03, 0x59, 0x1B, 0xD5, 0x14, 0xC8, 0xCE, 0x40, +0x06, 0x30, 0x03, 0xD0, 0xCE, 0xCC, 0xFF, 0x7E, 0x03, 0x9D, 0xC1, 0xAC, 0x4E, 0x48, 0xD1, 0x00, +0x14, 0x5C, 0xCE, 0x2C, 0x83, 0x52, 0x03, 0x53, 0x66, 0xD6, 0xD1, 0xEC, 0x83, 0x52, 0x03, 0x53, +0x66, 0x92, 0x94, 0x9C, 0xD7, 0x6C, 0x83, 0x52, 0x03, 0x53, 0xE6, 0x16, 0xDA, 0x2C, 0x83, 0x52, +0x03, 0x53, 0xE6, 0xD2, 0x14, 0x9D, 0xE0, 0xAC, 0x83, 0x52, 0x03, 0x53, 0xE6, 0x57, 0xE3, 0x2C, +0x83, 0x52, 0x03, 0x53, 0xE6, 0x13, 0x94, 0xDD, 0xE9, 0x2C, 0x83, 0x52, 0x03, 0x53, 0x67, 0xD4, +0xEC, 0x2C, 0x83, 0x52, 0x03, 0x53, 0x67, 0x90, 0x14, 0x9E, 0xF2, 0x2C, 0x83, 0x52, 0x03, 0x53, +0x66, 0x94, 0xF5, 0x6C, 0x83, 0x52, 0x03, 0x53, 0x66, 0x50, 0x94, 0xDE, 0xFB, 0xAC, 0x83, 0x52, +0x03, 0x53, 0x66, 0x17, 0xFE, 0xAC, 0x83, 0x52, 0x03, 0x53, 0x66, 0xD3, 0xD1, 0x48, 0x03, 0x9D, +0x05, 0xAD, 0x83, 0x52, 0x03, 0x53, 0xE6, 0x15, 0x08, 0x6D, 0x83, 0x52, 0x03, 0x53, 0xE6, 0xD1, +0x51, 0x8B, 0x0E, 0xED, 0x83, 0x52, 0x03, 0x53, 0xE6, 0xD4, 0x11, 0xAD, 0x83, 0x52, 0x03, 0x53, +0xE6, 0x90, 0x51, 0x08, 0x02, 0x7A, 0x03, 0x9D, 0x19, 0xED, 0x83, 0x52, 0x03, 0x53, 0x66, 0xD5, +0x1C, 0xED, 0x83, 0x52, 0x03, 0x53, 0x66, 0x91, 0x8A, 0x51, 0x9B, 0xA0, 0x8A, 0x51, 0xD4, 0x41, +0x54, 0x08, 0xE0, 0x3E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xCE, 0x40, 0x54, 0x08, 0xE2, 0x7E, +0x84, 0x80, 0x4E, 0x48, 0x80, 0x40, 0x54, 0x08, 0xDE, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xCE, 0x40, +0x54, 0x08, 0x55, 0x7E, 0x84, 0x80, 0x4E, 0x48, 0x80, 0x40, 0x54, 0x08, 0xDA, 0xBE, 0x84, 0x80, +0x00, 0x48, 0xCE, 0x40, 0x54, 0x08, 0xDC, 0xBE, 0x84, 0x80, 0x4E, 0x48, 0x80, 0x40, 0x54, 0x08, +0xE8, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xCE, 0x40, 0x54, 0x08, 0x5B, 0xBE, 0x84, 0x80, 0x4E, 0x48, +0x80, 0x40, 0x54, 0x08, 0xE6, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xCE, 0x40, 0x54, 0x08, 0x59, 0x7E, +0x84, 0x80, 0x4E, 0x48, 0x80, 0x40, 0x54, 0x08, 0xE4, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xCE, 0x40, +0x54, 0x08, 0x57, 0xBE, 0x84, 0x80, 0x4E, 0x48, 0x80, 0x40, 0x02, 0xF0, 0xD4, 0x8A, 0x54, 0x02, +0x03, 0x5C, 0x20, 0x6D, 0x69, 0xB0, 0xA1, 0x01, 0xA2, 0x01, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, +0x19, 0x10, 0x19, 0x51, 0x99, 0x50, 0x99, 0x91, 0x21, 0x30, 0xA1, 0x01, 0xA1, 0x4A, 0xA2, 0x01, +0xA2, 0x4A, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x21, 0x30, 0xA1, 0x01, 0xA2, 0x01, 0xA2, 0x4A, +0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x07, 0x70, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x30, 0x30, +0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0xE6, 0xD8, 0xE8, 0x41, 0x27, 0xB0, 0xA1, 0x01, 0xA2, 0x01, +0xA2, 0x4A, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x28, 0x30, 0xA1, 0x01, 0xA2, 0x01, 0xA2, 0x4A, +0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x66, 0x1E, 0x3E, 0x6E, 0xE6, 0x5D, 0x66, 0xD9, 0x9A, 0x2D, +0xE6, 0x1C, 0xBD, 0xAD, 0x18, 0x14, 0xE6, 0x1C, 0xB2, 0x2D, 0x03, 0x30, 0xA1, 0xC0, 0x02, 0xF0, +0xA2, 0xC0, 0x2C, 0x70, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x99, 0xD5, 0x29, 0x70, 0xD0, 0xC0, +0x96, 0xB0, 0xCF, 0x80, 0xA6, 0xB0, 0xCE, 0x40, 0xCE, 0x0B, 0xAC, 0x2D, 0xCF, 0x4B, 0xAC, 0x2D, +0xD0, 0x8B, 0xAC, 0x2D, 0x03, 0x30, 0x83, 0x52, 0x03, 0x53, 0xEE, 0x80, 0x0F, 0xB0, 0xEF, 0xC0, +0x00, 0xB0, 0x8A, 0x95, 0x02, 0x26, 0x8A, 0x51, 0xC7, 0x6D, 0x18, 0xD0, 0x02, 0xF0, 0xEE, 0x80, +0x0E, 0x70, 0xEF, 0xC0, 0x01, 0xF0, 0xAA, 0x41, 0x8A, 0x95, 0x75, 0x25, 0x8A, 0x51, 0x6C, 0x48, +0x83, 0x96, 0xD2, 0x00, 0x83, 0x52, 0x6B, 0x88, 0x83, 0x96, 0xD3, 0x40, 0x83, 0x52, 0x64, 0x08, +0x83, 0x96, 0xD4, 0x00, 0x83, 0x52, 0x02, 0xF0, 0xA1, 0x01, 0xA2, 0xC0, 0x53, 0xB0, 0x8A, 0x51, +0xA7, 0x23, 0x8A, 0x51, 0x14, 0x30, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x56, 0xB0, 0x8A, 0x51, +0xA7, 0x23, 0x8A, 0x51, 0x02, 0xF0, 0x8A, 0x51, 0x31, 0x61, 0x8A, 0x51, 0xD2, 0x00, 0xEC, 0xF0, +0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x00, 0xB0, +0x8A, 0x51, 0x79, 0xE2, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0x31, 0x61, 0x8A, 0x51, 0xD3, 0x40, +0x02, 0xF0, 0xA1, 0x01, 0xA2, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x24, 0x30, +0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x2A, 0x70, +0xCF, 0x80, 0x8D, 0xB0, 0xCE, 0x40, 0xCE, 0x0B, 0x0B, 0xEE, 0xCF, 0x4B, 0x0B, 0xEE, 0x10, 0x6E, +0x83, 0x52, 0x02, 0xF0, 0x03, 0x53, 0xA1, 0x01, 0xA2, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0xA7, 0x23, +0x8A, 0x51, 0xE6, 0x5D, 0x66, 0xD9, 0x1E, 0x2E, 0xE6, 0x1C, 0x25, 0xEE, 0x99, 0x91, 0x03, 0x30, +0xA1, 0xC0, 0x00, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, 0x29, 0xEE, 0x03, 0x30, 0xA1, 0xC0, 0x00, 0xB0, +0xA2, 0x01, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x52, 0x08, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, +0xCE, 0x40, 0x53, 0x48, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0x4E, 0x42, 0x1E, 0x7E, 0x83, 0x96, +0xD0, 0xC0, 0x32, 0x70, 0x50, 0xC2, 0x83, 0x52, 0x03, 0x18, 0x9B, 0x15, 0x83, 0x52, 0xE6, 0x5E, +0xEE, 0xAE, 0xE6, 0x5D, 0x66, 0xD9, 0x46, 0xEE, 0xE6, 0x1C, 0x69, 0x2E, 0x18, 0xD0, 0xE6, 0x1C, +0x5E, 0x6E, 0x03, 0x30, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x2C, 0x70, 0x8A, 0x51, 0xA7, 0x23, +0x8A, 0x51, 0x99, 0x94, 0x29, 0x70, 0xD0, 0xC0, 0x96, 0xB0, 0xCF, 0x80, 0xA6, 0xB0, 0xCE, 0x40, +0xCE, 0x0B, 0x58, 0xEE, 0xCF, 0x4B, 0x58, 0xEE, 0xD0, 0x8B, 0x58, 0xEE, 0x03, 0x30, 0x83, 0x52, +0x03, 0x53, 0xEE, 0x80, 0x0F, 0xB0, 0xEF, 0xC0, 0x01, 0xF0, 0x8A, 0x95, 0x02, 0x26, 0x8A, 0x51, +0x74, 0x2E, 0x18, 0x14, 0x02, 0xF0, 0xEE, 0x80, 0x0E, 0x70, 0xEF, 0xC0, 0x01, 0xF0, 0xAA, 0x41, +0xAA, 0x8A, 0x8A, 0x95, 0x75, 0x25, 0x8A, 0x51, 0x6C, 0x48, 0x83, 0x96, 0xD2, 0x00, 0x83, 0x52, +0x6B, 0x88, 0x83, 0x96, 0xD3, 0x40, 0x83, 0x52, 0x64, 0x08, 0x83, 0x96, 0xD4, 0x00, 0x83, 0x52, +0x02, 0xF0, 0xA1, 0x01, 0xA1, 0x4A, 0xA2, 0xC0, 0x53, 0xB0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, +0x14, 0x30, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, +0x02, 0xF0, 0x8A, 0x51, 0x31, 0x61, 0x8A, 0x51, 0xD2, 0x00, 0xEC, 0xF0, 0xA1, 0xC0, 0x02, 0xF0, +0xA2, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x01, 0xF0, 0x8A, 0x51, 0x79, 0xE2, +0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0x31, 0x61, 0x8A, 0x51, 0xD3, 0x40, 0x02, 0xF0, 0xA1, 0x01, +0xA2, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x25, 0x70, 0xA1, 0xC0, 0x02, 0xF0, +0xA2, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x2A, 0x70, 0xCF, 0x80, 0x8D, 0xB0, +0xCE, 0x40, 0xCE, 0x0B, 0xB9, 0x6E, 0xCF, 0x4B, 0xB9, 0x6E, 0xBE, 0xAE, 0x83, 0x52, 0x02, 0xF0, +0x03, 0x53, 0xA1, 0x01, 0xA2, 0xC0, 0x2F, 0xF0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0xE6, 0x5D, +0x66, 0xD9, 0xCC, 0x2E, 0xE6, 0x1C, 0xD4, 0x2E, 0xE6, 0x1C, 0xCF, 0xAE, 0x99, 0x50, 0x03, 0x30, +0xA1, 0xC0, 0x00, 0xB0, 0xA2, 0x01, 0xD9, 0x6E, 0x03, 0x30, 0xA1, 0xC0, 0x00, 0xB0, 0xA2, 0x01, +0xA2, 0x4A, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, 0x52, 0x08, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, +0xCE, 0x40, 0x53, 0x48, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0x4E, 0x42, 0x1E, 0x7E, 0x83, 0x96, +0xD1, 0x00, 0x32, 0x70, 0x51, 0x02, 0x83, 0x52, 0x03, 0x18, 0x1B, 0xD6, 0x83, 0x52, 0x66, 0xDC, +0xF3, 0xAE, 0x03, 0x30, 0xF4, 0x6E, 0x02, 0xF0, 0xEE, 0x80, 0x01, 0xF0, 0xE1, 0x00, 0x14, 0x30, +0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0xE6, 0x9F, +0x72, 0x6F, 0x18, 0xD0, 0x02, 0xF0, 0xA1, 0x01, 0xA2, 0xC0, 0x53, 0xB0, 0x8A, 0x51, 0xA7, 0x23, +0x8A, 0x51, 0x9B, 0x16, 0xD4, 0x41, 0x27, 0xB0, 0xA1, 0x01, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, +0xA7, 0x23, 0x8A, 0x51, 0x28, 0x30, 0xA1, 0x01, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0xA7, 0x23, +0x8A, 0x51, 0x54, 0x08, 0x08, 0xBE, 0xEF, 0xC0, 0x00, 0xB0, 0xAA, 0x41, 0xD4, 0x48, 0x03, 0x59, +0x01, 0xF0, 0x8A, 0x95, 0x75, 0x25, 0x8A, 0x51, 0x54, 0x08, 0xD2, 0x7E, 0x84, 0x80, 0x6B, 0x0E, +0xF0, 0x39, 0x64, 0x04, 0x83, 0x93, 0x80, 0x40, 0x03, 0x30, 0x8A, 0x51, 0x31, 0x61, 0x8A, 0x51, +0xD2, 0x00, 0x00, 0xB0, 0x8A, 0x51, 0x90, 0x21, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0x31, 0x61, +0x8A, 0x51, 0xD3, 0x40, 0x52, 0x08, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0xCE, 0x40, 0x53, 0x48, +0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0x4E, 0x42, 0x18, 0xFE, 0xCF, 0x80, 0x54, 0x08, 0xC0, 0xFE, +0x84, 0x80, 0x4F, 0x88, 0x80, 0x40, 0x54, 0x08, 0xA0, 0xFE, 0x84, 0x80, 0x27, 0xB0, 0xA1, 0x01, +0xA1, 0x4A, 0x8A, 0x51, 0x30, 0x24, 0x8A, 0x51, 0x80, 0x40, 0x54, 0x08, 0xA8, 0x3E, 0x84, 0x80, +0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0x30, 0x24, 0x8A, 0x51, 0x80, 0x40, 0x54, 0x08, +0xC0, 0xFE, 0x84, 0x80, 0x14, 0x30, 0x00, 0x42, 0x03, 0x5C, 0x9B, 0xD2, 0x08, 0xF0, 0xD4, 0x8A, +0x54, 0x02, 0x03, 0x5C, 0x0B, 0x2F, 0x03, 0x30, 0xA1, 0xC0, 0x00, 0xB0, 0xA2, 0x01, 0x8A, 0x95, +0xF0, 0x27, 0x8A, 0x51, 0x67, 0x1C, 0xE8, 0x6F, 0x18, 0x14, 0x02, 0xF0, 0xA1, 0x01, 0xA1, 0x4A, +0xA2, 0xC0, 0x53, 0xB0, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x1B, 0x17, 0xD4, 0x41, 0x27, 0xB0, +0xA1, 0x01, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x28, 0x30, 0xA1, 0x01, +0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x54, 0x08, 0x08, 0xBE, 0xEF, 0xC0, +0x00, 0xB0, 0xAA, 0x41, 0xAA, 0x8A, 0xD4, 0x48, 0x03, 0x59, 0x01, 0xF0, 0x8A, 0x95, 0x75, 0x25, +0x8A, 0x51, 0x54, 0x08, 0xD2, 0x7E, 0x84, 0x80, 0x6B, 0x0E, 0xF0, 0x39, 0x64, 0x04, 0x83, 0x93, +0x80, 0x40, 0x03, 0x30, 0x8A, 0x51, 0x31, 0x61, 0x8A, 0x51, 0xD2, 0x00, 0x01, 0xF0, 0x8A, 0x51, +0x90, 0x21, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0x31, 0x61, 0x8A, 0x51, 0xD3, 0x40, 0x52, 0x08, +0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, 0xCE, 0x40, 0x53, 0x48, 0x8A, 0x95, 0xEB, 0x24, 0x8A, 0x51, +0x4E, 0x42, 0x18, 0xFE, 0xCF, 0x80, 0x54, 0x08, 0xC8, 0x3E, 0x84, 0x80, 0x4F, 0x88, 0x80, 0x40, +0x54, 0x08, 0xB0, 0x3E, 0x84, 0x80, 0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0x30, 0x24, +0x8A, 0x51, 0x80, 0x40, 0x54, 0x08, 0xB8, 0x7E, 0x84, 0x80, 0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A, +0x8A, 0x51, 0x30, 0x24, 0x8A, 0x51, 0x80, 0x40, 0x54, 0x08, 0xC8, 0x3E, 0x84, 0x80, 0x14, 0x30, +0x00, 0x42, 0x03, 0x5C, 0x1B, 0xD3, 0x08, 0xF0, 0xD4, 0x8A, 0x54, 0x02, 0x03, 0x5C, 0x7F, 0x2F, +0x03, 0x30, 0xA1, 0xC0, 0x00, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x95, 0xF0, 0x27, 0x8A, 0x51, +0x18, 0x56, 0x18, 0x12, 0x8A, 0x95, 0x5B, 0x67, 0x8A, 0x51, 0xE4, 0xB0, 0xCE, 0x40, 0xF0, 0x6F, +0xF1, 0xAF, 0xCE, 0x0B, 0xEF, 0x2F, 0xF4, 0xAF, 0x00, 0x00, 0x0E, 0x70, 0x83, 0x52, 0x03, 0x53, +0xA1, 0xC0, 0x69, 0xB0, 0xA2, 0x01, 0x8A, 0x51, 0xA7, 0x23, 0x8A, 0x51, 0x9B, 0x57, 0xFF, 0x6F, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, @@ -427,103 +415,115 @@ static uint8_t cal_firmware[MCU_AGC_FW_BYTE] = { 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xA1, 0xC0, 0x10, 0xF0, 0x21, 0xC2, 0x21, 0xC8, 0x03, 0x18, -0xF6, 0x6C, 0x1F, 0xBE, 0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x08, 0x40, 0xA0, 0x80, 0x03, 0xD0, -0xA0, 0x0C, 0x03, 0xD0, 0xA0, 0x0C, 0x03, 0xD0, 0xA0, 0x0C, 0x20, 0x88, 0x01, 0xBE, 0x84, 0x80, -0x8A, 0x95, 0x00, 0x60, 0x08, 0x40, 0xA7, 0x40, 0x27, 0xDC, 0x0A, 0xAD, 0x83, 0x52, 0x03, 0x53, -0x18, 0x14, 0x0D, 0xED, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x07, 0x70, 0xE3, 0x40, 0x63, 0xCE, -0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, 0xA8, 0x01, 0x27, 0x48, 0xA3, 0x00, 0x00, 0xB0, -0x56, 0xE5, 0x8A, 0x95, 0x98, 0x95, 0x98, 0x51, 0xA6, 0x41, 0x74, 0xB0, 0x0E, 0x02, 0x03, 0x5C, -0x27, 0x2D, 0x0B, 0x70, 0x63, 0x42, 0x03, 0x18, 0x27, 0x2D, 0xE3, 0xCA, 0x31, 0xED, 0x2D, 0xB0, -0x0E, 0x02, 0x03, 0x18, 0x36, 0x2D, 0x08, 0xF0, 0x63, 0x42, 0x03, 0x5C, 0x36, 0x2D, 0xFF, 0xB0, -0xE3, 0x07, 0x63, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, 0x24, 0x30, 0x0F, 0x42, -0x03, 0x5C, 0x40, 0x6D, 0x09, 0x30, 0x28, 0xC2, 0x03, 0x18, 0x40, 0x6D, 0xA8, 0x4A, 0x49, 0xED, -0x10, 0xF0, 0x0F, 0x42, 0x03, 0x18, 0x50, 0xAD, 0x28, 0xC8, 0x03, 0x59, 0x50, 0xAD, 0xFF, 0xB0, -0xA8, 0x87, 0x27, 0x48, 0xA3, 0x00, 0x28, 0xC8, 0x56, 0xE5, 0x8A, 0x95, 0x98, 0x95, 0x98, 0x51, -0x14, 0x30, 0xA6, 0x8A, 0x26, 0x02, 0x03, 0x18, 0x08, 0x40, 0x1D, 0x2D, 0xA5, 0x00, 0x39, 0x7E, -0x84, 0x80, 0x8A, 0x95, 0x00, 0x60, 0x8A, 0x95, 0xEB, 0x80, 0x25, 0x08, 0x2F, 0xBE, 0x84, 0x80, -0x8A, 0x95, 0x00, 0x60, 0x8A, 0x95, 0xEA, 0x40, 0x6B, 0x88, 0xA4, 0xC0, 0x05, 0x30, 0x03, 0xD0, -0xA4, 0x8D, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x68, 0xED, 0x6A, 0xCD, 0x24, 0xC4, 0x67, 0x84, -0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0C, 0x30, 0xF0, 0x6F, 0xAC, 0x00, 0x01, 0xF0, 0x83, 0x96, -0xED, 0x80, 0x83, 0x52, 0x29, 0x08, 0xAA, 0xE6, 0x8A, 0x95, 0x2C, 0x08, 0x03, 0x59, 0xFE, 0xED, -0x29, 0x08, 0xE2, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xAA, 0x00, 0x29, 0x08, 0x5A, 0x7E, 0x84, 0x80, -0x2A, 0x08, 0x80, 0x40, 0x65, 0x5F, 0x92, 0xED, 0x29, 0x08, 0x54, 0x3E, 0x84, 0x80, 0x00, 0x48, -0x28, 0xFE, 0x97, 0x6D, 0x29, 0x08, 0x54, 0x3E, 0x84, 0x80, 0x00, 0x48, 0x14, 0xFE, 0xAA, 0x00, -0x29, 0x08, 0x58, 0x3E, 0x84, 0x80, 0x2A, 0x08, 0x80, 0x40, 0x29, 0x08, 0x54, 0x3E, 0x84, 0x80, -0x00, 0x48, 0xAA, 0x00, 0x29, 0x08, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xAB, 0x40, 0x2A, 0x08, -0x2B, 0x42, 0x29, 0x08, 0x03, 0x18, 0xB6, 0x6D, 0x5A, 0x7E, 0x84, 0x80, 0x00, 0x8A, 0xAA, 0x00, -0x29, 0x08, 0x5A, 0x7E, 0x84, 0x80, 0x2A, 0x08, 0x80, 0x40, 0x29, 0x08, 0xDC, 0xBE, 0x84, 0x80, -0x00, 0x48, 0xAA, 0x00, 0x29, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x2A, 0x08, 0x80, 0x40, 0x29, 0x08, -0x5A, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x29, 0x08, 0xA1, 0xC0, 0x04, 0xF0, 0xF0, 0x27, -0x8A, 0x95, 0x29, 0x08, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x29, 0x08, 0xA1, 0xC0, -0x05, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x29, 0x08, 0x56, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, -0x29, 0x08, 0xA1, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0xA0, 0xC1, 0xA0, 0x0A, 0x29, 0x08, -0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xE4, 0xB0, 0xAA, 0x00, 0xE7, 0xAD, 0xE8, 0x2D, -0xAA, 0xCB, 0xE6, 0x6D, 0xEB, 0xAD, 0x00, 0x00, 0x0F, 0xB0, 0x83, 0x52, 0x03, 0x53, 0xA0, 0x80, -0x29, 0x08, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xD0, 0x70, 0xAB, 0x40, 0xC9, 0xB0, -0xAA, 0x00, 0xAA, 0xCB, 0xF9, 0xAD, 0xAB, 0x0B, 0xF9, 0xAD, 0xFE, 0xED, 0x83, 0x52, 0x03, 0x53, -0x29, 0x08, 0x03, 0xAD, 0xAB, 0x40, 0x2B, 0x48, 0x03, 0x59, 0x0A, 0xAE, 0xAC, 0x41, 0xAC, 0x8A, -0xAD, 0x81, 0x0D, 0xEE, 0xAC, 0x41, 0xAD, 0x81, 0xAD, 0xCA, 0x83, 0x96, 0xED, 0xC1, 0x0E, 0x70, -0x83, 0x52, 0xEF, 0xC0, 0x02, 0xF0, 0xEE, 0x80, 0x2C, 0x08, 0xAA, 0xE6, 0x8A, 0x95, 0x2D, 0x48, -0xAA, 0xE6, 0x8A, 0x95, 0x2C, 0x08, 0xE2, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA9, 0x00, 0x2D, 0x48, -0x5A, 0x7E, 0x84, 0x80, 0x29, 0x08, 0x80, 0x40, 0x65, 0x5F, 0x2C, 0xEE, 0x2C, 0x08, 0x54, 0x3E, -0x84, 0x80, 0x00, 0x48, 0x28, 0xFE, 0x31, 0xEE, 0x2C, 0x08, 0x54, 0x3E, 0x84, 0x80, 0x00, 0x48, -0x14, 0xFE, 0xA9, 0x00, 0x2D, 0x48, 0x58, 0x3E, 0x84, 0x80, 0x29, 0x08, 0x80, 0x40, 0x2C, 0x08, -0x54, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA9, 0x00, 0x2D, 0x48, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, -0xAA, 0x00, 0x29, 0x08, 0x2A, 0x02, 0x03, 0x18, 0x4F, 0x6E, 0x2D, 0x48, 0x5A, 0x7E, 0x84, 0x80, -0x00, 0x8A, 0xA9, 0x00, 0x2D, 0x48, 0x5A, 0x7E, 0x84, 0x80, 0x29, 0x08, 0x80, 0x40, 0x2C, 0x08, -0xDC, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA9, 0x00, 0x2D, 0x48, 0x56, 0x7E, 0x84, 0x80, 0x29, 0x08, -0x80, 0x40, 0x2D, 0x48, 0x5A, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x2D, 0x48, 0xA1, 0xC0, -0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x2D, 0x48, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, -0x2D, 0x48, 0xA1, 0xC0, 0x05, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x2D, 0x48, 0x56, 0x7E, 0x84, 0x80, -0x00, 0x48, 0xA0, 0x80, 0x2D, 0x48, 0xA1, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0xA0, 0xC1, -0xA0, 0x0A, 0x2C, 0x08, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xA0, 0xC1, 0xA0, 0x0A, -0x2D, 0x48, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xE4, 0xB0, 0xA9, 0x00, 0x88, 0xAE, -0x89, 0xEE, 0xA9, 0xCB, 0x87, 0x2E, 0x8C, 0xEE, 0x00, 0x00, 0x03, 0x30, 0x83, 0x52, 0x03, 0x53, -0xA0, 0x80, 0x2C, 0x08, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0x0D, 0x70, 0xA0, 0x80, -0x2D, 0x48, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xD0, 0x70, 0xAA, 0x00, 0xC9, 0xB0, -0xA9, 0x00, 0xA9, 0xCB, 0xA1, 0xEE, 0xAA, 0xCB, 0xA1, 0xEE, 0xA6, 0x2E, 0x83, 0x52, 0x03, 0x53, -0x2C, 0x08, 0x03, 0xAD, 0xA5, 0x00, 0xE2, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA0, 0x80, -0x25, 0x08, 0xA1, 0xC0, 0x01, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x25, 0x08, 0x54, 0x3E, 0x84, 0x80, -0x00, 0x48, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x02, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x25, 0x08, -0xDC, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x03, 0x30, 0xF0, 0x27, -0x8A, 0x95, 0x25, 0x08, 0x5A, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, -0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x25, 0x08, 0x58, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, -0x25, 0x08, 0xA1, 0xC0, 0x05, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x25, 0x08, 0x56, 0x7E, 0x84, 0x80, -0x00, 0x48, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x6E, 0x0E, -0xF0, 0x39, 0x6F, 0xC4, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x08, 0xF0, 0xF0, 0x27, 0x8A, 0x95, -0x61, 0x08, 0xA3, 0x00, 0x04, 0xF0, 0x03, 0xD0, 0xA3, 0xCD, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, -0xF4, 0x6E, 0x23, 0x8D, 0x60, 0xC4, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x0A, 0x30, 0xF0, 0x27, -0x8A, 0x95, 0x6C, 0x48, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x0B, 0x70, 0xF0, 0x27, 0x8A, 0x95, -0x6B, 0x88, 0xA3, 0x00, 0x05, 0x30, 0x03, 0xD0, 0xA3, 0xCD, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, -0x0C, 0xEF, 0x6A, 0xCD, 0x23, 0x04, 0x67, 0x84, 0xA0, 0x80, 0x25, 0x08, 0xA1, 0xC0, 0x0C, 0x30, -0xF0, 0x27, 0x8A, 0x95, 0x68, 0x08, 0xA3, 0x00, 0x05, 0x30, 0x03, 0xD0, 0xA3, 0xCD, 0xFF, 0x7E, -0x03, 0x9D, 0x1D, 0x6F, 0x69, 0x48, 0xA4, 0xC0, 0x01, 0xF0, 0x03, 0xD0, 0xA4, 0x8D, 0xFF, 0x7E, -0x03, 0xD0, 0x03, 0x9D, 0x26, 0x2F, 0x24, 0x4D, 0x23, 0x04, 0x5D, 0x84, 0xA0, 0x80, 0x25, 0x08, -0xA1, 0xC0, 0x0D, 0x70, 0xF0, 0x27, 0x8A, 0x95, 0x03, 0xD0, 0x5E, 0x0D, 0x5C, 0x44, 0xA0, 0x80, -0x25, 0x08, 0xA1, 0xC0, 0x0E, 0x70, 0xF0, 0x27, 0x8A, 0x95, 0x83, 0x96, 0x6C, 0x48, 0x83, 0x52, -0xA3, 0x00, 0x03, 0xD0, 0xA3, 0xCD, 0x03, 0xD0, 0xA3, 0xCD, 0x03, 0xD0, 0xA3, 0xCD, 0x83, 0x96, -0x6D, 0x88, 0x83, 0x52, 0xA4, 0xC0, 0x03, 0xD0, 0xA4, 0x8D, 0x03, 0xD0, 0xA4, 0x8D, 0x83, 0x96, -0x03, 0xD0, 0x6E, 0x0D, 0x83, 0x52, 0x24, 0xC4, 0x23, 0x04, 0x6D, 0x84, 0xA0, 0x80, 0x25, 0x08, -0xA1, 0xC0, 0x10, 0xF0, 0xF0, 0x6F, 0xA3, 0x41, 0x23, 0x08, 0xEA, 0xBE, 0x84, 0x80, 0x83, 0x93, -0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, -0xE0, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x01, 0xF0, 0xF0, 0x27, -0x8A, 0x95, 0x23, 0x08, 0xDE, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, -0x02, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xDA, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, -0x23, 0x08, 0xA1, 0xC0, 0x03, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xE8, 0x7E, 0x84, 0x80, -0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, -0xE6, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x05, 0x30, 0xF0, 0x27, -0x8A, 0x95, 0x23, 0x08, 0xE4, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, -0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xAC, 0x7E, 0x84, 0x80, 0x83, 0xD7, 0x00, 0x48, -0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x08, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xA8, 0x3E, -0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0A, 0x30, 0xF0, 0x27, 0x8A, 0x95, -0x23, 0x08, 0xAA, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0B, 0x70, -0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xA2, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, -0xA1, 0xC0, 0x0C, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xA4, 0x3E, 0x84, 0x80, 0x00, 0x48, -0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0D, 0x70, 0xF0, 0x27, 0x8A, 0x95, 0x23, 0x08, 0xA6, 0x7E, -0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0E, 0x70, 0xF0, 0x27, 0x8A, 0x95, -0x23, 0x08, 0xA0, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xA0, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x10, 0xF0, -0xF0, 0x27, 0x8A, 0x95, 0x02, 0xF0, 0xA3, 0x8A, 0x23, 0x02, 0x03, 0x18, 0x08, 0x40, 0x5C, 0x6F, -0xA2, 0xC0, 0x21, 0xC8, 0x03, 0x59, 0xFA, 0xEF, 0x20, 0x88, 0x88, 0x80, 0x22, 0xC8, 0x80, 0x38, -0x86, 0xC0, 0x08, 0x40, 0x20, 0x88, 0x88, 0x80, 0x22, 0xC8, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40 +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, +0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xA2, 0xC0, 0x10, 0xF0, 0x22, 0xC2, 0x22, 0xC8, 0x03, 0x18, +0xF6, 0x6C, 0x1F, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x08, 0x40, 0xA1, 0xC0, 0x03, 0xD0, +0xA1, 0x4C, 0x03, 0xD0, 0xA1, 0x4C, 0x03, 0xD0, 0xA1, 0x4C, 0x21, 0xC8, 0x01, 0xBE, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x08, 0x40, 0xA8, 0xC0, 0x28, 0x5C, 0x0A, 0xAD, 0x83, 0x52, 0x03, 0x53, +0x18, 0x14, 0x0D, 0xED, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0x07, 0x70, 0xE4, 0x00, 0x64, 0x8E, +0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, 0xA9, 0x41, 0x28, 0xC8, 0xA4, 0xC0, 0x00, 0xB0, +0x56, 0xE5, 0x8A, 0x95, 0x98, 0x95, 0x98, 0x51, 0xA7, 0x81, 0x74, 0xB0, 0x0E, 0x02, 0x03, 0x5C, +0x27, 0x2D, 0x0B, 0x70, 0x64, 0x02, 0x03, 0x18, 0x27, 0x2D, 0xE4, 0x8A, 0x31, 0xED, 0x2D, 0xB0, +0x0E, 0x02, 0x03, 0x18, 0x36, 0x2D, 0x08, 0xF0, 0x64, 0x02, 0x03, 0x5C, 0x36, 0x2D, 0xFF, 0xB0, +0xE4, 0xC7, 0x64, 0x8E, 0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, 0x24, 0x30, 0x0F, 0x42, +0x03, 0x5C, 0x40, 0x6D, 0x09, 0x30, 0x29, 0x02, 0x03, 0x18, 0x40, 0x6D, 0xA9, 0x8A, 0x49, 0xED, +0x10, 0xF0, 0x0F, 0x42, 0x03, 0x18, 0x50, 0xAD, 0x29, 0x08, 0x03, 0x59, 0x50, 0xAD, 0xFF, 0xB0, +0xA9, 0xC7, 0x28, 0xC8, 0xA4, 0xC0, 0x29, 0x08, 0x56, 0xE5, 0x8A, 0x95, 0x98, 0x95, 0x98, 0x51, +0x14, 0x30, 0xA7, 0xCA, 0x27, 0x42, 0x03, 0x18, 0x08, 0x40, 0x1D, 0x2D, 0xA6, 0x00, 0x39, 0x7E, +0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x95, 0xEC, 0x40, 0x26, 0x08, 0x2F, 0xBE, 0x84, 0x80, +0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x95, 0xEB, 0x80, 0x6C, 0x48, 0xA5, 0x00, 0x05, 0x30, 0x03, 0xD0, +0xA5, 0xCD, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x68, 0xED, 0x6B, 0x0D, 0x25, 0x04, 0x68, 0x04, +0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0C, 0x30, 0xF0, 0x6F, 0xAD, 0x40, 0x01, 0xF0, 0x83, 0x96, +0xED, 0x80, 0x83, 0x52, 0x2A, 0x08, 0xAA, 0xE6, 0x8A, 0x95, 0x2D, 0x48, 0x03, 0x59, 0xFE, 0xED, +0x2A, 0x08, 0xE2, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xAB, 0x40, 0x2A, 0x08, 0x5B, 0xBE, 0x84, 0x80, +0x2B, 0x48, 0x80, 0x40, 0x66, 0x5F, 0x92, 0xED, 0x2A, 0x08, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, +0x28, 0xFE, 0x97, 0x6D, 0x2A, 0x08, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0x14, 0xFE, 0xAB, 0x40, +0x2A, 0x08, 0x59, 0x7E, 0x84, 0x80, 0x2B, 0x48, 0x80, 0x40, 0x2A, 0x08, 0x55, 0x7E, 0x84, 0x80, +0x00, 0x48, 0xAB, 0x40, 0x2A, 0x08, 0x59, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xAC, 0x00, 0x2B, 0x48, +0x2C, 0x02, 0x2A, 0x08, 0x03, 0x18, 0xB6, 0x6D, 0x5B, 0xBE, 0x84, 0x80, 0x00, 0x8A, 0xAB, 0x40, +0x2A, 0x08, 0x5B, 0xBE, 0x84, 0x80, 0x2B, 0x48, 0x80, 0x40, 0x2A, 0x08, 0xDC, 0xBE, 0x84, 0x80, +0x00, 0x48, 0xAB, 0x40, 0x2A, 0x08, 0x57, 0xBE, 0x84, 0x80, 0x2B, 0x48, 0x80, 0x40, 0x2A, 0x08, +0x5B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x2A, 0x08, 0xA2, 0xC0, 0x04, 0xF0, 0xF0, 0x27, +0x8A, 0x95, 0x2A, 0x08, 0x59, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x2A, 0x08, 0xA2, 0xC0, +0x05, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x2A, 0x08, 0x57, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, +0x2A, 0x08, 0xA2, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0xA1, 0x01, 0xA1, 0x4A, 0x2A, 0x08, +0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xE4, 0xB0, 0xAB, 0x40, 0xE7, 0xAD, 0xE8, 0x2D, +0xAB, 0x0B, 0xE6, 0x6D, 0xEB, 0xAD, 0x00, 0x00, 0x0F, 0xB0, 0x83, 0x52, 0x03, 0x53, 0xA1, 0xC0, +0x2A, 0x08, 0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xD0, 0x70, 0xAC, 0x00, 0xC9, 0xB0, +0xAB, 0x40, 0xAB, 0x0B, 0xF9, 0xAD, 0xAC, 0xCB, 0xF9, 0xAD, 0xFE, 0xED, 0x83, 0x52, 0x03, 0x53, +0x2A, 0x08, 0x03, 0xAD, 0xAC, 0x00, 0x2C, 0x08, 0x03, 0x59, 0x0A, 0xAE, 0xAD, 0x81, 0xAD, 0xCA, +0xAE, 0x81, 0x0D, 0xEE, 0xAD, 0x81, 0xAE, 0x81, 0xAE, 0xCA, 0x83, 0x96, 0xED, 0xC1, 0x0E, 0x70, +0x83, 0x52, 0xEF, 0xC0, 0x02, 0xF0, 0xEE, 0x80, 0x2D, 0x48, 0xAA, 0xE6, 0x8A, 0x95, 0x2E, 0x48, +0xAA, 0xE6, 0x8A, 0x95, 0x2D, 0x48, 0xE2, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xAA, 0x00, 0x2E, 0x48, +0x5B, 0xBE, 0x84, 0x80, 0x2A, 0x08, 0x80, 0x40, 0x66, 0x5F, 0x2C, 0xEE, 0x2D, 0x48, 0x55, 0x7E, +0x84, 0x80, 0x00, 0x48, 0x28, 0xFE, 0x31, 0xEE, 0x2D, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, +0x14, 0xFE, 0xAA, 0x00, 0x2E, 0x48, 0x59, 0x7E, 0x84, 0x80, 0x2A, 0x08, 0x80, 0x40, 0x2D, 0x48, +0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xAA, 0x00, 0x2E, 0x48, 0x59, 0x7E, 0x84, 0x80, 0x00, 0x48, +0xAB, 0x40, 0x2A, 0x08, 0x2B, 0x42, 0x03, 0x18, 0x4F, 0x6E, 0x2E, 0x48, 0x5B, 0xBE, 0x84, 0x80, +0x00, 0x8A, 0xAA, 0x00, 0x2E, 0x48, 0x5B, 0xBE, 0x84, 0x80, 0x2A, 0x08, 0x80, 0x40, 0x2D, 0x48, +0xDC, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xAA, 0x00, 0x2E, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x2A, 0x08, +0x80, 0x40, 0x2E, 0x48, 0x5B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x2E, 0x48, 0xA2, 0xC0, +0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x2E, 0x48, 0x59, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, +0x2E, 0x48, 0xA2, 0xC0, 0x05, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x2E, 0x48, 0x57, 0xBE, 0x84, 0x80, +0x00, 0x48, 0xA1, 0xC0, 0x2E, 0x48, 0xA2, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0xA1, 0x01, +0xA1, 0x4A, 0x2D, 0x48, 0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xA1, 0x01, 0xA1, 0x4A, +0x2E, 0x48, 0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xE4, 0xB0, 0xAA, 0x00, 0x88, 0xAE, +0x89, 0xEE, 0xAA, 0xCB, 0x87, 0x2E, 0x8C, 0xEE, 0x00, 0x00, 0x03, 0x30, 0x83, 0x52, 0x03, 0x53, +0xA1, 0xC0, 0x2D, 0x48, 0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0x0D, 0x70, 0xA1, 0xC0, +0x2E, 0x48, 0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0xD0, 0x70, 0xAB, 0x40, 0xC9, 0xB0, +0xAA, 0x00, 0xAA, 0xCB, 0xA1, 0xEE, 0xAB, 0x0B, 0xA1, 0xEE, 0xA6, 0x2E, 0x83, 0x52, 0x03, 0x53, +0x2D, 0x48, 0x03, 0xAD, 0xA6, 0x00, 0xE2, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, +0x26, 0x08, 0xA2, 0xC0, 0x01, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x26, 0x08, 0x55, 0x7E, 0x84, 0x80, +0x00, 0x48, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x02, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x26, 0x08, +0xDC, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x03, 0x30, 0xF0, 0x27, +0x8A, 0x95, 0x26, 0x08, 0x5B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, +0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x26, 0x08, 0x59, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, +0x26, 0x08, 0xA2, 0xC0, 0x05, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x26, 0x08, 0x57, 0xBE, 0x84, 0x80, +0x00, 0x48, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x6E, 0x0E, +0xF0, 0x39, 0x6F, 0xC4, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x08, 0xF0, 0xF0, 0x27, 0x8A, 0x95, +0x62, 0x08, 0xA4, 0xC0, 0x04, 0xF0, 0x03, 0xD0, 0xA4, 0x8D, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, +0xF4, 0x6E, 0x24, 0x4D, 0x60, 0xC4, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x0A, 0x30, 0xF0, 0x27, +0x8A, 0x95, 0x6D, 0x88, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x0B, 0x70, 0xF0, 0x27, 0x8A, 0x95, +0x6C, 0x48, 0xA4, 0xC0, 0x05, 0x30, 0x03, 0xD0, 0xA4, 0x8D, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, +0x0C, 0xEF, 0x6B, 0x0D, 0x24, 0xC4, 0x68, 0x04, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x0C, 0x30, +0xF0, 0x27, 0x8A, 0x95, 0x69, 0x48, 0xA4, 0xC0, 0x05, 0x30, 0x03, 0xD0, 0xA4, 0x8D, 0xFF, 0x7E, +0x03, 0x9D, 0x1D, 0x6F, 0x6A, 0x48, 0xA5, 0x00, 0x01, 0xF0, 0x03, 0xD0, 0xA5, 0xCD, 0xFF, 0x7E, +0x03, 0xD0, 0x03, 0x9D, 0x26, 0x2F, 0x25, 0x8D, 0x24, 0xC4, 0x5E, 0x84, 0xA1, 0xC0, 0x26, 0x08, +0xA2, 0xC0, 0x0D, 0x70, 0xF0, 0x27, 0x8A, 0x95, 0x03, 0xD0, 0x5F, 0x4D, 0x5D, 0x84, 0xA1, 0xC0, +0x26, 0x08, 0xA2, 0xC0, 0x0E, 0x70, 0xF0, 0x27, 0x8A, 0x95, 0x83, 0x96, 0x6C, 0x48, 0x83, 0x52, +0xA4, 0xC0, 0x03, 0xD0, 0xA4, 0x8D, 0x03, 0xD0, 0xA4, 0x8D, 0x03, 0xD0, 0xA4, 0x8D, 0x83, 0x96, +0x6D, 0x88, 0x83, 0x52, 0xA5, 0x00, 0x03, 0xD0, 0xA5, 0xCD, 0x03, 0xD0, 0xA5, 0xCD, 0x83, 0x96, +0x03, 0xD0, 0x6E, 0x0D, 0x83, 0x52, 0x25, 0x04, 0x24, 0xC4, 0x61, 0x04, 0xA1, 0xC0, 0x26, 0x08, +0xA2, 0xC0, 0x10, 0xF0, 0xF0, 0x6F, 0xA4, 0x01, 0x24, 0xC8, 0xEA, 0xBE, 0x84, 0x80, 0x83, 0x93, +0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, +0xE0, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x01, 0xF0, 0xF0, 0x27, +0x8A, 0x95, 0x24, 0xC8, 0xDE, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, +0x02, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, 0xDA, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, +0x24, 0xC8, 0xA2, 0xC0, 0x03, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, 0xE8, 0x7E, 0x84, 0x80, +0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, +0xE6, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x05, 0x30, 0xF0, 0x27, +0x8A, 0x95, 0x24, 0xC8, 0xE4, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, +0x06, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, 0xAC, 0x7E, 0x84, 0x80, 0x83, 0xD7, 0x00, 0x48, +0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x08, 0xF0, 0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, 0xA8, 0x3E, +0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0A, 0x30, 0xF0, 0x27, 0x8A, 0x95, +0x24, 0xC8, 0xAA, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0B, 0x70, +0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, 0xA2, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, +0xA2, 0xC0, 0x0C, 0x30, 0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, 0xA4, 0x3E, 0x84, 0x80, 0x00, 0x48, +0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0D, 0x70, 0xF0, 0x27, 0x8A, 0x95, 0x24, 0xC8, 0xA6, 0x7E, +0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0E, 0x70, 0xF0, 0x27, 0x8A, 0x95, +0x24, 0xC8, 0xA0, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x10, 0xF0, +0xF0, 0x27, 0x8A, 0x95, 0x02, 0xF0, 0xA4, 0x4A, 0x24, 0xC2, 0x03, 0x18, 0x08, 0x40, 0x5C, 0x6F, +0xA3, 0x00, 0x22, 0xC8, 0x03, 0x59, 0xFA, 0xEF, 0x21, 0xC8, 0x88, 0x80, 0x23, 0x08, 0x80, 0x38, +0x86, 0xC0, 0x08, 0x40, 0x21, 0xC8, 0x88, 0x80, 0x23, 0x08, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40 }; diff --git a/libloragw/src/loragw_hal.c b/libloragw/src/loragw_hal.c index 5dbdf45..302de3a 100644 --- a/libloragw/src/loragw_hal.c +++ b/libloragw/src/loragw_hal.c @@ -51,9 +51,12 @@ Maintainer: Sylvain Miermont #define MCU_ARB 0 #define MCU_AGC 1 - #define MCU_ARB_FW_BYTE 8192 /* size of the firmware IN BYTES (= twice the number of 14b words) */ #define MCU_AGC_FW_BYTE 8192 /* size of the firmware IN BYTES (= twice the number of 14b words) */ +#define FW_VERSION_ADDR 0x20 /* Address of firmware version in data memory */ +#define FW_VERSION_CAL 2 /* Expected version of calibration firmware */ +#define FW_VERSION_AGC 4 /* Expected version of AGC firmware */ +#define FW_VERSION_ARB 1 /* Expected version of arbiter firmware */ #define TX_METADATA_NB 16 #define RX_METADATA_NB 16 @@ -112,6 +115,8 @@ F_register(24bit) = F_rf (Hz) / F_step(Hz) #elif (CFG_BRD_1301REF868 == 1) #define RSSI_BOARD_OFFSET 166.0 #elif (CFG_BRD_KERLINK868 == 1) + #define RSSI_BOARD_OFFSET 167.0 +#elif (CFG_BRD_KERLINK868_27DBM == 1) #define RSSI_BOARD_OFFSET 165.0 #elif (CFG_BRD_1301REF433 == 1) #define RSSI_BOARD_OFFSET 176.5 @@ -258,6 +263,26 @@ typedef struct { { 3, 3, 13, 23},\ { 3, 3, 15, 24},\ }; /* calibrated */ +#elif (CFG_BRD_KERLINK868_27DBM == 1) + #define CUSTOM_TX_POW_TABLE 1 + const tx_pow_t tx_pow_table[TX_POW_LUT_SIZE] = {\ + { 0, 3, 8, -5},\ + { 0, 3, 11, -1},\ + { 0, 3, 12, 0},\ + { 1, 3, 9, 7},\ + { 1, 3, 10, 8},\ + { 1, 3, 12, 11},\ + { 1, 3, 13, 13},\ + { 1, 3, 14, 14},\ + { 2, 3, 9, 16},\ + { 2, 3, 11, 19},\ + { 3, 3, 7, 21},\ + { 3, 3, 8, 23},\ + { 3, 3, 9, 24},\ + { 3, 3, 10, 26},\ + { 3, 3, 11, 27},\ + { 3, 3, 12, 28},\ + }; /* calibrated */ #elif (CFG_BRD_KERLINK433 == 1) #define CUSTOM_TX_POW_TABLE 1 const tx_pow_t tx_pow_table[TX_POW_LUT_SIZE] = {\ @@ -413,6 +438,8 @@ typedef struct { #define CFG_BRD_STR "ref_1301_433" #elif (CFG_BRD_KERLINK868 == 1) #define CFG_BRD_STR "kerlink_868" +#elif (CFG_BRD_KERLINK868_27DBM == 1) + #define CFG_BRD_STR "kerlink_868_27dbm" #elif (CFG_BRD_KERLINK433 == 1) #define CFG_BRD_STR "kerlink_433" #elif (CFG_BRD_CISCO433 == 1) @@ -1008,7 +1035,7 @@ int lgw_start(void) { uint8_t radio_select; int32_t read_val; uint8_t load_val; - + uint8_t fw_version; uint8_t cal_cmd; uint16_t cal_time; uint8_t cal_status; @@ -1043,6 +1070,18 @@ int lgw_start(void) { setup_sx125x(0, rf_rx_freq[0]); setup_sx125x(1, rf_rx_freq[1]); + /* gives AGC control of GPIOs to enable Tx external digital filter */ + lgw_reg_w(LGW_GPIO_MODE,31); /* Set all GPIOs as output */ + lgw_reg_w(LGW_GPIO_SELECT_OUTPUT,2); + + /* GPIOs table : + DGPIO0 -> N/A + DGPIO1 -> N/A + DGPIO2 -> N/A + DGPIO3 -> TX digital filter ON + DGPIO4 -> TX ON + */ + /* select calibration command */ cal_cmd = 0; cal_cmd |= rf_enable[0] ? 0x01 : 0x00; /* Bit 0: Calibrate Rx IQ mismatch compensation on radio A */ @@ -1057,7 +1096,7 @@ int lgw_start(void) { cal_cmd |= 0x20; /* Bit 5: 0: SX1257, 1: SX1255 */ #endif - #if ((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1) || (CFG_BRD_KERLINK868 == 1) || (CFG_BRD_KERLINK433 == 1) || (CFG_BRD_CISCO433 == 1) || (CFG_BRD_CISCO470 == 1) || (CFG_BRD_CISCO780 == 1)) + #if ((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1) || (CFG_BRD_KERLINK868 == 1) || (CFG_BRD_KERLINK868_27DBM == 1) || (CFG_BRD_KERLINK433 == 1) || (CFG_BRD_CISCO433 == 1) || (CFG_BRD_CISCO470 == 1) || (CFG_BRD_CISCO780 == 1)) cal_cmd |= 0x00; /* Bit 6-7: Board type 0: ref, 1: FPGA, 3: board X */ cal_time = 2300; /* measured between 2.1 and 2.2 sec, because 1 TX only */ #elif (CFG_BRD_NANO868 == 1) @@ -1073,6 +1112,16 @@ int lgw_start(void) { lgw_reg_w(LGW_FORCE_HOST_RADIO_CTRL,0); /* gives to AGC MCU the control of the radios */ lgw_reg_w(LGW_RADIO_SELECT,cal_cmd); /* send calibration configuration word */ lgw_reg_w(LGW_MCU_RST_1,0); + + /* Check firmware version */ + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, FW_VERSION_ADDR); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + fw_version = (uint8_t)read_val; + if (fw_version != FW_VERSION_CAL) { + printf("ERROR: Version of calibration firmware not expected, actual:%d expected:%d\n", fw_version, FW_VERSION_CAL); + return -1; + } + lgw_reg_w(LGW_PAGE_REG,3); /* Calibration will start on this condition as soon as MCU can talk to concentrator registers */ lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL,0); /* Give control of concentrator registers to MCU */ @@ -1248,6 +1297,22 @@ int lgw_start(void) { lgw_reg_w(LGW_MCU_RST_0, 0); lgw_reg_w(LGW_MCU_RST_1, 0); + /* Check firmware version */ + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, FW_VERSION_ADDR); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + fw_version = (uint8_t)read_val; + if (fw_version != FW_VERSION_AGC) { + DEBUG_PRINTF("ERROR: Version of AGC firmware not expected, actual:%d expected:%d\n", fw_version, FW_VERSION_AGC); + return LGW_HAL_ERROR; + } + lgw_reg_w(LGW_DBG_ARB_MCU_RAM_ADDR, FW_VERSION_ADDR); + lgw_reg_r(LGW_DBG_ARB_MCU_RAM_DATA, &read_val); + fw_version = (uint8_t)read_val; + if (fw_version != FW_VERSION_ARB) { + DEBUG_PRINTF("ERROR: Version of arbiter firmware not expected, actual:%d expected:%d\n", fw_version, FW_VERSION_ARB); + return LGW_HAL_ERROR; + } + DEBUG_MSG("Info: Initialising AGC firmware...\n"); wait_ms(1); @@ -1258,7 +1323,6 @@ int lgw_start(void) { } /* Update Tx gain LUT and start AGC */ - #if (CUSTOM_TX_POW_TABLE == 1) DEBUG_MSG("Info: loading custom TX gain table\n"); for(i=0; i<TX_POW_LUT_SIZE; ++i) { @@ -1314,17 +1378,6 @@ int lgw_start(void) { /* enable GPS event capture */ lgw_reg_w(LGW_GPS_EN,1); - /* enable LEDs */ - lgw_reg_w(LGW_GPIO_MODE,31); - // lgw_reg_w(LGW_GPIO_SELECT_OUTPUT,0); /* default 0 */ - /* LED table : - DGPIO0 -> packets waiting in the RX FIFO, ready to be fetched - DGPIO1 -> multi-SF RX LoRa modems activity (channels 0 to 7) - DGPIO2 -> stand-alone RX LoRa modem activity (channel 8)) - DGPIO3 -> FSK RX modem activity (channel 9) - DGPIO4 -> TX modem active (either LoRa or FSK) - */ - lgw_is_started = true; return LGW_HAL_SUCCESS; } @@ -1739,10 +1792,12 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) { buff[15] = 0; /* MSB of RF frequency is now used in AGC firmware to implement large/narrow filtering in SX1257/55 */ + buff[0] &= 0x3F; /* Unset 2 MSBs of frequency code */ if (pkt_data.bandwidth == BW_500KHZ) { - buff[0] |= 0x80; /* Enlarge filter for 500kHz BW */ - } else { - buff[0] &= 0x7F; + buff[0] |= 0x80; /* Set MSB bit to enlarge analog filter for 500kHz BW */ + } + else if (pkt_data.bandwidth == BW_125KHZ){ + buff[0] |= 0x40; /* Set MSB-1 bit to enable digital filter for 125kHz BW */ } } else if (pkt_data.modulation == MOD_FSK) { diff --git a/libloragw/src/loragw_reg.c b/libloragw/src/loragw_reg.c index 7f9ec40..9381e0a 100644 --- a/libloragw/src/loragw_reg.c +++ b/libloragw/src/loragw_reg.c @@ -680,7 +680,7 @@ int lgw_reg_r(uint16_t register_id, int32_t *reg_value) { /* Point to a register by name and do a burst write */ int lgw_reg_wb(uint16_t register_id, uint8_t *data, uint16_t size) { - int spi_stat; + int spi_stat = LGW_SPI_SUCCESS; struct lgw_reg_s r; /* check input parameters */ @@ -715,7 +715,7 @@ int lgw_reg_wb(uint16_t register_id, uint8_t *data, uint16_t size) { } /* do the burst write */ - spi_stat = lgw_spi_wb(lgw_spi_target, r.addr, data, size); + spi_stat += lgw_spi_wb(lgw_spi_target, r.addr, data, size); if (spi_stat != LGW_SPI_SUCCESS) { DEBUG_MSG("ERROR: SPI ERROR DURING REGISTER BURST WRITE\n"); @@ -729,7 +729,7 @@ int lgw_reg_wb(uint16_t register_id, uint8_t *data, uint16_t size) { /* Point to a register by name and do a burst read */ int lgw_reg_rb(uint16_t register_id, uint8_t *data, uint16_t size) { - int spi_stat; + int spi_stat = LGW_SPI_SUCCESS; struct lgw_reg_s r; /* check input parameters */ @@ -758,7 +758,7 @@ int lgw_reg_rb(uint16_t register_id, uint8_t *data, uint16_t size) { } /* do the burst read */ - spi_stat = lgw_spi_rb(lgw_spi_target, r.addr, data, size); + spi_stat += lgw_spi_rb(lgw_spi_target, r.addr, data, size); if (spi_stat != LGW_SPI_SUCCESS) { DEBUG_MSG("ERROR: SPI ERROR DURING REGISTER BURST READ\n"); diff --git a/libloragw/tst/test_loragw_cal.c b/libloragw/tst/test_loragw_cal.c new file mode 100644 index 0000000..da4f130 --- /dev/null +++ b/libloragw/tst/test_loragw_cal.c @@ -0,0 +1,700 @@ +/* + / _____) _ | | +( (____ _____ ____ _| |_ _____ ____| |__ + \____ \| ___ | (_ _) ___ |/ ___) _ \ + _____) ) ____| | | || |_| ____( (___| | | | +(______/|_____)_|_|_| \__)_____)\____)_| |_| + (C)2013 Semtech-Cycleo + +Description: + Minimum test program for the loragw_hal 'library' + +License: Revised BSD License, see LICENSE.TXT file include in the project +Maintainer: Sylvain Miermont +*/ + + +/* -------------------------------------------------------------------------- */ +/* --- DEPENDANCIES --------------------------------------------------------- */ + +/* fix an issue between POSIX and C99 */ +#if __STDC_VERSION__ >= 199901L + #define _XOPEN_SOURCE 600 +#else + #define _XOPEN_SOURCE 500 +#endif + +#include <stdint.h> /* C99 types */ +#include <stdbool.h> /* bool type */ +#include <stdio.h> /* printf */ +#include <string.h> /* memset */ +#include <signal.h> /* sigaction */ +#include <math.h> /* cos */ +#include <unistd.h> /* getopt access */ + +#include "loragw_hal.h" +#include "loragw_reg.h" +#include "loragw_aux.h" + +/* -------------------------------------------------------------------------- */ +/* --- PRIVATE MACROS ------------------------------------------------------- */ + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +/* -------------------------------------------------------------------------- */ +/* --- PRIVATE CONSTANTS ---------------------------------------------------- */ + +#if ((CFG_BAND_868 == 1) || ((CFG_BAND_FULL == 1) && (CFG_RADIO_1257 == 1))) + #define F_RX_0 868500000 +#elif (CFG_BAND_915 == 1) + #define F_RX_0 915500000 +#elif ((CFG_BAND_470 == 1) || ((CFG_BAND_FULL == 1) && (CFG_RADIO_1255 == 1))) + #define F_RX_0 470500000 +#elif (CFG_BAND_433 == 1) + #define F_RX_0 433500000 +#elif (CFG_BAND_780 == 1) + #define F_RX_0 780500000 +#endif +#define NB_CAL_MAX 100 +#define MCU_AGC 1 +#define MCU_AGC_FW_BYTE 8192 /* size of the firmware IN BYTES (= twice the number of 14b words) */ +#define FW_VERSION_ADDR 0x20 +#define FW_VERSION_CAL 2 +#define RAM_SIZE 4096 +#define FREQ_SIG_NORM 0.078125 + +/* -------------------------------------------------------------------------- */ +/* --- PRIVATE VARIABLES ---------------------------------------------------- */ + +#include "../src/cal_fw.var" /* external definition of the variable */ + +/* -------------------------------------------------------------------------- */ +/* --- PRIVATE TYPES --------------------------------------------------------- */ + +struct cal_res_s { + int8_t amp_a; + int8_t phi_a; + int8_t amp_b; + int8_t phi_b; + int8_t offset_i_a [8]; + int8_t offset_q_a [8]; + int8_t offset_i_b [8]; + int8_t offset_q_b [8]; + uint8_t img_rej_a; + uint8_t img_rej_b; + uint8_t offset_rej_a [8]; + uint8_t offset_rej_b [8]; + uint8_t debug [8]; +}; + +/* -------------------------------------------------------------------------- */ +/* --- PRIVATE FUNCTIONS DECLARATION ---------------------------------------- */ + +int load_firmware(uint8_t target, uint8_t *firmware, uint16_t size); /* defined in loragw_hal.c */ + +void sx125x_write(uint8_t channel, uint8_t addr, uint8_t data); /* defined in loragw_hal.c */ + +uint8_t sx125x_read(uint8_t channel, uint8_t addr); /* defined in loragw_hal.c */ + +int setup_sx125x(uint8_t rf_chain, uint32_t freq_hz); /* defined in loragw_hal.c */ + +uint8_t sx125x_cal(uint8_t cal_cmd, struct cal_res_s *cal_res); + +int read_capture(int16_t *i, int16_t *q, int nb_samp); + +uint8_t get_img_rej(int16_t *sig_i, int16_t *sig_q, int nb_samp, double f_sig_norm); + +void usage (void); + +/* -------------------------------------------------------------------------- */ +/* --- PRIVATE FUNCTIONS DEFINITION ----------------------------------------- */ + +/* describe command line options */ +void usage(void) { + printf("Library version information: %s\n", lgw_version_info()); + printf( "Available options:\n"); + printf( " -h print this help\n"); + printf( " -a <float> Radio A frequency in MHz\n"); + printf( " -b <float> Radio B frequency in MHz\n"); + printf( " -n <uint> Number of calibration iterations\n"); +} + +/* -------------------------------------------------------------------------- */ +/* --- MAIN FUNCTION -------------------------------------------------------- */ + +int main(int argc, char **argv) +{ + int i, j, x; + int32_t read_val; + const struct lgw_conf_rxrf_s rfconf = {true, F_RX_0}; + uint8_t fw_version; + uint8_t cal_cmd; + uint8_t cal_status; + struct cal_res_s cal_res [NB_CAL_MAX]; + struct cal_res_s cal_res_max; + struct cal_res_s cal_res_min; + int16_t sig_i [RAM_SIZE]; + int16_t sig_q [RAM_SIZE]; + uint8_t img_rej_a [NB_CAL_MAX]; + uint8_t img_rej_b [NB_CAL_MAX]; + uint8_t img_rej_a_max; + uint8_t img_rej_a_min; + uint8_t img_rej_b_max; + uint8_t img_rej_b_min; + //FILE *file; + + /* command line options */ + int xi = 0; + double xd = 0.0; + uint32_t fa = F_RX_0; + uint32_t fb = F_RX_0 + 1000000; + int nb_cal = 5; + + /* parse command line options */ + while ((i = getopt (argc, argv, "ha:b:n:")) != -1) { + switch (i) { + case 'h': + usage(); + return -1; + break; + case 'a': /* -f <float> Radio A frequency in MHz */ + i = sscanf(optarg, "%lf", &xd); + fa = (uint32_t)((xd*1e6) + 0.5); /* .5 Hz offset to get rounding instead of truncating */ + break; + case 'b': /* -f <float> Radio B frequency in MHz */ + i = sscanf(optarg, "%lf", &xd); + fb = (uint32_t)((xd*1e6) + 0.5); /* .5 Hz offset to get rounding instead of truncating */ + break; + case 'n': /* -n <uint> Number of calibration iterations */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || (xi > NB_CAL_MAX)) { + printf("ERROR: invalid number of calibration iterations (MAX %d)\n",NB_CAL_MAX); + usage(); + return -1; + } else { + nb_cal = xi; + } + break; + default: + printf("ERROR: argument parsing\n"); + usage(); + return -1; + } + } + + /* RF config */ + lgw_rxrf_setconf(0, rfconf); + lgw_rxrf_setconf(1, rfconf); + + /* Calibration command */ + cal_cmd = 0; + //cal_cmd |= 0x01; /* Bit 0: Calibrate Rx IQ mismatch compensation on radio A */ + //cal_cmd |= 0x02; /* Bit 1: Calibrate Rx IQ mismatch compensation on radio B */ + //cal_cmd |= 0x04; /* Bit 2: Calibrate Tx DC offset on radio A */ + //cal_cmd |= 0x08; /* Bit 3: Calibrate Tx DC offset on radio B */ + cal_cmd |= 0x10; /* Bit 4: 0: calibrate with DAC gain=2, 1: with DAC gain=3 (use 3) */ + + #if (CFG_RADIO_1257 == 1) + cal_cmd |= 0x00; /* Bit 5: 0: SX1257, 1: SX1255 */ + #elif (CFG_RADIO_1255 == 1) + cal_cmd |= 0x20; /* Bit 5: 0: SX1257, 1: SX1255 */ + #endif + + #if ((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1) || (CFG_BRD_KERLINK868 == 1) || (CFG_BRD_KERLINK868_27DBM == 1) || (CFG_BRD_KERLINK433 == 1) || (CFG_BRD_CISCO433 == 1) || (CFG_BRD_CISCO470 == 1) || (CFG_BRD_CISCO780 == 1)) + cal_cmd |= 0x00; /* Bit 6-7: Board type 0: ref, 1: FPGA, 3: board X */ + #elif (CFG_BRD_NANO868 == 1) + cal_cmd |= 0x40; /* Bit 6-7: Board type 0: ref, 1: FPGA, 3: board X */ + #else + cal_cmd |= 0xC0; /* Bit 6-7: Board type 0: ref, 1: FPGA, 3: board X */ + #endif + + /* Recap parameters*/ + printf("Library version information: %s\n", lgw_version_info()); + printf("Radio A frequency: %f MHz\n",fa/1e6); + printf("Radio B frequency: %f MHz\n",fb/1e6); + printf("Number of calibration iterations: %d\n",nb_cal); + printf("Calibration command: brd: %d, chip: %d, dac: %d\n\n", cal_cmd >> 6, 1257-2*((cal_cmd & 0x20) >> 5), 2+((cal_cmd & 0x10) >> 4)); + + x = lgw_connect(); + if (x == -1) { + printf("ERROR: FAIL TO CONNECT BOARD\n"); + return -1; + } + + /* reset the registers (also shuts the radios down) */ + lgw_soft_reset(); + + /* ungate clocks (gated by default) */ + lgw_reg_w(LGW_GLOBAL_EN, 1); + + /* switch on and reset the radios (also starts the 32 MHz XTAL) */ + lgw_reg_w(LGW_RADIO_A_EN,1); + lgw_reg_w(LGW_RADIO_B_EN,1); + wait_ms(500); /* TODO: optimize */ + lgw_reg_w(LGW_RADIO_RST,1); + wait_ms(5); + lgw_reg_w(LGW_RADIO_RST,0); + + /* setup the radios */ + setup_sx125x(0, fa); + setup_sx125x(1, fb); + + /* Set GPIO 4 high for calibration */ + lgw_reg_w(LGW_GPIO_MODE,31); /* Set all GPIOs as output */ + lgw_reg_w(LGW_GPIO_SELECT_OUTPUT,2); /* AGC MCU drives GPIOs */ + + /* Load the calibration firmware */ + load_firmware(MCU_AGC, cal_firmware, MCU_AGC_FW_BYTE); + lgw_reg_w(LGW_MCU_RST_1,0); + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, FW_VERSION_ADDR); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + fw_version = (uint8_t)read_val; + if (fw_version != FW_VERSION_CAL) { + printf("ERROR: Version of calibration firmware not expected, actual:%d expected:%d\n", fw_version, FW_VERSION_CAL); + return -1; + } + + /* Run Rx A IQ mismatch calibration only */ + for (i=0; i<nb_cal; i++) { + cal_status = sx125x_cal(cal_cmd | 0x01, &cal_res[i]); + x = read_capture(sig_i, sig_q, RAM_SIZE); + /* + file = fopen("toto.txt","w"); + for (j=0; j<RAM_SIZE; j++) { + fprintf(file, "%d %d\n", sig_i[j], sig_q[j]); + } + fclose(file); + */ + img_rej_a[i] = get_img_rej(sig_i, sig_q, RAM_SIZE, FREQ_SIG_NORM); + + printf("Rx A IQ mismatch: Amp: %3d Phi: %3d Rej: %2d dB Status: %3d | Debug: Rej: %2d dB Lna: %1d BB: %2d Dec: %2d\n", cal_res[i].amp_a, cal_res[i].phi_a, cal_res[i].img_rej_a, cal_status, img_rej_a[i], cal_res[i].debug[0], cal_res[i].debug[1], cal_res[i].debug[2]); + } + + /* Run Rx B IQ mismatch calibation only */ + printf("\n"); + for (i=0; i<nb_cal; i++) { + cal_status = sx125x_cal(cal_cmd | 0x02, &cal_res[i]); + x = read_capture(sig_i, sig_q, RAM_SIZE); + img_rej_b[i] = get_img_rej(sig_i, sig_q, RAM_SIZE, FREQ_SIG_NORM); + + printf("Rx B IQ mismatch: Amp: %3d Phi: %3d Rej: %2d dB Status: %3d | Debug: Rej: %2d dB Lna: %1d BB: %2d Dec: %2d\n", cal_res[i].amp_b, cal_res[i].phi_b, cal_res[i].img_rej_b, cal_status, img_rej_b[i], cal_res[i].debug[0], cal_res[i].debug[1], cal_res[i].debug[2]); + } + + /* Run Tx A DC offset calibation only */ + printf("\n"); + for (i=0; i<nb_cal; i++) { + cal_status = sx125x_cal(cal_cmd | 0x04, &cal_res[i]); + + printf("Tx A DC offset I :"); + for (j=0; j<8; j++) { + printf(" %3d", cal_res[i].offset_i_a[j]); + } + printf("\n"); + printf("Tx A DC offset Q :"); + for (j=0; j<8; j++) { + printf(" %3d", cal_res[i].offset_q_a[j]); + } + printf("\n"); + printf("Tx A DC rejection:"); + for (j=0; j<8; j++) { + printf(" %3d", cal_res[i].offset_rej_a[j]); + } + printf("\n"); + printf("Tx A DC debug BB :"); + for (j=0; j<8; j++) { + printf(" %3d", (cal_res[i].debug[j] & 0xF0) >> 4); + } + printf("\n"); + printf("Tx A DC debug Dec:"); + for (j=0; j<8; j++) { + printf(" %3d", cal_res[i].debug[j] & 0x0F); + } + printf("\n"); + printf("Tx A DC Status : %3d\n", cal_status); + } + + /* Run Tx B DC offset calibation only */ + #if !((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1) || (CFG_BRD_KERLINK868 == 1) || (CFG_BRD_KERLINK868_27DBM == 1) || (CFG_BRD_KERLINK433 == 1) || (CFG_BRD_CISCO433 == 1) || (CFG_BRD_CISCO470 == 1) || (CFG_BRD_CISCO780 == 1)) + printf("\n"); + for (i=0; i<nb_cal; i++) { + cal_status = sx125x_cal(cal_cmd | 0x08, &cal_res[i]); + + printf("Tx B DC offset I :"); + for (j=0; j<8; j++) { + printf(" %3d", cal_res[i].offset_i_b[j]); + } + printf("\n"); + printf("Tx B DC offset Q :"); + for (j=0; j<8; j++) { + printf(" %3d", cal_res[i].offset_q_b[j]); + } + printf("\n"); + printf("Tx B DC rejection:"); + for (j=0; j<8; j++) { + printf(" %3d", cal_res[i].offset_rej_b[j]); + } + printf("\n"); + printf("Tx B DC debug BB :"); + for (j=0; j<8; j++) { + printf(" %3d", (cal_res[i].debug[j] & 0xF0) >> 4); + } + printf("\n"); + printf("Tx B DC debug Dec:"); + for (j=0; j<8; j++) { + printf(" %3d", cal_res[i].debug[j] & 0x0F); + } + printf("\n"); + printf("Tx B DC Status : %3d\n", cal_status); + } + #endif + + /* Compute statistics */ + cal_res_max.amp_a = -128; + cal_res_max.phi_a = -128; + cal_res_max.amp_b = -128; + cal_res_max.phi_b = -128; + cal_res_max.img_rej_a = 0; + cal_res_max.img_rej_b = 0; + for (j=0; j<8; j++) { + cal_res_max.offset_i_a[j] = -128; + cal_res_max.offset_q_a[j] = -128; + cal_res_max.offset_i_b[j] = -128; + cal_res_max.offset_q_b[j] = -128; + cal_res_max.offset_rej_a[j] = 0; + cal_res_max.offset_rej_b[j] = 0; + } + + cal_res_min.amp_a = 127; + cal_res_min.phi_a = 127; + cal_res_min.amp_b = 127; + cal_res_min.phi_b = 127; + cal_res_min.img_rej_a = 255; + cal_res_min.img_rej_b = 255; + for (j=0; j<8; j++) { + cal_res_min.offset_i_a[j] = 127; + cal_res_min.offset_q_a[j] = 127; + cal_res_min.offset_i_b[j] = 127; + cal_res_min.offset_q_b[j] = 127; + cal_res_min.offset_rej_a[j] = 255; + cal_res_min.offset_rej_b[j] = 255; + } + + img_rej_a_max = 0; + img_rej_a_min = 255; + img_rej_b_max = 0; + img_rej_b_min = 255; + + for (i=0; i<nb_cal; i++) { + if (cal_res[i].amp_a > cal_res_max.amp_a) { + cal_res_max.amp_a = cal_res[i].amp_a; + } + if (cal_res[i].phi_a > cal_res_max.phi_a) { + cal_res_max.phi_a = cal_res[i].phi_a; + } + if (cal_res[i].amp_b > cal_res_max.amp_b) { + cal_res_max.amp_b = cal_res[i].amp_b; + } + if (cal_res[i].phi_b > cal_res_max.phi_b) { + cal_res_max.phi_b = cal_res[i].phi_b; + } + if (cal_res[i].phi_b > cal_res_max.phi_b) { + cal_res_max.phi_b = cal_res[i].phi_b; + } + if (cal_res[i].img_rej_a > cal_res_max.img_rej_a) { + cal_res_max.img_rej_a = cal_res[i].img_rej_a; + } + if (cal_res[i].img_rej_b > cal_res_max.img_rej_b) { + cal_res_max.img_rej_b = cal_res[i].img_rej_b; + } + for (j=0; j<8; j++) { + if (cal_res[i].offset_i_a[j] > cal_res_max.offset_i_a[j]) { + cal_res_max.offset_i_a[j] = cal_res[i].offset_i_a[j]; + } + if (cal_res[i].offset_q_a[j] > cal_res_max.offset_q_a[j]) { + cal_res_max.offset_q_a[j] = cal_res[i].offset_q_a[j]; + } + if (cal_res[i].offset_i_b[j] > cal_res_max.offset_i_b[j]) { + cal_res_max.offset_i_b[j] = cal_res[i].offset_i_b[j]; + } + if (cal_res[i].offset_q_b[j] > cal_res_max.offset_q_b[j]) { + cal_res_max.offset_q_b[j] = cal_res[i].offset_q_b[j]; + } + if (cal_res[i].offset_rej_a[j] > cal_res_max.offset_rej_a[j]) { + cal_res_max.offset_rej_a[j] = cal_res[i].offset_rej_a[j]; + } + if (cal_res[i].offset_rej_b[j] > cal_res_max.offset_rej_b[j]) { + cal_res_max.offset_rej_b[j] = cal_res[i].offset_rej_b[j]; + } + } + + if (cal_res[i].amp_a < cal_res_min.amp_a) { + cal_res_min.amp_a = cal_res[i].amp_a; + } + if (cal_res[i].phi_a < cal_res_min.phi_a) { + cal_res_min.phi_a = cal_res[i].phi_a; + } + if (cal_res[i].amp_b < cal_res_min.amp_b) { + cal_res_min.amp_b = cal_res[i].amp_b; + } + if (cal_res[i].phi_b < cal_res_min.phi_b) { + cal_res_min.phi_b = cal_res[i].phi_b; + } + if (cal_res[i].phi_b < cal_res_min.phi_b) { + cal_res_min.phi_b = cal_res[i].phi_b; + } + if (cal_res[i].img_rej_a < cal_res_min.img_rej_a) { + cal_res_min.img_rej_a = cal_res[i].img_rej_a; + } + if (cal_res[i].img_rej_b < cal_res_min.img_rej_b) { + cal_res_min.img_rej_b = cal_res[i].img_rej_b; + } + for (j=0; j<8; j++) { + if (cal_res[i].offset_i_a[j] < cal_res_min.offset_i_a[j]) { + cal_res_min.offset_i_a[j] = cal_res[i].offset_i_a[j]; + } + if (cal_res[i].offset_q_a[j] < cal_res_min.offset_q_a[j]) { + cal_res_min.offset_q_a[j] = cal_res[i].offset_q_a[j]; + } + if (cal_res[i].offset_i_b[j] < cal_res_min.offset_i_b[j]) { + cal_res_min.offset_i_b[j] = cal_res[i].offset_i_b[j]; + } + if (cal_res[i].offset_q_b[j] < cal_res_min.offset_q_b[j]) { + cal_res_min.offset_q_b[j] = cal_res[i].offset_q_b[j]; + } + if (cal_res[i].offset_rej_a[j] < cal_res_min.offset_rej_a[j]) { + cal_res_min.offset_rej_a[j] = cal_res[i].offset_rej_a[j]; + } + if (cal_res[i].offset_rej_b[j] < cal_res_min.offset_rej_b[j]) { + cal_res_min.offset_rej_b[j] = cal_res[i].offset_rej_b[j]; + } + } + + if (img_rej_a[i] > img_rej_a_max) { + img_rej_a_max = img_rej_a[i]; + } + if (img_rej_a[i] < img_rej_a_min) { + img_rej_a_min = img_rej_a[i]; + } + if (img_rej_b[i] > img_rej_b_max) { + img_rej_b_max = img_rej_b[i]; + } + if (img_rej_b[i] < img_rej_b_min) { + img_rej_b_min = img_rej_b[i]; + } + } + + /* Print statistics */ + printf("\n"); + printf("Rx A IQ mismatch calibration statistics on %3d iterations (min, max):\n", nb_cal); + printf("Amp: %3d %3d Phi: %3d %3d Rej: %2d %2d dB (capt.: %2d %2d dB)\n", cal_res_min.amp_a, cal_res_max.amp_a, cal_res_min.phi_a, cal_res_max.phi_a, cal_res_min.img_rej_a, cal_res_max.img_rej_a, img_rej_a_min, img_rej_a_max); + + printf("\n"); + printf("Rx B IQ mismatch calibration statistics on %3d iterations (min, max):\n", nb_cal); + printf("Amp: %3d %3d Phi: %3d %3d Rej: %2d %2d dB (capt.: %2d %2d dB)\n", cal_res_min.amp_b, cal_res_max.amp_b, cal_res_min.phi_b, cal_res_max.phi_b, cal_res_min.img_rej_b, cal_res_max.img_rej_b, img_rej_b_min, img_rej_b_max); + + printf("\n"); + printf("Tx A DC offset calibration statistics on %3d iterations (min, max):\n", nb_cal); + for (j=0; j<8; j++) { + printf(" Mix gain %2d: I: %3d %3d Q: %3d %3d Rej: %2d %2d dB\n", 8+j, cal_res_min.offset_i_a[j], cal_res_max.offset_i_a[j], cal_res_min.offset_q_a[j], cal_res_max.offset_q_a[j], cal_res_min.offset_rej_a[j], cal_res_max.offset_rej_a[j]); + } + + #if !((CFG_BRD_1301REF868 == 1) || (CFG_BRD_1301REF433 == 1) || (CFG_BRD_KERLINK868 == 1) || (CFG_BRD_KERLINK868_27DBM == 1) || (CFG_BRD_KERLINK433 == 1) || (CFG_BRD_CISCO433 == 1) || (CFG_BRD_CISCO470 == 1) || (CFG_BRD_CISCO780 == 1)) + printf("\n"); + printf("Tx B DC offset calibration statistics on %3d iterations (min, max):\n", nb_cal); + for (j=0; j<8; j++) { + printf(" Mix gain %2d: I: %3d %3d Q: %3d %3d Rej: %2d %2d dB\n", 8+j, cal_res_min.offset_i_b[j], cal_res_max.offset_i_b[j], cal_res_min.offset_q_b[j], cal_res_max.offset_q_b[j], cal_res_min.offset_rej_b[j], cal_res_max.offset_rej_b[j]); + } + #endif + + lgw_stop(); + + printf("\nEnd of radio calibration test\n"); + + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +uint8_t sx125x_cal(uint8_t cal_cmd, struct cal_res_s *cal_res) { + + int i; + int32_t read_val; + uint8_t cal_status; + + lgw_reg_w(LGW_FORCE_HOST_RADIO_CTRL,0); /* gives to AGC MCU the control of the radios */ + lgw_reg_w(LGW_RADIO_SELECT,cal_cmd); /* send calibration configuration word */ + lgw_reg_w(LGW_MCU_RST_1,1); + lgw_reg_w(LGW_MCU_RST_1,0); + lgw_reg_w(LGW_PAGE_REG,3); /* Calibration will start on this condition as soon as MCU can talk to concentrator registers */ + lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL,0); /* Give control of concentrator registers to MCU */ + + wait_ms(2000); /* Wait for end of calibration */ + + lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL,1); /* Take back control */ + + /* Get calibration status */ + lgw_reg_r(LGW_MCU_AGC_STATUS, &read_val); + cal_status = (uint8_t)read_val; + + /* Check calibration flags + bit 0: could access SX1301 registers + bit 1: could access radio A registers + bit 2: could access radio B registers + bit 3: radio A RX image rejection successful + bit 4: radio B RX image rejection successful + bit 5: radio A TX imbalance correction successful + bit 6: radio B TX imbalance correction successful + bit 7: calibration finished */ + + if ((cal_status & 0x01) == 0) { + printf("WARNING: calibration could not access SX1301 registers\n"); + } + if ((cal_status & 0x02) == 0) { + printf("WARNING: calibration could not access radio A\n"); + } + if ((cal_status & 0x04) == 0) { + printf("WARNING: calibration could not access radio B\n"); + } + if ((cal_cmd & 0x01) && ((cal_status & 0x08) == 0)) { + printf("WARNING: problem in calibration of radio A for image rejection\n"); + } + if ((cal_cmd & 0x02) && ((cal_status & 0x10) == 0)) { + printf("WARNING: problem in calibration of radio B for image rejection\n"); + } + if ((cal_cmd & 0x04) && ((cal_status & 0x20) == 0)) { + printf("WARNING: problem in calibration of radio A for TX imbalance\n"); + } + if ((cal_cmd & 0x08) && ((cal_status & 0x40) == 0)) { + printf("WARNING: problem in calibration of radio B for TX imbalance\n"); + } + if ((cal_status & 0x80) == 0) { + printf("WARNING: Calibration not finished\n"); + } + + /* Get calibration results */ + if (cal_cmd & 0x01) { + lgw_reg_r(LGW_IQ_MISMATCH_A_AMP_COEFF, &read_val); + (*cal_res).amp_a = (int8_t)((read_val > 31) ? read_val - 64 : read_val); + lgw_reg_r(LGW_IQ_MISMATCH_A_PHI_COEFF, &read_val); + (*cal_res).phi_a = (int8_t)((read_val > 31) ? read_val - 64 : read_val); + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD0); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).img_rej_a = (uint8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD2); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).debug[0] = (uint8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD3); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).debug[1] = (uint8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD4); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).debug[2] = (uint8_t)read_val; + } + if (cal_cmd & 0x02) { + lgw_reg_r(LGW_IQ_MISMATCH_B_AMP_COEFF, &read_val); + (*cal_res).amp_b = (int8_t)((read_val > 31) ? read_val - 64 : read_val); + lgw_reg_r(LGW_IQ_MISMATCH_B_PHI_COEFF, &read_val); + (*cal_res).phi_b = (int8_t)((read_val > 31) ? read_val - 64 : read_val); + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD1); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).img_rej_b = (uint8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD2); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).debug[0] = (uint8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD3); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).debug[1] = (uint8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD4); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).debug[2] = (uint8_t)read_val; + } + if (cal_cmd & 0x04) { + for (i=0; i<=7; ++i) { + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xA0+i); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).offset_i_a[i] = (int8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xA8+i); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).offset_q_a[i] = (int8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xC0+i); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).offset_rej_a[i] = (uint8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD2+i); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).debug[i] = (uint8_t)read_val; + } + } + if (cal_cmd & 0x08) { + for (i=0; i<=7; ++i) { + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xB0+i); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).offset_i_b[i] = (int8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xB8+i); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).offset_q_b[i] = (int8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xC8+i); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).offset_rej_b[i] = (uint8_t)read_val; + lgw_reg_w(LGW_DBG_AGC_MCU_RAM_ADDR, 0xD2+i); + lgw_reg_r(LGW_DBG_AGC_MCU_RAM_DATA, &read_val); + (*cal_res).debug[i] = (uint8_t)read_val; + } + } + + return cal_status; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int read_capture(int16_t *sig_i, int16_t *sig_q, int nb_samp) { + + uint8_t read_burst[4]; + uint16_t data_i_c2; + uint16_t data_q_c2; + int i; + + lgw_reg_w(LGW_CAPTURE_RAM_ADDR, 0); + for (i=0 ; i<nb_samp ; i++) { + lgw_reg_rb(LGW_CAPTURE_RAM_DATA, read_burst, 4); + data_i_c2 = ((uint16_t)read_burst[3] << 4) + ((uint16_t)read_burst[2] >> 4); + data_q_c2 = ((uint16_t)read_burst[1] << 4) + ((uint16_t)read_burst[0] >> 4); + sig_i[i] = (int16_t)((data_i_c2 > 2047) ? data_i_c2 - 4096 : data_i_c2); + sig_q[i] = (int16_t)((data_q_c2 > 2047) ? data_q_c2 - 4096 : data_q_c2); + } + + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +uint8_t get_img_rej(int16_t *sig_i, int16_t *sig_q, int nb_samp, double f_sig_norm) { + + int i; + double phase; + double corr_sig_i, corr_sig_q, corr_sig_abs; + double corr_img_i, corr_img_q, corr_img_abs; + double img_rej; + + corr_sig_i = 0; + corr_sig_q = 0; + corr_img_i = 0; + corr_img_q = 0; + + for (i=0 ; i<nb_samp ; i++) { + phase = 6.28318530717959*i*f_sig_norm; + corr_sig_i += (double)sig_i[i]*cos( phase) - (double)sig_q[i]*sin( phase); + corr_sig_q += (double)sig_q[i]*cos( phase) + (double)sig_i[i]*sin( phase); + corr_img_i += (double)sig_i[i]*cos(-phase) - (double)sig_q[i]*sin(-phase); + corr_img_q += (double)sig_q[i]*cos(-phase) + (double)sig_i[i]*sin(-phase); + } + + corr_sig_abs = sqrt( corr_sig_i*corr_sig_i + corr_sig_q*corr_sig_q ); + corr_img_abs = sqrt( corr_img_i*corr_img_i + corr_img_q*corr_img_q ); + + img_rej = 20*log10(corr_sig_abs/corr_img_abs); + + return (uint8_t)img_rej; +} + + +/* --- EOF ------------------------------------------------------------------ */ @@ -56,6 +56,16 @@ gateways as receivers. 3. Changelog ------------- +### v2.0.0 ### + +* Added support for Kerlink 868 27dBm gateway +* Updated global_conf.eu868.json (in packet logger) to new LoRaWAN frequency plan +* Added version numbers to AGC, arbiter and calibration firmware (those versions are checked at startup) +* Added test_loragw_cal to test radio calibrations +* Fixed minor bug in error coverage in register read/write functions + +/!\ warning: Kerlink 868 27dBm gateway includes a FPGA that MUST be programmed before running any application + ### v1.7.0 ### * Added TX “start delay” compensation for timestamp mode (fix time window alignment issue at low SF and/or high BW) diff --git a/util_pkt_logger/cfg/global_conf.eu868.json b/util_pkt_logger/cfg/global_conf.eu868.json index 2d7ae96..9dbf2f9 100644 --- a/util_pkt_logger/cfg/global_conf.eu868.json +++ b/util_pkt_logger/cfg/global_conf.eu868.json @@ -2,41 +2,75 @@ "SX1301_conf": { "radio_0": { "enable": true, - "freq": 868200000 + "freq": 867500000 + }, + "radio_1": { + "enable": true, + "freq": 868500000 }, "chan_multiSF_0": { - /* LoRa MAC channel, 125kHz, all SF, 868.1 MHz */ + /* Lora MAC channel, 125kHz, all SF, 868.1 MHz */ "enable": true, - "radio": 0, - "if": -100000 + "radio": 1, + "if": -400000 }, "chan_multiSF_1": { - /* LoRa MAC channel, 125kHz, all SF, 868.3 MHz */ + /* Lora MAC channel, 125kHz, all SF, 868.3 MHz */ "enable": true, - "radio": 0, - "if": 100000 + "radio": 1, + "if": -200000 }, "chan_multiSF_2": { - /* LoRa MAC channel, 125kHz, all SF, 868.5 MHz */ + /* Lora MAC channel, 125kHz, all SF, 868.5 MHz */ + "enable": true, + "radio": 1, + "if": 0 + }, + "chan_multiSF_3": { + /* Lora MAC channel, 125kHz, all SF, 867.1 MHz */ "enable": true, "radio": 0, - "if": 300000 + "if": -400000 }, - "chan_Lora_std": { - /* LoRa MAC channel, 250kHz, SF7, 868.3 MHz */ + "chan_multiSF_4": { + /* Lora MAC channel, 125kHz, all SF, 867.3 MHz */ "enable": true, "radio": 0, - "if": 100000, + "if": -200000 + }, + "chan_multiSF_5": { + /* Lora MAC channel, 125kHz, all SF, 867.5 MHz */ + "enable": true, + "radio": 0, + "if": 0 + }, + "chan_multiSF_6": { + /* Lora MAC channel, 125kHz, all SF, 867.7 MHz */ + "enable": true, + "radio": 0, + "if": 200000 + }, + "chan_multiSF_7": { + /* Lora MAC channel, 125kHz, all SF, 867.9 MHz */ + "enable": true, + "radio": 0, + "if": 400000 + }, + "chan_Lora_std": { + /* Lora MAC channel, 250kHz, SF7, 868.3 MHz */ + "enable": true, + "radio": 1, + "if": -200000, "bandwidth": 250000, "spread_factor": 7 }, "chan_FSK": { - /* FSK 100kbps channel, 868.3 MHz */ + /* FSK 50kbps channel, 868.8 MHz */ "enable": true, - "radio": 0, - "if": 100000, - "bandwidth": 250000, - "datarate": 100000 + "radio": 1, + "if": 300000, + "datarate": 50000, + "freq_deviation": 25000 } }, "gateway_conf": { |