From 65259a5ba7563a0bf78c8a65f51e7c431a6fb90c Mon Sep 17 00:00:00 2001 From: Michael Coracin Date: Wed, 9 Nov 2016 13:46:47 +0100 Subject: [PATCH] v4.1.0 * HAL: Reworked "Listen-Before-Talk" feature to have more flexibility to define LBT channels frequency, and to be able to have spectral scan running in parallel * HAL: Updated lgw_time_on_air() function for FSK packets * HAL: Disabled GPS UART input being re-echoed as output to avoid sending wrong commands to GPS module * HAL: Fixed IF frequency configuration check issue for channel bandwidths 250K and 500HKz. * FPGA: Updated to v33 for new LBT and and v31 for spectral scan. * util_spectral_scan: updated to match new spectral scan FPGA sequence * util_lbt_test: updated to match LBT rework Note: The provided LBT feature has been validated for Japan only, and supports 8 downlink channels maximum. --- Makefile | 4 +- VERSION | 2 +- .../SX1301_FPGA_125K_NOTCH_LBT_bitmap_v27.bin | Bin 32299 -> 0 bytes ...GA_125K_NOTCH_SPECTRAL_SCAN_bitmap_v27.bin | Bin 32299 -> 0 bytes ...A_200K_NOTCH_LBT_SPECTRAL_SCAN_863_v33.hex | 1659 +++++++++++++++++ ...A_200K_NOTCH_LBT_SPECTRAL_SCAN_915_v33.hex | 1659 +++++++++++++++++ ...1301_FPGA_NOTCH_PROG_SPECTRAL_SCAN_v31.hex | 1659 +++++++++++++++++ fpga/readme.md | 18 +- libloragw/inc/loragw_fpga.h | 69 +- libloragw/inc/loragw_hal.h | 44 +- libloragw/inc/loragw_lbt.h | 12 +- libloragw/inc/loragw_radio.h | 32 +- libloragw/inc/loragw_reg.h | 6 +- libloragw/readme.md | 115 +- libloragw/src/loragw_fpga.c | 90 +- libloragw/src/loragw_gps.c | 1 + libloragw/src/loragw_hal.c | 286 ++- libloragw/src/loragw_lbt.c | 255 +-- libloragw/src/loragw_radio.c | 215 +-- libloragw/src/loragw_reg.c | 83 +- libloragw/tst/test_loragw_cal.c | 23 +- libloragw/tst/test_loragw_hal.c | 2 + libloragw/tst/test_loragw_reg.c | 2 +- readme.md | 16 + util_lbt_test/readme.md | 14 +- util_lbt_test/src/util_lbt_test.c | 169 +- util_pkt_logger/global_conf.json | 2 +- util_pkt_logger/inc/parson.h | 173 +- util_pkt_logger/src/parson.c | 1427 +++++++++++--- util_pkt_logger/src/util_pkt_logger.c | 24 +- util_spectral_scan/readme.md | 34 +- util_spectral_scan/src/util_spectral_scan.c | 346 ++-- util_spi_stress/src/util_spi_stress.c | 9 +- util_tx_continuous/src/util_tx_continuous.c | 37 +- util_tx_test/src/util_tx_test.c | 95 +- 35 files changed, 7506 insertions(+), 1076 deletions(-) delete mode 100644 fpga/SX1301_FPGA_125K_NOTCH_LBT_bitmap_v27.bin delete mode 100644 fpga/SX1301_FPGA_125K_NOTCH_SPECTRAL_SCAN_bitmap_v27.bin create mode 100644 fpga/SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_863_v33.hex create mode 100644 fpga/SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_915_v33.hex create mode 100644 fpga/SX1301_FPGA_NOTCH_PROG_SPECTRAL_SCAN_v31.hex diff --git a/Makefile b/Makefile index 5022ac6b..3a1c0416 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,8 @@ all: $(MAKE) all -e -C libloragw $(MAKE) all -e -C util_pkt_logger $(MAKE) all -e -C util_spi_stress - $(MAKE) all -e -C util_lbt_test $(MAKE) all -e -C util_tx_test + $(MAKE) all -e -C util_lbt_test $(MAKE) all -e -C util_tx_continuous $(MAKE) all -e -C util_spectral_scan @@ -19,8 +19,8 @@ clean: $(MAKE) clean -e -C libloragw $(MAKE) clean -e -C util_pkt_logger $(MAKE) clean -e -C util_spi_stress - $(MAKE) clean -e -C util_lbt_test $(MAKE) clean -e -C util_tx_test + $(MAKE) clean -e -C util_lbt_test $(MAKE) clean -e -C util_tx_continuous $(MAKE) clean -e -C util_spectral_scan diff --git a/VERSION b/VERSION index fcdb2e10..ee74734a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.0.0 +4.1.0 diff --git a/fpga/SX1301_FPGA_125K_NOTCH_LBT_bitmap_v27.bin b/fpga/SX1301_FPGA_125K_NOTCH_LBT_bitmap_v27.bin deleted file mode 100644 index f96b4998c0d68364ac0c42d863261e759392fe47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32299 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 z 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 M17&AFhF=o@Ke+W4djJ3c diff --git a/fpga/SX1301_FPGA_125K_NOTCH_SPECTRAL_SCAN_bitmap_v27.bin b/fpga/SX1301_FPGA_125K_NOTCH_SPECTRAL_SCAN_bitmap_v27.bin deleted file mode 100644 index f986d448abb4a381e57dd91ff3022a691736e647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32299 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 Cn%{>2 diff --git a/fpga/SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_863_v33.hex b/fpga/SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_863_v33.hex new file mode 100644 index 00000000..4cff2805 --- /dev/null +++ b/fpga/SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_863_v33.hex @@ -0,0 +1,1659 @@ +ff 00 +4c 61 74 74 69 63 65 00 +69 43 45 63 75 62 65 32 20 32 30 31 35 2e 30 34 2e 32 37 34 30 39 00 +50 61 72 74 3a 20 69 43 45 34 30 4c 50 31 4b 2d 43 4d 34 39 00 +44 61 74 65 3a 20 4f 63 74 20 31 37 20 32 30 31 36 20 31 31 3a 33 33 3a 31 32 00 +00 ff +7e aa 99 7e +51 00 +01 05 +92 00 20 +62 01 4b +72 00 90 +82 00 00 +11 00 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 01 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 00 01 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 08 03 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 03 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 30 00 10 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 +00 00 00 00 00 0f 22 13 00 00 01 c0 1c 00 00 00 00 00 0f 70 01 00 00 07 00 c5 00 00 00 00 00 fa 21 30 00 00 00 21 78 f5 00 +00 00 00 00 00 0b 70 04 90 80 00 02 00 e0 a5 01 00 00 01 ad 82 00 00 00 40 c0 a0 00 00 00 00 e3 00 49 08 00 03 40 06 0a 00 10 +00 00 18 00 80 0f 22 13 00 00 00 40 0d e5 00 09 81 85 80 10 00 10 80 00 20 c0 50 01 83 89 00 32 21 30 00 81 2c 02 00 24 00 +00 00 00 00 07 00 50 04 90 00 00 00 24 10 50 00 00 00 00 03 82 00 00 00 00 c0 0a 00 00 00 78 07 00 49 40 04 01 40 04 91 80 00 +00 00 10 00 01 9d 22 13 00 00 00 03 a1 e5 00 00 00 00 08 d8 00 02 00 06 80 e5 00 01 00 00 00 9a 21 30 00 00 0c 01 48 05 20 +00 00 01 00 00 08 78 04 90 00 00 00 02 40 a0 00 00 00 00 0f 01 00 40 00 00 c0 a0 00 10 18 f0 03 00 49 40 00 00 03 83 00 50 00 +00 02 00 00 19 9d 22 13 00 00 00 03 15 80 50 00 00 08 00 30 00 00 00 00 1e c0 50 00 00 00 1a 5a 21 30 00 00 00 04 18 50 00 +00 00 00 00 0d 08 58 04 90 00 00 2c 00 30 05 00 40 00 50 0b 01 00 00 04 00 00 05 00 00 05 00 07 80 49 00 00 20 03 64 0a 01 00 +00 00 00 00 00 0f a2 13 00 40 02 00 24 00 00 00 00 05 0a 10 10 00 03 40 16 8f 50 00 00 00 00 d2 21 30 00 00 00 00 5c 50 00 +00 00 20 00 00 00 70 04 90 04 00 0c 02 40 a5 00 00 00 50 07 80 00 00 0c 00 d0 a0 00 00 00 70 03 00 49 00 00 20 00 02 05 00 00 +00 00 00 00 00 0d a2 13 00 00 00 00 17 80 50 00 00 00 01 f0 10 00 01 46 9e c0 50 00 00 01 00 7a 21 30 00 00 1e 20 0e 50 00 +00 00 00 00 00 00 50 04 90 00 00 00 00 30 05 00 00 00 10 af 80 00 00 00 00 20 05 00 00 00 b0 07 80 49 00 00 40 00 24 0a 00 00 +00 00 00 00 98 0d a2 13 00 00 00 40 07 aa 00 00 00 07 1b 98 00 00 16 00 01 c5 00 00 00 0d 80 ba 21 32 00 00 04 00 5c 50 00 +00 00 00 00 01 00 78 04 90 00 00 00 20 00 a0 00 80 00 08 a3 00 10 00 14 00 d0 a0 00 00 00 b0 03 00 49 00 00 00 00 03 05 00 00 +00 00 10 00 b8 0d a2 11 00 00 02 02 1d 80 50 03 00 0f 0a b8 10 00 01 62 8c a5 00 01 00 08 1a 72 21 30 01 00 00 00 0a 50 00 +00 00 01 00 01 80 58 04 90 00 00 1c 00 10 05 00 30 00 58 a7 80 00 00 00 00 10 50 00 10 00 50 07 00 49 00 10 00 00 24 0a 00 00 +00 00 00 00 70 01 61 7d 80 00 00 07 21 c0 50 00 00 08 0c 90 02 04 02 06 80 12 40 00 80 03 0a 1a 21 30 00 00 20 28 58 c0 d0 +40 00 00 00 00 89 04 17 d0 00 00 00 00 40 0a 00 00 00 90 03 80 00 28 14 03 4a 18 00 00 00 91 0f 00 49 90 04 00 44 03 83 04 04 +00 00 18 00 81 e1 e1 40 00 60 02 00 2e d5 60 01 80 07 00 10 01 00 00 03 96 cf 50 01 83 8d 80 12 21 30 0a 40 00 38 e8 96 80 +00 00 00 00 0f 19 08 14 00 00 00 1c 02 cf 20 00 00 00 08 03 00 00 00 00 41 d0 50 00 00 00 50 0b 00 49 00 a2 00 00 00 09 60 04 +00 00 30 00 00 09 62 80 08 c8 00 02 21 c0 12 20 08 01 80 f0 00 00 02 06 20 c5 00 01 28 00 1c 12 21 30 00 80 00 01 e8 96 80 +00 00 03 00 00 00 d4 28 40 04 00 00 00 40 02 00 01 20 08 0f 80 40 00 1c 41 50 a0 00 30 00 00 0f 80 49 40 04 00 00 00 09 60 10 +00 02 02 80 80 ad ba 04 00 00 00 60 2e a2 e0 00 00 09 80 30 00 00 60 e0 77 cf 50 00 00 11 81 1a 21 30 01 06 00 00 e8 96 80 +00 00 00 10 0f 00 9a 30 80 00 00 3c 03 d9 bd 00 00 00 98 0b 80 40 00 82 3e 50 50 00 01 06 08 9b 00 49 00 10 e0 00 02 09 60 10 +00 00 00 00 00 1d e4 00 00 02 20 00 7d a1 04 20 00 05 9b 18 00 00 00 06 a0 85 00 00 00 00 4c 5a 21 38 00 40 00 00 e8 96 80 +00 00 20 00 00 0d 96 c1 00 40 00 1c 21 40 30 40 00 28 00 af 02 00 00 00 39 50 a0 00 00 10 01 0f 80 49 00 08 c0 00 00 09 60 00 +00 00 00 00 00 03 a7 44 00 00 02 c3 2e d0 40 00 00 00 18 d0 00 00 00 00 05 a0 50 00 00 00 00 5a 21 30 00 00 16 05 c8 96 80 +00 00 00 03 80 08 1e 74 80 10 00 2c 42 cf 00 00 00 00 51 0f 02 00 00 1c 38 00 05 00 00 00 70 0b 00 49 00 00 01 c3 c2 09 60 00 +00 00 00 00 19 81 06 04 00 00 02 40 1f d8 00 00 00 07 89 38 10 00 00 00 74 ef 50 00 00 00 0c 7a 21 38 00 00 2e 69 c8 96 80 +00 00 00 00 00 00 93 79 c0 00 00 04 00 fc 00 00 00 18 09 c7 80 00 00 3c 35 50 a0 00 00 00 01 0f 80 49 00 00 01 c0 00 09 60 08 +00 00 30 00 10 ef b1 1c 0c c0 01 c0 3d 84 00 23 00 07 1b d8 00 14 e0 00 37 cf 50 03 00 00 00 72 21 10 0c 00 44 21 e8 96 80 +00 00 03 00 00 80 9c 01 40 0c 00 00 38 c0 d0 20 f0 00 08 a5 02 01 a0 00 03 40 50 00 10 00 00 f1 80 85 00 c0 08 e0 02 09 60 80 +00 00 00 00 81 87 f3 d5 00 02 02 02 0f ea 44 00 00 20 00 00 00 02 01 42 e4 98 00 00 00 08 00 f3 bd 40 00 00 be 01 e8 96 00 +00 00 00 00 01 08 9c 28 10 00 40 2c 2b 6f 80 40 00 44 00 00 00 00 00 36 61 5b 00 00 00 00 90 c9 41 40 00 00 02 60 02 09 60 50 +00 00 18 00 80 01 7a 81 00 60 01 e0 2c fa 14 00 00 00 00 00 00 00 00 07 a4 88 00 20 30 08 00 1e b4 40 80 0c 20 39 7c f5 00 +00 00 00 00 01 00 d0 3d 50 00 00 24 2e da 02 40 00 00 00 00 00 00 00 34 03 50 00 10 03 00 d0 c0 03 44 04 00 03 40 3f 05 00 80 +00 00 30 00 00 07 b3 d5 00 42 00 02 af ea 44 00 00 20 00 00 00 04 c3 e0 16 aa 00 00 00 00 00 7a 94 00 00 40 20 00 6c a0 00 +00 00 03 00 00 09 90 28 10 04 00 00 6d 7f 80 40 00 15 00 00 00 00 a0 0e 2c 10 a0 00 00 00 00 90 c1 40 02 02 06 c0 07 0f a0 00 +00 02 00 00 80 03 22 95 00 00 01 42 a6 e8 54 00 10 00 00 00 00 00 01 42 a1 ea 00 00 00 01 80 00 49 00 00 a0 00 6b ec 00 00 +00 00 00 00 09 00 bc 15 50 00 00 36 42 fc 40 40 00 80 00 00 00 00 00 36 6e 40 50 00 00 00 90 03 3c 60 00 04 03 c4 14 82 00 00 +00 00 00 00 19 b7 23 d5 00 00 00 40 2e ea 44 00 00 00 00 00 00 00 01 c0 0c aa 50 00 00 27 80 32 bd 40 00 04 20 6a eb e2 00 +00 00 20 00 00 08 9c 28 10 00 00 1e 03 7f 80 40 09 00 00 00 00 00 00 02 00 40 aa 01 00 00 00 01 42 80 00 00 00 c0 1e 88 12 00 +00 00 00 00 99 81 ba 81 00 00 00 06 24 e8 54 00 00 00 00 00 00 00 00 40 21 ea 00 00 00 07 00 97 34 40 80 00 00 38 00 00 00 +00 00 00 00 03 00 d0 3d 50 00 00 2c 32 db 40 40 00 00 00 00 00 00 00 02 02 50 50 00 00 00 58 af 81 40 00 00 00 06 00 00 00 00 +00 00 00 00 d8 97 73 d5 02 00 00 07 6e 8a 44 00 10 00 00 00 00 00 00 00 07 ca 00 00 00 00 00 3e bd 40 00 00 00 04 00 00 00 +00 00 00 00 05 1a 90 28 10 00 00 00 76 ff 80 40 00 85 00 00 00 00 00 00 00 20 a0 00 00 00 10 91 02 80 00 00 80 02 00 00 00 00 +00 00 30 00 d8 18 22 81 00 40 00 00 25 c0 50 00 00 00 00 00 00 00 01 42 86 aa 00 04 00 00 00 97 34 40 c0 00 04 04 00 00 00 +00 00 01 00 05 0a 54 14 10 04 00 1c 38 60 5a 00 00 00 00 00 00 00 00 00 01 40 f5 01 00 00 00 ff c1 40 00 00 00 03 40 00 00 00 +00 00 00 00 00 10 2a bd 02 00 20 43 85 dc 10 00 00 00 00 00 00 00 02 02 be 8b 7c 00 00 00 00 d3 28 10 00 0e 84 78 5e 83 40 +00 00 00 00 00 0f d0 17 d0 00 00 02 02 ed c7 00 00 00 00 00 00 00 00 04 22 68 12 42 00 00 00 03 03 d5 00 00 62 67 a4 ce 34 10 +00 00 18 00 d0 03 2c 08 00 00 00 00 20 ca 30 28 10 00 00 00 00 60 01 40 3c 99 5c 01 80 00 00 3a a8 10 02 00 00 00 6f f1 40 +00 00 00 00 0d 80 f6 06 40 00 00 00 26 c0 53 00 02 80 00 00 00 00 00 1c 28 4f 56 48 00 00 70 03 43 e9 00 a0 00 03 c6 e7 05 10 +00 00 18 00 81 e1 bb d4 00 00 00 00 1d ef 50 00 00 00 00 00 00 40 08 06 3e 9b 7c 00 00 48 18 53 28 04 00 00 0e 39 cc f5 40 +00 00 01 00 01 1b 34 01 40 00 00 00 02 e0 a0 00 00 00 00 00 00 04 01 40 03 e8 12 48 00 00 14 00 02 80 01 00 08 00 37 05 04 90 +00 02 00 00 00 03 04 00 00 00 00 00 1e c0 50 00 00 00 00 00 00 00 00 60 14 99 5c 00 10 09 98 ba bd 50 00 00 26 65 dc a5 40 +00 00 00 00 00 00 f2 10 80 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 02 6f 56 48 00 80 10 05 41 41 00 00 02 c3 46 05 54 00 +00 00 00 00 00 01 ba 80 00 0a 00 07 a0 e0 50 00 00 00 00 00 00 00 00 00 1e 8b 7c 10 00 09 80 fe bd 50 40 00 20 21 da f5 40 +80 00 20 80 09 09 04 28 00 02 00 34 6c c0 0a 00 00 00 00 00 00 02 00 1c 26 ec 12 40 08 00 30 05 01 41 00 00 00 40 3e 05 04 10 +00 00 00 00 80 00 30 14 00 00 e1 42 00 c0 50 00 10 00 00 00 00 04 01 46 76 99 5c 00 00 08 00 be bd 50 40 00 00 69 7c a5 40 +00 00 00 00 01 00 f0 02 82 00 00 26 78 40 0a 00 02 80 00 00 00 00 a0 14 20 cf 56 48 00 00 70 0f 01 41 00 00 01 c0 1c 05 54 00 +00 00 00 00 00 11 b8 7c 00 0a 00 00 1c c5 00 00 00 00 00 00 00 00 00 62 9e 9b 7c 00 00 00 00 ff bd 50 40 00 06 63 da f5 40 +40 00 00 00 00 0f d7 46 80 00 00 34 28 10 50 00 00 00 00 00 00 00 00 00 03 ed 12 40 40 00 00 0d 41 41 00 00 2b c3 57 05 04 00 +00 00 30 00 10 03 e2 04 08 00 03 e0 06 c0 50 00 10 00 00 00 00 c0 01 c2 ee 9b 74 01 00 08 01 b6 bd 50 4c 00 24 00 5b f1 40 +00 00 03 00 00 00 d0 38 80 00 00 3c 00 20 05 00 00 80 00 00 00 0c 00 00 3b cd 21 48 10 00 70 87 42 81 00 c0 03 c0 25 db 06 04 +00 00 c0 00 80 a7 65 d1 00 00 04 02 74 ca 00 00 00 80 00 00 00 00 00 00 5c 88 4c 00 00 0f 1a 56 bc 00 00 00 26 63 ca f4 40 +00 00 20 00 0f 0e 1f d4 14 30 00 04 68 e0 fa 08 00 00 00 00 00 00 00 00 3f c0 12 42 00 00 58 0d 82 94 00 00 02 c0 24 fd 04 04 +00 00 18 00 00 a3 6b 00 00 00 00 00 1c 8a 50 00 00 00 00 00 00 60 02 00 04 88 4e 00 28 08 00 1a a1 c0 8a 00 06 71 ca c3 61 +08 00 04 00 03 10 9f bf 00 00 40 00 27 d0 aa 00 80 00 00 00 00 00 00 1c 02 e0 12 40 11 00 70 00 02 1c 00 20 00 03 9e 8d 14 00 +00 00 10 00 51 c7 71 1d 0c 00 00 00 75 ca 00 00 03 80 00 00 00 c0 00 06 54 88 4c 08 00 25 0b 12 a1 c0 80 00 3c 01 ce c3 60 +00 00 01 01 00 1a 1c 10 98 20 00 00 2a f0 fa 08 00 18 00 00 00 04 00 00 23 e0 12 40 00 04 50 b0 02 1c 04 00 00 43 fd de 24 04 +00 01 00 00 18 a3 2a 80 00 00 00 00 2c 8a 50 00 00 00 00 00 00 00 08 66 54 88 4c 00 00 00 01 3a a8 00 00 80 00 01 ce e5 60 +00 00 00 00 00 00 7b 39 c0 00 00 00 00 f0 55 08 00 00 00 00 00 00 00 40 22 e0 12 40 00 00 d0 a0 02 80 00 14 00 00 26 e5 84 00 +00 00 00 00 30 15 3b 14 08 00 11 e6 9e 8f 50 00 00 20 00 00 00 00 00 03 de 88 4c 00 00 40 00 82 a8 00 00 24 0e 04 6b 83 40 +08 00 00 80 00 08 d8 32 40 02 00 80 26 50 a0 00 88 00 00 00 00 02 00 00 3b c0 12 40 4a 00 00 03 01 40 00 00 02 e2 1f cd 34 00 +00 00 00 00 00 e1 7b 89 4d 00 e1 66 86 8a 50 00 00 00 00 00 00 00 00 00 16 88 4c 00 00 00 00 3a a8 00 00 00 20 01 dd c3 41 +00 00 00 00 09 00 f4 20 52 30 00 24 26 f0 55 08 00 00 00 00 00 00 00 00 02 c0 12 40 00 00 f0 00 42 80 00 00 00 43 1f 8d 14 10 +00 00 00 00 80 07 3b d4 00 00 63 60 15 ef a0 00 00 20 00 00 20 00 02 03 96 88 4c 00 2b 03 c0 5a 7d c0 00 02 3e 73 ec a5 40 +08 00 00 00 01 09 b4 3f c0 00 00 14 24 30 fa 00 00 01 00 00 00 00 00 04 03 e0 12 40 00 00 08 01 ff fc 00 08 01 c6 26 05 54 00 +00 00 10 00 00 ed f1 41 08 00 02 00 44 8a 50 00 00 00 00 00 00 40 02 00 16 88 44 00 08 00 0e 3b a8 00 0c 00 1e 7e 5e a5 40 +00 00 01 00 87 00 70 04 10 20 00 14 25 d0 55 08 00 08 00 00 00 04 00 04 02 e0 12 49 40 00 01 00 02 80 00 c0 e0 26 3d 05 56 80 +00 00 00 00 d1 d1 21 55 02 00 00 00 2e ab 04 00 00 00 00 00 00 00 01 42 16 af 50 00 20 4f 80 13 e4 40 10 04 1c 00 d9 d5 00 +00 00 00 00 01 88 14 16 90 00 00 00 02 6e f1 40 00 00 00 00 00 80 20 02 6c 10 f5 00 00 02 f0 e7 63 8c 00 00 02 62 34 8d 00 00 +00 00 18 00 d0 17 73 d4 00 60 00 00 1d 8a 14 01 80 00 00 00 00 00 e1 42 a6 af 50 00 00 00 00 b3 7f 00 00 a0 3c 25 fc c1 02 +00 00 00 00 01 09 54 3f c0 00 00 00 30 da 5b 40 00 00 00 00 00 80 00 36 6c 70 ff 00 00 00 f0 03 6d e0 00 04 01 c7 8f 0e 60 00 +00 00 00 00 01 89 21 c0 08 00 03 e0 74 cf 70 00 00 00 00 00 00 00 00 02 d6 a5 f0 00 00 00 1c 36 a1 c0 80 00 06 28 da 91 00 +00 00 00 00 05 0a 14 14 00 00 00 06 20 ca ff 00 00 00 00 00 00 80 04 34 78 10 5f 00 02 05 70 00 82 1c 00 00 00 00 2c 9d 30 00 +00 02 00 00 18 00 2b 4d 08 00 00 00 2e ca 50 00 00 00 00 00 00 00 01 40 4e cf 50 20 03 a0 00 3a 21 c0 80 00 1d 29 40 e7 02 +00 00 00 00 00 00 94 38 d0 40 00 00 2f 4c f7 08 00 40 00 00 00 80 00 14 26 60 81 00 00 00 70 e0 c2 1c 00 00 01 74 04 08 10 00 +00 00 00 00 00 05 61 54 00 02 02 60 74 cf 52 00 00 00 00 00 08 00 02 63 2d af f2 20 00 00 1e 02 a1 c0 80 00 3c 3a f8 42 02 +00 00 20 00 00 00 08 15 40 00 40 04 38 c0 ff 08 00 00 00 00 00 00 00 04 41 70 fb 01 00 18 30 81 01 2c 00 00 a2 c2 a7 0d 10 10 +00 00 00 80 80 05 a3 c1 02 0a 00 03 54 c2 00 20 00 00 00 00 00 00 00 00 06 ef 70 00 00 47 00 02 a8 00 00 00 40 3e 1b c5 00 +00 00 00 10 05 0a 94 3d 50 00 40 24 70 10 20 08 00 00 00 00 00 40 00 00 24 4a ff 00 00 02 08 95 41 40 20 00 c0 07 94 9c a0 10 +00 00 00 00 50 0d 62 80 00 00 01 c0 75 a2 50 20 00 00 00 00 00 00 08 40 06 cf 70 20 01 21 01 00 00 00 01 00 00 38 dd 47 00 +00 00 00 00 00 00 b8 00 00 00 00 02 24 f0 2a 00 00 00 00 00 00 40 01 42 02 60 ff 10 00 04 08 b0 00 00 00 10 00 04 0f b4 20 10 +00 00 30 00 10 03 e3 88 08 c0 00 46 9f c5 b0 23 40 07 00 00 08 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 40 20 4f 74 00 +00 00 03 00 00 80 54 14 00 0c 00 02 43 f0 02 00 b4 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 2d da 00 10 +00 00 00 00 18 0d 2c 41 00 00 00 63 8d ca 00 00 00 00 00 00 00 00 01 43 1c 98 4c 02 00 00 0c 7a 3e 80 00 40 04 70 4e 85 00 +00 00 00 00 00 00 97 49 10 00 00 00 01 50 00 00 00 00 00 00 00 80 00 02 01 4b 12 42 00 00 00 00 c3 e8 40 0a 00 00 2c be a0 00 +00 00 18 00 00 15 f3 bc 00 60 03 40 07 a4 74 30 00 00 00 00 00 60 00 60 1e 88 4c 00 80 00 00 f7 be c0 80 00 20 06 6c c5 02 +00 00 00 00 00 0b d6 bf c0 00 00 04 00 40 81 68 80 00 00 00 00 40 00 00 00 4c 12 40 28 00 00 07 43 fc 20 00 00 c2 de 0c 60 00 +00 00 34 00 80 0f 29 f1 08 c4 00 e6 a4 c1 00 00 00 00 00 00 00 c0 01 43 54 98 4c 00 00 01 00 fb 3f c0 02 00 00 22 1c e2 02 +00 00 03 40 0d 0e 90 0f 10 04 20 02 02 ea 26 00 00 20 00 00 00 44 00 02 21 6e 12 40 00 00 08 0f 03 d4 20 00 00 00 0d 0d 10 00 +00 02 00 00 18 05 f3 fc 00 00 00 60 54 e5 b4 20 40 00 00 00 00 00 00 07 de 88 4c 00 00 00 01 87 bd 44 00 00 1e 05 6e 03 02 +40 00 00 00 00 00 56 fd c0 00 00 00 20 20 5b 40 44 00 00 00 00 80 00 00 20 4d 12 40 00 00 00 87 43 e8 00 00 00 03 ec 05 30 00 +00 00 00 00 10 01 01 f9 08 00 01 c0 21 ef a0 00 00 00 00 00 00 00 00 66 1e 9b 7c 00 40 03 80 da 00 00 20 01 40 3b cc a0 00 +00 00 20 00 00 00 00 1f 90 00 00 02 3a d0 f5 00 00 00 00 00 00 40 00 80 3b 4e de c0 04 00 08 0f c1 40 00 00 03 46 e7 0f a0 00 +00 00 00 00 80 10 3b e8 00 00 00 c6 40 af 70 00 00 00 00 00 00 04 02 06 1e 98 4c 00 28 50 00 00 3c 10 00 00 04 72 cd d5 00 +00 00 00 00 03 0a 30 3d 40 00 00 00 20 c9 fb 00 00 04 00 00 00 40 00 0c 00 48 12 40 01 00 10 e0 03 c3 80 00 03 44 0d bd 00 00 +00 00 00 00 d8 ed 2b dc 48 04 00 63 97 c5 05 28 00 00 00 00 00 00 02 00 16 98 4c 00 00 03 80 7f bd 48 00 21 14 02 4e c5 02 +00 00 00 00 07 40 b4 3f c2 00 20 00 01 e0 b8 48 00 00 00 00 00 40 00 04 01 6e 12 40 00 00 08 07 83 fc 80 00 03 63 9e 0c 90 00 +00 00 30 00 00 07 70 01 00 c0 00 e0 0e fa 50 00 00 00 00 00 00 c0 02 40 1e 9b 7c 03 00 08 1f 3f be c0 80 00 7e 00 7c c5 02 +00 00 01 00 00 00 56 c2 10 0c 00 00 3e 78 8b 00 00 00 00 00 00 44 00 06 02 4d de c0 10 00 f0 e9 c3 fc 20 00 01 40 00 0c 50 00 +40 70 00 00 81 87 f3 d5 00 00 00 e6 00 0a 54 00 00 09 0e 80 00 00 02 00 0e 8b 74 04 00 0b 00 00 19 9c 10 00 00 22 6a f5 40 +00 04 20 00 01 00 7c 28 10 00 00 00 3a c0 5a c0 00 00 f9 05 00 00 00 04 02 c8 de c4 00 00 18 0b 22 65 01 00 43 c3 ee 05 04 80 +00 00 18 00 80 09 3a 95 00 60 02 60 0c c0 00 11 80 00 00 00 00 60 00 00 00 c0 f0 01 80 08 00 77 00 54 12 00 00 3b 6e f5 40 +08 00 00 00 01 00 d0 15 50 00 00 3c 29 60 50 01 00 00 00 01 00 00 00 00 00 10 0f 00 00 00 30 0f b7 89 44 a0 00 03 9e 05 04 80 +6c 00 30 00 00 05 33 d5 00 00 03 e0 00 8f 04 00 00 00 00 80 00 c0 00 00 00 00 00 01 00 00 0f 33 82 9c 00 00 7e 62 6e f5 40 +03 80 03 00 05 0a 78 28 10 00 00 06 00 10 f0 c0 00 00 00 0f 00 0c 00 00 00 00 00 00 30 80 01 db c2 95 81 00 00 40 27 05 06 00 +00 03 00 00 00 bb 3a 95 00 00 00 07 c0 8f 04 00 04 0f 81 00 00 02 00 00 00 00 00 00 03 83 80 13 28 00 00 00 20 3a 4a f5 40 +00 00 00 00 05 0d 58 15 50 00 00 00 70 10 f0 c0 00 00 f8 f9 00 00 40 00 00 00 00 00 00 00 08 00 42 80 00 00 04 40 1d 05 04 08 +00 00 00 38 19 b7 a3 d5 00 00 12 00 47 f5 02 00 00 00 00 00 00 0a 00 00 40 00 00 00 40 05 8f b3 89 98 d0 0c 00 00 5a f5 40 +00 00 20 00 00 18 74 28 10 00 00 9c 21 5b b8 00 00 00 00 01 00 00 40 00 3c 00 00 00 04 00 00 83 c2 25 20 08 00 00 06 0a 04 80 +40 00 00 00 19 81 b8 15 00 00 00 00 27 8a f0 00 00 00 00 80 00 02 08 c0 00 00 00 00 00 0f 00 13 35 40 00 00 a6 02 4e a0 50 +00 80 00 00 00 00 00 01 50 00 00 00 03 50 ff 08 00 00 90 05 00 00 01 44 00 00 00 00 00 00 18 07 63 40 00 00 05 c3 cd 0f a4 08 +00 28 00 00 50 85 73 d5 00 00 22 00 00 e7 00 20 00 00 00 80 00 00 00 07 00 00 00 00 00 08 19 37 30 40 81 40 06 77 6e f5 00 +08 06 c0 12 00 10 70 28 18 00 00 1c 01 40 b0 08 00 00 00 07 00 00 00 00 00 00 00 00 00 00 50 e1 03 98 00 00 02 46 3c 0a 00 00 +40 00 30 00 10 15 ba 95 00 c0 00 40 66 c0 00 03 00 03 0c 80 00 c4 00 00 00 00 00 01 39 00 00 3e 09 40 8c 00 04 70 5c e2 02 +00 00 03 00 03 0b b8 2a 90 0c 00 00 33 48 10 20 10 00 09 0d 00 04 20 00 00 00 00 00 30 28 00 0d 03 ec 20 c8 84 c0 02 0e 20 08 +00 00 +11 01 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 01 40 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 0d 11 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 80 30 00 00 00 00 00 00 40 80 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 10 00 00 8f c1 41 00 c0 00 02 3f 05 04 00 00 00 00 00 00 40 00 02 3f 05 04 03 00 00 08 fc 14 10 04 00 00 23 f0 50 40 +00 00 03 00 01 81 f6 bd 50 0c 00 04 06 da f5 40 00 00 00 00 00 04 00 00 06 da f5 40 30 00 10 1b 6b d5 00 c0 00 07 ff af 54 00 +00 00 00 00 01 8f c3 d5 00 00 00 02 15 d7 24 00 00 00 00 00 00 00 00 02 15 d7 24 00 00 00 08 07 6c 50 00 00 00 21 70 50 40 +00 00 00 00 01 8f 7a a8 10 00 00 06 06 1e b1 40 02 00 00 00 00 00 00 06 06 1e b1 40 00 00 18 13 fa c5 00 00 00 60 6f ef 54 00 +00 00 00 00 10 0b 43 d5 00 00 00 00 16 05 04 00 00 00 00 00 00 00 00 00 16 05 04 00 00 00 00 5b 10 90 00 00 04 01 60 50 40 +00 00 00 00 00 00 7e 28 10 00 00 00 02 da f5 40 00 00 04 00 00 00 00 00 02 da f5 40 00 00 19 ab 07 9d 00 00 00 07 bf af 54 00 +00 02 00 00 01 0f 43 d5 00 00 00 02 b4 d7 24 00 00 00 00 00 00 00 00 02 f4 d7 24 00 00 00 0f d3 5c 90 00 00 00 03 60 50 40 +00 00 00 00 00 0e 5b a8 10 00 00 00 00 1a b1 40 00 00 00 00 00 00 00 00 00 1a b1 40 00 00 00 00 6a c5 00 00 00 00 0f af 54 00 +00 00 00 00 10 0b 83 d5 00 00 00 40 3f 05 04 00 28 00 00 00 00 00 00 40 3f 05 04 00 00 01 00 fc 14 10 00 00 04 03 f0 50 40 +00 00 20 00 0d 18 57 a8 10 00 00 26 60 ca f5 40 01 00 00 00 00 00 00 26 60 ca f5 40 00 00 81 83 2b d5 00 00 02 66 1e af 54 00 +00 00 00 00 10 a7 c1 41 00 00 00 40 1d d7 24 00 00 00 00 00 00 00 00 40 1d d7 24 00 00 01 00 77 5c 90 00 00 04 01 f0 50 40 +00 00 00 00 08 18 33 bd 50 00 00 20 60 0e b1 40 00 00 00 00 00 00 00 20 60 0e b1 40 00 00 81 80 3a c5 00 00 02 06 0e ef 54 00 +00 00 00 00 00 ab 03 d5 00 00 00 00 16 05 04 00 00 00 00 00 00 00 01 c4 16 05 04 00 00 00 00 58 14 10 00 00 00 01 60 50 40 +00 00 01 80 00 00 76 a8 10 06 00 00 68 ce f5 40 00 00 00 00 00 06 00 00 60 ce f5 40 1a 80 00 03 3b d5 00 60 00 02 9e ef 54 00 +00 00 00 00 00 0d 81 41 00 00 00 00 2d 0f 54 00 00 10 00 00 00 00 00 00 2d 0f 54 00 00 00 00 b4 3d 50 00 00 00 03 d0 f5 40 +00 00 00 00 00 00 32 bd 50 00 00 00 01 58 a0 40 00 00 00 00 00 00 00 00 01 58 a0 40 00 00 00 05 72 81 00 00 00 00 35 8a 04 00 +00 00 30 00 00 85 c1 41 00 40 00 02 3d 05 04 00 00 00 00 00 00 c0 00 02 3d 05 04 01 00 0f 08 f4 14 10 04 00 00 23 d0 50 40 +00 00 01 00 00 01 b6 bd 50 04 00 00 06 fa f5 40 00 38 00 00 00 0c 00 0e 07 5a f5 40 30 00 00 19 eb d5 00 40 00 40 7f af 54 00 +00 00 00 00 00 87 75 c9 00 00 00 02 15 c7 24 00 00 00 00 00 00 10 00 02 15 a7 24 00 00 00 08 54 14 10 00 00 00 21 50 50 40 +00 00 00 00 01 81 07 ac 50 00 00 06 06 1f b1 40 00 00 00 00 00 01 00 06 06 1e b1 40 00 00 18 1f fb d5 00 00 00 60 6d ef 54 00 +00 00 00 00 00 03 c3 e9 00 00 02 40 14 05 04 00 00 00 00 00 00 00 00 00 14 05 04 00 00 03 00 50 14 10 00 00 00 01 40 50 40 +00 00 00 00 01 80 b6 a8 10 00 00 00 02 fa f5 40 00 00 00 00 00 00 00 00 03 5a f5 40 00 00 80 09 eb d5 00 00 00 00 3f af 54 00 +00 02 00 00 00 e1 35 c9 00 00 00 00 34 c7 24 00 00 00 00 00 00 00 00 00 34 a7 24 00 00 00 00 d0 14 10 00 00 02 03 40 50 40 +00 00 00 00 00 01 06 ac 50 00 00 00 00 1b b1 40 00 00 00 00 00 00 00 00 00 1a b1 40 00 00 00 07 eb d5 00 00 01 e0 0d af 54 00 +00 00 00 00 18 e9 83 e9 00 00 00 40 3d 05 04 00 00 00 00 00 00 00 00 40 3d 05 04 00 00 01 00 f4 14 10 00 00 04 03 d0 50 40 +00 00 20 00 09 18 36 28 10 00 00 26 60 ea f5 40 00 00 00 00 00 00 00 26 61 4a f5 40 00 00 99 81 ab d5 00 00 02 66 1e af 54 00 +00 00 00 00 10 00 f6 c5 00 00 00 40 1d c7 24 00 00 00 00 00 00 00 00 60 1d a7 24 00 00 01 00 74 14 10 00 0a 04 01 d0 50 40 +00 00 00 00 08 00 13 ac 50 00 00 20 60 0f b1 40 04 10 00 00 00 00 00 3e 60 0e b1 40 00 00 81 87 bb d5 00 00 02 06 0c ef 54 00 +00 00 00 00 d0 05 81 41 00 00 02 44 14 05 04 00 00 00 00 00 00 00 00 04 14 05 04 00 00 0d 10 50 14 10 00 00 24 01 40 50 40 +00 00 01 80 00 00 33 bd 50 06 00 00 28 ee f5 40 00 00 00 00 00 06 00 00 29 4e f5 40 18 00 80 a1 bb d5 00 60 00 02 9e ef 54 00 +00 00 00 00 d0 0b 43 d5 00 00 00 00 0d 0f 54 00 04 00 00 00 00 00 00 00 15 0f 54 00 00 00 00 14 3d 50 00 00 00 01 d0 f5 40 +00 00 00 00 00 18 56 a8 10 00 00 00 03 58 a0 40 02 80 00 00 00 00 00 00 01 58 a0 40 00 00 00 0d 62 81 00 00 00 00 35 8a 04 00 +00 00 10 00 01 8f c1 41 00 c0 00 26 3f 05 04 00 00 00 00 00 00 c0 00 12 3d 05 04 03 00 00 88 fc 14 18 0c 00 00 23 f0 50 40 +00 00 03 00 00 0f fe bd 50 0c 00 04 27 fa f5 40 00 00 00 00 00 0c 00 1c 06 7a f5 40 30 00 10 1b eb d5 00 c0 01 c0 65 af 54 00 +00 00 00 00 00 85 7d c9 00 00 00 02 15 f7 24 00 00 00 00 00 00 00 00 02 15 87 24 00 00 00 08 54 14 10 00 00 00 21 59 72 40 +00 00 00 00 01 81 87 ec 50 00 00 06 06 1f b1 40 00 00 00 00 00 00 00 06 06 1f b1 40 00 00 18 1b 7b d5 00 00 00 60 61 eb 14 00 +00 00 00 00 98 05 81 41 00 00 00 00 16 05 04 00 00 00 00 00 00 00 00 00 14 05 04 00 00 00 0f 58 14 10 00 00 00 01 60 50 40 +00 00 00 00 05 80 fe bd 50 00 00 00 03 fa f5 40 00 38 00 00 00 00 00 00 02 7a f5 40 00 00 00 0b eb d5 00 00 00 00 25 af 54 00 +00 02 00 00 00 0d 3d c9 00 00 00 00 34 f7 24 00 20 00 00 00 00 00 00 00 34 87 24 00 00 00 80 d0 14 10 00 00 00 03 49 72 40 +00 00 00 00 00 00 06 ec 50 00 00 00 00 1b b1 40 00 00 00 00 00 00 00 00 00 1b b1 40 00 00 70 03 6b d5 00 00 00 00 01 ab 14 00 +00 00 00 00 10 0f c1 41 00 00 00 40 3f 05 04 00 00 00 00 00 00 00 00 40 3d 05 04 00 00 01 00 fc 14 10 00 00 04 03 f0 50 40 +00 00 20 00 09 98 7a bd 50 00 00 26 61 ea f5 40 00 00 00 00 00 00 00 26 60 6a f5 40 00 00 99 83 ab d5 00 00 02 66 04 af 54 00 +00 00 00 00 10 07 7d c9 00 00 00 40 1d f7 24 00 00 00 00 00 00 00 00 40 1d 87 24 00 00 01 00 74 14 10 00 00 04 01 d9 72 40 +00 00 00 00 08 18 03 ec 50 00 00 20 60 0f b1 40 00 00 00 00 00 00 0c 20 60 0f b1 40 00 00 81 83 3b d5 00 00 02 06 00 eb 14 00 +00 00 00 00 00 05 81 41 00 00 00 04 16 05 04 00 00 00 00 00 00 00 01 c4 14 05 04 00 00 00 00 58 14 10 00 00 00 01 60 50 40 +00 00 01 80 00 00 7b bd 50 06 00 00 29 ee f5 40 00 00 00 00 00 06 00 20 28 6e f5 40 18 00 01 a3 bb d5 00 60 00 02 84 ef 54 00 +00 00 00 00 00 0f 03 d5 00 00 00 00 3d 0f 54 00 00 00 00 00 00 00 00 10 05 0f 54 00 00 00 00 b8 28 10 00 00 00 22 50 f5 40 +00 00 00 00 00 00 d7 28 10 00 00 00 03 58 a0 40 00 10 00 00 00 00 00 00 03 58 a0 40 00 00 00 09 ab d5 00 00 00 00 15 8a 04 00 +00 00 30 00 50 8b 83 e9 00 c0 02 42 3d e7 24 00 00 00 00 00 00 44 00 43 3e 01 24 01 00 00 08 b8 3d 50 04 00 00 23 70 50 40 +00 00 01 00 08 01 9e 28 10 44 00 06 06 1b b1 40 00 00 00 00 00 04 80 20 03 68 84 40 30 00 00 15 e2 81 00 c0 00 00 2f af 54 00 +00 00 00 00 00 89 83 d5 00 00 00 02 05 05 04 00 00 00 00 00 00 00 00 40 2e 01 24 00 00 00 18 5c 14 10 00 00 00 21 5d 72 40 +00 00 00 00 01 9b ff a8 14 00 00 06 67 fe f5 40 00 00 00 00 00 00 00 26 03 68 84 c0 00 00 18 fb 7b d5 20 00 00 00 61 bb 14 00 +00 00 00 00 00 03 c3 e9 00 00 00 00 1d 0f 54 00 00 00 00 00 00 00 08 03 3c 01 24 00 00 0f 00 58 14 10 00 00 1c 39 60 50 40 +00 00 00 00 01 98 9b a8 10 00 00 00 03 ea a0 40 00 03 00 00 00 00 01 40 03 68 84 c0 00 00 00 0f 6b d5 00 00 06 00 6f af 54 00 +00 02 09 00 00 00 26 c5 00 20 00 00 1c 05 04 00 00 00 00 00 00 20 00 00 2c 01 24 10 80 00 10 d8 14 10 02 00 00 00 2d b1 40 +00 00 00 28 00 00 3e ec 50 00 00 00 03 fa f5 40 02 80 00 00 00 00 00 40 03 e8 84 c0 00 00 00 e3 6b d5 00 00 00 00 05 bb 14 00 +12 00 00 00 10 0f c1 41 00 00 00 40 3d e7 24 00 01 80 00 00 00 00 1c 02 3e 01 24 80 01 01 00 fc 14 10 00 00 04 23 e9 42 40 +00 00 00 00 09 00 1a bd 50 00 00 6e 60 0f b1 40 00 00 00 00 00 00 00 06 67 48 84 c0 00 00 99 87 2b d5 00 00 02 66 4e 0e 74 00 +80 00 00 00 10 07 65 c9 00 00 a0 00 1d 05 04 00 20 40 00 00 00 40 00 02 2e 01 24 00 00 01 00 7c 14 10 00 04 04 42 d0 a0 40 +40 00 00 00 08 18 03 ec 50 00 00 00 69 ee f5 40 00 28 00 00 00 04 00 00 67 48 84 c8 00 00 81 83 3b d5 00 00 02 07 34 ef 54 00 +80 00 00 00 31 c5 81 41 00 00 61 44 00 eb 14 00 00 00 00 00 00 00 01 c0 3c 01 24 00 00 03 00 58 14 10 00 00 02 00 40 5a 40 +00 00 01 80 00 0b 1b bd 50 06 00 20 28 4f b1 40 00 00 00 00 00 06 00 20 03 c8 84 c0 18 00 00 07 3b d5 00 60 00 40 20 0a 54 00 +10 02 00 00 00 09 43 d5 00 00 00 40 05 0f a4 00 04 00 00 00 00 10 00 03 2c 01 24 20 00 00 00 d8 14 10 00 00 00 03 50 f5 40 +00 00 04 00 00 00 d6 28 10 00 00 20 01 f8 a0 40 00 00 00 00 00 00 00 00 07 c8 84 c0 00 00 00 0b 2b d5 00 00 00 66 05 ea 04 00 +00 00 10 00 10 0d 03 9d 00 c0 00 00 02 07 80 80 00 00 00 00 00 00 00 00 27 af 70 82 00 05 00 33 ff c0 48 00 00 25 58 ff 08 +00 00 03 00 09 80 97 bb d0 8c 00 04 01 78 78 02 00 00 00 00 00 00 00 00 03 c9 e7 00 30 00 80 03 eb dc 02 c0 00 00 77 cf 70 00 +00 00 00 00 00 01 82 84 00 00 00 42 2e 09 c0 00 10 00 00 00 00 0a 00 20 27 0f f0 80 88 01 88 58 3f c2 02 00 02 22 d0 55 c8 +00 00 00 00 00 00 5a a0 40 80 00 26 24 ea 93 02 80 00 00 00 00 00 40 16 68 7c f7 02 01 00 90 1f 7b d4 00 0a 00 46 6f ea 56 00 +00 00 00 00 10 85 80 3c 00 00 00 00 05 00 a0 00 00 00 00 00 00 00 00 22 81 0f 50 00 00 05 00 58 3e b0 00 00 00 20 ef 58 40 +00 00 00 00 00 01 b6 3c 00 00 00 00 72 4c a0 00 00 00 00 00 00 00 00 0e 6c 6e f5 00 00 00 80 09 ea 81 00 00 00 60 74 ee 54 00 +00 02 08 00 f0 db 40 3c 40 20 00 02 2c 0f 00 80 00 00 00 00 00 20 14 04 3e df f0 10 80 00 00 76 29 90 00 00 00 23 e0 fa c0 +00 00 00 00 09 00 12 bc 00 00 00 00 04 6a 0f 00 00 00 00 00 00 00 00 8e 71 5b f7 00 00 00 58 05 ea 95 00 00 00 00 5f aa 04 00 +00 00 00 00 50 e3 6c 75 02 00 00 04 01 0f 50 00 00 00 00 00 00 20 03 e4 03 0f 50 00 81 01 19 1c 3e b0 02 00 04 03 eb b5 40 +00 00 20 00 00 00 7f 46 90 00 00 00 70 4c f5 00 00 00 00 00 00 00 00 14 28 7a f5 00 00 00 99 91 aa 81 20 00 03 60 1c ea 14 00 +00 00 34 00 10 ab 78 31 00 00 00 c0 1d f7 24 80 00 00 00 00 00 00 00 23 95 00 10 08 00 09 00 94 3d 70 00 00 04 28 30 55 c0 +00 00 01 40 08 0e fe d7 90 00 00 20 00 0e b1 40 00 00 00 00 00 00 00 14 2e e8 00 22 00 38 81 8f 3a 81 00 00 02 62 9d e5 54 00 +00 00 00 00 70 0d 60 31 00 00 00 44 1e 05 04 00 00 00 00 00 00 00 03 c6 ec 80 00 02 00 00 0a 1a 9e 90 08 06 00 01 4f d8 d8 +00 00 01 80 00 00 ff 17 90 06 00 3c 29 ce f5 40 00 00 00 00 00 00 00 14 60 4a 80 00 28 00 00 05 ba 85 00 a0 01 40 00 be 44 00 +00 00 00 00 50 03 00 00 00 00 00 c0 3d 0f 54 00 00 00 00 00 00 00 03 42 74 ef f0 80 00 09 00 72 d9 50 00 00 00 01 cd 70 40 +00 00 00 00 05 00 13 28 00 00 00 20 01 d8 a0 40 00 00 00 00 00 00 00 1c 64 d8 f7 00 00 00 98 07 2e 95 00 00 00 60 06 af 14 00 +00 00 00 00 00 00 00 00 00 40 00 40 26 81 e0 00 00 00 00 00 00 40 00 02 c0 00 00 02 00 05 00 04 39 32 08 00 00 00 d0 0a 00 +04 00 00 00 05 80 00 00 00 0c 00 26 00 ff d2 00 00 00 00 00 00 04 00 00 04 00 00 00 30 00 80 01 6b 91 08 c0 00 00 00 80 50 00 +80 00 00 00 50 80 00 00 00 10 00 04 26 a8 54 00 00 00 00 00 00 00 00 40 00 00 00 00 00 55 0e b3 bf c4 00 00 00 02 40 fa 00 +00 00 00 00 0d 80 00 00 00 01 00 06 7b 7f 47 40 00 00 00 00 00 00 00 20 00 00 00 00 00 02 d8 11 3b dc 00 00 00 00 00 cf 50 00 +08 00 00 00 00 a9 b3 30 00 00 00 c2 2f 02 e4 00 28 00 00 00 00 00 00 02 fc 82 14 00 00 00 00 0c 28 02 00 00 00 00 0c c0 00 +04 40 00 00 00 01 52 0c c0 00 00 20 77 58 25 43 01 00 00 00 00 00 00 00 06 49 84 40 00 00 00 05 a2 80 00 00 00 00 00 cc 00 00 +00 36 00 00 00 00 ba 58 02 00 00 02 67 00 30 00 00 00 00 00 00 00 00 00 34 dd e4 10 00 00 0a d2 46 00 21 00 04 00 c0 fa 00 +00 00 00 00 05 80 12 25 a0 00 00 00 65 7c 43 02 00 30 00 00 00 00 00 06 03 69 b7 c0 00 00 00 08 00 90 00 10 02 60 00 cf 50 00 +00 00 00 00 01 00 3e 58 00 00 00 02 a5 0a a0 00 00 00 00 00 00 00 00 44 16 91 24 00 00 00 08 d4 14 30 20 00 00 00 0c fc 00 +00 00 10 00 00 0a 72 25 a0 00 00 14 01 cc 33 22 00 00 00 00 00 00 00 20 20 e8 84 c0 00 00 01 98 2a 81 00 00 00 00 00 cf c0 00 +00 00 00 00 00 b0 b6 58 00 c0 00 00 1d d0 f0 00 00 00 00 00 00 40 01 c2 06 d1 24 10 00 00 00 9c 14 30 0c 40 00 00 c0 f5 00 +00 00 00 00 00 0a 52 65 a0 0c 00 00 2a 69 87 00 00 00 00 00 00 04 00 00 05 49 84 c0 00 00 01 85 bb d5 01 4a 00 07 00 cf a0 00 +80 00 00 00 00 00 22 58 00 00 03 63 dd 0f a4 00 00 00 00 00 00 10 02 40 16 c1 24 02 00 00 00 12 df 90 08 00 00 00 d0 55 c0 +00 00 00 00 00 00 7a 25 a0 06 00 14 07 78 a0 40 00 00 00 00 00 06 00 06 00 e8 84 c1 28 00 00 00 06 f5 00 a0 00 00 00 8a a4 00 +80 02 00 00 08 00 2e 58 00 00 00 06 96 8f e4 10 04 00 00 00 00 00 41 c3 c4 01 24 24 00 01 08 17 56 10 00 00 00 2e 4c c3 c0 +00 00 00 00 05 0a 70 65 a0 00 00 00 2a df fc 40 00 00 00 00 00 02 00 00 65 c8 84 c0 00 00 98 17 bb 95 00 00 00 00 0c 09 94 00 +00 00 10 00 10 07 02 20 00 c0 00 20 36 89 30 00 00 00 00 00 00 c0 00 07 4d f8 50 03 00 0f 80 d6 79 40 0c 00 00 00 cc d0 00 +00 00 03 00 00 0a de 2e c0 cc 00 04 00 dc 6c 00 00 00 00 00 00 0c 00 1c 26 fd a5 01 30 00 90 01 66 f0 00 c0 01 c0 35 ad 50 00 +00 00 00 00 00 00 43 84 00 0a 02 c2 75 c0 f0 00 00 00 00 00 00 00 20 00 00 0f 04 00 00 00 80 5e 7f c0 40 00 06 21 4a 98 10 +00 00 00 00 00 0e 5a 38 40 c0 0c 20 05 d8 69 00 00 00 00 00 00 00 00 00 00 18 f0 41 00 00 10 09 af dc 00 00 02 e0 3d ae 50 00 +00 00 00 00 90 90 43 84 00 00 01 e0 36 0c c0 00 00 00 00 00 00 00 02 c2 00 0f 06 18 00 00 09 04 3c c0 00 00 1c 03 7c d3 60 +00 00 00 00 01 9a 52 38 40 80 00 0e 01 4a 33 03 00 00 00 00 00 00 00 3e 04 18 f0 60 80 00 00 00 63 cc 08 00 02 60 26 98 34 00 +00 02 00 00 00 00 40 3c 00 00 22 c2 4d 05 f0 00 00 00 00 00 00 00 00 40 01 0f 04 00 00 00 09 9e bf c0 00 a1 00 34 59 95 40 +00 00 00 00 00 18 03 03 c0 00 00 00 06 4e 50 00 00 00 00 00 00 00 00 26 00 08 f0 40 00 00 00 01 ef ec 00 00 e8 60 16 ba 54 10 +00 00 00 00 18 01 79 11 01 00 00 00 1d 00 f0 00 00 00 00 00 00 00 20 00 01 0f 04 00 00 01 1a 06 79 40 00 00 06 23 5f 70 40 +00 00 20 00 0d 00 9e 6e d8 20 00 00 00 ca f0 00 00 00 00 00 00 00 00 00 78 1e f0 40 00 00 f9 95 a7 94 00 00 02 e0 26 af 14 04 +00 00 30 00 08 01 c1 dc 00 00 00 02 f4 c6 f0 00 00 00 00 00 00 00 00 00 00 0f 04 01 00 50 0b d0 36 c8 00 00 02 24 7c 43 50 +00 00 03 00 05 18 b7 11 00 80 00 16 68 0e 9f 00 00 00 00 00 00 00 20 00 00 0c f0 48 30 02 01 8d fb dc 08 00 00 e6 1c 9e 34 80 +00 00 00 00 18 85 c1 68 00 00 00 04 01 00 f4 00 00 00 00 00 00 00 00 40 00 0f 04 00 28 00 19 d2 40 00 0a 00 1c 3b fb e5 40 +00 00 01 80 0d 01 ff 3c 00 06 00 00 28 0a 0f 41 00 00 00 00 00 06 00 26 00 0c f0 40 19 00 00 b5 bc 40 00 a0 02 00 0c 98 55 08 +04 00 00 00 01 bd 80 3c 01 00 00 20 00 0f 04 00 00 00 00 00 00 00 00 00 34 05 a4 00 00 05 0b b6 e8 10 00 00 0c 62 68 f0 60 +00 00 00 00 00 0a 17 3c 00 08 00 14 00 1c f0 40 00 00 00 00 00 00 40 00 62 00 a5 40 00 00 00 0f ea 01 24 00 e2 07 9c ed 14 00 +00 00 10 00 00 8f 41 41 00 c0 02 63 dd be 50 90 00 00 00 00 00 c0 01 c0 1f 0a 04 00 0b 10 8b 30 36 40 28 00 80 22 c9 d1 00 +04 00 01 00 00 01 b6 bd 50 24 00 1c 03 cb a5 00 40 00 00 00 00 04 00 20 60 7e 05 60 01 02 10 01 33 04 08 c0 04 07 45 ba 10 00 +80 00 00 00 50 85 71 c9 00 10 00 00 01 0f 04 00 00 00 00 00 00 00 02 63 d5 c1 d0 00 00 00 0f 16 b8 00 00 00 00 03 c0 5a c0 +00 00 00 00 00 01 87 ac 50 01 00 06 00 1c f0 40 00 30 00 00 00 00 40 1c 3c da 25 01 00 00 00 11 af 54 00 00 31 e0 20 0a 54 00 +0c 30 00 00 00 05 01 41 00 00 00 02 14 ff f0 00 00 20 00 00 00 0a 02 40 0e 8a 10 00 02 07 9d d8 00 00 00 00 fc 22 40 a5 00 +04 40 00 00 00 00 b6 bd 50 00 00 00 27 df f7 28 00 01 00 00 00 00 48 14 03 eb e2 08 00 00 b0 bb f9 00 08 00 c8 60 5d c5 00 00 +00 02 04 00 f0 0d 31 c9 00 00 e8 42 1d 00 10 00 00 20 00 00 00 80 03 c2 41 00 f0 80 20 0b 0f b8 09 00 08 00 02 01 50 00 20 +80 00 00 40 00 00 06 ac 50 00 01 20 05 fa 00 03 00 00 00 00 00 0c 00 36 00 0e 0f 01 00 00 f8 f7 a9 40 08 c0 40 e7 a7 e0 50 98 +00 00 00 00 10 0f 41 41 00 00 0b e3 fc af 00 00 00 00 00 00 00 00 10 32 dc f2 40 00 00 80 9f b0 3e 80 00 01 00 43 c0 a0 00 +01 00 10 00 09 98 32 bd 50 00 00 7c 03 ed e0 00 00 00 00 00 00 00 00 9e 00 00 18 00 80 00 78 a0 73 d4 00 00 01 63 a7 a0 00 1c +00 00 00 08 10 03 42 81 01 00 08 00 2c 05 a4 00 00 00 00 00 00 40 62 c0 3c 05 20 00 00 41 0a 0c 3d 40 40 00 00 01 50 f5 01 +c2 00 00 00 08 18 53 bd 50 00 00 00 62 00 a5 40 00 00 00 00 00 04 02 06 00 ea d1 03 00 00 80 07 33 d4 00 00 00 06 a1 ef a1 04 +98 00 00 00 30 00 43 c1 00 00 60 00 03 05 04 00 00 00 00 00 00 00 08 03 75 05 a0 00 08 00 00 b7 3f c0 08 00 2c 40 10 03 00 +00 00 05 80 08 00 02 3c 10 06 80 00 00 dc 50 68 00 00 00 00 00 06 06 04 02 ec ad 02 00 30 78 03 ef dc 00 a0 c0 43 01 c0 32 20 +12 02 00 00 f0 d1 03 d5 00 10 00 00 34 ed b4 08 04 00 00 00 00 00 14 03 dd 0f f0 00 00 85 00 3c 00 00 00 02 04 43 4b 20 00 +00 07 00 00 01 81 13 a8 10 01 00 00 00 00 e7 60 80 00 00 00 00 00 00 80 01 fa af 00 00 00 00 0b 71 40 00 80 02 07 8d d0 00 00 +00 00 +11 02 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 00 00 80 00 00 00 00 00 02 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 00 00 80 00 00 00 00 00 03 00 00 00 +00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 a0 25 be 00 40 00 00 3f cf e7 80 00 00 00 00 00 00 00 c1 a9 e5 81 81 00 42 04 0a 72 1e 04 00 00 02 80 d8 00 e0 80 +00 00 00 02 00 97 44 3e 80 00 42 bc 1e 98 00 00 00 00 00 00 08 00 2a 6d 6d 00 c0 00 01 00 a0 40 22 c0 00 04 28 02 00 00 00 00 +00 00 00 82 03 a4 00 60 04 16 08 16 c3 00 80 00 00 00 00 00 00 00 02 9c 18 19 00 10 00 f5 38 00 20 30 00 00 00 00 39 ca 00 +00 00 00 08 00 fe 80 3d 00 48 40 80 00 08 00 00 00 00 00 00 04 00 00 14 2c 50 a0 01 20 0f a0 b8 04 00 00 00 00 00 00 90 40 00 +00 00 00 2a 50 00 60 00 00 41 00 1d d0 00 00 00 00 00 00 00 40 10 20 55 d5 81 00 08 00 09 1b de 00 00 00 02 bd 58 50 00 00 +00 00 00 02 5a 02 c0 00 00 02 00 06 6d 00 08 00 00 00 00 00 00 00 01 28 18 00 80 00 c0 00 0d 34 e0 00 00 00 01 41 c3 8c 00 00 +00 02 00 21 f5 68 60 00 00 00 10 ce 90 0f 00 80 00 00 00 00 00 10 11 dd b5 8c 00 00 00 ff 32 00 3a 00 01 02 2d 7e 00 a0 00 +01 00 00 02 0f 7f c0 2d 00 00 01 a2 fc 00 d0 10 00 00 00 00 00 00 02 14 3f 00 00 00 00 4a f0 2c 04 10 00 20 02 80 d0 10 00 00 +00 00 00 68 05 be 00 00 00 10 33 c5 a1 01 00 00 00 00 00 00 20 00 30 9f e8 00 00 00 90 05 70 60 00 00 00 10 29 4c 38 00 00 +00 00 20 02 00 b2 cc 00 00 00 03 fc 2e 00 a0 00 00 00 00 00 00 00 03 01 ec d0 e0 00 00 00 a0 34 43 c0 00 00 02 81 00 0b 00 00 +00 00 09 0e f5 a2 00 00 00 00 10 ce e8 0e 00 80 00 00 00 00 00 10 00 07 f3 9c 00 02 04 af 3e a4 00 00 00 00 00 00 00 00 00 +00 00 00 00 ff 7f cc 00 02 00 02 4e ee b0 00 10 00 00 00 00 00 00 01 28 3c 08 00 00 00 0a f0 80 e0 00 00 00 00 00 00 00 10 00 +00 00 00 00 00 02 00 68 00 10 18 dd 91 0f 00 00 00 00 00 00 00 00 3b cf d7 08 00 00 00 04 93 c0 00 00 00 02 bd 48 00 00 00 +00 00 00 00 00 00 0c 31 00 00 02 8c 1d 18 d0 14 00 00 00 00 00 04 02 fd d8 08 00 00 28 00 05 b4 02 40 00 00 01 42 c0 00 00 00 +00 00 08 21 75 80 00 00 02 30 39 ce e8 00 00 00 00 00 00 28 10 00 00 00 03 88 00 0c 40 ef 7b 40 20 00 05 02 2d 5e 00 e0 02 +00 00 00 03 2b fb 80 00 40 20 03 7c 39 b0 01 00 00 00 00 00 02 00 00 00 00 f9 90 00 c0 0f f0 74 00 00 00 00 02 82 d0 00 00 20 +00 00 10 ac 75 a4 02 c0 00 00 5a 45 80 00 00 80 00 00 00 00 00 80 3b f5 a0 00 00 00 00 47 76 c0 06 01 00 0a 94 ea 81 8a 04 +00 00 00 1a c2 12 00 60 00 09 01 a4 10 00 00 84 00 00 00 00 00 00 23 ff 48 90 e0 00 00 08 11 a4 03 40 20 00 a9 a6 fd 0f 40 80 +00 00 10 28 51 bc 02 c0 55 00 48 44 c5 00 00 00 00 00 00 00 50 02 3f c0 08 00 01 58 40 47 58 2c 20 30 00 09 1d e9 80 18 01 +40 00 00 9a ad 12 80 7c 02 40 11 20 0d 08 a0 04 00 00 00 00 00 00 13 fc 00 10 00 00 08 08 b0 3b c7 00 02 04 b0 c7 d1 0a 40 10 +00 00 00 aa 51 bd 42 80 00 00 48 45 f7 8a 00 00 00 00 00 00 00 10 b0 c0 00 00 00 00 00 af 56 5e 05 00 00 0a 95 4e 10 10 00 +00 00 00 82 95 56 02 40 00 02 01 20 08 09 00 00 00 00 00 00 00 00 6b 0c 00 00 a0 00 00 00 50 60 23 08 00 00 aa 83 f1 88 1c 00 +00 02 00 6a 71 bc 67 80 00 00 5a 45 e0 00 00 00 00 00 00 00 00 00 00 16 97 00 4c 00 08 0a 38 60 60 05 80 0a bd 68 11 b4 00 +00 00 00 06 25 16 34 2c 00 02 01 a4 10 00 b0 00 00 00 00 00 30 00 02 80 2a 00 98 00 00 00 50 ab c3 90 28 04 82 80 f0 88 00 00 +00 00 00 20 57 f0 00 40 00 00 48 45 a3 9f 80 00 00 00 00 00 20 90 00 15 e8 08 80 20 04 0a 56 80 02 00 00 0a 95 5b 00 00 00 +00 00 20 03 5f 06 00 30 70 00 01 20 0b 08 d4 00 00 00 00 00 05 08 00 04 1d 71 00 02 00 00 a0 00 c0 00 00 00 aa 82 f0 0e 00 00 +00 00 11 2a 71 ac e6 00 40 00 48 44 a0 00 b4 80 00 00 00 00 00 05 00 06 80 00 14 00 00 af 53 c0 79 00 00 0a bc 69 10 08 08 +00 00 00 02 1a 17 00 00 00 00 01 20 0c 00 05 10 00 00 00 00 50 00 00 10 ea 00 90 00 00 00 50 a3 c0 08 00 02 82 80 a0 89 4d 00 +00 00 08 6a 55 fe 66 00 00 00 08 45 e0 1e 00 00 00 00 00 00 00 80 00 17 f0 00 00 80 10 a0 5f 20 28 00 02 0a 04 1f 90 00 00 +00 00 00 92 95 5e 04 00 00 08 01 20 1e 00 00 04 00 00 00 00 00 00 12 80 1b 00 00 00 00 0a 00 00 46 00 00 00 b6 fc 91 80 00 40 +00 00 10 aa 71 ee 00 40 22 00 00 00 01 00 50 00 00 00 00 11 00 52 00 04 80 00 00 0c 80 9d fb 5c 00 00 00 02 ad 5b f0 04 00 +c0 00 00 1a 25 16 c4 20 41 b0 00 00 00 78 e2 08 00 00 00 02 00 0a 00 04 2a 90 00 00 80 0a dd e0 00 00 00 20 02 d7 f1 8f bc 08 +00 00 01 25 53 00 00 40 00 00 03 2e a0 01 00 00 00 00 00 02 00 40 91 dd 90 19 00 00 0e 8d b0 40 70 00 00 09 1d fa 18 10 00 +00 00 00 03 aa 02 00 20 00 00 41 39 78 10 e0 00 00 00 00 00 38 00 0b 0c 69 00 80 00 20 24 e1 ae 46 01 00 80 b0 c4 e0 08 80 00 +00 00 01 25 a0 00 00 0a 05 00 a2 f4 00 0a 00 14 00 00 00 00 00 40 b1 ce a7 8e 00 54 00 f0 18 06 38 60 48 09 1d ef 00 10 01 +40 00 00 03 a5 03 1c 00 61 50 69 1c 6f 00 b0 01 00 00 00 00 00 00 0b 08 4f 78 a0 09 00 8f 00 03 c7 c0 04 00 b0 cc a9 08 00 10 +00 00 00 00 0b 68 00 00 00 00 01 fe b1 88 00 08 00 00 00 00 00 01 89 47 b1 0e 20 80 00 af 3a 00 00 80 00 1a 3d db 00 81 12 +00 00 00 80 02 92 00 00 00 00 00 3d 58 d9 00 00 80 00 00 00 82 00 0a 9d 6c 00 00 10 08 00 a0 24 00 10 00 20 83 9e d0 00 00 80 +00 02 01 0a f1 a0 00 04 20 10 10 9f d0 08 01 00 00 00 00 02 00 00 01 5c f0 09 10 40 00 00 00 16 72 00 00 09 1c 6f 18 01 14 +00 00 00 00 af 08 1c 28 00 00 00 28 1d 01 a0 00 00 00 00 00 00 00 02 bc 1e 01 f0 00 00 00 00 02 40 11 20 20 b0 e6 a0 08 10 00 +00 00 00 00 55 80 06 00 00 15 a1 56 e7 01 00 00 00 00 00 00 00 30 22 ce c0 0b 00 00 00 af 76 5c 04 00 04 19 1e da 79 90 00 +00 00 20 00 0a 0a 00 30 00 0c 7b 7c 1a 58 c0 00 00 00 00 00 00 00 03 6c 2b f1 c0 00 00 00 a0 31 63 40 20 00 b0 c6 e0 8c 00 00 +00 00 00 0f 51 a0 e3 80 20 00 11 a7 a1 80 00 00 00 00 00 00 20 40 ab df 97 80 00 00 40 ab 1b 56 78 77 00 48 97 4f 11 8a 08 +00 00 00 00 f5 08 02 70 05 00 03 09 cb 10 e0 00 00 00 00 00 01 00 08 28 09 00 f0 00 00 00 b0 f4 06 68 30 01 96 d4 c9 8c 15 40 +00 00 00 05 f5 80 03 80 00 10 02 8e d0 0e 00 00 00 00 00 00 00 00 01 57 ef 98 00 00 c0 83 5e 00 04 05 02 0a 3d fb 80 80 00 +00 00 00 00 af 0a 00 40 00 00 00 04 3d 10 00 00 00 00 00 00 00 00 00 14 00 f0 00 40 00 06 70 f4 03 80 00 00 83 9e f1 30 10 00 +00 00 08 0a bb 7c 06 84 03 34 82 9c c0 19 40 0c 00 00 00 00 50 10 22 cc a0 18 00 88 00 83 b7 c0 72 85 20 0a bd 7f f1 f0 00 +c0 00 00 00 0b 33 40 40 00 22 58 74 1f 00 8a 00 80 00 00 00 02 00 01 08 3c 00 c0 00 c0 00 1f 23 c4 10 23 00 81 42 d1 1e 00 08 +08 00 00 80 55 3a 00 00 00 00 28 1d 99 00 00 00 00 00 00 02 20 00 00 15 d0 01 00 00 00 e7 1a 60 6c 82 00 01 1d dc 80 00 01 +00 00 00 00 af 0a 54 00 00 00 00 00 1c 10 e0 00 00 00 00 00 00 00 60 10 d9 00 80 00 20 0e f7 be c6 c0 50 00 20 66 b5 0c 00 00 +00 00 00 04 29 a5 c0 40 00 10 38 06 95 00 08 10 00 00 00 00 20 87 2b c6 c8 00 1c 01 00 a0 76 76 78 00 01 01 1d 61 00 0a 02 +00 00 00 00 84 97 80 28 02 00 01 00 3c 30 a0 05 00 00 00 00 01 00 02 bc 20 70 00 00 28 00 00 67 44 00 50 80 22 c0 f0 00 00 00 +00 00 04 04 a3 e8 07 00 40 15 a1 57 f0 00 00 0c 00 00 00 00 00 91 03 0c b1 00 20 00 40 89 76 e0 00 01 00 02 bd 4e 71 c0 00 +00 00 00 00 a5 02 9c 40 00 08 4b bc 0b 00 00 00 c0 00 00 00 40 02 00 70 0e 08 f1 00 00 04 a0 f0 c3 80 00 00 01 42 a7 90 00 00 +00 02 00 8a 01 70 00 42 00 01 81 5f b1 1f 40 80 00 00 00 00 00 10 09 cf a9 8a ac 00 40 05 13 20 00 00 00 10 92 00 01 90 04 +00 00 00 00 a0 08 00 20 20 00 69 7c 1d 00 d0 00 00 00 00 00 50 00 00 9c 00 51 04 08 00 0e 70 ad c0 03 00 00 06 0c e5 0f 00 80 +00 00 04 04 73 e4 00 00 40 05 a1 5e 90 01 00 00 00 00 00 28 00 10 01 5f e8 0e 40 00 40 83 77 20 78 00 00 10 29 5c 00 12 00 +00 00 20 00 05 0e 1c 00 00 02 4b bc fb 00 d0 00 00 00 00 00 00 00 03 6c 28 10 fa 01 00 06 70 75 47 c6 00 00 02 82 0b 0d 00 00 +00 00 00 03 09 a6 67 c0 50 00 06 87 df 99 00 00 00 00 00 08 00 10 22 57 f3 0b 01 c1 40 07 3a 6c 04 00 00 02 bc e9 01 d8 00 +00 00 00 00 50 97 8e 64 00 00 02 75 c9 f8 80 00 00 00 00 01 00 00 03 1c 3e 09 e0 08 00 00 10 a0 63 87 00 00 02 80 b0 1d 40 00 +00 00 04 08 03 f0 00 06 00 00 04 66 f9 00 00 00 00 00 00 00 00 10 00 d6 00 00 20 01 00 cf 1b 00 69 00 04 01 01 60 80 10 00 +00 00 00 00 d0 07 40 34 00 00 00 0b fc 10 80 00 00 00 00 00 02 00 10 0c 20 00 04 00 20 0e fb 38 42 a8 00 80 20 2c c1 0f 00 00 +00 00 08 00 0b a4 00 42 00 12 00 c7 c9 08 01 48 00 00 00 00 10 00 2b d4 d7 8f 01 00 04 05 30 06 00 01 0a 00 29 48 00 00 00 +00 00 00 1c 02 9f 80 24 00 00 03 cc 1e 50 80 08 c0 00 00 00 06 00 00 28 3c b1 f0 08 10 00 a0 28 00 01 20 40 02 82 09 00 01 40 +00 00 00 a4 73 62 07 46 00 40 a3 d5 f8 18 01 c0 00 00 00 00 00 00 21 6d 8d 81 01 40 00 07 b2 9e 2c 00 04 0b 1d fb 19 e0 10 +00 00 00 02 c3 3f 44 3c 00 00 48 38 ce b0 f0 04 00 00 00 00 68 00 03 ab fe 78 f0 00 10 00 1d a3 62 42 00 00 b0 8d d0 1c 18 80 +00 00 00 a4 77 6b e0 50 04 00 91 d4 d7 99 40 90 00 00 00 01 00 00 23 ed 87 9b 18 00 00 47 b0 60 71 10 00 0a bd dd 71 e4 03 +00 00 00 02 c3 df ee a2 b0 40 2f 0c 4e 08 88 05 00 00 00 02 00 00 01 14 4d 31 e0 00 00 08 b5 23 c3 a8 00 00 81 41 d0 9f 20 14 +00 00 00 2a 5b 20 67 00 00 00 a3 dd e1 89 20 00 00 00 00 20 00 00 20 44 c7 8e 10 00 40 42 32 60 04 00 08 0a bd d8 f9 ef 48 +00 00 00 1a 59 72 4c 40 00 00 28 38 ef 01 8a 00 00 00 00 00 00 00 01 7e 7c 01 00 00 00 08 b0 6a 43 c0 00 00 82 81 e3 80 81 40 +00 02 00 68 f5 69 e6 17 50 02 a3 f4 d1 80 00 00 00 00 00 02 20 14 20 ce a0 01 80 01 40 81 1a 16 78 00 00 1a 95 5c 01 d4 00 +01 80 00 02 0e fe 02 00 82 00 0c 39 ec 00 00 00 00 00 00 00 41 00 01 9c 3d 00 f0 00 00 00 a0 37 43 c1 00 00 95 43 95 18 90 00 +00 00 08 6c 7b b2 c7 c0 00 04 91 ef 80 09 00 00 00 00 00 00 00 00 28 4c ef 00 40 00 00 05 18 0c 24 80 02 0a bd 69 00 18 00 +00 00 20 02 c2 13 9c 20 60 82 0b 0c 59 00 e0 00 00 00 00 00 04 00 01 5d 7c f0 ca c0 00 00 a0 24 07 d0 20 00 82 80 d0 08 40 00 +00 00 08 28 f5 ae 07 c0 50 44 91 f5 f0 08 10 80 00 00 00 10 20 10 20 cc e8 01 00 00 40 8b 3e 20 04 41 00 02 87 68 11 e0 00 +00 00 00 02 0d f2 44 7e 71 00 0b 0c 59 00 f0 00 00 00 00 00 05 00 01 9c 3d d0 f0 00 00 04 20 e3 c3 ce 20 00 15 cc b1 00 00 00 +00 00 00 2c 79 bf c3 00 20 00 a9 5d f9 00 0c 80 00 00 00 03 20 00 29 4d b7 18 00 80 00 47 da 40 00 62 01 02 0d 69 01 90 08 +00 00 00 82 c2 be 5c 00 04 00 1a a8 1e 18 80 10 00 00 00 00 04 00 41 54 29 f8 00 04 00 05 f3 a4 00 07 40 00 19 c1 a0 0d 00 00 +00 00 00 28 df 80 67 80 03 20 a3 f6 cf 88 00 0c 00 00 00 00 00 00 39 4e 97 80 21 40 40 05 7e 94 00 07 01 00 1d ff 58 c1 80 +80 00 00 8a 4e fb 7c 40 00 20 48 39 ec 19 c8 00 80 00 00 00 00 00 11 16 4a 08 00 40 00 0e 70 ac 20 00 30 00 2a c2 80 1e 10 08 +00 00 00 0a b3 34 06 28 00 40 b1 c6 e1 01 00 00 00 00 00 00 00 81 00 24 81 0a 18 80 0a c7 1a 7c 02 84 00 00 14 ce 51 c0 80 +00 00 00 00 0b d7 b4 35 00 00 4b 08 7c 00 80 c0 00 00 00 00 00 00 00 11 6e 09 00 10 00 2c 13 6c 43 d0 00 00 17 c0 80 8a 00 80 +00 00 04 08 35 a0 00 10 20 00 91 cd e3 80 00 94 00 00 00 00 00 80 39 e0 18 20 80 02 02 a5 da 00 24 80 55 03 6c f8 81 c8 04 +00 00 00 00 67 0f 40 3c 80 00 4b 0c df 00 00 01 40 00 00 00 00 00 03 6d cf f0 04 00 00 25 91 b0 06 10 05 00 22 c2 ab 1f 00 80 +00 00 00 0a b3 35 62 a2 00 00 91 c4 f1 bc 00 00 00 00 00 06 50 94 01 16 80 1f 00 10 02 47 36 66 00 20 00 10 14 4b 00 e0 00 +00 00 00 00 0b 16 80 01 00 02 0b 0e ef 00 81 c0 00 00 00 00 02 08 00 10 20 01 c0 00 00 ac 39 af c0 04 00 00 22 d6 80 0f 18 00 +00 02 04 08 33 2b e3 00 00 04 a3 d5 f1 99 50 80 00 00 00 00 00 40 01 55 b8 1c 8c 00 02 8f d6 ce 00 02 00 40 29 61 70 8a 1c +00 00 00 00 67 03 56 00 02 00 08 3b fb 90 80 00 00 00 00 02 00 00 01 7c 0c f1 00 00 08 20 e1 e8 03 a8 40 00 01 40 80 00 20 00 +00 00 04 0a 37 a0 e7 40 00 24 a3 d7 98 18 00 00 00 00 00 00 00 80 28 0d f0 08 04 00 02 a5 d6 dc 64 00 00 02 95 4d 59 e0 00 +00 00 20 00 a3 00 02 70 00 00 08 39 5c 10 90 00 00 00 00 00 00 00 41 68 1f 01 00 00 00 25 9d a0 02 28 00 00 15 41 90 80 00 00 +00 00 05 0c 03 e4 00 68 50 01 a3 f6 b8 00 08 00 00 00 00 02 00 00 24 3f b0 1c 1c 00 00 05 56 44 05 71 03 02 2d c0 80 00 16 +00 00 00 00 ca 02 c0 38 01 00 18 3a 4b 70 81 80 00 00 00 00 05 00 01 41 ef 01 00 00 08 0a f0 b4 03 60 20 00 11 c2 ef 00 00 00 +00 00 10 02 75 81 c0 07 00 00 ab df b0 0e 00 00 00 00 00 07 00 10 30 0d f0 18 00 00 00 05 37 00 20 00 00 02 95 49 78 0a 80 +00 00 00 00 1b fa 40 00 00 00 08 14 3d 90 f0 00 00 00 00 00 00 02 03 28 0a 00 00 00 00 00 50 40 04 00 00 00 15 40 b0 08 00 00 +00 00 00 00 00 00 03 b0 20 01 a3 f6 af 1c 00 0c 00 00 00 00 00 80 01 1f 8d 80 80 82 00 05 30 40 00 50 31 02 2d e0 01 a0 00 +00 00 00 00 00 00 00 3e b0 00 08 3a 6a 19 00 00 c0 00 00 00 00 00 10 00 fa 38 81 04 00 00 a0 34 00 02 02 00 11 c0 e0 10 a0 00 +00 00 00 2e 37 e4 e6 40 00 00 22 5d e7 01 00 00 00 00 00 10 00 40 11 1e d7 1f 18 01 00 01 3a dc 00 00 00 49 1d 7e 81 91 c0 +00 00 00 0a 43 16 ae a0 80 80 03 2c fb 08 80 00 00 00 00 02 ec 00 01 20 4c 01 c0 00 00 08 37 a8 00 30 00 40 b0 c6 c1 08 14 00 +00 00 00 2c 35 77 e0 00 75 00 29 e7 d0 00 00 80 00 00 00 00 40 00 28 0e 10 00 80 80 00 af 56 40 24 04 04 0b 1c d9 00 14 01 +40 00 00 82 8b 12 46 bd 05 40 00 67 ce 90 90 00 00 00 00 00 02 00 01 40 0e 00 00 d0 00 00 50 a8 07 01 20 00 b0 45 e9 08 21 14 +00 00 00 22 ff 61 c7 05 00 10 28 df b3 8a 00 00 00 00 00 00 00 14 30 44 c7 00 00 00 40 01 56 ae 24 40 00 0b 1c ff 01 80 00 +00 00 00 02 0b 3e c0 00 00 00 02 4c 3d 10 0a 00 00 00 00 00 00 00 02 00 28 00 d0 00 00 0a 70 3a c2 80 00 00 b0 a6 90 00 00 00 +00 02 00 ec 3f f6 03 80 00 10 31 4c 80 0f 00 00 00 00 00 0a 00 00 01 4e 80 00 00 80 40 c5 5f 86 76 07 00 00 14 4b 01 8a 00 +00 00 00 02 8b d2 7c 02 00 00 03 14 20 f1 d0 00 00 00 00 00 00 00 01 7c 28 00 09 50 00 0c 50 40 03 90 30 00 2b c2 c1 00 40 00 +00 00 00 2c 33 a4 e0 00 00 14 30 16 cb 80 00 00 00 00 00 00 00 02 29 7e 89 08 00 00 40 ab 53 b6 00 00 00 0a 97 ed 00 80 08 +00 00 22 82 47 77 7c 3c 70 00 03 14 1e 78 e0 14 00 00 00 00 04 00 00 84 d8 78 c0 00 00 00 70 aa c0 00 08 80 96 7c 80 08 00 00 +00 00 01 20 d9 74 66 f8 20 00 22 cf 88 01 08 00 00 00 00 20 20 00 01 4c 80 01 00 00 40 89 5a 84 00 01 00 0a 3f 7f b8 e0 00 +00 00 00 02 4f 9b 3c 7d 80 02 02 2e f0 50 d0 00 00 00 00 01 00 00 01 7c 2d f2 b0 40 00 0c b0 a4 20 08 20 01 83 6c e1 9d 18 00 +00 00 00 2c 3b 66 02 00 00 80 19 d5 f5 88 1c 00 00 00 00 00 00 30 36 d4 c0 00 10 c0 40 47 7e 00 78 00 00 0b 1e fe 71 c0 08 +00 00 00 02 47 9f 04 40 00 00 01 0f fa 19 00 00 00 00 00 00 00 00 02 2c 0b 02 00 14 00 04 70 80 02 44 00 80 b0 ae f0 10 01 00 +00 00 00 20 55 b4 03 c0 02 00 23 7c a0 00 01 40 00 00 00 00 30 00 2b de c7 00 20 00 00 af 33 b6 00 00 00 40 9e e1 38 90 00 +c0 00 00 06 5f 07 40 3c 01 20 41 37 e9 10 82 08 00 00 00 00 00 00 00 14 29 08 8c 00 00 00 a0 b5 c0 00 00 00 06 ce f3 8d 00 08 +00 00 00 a4 71 fc 07 47 00 00 31 ce e8 01 00 00 00 00 00 00 70 00 2b 44 95 98 00 80 02 04 9f c0 04 00 10 02 84 cf 18 e1 88 +00 60 00 02 c3 17 00 20 00 00 01 1b ce f0 80 c2 00 00 00 00 03 00 02 24 6f 08 d0 14 00 21 c3 e0 02 00 00 00 2a e4 87 08 00 00 +00 00 00 aa f7 3e c3 40 05 00 20 4c e0 01 00 00 00 00 00 00 00 00 20 4c 90 00 00 00 02 80 ba 4e 04 05 51 02 25 f8 80 19 40 +00 00 00 02 0a 06 3e 30 00 40 02 be de 00 d8 00 00 00 00 02 01 00 01 7c ea 00 00 00 00 2e 07 3d 42 00 05 00 31 c1 cf 08 40 00 +00 00 00 20 51 b8 00 00 00 10 20 dc f3 80 00 80 00 00 00 00 00 00 39 74 c3 80 04 00 02 04 f7 a0 60 75 01 00 14 4a 38 10 00 +00 00 00 02 5f 07 40 00 00 00 22 6c 2c 08 00 00 00 00 00 00 00 00 01 15 df b0 d0 00 00 21 c3 e9 40 08 20 00 10 82 80 0d 00 00 +00 02 00 6a f1 b8 60 00 00 00 2b fe 80 01 40 80 00 00 00 28 00 10 31 4c 00 1a 01 00 02 80 3b 66 78 01 00 00 07 5c 00 06 04 +00 00 00 02 0a 0e 00 00 00 00 22 07 ce 00 ea 00 00 00 00 00 60 00 03 28 0e 01 d0 00 01 2e 03 7c 40 00 20 00 29 f6 ef 00 00 40 +00 00 00 0a bb 66 07 a8 00 00 20 56 e3 01 00 00 00 00 00 06 00 10 30 15 df 0c a0 00 02 04 d7 f4 32 84 00 00 0d dc 78 80 00 +00 00 20 00 0b f6 c4 7d 00 00 01 7f 4f 50 a0 00 00 00 00 00 00 00 23 28 2a f8 e0 00 00 21 c3 f8 44 00 00 00 09 ee b9 00 00 00 +00 00 04 08 33 b6 00 40 20 11 20 de c7 88 14 80 00 00 00 00 00 80 2b df b3 9c 00 c0 02 02 bf 40 00 40 00 03 55 5c 00 90 10 +00 00 00 80 67 0e 44 3c 00 00 01 9c 3e 59 e0 04 00 00 00 00 00 00 00 14 0d 09 00 02 00 21 af ad 42 40 40 00 36 87 df 09 0c 80 +00 00 00 2a 57 26 e6 28 10 00 01 6e e9 1e 00 00 00 00 00 07 00 00 2a d6 a7 89 00 80 02 04 b7 e0 7e 80 00 00 00 00 80 04 04 +00 00 00 02 55 0b 5c 01 02 00 03 6c 6f 51 f0 00 00 00 00 00 00 02 00 2f 4e 00 80 10 00 21 c3 ef 43 10 40 00 00 00 0f 09 00 00 +00 00 00 2a f5 e3 c3 84 53 10 20 c5 cd 8a 00 00 00 00 00 00 00 00 00 00 05 a8 54 00 02 00 1f 60 60 00 20 00 00 00 01 80 00 +00 00 00 02 05 0b ce 00 00 30 11 9c 3e 50 00 00 00 00 00 02 80 00 00 00 00 09 00 00 00 20 27 bc c2 04 23 00 00 00 00 00 04 00 +00 00 +11 03 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 00 80 00 00 00 00 00 02 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 0c 00 00 00 00 00 00 30 00 00 00 00 00 00 40 00 00 00 00 00 03 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 02 00 00 00 00 00 00 08 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 00 00 80 +00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 01 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 02 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3c 02 f0 08 00 0c 00 f0 06 40 00 00 00 01 e0 5b 00 00 00 +80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3c f8 00 10 00 80 00 f5 bc 06 80 00 00 12 fd d0 1c 00 0c +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 10 00 00 00 f0 0a c4 00 00 00 0b 69 5e 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 81 80 00 00 00 f7 26 60 00 00 00 b0 36 90 08 14 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8c 02 d9 08 00 00 00 33 b6 42 00 00 04 08 94 19 10 80 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 01 e0 00 00 00 00 00 00 01 09 e9 6f 98 10 00 00 0c c9 6d c0 00 00 10 8b 9e 88 1c 00 00 +00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 21 42 87 10 00 00 00 69 d4 14 28 00 00 03 00 0a 00 c4 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 14 ec 81 80 00 00 16 99 72 06 c0 00 10 30 8e 90 00 a0 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 b5 00 00 00 00 69 b0 14 00 00 00 01 54 0b b0 80 00 +00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 6b d8 e0 00 00 16 99 7b 42 80 00 10 33 06 b8 0b 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8c 0f e0 00 00 08 00 69 b4 02 28 00 00 03 c2 ee 00 00 00 +c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 eb 7c 01 a0 00 c0 16 91 68 e0 40 00 00 38 77 83 98 01 08 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ae 1c d0 0a 00 00 00 69 34 00 00 00 00 09 4e 4a 00 90 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 63 cb 00 10 01 80 16 91 29 40 00 00 01 a8 de 10 19 00 18 +00 00 00 00 00 00 00 00 00 04 3c 00 00 00 00 00 00 00 00 00 00 00 b9 c6 e0 0a 00 00 00 69 30 00 00 05 00 49 fc de 50 04 00 +00 00 00 00 00 00 00 00 00 00 03 c0 e0 00 00 00 00 00 00 00 00 00 0b dc fe 00 10 00 00 16 90 28 06 00 20 00 8f d6 91 8a 80 00 +00 00 00 00 00 00 42 20 02 00 06 7c d1 90 00 08 00 00 00 08 00 00 19 c1 80 10 00 0e 02 22 0a 02 00 00 30 0b c0 00 00 00 00 +80 00 00 00 00 00 20 05 00 22 02 9c cf 10 e0 00 c0 00 00 00 00 05 02 0d 58 00 80 00 8c 2d d3 64 67 00 03 40 bc 1c 00 20 00 0c +00 00 01 26 90 40 02 00 00 00 19 fd b9 00 00 00 00 00 00 00 00 00 11 46 c9 90 20 00 00 87 0c 04 01 04 00 03 25 69 01 00 00 +00 00 01 06 69 17 80 64 00 04 00 97 5d 01 80 00 00 00 00 00 04 00 02 3d ca 10 84 00 04 08 71 3a 00 00 20 00 0d 95 80 08 00 00 +00 00 09 a6 90 00 00 00 00 40 17 ad f0 8f 00 00 00 00 00 00 00 00 06 47 ff 00 00 00 00 0f 0b c6 00 00 00 02 5a 6d 00 b0 00 +00 00 00 03 69 16 80 00 00 02 00 31 f9 30 10 00 00 00 00 00 00 00 02 9c dc 80 00 00 00 0a 51 2b 40 00 00 00 0f 27 b5 81 00 00 +00 02 00 66 90 03 c0 00 00 04 0b a7 e0 0f 00 00 00 00 00 00 00 20 2b 47 91 09 04 00 00 dd 0e c4 00 00 00 00 cc 39 00 00 00 +00 00 01 07 69 17 80 00 00 08 00 96 df 78 10 00 00 00 00 00 00 00 00 32 6a 80 02 10 04 02 25 be 00 00 00 30 33 0d c5 80 00 00 +00 00 00 a6 90 40 00 00 00 00 80 00 a9 09 00 00 00 00 00 00 00 80 16 d7 b0 9c 00 00 00 87 0b 54 2c 00 00 03 50 4b 50 00 00 +00 00 20 93 69 12 80 60 00 00 18 15 e9 d0 10 00 00 00 00 00 00 00 00 0f 68 38 90 00 04 04 b7 86 60 00 00 00 3a 34 00 0a 00 00 +00 00 01 a6 90 40 40 00 02 00 80 02 e0 08 00 08 00 00 00 00 00 00 80 02 f3 0c 20 0c 00 f0 08 00 40 40 30 03 c0 3a 51 01 40 +00 00 00 13 69 12 a6 00 00 30 28 14 d9 00 10 00 80 00 00 00 00 00 08 14 7a 18 a4 00 80 0f 01 80 c2 80 02 00 03 cf b0 0a 00 00 +00 00 09 26 90 00 03 80 00 00 80 00 bb 90 00 00 00 00 00 00 00 80 80 00 9b 8c 00 00 00 22 5e 00 6c 00 00 03 e8 1d 59 00 00 +00 00 00 13 69 13 80 04 00 60 08 15 e9 99 80 01 80 00 00 00 00 00 08 14 7f b8 10 01 80 0d db b4 62 80 06 00 17 d7 95 1c 00 18 +00 00 0b 26 90 00 00 04 00 00 80 03 ef 0e a8 00 00 00 00 08 a0 00 80 02 e7 09 00 00 00 00 00 36 00 00 00 4b c0 20 d0 00 00 +00 00 00 93 69 13 80 00 00 00 08 14 d9 00 04 c0 00 00 00 00 00 00 18 14 7a 00 80 00 00 00 00 01 40 00 00 00 bc 0e 00 00 00 00 +00 00 01 a6 90 40 02 05 02 00 80 0d e0 00 20 08 00 00 00 00 00 04 34 4f b0 00 00 0e 00 67 0e 40 7c 00 30 03 48 10 70 00 00 +80 00 00 03 69 17 86 04 00 30 0a 06 1e 58 a4 00 80 00 00 00 00 08 02 87 f8 38 e0 04 c4 08 31 f4 e2 00 03 10 34 97 ed 00 00 0c +00 00 00 a6 90 40 22 00 00 00 80 00 c0 2f 00 00 00 00 00 00 00 00 05 cd 81 0e 40 00 00 43 36 80 30 00 00 00 3c 2d 10 e0 00 +00 00 01 17 69 16 8e 64 80 04 08 15 dc 50 b0 00 00 00 00 00 00 04 00 9e 6f 80 10 00 00 06 7b 60 02 00 00 40 3c 1c e8 18 00 00 +00 00 08 26 90 00 03 82 00 00 80 8c e5 0a 00 00 00 00 00 17 20 80 24 ec e0 99 00 00 10 67 9a cc 3c 00 00 00 e4 2f 00 90 00 +00 00 01 17 69 16 80 00 20 04 08 07 c0 01 c0 c0 00 00 00 02 85 00 02 8c e8 19 80 00 00 02 5b 70 02 00 00 10 32 4c 80 00 00 00 +00 02 09 66 90 00 00 00 00 04 80 00 d5 0a 00 00 00 00 00 00 00 40 2b 67 f0 00 00 02 00 67 02 c4 00 60 08 02 80 2d 90 d2 00 +00 00 00 97 69 17 80 00 00 00 08 15 dc 00 00 00 00 00 00 00 40 04 00 32 eb 78 00 00 04 08 37 76 06 00 00 00 01 5c e8 01 40 00 +00 00 00 66 90 40 40 00 00 00 80 8e e0 00 00 00 00 00 00 03 00 00 12 b7 d7 00 00 00 00 89 72 56 30 10 02 01 7c 2f 00 00 00 +00 00 20 03 69 12 a0 60 50 02 08 07 c0 00 00 02 00 00 00 00 60 00 42 2e 5f 30 c0 00 00 0c 79 a5 c0 00 00 00 2b cc 00 18 00 00 +00 00 01 26 90 40 40 00 03 04 80 00 c0 00 00 28 00 00 00 00 00 00 80 03 ab 10 10 0c 02 05 0b 94 32 80 20 09 38 ee 00 80 0a +00 00 00 03 69 12 a6 00 00 30 08 15 dd 00 00 02 80 00 00 00 05 00 08 14 fa 99 e0 00 80 20 05 a8 02 90 02 00 a3 5c 00 01 00 60 +00 00 01 26 90 00 00 00 00 00 80 8c e0 0d 00 00 00 00 00 00 00 00 80 02 d7 1b 00 00 02 00 06 ee 28 00 00 08 28 0a 00 00 00 +00 00 00 03 69 13 80 00 00 60 48 07 e0 00 10 01 80 00 00 00 00 00 08 14 7b 00 b0 01 80 2a 07 7f c0 00 06 00 ab dc c0 00 00 18 +00 00 02 26 90 00 00 00 00 00 80 00 df 00 00 00 00 00 00 00 00 00 80 03 bb 08 00 00 02 05 0b bc 20 00 00 0a bc 2c 00 90 08 +00 00 01 03 69 13 80 00 00 00 48 15 dd 80 00 00 00 00 00 00 00 00 08 14 fb 80 12 00 00 20 05 ea 00 40 00 00 81 5e a0 00 01 40 +00 00 00 26 90 40 02 00 23 00 81 43 e0 00 00 0c 00 00 00 00 00 00 80 01 90 0c 00 08 10 00 07 82 34 00 30 0a a8 10 01 00 00 +80 00 00 03 69 17 86 74 00 34 08 01 ca 78 00 00 80 00 00 00 00 00 0a 80 f9 38 10 00 90 0a 03 f8 60 40 22 00 aa 9f a0 08 00 0c +00 00 00 26 90 40 00 16 20 80 82 82 80 8e 00 00 00 00 00 00 00 00 82 82 a0 00 08 01 00 00 03 c2 38 84 00 09 37 6e 10 04 00 +00 00 00 03 69 16 86 62 01 00 08 00 ce 78 01 00 00 00 00 00 05 00 08 00 7f 30 00 00 20 00 57 7d e0 10 20 00 a3 b6 18 18 a0 00 +00 00 00 26 90 00 00 08 00 00 81 43 e0 09 00 00 00 00 00 00 00 00 80 00 93 0c 09 41 00 a0 07 80 34 00 0a 03 fc 3b 00 f0 00 +00 00 00 03 69 16 80 01 00 02 08 01 c8 00 00 00 00 00 00 00 80 00 0a 80 eb 80 18 08 00 00 03 f8 40 40 00 50 3b d6 b0 01 00 00 +00 02 01 26 90 00 00 00 04 00 82 82 8f 80 00 10 00 00 00 00 00 80 82 82 d0 0d 00 10 02 01 0a 1c 00 00 40 02 bc 10 00 00 01 +00 00 00 03 69 17 80 00 04 00 08 00 cf 78 00 00 00 00 00 00 01 00 08 00 7f 00 10 00 04 20 23 80 00 00 00 00 2b d4 e0 00 00 00 +00 00 00 26 90 40 40 08 00 00 81 43 e0 00 00 00 00 00 00 00 10 80 80 00 90 10 00 02 14 05 07 80 00 00 00 08 3d 6f 10 01 40 +00 00 20 03 69 13 a0 61 70 00 08 00 6e 01 c0 00 00 00 00 02 00 00 0a 80 ed 01 e0 00 00 00 03 f8 02 28 00 00 a3 94 e9 80 00 00 +00 00 00 26 90 40 40 00 03 04 82 82 a0 90 00 08 00 00 00 00 00 00 82 82 80 10 08 0c 02 05 0a 00 00 00 30 0b 30 20 00 80 00 +00 00 00 03 69 12 bc 00 00 20 08 00 ce 10 80 00 c0 00 00 00 00 04 08 00 7e 01 e0 00 c0 20 01 60 00 00 03 10 b3 1c 01 81 00 00 +00 00 00 26 90 00 20 08 00 04 81 43 e9 09 18 00 00 00 00 05 00 80 80 01 97 0f 00 00 02 00 06 40 66 20 00 00 00 1b 00 00 80 +00 00 00 03 69 13 9e 01 00 60 08 01 ee 00 00 01 80 00 00 00 00 00 0a 80 ff 58 10 01 80 2a 01 b0 03 80 06 00 01 5f b0 00 08 18 +00 00 00 26 91 40 02 00 00 40 82 82 c1 08 00 00 00 00 00 00 80 04 82 82 99 08 a0 02 10 ff 02 00 24 00 00 08 3c 1e 00 00 00 +00 00 00 03 69 06 00 04 20 00 08 00 cf 00 00 00 00 00 00 00 00 00 08 00 7e 00 00 00 01 0a f7 78 60 00 00 00 aa 94 e0 00 00 00 +00 00 00 00 00 00 c7 50 40 04 19 c0 90 9e 00 00 00 00 00 00 00 04 18 c2 87 18 00 08 02 00 02 00 00 00 20 02 00 1a 70 f0 00 +80 00 00 00 00 00 00 70 02 01 02 0d ed 38 80 00 00 00 00 00 00 01 02 8d e9 10 80 00 80 aa 07 2d c0 00 02 10 00 0e bf 8a 00 08 +00 00 00 00 00 01 e3 40 00 00 06 6c c0 0d 00 00 00 00 00 00 00 00 09 bf e1 8e 00 00 06 05 02 24 42 00 00 02 80 00 00 00 00 +00 00 00 00 00 00 0c 38 00 00 02 9d cb 38 10 00 00 00 00 00 70 00 02 9e e9 b8 f0 00 00 20 01 f1 c2 10 00 00 28 1f c0 00 00 00 +00 00 08 80 00 72 c3 88 10 04 19 c0 90 0b 00 00 00 00 00 00 00 04 24 df f0 90 1c 00 02 00 06 1c 41 40 08 11 78 5c 01 f0 00 +00 00 00 00 a5 03 20 01 30 01 02 0d 5b 00 14 c0 00 00 00 00 30 00 02 8d fa 70 a0 00 08 2a 07 74 0f 00 00 00 03 3e b0 1f 00 00 +00 00 00 0f f3 a9 e3 42 04 00 31 8e 89 0e 00 10 00 00 00 00 00 04 19 c2 f7 00 00 10 02 05 06 00 00 00 40 00 94 19 00 04 01 +00 00 00 00 ef 77 ee 74 00 00 03 16 7b 00 00 00 00 00 00 00 40 01 02 0d 69 80 00 00 08 20 01 b8 00 00 00 50 29 4d b3 9e 20 00 +00 00 00 0f ff 60 03 08 00 00 26 c3 80 0b 40 80 00 00 00 00 00 00 06 5d 9d 90 00 00 12 00 06 00 02 01 00 02 bc 0a 10 c0 00 +00 00 00 00 ef fe 40 3d 00 01 42 0c 4c 78 c0 14 00 00 00 00 00 00 02 9f 6a 51 e0 10 00 2a 07 7c 00 38 20 00 17 ce 18 00 00 00 +00 00 00 8f f0 60 00 00 00 00 31 8f b0 98 00 00 00 00 00 00 00 00 82 81 f0 8f 00 0a 02 05 06 24 3d 00 30 08 00 1e 08 02 00 +80 00 00 4c ef 5a 40 00 00 00 03 16 68 19 e0 00 00 00 00 00 20 00 08 00 fe 78 10 00 c0 20 01 a8 07 a0 03 20 81 47 f5 80 40 08 +00 00 00 0f f0 77 66 08 40 04 19 c3 90 89 00 00 00 00 00 00 00 00 90 14 c0 1d 00 00 02 00 06 00 78 d0 00 28 00 18 70 d0 00 +00 00 00 40 ef 77 14 2d 02 01 02 0d fb 10 10 00 00 00 00 00 00 00 0a 01 c1 00 b0 01 90 2a 07 24 02 80 06 00 81 5f f0 1d 00 18 +00 00 00 0f ff b0 00 00 00 00 31 8e ff 90 00 00 00 00 00 28 00 00 82 81 9f 08 00 00 12 05 02 3c 3c 00 02 08 00 1e f0 00 00 +00 00 00 00 ef 1b c6 00 00 00 03 16 7e d0 e0 40 00 00 00 01 00 00 08 00 fe 91 90 10 00 20 01 a8 00 40 00 00 81 46 d8 00 00 00 +00 00 00 20 0f 3b c4 00 03 00 18 c3 90 8e 00 00 00 00 00 00 00 20 80 01 d0 00 40 4c 82 00 0b ec 3c 30 30 08 3c 20 b1 b0 00 +80 00 00 02 24 82 20 38 20 25 02 8c f8 59 e0 00 00 00 00 00 00 00 08 15 7c 01 c0 08 c0 20 53 be 00 40 12 20 83 d6 00 1d 1c 0c +00 00 01 20 a0 70 03 c0 20 00 06 6e f7 0f 00 00 00 00 00 00 00 80 80 02 90 00 20 02 02 00 0f 42 40 01 00 0b c0 20 98 00 00 +00 00 00 02 00 77 80 05 04 00 02 9e e9 00 00 00 00 00 00 01 00 00 08 14 d9 00 00 00 00 20 57 a4 42 00 00 00 bc 1c 03 80 00 00 +00 00 00 20 8f b8 c3 50 40 40 26 c3 e9 90 00 00 00 00 00 10 00 00 80 a4 d7 00 00 00 12 00 0f fc 00 00 00 00 25 fc 00 c0 00 +00 00 00 06 04 90 00 00 02 01 02 0d 7c 39 c0 00 00 00 00 02 80 08 08 07 60 00 00 00 00 20 53 a6 00 00 00 02 01 7c a0 00 00 00 +00 02 00 20 a0 62 c3 20 00 00 06 6c f5 0f 00 00 00 00 00 00 00 00 80 03 a0 80 00 00 06 00 0b 40 00 00 00 01 00 0f 30 00 00 +00 00 00 02 00 77 e0 00 00 00 02 9e eb 81 b0 00 00 00 00 00 00 00 18 14 db 38 00 08 00 20 57 fc 00 00 00 50 21 5e c3 98 00 00 +00 00 00 20 8f b8 04 10 10 00 18 c2 bf 0b 00 00 00 00 00 00 00 80 80 a4 df 80 10 00 02 00 0f c0 40 00 00 01 4c 0d 10 04 00 +00 00 20 02 04 b8 00 38 f2 09 02 8c ed b0 12 00 00 00 00 00 00 00 08 05 60 79 c0 00 00 60 53 e4 02 00 50 10 28 de 0b 00 00 00 +00 00 00 20 a0 78 00 12 23 00 06 6e f0 09 41 40 00 00 00 20 00 00 80 02 80 90 40 0c 02 00 0b 5c 00 00 30 00 14 3d 30 00 00 +00 00 00 02 00 77 de 01 a4 20 02 9f cd 00 1a 00 00 00 00 00 00 08 08 14 d9 71 ee 0a 80 60 57 a6 00 10 03 00 2b de a1 80 00 00 +00 00 00 20 8f b8 03 c8 00 04 18 c2 a3 80 00 00 00 00 00 00 00 00 80 00 d7 0f 00 00 02 00 0b fc 3c 02 00 02 8c 10 00 00 00 +00 00 00 02 04 b0 00 01 00 61 02 8c ff 3a 02 00 00 00 00 00 00 00 28 15 6a f9 d0 01 80 60 53 e4 08 00 56 10 28 df a0 0e 00 18 +00 00 00 20 a0 71 c3 80 00 00 09 ad d0 90 00 00 00 00 00 00 80 01 80 02 b0 80 00 80 02 00 0f 7e 00 01 00 00 14 1d 00 00 00 +00 00 00 02 00 77 c0 04 02 00 02 9f f8 71 80 00 00 00 00 00 00 00 08 14 d9 78 00 10 00 a0 57 ad c7 80 00 00 2b c7 a0 00 80 04 +00 00 00 20 00 f0 20 05 02 00 2b f6 89 0d 00 00 00 00 00 00 00 04 09 85 cb 1d 10 08 00 cb 0b 74 00 00 20 00 00 00 00 00 00 +00 00 00 02 05 36 4c 00 00 32 02 04 d8 58 00 00 00 00 00 00 00 00 00 97 cb f0 80 10 c4 08 93 bb e7 00 03 00 00 00 03 80 00 00 +00 00 08 0f f1 e1 c0 00 00 00 19 c1 a7 0e 00 00 00 00 00 00 00 00 29 c5 ab 89 00 00 00 e7 0b 82 20 00 00 00 2d 4f b1 00 00 +00 00 00 00 ef b7 3c 00 00 01 02 0d 58 80 10 00 00 00 00 00 60 00 00 04 fb f9 91 02 04 00 55 29 c2 04 40 00 2a cc 89 08 00 00 +00 00 08 20 00 b0 03 8a 20 00 09 86 d3 19 00 20 00 00 00 00 00 00 01 41 c0 0d 00 40 00 e2 07 ec 74 00 00 01 7c 28 11 00 00 +00 00 00 02 05 32 5c f9 30 00 02 9c f8 50 c0 00 00 00 00 00 00 04 02 bc 6d 00 90 00 04 08 15 b6 43 40 00 02 01 5f 90 08 00 00 +00 02 08 20 00 69 e0 00 00 00 19 c3 ab 0a 00 00 00 00 00 20 20 00 81 42 ef 1d 00 00 00 5f 0e dc 38 05 00 23 28 2f 91 80 00 +00 00 00 02 05 3b ac 00 00 01 02 0d de 58 00 00 00 00 00 00 05 00 0a bc 5f 01 94 00 00 00 55 f6 e0 00 00 10 30 1d d0 08 00 00 +00 00 00 20 00 b0 00 00 00 00 22 44 80 0e 00 80 00 00 00 00 50 80 82 82 8d 1e 00 00 00 6e 9a 4e 00 00 00 03 14 20 00 00 00 +00 00 20 02 05 36 40 00 45 00 03 1e ec 00 10 14 00 00 00 00 02 00 0a bd fe 80 90 00 00 08 59 31 c7 80 00 10 31 44 80 1c 00 00 +00 00 00 20 00 74 00 17 03 02 19 c0 a9 1e 40 00 00 00 00 00 00 04 81 42 e0 00 00 0c 02 0a 02 0c 38 01 30 03 2c 0c 01 0a 00 +00 00 00 06 05 3b 00 38 80 31 02 0d da 01 88 00 00 00 00 00 00 00 0a bd cf 10 00 00 c0 20 03 ba 00 00 03 10 22 46 80 0c 00 00 +00 00 00 20 2b b2 c3 85 00 00 19 c6 e0 1c 80 40 00 00 00 00 00 00 82 80 a0 18 20 00 12 08 73 02 00 00 00 01 5e 6c 01 e8 00 +00 00 00 02 01 b0 60 00 00 60 00 95 f9 79 f0 00 00 00 00 00 00 00 0a bc df 00 94 81 80 20 47 85 c0 00 06 00 28 4c e5 9f 00 00 +00 00 00 20 00 7c 03 80 00 20 06 55 80 10 0c 00 00 00 00 00 00 00 81 42 e0 18 00 00 02 0a 03 c6 38 60 00 01 3e ea f1 80 00 +00 00 00 02 05 3b c0 00 00 00 02 9c fd 01 80 00 00 00 00 01 40 00 0a bd ed 59 b0 08 10 20 03 bf c0 40 00 00 11 66 9d 89 04 00 +00 00 08 20 a0 f0 47 80 03 00 01 42 b0 80 20 08 00 00 00 03 00 00 00 00 00 8c 00 00 10 c5 00 34 00 00 02 0a 9c 39 b0 00 04 +80 00 00 02 af 5e 20 38 10 32 02 bd 6e 10 04 00 80 00 00 00 00 00 00 00 00 50 10 00 04 0c 55 a8 40 13 50 30 89 55 b8 00 00 8c +00 00 00 60 50 b0 44 00 00 00 81 41 c7 0a 40 00 00 00 08 10 00 00 00 82 ef 09 80 40 00 45 de 02 7c 00 00 40 14 10 00 00 00 +00 00 00 02 af 7b 20 78 00 00 0a bc c8 71 90 00 00 00 00 02 00 01 00 1c d8 10 84 00 00 0e 53 f8 43 c0 00 20 01 47 e7 00 10 00 +00 00 00 60 a0 38 04 00 08 40 01 42 b1 00 00 40 00 00 00 10 00 00 31 c1 eb 8c 44 00 10 5f 0f 00 42 00 00 28 3a d9 19 ea 00 +00 00 00 02 af 5b 40 68 00 00 02 bc e8 f0 00 00 00 00 00 02 00 01 02 24 7d f8 10 00 00 00 55 bd c3 80 00 40 a3 d7 c9 09 00 00 +00 02 01 20 50 30 c7 c0 00 00 81 42 cb 8a 80 00 00 00 00 00 00 00 19 ce d1 8b 00 00 10 50 02 ee 00 00 00 0b 0c 5d 18 04 00 +00 00 00 02 af 5f 00 68 00 00 1a bc ea 11 f0 80 00 00 00 00 02 00 00 97 4e b8 10 04 00 0a 03 07 c7 00 00 01 91 f4 dd 98 80 00 +00 00 00 20 a0 e4 02 00 10 20 81 43 e0 0b 00 00 00 00 00 10 40 00 00 6f 87 00 40 00 00 aa 0b 86 78 70 00 08 3a fc 00 00 00 +00 00 20 06 af 56 06 64 00 00 0a bd d8 78 06 00 00 00 00 00 02 00 02 0d f9 00 0b 80 00 8a 05 e0 42 00 50 01 a3 c7 d1 98 a1 10 +00 00 00 20 50 f0 02 00 00 04 81 43 c7 0e 1c 08 00 00 00 18 08 00 20 43 9b 00 0c 00 00 05 f2 36 40 00 04 4b 0e fd 01 90 00 +00 00 00 12 af 72 06 74 00 00 0a bd d8 02 10 00 80 00 00 02 00 01 02 2c fa 80 00 40 00 8e 7f 6f c7 00 00 00 91 ce d5 9c 00 00 +00 00 01 ac 21 ba c0 00 05 00 81 43 ed 8e 00 00 00 00 00 00 00 00 17 c2 9d 0e 10 00 00 17 df 7c 30 24 08 2b 0c fd f9 81 01 +40 00 00 0a c7 32 e0 00 02 50 0a bd ec 70 14 43 80 00 00 00 60 00 00 15 cc 01 c0 00 00 02 71 b2 00 43 08 00 91 d5 cb 9d 00 30 +00 00 00 a0 d5 74 00 00 08 00 81 41 cb 88 00 80 00 00 00 00 c0 00 02 a6 89 af 00 80 00 2b 7e 4e 3c 02 0c 38 23 eb 00 00 40 +00 00 00 0a 8f 52 0e 60 00 00 0a bd 6c 78 10 04 00 00 00 01 52 08 02 2d ce 58 00 04 00 02 71 6a c8 68 00 61 80 0d 87 00 00 00 +00 00 +62 00 3f +72 00 80 +11 00 +82 00 00 +01 03 +00 00 00 00 c0 00 00 d7 +00 00 00 00 c6 66 00 d7 +00 00 00 00 cc cd 00 d7 +00 00 00 00 d3 33 00 d7 +00 00 00 00 d9 9a 00 d7 +00 00 00 00 e0 00 00 d7 +00 00 00 00 e6 66 00 d7 +00 00 00 00 ec cd 00 d7 +00 00 00 00 f3 33 00 d7 +00 00 00 00 f9 9a 00 d7 +00 00 00 00 00 00 00 d8 +00 00 00 00 06 66 00 d8 +00 00 00 00 0c cd 00 d8 +00 00 00 00 13 33 00 d8 +00 00 00 00 19 9a 00 d8 +00 00 00 00 20 00 00 d8 +00 00 00 00 26 66 00 d8 +00 00 00 00 2c cd 00 d8 +00 00 00 00 33 33 00 d8 +00 00 00 00 39 9a 00 d8 +00 00 00 00 40 00 00 d8 +00 00 00 00 46 66 00 d8 +00 00 00 00 4c cd 00 d8 +00 00 00 00 53 33 00 d8 +00 00 00 00 59 9a 00 d8 +00 00 00 00 60 00 00 d8 +00 00 00 00 66 66 00 d8 +00 00 00 00 6c cd 00 d8 +00 00 00 00 73 33 00 d8 +00 00 00 00 79 9a 00 d8 +00 00 00 00 80 00 00 d8 +00 00 00 00 86 66 00 d8 +00 00 00 00 8c cd 00 d8 +00 00 00 00 93 33 00 d8 +00 00 00 00 99 9a 00 d8 +00 00 00 00 a0 00 00 d8 +00 00 00 00 a6 66 00 d8 +00 00 00 00 ac cd 00 d8 +00 00 00 00 b3 33 00 d8 +00 00 00 00 b9 9a 00 d8 +00 00 00 00 c0 00 00 d8 +00 00 00 00 c6 66 00 d8 +00 00 00 00 cc cd 00 d8 +00 00 00 00 d3 33 00 d8 +00 00 00 00 d9 9a 00 d8 +00 00 00 00 e0 00 00 d8 +00 00 00 00 e6 66 00 d8 +00 00 00 00 ec cd 00 d8 +00 00 00 00 f3 33 00 d8 +00 00 00 00 f9 9a 00 d8 +00 00 00 00 00 00 00 d9 +00 00 00 00 06 66 00 d9 +00 00 00 00 0c cd 00 d9 +00 00 00 00 13 33 00 d9 +00 00 00 00 19 9a 00 d9 +00 00 00 00 20 00 00 d9 +00 00 00 00 26 66 00 d9 +00 00 00 00 2c cd 00 d9 +00 00 00 00 33 33 00 d9 +00 00 00 00 39 9a 00 d9 +00 00 00 00 40 00 00 d9 +00 00 00 00 46 66 00 d9 +00 00 00 00 4c cd 00 d9 +00 00 00 00 53 33 00 d9 +00 00 00 00 59 9a 00 d9 +00 00 00 00 60 00 00 d9 +00 00 00 00 66 66 00 d9 +00 00 00 00 6c cd 00 d9 +00 00 00 00 73 33 00 d9 +00 00 00 00 79 9a 00 d9 +00 00 00 00 80 00 00 d9 +00 00 00 00 86 66 00 d9 +00 00 00 00 8c cd 00 d9 +00 00 00 00 93 33 00 d9 +00 00 00 00 99 9a 00 d9 +00 00 00 00 a0 00 00 d9 +00 00 00 00 a6 66 00 d9 +00 00 00 00 ac cd 00 d9 +00 00 00 00 b3 33 00 d9 +00 00 00 00 b9 9a 00 d9 +00 00 00 00 c0 00 00 d9 +00 00 00 00 c6 66 00 d9 +00 00 00 00 cc cd 00 d9 +00 00 00 00 d3 33 00 d9 +00 00 00 00 d9 9a 00 d9 +00 00 00 00 e0 00 00 d9 +00 00 00 00 e6 66 00 d9 +00 00 00 00 ec cd 00 d9 +00 00 00 00 f3 33 00 d9 +00 00 00 00 f9 9a 00 d9 +00 00 00 00 00 00 00 da +00 00 00 00 06 66 00 da +00 00 00 00 0c cd 00 da +00 00 00 00 13 33 00 da +00 00 00 00 19 9a 00 da +00 00 00 00 20 00 00 da +00 00 00 00 26 66 00 da +00 00 00 00 2c cd 00 da +00 00 00 00 33 33 00 da +00 00 00 00 39 9a 00 da +00 00 00 00 40 00 00 da +00 00 00 00 46 66 00 da +00 00 00 00 4c cd 00 da +00 00 00 00 53 33 00 da +00 00 00 00 59 9a 00 da +00 00 00 00 60 00 00 da +00 00 00 00 66 66 00 da +00 00 00 00 6c cd 00 da +00 00 00 00 73 33 00 da +00 00 00 00 79 9a 00 da +00 00 00 00 80 00 00 da +00 00 00 00 86 66 00 da +00 00 00 00 8c cd 00 da +00 00 00 00 93 33 00 da +00 00 00 00 99 9a 00 da +00 00 00 00 a0 00 00 da +00 00 00 00 a6 66 00 da +00 00 00 00 ac cd 00 da +00 00 00 00 b3 33 00 da +00 00 00 00 b9 9a 00 da +00 00 00 00 c0 00 00 da +00 00 00 00 c6 66 00 da +00 00 00 00 cc cd 00 da +00 00 00 00 d3 33 00 da +00 00 00 00 d9 9a 00 da +00 00 00 00 e0 00 00 da +00 00 00 00 e6 66 00 da +00 00 00 00 ec cd 00 da +00 00 +82 00 80 +01 03 +00 00 00 00 f3 33 00 da +00 00 00 00 f9 9a 00 da +00 00 00 00 00 00 00 db +00 00 00 00 06 66 00 db +00 00 00 00 0c cd 00 db +00 00 00 00 13 33 00 db +00 00 00 00 19 9a 00 db +00 00 00 00 20 00 00 db +00 00 00 00 26 66 00 db +00 00 00 00 2c cd 00 db +00 00 00 00 33 33 00 db +00 00 00 00 39 9a 00 db +00 00 00 00 40 00 00 db +00 00 00 00 46 66 00 db +00 00 00 00 4c cd 00 db +00 00 00 00 53 33 00 db +00 00 00 00 59 9a 00 db +00 00 00 00 60 00 00 db +00 00 00 00 66 66 00 db +00 00 00 00 6c cd 00 db +00 00 00 00 73 33 00 db +00 00 00 00 79 9a 00 db +00 00 00 00 80 00 00 db +00 00 00 00 86 66 00 db +00 00 00 00 8c cd 00 db +00 00 00 00 93 33 00 db +00 00 00 00 99 9a 00 db +00 00 00 00 a0 00 00 db +00 00 00 00 a6 66 00 db +00 00 00 00 ac cd 00 db +00 00 00 00 b3 33 00 db +00 00 00 00 b9 9a 00 db +00 00 00 00 c0 00 00 db +00 00 00 00 c6 66 00 db +00 00 00 00 cc cd 00 db +00 00 00 00 d3 33 00 db +00 00 00 00 d9 9a 00 db +00 00 00 00 e0 00 00 db +00 00 00 00 e6 66 00 db +00 00 00 00 ec cd 00 db +00 00 00 00 f3 33 00 db +00 00 00 00 f9 9a 00 db +00 00 00 00 00 00 00 dc +00 00 00 00 06 66 00 dc +00 00 00 00 0c cd 00 dc +00 00 00 00 13 33 00 dc +00 00 00 00 19 9a 00 dc +00 00 00 00 20 00 00 dc +00 00 00 00 26 66 00 dc +00 00 00 00 2c cd 00 dc +00 00 00 00 33 33 00 dc +00 00 00 00 39 9a 00 dc +00 00 00 00 40 00 00 dc +00 00 00 00 46 66 00 dc +00 00 00 00 4c cd 00 dc +00 00 00 00 53 33 00 dc +00 00 00 00 59 9a 00 dc +00 00 00 00 60 00 00 dc +00 00 00 00 66 66 00 dc +00 00 00 00 6c cd 00 dc +00 00 00 00 73 33 00 dc +00 00 00 00 79 9a 00 dc +00 00 00 00 80 00 00 dc +00 00 00 00 86 66 00 dc +00 00 00 00 8c cd 00 dc +00 00 00 00 93 33 00 dc +00 00 00 00 99 9a 00 dc +00 00 00 00 a0 00 00 dc +00 00 00 00 a6 66 00 dc +00 00 00 00 ac cd 00 dc +00 00 00 00 b3 33 00 dc +00 00 00 00 b9 9a 00 dc +00 00 00 00 c0 00 00 dc +00 00 00 00 c6 66 00 dc +00 00 00 00 cc cd 00 dc +00 00 00 00 d3 33 00 dc +00 00 00 00 d9 9a 00 dc +00 00 00 00 e0 00 00 dc +00 00 00 00 e6 66 00 dc +00 00 00 00 ec cd 00 dc +00 00 00 00 f3 33 00 dc +00 00 00 00 f9 9a 00 dc +00 00 00 00 00 00 00 dd +00 00 00 00 06 66 00 dd +00 00 00 00 0c cd 00 dd +00 00 00 00 13 33 00 dd +00 00 00 00 19 9a 00 dd +00 00 00 00 20 00 00 dd +00 00 00 00 26 66 00 dd +00 00 00 00 2c cd 00 dd +00 00 00 00 33 33 00 dd +00 00 00 00 39 9a 00 dd +00 00 00 00 40 00 00 dd +00 00 00 00 46 66 00 dd +00 00 00 00 4c cd 00 dd +00 00 00 00 53 33 00 dd +00 00 00 00 59 9a 00 dd +00 00 00 00 60 00 00 dd +00 00 00 00 66 66 00 dd +00 00 00 00 6c cd 00 dd +00 00 00 00 73 33 00 dd +00 00 00 00 79 9a 00 dd +00 00 00 00 80 00 00 dd +00 00 00 00 86 66 00 dd +00 00 00 00 8c cd 00 dd +00 00 00 00 93 33 00 dd +00 00 00 00 99 9a 00 dd +00 00 00 00 a0 00 00 dd +00 00 00 00 a6 66 00 dd +00 00 00 00 ac cd 00 dd +00 00 00 00 b3 33 00 dd +00 00 00 00 b9 9a 00 dd +00 00 00 00 c0 00 00 dd +00 00 00 00 c6 66 00 dd +00 00 00 00 cc cd 00 dd +00 00 00 00 d3 33 00 dd +00 00 00 00 d9 9a 00 dd +00 00 00 00 e0 00 00 dd +00 00 00 00 e6 66 00 dd +00 00 00 00 ec cd 00 dd +00 00 00 00 f3 33 00 dd +00 00 00 00 f9 9a 00 dd +00 00 00 00 00 00 00 de +00 00 00 00 06 66 00 de +00 00 00 00 0c cd 00 de +00 00 00 00 13 33 00 de +00 00 00 00 19 9a 00 de +00 00 00 00 20 00 00 de +00 00 +11 01 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +11 02 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +11 03 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +22 +3a 5f +01 06 + diff --git a/fpga/SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_915_v33.hex b/fpga/SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_915_v33.hex new file mode 100644 index 00000000..55bea374 --- /dev/null +++ b/fpga/SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_915_v33.hex @@ -0,0 +1,1659 @@ +ff 00 +4c 61 74 74 69 63 65 00 +69 43 45 63 75 62 65 32 20 32 30 31 35 2e 30 34 2e 32 37 34 30 39 00 +50 61 72 74 3a 20 69 43 45 34 30 4c 50 31 4b 2d 43 4d 34 39 00 +44 61 74 65 3a 20 4f 63 74 20 31 37 20 32 30 31 36 20 31 31 3a 33 30 3a 32 32 00 +00 ff +7e aa 99 7e +51 00 +01 05 +92 00 20 +62 01 4b +72 00 90 +82 00 00 +11 00 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 02 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 30 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 00 01 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 00 03 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 10 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 +00 00 00 00 00 0f 22 13 00 00 00 00 3e 00 02 00 00 01 00 d8 00 00 40 00 21 c5 00 00 00 00 0c 32 21 30 00 00 0c 01 78 f5 20 +00 00 00 00 00 00 70 04 90 80 00 00 02 c0 a5 00 00 00 18 0b 81 00 00 00 01 50 a0 00 00 00 00 03 80 49 48 00 00 00 0e 0a 00 00 +00 00 18 00 00 0f 22 13 00 00 00 03 0f a5 00 01 81 8f 80 78 00 00 00 00 0d a0 50 01 80 50 00 5a 21 30 00 47 2c 00 6a f5 00 +00 00 00 00 09 00 f0 04 90 00 00 00 00 20 50 00 00 00 78 0b 01 00 00 00 00 00 05 00 00 02 00 07 00 49 40 08 02 c0 1d 0a 00 00 +00 00 30 00 01 9d 22 13 00 00 00 00 1e ea 50 00 00 05 88 38 00 00 40 00 21 e5 00 03 00 00 00 7a 21 30 00 00 00 32 cc 80 02 +00 00 01 00 00 08 78 04 90 00 00 00 03 e0 55 00 00 00 00 01 01 00 40 00 01 40 a0 00 10 00 00 03 00 49 00 00 00 00 3d 0e 52 00 +00 02 00 00 19 9d 22 13 00 00 00 c0 0e e5 00 04 00 00 01 f0 00 00 03 c0 01 a0 50 00 00 05 80 02 61 30 00 00 00 05 ce 50 00 +00 00 00 00 00 08 f8 04 90 00 00 00 00 20 50 00 00 00 90 af 80 40 00 3c 32 c0 0a 00 00 00 00 07 30 49 00 00 08 03 41 05 00 80 +00 00 00 00 00 0f a2 13 00 00 00 00 26 00 00 00 00 08 1c f0 10 04 08 06 b7 cf 50 00 00 00 0f 12 21 30 00 00 3c 30 40 00 00 +00 00 20 00 00 09 70 04 90 00 00 00 02 e0 a5 20 00 00 51 03 80 00 00 14 01 60 a0 00 00 00 70 c3 80 49 00 00 01 60 1c 0a 50 00 +00 00 00 00 00 0d a2 13 00 00 01 e0 00 00 00 00 00 09 01 50 10 00 01 c6 97 e5 00 00 00 19 00 3a 21 32 00 00 00 01 dc 50 00 +00 00 00 00 00 00 f0 04 90 00 00 02 24 00 00 00 00 04 50 a1 00 00 00 34 00 10 50 00 00 02 58 07 00 49 00 00 82 40 00 05 02 00 +00 00 00 00 98 0d a2 13 00 00 00 42 2e 00 00 00 00 00 1b 18 10 00 00 00 21 be 20 00 00 00 0a 7a 21 32 00 00 2e 20 00 24 00 +00 00 00 00 01 00 78 04 90 00 00 2c 02 c0 a5 00 00 00 00 ad 00 00 00 00 01 4e d1 00 00 00 70 03 80 49 00 08 01 40 34 e1 80 00 +00 00 10 00 90 0d a2 11 01 00 02 00 00 00 00 01 00 07 00 b0 10 00 02 e3 97 c5 00 03 00 0f 81 72 21 30 00 00 00 70 0f 03 00 +00 00 01 00 01 08 f8 04 90 00 00 1c 24 00 00 00 10 00 08 a5 00 40 00 16 40 00 50 00 30 00 b0 a7 80 49 00 00 00 04 00 b0 30 00 +00 00 00 00 81 9f f3 d5 00 00 00 00 2e ba 44 00 00 01 80 90 01 0a 02 03 8c 00 00 00 00 07 8b fa 21 30 00 00 20 7b 68 a5 00 +00 00 00 00 01 08 9c 28 10 00 00 34 2f fa 80 40 00 00 78 09 00 00 40 2c 00 40 a5 00 00 00 09 f7 80 49 10 00 c2 40 3f 05 50 04 +00 00 1a 80 80 09 7a 81 00 60 01 42 bd ba 14 01 80 08 01 b0 08 00 00 02 05 e5 00 01 80 00 18 d2 21 30 00 00 00 02 0c 50 00 +00 00 00 10 01 0f d0 3d 50 00 00 02 42 ca 02 40 00 00 90 9d 00 00 00 00 40 00 50 00 00 00 01 03 80 49 00 00 00 00 15 0a 01 00 +00 00 30 00 00 0f b3 d5 00 c0 00 12 8e da 44 00 00 50 01 70 00 00 03 60 1c 00 00 01 00 00 1a 92 21 30 00 82 00 69 7c 50 00 +00 00 01 00 00 00 90 28 10 04 00 3c 6b fa 80 40 00 20 00 d1 80 40 00 3c 00 60 a5 00 10 00 00 07 80 49 00 04 00 00 01 05 00 00 +00 02 00 00 00 01 62 95 00 00 02 40 25 b8 54 00 00 03 0c d8 00 00 00 00 04 a5 00 00 23 11 00 82 21 30 00 00 20 02 1c 50 00 +00 00 00 00 0d 0f bc 15 50 00 00 2c 02 e9 40 40 00 00 00 ef 02 00 00 00 00 00 50 00 01 02 08 03 34 49 00 00 02 c2 54 0a 00 00 +00 00 00 00 19 af 23 d5 00 00 06 03 2f 9a 44 00 08 09 00 b8 01 00 25 60 3e 8f 52 00 00 00 09 ba 21 30 00 00 00 7d 7e 50 00 +00 00 20 00 00 0e 9c 28 10 00 00 2c 6d ea 80 40 01 00 50 01 80 00 00 00 02 f0 a0 00 00 00 00 a7 80 49 00 00 00 06 41 05 00 10 +00 00 00 00 19 89 ba 81 00 00 02 06 24 da 44 00 00 05 1a f0 01 00 02 00 05 e5 00 00 10 03 98 b2 21 30 00 00 20 7a 0a 50 08 +00 00 00 00 09 00 d0 3d 50 00 00 2c 3a cf 40 40 00 00 f0 03 02 00 a0 14 20 10 50 00 00 80 01 03 80 49 00 00 03 c4 15 0a 00 00 +00 00 00 00 d8 1f 73 d5 00 00 11 c3 8e ba 44 00 10 25 81 d0 01 0a 00 00 55 8f 50 00 00 00 00 92 21 38 00 00 00 00 de f5 00 +00 00 00 00 05 0a 90 28 10 10 00 80 03 6a 80 40 02 84 00 ad 82 00 00 00 28 50 a0 00 00 00 00 07 00 49 00 00 00 00 07 0a 00 00 +00 00 30 00 d8 18 62 81 00 c0 00 c3 ad c0 50 03 00 05 81 78 00 00 01 66 c5 c5 00 01 20 03 81 fa 21 10 00 00 00 34 00 00 00 +00 00 01 00 05 0a 54 14 10 04 00 1e 25 f0 5a 00 10 00 00 a3 02 00 00 00 34 00 50 00 31 00 00 d9 00 85 00 00 00 03 c0 00 00 00 +00 00 00 00 00 d0 70 14 00 00 01 40 00 12 40 00 00 00 00 00 00 00 01 42 b5 ea 02 80 00 50 00 f7 bd 40 00 00 34 2c 5a e3 60 +c0 00 00 00 00 1f 90 02 80 00 08 02 01 ca 18 00 00 40 00 00 00 00 00 36 6d e0 f5 00 00 00 00 0b 82 80 00 00 63 e6 3c 84 34 00 +00 00 18 00 80 0f f9 58 00 04 00 06 a1 ea 00 00 00 00 00 00 00 10 c0 02 06 8a 00 00 00 00 00 7e b4 40 82 00 14 04 6e a1 40 +00 00 00 00 07 00 b7 08 00 00 20 00 02 50 50 08 00 00 00 00 00 00 00 34 00 10 a0 00 00 00 00 00 03 44 80 a0 e3 62 0d 87 a6 8c +00 00 30 00 80 00 70 04 08 00 00 00 20 12 40 00 00 00 00 00 00 00 01 40 20 de 20 80 08 01 00 7b 81 40 00 00 04 00 58 c1 50 +00 00 01 00 01 00 90 00 84 40 00 74 01 ca 18 00 00 02 00 00 00 00 00 02 2d db d1 01 01 00 00 90 80 14 40 00 00 20 3c 9c b6 08 +00 02 00 00 18 07 b8 b8 00 0e 01 c0 21 a0 50 00 00 00 00 00 00 00 11 42 95 ea 52 00 00 01 81 02 81 40 00 00 06 02 ee e5 40 +80 00 00 00 00 00 36 6f 40 00 a0 02 02 c0 0a 00 00 00 00 00 00 00 00 02 6d c0 55 00 00 00 00 93 00 28 00 00 03 42 c7 8a 46 14 +00 00 00 00 30 1d 38 41 08 00 00 00 05 8a 02 00 00 00 00 00 00 02 00 e2 21 8a 02 00 00 07 81 32 bd 40 00 a0 06 00 fe a0 40 +00 00 20 00 00 08 50 0c 10 00 00 24 00 10 a0 00 0a 00 00 00 00 00 40 00 00 d0 50 00 00 00 70 cb 42 80 00 04 00 00 04 0f ac 10 +00 00 00 00 30 d7 fc 00 00 02 01 e2 3d ca 50 00 10 20 00 00 00 00 c0 00 1f af 50 00 00 00 09 d3 34 40 80 00 16 01 6e a1 61 +80 00 00 00 00 0e 37 40 40 00 00 0e 43 e0 55 00 00 84 00 00 00 00 00 2c 00 c0 50 08 00 00 70 db 02 80 00 00 00 03 45 9b 54 00 +00 00 00 00 01 eb 76 00 00 00 00 47 86 aa 00 00 10 00 00 00 00 40 00 60 24 98 00 00 00 18 01 02 94 00 00 00 00 20 5b c1 60 +00 00 00 00 03 00 f7 80 00 00 0a 02 40 20 a0 00 80 82 00 00 00 04 00 24 01 5b 00 00 00 00 f0 e5 42 80 20 00 00 04 3d 9c b4 08 +00 00 10 00 79 eb a1 00 09 00 e0 42 ad ca 50 00 00 20 00 00 00 00 01 c0 24 e8 00 30 00 01 00 d7 74 40 4c 00 24 63 ee e5 41 +00 00 01 00 00 10 3c 34 00 00 00 02 64 c0 aa 00 00 05 00 00 00 00 00 24 03 40 00 00 00 00 90 fb 2e 80 00 c0 00 40 37 8a 46 90 +00 00 00 00 18 0d 2a 95 00 00 02 00 5c ca 04 00 00 00 00 00 00 00 02 07 de 8b 7c 80 11 83 1a db bd 40 00 01 26 00 40 ff 40 +00 00 00 00 00 0a 34 17 d0 00 00 3c 20 c0 fa 40 00 00 00 00 00 00 00 04 61 68 12 42 02 00 f1 05 02 80 00 00 03 c0 0c 00 0c 00 +00 00 18 00 f8 01 73 c1 00 60 03 c6 c0 8e 24 00 00 00 00 00 00 60 02 02 9c 99 5c 00 00 00 00 5b a0 04 8a 00 4e 60 00 5a 40 +00 00 00 00 01 80 18 3e 90 00 00 2e 29 dc d1 40 00 00 00 00 00 00 00 04 6f cf 56 40 00 08 00 f1 43 94 00 a0 02 64 04 0a 5c 00 +00 00 00 00 81 85 70 15 02 00 00 c7 80 ec 54 00 03 80 00 00 00 c0 01 46 1e 8b 7c 00 00 40 1e 12 61 40 10 00 40 00 59 01 10 +00 00 00 00 01 0a bc 17 d0 00 00 00 02 48 ca 41 01 00 00 00 00 04 80 36 00 e9 12 40 00 07 01 0f 72 00 00 00 00 00 0c b0 00 00 +00 02 00 00 01 8d 62 81 00 00 00 00 24 8c f0 00 00 00 00 00 00 00 00 66 14 99 5c 00 00 2f 00 03 81 42 00 80 20 61 6c f5 00 +00 00 00 00 00 40 18 3d 52 00 00 0c 00 5f 4b 00 00 00 00 00 00 00 01 00 02 6f 56 40 80 05 f0 07 40 28 00 00 11 c4 02 0f 50 00 +00 00 00 00 80 19 fa 81 00 00 d2 60 16 c8 70 20 10 80 00 00 00 00 00 00 3e 9b 7c 00 00 00 0e fb bd 40 00 00 20 38 18 a0 00 +00 00 20 80 05 08 14 3e 98 02 00 c4 00 00 87 00 02 80 00 00 00 02 80 1c 3b e8 12 48 08 00 00 05 42 80 00 00 08 44 0d 05 00 00 +00 00 00 00 80 85 62 80 00 00 01 c0 14 c8 70 20 00 00 00 00 00 00 0a 00 56 99 5c 00 28 07 80 1b a0 00 80 00 40 01 6c fa 00 +00 00 00 00 0b 10 08 28 0c 00 08 02 00 00 87 00 00 00 00 00 00 00 01 6c 21 4f 56 40 01 00 98 01 c3 94 80 00 08 00 02 0f a0 00 +00 00 00 00 00 09 fb d5 00 00 02 00 4f 88 70 20 00 50 00 00 00 04 00 60 3e 9b 7d 00 00 00 0e 37 3e c0 00 02 04 00 18 fa 00 +00 00 00 20 00 00 d4 14 12 00 00 1c 38 10 87 00 00 00 00 00 00 00 20 00 22 6d 12 40 00 00 11 81 af fc 00 00 00 00 0d 0f 50 00 +00 00 30 00 10 1d b2 81 00 40 00 00 15 88 70 20 00 00 00 00 00 c0 80 03 f6 9d 14 00 00 00 00 83 81 40 04 80 04 00 5f 85 00 +00 00 03 00 00 88 18 3d 50 04 00 00 00 30 87 08 00 00 00 00 00 04 00 00 6b e9 47 40 01 08 f0 05 40 28 20 44 b0 00 2c ad 50 00 +00 00 80 30 d1 88 73 45 00 00 e0 40 26 ec 10 00 00 80 00 00 00 00 02 00 01 ea 00 00 00 0f 01 72 21 30 00 02 1e 03 fd fd 00 +00 00 20 00 01 8d 56 b8 90 00 02 02 00 de c7 00 00 00 00 00 00 00 08 14 01 c0 50 00 00 00 f0 f5 24 49 0c 00 00 00 34 f5 80 80 +00 00 18 00 00 01 6a 95 00 00 21 40 0c ee 22 20 00 00 00 00 00 00 00 07 9e ea 00 01 80 08 01 f2 21 30 00 00 0e 29 ec f5 00 +08 00 04 00 00 00 50 15 50 00 40 02 00 10 e2 00 00 00 00 00 00 10 00 00 00 20 a0 00 00 00 f0 eb 20 49 04 00 00 20 3c 05 00 00 +00 00 10 00 50 ad b3 d5 00 00 00 00 3e cf 50 80 00 00 00 00 00 00 00 00 16 aa 50 0b 00 05 18 12 61 38 00 04 00 2f f8 81 02 +00 00 01 00 05 1b 50 28 10 00 00 00 00 e0 a0 00 00 00 00 00 00 00 00 64 00 40 55 00 10 00 08 05 20 49 00 00 60 06 bc 0d 10 00 +00 01 00 00 38 03 6a 95 00 00 00 00 1e c0 50 80 03 00 00 00 00 00 03 e0 3e ef 52 00 00 01 80 d2 21 30 00 00 60 2b 5e e5 00 +00 00 00 00 0d 80 18 15 50 00 00 00 00 00 05 00 00 00 00 00 00 40 00 1c 03 d0 ff 00 00 00 00 0b a0 49 00 10 0b c4 1f 88 02 00 +00 00 00 00 18 db 23 d5 00 04 03 e2 c1 fb 10 10 00 00 00 00 00 00 01 e0 26 cf 00 00 00 03 81 12 6d f0 00 00 a0 3a fa 05 00 +08 00 00 80 00 18 5c 28 10 02 00 0e 2a cc 72 00 08 01 00 00 00 42 00 00 00 e0 a5 00 08 28 08 c1 33 7b 01 00 11 44 0c 05 50 10 +00 00 00 00 99 83 e8 15 00 00 03 60 1e c0 50 00 00 00 00 00 00 12 00 00 57 c8 70 a0 00 08 1d da 21 30 00 20 9e 04 ee f7 00 +00 00 00 03 01 00 00 01 50 00 00 0c 00 20 05 08 00 00 00 00 00 00 00 24 3c 10 87 00 00 00 10 8b 20 49 00 00 10 63 ef bf f0 00 +00 00 01 02 00 0d 73 d5 00 0c 11 e7 e5 ca 00 08 00 50 00 00 00 00 01 c6 80 18 10 00 00 09 80 12 61 30 00 40 00 72 7c a7 02 +08 00 00 00 40 00 58 28 18 00 a0 80 34 c0 f5 00 00 00 00 00 00 00 00 02 01 cc 42 00 00 80 10 05 34 49 00 08 00 06 4e 0a 20 80 +00 00 30 00 90 0d aa 81 00 00 01 42 c0 c0 50 08 00 00 00 00 00 04 0b 62 5d ca 00 03 28 07 80 1a 2d f0 00 20 1c 7a 1e f5 00 +00 00 03 00 87 80 74 3e 90 00 00 24 2a c0 0a 00 00 00 00 00 00 40 a1 1c 68 10 a0 00 31 00 08 03 a3 7b 80 04 01 c4 1d 0f a2 10 +00 00 00 00 38 87 67 fc 00 00 00 00 56 e5 f4 00 00 00 00 00 00 00 06 00 1c ca 54 00 00 28 00 9a 2d d0 00 80 06 03 6e e2 41 +00 00 00 00 00 00 3b be c0 40 00 00 20 10 5f 60 00 00 00 00 00 40 00 04 34 59 6a 40 00 00 10 03 a3 7b 10 04 00 02 67 9c 35 84 +00 00 18 00 50 08 01 f9 08 60 01 e0 66 8c 10 01 80 00 00 00 00 70 0a 00 45 8f 50 01 90 00 0e 07 03 c0 0a 04 14 06 7e e2 40 +80 00 00 00 00 8b b0 2f 50 00 00 24 35 7f 42 08 00 00 00 00 00 80 01 04 3d c0 ff 01 02 80 01 00 00 3c 20 20 02 63 76 8c 34 00 +00 00 30 08 50 0f 71 41 00 c0 00 07 d5 85 00 00 00 00 00 00 00 00 00 00 01 a2 00 31 00 00 0e 00 00 00 00 00 00 23 6e e3 40 +00 00 03 00 00 80 98 29 50 0c 00 00 78 20 50 00 00 00 00 00 00 80 00 00 34 c0 10 00 30 30 00 00 00 00 00 00 00 04 1e d4 34 08 +00 02 00 00 00 07 b0 01 00 00 01 40 2d 8a 50 20 00 00 00 00 00 00 21 c0 05 8e 70 00 00 00 00 00 00 00 00 a0 46 71 cc a0 00 +00 00 00 00 0d 00 f2 42 10 00 00 2e 01 50 80 00 00 40 00 00 00 00 00 1c 00 ce d3 01 00 00 00 00 00 00 00 00 00 02 c5 0f a0 00 +00 00 00 00 00 03 e9 69 00 00 02 00 75 a0 20 00 00 00 00 00 00 00 00 47 4c bc 74 00 09 80 00 00 00 00 01 00 00 05 db e3 40 +00 00 20 00 03 0a 5b 56 d0 00 00 1c 36 6b 00 08 00 00 00 00 00 40 00 be 20 78 c2 40 01 00 00 00 00 00 00 00 00 42 3d c4 36 00 +00 00 00 00 51 80 79 54 00 00 00 00 0f fd 10 00 00 00 00 00 00 00 08 40 05 9f 70 00 10 00 00 00 00 00 00 00 20 07 5a f1 40 +00 00 00 00 09 00 f0 2a 80 00 00 3c 03 ca d2 00 00 00 f0 00 00 00 01 40 01 ca ff 00 00 80 d0 00 00 00 00 00 00 42 36 eb 06 04 +00 00 00 00 00 89 70 14 08 00 00 06 20 fd 10 00 08 00 00 00 00 00 01 c0 1c c4 50 20 00 20 00 00 00 00 00 c0 1c 77 6f e3 40 +00 00 00 00 00 0a 94 21 42 00 00 00 3d dc e2 00 01 01 00 00 00 40 00 0e 02 c0 85 00 00 04 00 00 00 00 00 0a 01 e3 76 d4 34 04 +00 00 30 00 50 07 b7 bc 00 40 01 c0 2d a5 20 23 00 00 00 00 00 40 00 00 3d 85 b0 33 00 01 00 00 00 00 04 0c 04 03 dc a0 00 +00 00 01 00 00 00 f2 3f c0 24 00 00 01 60 51 00 10 00 00 00 00 0c 00 00 00 d0 02 00 30 00 08 00 00 00 00 40 00 00 05 0f a0 00 +04 00 00 00 50 08 02 95 04 10 03 c6 ec b7 47 80 00 00 00 00 08 80 00 00 1e ef a0 00 10 55 00 5e 3d 40 00 40 00 64 cb 00 70 +c0 00 00 00 00 8b d0 16 90 11 00 44 2e 58 50 40 00 00 00 00 00 00 02 00 00 10 fa 00 03 00 58 b0 43 d4 00 00 00 02 3e b1 05 9c +00 00 18 00 70 07 a3 e8 00 60 82 02 95 ac 00 00 00 00 00 00 00 a0 16 00 0c a8 10 20 10 05 1e 9a bd c0 02 46 26 05 4e e2 40 +40 00 00 00 00 80 04 3e 80 00 00 2c 33 fe fc 00 00 00 00 00 00 1a 0c bc 03 40 8b 10 02 80 08 b3 e3 fc 00 a0 00 43 97 cc 34 08 +00 00 00 00 00 01 3b fc 48 c0 01 42 ed a4 77 b0 00 00 00 00 00 00 01 40 5f a8 00 00 00 08 0b 5e 17 c0 00 20 04 79 4e e2 40 +40 00 00 00 00 00 34 3b c0 4c 00 3e 7a 50 42 41 00 00 00 00 00 40 00 00 20 1f 80 00 00 00 b1 d0 41 7c 00 04 03 e4 35 9c 34 00 +00 02 00 00 79 83 33 fc 40 10 00 02 c4 aa 00 00 00 00 00 00 00 00 a0 00 40 0f 04 00 00 00 00 3b 3d 40 80 40 00 75 5c e2 40 +00 00 00 00 00 80 14 3d 40 01 00 00 7f ca db 00 00 00 00 00 00 80 00 00 2c 00 f0 c0 40 00 d0 97 82 04 00 02 01 c7 57 9c 34 04 +00 00 04 00 80 11 63 d4 00 00 e5 40 05 89 10 20 00 00 00 00 00 00 02 00 37 ef 70 00 20 09 80 1b 3f c8 c0 0a 06 25 5b e2 40 +00 00 20 40 05 0a 00 3d 40 00 00 02 2c 50 e3 00 00 00 00 00 00 40 04 bc 03 ef ff 01 80 00 10 09 03 dc 40 00 00 06 f5 8c 34 18 +00 00 03 80 00 00 32 bc 00 00 00 00 26 ea 35 24 28 00 00 00 00 00 10 00 5d c0 50 80 00 07 01 13 bd c0 00 80 2e 01 4d e2 40 +00 00 00 18 00 00 10 17 c8 00 00 3c 03 60 03 48 41 00 00 00 00 40 01 00 20 30 05 00 00 00 00 ed 2b fc 02 04 01 c2 17 8c 36 00 +08 00 00 00 00 11 63 d4 00 02 03 47 dc cf 50 00 00 00 00 00 08 00 00 e2 1f af 52 00 00 09 01 5b a8 00 00 00 00 25 6c a0 00 +00 00 00 00 00 0a 90 3f c0 00 00 06 60 60 ff 00 00 00 00 00 00 00 40 02 3c d0 ff 08 00 02 70 f0 c2 80 04 00 00 07 01 0a 02 10 +00 00 10 00 58 00 03 fc 04 c0 14 00 04 c5 04 20 00 00 00 00 00 40 02 47 9d e2 00 20 00 20 00 00 00 00 0c 00 00 02 6e a4 42 +00 00 03 00 00 00 00 3f c8 14 00 80 02 70 10 40 80 00 00 00 00 44 00 3c 40 20 20 00 80 04 00 00 00 00 00 50 04 00 0f 0e 56 08 +40 00 00 00 91 81 22 80 00 00 00 00 40 aa f6 00 00 00 1e 80 00 00 04 06 01 af 04 00 00 00 08 72 21 30 00 00 00 01 5c 85 00 +00 00 20 00 09 0e 14 00 00 00 02 00 2b c0 5f 40 00 00 00 03 00 00 00 00 00 00 f0 40 00 00 01 03 00 49 0c 00 00 02 dc 9e a0 00 +00 00 18 00 80 09 b8 0d 0d 60 01 40 24 e0 00 01 80 00 00 80 00 60 02 60 00 cf 04 01 82 00 00 72 21 30 00 00 1f 03 6e c1 02 +08 00 00 00 01 00 30 28 d8 20 02 2c 00 7d 2e 00 00 00 00 05 00 01 00 04 00 00 f0 40 00 00 00 09 00 49 00 00 00 03 cf 0e 60 00 +68 04 30 00 80 c3 b9 09 25 c0 02 00 4d 8f 00 80 00 00 00 80 00 02 00 07 80 cf 04 0b 00 00 19 52 21 30 00 44 26 7b 7d a7 00 +03 82 83 00 0b 10 76 62 d2 04 00 3c 2a 60 aa 00 00 20 00 c5 00 00 00 00 40 00 f0 40 10 00 00 83 80 49 00 02 02 40 16 ea 20 00 +00 73 00 00 18 0d ab 04 00 00 04 07 20 82 00 00 04 0f 00 00 00 00 62 00 00 af 04 00 10 01 99 52 21 30 00 00 86 31 5c c5 02 +00 00 00 00 00 8c f7 f9 40 00 00 80 00 5d 10 00 00 00 d8 09 00 00 80 1c 00 10 f0 40 00 82 00 89 80 49 00 00 00 32 c1 0c 50 00 +00 00 00 00 00 07 6b e8 00 00 10 03 c6 aa 00 00 00 07 00 00 00 00 02 60 00 8f 04 00 00 50 01 7a 21 30 40 00 00 05 ce 03 02 +00 00 20 00 00 00 0c 3e 80 00 00 80 78 10 a0 00 00 00 08 0f 00 00 00 04 00 10 f0 40 00 02 90 f3 00 49 00 00 00 03 f5 05 31 00 +48 00 00 00 18 01 6b d4 00 00 08 00 00 85 00 00 80 00 00 00 00 00 e0 c0 41 8f 04 10 00 00 00 5a 21 30 00 06 04 28 00 00 00 +00 c0 00 00 01 00 10 3f c0 00 00 40 02 d0 a0 08 00 00 90 0d 00 00 00 02 20 00 f0 61 40 00 00 09 00 49 00 00 00 26 00 00 00 00 +00 00 00 00 18 f1 3c 08 00 00 00 e2 06 b1 f0 10 00 07 9e 00 00 00 00 03 01 8f 04 00 00 49 80 5a 21 30 01 0c 04 26 f8 f5 00 +08 02 c0 00 00 08 16 85 40 00 00 00 43 d8 1a 00 00 00 08 07 00 00 00 00 40 00 f0 41 00 02 10 03 80 49 00 10 00 63 ee 0a 00 00 +40 00 30 00 00 00 39 6d 08 c0 03 c0 3d a8 10 23 00 01 00 00 00 c0 c1 c0 7d da 50 03 00 09 00 5a 21 12 40 00 14 00 d8 42 02 +00 00 01 00 00 09 50 29 d0 4c 00 04 01 d0 d1 00 30 00 08 03 00 0c 00 02 3b fc 85 01 30 04 10 09 80 49 05 00 00 00 1f 0e 21 00 +00 00 +11 01 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 01 c0 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 0d 01 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 81 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 80 30 00 00 00 00 00 00 40 80 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 10 00 00 8b c3 d5 00 40 00 02 06 0f 54 00 00 00 00 00 00 40 00 02 25 0a 04 03 00 00 08 38 3d 52 0c 00 00 22 d0 a0 40 +00 00 03 00 00 19 fe a8 10 04 00 00 05 7a a0 40 00 00 00 00 00 0c 00 06 04 5a f5 40 30 00 10 15 ba 81 00 40 00 60 47 af 54 00 +00 00 00 00 00 85 c1 41 00 00 00 42 35 d7 24 00 00 00 00 00 00 00 00 02 2f 0f 54 00 00 00 08 b8 3d 50 00 00 00 61 f0 50 48 +00 00 00 00 01 81 bf bd 50 00 00 26 06 1e b1 40 02 80 00 00 00 00 00 06 07 ee a0 40 00 00 18 1f ea 81 00 00 00 67 ed ef 54 00 +00 00 00 00 11 05 35 c9 00 00 00 00 16 05 04 00 00 00 00 00 00 00 02 c2 e5 0f 54 00 00 00 0f 30 3d 50 00 00 00 01 60 50 40 +00 00 00 00 00 0e 86 ec 50 00 00 00 02 da f5 40 00 38 00 00 00 00 00 20 01 ec a0 40 00 00 01 a5 e2 81 00 00 00 00 3d ef 54 00 +00 02 00 00 00 0d 81 41 00 00 00 02 b4 d7 24 00 20 00 00 00 00 00 00 02 9e 05 04 00 00 00 80 b0 3d 50 00 00 00 43 60 50 40 +00 00 00 00 00 00 3e bd 50 00 00 00 00 1a b1 40 00 00 00 00 00 00 00 00 04 5a f5 40 00 00 70 0d aa 81 00 00 00 07 8d af 54 00 +00 00 00 00 10 0f 75 c9 00 00 00 40 3f 05 04 00 00 00 00 00 00 00 00 40 27 0f 54 00 00 01 00 fc 14 10 00 00 04 03 f0 50 40 +00 00 20 00 09 8a 02 ec 50 00 00 26 60 ca f5 40 00 00 00 00 00 00 00 20 61 5a a0 40 00 00 99 8b ab d5 00 00 03 c6 1c af 54 00 +00 00 00 00 00 07 c1 41 00 00 01 40 1d d7 24 00 00 00 00 00 00 00 00 40 2d 0a 04 00 00 01 00 d4 14 10 00 00 04 01 f0 50 40 +00 00 00 00 00 18 3b bd 50 00 00 20 60 0e b1 40 00 00 00 00 00 00 00 20 62 4e f5 40 00 00 81 83 3b d5 00 00 02 06 0c ef 54 00 +00 00 00 00 00 0b 43 d5 00 00 02 c0 1e 05 04 00 00 00 00 00 00 00 00 00 3e 05 04 00 00 05 00 30 3d 50 00 00 1c 01 60 50 40 +00 00 01 80 00 00 f7 a8 10 06 00 20 00 ce f5 40 00 00 00 00 00 06 00 00 02 ee f5 40 1a 00 80 07 6a 81 00 60 00 02 9c ef 54 00 +00 00 00 00 10 01 c3 e9 00 00 00 00 2c 0f 54 00 00 00 00 00 00 00 01 44 1e 05 04 00 00 00 00 b4 3d 50 00 00 00 03 d0 f5 40 +00 00 00 00 08 00 3f a8 10 00 00 04 01 ca a0 40 00 10 00 00 00 00 00 14 7a 4a f5 40 00 00 00 0d 72 81 00 00 00 00 15 8a 04 00 +00 00 10 00 00 8f c1 41 00 40 00 02 3d 05 04 00 00 00 00 00 00 40 00 02 06 0f 54 01 00 0f 08 78 3d 50 0c 00 02 23 f0 50 40 +00 00 01 00 00 01 b6 bd 50 04 00 00 06 fa f5 40 00 38 00 00 00 0c 00 00 65 fa a0 40 10 00 00 1d ea 81 00 c0 01 c0 7d af 54 00 +00 00 00 00 00 85 75 c9 00 00 00 02 15 c7 24 00 00 00 00 00 00 00 00 42 16 0f 54 00 00 00 08 38 3d 50 00 00 00 61 70 50 40 +00 00 00 00 01 81 87 ac 50 00 00 06 06 1f b1 40 00 00 00 00 00 00 00 26 65 ea a0 40 00 00 18 1f ea 81 00 00 00 67 e7 ef 54 00 +00 00 00 00 00 05 81 41 00 00 02 40 14 05 04 00 00 00 00 00 00 00 03 c0 3c 05 04 00 00 0f 00 f0 14 10 00 00 00 01 60 50 40 +00 00 00 00 00 00 b6 bd 50 00 00 00 02 fa f5 40 00 00 00 00 00 00 00 00 01 5a f5 40 00 00 00 0b eb d5 00 00 00 00 3d af 54 00 +00 02 00 00 00 ed 35 c9 00 00 00 00 34 c7 24 00 38 00 00 00 00 00 00 00 3c a7 24 00 00 00 00 d0 14 10 00 00 00 03 60 50 40 +00 00 00 00 00 01 06 ac 50 00 00 00 00 1b b1 40 01 00 00 00 00 00 00 00 00 1a b1 40 00 00 58 07 eb d5 00 00 00 00 07 af 54 00 +00 00 00 00 10 0f c1 41 00 00 00 42 fd 05 04 00 00 00 00 00 00 00 00 40 07 0f 54 00 00 01 00 f4 14 10 00 00 04 03 f0 50 40 +00 00 20 00 09 98 32 bd 50 00 00 26 60 ea f5 40 00 00 00 00 00 00 00 26 29 ca a0 40 00 00 99 83 ab d5 00 00 02 66 1c af 54 00 +00 00 00 00 10 07 75 c9 00 00 00 40 1d c7 24 00 00 00 00 00 00 00 13 64 16 0f 54 00 00 01 00 38 3d 50 01 0a 06 03 d0 a0 40 +00 00 00 00 08 18 03 ac 50 00 0c 20 60 0f b1 40 04 10 00 00 00 00 00 9e 29 da a0 40 00 00 81 8f 32 81 00 10 02 e6 04 ef 54 00 +00 00 00 00 90 05 81 41 00 00 00 c0 14 05 04 00 00 00 00 00 00 00 60 00 05 0f 54 00 00 07 0a 74 3d 50 00 00 14 42 40 f5 40 +00 00 01 80 00 0a 33 bd 50 06 00 20 00 ee f5 40 00 00 00 00 00 06 00 00 01 da a0 40 18 00 80 0f 62 81 00 60 00 06 bd 8a 04 00 +00 00 00 00 00 0b 43 d5 00 00 00 00 0d 0f 54 00 04 00 00 00 00 00 00 20 15 0f 54 00 00 00 00 d0 14 12 00 00 00 01 60 50 40 +00 00 00 00 00 00 56 28 10 00 00 00 03 5a a0 40 02 80 00 00 00 00 00 1e 01 de a0 40 00 00 00 0f ab d5 00 00 01 60 06 af 54 00 +00 00 10 00 01 8f c1 41 00 40 00 02 0e 0f 54 00 00 00 00 00 00 40 00 02 3d 05 04 03 00 00 8d 07 2c 58 0c 00 1c 21 e0 f5 40 +00 00 03 00 00 0f fe bd 50 0c 00 00 05 78 a0 40 00 00 00 00 00 0c 00 00 06 7a f5 40 30 00 10 11 ea c5 00 40 02 60 77 ca 04 00 +00 00 00 00 00 85 7d c9 00 00 00 02 15 f7 24 00 00 00 00 00 00 00 00 02 01 8b 14 00 00 05 00 b4 3e 90 00 00 00 61 d0 50 40 +00 00 00 00 01 81 87 ec 50 00 00 06 26 1e b1 40 00 00 00 00 00 00 00 06 04 ff b1 40 00 00 18 0b 7a 81 00 00 00 03 ff ef 54 10 +00 00 00 00 98 05 81 41 00 00 02 c0 16 05 04 00 00 00 00 00 00 00 02 c0 14 c4 24 00 00 00 18 30 3d 50 00 00 2c 01 d0 f5 40 +00 00 00 00 05 80 fe bd 50 00 00 20 03 da f5 40 00 38 00 00 00 00 00 26 02 61 e7 40 00 00 00 b5 ba 81 00 00 02 00 3e 8a 04 00 +00 02 00 00 00 0d 3d c9 00 00 00 20 34 f7 24 00 00 00 00 00 00 00 00 00 34 87 24 00 00 00 88 10 3e 90 00 00 00 23 c0 50 40 +00 00 00 00 00 00 06 ec 50 00 00 04 00 1a b1 40 00 00 00 00 00 00 00 00 00 1b b1 40 00 00 71 bb 3a 81 00 00 00 00 1f af 54 00 +00 00 00 00 10 0f c1 41 00 00 00 40 3f 05 04 00 00 00 00 00 00 00 00 40 3d 05 04 00 00 00 00 38 3d 50 00 00 06 03 f0 50 40 +00 00 20 00 09 98 7a bd 50 00 00 26 61 ca f5 40 00 00 00 00 00 00 00 20 60 6a f5 40 00 00 19 85 6a 81 00 00 02 46 06 af 54 00 +00 00 00 00 10 07 7d c9 00 00 00 40 1d f7 24 00 00 00 00 00 00 00 00 40 1d 87 24 00 00 00 00 b4 3e 90 00 40 04 02 50 a0 40 +00 00 00 00 08 18 03 ec 50 00 00 21 60 0e b1 40 00 00 00 00 00 00 00 20 60 0f b1 40 00 00 01 83 32 81 00 02 16 06 34 ef 54 00 +00 00 00 00 00 05 81 41 00 00 01 44 16 05 04 00 00 00 00 00 00 00 01 c4 14 05 04 00 00 01 00 03 2c 50 00 40 2c 24 00 f0 40 +00 00 01 80 00 00 7b bd 50 06 00 00 29 ce f5 40 00 00 00 00 00 06 00 20 60 6e f5 40 18 00 80 01 3a c5 00 62 02 02 81 8f 04 00 +00 00 00 00 00 0f 03 d5 00 00 00 00 3d 0f 54 00 28 00 00 00 00 00 00 00 05 0f 54 00 00 01 00 14 3e 90 00 00 00 2a d0 f5 40 +00 00 00 00 00 00 d7 28 10 00 00 00 01 58 a0 40 01 10 00 00 00 00 00 00 03 58 a0 40 00 00 80 03 72 81 00 00 00 60 45 8a 04 00 +00 00 10 00 00 8f c1 41 20 40 02 42 1f 0f 56 00 00 00 00 00 00 c0 00 03 b7 05 04 01 00 00 08 fc 14 10 04 00 00 3c c0 5a 40 +00 00 03 00 00 01 b6 bd 50 0c 00 00 07 78 a0 40 00 00 00 00 00 0c 00 0e 06 5a f5 60 30 00 00 1b 6b d5 00 c0 00 00 00 0a 54 00 +00 00 00 00 00 85 75 c9 00 00 00 02 07 0f 54 00 00 00 00 00 00 00 80 02 15 97 24 00 00 00 08 57 5c 90 00 00 00 00 10 0f 40 +00 00 00 00 01 81 87 ac 50 00 00 06 05 f8 a0 40 00 00 00 00 00 00 00 06 06 1a b1 40 00 00 00 18 7a c5 00 00 00 06 01 e0 f4 00 +00 00 00 00 70 05 81 41 00 00 00 c0 3c e7 24 00 00 00 00 00 00 00 00 00 16 05 04 00 00 07 00 58 14 10 00 00 36 24 7a 82 00 +00 00 00 00 0d 80 b6 bd 50 00 00 00 02 1b b1 40 00 00 00 00 00 00 00 00 02 5a f5 40 00 00 80 0b 6b d5 00 00 07 60 1d b8 10 08 +00 02 08 00 00 cd 35 c9 00 20 00 00 34 05 04 00 00 00 00 00 00 20 00 00 34 97 24 00 80 07 0c d3 5c 90 02 01 00 27 40 80 00 +00 00 00 00 00 01 06 ac 50 00 00 00 01 fa f5 40 00 00 00 00 00 00 00 00 00 1a b1 40 00 00 00 10 6a c5 00 00 08 e0 25 ae 00 a0 +00 00 00 00 10 0f c1 41 00 00 60 43 fd e7 24 00 00 00 00 00 00 00 00 42 3f 05 04 00 00 01 00 fc 14 10 00 00 2c 40 30 d1 00 +00 00 00 00 09 98 32 bd 50 00 00 26 60 0b b1 40 00 00 00 00 00 00 00 26 64 4a f5 40 00 00 99 83 2b d5 00 00 00 03 0c ad 10 20 +80 00 00 00 10 07 75 c9 00 00 00 40 1d 05 04 00 00 00 00 00 00 00 00 40 1d 97 24 00 00 01 00 07 6c 50 00 00 24 3a e0 aa 00 +00 00 00 00 08 18 03 ac 50 00 00 20 61 ee f5 40 00 00 00 00 00 00 00 20 60 0e b1 40 00 00 81 81 3a c5 00 00 00 07 35 ca 50 00 +80 01 00 00 00 05 81 41 00 00 c0 06 d4 e7 24 00 00 00 00 00 00 00 00 00 16 05 04 00 00 00 00 18 3e 90 00 00 00 20 d0 ca 00 +08 00 01 80 00 00 33 bd 50 06 02 00 28 0f b1 40 00 00 00 00 00 06 00 01 00 4e f5 40 18 00 00 03 32 81 00 60 20 00 40 cc 50 20 +10 02 00 00 00 0b 02 81 00 00 80 40 05 0f 54 00 04 00 00 00 00 10 40 02 25 0f 54 00 00 00 10 b4 3d 50 10 00 00 02 40 55 00 +00 00 00 00 00 00 3a bd 50 00 00 00 01 5a a0 40 00 00 00 00 00 00 00 00 01 5e a0 40 00 00 18 a5 22 81 00 80 00 60 35 ca 50 00 +00 00 00 00 00 00 00 00 00 40 00 00 05 00 f0 00 00 00 00 00 00 c0 00 40 26 01 24 02 00 00 00 56 3f c2 08 00 00 00 1c 03 00 +00 00 00 00 05 80 00 00 00 04 00 00 03 68 f0 00 00 00 00 00 00 0c 00 3c 01 68 84 40 30 00 58 0d f3 dc 00 c0 00 00 00 80 30 00 +00 00 00 00 00 00 00 00 00 00 00 04 36 d0 c4 00 00 00 00 00 00 0a 20 40 16 01 24 00 80 50 88 b4 15 70 02 00 00 02 40 ff 00 +00 00 00 00 00 00 00 00 00 00 00 00 22 fa 5e 40 00 00 00 00 00 00 40 26 01 68 84 c0 00 02 11 b9 ea 95 02 00 00 07 0c 0a 50 00 +00 00 00 00 00 a1 2f 30 00 00 00 00 2f 00 c4 00 00 00 00 00 00 00 00 00 24 01 24 00 00 00 08 1b d6 10 00 00 00 01 4c 42 00 +00 00 00 00 00 01 da 0c c0 10 00 00 63 78 5e 42 00 00 00 00 00 00 00 00 01 68 84 c0 00 00 00 1f 3b 95 00 00 00 00 00 08 10 00 +00 02 08 00 50 00 aa 58 80 20 00 02 07 0a 10 00 00 00 00 00 00 20 00 03 14 01 24 00 80 00 80 d8 3e b0 02 00 00 00 00 f5 01 +00 00 00 00 0d 80 52 65 a0 00 00 00 04 7c a0 02 00 00 00 00 00 00 00 00 05 e8 84 c0 00 00 70 05 ea 81 00 00 00 60 14 cf 50 00 +00 00 00 00 78 00 2e 58 00 00 00 40 05 04 00 00 00 00 00 00 00 20 00 02 26 01 24 00 80 01 09 fb 2d 50 02 00 00 01 4c 7e 00 +00 00 20 00 01 80 7a 25 a0 00 00 34 28 18 80 02 00 00 00 00 00 00 00 06 65 48 84 c0 00 00 d0 15 3a 85 00 00 00 00 00 0b d0 00 +00 00 00 00 b0 d0 36 58 00 c0 00 02 95 00 f0 00 00 00 00 00 00 40 00 02 16 01 24 00 00 01 00 94 2a b0 0c 00 04 00 00 fa 10 +00 00 00 00 08 01 5a 65 a0 0c 00 16 06 4a f0 00 00 00 00 00 00 0c 06 1e 65 48 84 c0 00 00 99 88 39 55 00 c0 02 00 14 cf a0 00 +00 00 00 00 08 00 b2 58 00 00 02 e2 95 d0 c4 00 00 00 00 00 00 00 00 00 24 01 24 02 00 00 09 58 3e b0 18 00 00 00 1c cc c0 +00 00 00 00 01 80 12 25 a0 06 00 3e 2b 5b 5e 40 00 00 00 00 00 06 00 00 01 c8 84 c0 2a 80 18 11 aa 81 20 a0 00 00 00 8c c4 00 +00 00 00 00 00 e0 32 58 00 00 01 42 b6 8f 34 00 00 00 00 00 00 00 00 00 14 01 24 20 00 00 00 7b 9c 10 00 00 00 2a 40 f0 c0 +01 00 00 00 00 00 50 25 a0 00 00 36 02 fa fb 40 00 00 00 00 00 00 00 00 71 c8 84 c0 00 00 18 07 2f c5 00 00 00 00 4c aa a4 00 +00 00 10 00 00 d0 01 2c 00 40 03 47 7d e4 40 00 00 00 00 00 00 08 00 02 97 ff 70 02 00 01 0a 13 ff c2 08 00 00 00 10 e4 c8 +04 00 03 00 05 9d 7e 92 c0 84 00 06 66 49 bb 00 00 00 00 00 00 00 00 00 03 d9 e7 00 b0 00 80 a1 eb dc 02 c0 00 00 05 ae 46 20 +86 00 00 00 00 81 43 c0 00 00 00 24 1e 00 f0 00 00 00 00 00 00 00 00 03 e5 0f f0 00 00 45 08 58 3f ca 00 40 00 2d 6e ff 00 +00 00 00 00 01 81 5b 83 c0 00 0c 14 7a cc f0 00 00 00 00 00 00 00 00 00 6b 7c f7 02 80 02 00 1f 6b d4 04 00 00 60 1c af 70 10 +08 00 00 00 10 ff 82 70 00 00 00 00 3d e4 44 04 28 00 00 00 00 00 08 02 83 0f 50 00 00 00 0a 78 3e b0 00 00 02 00 30 a0 01 +04 00 00 00 00 00 7e 24 c0 80 00 06 02 49 bb 40 01 00 00 00 00 00 00 40 68 ee f5 00 00 00 00 1b ea 81 00 00 00 e0 16 8a 00 00 +00 02 00 08 00 01 40 28 00 00 10 06 c5 07 70 00 00 00 00 00 00 00 14 07 bd af f0 00 08 05 00 d7 29 90 00 00 00 3a 4b 81 00 +00 00 00 00 00 00 5b a8 00 00 00 06 28 f8 44 02 00 00 00 00 00 00 20 94 24 de f7 00 01 00 18 0f fa 95 00 00 00 00 40 14 20 00 +00 00 00 00 b0 0f 03 e8 00 00 00 00 17 05 a0 00 00 00 00 00 00 00 09 c6 f5 0f a0 00 00 0d 10 3c 3e b0 20 00 3c 23 50 50 c0 +00 00 10 00 09 80 06 3d 40 00 00 00 69 fa f0 00 00 00 00 00 00 00 01 20 2a 1a f5 00 00 00 1d e3 aa 81 00 00 02 06 60 aa 04 00 +00 00 00 00 10 07 75 c9 00 c0 00 40 01 0e 10 00 00 00 00 00 00 00 00 26 c5 00 20 80 00 41 00 b4 3d 70 00 40 b6 02 e0 fa d0 +00 00 00 00 08 00 03 ec 50 0c 00 20 01 4c e1 02 00 00 00 00 00 00 00 1c 2a 68 00 02 00 02 81 8d 3a 81 00 00 01 46 17 aa 06 00 +80 00 00 02 b0 05 81 41 00 00 02 c0 01 0e 10 00 00 00 00 00 00 00 03 63 c5 b0 00 02 00 2d 00 3f 9e 90 08 02 00 00 0b fc 40 +00 00 01 80 18 00 3b bd 50 06 00 20 29 cc e1 02 00 00 00 00 00 00 00 14 00 4a 80 00 28 00 00 07 ea 85 00 a0 00 00 00 ff c4 00 +00 43 01 05 50 0b 43 d5 00 00 10 42 00 00 f0 00 04 00 00 00 00 00 03 62 67 df f0 00 00 00 80 d3 d9 50 00 40 04 20 5d 4a 40 +00 07 00 28 00 00 d7 a8 10 00 00 a0 04 1c 0f 00 00 00 00 00 00 00 00 14 60 ce f7 00 00 04 50 0d 3e 95 00 00 02 00 4e ee 54 00 +00 00 30 00 10 a9 a0 78 00 c0 00 03 7f 86 30 00 00 00 00 00 00 40 00 00 15 8c 30 03 00 07 80 f6 b9 40 04 00 00 03 e9 20 00 +40 00 01 00 0d 81 3e 74 80 0c 00 1c 04 4c 6c 00 00 00 00 00 00 0c 00 1e 03 c8 e3 11 b0 00 90 a1 7a 3c 00 40 00 00 1c d0 00 00 +00 00 00 00 00 07 e0 b9 00 00 14 02 56 d7 80 00 00 00 00 00 00 00 00 20 04 ff f0 00 00 50 0a fb 3f c0 40 00 00 74 c0 1a 01 +00 00 00 00 01 9a fb 09 50 40 00 80 06 7d 4b 00 00 00 00 00 00 00 00 1e 78 5c f7 00 81 02 00 ef 2f dc 00 00 00 07 81 a2 50 20 +00 00 00 00 50 8b 82 91 00 00 00 22 c7 0c c0 00 00 00 00 00 00 00 02 e0 05 00 00 14 00 0d 0d 50 36 c0 00 02 80 03 f0 ff 08 +00 00 00 00 05 81 77 9d 10 c0 00 14 03 48 33 02 00 00 00 00 00 00 00 2e 01 c8 40 02 00 00 00 b0 03 9c 08 00 10 60 1c aa f0 00 +00 02 04 00 00 ab 80 0c 80 00 00 02 ed 05 f0 00 08 00 00 00 00 02 14 02 04 ff 00 00 00 0f 00 f7 3b c0 00 00 1c 02 4b 1a 08 +00 00 00 40 00 19 7f 10 c0 80 00 01 00 4e 50 00 01 00 00 00 00 00 40 80 04 ea e0 00 00 00 80 09 3f fc 00 00 0a 00 2f b1 50 00 +00 00 00 00 08 09 02 a8 00 00 00 20 0e 00 f0 00 00 00 00 00 00 00 00 40 00 0f 04 00 00 01 00 f4 3d 40 00 01 1c 03 40 5a c0 +00 00 20 00 01 00 77 0c c0 80 00 14 02 fa f0 00 00 00 00 00 00 00 00 20 00 1e f0 40 00 10 80 03 fa 94 00 20 0a 03 80 0a 54 00 +00 00 14 00 00 01 74 3c 00 00 00 04 2c 0a f0 00 00 00 00 00 00 00 03 c0 34 05 a4 03 00 5d 00 90 36 c8 00 00 04 3c 10 f0 c0 +00 00 01 40 00 00 9a 61 c0 00 20 00 2a 7c fa 00 00 00 00 00 00 00 0c 20 60 00 a5 40 30 02 81 85 fb dc 08 00 22 03 00 8f 04 00 +00 00 00 00 d0 b7 37 29 04 00 00 20 00 00 f6 00 00 00 00 00 00 00 00 00 03 05 05 08 00 00 00 f3 40 00 00 00 24 7d 60 50 00 +80 00 01 80 01 80 87 b1 50 06 00 14 68 1a 0f 40 00 00 00 00 00 06 00 00 00 ca 50 40 18 00 00 03 b4 40 00 60 00 03 c4 c0 00 00 +04 00 02 80 71 e7 a7 f9 04 00 00 02 81 0f 04 00 00 00 00 00 00 00 03 42 c0 0f 54 00 00 05 8f b2 e8 10 40 00 00 22 40 5a c0 +00 00 00 13 08 0a b7 ff 10 08 08 16 04 1e f0 40 00 00 00 00 00 00 00 06 00 5a f5 61 00 20 78 09 7a 01 00 00 e0 06 40 0a 54 00 +00 00 10 00 00 8f 41 41 00 40 00 43 c0 00 00 00 00 50 00 00 00 40 10 03 04 0a 52 00 10 2b 99 10 39 80 04 00 00 30 cc d0 00 +04 00 03 00 00 01 b6 bd 50 2c 00 20 04 00 00 00 00 00 00 00 00 04 00 86 04 00 5a 00 00 00 f1 d9 7b 04 08 c0 00 00 65 8d 50 00 +80 30 00 00 50 85 71 c9 00 00 00 40 00 00 00 00 00 00 00 00 00 80 00 04 25 05 20 10 00 00 1d 52 74 00 00 00 04 60 48 98 00 +00 00 40 00 00 01 87 ac 50 00 00 20 78 00 00 00 00 00 00 00 00 0c 20 00 22 e8 d1 02 00 00 00 c9 b7 54 00 00 02 02 7d ae 50 00 +0c 2c 00 00 90 e5 01 41 00 00 0a c3 fe 81 24 10 00 00 00 00 00 00 01 c0 35 05 a0 00 00 00 19 7c 00 00 00 01 0c 30 eb 6a 40 +04 40 40 00 00 01 b6 bd 50 00 00 40 07 69 84 40 00 00 00 00 00 00 00 14 33 4c ad 02 00 00 01 8b b1 00 88 00 0c 60 66 ba 55 00 +00 02 00 00 30 0d 31 c9 00 00 00 00 24 bd e4 00 00 00 00 00 00 00 00 43 ff 0f f0 00 00 00 8c f8 09 00 00 00 3c 03 da a6 40 +00 00 00 00 08 00 06 ac 50 00 00 06 03 e9 b7 e0 00 28 00 00 00 00 00 36 01 fa af 00 00 00 10 1f a9 40 08 00 c0 60 17 aa 54 04 +00 00 00 00 10 0f 41 41 00 0c 03 c0 3e 91 24 00 00 00 00 00 00 00 00 02 84 00 50 10 00 00 90 94 3e 82 00 40 04 3b 79 c3 40 +80 00 10 00 09 98 32 bd 50 00 60 20 3b 68 84 e0 00 00 00 00 00 00 0e 00 00 1c 0a 00 00 00 78 a8 3b d4 00 00 02 00 4f 8e 24 00 +30 00 00 00 10 03 42 81 04 c0 00 00 2c b1 24 00 00 00 00 00 00 40 00 00 1d 81 d0 10 28 01 00 f4 3e 80 00 a0 02 27 fd 70 48 +02 00 00 00 08 18 53 bd 50 0c 40 00 03 69 84 e0 00 00 00 00 00 04 00 1e 02 da 25 00 01 00 80 08 63 d4 80 04 01 c0 14 ff 14 00 +80 00 00 00 00 00 43 c1 00 00 00 03 7e c1 24 10 00 00 00 00 00 04 03 c3 0c 9a 10 00 00 00 9f 9f ff c0 02 01 24 34 df da 48 +00 00 05 80 00 00 02 3c 10 06 00 06 07 68 84 c0 00 00 00 00 00 06 00 20 26 df e2 10 00 00 10 9f 6b dc 00 a4 08 00 55 9a 44 00 +10 02 00 00 00 db 03 d5 00 00 20 00 2c 01 24 a0 04 00 00 00 00 00 03 67 cd c9 04 00 00 0f 00 fc 00 00 00 01 06 03 cd 70 40 +00 00 00 00 01 81 93 a8 10 00 00 00 63 c8 84 c0 00 00 00 00 00 00 00 14 3e 1c 60 40 40 00 00 01 f1 40 00 00 09 c6 04 ff 14 10 +00 00 +11 02 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 08 0b 00 00 00 00 00 20 00 00 00 00 00 00 80 00 00 00 00 00 02 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 40 20 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 00 00 80 00 00 00 00 00 03 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 16 91 68 07 90 00 40 00 1f c1 80 00 00 00 00 00 00 08 02 29 fc 90 09 00 00 00 8d 3b ac 3e 85 00 0c 0c 68 00 b0 00 +00 00 00 c0 69 04 00 6e 00 00 00 04 f9 d0 00 00 00 00 00 00 08 00 13 fd ed 00 b8 00 00 00 cd 68 c2 90 20 02 83 04 00 18 00 00 +00 00 00 12 11 70 c0 00 00 00 00 2d c0 08 0d 00 00 00 00 00 00 00 02 ee f8 00 00 00 44 47 5f 80 30 00 04 05 a4 4a 00 b0 01 +00 00 00 00 48 02 f4 00 00 02 51 01 f9 01 00 00 00 00 00 00 00 00 00 af 5d 70 04 00 00 04 70 40 00 00 00 00 1a 41 00 1f 00 14 +00 00 00 12 11 38 00 00 00 40 00 1e 80 00 08 00 00 00 00 00 00 10 32 cd a0 00 00 00 00 af 16 9c 3c 00 00 05 a6 40 38 e0 00 +00 00 00 00 48 07 bc 00 00 02 40 14 3d 00 00 00 00 00 00 00 00 00 01 18 1f 00 00 00 00 00 50 a0 23 03 00 00 1a 4c 07 80 00 00 +00 02 00 16 91 22 03 00 20 00 28 0c 80 00 00 00 00 00 00 00 00 11 39 c7 e8 1c 20 00 00 0a 10 00 64 02 00 05 a4 5c 00 c0 00 +00 00 00 80 69 00 0c 2c 04 00 02 80 10 10 b0 00 00 00 00 00 00 00 03 7c 38 71 00 00 01 00 50 a0 03 00 50 00 1a 41 00 10 00 00 +00 00 10 12 11 75 40 40 40 30 30 57 b0 00 00 00 00 00 00 00 00 00 0c 2f d0 0e 00 00 10 0a 12 20 00 00 00 15 a4 4a 00 00 00 +00 00 20 00 48 06 42 30 02 00 02 00 1d f0 a0 00 00 00 00 00 00 00 00 91 6c 01 00 00 00 00 a0 82 c2 80 00 00 1a 41 00 00 00 00 +00 00 08 12 11 7c c0 08 00 80 0a 2c 91 80 00 00 00 00 00 00 00 11 00 86 81 08 00 20 00 af 33 00 28 00 00 15 a4 5a 00 80 00 +00 00 00 00 48 06 40 2c 00 00 00 30 5a 10 01 00 00 00 00 00 00 00 02 84 28 11 80 00 00 00 50 78 00 00 00 00 1a 40 05 1a 00 00 +00 00 00 02 11 34 03 80 00 02 03 f6 e0 00 00 00 00 00 00 00 00 00 00 00 09 00 a0 00 00 af 1a b4 00 00 04 05 a4 5e 00 0a 00 +00 00 00 00 48 07 b4 00 00 00 00 0e c9 00 a0 00 00 00 00 00 00 00 00 00 00 38 04 00 00 00 50 20 42 00 00 00 1a 40 00 00 00 00 +00 00 00 0e f3 6c e7 80 00 02 09 20 10 00 14 00 00 00 00 00 40 02 02 8f b1 9c 80 01 40 8b 72 84 00 00 82 05 a6 40 00 10 08 +80 00 00 00 ff 12 82 00 00 00 00 63 4a 30 c0 00 00 00 00 00 00 00 00 3c 0d 00 00 00 00 00 a0 e0 20 00 08 00 1a 4c 00 0e 0d 48 +00 00 10 2e 79 60 60 10 00 00 1d 3d d0 19 04 00 00 00 00 08 00 00 a3 f5 c0 18 00 00 02 c3 1f 60 3c 00 00 01 a4 5a 01 c1 00 +00 00 00 8e 8b fa 7c 02 00 00 02 b1 c8 01 c0 00 00 00 00 00 40 00 08 38 ce 00 00 08 08 a4 71 bb c2 00 20 88 1a 41 00 00 18 00 +00 00 00 00 a7 70 06 40 25 10 20 07 b0 01 00 10 00 00 00 10 20 41 91 c7 d8 00 00 11 02 8b d3 4e 04 00 d0 00 02 7d 01 e0 00 +00 00 00 00 0a 08 00 34 04 40 03 80 2a d0 80 01 40 00 00 00 84 00 0b 0c 6c b0 90 01 48 20 f9 30 23 c7 05 00 01 05 ef 0b 00 00 +00 00 04 08 15 75 c0 40 42 31 a1 55 e9 0e 00 0c 00 00 00 00 00 00 a9 4e af 1f 20 00 82 a5 3a 06 60 00 00 00 00 00 70 00 00 +00 00 00 00 85 03 40 20 02 34 0b 7c 38 91 00 00 c0 00 00 00 02 00 0a a8 3e 10 80 00 20 25 93 34 00 06 00 00 00 00 00 08 18 00 +00 02 04 04 77 6d 40 00 20 00 a2 ee 18 19 00 00 00 00 00 00 50 40 a9 55 e0 01 00 80 02 a5 12 c6 60 41 00 03 95 d8 78 04 00 +00 00 00 00 85 0f c0 00 41 0a 09 1f 6f 90 f0 00 00 00 00 00 52 00 0a a8 3b 00 80 04 00 2a a0 e4 00 07 20 04 11 5f 83 00 80 00 +00 00 00 08 05 7c 00 00 00 61 a9 de 80 01 00 00 00 00 00 06 00 00 a9 4f b0 1e 00 00 02 a5 7b a6 00 00 08 00 15 ca 00 00 04 +00 00 20 80 00 77 80 38 00 08 09 5e ee 70 a0 00 00 00 00 00 00 00 0a a8 29 00 00 00 00 aa a0 6c 63 80 00 00 17 c2 b0 00 10 80 +00 00 04 0a 03 f4 67 08 08 00 00 07 e0 1e 08 00 00 00 00 00 00 01 b9 c0 b7 09 41 40 02 a5 16 80 38 00 00 03 c1 60 00 00 00 +00 00 00 00 80 0b 74 71 00 00 00 14 0e 70 80 00 00 00 00 01 00 00 09 09 da 18 c2 08 00 2a a0 a0 02 00 00 00 3c 02 09 00 00 00 +00 00 00 0e fd 74 e7 80 00 00 04 7d b1 09 00 00 00 00 00 28 00 80 ab de c0 08 00 00 02 af 37 e0 38 00 00 00 00 00 b0 10 00 +00 00 00 00 fb 33 40 00 00 00 00 09 c8 00 a0 00 00 00 00 00 00 00 08 28 2e 00 e0 04 00 a0 a0 aa 40 20 00 00 00 00 03 8e 00 00 +00 00 00 04 27 7f c7 84 02 10 00 d4 d8 09 00 8c 00 00 00 30 50 01 2a cf fb 88 00 09 02 af 5e 40 70 00 30 00 00 00 00 00 00 +00 00 00 00 c1 53 ee 00 00 20 13 cc 2e f1 d0 00 80 00 00 02 00 00 00 2d 6f 18 00 00 80 20 a0 a4 02 00 02 00 00 00 00 08 00 00 +00 00 01 00 1f 7d 60 10 00 80 3b d7 d5 00 00 00 00 00 00 00 00 41 a3 d5 93 88 60 00 12 47 76 60 6e 02 00 18 80 cf 00 00 80 +00 00 00 00 10 da 00 2a 20 00 02 fe 4d 50 00 00 00 00 00 00 1a 00 48 38 cc f9 0e 00 00 2c 31 ef 46 10 10 00 80 3d 80 08 00 00 +00 00 00 0a 89 a3 40 00 00 00 21 67 b0 00 80 00 00 00 00 00 00 01 91 cf 90 0e 00 15 02 c7 37 8e 04 00 50 20 01 cf 00 10 01 +00 00 00 00 04 93 d6 2c 00 00 13 ab 5f 00 a4 00 00 00 00 00 00 00 0b 0f 58 71 00 01 40 2c 23 bf e3 87 04 80 10 3e a0 0a 00 10 +00 00 00 08 b9 78 e0 60 00 00 22 dc 11 81 00 00 00 00 00 00 10 04 91 c5 98 09 00 42 02 8f d3 a0 00 00 00 0a 94 00 18 10 00 +00 00 00 00 42 da 00 34 70 00 41 1d e8 b0 9a 00 00 00 00 00 30 02 0b 0e e9 f1 84 08 00 20 d7 b4 40 03 00 00 96 80 b0 0f 00 00 +00 02 04 04 a1 a9 40 07 00 00 28 05 c1 01 00 00 00 00 00 00 00 41 91 ff 99 80 00 00 00 05 76 de 38 04 00 08 7d 5e 00 10 00 +00 00 00 00 a5 0e 9e 00 00 80 02 80 20 90 ea 00 00 00 00 01 10 00 0b 0f 78 f0 05 80 00 0a f0 3c 27 c7 20 00 83 df c0 0a 00 00 +00 00 08 4a 07 e0 00 00 50 c0 02 94 c0 0a 00 00 00 00 00 20 00 40 91 c4 8f 9d 00 40 40 8b 5a 20 64 00 00 08 01 db 02 a0 10 +00 00 20 08 a0 04 00 00 52 00 00 00 2f 00 00 00 00 00 00 00 00 00 4b 0e 6c 19 d0 04 00 0d b0 3e c3 00 00 00 80 9c f0 1b 00 80 +00 00 00 01 09 a4 00 28 30 00 10 c7 d5 18 00 00 00 00 00 00 50 40 91 fe c8 18 60 00 0a af 17 20 00 00 00 03 bd de 00 02 00 +00 00 00 00 52 93 80 01 05 00 01 a1 4d f0 a0 00 00 00 00 00 02 00 2b 0c e8 10 99 00 00 20 a0 f8 c0 00 00 80 3f dd f0 00 58 00 +00 00 04 0c 07 66 e0 00 00 00 2b c4 cb 9c 00 00 00 00 00 00 00 20 91 ed 90 0e bd 00 00 05 57 8e 64 54 01 02 fd ea d0 a1 08 +00 00 00 00 ca 0e 26 00 00 02 12 bc 20 71 00 14 00 00 00 00 00 00 0b 0e e9 00 04 08 00 00 50 c1 c3 c5 20 02 2f c0 01 9b 00 00 +00 00 08 08 1f 24 00 40 00 72 01 14 10 01 a0 00 00 00 00 00 00 20 8b d6 a7 8e 00 0c 40 8b 1b a0 78 04 20 0b d4 de 19 da c2 +c0 00 00 00 af db 80 24 00 0a 00 20 2e 90 a4 80 00 00 00 00 00 00 08 2c ed 01 00 00 c0 04 20 e2 c4 00 02 00 c1 41 c0 18 00 2c +00 00 00 0c 0d 25 60 00 00 00 08 0f e0 00 00 00 00 00 00 06 00 00 01 57 d1 0a 00 00 12 af 5b 80 06 b0 00 1a 3f 5f 01 88 00 +00 80 00 00 ca 96 3e 38 80 0a 20 01 ea 00 c0 00 00 00 00 00 02 00 02 bc 3d b0 00 00 00 20 50 fc 02 20 00 00 83 6d e0 00 1c 00 +00 00 01 24 7d 87 c0 48 24 00 29 ee 90 1c 00 20 00 00 00 00 00 10 31 55 80 01 00 00 00 00 00 34 7c 00 40 0b 1c fe f1 80 01 +40 00 00 12 8b 9b ac 20 00 40 01 47 cc 50 00 80 00 00 00 00 00 00 03 14 00 00 e0 00 00 00 00 02 c7 c0 0d 24 f0 86 e1 00 00 10 +00 00 00 08 3d 21 43 c0 03 10 28 de b0 19 00 20 00 00 00 10 00 00 01 5c 98 1b 00 01 00 af 5b 8c 3f 80 04 0a 3f 4d 81 f0 08 +00 00 00 00 c3 16 80 34 00 30 01 8c 0b 01 f0 02 00 00 00 00 f0 00 02 bc 0d f1 e1 80 01 00 a0 20 22 28 10 04 83 6e e1 18 01 40 +00 02 04 0e 03 ec ee 00 00 10 11 d7 e9 1c 00 20 00 00 00 07 20 10 22 c5 a8 0e 81 00 00 01 b6 3c 00 00 00 1b 1e fe 80 10 18 +00 00 00 00 80 0b 40 00 00 80 01 1c 00 99 00 08 00 00 00 00 01 00 02 2c 20 31 01 80 00 05 bf 6b e3 00 00 00 f0 b6 df 08 01 c0 +00 00 1d 68 53 7d 60 00 00 c0 33 fd b0 01 00 00 00 00 00 00 10 10 28 54 90 00 01 40 40 c5 30 5c 74 00 00 2a 3f 6f 19 94 00 +00 00 20 8a df 0b c2 00 00 00 03 bd d9 00 a0 00 00 00 00 00 00 00 02 ac 3c 00 b0 08 00 0c a0 a0 27 40 00 02 83 6d e0 9d 00 80 +00 00 00 08 e1 aa 60 50 00 80 30 26 d1 1f 00 80 00 00 00 00 50 10 22 5c cf 81 00 00 40 a1 5a c6 02 05 00 4a 86 ff 18 d0 00 +00 00 00 00 0c 52 64 34 10 02 23 80 6e 01 b0 14 00 00 00 02 82 00 03 1c 0b 38 90 00 00 0a b0 e4 00 03 20 40 96 ee 83 8d 00 00 +00 00 04 00 a3 f9 c0 28 00 00 01 5d e8 1b 00 00 00 00 00 00 00 90 11 dc a8 19 20 02 40 83 37 64 24 02 00 08 15 f9 80 15 c0 +00 00 00 00 02 0e 40 01 00 04 40 14 20 b0 80 00 00 00 00 00 00 00 01 1c 20 d0 95 00 00 06 70 6e e7 60 40 00 97 c3 99 09 20 00 +00 00 0d e0 a7 ae c3 40 03 00 00 00 08 19 00 80 00 00 00 00 20 00 00 00 00 00 00 20 00 25 76 40 72 20 30 1a 95 59 80 80 00 +c0 00 00 12 1d 07 a6 30 00 20 00 00 00 70 b0 40 00 00 00 00 01 00 00 00 00 00 00 02 00 00 1b 60 44 10 03 04 95 41 c3 00 00 08 +00 00 00 04 71 64 67 00 00 00 01 c4 91 9e 00 00 00 00 00 00 00 01 00 17 e0 00 00 00 00 e7 7a 60 61 01 04 0a 3d 49 99 e0 80 +00 00 00 00 05 be c0 00 00 00 02 af 6a 01 a0 00 00 00 00 02 08 04 00 0b de 00 00 00 00 00 5b 2f c0 00 00 00 83 8c b5 10 04 00 +00 00 04 08 b3 f9 c3 8a 00 10 01 46 97 1d a0 00 00 00 00 10 10 00 02 1c 07 8e 00 00 00 a1 5e 20 70 82 00 0a bd da 00 f0 01 +00 00 00 00 8b 08 00 28 00 00 01 08 0d 00 80 00 00 00 00 00 a2 00 00 13 6e 00 00 00 00 0a b7 fe c4 10 10 00 81 41 b0 1e 80 54 +00 00 00 0f f5 e4 00 20 00 00 2b d7 d7 00 00 00 00 00 00 05 00 11 00 07 ef 8e 00 00 00 67 be 40 3a 00 00 0a bd fa d0 f0 00 +00 00 00 08 5f 02 c0 00 00 00 00 28 0e 90 00 00 00 00 00 00 00 00 00 04 2a f9 00 00 00 08 39 2c 02 06 20 02 82 81 eb 18 14 40 +00 02 00 00 57 01 43 c0 20 10 28 56 f0 0b 40 00 00 00 00 00 00 00 09 ef e0 09 00 01 40 83 16 be 00 05 00 0a 94 da b8 f0 00 +00 00 00 00 0a 03 40 30 00 00 01 5c 09 30 f1 00 00 00 00 00 02 00 20 5c ff 01 e0 00 00 09 b0 f1 e0 00 20 80 95 43 9f 98 00 00 +00 00 00 40 0d a6 c6 00 00 00 01 5d 90 00 00 00 00 00 00 00 00 80 00 17 e0 00 00 20 00 67 d6 c0 30 04 02 0a bd 7d 80 08 00 +00 00 20 04 01 12 f4 00 00 00 01 7c 3f 00 90 00 00 00 00 00 04 08 60 21 df 00 00 00 00 08 39 6f c0 10 20 00 82 80 b3 09 40 00 +00 00 00 08 17 69 e0 42 20 00 01 5c d5 a8 3c 00 00 00 00 00 50 00 29 5c b0 08 00 02 40 a3 5b c4 32 b0 00 00 17 5d 01 e0 00 +00 00 00 00 5f fb be 24 84 00 02 bc 28 08 8c 00 00 00 00 00 02 00 11 54 18 31 00 00 00 06 30 b4 00 00 00 00 39 ff 81 20 00 00 +00 00 04 08 93 74 63 c8 00 00 20 f6 a3 1e 80 40 00 00 00 00 20 20 3b d4 e9 09 01 40 80 e7 80 20 3c 20 01 02 0d 69 51 84 00 +00 00 00 00 c7 06 be 25 50 00 00 04 f8 b8 04 00 00 00 00 00 74 04 03 ff ee d8 e0 0c 00 0d b9 2a c2 44 00 00 19 c1 a9 00 20 00 +00 00 04 00 33 80 06 00 00 00 00 00 07 98 10 00 00 00 00 00 00 10 08 15 a1 00 00 00 00 f5 56 80 04 05 01 20 1d c8 00 1a 40 +80 00 00 00 03 00 00 40 40 00 00 00 00 08 04 00 00 00 00 00 00 0e 20 80 00 10 80 00 08 0f 50 40 02 c0 20 00 2a c3 f1 0b 40 28 +00 00 00 20 49 fc 06 40 01 00 35 5f d3 80 00 00 00 00 00 00 00 00 29 56 80 18 80 00 00 af 3a 6c 60 01 00 02 15 5a 81 e0 14 +00 00 00 02 1c fa 00 20 00 00 03 94 6e 08 e0 14 00 00 00 00 60 00 01 54 0b 90 02 00 00 00 50 2b c0 00 00 01 3a bd eb 18 18 00 +00 00 00 20 4b a7 40 48 25 10 11 55 b3 9e 40 00 00 00 00 00 50 00 11 76 90 00 00 20 00 05 32 a0 00 50 00 02 9d ec 00 00 00 +00 00 00 02 2c bb 84 20 05 40 01 3c 39 0b 00 02 00 00 00 00 40 00 02 3f dd 00 00 00 00 05 f0 f1 40 00 00 00 06 56 8d 0d 00 00 +00 00 00 20 2b 27 67 00 00 10 01 46 db 3e 00 00 00 00 00 05 00 00 2a df d1 9c 00 00 00 47 5e cc 00 00 00 02 85 49 38 80 80 +00 00 00 02 25 33 d4 00 00 00 01 08 0c f1 00 00 00 00 00 00 00 00 00 2d 5f 00 01 40 00 05 f7 70 23 c0 00 00 2a e4 c0 8d 08 00 +00 02 00 60 4d 34 67 a3 10 00 20 5d c1 00 a0 00 00 00 00 02 20 10 20 dc d0 09 b0 00 40 05 36 be 3a 01 01 02 0d 5a 01 c0 00 +00 00 00 02 2c bf 80 02 00 00 00 17 6c 78 04 00 00 00 00 00 60 00 01 9c 3d 01 f0 00 00 0d b0 77 c7 d0 00 02 19 c2 af 1b 00 00 +00 00 00 20 4d 7f e6 00 08 04 39 7e 80 09 01 40 00 00 00 14 00 00 2a df d0 00 a0 20 00 47 56 dc a6 00 00 00 00 00 00 09 04 +00 00 20 02 1c fb 84 78 20 00 01 02 fd 90 f0 08 00 00 00 00 00 00 00 2d dd 70 00 00 20 00 5f 73 62 12 00 00 00 00 07 0d 00 00 +00 00 00 20 4f 67 e0 20 00 00 01 54 d0 19 00 80 00 00 00 00 40 10 20 df d1 1c 00 00 00 a5 5e 40 e8 00 08 02 bc d8 00 00 02 +00 00 00 02 2c b7 a4 34 00 00 01 7c 0b 90 b0 14 00 00 00 00 02 00 01 9c 0d f1 e0 00 00 05 50 7c 07 80 00 00 01 43 a0 09 00 00 +00 00 00 20 4f 7c 02 80 00 00 00 00 07 80 00 00 00 00 00 10 00 10 31 57 c5 8c 40 00 48 ab 32 64 78 85 00 02 95 5a 11 80 00 +00 00 00 02 1c fa f4 40 00 00 00 00 00 00 00 00 00 00 00 02 a0 00 03 14 00 09 0a 00 00 00 70 ed e4 12 30 00 15 40 a0 80 00 00 +00 00 00 20 05 7d e6 00 02 00 00 00 00 0e 60 00 00 00 00 00 00 00 00 00 01 1a 80 00 00 a5 5a 20 00 00 00 02 bc 68 38 00 00 +00 00 00 02 02 b7 80 34 00 30 00 00 00 10 04 00 00 00 00 00 02 00 00 00 00 91 80 00 10 0a a0 7f c0 00 00 80 01 40 80 80 18 00 +00 00 01 2a 53 b8 60 68 00 00 22 5e e0 01 00 80 00 00 00 08 20 00 2a df 8f 00 5c 00 00 a1 1a 00 7c 44 88 08 14 c8 b9 e3 d8 +00 00 00 12 9a ba 00 20 30 00 03 2c 7e 00 ea 04 00 00 00 01 08 00 00 1d dc f8 0a c0 00 0a bb 24 c7 80 20 00 97 c0 c7 88 00 00 +00 00 00 6a f5 68 e0 00 05 10 01 dd d8 1f 00 00 00 00 00 02 00 10 28 cd d5 8a 00 00 40 83 57 40 79 60 00 09 1d f9 00 f0 81 +00 00 00 0a 0a 03 82 34 00 50 00 08 3c b0 f0 00 00 00 00 00 00 00 42 4c 08 09 00 00 00 06 70 a0 00 08 00 04 b0 f6 b0 1e 00 10 +00 00 01 a8 df 04 06 00 00 00 20 cf 90 00 a0 00 00 00 00 00 10 00 29 5c d0 00 40 00 00 a1 1a 4e 70 00 00 0a 3d df 70 10 80 +00 00 00 02 4e 5b c0 00 00 00 00 07 ed f0 04 00 00 00 00 00 00 00 02 a8 0e 00 a2 00 00 0a b5 3c 00 00 08 00 83 b7 f7 8d 40 00 +00 02 10 2c 13 35 e7 a0 00 00 11 c6 c5 80 40 a0 00 00 00 00 00 10 30 16 c0 1e 00 00 40 83 3b 60 72 80 00 1b 1d ca 99 82 00 +00 00 00 0a c7 9b 42 00 40 00 00 17 7d 08 0a 00 00 00 00 00 20 00 43 28 1d 01 94 00 00 06 70 a2 44 02 00 40 b0 af a5 08 00 20 +00 00 00 2a 53 fe 00 00 00 10 01 4c f9 0f 00 00 00 00 00 09 00 00 2a de 83 8e 50 80 40 c5 30 00 38 00 00 09 1f d8 18 94 00 +00 00 20 82 65 bb ec 34 00 00 13 6c 1e 31 d0 00 00 00 00 01 00 00 00 1e 5c 71 8a 10 00 0c a0 38 c2 a0 00 20 b0 cc f0 08 00 40 +00 00 01 2c 3b b7 c6 07 00 00 28 7f 87 18 04 00 00 00 00 00 20 10 28 cd d8 00 60 00 40 42 72 60 00 00 00 0a 3f 6a 80 14 00 +00 00 00 12 47 3f 76 00 00 00 02 89 cd 78 00 00 00 00 00 00 00 00 02 4c 1a f0 94 04 00 44 70 b9 c3 40 00 04 83 bd c1 08 20 00 +00 00 00 2a f7 bf e7 40 00 00 35 6c e5 9f 0c 00 00 00 00 00 30 00 03 34 e8 0d 80 80 00 0c 5f c4 61 00 40 09 1f 78 90 10 00 +00 00 00 02 05 0a c6 7c 00 00 03 97 6c 18 e0 00 00 00 00 00 12 00 42 35 5d b0 e0 14 01 04 e1 a8 20 20 00 00 b0 ec f1 0e 00 00 +00 00 10 2e 78 3f e0 60 02 00 00 00 08 08 08 00 00 00 00 00 20 00 00 00 00 19 00 00 00 00 00 14 00 02 00 0a 94 5a 71 e2 08 +c0 00 00 0a 42 97 c4 20 00 20 00 00 00 11 c0 04 00 00 00 00 05 00 00 00 00 00 f2 00 00 00 00 00 03 00 50 80 aa 83 91 10 41 0c +00 00 00 ac 73 e2 60 40 00 04 a3 f4 97 bf 00 10 00 00 00 06 40 00 b8 d7 d0 01 00 00 00 25 d2 2e 38 44 00 03 94 ff 00 00 08 +00 00 00 02 c2 37 84 3c 00 02 08 35 4b 38 e0 00 00 00 00 00 00 00 09 0c 6b 90 80 00 00 06 71 a0 c6 40 00 00 11 4d a0 00 00 00 +00 00 00 a8 fd 79 c0 40 04 01 91 c5 b8 08 00 10 00 00 00 00 00 00 83 75 f8 01 09 14 40 83 33 40 20 20 01 03 15 ea 00 01 00 +00 00 00 02 0e 92 c0 20 00 48 6b 0e f8 71 f0 01 00 00 00 00 00 00 4a 3c cb 10 81 8d 00 06 70 a8 07 c0 00 00 31 41 05 00 18 00 +00 00 01 24 73 e4 66 00 00 01 91 d4 d9 8f 04 00 00 00 00 00 00 40 b8 d7 d1 98 00 00 00 25 9a 24 78 22 01 23 89 4d 18 80 80 +00 00 00 82 c3 9f 9c 00 00 00 4b 0e ed b0 82 00 00 00 00 01 00 00 49 0e ef 00 00 00 00 06 71 27 40 00 50 00 20 41 d7 1e 80 00 +00 02 00 24 73 fc 00 00 00 01 ab d4 e7 89 00 00 00 00 00 00 10 80 83 74 99 18 88 00 40 83 73 c0 00 00 80 01 17 f9 00 e0 80 +00 00 00 12 c3 9a 40 00 00 00 08 28 38 09 80 00 00 00 00 00 02 00 0a 3c fb 78 01 c0 00 06 70 68 03 c0 08 00 23 f7 cd 00 04 00 +00 00 00 2c 7b bc 06 40 00 00 ab d7 c9 1a 00 20 00 00 00 00 20 00 b8 f7 c8 1e 80 00 40 47 37 a0 64 00 00 22 ae dc d0 e0 00 +00 00 20 02 c2 17 40 20 00 02 08 28 1a 19 0a 00 00 00 00 00 01 02 09 0c 6e 10 f0 00 00 04 70 02 43 40 00 00 02 cc ff 08 00 00 +00 00 00 00 55 64 c7 00 00 00 81 54 ed 80 00 00 00 00 00 00 20 00 83 77 d9 88 00 00 80 af 57 a0 70 60 00 41 0b dc 01 c0 d8 +00 00 00 10 af 0b bc 38 00 00 29 7c 1f f8 00 04 00 00 00 00 31 00 0a 3c db 70 f0 00 00 00 a0 a4 c4 00 50 00 11 dd a9 1f 00 80 +00 00 00 00 53 7a 03 80 00 40 a3 fe cd 80 00 00 00 00 00 07 00 04 b8 f6 c1 08 00 00 00 e5 df 16 61 00 00 00 95 4c 78 80 08 +00 00 00 80 05 00 1c 40 00 00 28 3a ea f8 00 10 00 00 00 00 02 00 0a 0e 6f 01 00 00 10 04 5b 28 04 0e 00 00 19 ee a0 80 01 40 +00 00 00 00 53 04 07 44 03 00 ab c6 e8 00 00 08 00 00 00 20 00 00 91 f6 17 8e 40 0c 00 00 00 00 74 00 00 00 00 00 d0 f0 10 +00 00 00 80 0a 03 80 2c 00 20 18 28 39 10 00 00 80 00 00 01 80 04 0a 2e ef f8 00 00 80 00 00 00 03 01 00 00 00 00 01 8a 00 00 +00 00 +11 03 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 00 80 00 00 00 00 00 02 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 0c 00 00 00 00 00 00 30 04 00 00 00 00 00 40 00 00 00 00 00 03 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 02 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 00 00 80 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 88 00 00 00 00 00 00 20 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 04 00 00 02 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 02 00 03 00 00 00 00 08 00 00 00 00 00 00 00 00 b9 c0 90 00 00 0c 00 f0 0e 80 00 00 00 01 e3 5b 00 80 00 +80 00 00 00 00 00 00 3c 00 30 00 00 00 00 00 00 00 00 00 00 00 01 0b dd c9 00 80 00 c0 00 f1 ed 60 00 00 00 12 ff c0 19 20 0c +00 00 01 66 90 00 02 00 00 00 00 00 01 00 00 00 00 00 00 01 00 00 21 42 80 10 00 00 00 f0 0a c4 00 00 00 09 d1 68 00 00 00 +00 00 01 06 69 16 80 64 00 00 00 00 00 01 a0 00 00 00 00 00 00 01 00 14 6c 79 80 00 00 00 f7 27 60 00 00 00 a9 05 97 18 40 00 +00 00 01 26 90 00 00 00 00 00 3f ec c0 0a 00 00 00 00 00 00 00 00 00 02 b1 00 00 00 00 33 b6 42 00 00 00 48 94 19 10 90 00 +00 00 01 83 69 16 80 00 00 00 03 bd dd 01 b0 00 00 00 00 00 00 00 00 14 cb 80 00 00 00 0c c9 6d c0 00 00 10 8b 86 88 00 00 00 +00 02 01 26 90 00 c0 00 00 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 09 10 00 00 00 69 54 14 00 00 00 03 04 08 00 c0 08 +00 00 00 83 69 17 a0 00 00 00 00 00 00 58 10 00 00 00 00 00 00 00 00 00 00 81 80 00 00 16 91 62 06 80 00 90 10 86 90 00 00 40 +00 00 08 26 90 40 03 80 00 00 00 00 00 10 00 00 00 00 00 00 00 00 9d 0f 95 00 00 00 10 69 b4 14 20 00 00 01 dc 0b b0 00 00 +00 00 20 93 69 12 80 64 00 00 00 00 00 01 80 00 00 00 00 00 00 00 09 60 ed d8 00 00 00 16 99 3b 46 c0 00 10 11 1c 88 00 00 00 +00 00 08 26 90 40 40 00 02 00 00 00 00 00 00 00 00 00 00 01 00 00 ae 36 d0 00 00 0c 00 69 b4 00 28 00 00 03 c2 fe 71 00 00 +c0 00 00 13 69 12 a6 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 09 63 6d 01 a0 00 c0 16 91 68 06 c0 00 00 38 75 b0 08 00 0c +00 00 00 a6 90 00 00 00 00 00 3f fc e0 00 00 00 00 00 00 00 00 00 9d 0e 90 00 00 00 00 69 30 14 00 00 00 09 4e 4e 00 a0 00 +00 00 00 93 69 13 80 00 00 60 03 bc db 00 00 00 00 00 00 00 00 00 09 60 eb 58 00 01 80 16 91 69 40 00 00 01 a8 c6 10 0a 00 18 +00 00 02 a6 90 00 00 00 00 00 00 00 00 00 04 00 00 00 00 04 00 00 00 00 00 0a 00 00 00 69 f0 00 00 00 00 49 fc d8 50 90 00 +00 00 01 13 69 13 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 16 98 28 06 00 00 00 8f de 91 8b 00 00 +00 00 09 26 90 40 02 00 02 00 00 00 05 0a 00 00 00 00 00 00 00 00 80 04 90 00 00 0c 82 11 02 82 00 00 20 4b c0 00 01 00 00 +c0 00 01 87 69 17 86 04 00 20 00 00 00 00 10 00 00 00 00 00 00 00 18 92 18 00 00 00 84 2d d3 ec 60 00 02 00 bc 0c 00 1e 00 0c +00 00 09 a6 90 40 22 00 00 00 00 00 05 0a 00 00 00 00 00 00 00 00 82 82 90 00 00 00 00 c3 07 02 00 00 00 03 25 79 90 01 c0 +00 00 00 07 69 16 9e 64 00 00 00 00 00 81 b0 00 00 00 00 00 04 00 48 00 59 00 80 00 04 0a 50 34 e0 00 00 00 0d 94 e8 00 00 00 +00 00 00 a6 90 00 00 10 00 00 01 40 05 00 00 00 00 00 00 00 00 00 80 04 97 00 00 00 00 87 08 06 20 00 00 02 5a 6d 00 00 08 +00 00 00 83 69 16 80 00 30 04 00 15 6c d8 00 00 00 00 00 00 00 00 18 92 08 80 00 00 04 08 71 2b 46 50 00 00 0f 27 95 80 00 00 +00 02 00 26 90 00 00 00 00 00 3f c3 d5 0c 40 80 00 00 00 00 20 00 82 82 90 00 05 00 00 f0 08 02 00 84 00 00 cc 39 90 e0 00 +00 00 00 87 69 17 80 00 00 01 03 bc ec 58 0a 14 00 00 00 00 00 00 18 00 58 00 00 08 00 0f 01 80 e0 10 20 10 33 0d cd 80 00 00 +00 00 00 26 90 40 48 08 40 00 3f ff f0 88 00 00 00 00 00 00 10 00 82 04 90 90 00 00 00 a5 0b 54 6c 00 00 03 e8 2b 50 00 00 +00 00 20 03 69 12 a0 61 02 00 03 bf 7c 18 90 00 00 00 00 00 02 02 08 13 c0 71 e0 00 00 00 f7 f6 62 80 00 00 02 8c a0 00 00 00 +00 00 00 26 90 40 40 05 03 24 3f c0 a0 10 00 00 00 00 00 00 00 00 82 82 a0 80 00 0c 00 f0 07 c0 40 00 30 03 c0 38 51 00 00 +00 00 00 03 69 12 a6 00 00 31 13 bd 78 00 a0 00 00 00 00 00 00 00 08 00 58 79 e0 00 80 00 f3 e0 c2 80 02 00 03 cf b0 0a 00 00 +00 00 00 26 90 00 03 00 00 00 3f dc e0 19 00 00 00 00 00 00 00 00 82 06 97 0e 00 00 00 22 5a 00 6c 20 00 03 e8 1d 58 a0 00 +00 00 00 03 69 13 80 00 30 60 03 bf d8 00 b0 00 00 00 00 00 00 00 08 13 60 81 d0 01 80 0d db f4 62 c2 06 00 17 c7 95 00 00 18 +00 00 02 26 90 00 00 01 00 00 00 00 00 00 00 a0 00 00 00 00 a0 20 82 82 df 0f 00 00 00 dd 3e f4 00 00 00 0b c0 20 d0 00 00 +00 00 00 03 69 13 80 00 70 00 00 00 00 00 00 14 00 00 00 00 80 00 08 00 59 b8 10 00 00 02 29 6c 60 00 00 04 bc 0e 00 00 00 00 +00 00 00 26 90 40 02 08 02 40 80 00 e0 10 00 0c 00 00 00 00 00 00 20 ec b0 18 00 0e 00 67 0a 40 00 00 30 03 48 10 00 00 00 +80 00 00 03 69 17 86 05 00 20 08 15 c8 01 c0 00 c0 00 00 00 00 08 01 9d c8 00 80 04 c4 08 35 bc 02 00 02 10 34 87 e5 00 00 0c +00 00 00 26 90 40 00 00 40 00 00 00 00 1f 00 00 00 00 00 00 00 04 14 66 f0 88 00 00 00 9b 13 94 00 44 00 01 a4 e9 b0 00 00 +00 00 00 83 69 16 80 60 00 00 00 00 00 01 e0 00 00 00 00 00 00 00 02 9f 4e 31 90 00 00 02 53 24 02 80 20 40 25 94 08 18 00 00 +00 00 00 26 90 00 00 08 00 40 80 01 e0 09 00 00 00 00 00 00 00 24 22 e6 c9 00 00 00 00 67 9a c0 00 00 00 01 7c 2b 30 80 00 +00 00 00 83 69 16 80 00 40 00 08 15 c8 00 00 00 00 00 00 00 00 00 01 28 ea 80 80 00 10 02 5b 79 c0 00 00 20 2b c4 08 00 00 00 +00 02 00 26 90 00 00 28 00 04 80 00 8f 19 00 00 00 00 00 10 00 04 38 95 d0 90 00 02 00 63 0f 04 30 00 00 00 e4 39 00 e0 00 +00 00 00 03 69 17 80 01 00 00 08 15 cd 01 e0 00 00 00 00 00 80 00 02 84 c9 32 e0 00 04 0a 31 ba 06 00 40 10 32 54 e0 00 00 00 +00 00 00 26 90 40 40 08 00 80 80 01 e0 80 00 00 00 00 00 00 00 04 80 02 cf 0e 00 00 00 67 92 96 28 00 02 02 80 2b 00 f0 00 +00 00 20 03 69 12 a0 61 02 00 08 15 d8 10 00 00 00 00 00 00 00 00 08 14 eb 80 10 04 00 02 5d 7c 43 80 00 00 01 44 c0 01 20 00 +00 00 00 26 90 40 40 00 02 00 80 00 c0 00 00 08 00 00 00 00 00 00 80 00 df 1e 00 08 02 04 18 14 00 00 20 09 3a ce 50 80 00 +00 00 00 03 69 12 a6 00 00 20 48 15 cc 00 00 00 c0 00 00 00 00 00 08 15 5b 81 e0 00 80 20 4d e0 02 03 02 01 a3 76 08 01 00 00 +00 00 00 26 90 00 03 90 00 04 80 01 e9 09 00 00 00 00 00 00 00 00 80 02 e7 00 00 00 02 00 06 ce 70 00 00 08 28 1a 00 80 00 +00 00 00 03 69 13 80 00 70 60 08 15 da 00 00 c1 80 00 00 00 00 00 08 14 eb 80 00 01 80 2a 01 e7 c3 c0 06 00 ab dd c5 81 00 18 +00 00 00 26 91 03 c2 0e 00 04 80 00 c1 08 00 00 00 00 00 00 00 00 80 01 df 0a a1 01 02 05 0e 04 3a 80 00 0a bc 2d 10 00 00 +00 00 00 03 69 02 00 7c 00 00 08 15 cd 00 00 00 00 00 00 00 00 00 08 15 5b 70 04 08 00 20 05 f4 02 d0 00 00 81 46 b8 00 00 00 +00 00 01 20 00 ac 20 00 03 00 80 01 d0 90 00 0c 00 00 00 00 00 00 18 c0 c3 10 00 0d 00 0a 0a 02 00 30 30 0a a8 10 00 00 00 +c0 00 00 02 05 3e 4e 30 70 28 0a 81 5c 10 80 00 80 00 00 00 00 03 02 8c da b9 e0 00 d0 00 07 bc 67 07 03 00 aa 8f a0 00 00 08 +00 00 00 20 11 c0 24 00 00 20 81 42 a0 80 00 40 00 00 00 00 00 00 11 55 c1 8d 00 01 00 00 03 c0 00 00 00 09 37 6c 10 00 00 +00 00 00 02 01 df 1e 30 00 00 08 00 dc 10 00 08 00 00 00 00 00 00 02 3d ca b8 10 00 00 00 51 b4 03 80 40 00 a3 b6 18 18 00 00 +00 00 00 20 00 ae e0 00 00 20 90 2c d9 9d 80 00 00 00 00 10 00 00 10 de ff 00 00 00 00 00 0a 00 00 04 04 03 fc 3b 00 88 00 +00 00 00 02 05 7e 6c 38 00 00 0a 03 40 10 90 00 00 00 00 00 00 00 01 9d cc 01 c0 00 20 00 a7 bc 00 00 20 50 3b d6 b0 00 40 00 +00 02 01 20 00 a0 20 00 04 04 82 82 80 80 00 10 00 00 00 18 00 40 2b 6f 90 1e 14 10 02 01 0a bc 00 00 40 02 bc 10 00 00 15 +00 00 00 02 05 5b 4c 38 01 00 08 00 c9 78 00 00 00 00 00 03 00 00 10 32 5e 01 90 00 04 20 25 00 03 80 00 00 2b d4 e0 00 a0 80 +00 00 00 20 00 2e c0 00 00 04 80 01 d0 10 00 00 00 00 00 00 00 01 12 bf 90 80 00 00 04 05 0a 02 00 00 00 08 3d 6f 11 00 00 +00 00 20 02 05 7e 40 78 40 00 0a 81 4e 01 e0 00 00 00 00 00 00 00 01 1e e8 79 e0 00 00 80 07 bc 40 00 00 00 a3 94 e9 9e 00 00 +00 00 01 20 00 a0 00 10 03 00 82 82 e0 80 00 4c 00 00 00 00 00 00 80 02 8d 00 18 0c 02 05 0e 9c 00 02 20 0b 30 20 00 80 00 +00 00 00 02 05 5f 40 00 80 30 08 00 c9 71 e0 08 80 00 00 00 00 00 08 14 5c 19 80 00 80 20 01 62 03 80 43 10 b3 1c 01 81 00 00 +00 00 00 20 00 2c 03 c0 00 00 80 01 d0 09 00 80 00 00 00 20 00 00 80 03 90 00 00 00 02 00 06 40 40 00 00 00 00 1b 00 00 02 +00 00 00 02 05 76 40 04 00 60 0a 81 5e 00 00 11 80 00 00 00 00 00 08 14 fe 00 00 01 80 2a 05 69 c7 00 06 00 01 4f b0 00 00 18 +00 00 00 20 00 e0 00 00 00 00 82 82 c0 00 00 00 00 00 00 00 88 00 80 02 b1 08 14 00 00 ff 02 80 00 05 00 08 3c 1e 00 04 00 +00 00 00 02 05 5b 40 00 00 00 08 00 c9 01 e0 08 00 00 00 00 00 00 08 14 5d 58 00 00 29 4a f1 b0 60 00 20 00 aa 94 e0 00 a0 00 +00 00 00 05 17 bf c3 60 00 00 19 c0 b0 80 01 00 00 00 00 00 00 00 80 01 fd 80 00 0c 04 a7 16 80 00 00 30 02 00 0d 00 e0 00 +80 00 00 08 a7 37 e0 7d 00 05 02 0d cb 70 e0 08 00 00 00 00 00 00 2a 80 cf 70 80 00 c8 00 3b bc 03 80 03 10 00 0c a0 0b 00 08 +00 00 00 46 70 f7 42 c0 00 00 09 b5 df 0a 00 00 00 00 00 02 00 00 82 82 b0 8e a0 00 00 57 b6 42 40 00 00 01 40 2d 31 00 01 +00 00 00 40 83 72 20 00 80 00 02 9e cc 71 c0 00 00 00 00 00 00 00 08 01 ee 10 04 00 20 00 73 b0 43 80 00 00 28 0e 00 1e 00 00 +00 00 00 05 f5 ff e0 00 00 00 19 c2 b0 0f 00 00 00 00 08 00 00 00 80 01 f0 00 18 00 00 17 b2 8c 24 00 08 02 b5 58 00 00 00 +00 00 00 00 81 53 6e 00 30 05 02 0c 69 00 11 c0 00 00 00 00 00 00 0a 80 db 00 00 00 01 02 77 22 e2 c0 00 00 03 3e c3 00 00 00 +00 00 08 06 70 f4 e0 05 44 00 09 b5 c7 0e 0c 30 00 00 00 10 00 80 82 82 ab 0e 18 31 04 5e 3b c6 00 00 40 20 94 3e 10 e0 01 +00 00 00 40 83 56 2e 03 01 00 02 9f cc 78 a0 00 00 00 00 00 00 00 08 01 ee 80 01 d2 00 00 c9 ea e0 00 40 10 29 5d a7 80 00 00 +00 00 00 05 fb 7d 47 80 00 00 19 c3 bb 80 00 00 00 00 00 00 00 00 80 00 f0 00 00 00 04 2e 56 40 3c 20 00 02 bc 0d 10 a0 01 +00 00 00 00 81 5b 40 28 30 01 42 0c 4f 90 00 00 00 00 00 00 00 04 0a 80 db 79 e0 00 00 02 5b bc 00 40 00 00 17 cc 08 00 a0 00 +00 00 00 86 70 75 e3 92 00 00 20 fe bd 10 00 00 00 00 00 00 00 00 82 82 90 b0 00 08 02 01 3c 00 28 00 30 08 00 1e 08 00 00 +c0 00 00 40 83 5e 94 00 85 00 01 9f c9 01 80 00 00 00 00 00 00 00 18 01 ef 31 e0 00 c0 20 19 f0 60 40 02 00 81 57 97 1e 00 08 +00 00 00 05 fb ff 60 08 50 00 19 c0 b9 0d 00 00 00 00 00 00 00 01 80 01 ff 00 00 00 02 00 06 42 40 00 00 08 05 50 98 c0 00 +00 00 00 00 81 9b 4e 31 32 81 42 0c 7f 00 10 00 00 00 00 00 70 00 0a 80 c9 80 00 01 80 20 53 f5 42 81 06 80 80 7f 81 01 00 18 +00 00 00 88 9b 34 00 15 00 00 2b cf bb 19 04 00 00 00 00 02 00 01 82 82 ff 00 00 00 02 00 0b 14 60 00 00 08 00 0e 00 00 00 +00 00 00 00 c7 fe 14 02 81 80 02 07 4d 80 b0 00 00 00 00 00 00 00 08 01 ef 80 00 00 00 20 51 a6 03 c0 00 00 81 57 f0 1e 00 00 +00 00 00 20 29 bd e0 00 02 00 19 c0 d7 19 00 00 00 00 00 00 00 00 24 c0 a0 0f 00 0c 00 00 00 1e 00 00 00 11 3c 2e 01 80 00 +80 00 00 12 01 38 6c 30 04 25 02 0d fc 00 80 00 00 00 00 00 00 01 02 8d 48 10 80 00 80 00 00 00 e0 02 00 10 2b 9d f0 0f 00 08 +00 00 00 20 00 fc 24 08 00 00 06 7e e0 1d 00 00 00 00 00 10 10 00 14 6e c1 80 00 00 00 f0 08 2e 00 00 00 01 9c 08 10 00 00 +00 00 00 02 05 7a 16 30 01 00 02 9c 5c 38 f0 00 00 00 00 02 80 00 02 9d d8 79 80 02 08 0f 03 02 c0 10 50 10 20 d7 cf 8c 00 00 +00 00 08 20 29 3e c0 00 00 04 19 c0 d0 0a 00 00 00 00 00 00 40 00 05 fd b0 08 00 81 80 05 0c 2e 01 00 00 01 0f cc 01 80 00 +00 00 00 02 01 78 40 01 00 01 02 0c 7a 00 f4 00 00 00 00 00 02 00 00 9d fa 00 01 c0 00 80 53 fa e2 00 00 00 19 dc 80 0d 00 00 +00 02 00 20 00 e8 00 00 00 00 06 7c e5 0c 00 00 00 00 00 00 00 00 26 c1 ef 1b 00 00 00 00 0b fe 40 00 0a 48 64 0c b1 00 12 +00 00 00 02 05 7a 00 00 00 00 02 9d da b8 e0 00 00 00 00 00 00 01 02 0c ce 00 f0 00 10 40 a7 76 e7 00 20 13 91 94 98 1e 00 a0 +00 00 00 20 29 3c 00 00 00 00 19 c2 d0 1f 00 00 00 00 00 00 00 00 11 5d f0 0b 00 00 00 00 00 00 40 00 00 00 00 0f 00 d0 00 +00 00 20 02 01 70 40 3b 00 09 02 0d 4c 00 f0 c0 00 00 00 00 00 00 02 3e d8 79 d2 02 00 00 00 00 07 ad 00 00 29 40 80 01 80 00 +00 00 00 20 00 e8 00 00 03 00 06 7e e0 00 80 00 00 00 00 10 20 00 82 82 f1 88 00 0c 10 00 ba 96 28 00 08 08 14 09 00 90 00 +80 00 00 02 05 7a 5e 38 00 20 02 9d f8 50 00 00 00 00 00 02 05 00 08 00 5a f8 f0 08 a0 40 4b e7 e0 45 00 85 96 94 81 80 00 0c +00 00 00 20 29 be c3 00 00 40 19 c3 d0 1a 20 00 00 00 00 00 00 00 80 00 9d 1b 00 00 00 2b ff 0c c0 40 04 49 1d 68 00 e0 00 +00 00 00 02 01 18 60 05 00 61 02 0c 4c 01 a4 80 00 00 00 00 00 00 0a 80 7c 00 b0 01 80 02 7b 60 03 80 00 00 a0 15 c0 00 00 18 +00 00 00 20 00 fc 00 00 00 00 06 7c e9 80 00 00 00 00 00 00 80 00 82 82 f0 89 00 00 00 0b fa c0 00 00 00 09 54 28 10 80 00 +00 00 00 02 05 7a 4c 00 00 00 02 9d ec 90 00 00 00 00 00 00 00 00 08 00 5b 70 01 00 01 0a b5 28 00 00 00 a5 aa 9c 08 19 20 00 +00 00 00 20 00 74 00 00 02 40 82 36 f0 00 00 08 00 00 00 00 08 00 29 cd b0 98 00 0d 00 c7 02 42 2d 00 20 02 94 2c 11 b1 80 +40 00 00 82 05 52 4e 01 00 20 08 11 c0 38 01 00 c0 00 00 00 00 84 00 07 df 58 90 10 c4 08 93 78 43 20 02 00 02 9c e9 0e 00 0c +00 00 00 20 00 f0 23 40 00 04 82 83 8f 80 00 00 00 00 00 04 00 40 16 c5 90 8e 00 00 00 db 0e ee 64 00 00 0c 3c 20 09 00 14 +40 00 00 82 05 3a ce 74 00 80 08 01 ca 10 00 00 00 00 00 00 00 00 00 04 fb 71 91 00 04 00 55 21 e2 00 00 02 83 cc 07 9e 00 8c +00 00 00 20 00 f4 c2 d6 20 00 82 34 f0 2e 00 20 00 00 00 00 00 80 20 5d c3 0d 00 00 00 81 0f 8c 6d 70 00 02 2c eb 10 00 00 +00 00 00 82 05 3a 5e 07 35 00 28 11 60 00 04 08 00 00 00 00 00 00 03 9e 0d b8 d0 00 04 08 b7 ba 0b 00 00 01 21 6c 89 8e 00 00 +00 02 00 60 00 fe c0 00 08 00 82 83 b0 09 1c 00 00 00 00 01 00 00 81 43 cf 1e b4 00 00 af 06 04 78 00 0a 40 00 3d 78 00 00 +00 00 00 02 05 3a c0 00 00 00 08 01 cb 02 00 00 00 00 00 00 50 00 0a bc 4a 00 b0 00 00 00 53 62 03 c0 20 21 28 1f 85 1e 00 00 +00 00 00 20 00 f4 00 00 00 00 82 36 f0 90 00 00 00 00 00 00 00 80 91 ec e1 2b 00 00 00 6e 9b c0 00 00 04 00 14 3f 00 00 00 +00 00 20 82 05 32 40 00 02 00 08 10 60 10 80 00 00 00 00 00 00 00 0a 2e e0 01 e0 10 00 08 5b 38 00 00 10 07 00 0d f0 00 00 00 +00 00 00 20 00 a4 c4 00 03 20 82 83 c1 10 a0 08 00 00 00 10 00 00 81 40 c7 00 00 0c 02 0a 02 9e 40 20 20 42 bc 2d 71 04 10 +00 00 00 02 05 3b a0 68 00 b0 08 01 ca 00 80 00 80 00 00 02 80 00 0a bc 6c 80 00 00 c0 20 03 f9 e3 80 02 a4 17 de 08 1e 80 90 +00 00 00 20 00 74 03 90 48 20 82 34 f9 00 9c 00 00 00 00 28 00 00 97 c2 a9 90 00 02 02 00 07 3e 39 40 00 23 00 20 00 00 00 +40 00 00 06 05 72 40 00 b2 60 08 11 40 00 01 41 80 00 00 01 00 00 08 14 ed 50 a0 01 80 2a 03 e5 c0 28 06 10 30 0e 01 00 00 14 +00 00 00 60 00 e0 c2 c0 00 00 82 83 f1 08 00 00 00 00 00 00 00 00 82 82 a0 08 10 00 02 0a 03 66 34 00 00 00 11 6e 00 80 00 +00 00 00 02 05 3a a0 04 00 00 18 01 cb 00 00 00 00 00 00 00 00 00 0a bc 6f 58 14 00 10 20 03 fd c0 00 00 00 00 0f f0 01 00 04 +00 00 08 08 b0 a0 23 c0 02 00 01 42 dd 90 00 88 00 00 00 00 00 40 11 c3 d9 00 1c 01 02 05 0a 40 30 e0 32 09 1e ed 00 90 02 +80 00 00 40 47 58 5c 01 00 20 02 bd 6e 90 c4 00 80 00 00 00 00 01 01 08 4f 00 01 80 00 2a f7 f8 67 40 02 01 b0 f5 80 00 00 ac +00 00 00 00 50 3c 60 00 60 00 97 c2 cb 00 01 00 00 00 00 18 20 00 2a 80 b0 00 0c 00 06 55 0b 40 20 01 04 0b 0e 4d 09 00 10 +00 00 00 00 af 7e b6 60 01 00 08 15 ea f1 80 00 00 00 00 02 d4 00 02 94 e9 10 80 00 00 2a 51 7c 43 40 00 00 91 f7 f3 9e 00 80 +00 00 00 a0 50 67 c3 00 50 00 01 42 d1 8d 00 00 00 00 00 00 00 80 01 41 c9 00 00 00 80 67 0f 04 3a 80 00 48 39 d8 90 e1 00 +00 00 00 02 af 5b 00 00 02 04 02 bc e8 b8 10 00 00 00 00 00 00 00 02 bd cb 38 80 00 04 08 33 b2 03 80 00 00 a3 f7 d1 80 00 00 +00 02 00 60 a0 7d c0 11 00 00 82 82 db 9f 00 00 00 00 00 00 10 00 02 80 a0 00 00 80 00 0b 13 c6 02 62 00 2b 0c ed 08 f0 00 +00 00 00 02 af 5a 60 02 00 04 0a bd ca 10 c0 00 00 00 00 00 12 04 02 bd 5c 00 00 04 00 0a bb b7 43 90 00 01 91 d7 f7 00 00 00 +00 00 00 a0 50 a4 02 00 20 02 81 42 a0 00 80 00 00 00 00 00 00 00 00 00 07 80 00 00 02 0a 0b 80 00 04 08 0b 0e 7e 70 98 00 +00 00 20 12 af 57 16 64 54 00 0a bd fc 7a 00 14 00 00 00 00 00 00 00 00 00 f0 a0 00 00 2a f5 24 07 83 20 01 91 dd d8 18 00 00 +00 00 00 20 a0 f4 c2 38 00 04 82 82 b0 8a a0 28 00 00 00 04 40 00 20 43 f0 0a 00 80 02 5f 0f 40 01 10 00 0b 0e 6d f0 04 08 +00 00 00 8a af 72 e6 7c 01 00 0a bc ea 10 04 02 80 00 00 00 72 09 01 1d 7c 59 a0 00 10 20 53 20 67 88 00 80 91 d5 ff 80 21 00 +00 00 01 20 50 2c 03 c0 25 00 81 42 a7 09 00 40 00 00 00 00 02 00 01 41 c5 00 00 00 02 0a 0b 40 2c 01 50 0b 0c 7e 11 e0 01 +40 80 00 0a af 77 00 3c 03 40 0a bd de 80 00 09 80 00 00 00 20 00 02 bd 7d 00 00 00 20 2a f7 20 00 40 24 84 91 d5 df 89 00 14 +00 00 08 60 a0 60 23 c0 00 00 97 c0 97 08 0c 00 00 00 00 00 80 80 17 c2 9d 00 00 40 02 a7 3b 80 bc 00 04 0b 0c 6d 10 81 80 +00 00 00 02 af 52 96 04 00 00 08 14 cb 00 10 00 00 00 00 01 00 00 00 15 fd 00 a0 00 10 22 5b 38 e0 40 50 01 91 c7 f9 99 00 00 +00 00 +62 00 3f +72 00 80 +11 00 +82 00 00 +01 03 +00 00 00 00 c0 00 00 e4 +00 00 00 00 c6 66 00 e4 +00 00 00 00 cc cd 00 e4 +00 00 00 00 d3 33 00 e4 +00 00 00 00 d9 9a 00 e4 +00 00 00 00 e0 00 00 e4 +00 00 00 00 e6 66 00 e4 +00 00 00 00 ec cd 00 e4 +00 00 00 00 f3 33 00 e4 +00 00 00 00 f9 9a 00 e4 +00 00 00 00 00 00 00 e5 +00 00 00 00 06 66 00 e5 +00 00 00 00 0c cd 00 e5 +00 00 00 00 13 33 00 e5 +00 00 00 00 19 9a 00 e5 +00 00 00 00 20 00 00 e5 +00 00 00 00 26 66 00 e5 +00 00 00 00 2c cd 00 e5 +00 00 00 00 33 33 00 e5 +00 00 00 00 39 9a 00 e5 +00 00 00 00 40 00 00 e5 +00 00 00 00 46 66 00 e5 +00 00 00 00 4c cd 00 e5 +00 00 00 00 53 33 00 e5 +00 00 00 00 59 9a 00 e5 +00 00 00 00 60 00 00 e5 +00 00 00 00 66 66 00 e5 +00 00 00 00 6c cd 00 e5 +00 00 00 00 73 33 00 e5 +00 00 00 00 79 9a 00 e5 +00 00 00 00 80 00 00 e5 +00 00 00 00 86 66 00 e5 +00 00 00 00 8c cd 00 e5 +00 00 00 00 93 33 00 e5 +00 00 00 00 99 9a 00 e5 +00 00 00 00 a0 00 00 e5 +00 00 00 00 a6 66 00 e5 +00 00 00 00 ac cd 00 e5 +00 00 00 00 b3 33 00 e5 +00 00 00 00 b9 9a 00 e5 +00 00 00 00 c0 00 00 e5 +00 00 00 00 c6 66 00 e5 +00 00 00 00 cc cd 00 e5 +00 00 00 00 d3 33 00 e5 +00 00 00 00 d9 9a 00 e5 +00 00 00 00 e0 00 00 e5 +00 00 00 00 e6 66 00 e5 +00 00 00 00 ec cd 00 e5 +00 00 00 00 f3 33 00 e5 +00 00 00 00 f9 9a 00 e5 +00 00 00 00 00 00 00 e6 +00 00 00 00 06 66 00 e6 +00 00 00 00 0c cd 00 e6 +00 00 00 00 13 33 00 e6 +00 00 00 00 19 9a 00 e6 +00 00 00 00 20 00 00 e6 +00 00 00 00 26 66 00 e6 +00 00 00 00 2c cd 00 e6 +00 00 00 00 33 33 00 e6 +00 00 00 00 39 9a 00 e6 +00 00 00 00 40 00 00 e6 +00 00 00 00 46 66 00 e6 +00 00 00 00 4c cd 00 e6 +00 00 00 00 53 33 00 e6 +00 00 00 00 59 9a 00 e6 +00 00 00 00 60 00 00 e6 +00 00 00 00 66 66 00 e6 +00 00 00 00 6c cd 00 e6 +00 00 00 00 73 33 00 e6 +00 00 00 00 79 9a 00 e6 +00 00 00 00 80 00 00 e6 +00 00 00 00 86 66 00 e6 +00 00 00 00 8c cd 00 e6 +00 00 00 00 93 33 00 e6 +00 00 00 00 99 9a 00 e6 +00 00 00 00 a0 00 00 e6 +00 00 00 00 a6 66 00 e6 +00 00 00 00 ac cd 00 e6 +00 00 00 00 b3 33 00 e6 +00 00 00 00 b9 9a 00 e6 +00 00 00 00 c0 00 00 e6 +00 00 00 00 c6 66 00 e6 +00 00 00 00 cc cd 00 e6 +00 00 00 00 d3 33 00 e6 +00 00 00 00 d9 9a 00 e6 +00 00 00 00 e0 00 00 e6 +00 00 00 00 e6 66 00 e6 +00 00 00 00 ec cd 00 e6 +00 00 00 00 f3 33 00 e6 +00 00 00 00 f9 9a 00 e6 +00 00 00 00 00 00 00 e7 +00 00 00 00 06 66 00 e7 +00 00 00 00 0c cd 00 e7 +00 00 00 00 13 33 00 e7 +00 00 00 00 19 9a 00 e7 +00 00 00 00 20 00 00 e7 +00 00 00 00 26 66 00 e7 +00 00 00 00 2c cd 00 e7 +00 00 00 00 33 33 00 e7 +00 00 00 00 39 9a 00 e7 +00 00 00 00 40 00 00 e7 +00 00 00 00 46 66 00 e7 +00 00 00 00 4c cd 00 e7 +00 00 00 00 53 33 00 e7 +00 00 00 00 59 9a 00 e7 +00 00 00 00 60 00 00 e7 +00 00 00 00 66 66 00 e7 +00 00 00 00 6c cd 00 e7 +00 00 00 00 73 33 00 e7 +00 00 00 00 79 9a 00 e7 +00 00 00 00 80 00 00 e7 +00 00 00 00 86 66 00 e7 +00 00 00 00 8c cd 00 e7 +00 00 00 00 93 33 00 e7 +00 00 00 00 99 9a 00 e7 +00 00 00 00 a0 00 00 e7 +00 00 00 00 a6 66 00 e7 +00 00 00 00 ac cd 00 e7 +00 00 00 00 b3 33 00 e7 +00 00 00 00 b9 9a 00 e7 +00 00 00 00 c0 00 00 e7 +00 00 00 00 c6 66 00 e7 +00 00 00 00 cc cd 00 e7 +00 00 00 00 d3 33 00 e7 +00 00 00 00 d9 9a 00 e7 +00 00 00 00 e0 00 00 e7 +00 00 00 00 e6 66 00 e7 +00 00 00 00 ec cd 00 e7 +00 00 +82 00 80 +01 03 +00 00 00 00 f3 33 00 e7 +00 00 00 00 f9 9a 00 e7 +00 00 00 00 00 00 00 e8 +00 00 00 00 06 66 00 e8 +00 00 00 00 0c cd 00 e8 +00 00 00 00 13 33 00 e8 +00 00 00 00 19 9a 00 e8 +00 00 00 00 20 00 00 e8 +00 00 00 00 26 66 00 e8 +00 00 00 00 2c cd 00 e8 +00 00 00 00 33 33 00 e8 +00 00 00 00 39 9a 00 e8 +00 00 00 00 40 00 00 e8 +00 00 00 00 46 66 00 e8 +00 00 00 00 4c cd 00 e8 +00 00 00 00 53 33 00 e8 +00 00 00 00 59 9a 00 e8 +00 00 00 00 60 00 00 e8 +00 00 00 00 66 66 00 e8 +00 00 00 00 6c cd 00 e8 +00 00 00 00 73 33 00 e8 +00 00 00 00 79 9a 00 e8 +00 00 00 00 80 00 00 e8 +00 00 00 00 86 66 00 e8 +00 00 00 00 8c cd 00 e8 +00 00 00 00 93 33 00 e8 +00 00 00 00 99 9a 00 e8 +00 00 00 00 a0 00 00 e8 +00 00 00 00 a6 66 00 e8 +00 00 00 00 ac cd 00 e8 +00 00 00 00 b3 33 00 e8 +00 00 00 00 b9 9a 00 e8 +00 00 00 00 c0 00 00 e8 +00 00 00 00 c6 66 00 e8 +00 00 00 00 cc cd 00 e8 +00 00 00 00 d3 33 00 e8 +00 00 00 00 d9 9a 00 e8 +00 00 00 00 e0 00 00 e8 +00 00 00 00 e6 66 00 e8 +00 00 00 00 ec cd 00 e8 +00 00 00 00 f3 33 00 e8 +00 00 00 00 f9 9a 00 e8 +00 00 00 00 00 00 00 e9 +00 00 00 00 06 66 00 e9 +00 00 00 00 0c cd 00 e9 +00 00 00 00 13 33 00 e9 +00 00 00 00 19 9a 00 e9 +00 00 00 00 20 00 00 e9 +00 00 00 00 26 66 00 e9 +00 00 00 00 2c cd 00 e9 +00 00 00 00 33 33 00 e9 +00 00 00 00 39 9a 00 e9 +00 00 00 00 40 00 00 e9 +00 00 00 00 46 66 00 e9 +00 00 00 00 4c cd 00 e9 +00 00 00 00 53 33 00 e9 +00 00 00 00 59 9a 00 e9 +00 00 00 00 60 00 00 e9 +00 00 00 00 66 66 00 e9 +00 00 00 00 6c cd 00 e9 +00 00 00 00 73 33 00 e9 +00 00 00 00 79 9a 00 e9 +00 00 00 00 80 00 00 e9 +00 00 00 00 86 66 00 e9 +00 00 00 00 8c cd 00 e9 +00 00 00 00 93 33 00 e9 +00 00 00 00 99 9a 00 e9 +00 00 00 00 a0 00 00 e9 +00 00 00 00 a6 66 00 e9 +00 00 00 00 ac cd 00 e9 +00 00 00 00 b3 33 00 e9 +00 00 00 00 b9 9a 00 e9 +00 00 00 00 c0 00 00 e9 +00 00 00 00 c6 66 00 e9 +00 00 00 00 cc cd 00 e9 +00 00 00 00 d3 33 00 e9 +00 00 00 00 d9 9a 00 e9 +00 00 00 00 e0 00 00 e9 +00 00 00 00 e6 66 00 e9 +00 00 00 00 ec cd 00 e9 +00 00 00 00 f3 33 00 e9 +00 00 00 00 f9 9a 00 e9 +00 00 00 00 00 00 00 ea +00 00 00 00 06 66 00 ea +00 00 00 00 0c cd 00 ea +00 00 00 00 13 33 00 ea +00 00 00 00 19 9a 00 ea +00 00 00 00 20 00 00 ea +00 00 00 00 26 66 00 ea +00 00 00 00 2c cd 00 ea +00 00 00 00 33 33 00 ea +00 00 00 00 39 9a 00 ea +00 00 00 00 40 00 00 ea +00 00 00 00 46 66 00 ea +00 00 00 00 4c cd 00 ea +00 00 00 00 53 33 00 ea +00 00 00 00 59 9a 00 ea +00 00 00 00 60 00 00 ea +00 00 00 00 66 66 00 ea +00 00 00 00 6c cd 00 ea +00 00 00 00 73 33 00 ea +00 00 00 00 79 9a 00 ea +00 00 00 00 80 00 00 ea +00 00 00 00 86 66 00 ea +00 00 00 00 8c cd 00 ea +00 00 00 00 93 33 00 ea +00 00 00 00 99 9a 00 ea +00 00 00 00 a0 00 00 ea +00 00 00 00 a6 66 00 ea +00 00 00 00 ac cd 00 ea +00 00 00 00 b3 33 00 ea +00 00 00 00 b9 9a 00 ea +00 00 00 00 c0 00 00 ea +00 00 00 00 c6 66 00 ea +00 00 00 00 cc cd 00 ea +00 00 00 00 d3 33 00 ea +00 00 00 00 d9 9a 00 ea +00 00 00 00 e0 00 00 ea +00 00 00 00 e6 66 00 ea +00 00 00 00 ec cd 00 ea +00 00 00 00 f3 33 00 ea +00 00 00 00 f9 9a 00 ea +00 00 00 00 00 00 00 eb +00 00 00 00 06 66 00 eb +00 00 00 00 0c cd 00 eb +00 00 00 00 13 33 00 eb +00 00 00 00 19 9a 00 eb +00 00 00 00 20 00 00 eb +00 00 +11 01 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +11 02 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +11 03 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +22 +38 79 +01 06 + diff --git a/fpga/SX1301_FPGA_NOTCH_PROG_SPECTRAL_SCAN_v31.hex b/fpga/SX1301_FPGA_NOTCH_PROG_SPECTRAL_SCAN_v31.hex new file mode 100644 index 00000000..b15c4fc0 --- /dev/null +++ b/fpga/SX1301_FPGA_NOTCH_PROG_SPECTRAL_SCAN_v31.hex @@ -0,0 +1,1659 @@ +ff 00 +4c 61 74 74 69 63 65 00 +69 43 45 63 75 62 65 32 20 32 30 31 35 2e 30 34 2e 32 37 34 30 39 00 +50 61 72 74 3a 20 69 43 45 34 30 4c 50 31 4b 2d 43 4d 34 39 00 +44 61 74 65 3a 20 53 65 70 20 31 20 32 30 31 36 20 31 36 3a 34 33 3a 34 37 00 +00 ff +7e aa 99 7e +51 00 +01 05 +92 00 20 +62 01 4b +72 00 90 +82 00 00 +11 00 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 05 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 03 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 00 81 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 00 03 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 20 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 +00 00 00 00 00 0d 7a 95 00 00 02 00 46 8b 7c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 01 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 d4 15 50 00 00 04 3f c8 12 4a 00 78 00 00 00 00 00 00 00 00 00 00 00 02 00 c0 00 00 00 00 00 00 00 00 00 00 +00 00 18 00 00 08 3b 45 00 60 03 c0 7c 99 5c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 78 a0 00 +00 00 00 00 00 00 f2 b8 90 00 00 06 2b 48 56 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 42 02 0a 00 00 +00 00 00 00 80 00 7b 15 00 40 00 46 26 8b 7e 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 01 00 b7 b2 90 04 00 00 00 cd 12 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 02 00 00 00 a3 3a 80 40 00 03 66 94 99 5c 00 00 00 00 00 00 00 10 02 00 00 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 10 08 28 00 40 00 14 2d e8 56 48 00 00 00 00 00 00 00 00 40 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 18 2a 80 00 00 00 00 66 9b 7e 00 00 00 00 00 00 00 00 00 3c ef 50 10 00 00 00 fb bf c0 00 00 00 00 00 00 00 +00 00 20 00 00 08 30 14 00 00 00 00 23 48 12 40 00 00 00 00 00 00 00 00 03 50 50 00 40 00 00 0d 67 f8 40 00 00 00 00 00 00 00 +00 00 00 00 00 03 ba 80 00 00 00 06 74 99 5c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 04 00 00 00 00 00 00 +00 00 00 00 01 00 00 28 00 00 00 34 21 48 56 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 +00 00 00 00 18 08 02 04 00 00 02 67 26 9b 7c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 33 50 80 00 00 0c 01 4d 12 40 00 00 00 00 00 00 00 04 3c 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 +00 00 30 00 70 05 f2 80 00 c0 00 40 26 9b 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 03 00 00 0c 08 28 00 0c 00 02 00 6d 21 41 00 00 00 00 00 00 00 00 00 00 00 00 01 00 30 00 00 00 00 10 00 00 00 00 00 00 +00 00 00 00 81 e1 6a 95 80 00 01 42 96 aa 00 00 00 00 00 00 00 00 00 06 a5 cf 50 00 00 10 0e d2 2b c0 00 00 20 05 58 a0 60 +00 00 00 00 01 00 1c 2a 90 00 08 14 00 10 a0 00 00 00 00 00 00 00 00 00 41 60 a0 01 00 00 11 03 43 fc c0 00 01 43 a4 0f 56 98 +00 00 18 00 00 8f 7a 95 00 00 01 e0 01 ea 00 00 00 00 00 00 00 00 a1 60 36 ef 50 00 00 05 80 77 a0 00 0a 00 bc 00 00 00 00 +00 00 00 00 00 10 90 15 54 00 00 02 01 50 50 00 00 30 00 00 00 00 00 02 01 d0 50 01 00 00 10 0d 74 00 00 a0 13 60 00 00 00 00 +00 00 00 00 00 08 3b 45 00 00 09 c3 24 98 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 bb 00 44 80 00 34 29 6a 05 00 +00 00 00 00 00 00 77 b8 90 00 01 76 29 5b 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 02 30 cb 81 48 40 00 00 66 c0 00 51 00 +00 02 00 00 81 90 00 00 00 00 01 42 a4 c8 00 20 00 00 00 00 00 00 00 40 00 00 00 03 00 00 00 7b e0 48 00 0e 04 60 0a 50 00 +00 00 00 00 0d 0f 00 00 00 00 00 14 2b 40 00 01 00 00 00 00 00 00 00 80 00 00 00 00 20 00 00 0b 62 80 60 00 03 60 15 0a 00 80 +00 00 00 00 00 07 6a 80 00 00 02 00 07 af 50 00 00 00 00 00 00 00 00 00 26 ef 50 00 00 0b 0c 03 94 00 00 00 00 01 4a 05 00 +00 00 20 00 00 00 08 28 00 00 06 04 03 50 50 00 40 00 00 00 00 00 00 00 3d 40 a0 01 00 00 50 03 42 80 00 00 00 00 02 00 51 00 +00 00 00 00 98 08 7b 15 00 00 00 07 bd af 50 00 00 00 00 00 00 00 15 c2 0e c5 00 00 00 20 18 10 49 00 00 00 40 20 0a 50 20 +00 00 00 00 03 00 33 f2 90 00 04 00 70 40 a0 00 40 00 00 00 00 00 00 be 43 50 00 00 00 01 10 e3 34 00 01 00 08 04 14 0a 00 00 +00 00 00 00 18 13 ea 80 00 00 09 c0 01 ca 00 00 00 00 00 00 00 00 00 47 80 b1 20 00 00 07 9c 83 81 48 10 00 1c 00 fe a0 40 +80 00 00 00 00 08 00 28 00 20 01 42 01 50 50 00 00 00 00 00 00 00 00 1e 02 dc 21 00 00 00 f8 81 00 28 82 00 00 20 07 0f 54 00 +00 00 30 00 30 0d fa 95 00 0a 00 03 8e aa 00 00 00 50 00 00 00 00 14 60 3e e0 20 20 00 03 1e 77 bd 40 04 00 00 06 7a f5 49 +00 00 01 00 00 00 38 15 50 00 40 00 00 20 a0 08 00 02 00 00 00 00 01 84 02 c0 a1 11 00 00 00 0d 43 fc 20 c0 00 02 2d 05 04 04 +00 00 00 00 78 07 37 dc 02 00 00 00 1c ea f4 00 00 00 00 30 10 00 00 00 00 e0 50 00 00 08 00 b7 29 58 00 40 00 02 08 84 d0 +00 00 00 00 00 8b da 7f c0 10 00 00 01 d0 a0 c0 00 00 00 c5 82 00 00 00 3e 50 0a 00 00 00 90 01 41 55 00 02 20 00 1c c1 24 20 +00 00 28 00 78 08 7b 15 00 a0 00 00 00 ea a4 01 80 08 1b 78 08 00 06 00 00 c5 00 81 80 4f 80 00 00 00 06 c1 20 02 09 84 c0 +00 00 02 00 00 0b 57 32 b0 08 0c 0c 03 c0 55 c1 00 00 90 f7 01 00 a0 34 3f c0 a0 00 00 02 b0 00 00 00 00 0e 01 40 0c e1 24 00 +00 00 00 00 19 8b ba 81 00 c0 00 00 40 00 00 00 00 09 80 78 00 00 11 e0 7d ef 50 03 00 00 00 07 03 c0 04 00 00 3f 48 84 c0 +00 00 00 00 00 8b dc 3e b0 04 00 1c 38 00 00 00 00 00 98 09 81 00 00 82 2b 70 50 00 30 00 00 00 40 3c 40 c0 04 03 5e 01 24 00 +00 02 00 00 81 88 2f 91 00 00 00 00 0e 00 00 00 00 01 00 18 00 00 84 06 c1 85 00 00 00 07 00 93 bd 44 00 00 56 6f 68 84 c0 +00 00 00 00 01 00 f7 76 30 00 00 01 03 40 a5 00 00 00 00 05 82 00 00 80 6b c0 a0 00 00 00 00 01 01 40 20 00 00 02 8e 01 24 00 +00 00 00 00 98 05 e2 91 00 04 00 00 14 a5 00 04 00 08 1a f8 02 00 00 00 1d a5 00 00 40 05 81 07 94 00 00 00 00 03 68 84 c0 +00 00 20 00 05 0a b3 39 50 00 20 00 38 20 50 00 08 00 50 01 02 00 00 3c 00 30 50 20 00 08 08 e1 42 80 00 00 c0 40 1e 01 24 00 +00 00 00 00 00 e3 3b e8 00 00 00 00 1c 00 00 00 00 09 80 b0 08 00 00 00 00 a5 00 00 00 00 08 13 14 00 00 00 06 03 68 84 e0 +00 00 00 00 00 00 00 3e 80 00 00 04 03 60 a5 00 00 00 98 03 02 00 00 00 03 c0 a0 00 00 00 00 f0 41 40 00 00 00 60 0c 01 24 00 +00 00 00 00 58 17 e2 85 08 00 02 66 80 00 00 00 00 00 01 98 00 00 00 00 5c a5 02 00 08 0b 8c 03 94 00 00 00 20 03 c8 84 c8 +00 00 00 00 00 08 98 2d 50 00 00 04 6c 00 00 00 00 00 10 a3 80 00 00 00 38 30 50 00 00 00 78 01 02 80 00 00 e1 c0 1c 01 24 00 +00 00 30 00 00 f5 aa 15 00 c0 00 00 06 00 00 01 00 09 1a 78 00 00 00 00 01 85 00 01 00 50 01 17 14 00 0c 02 a6 02 68 84 e0 +00 00 02 00 00 08 da 39 50 08 00 00 03 40 a5 00 30 00 b8 ef 82 40 00 00 3f d0 a0 00 30 00 00 e0 41 40 00 40 02 60 0c 01 24 00 +00 00 00 00 98 00 32 bd 00 10 09 60 14 da 14 00 00 00 0e 38 10 00 00 06 dd 85 02 00 00 80 00 76 94 00 00 80 56 3d 48 84 d0 +00 00 00 00 01 80 10 17 d0 01 00 14 00 eb 7a 40 00 20 00 0b 00 00 00 00 6c 00 50 00 00 28 00 00 01 40 00 00 08 02 b4 01 24 40 +00 00 28 00 80 01 33 dc 00 a0 00 00 0c ea 04 09 80 09 80 18 00 00 21 60 47 cf 50 00 00 00 00 07 14 00 06 40 20 39 68 84 c0 +00 00 02 00 0f 00 56 3f c0 58 00 00 00 40 f5 c1 00 00 b8 03 01 40 00 3c 2a 70 a0 00 00 00 00 07 42 80 00 0a 01 c0 26 01 26 00 +00 00 01 00 80 00 01 99 08 00 01 46 40 a0 50 00 00 07 01 30 02 00 00 00 2c e8 01 20 00 08 00 77 94 00 0c 00 a0 39 68 84 c0 +00 00 00 09 89 00 b0 26 70 00 00 80 29 50 0a 00 00 00 00 9f 81 00 00 00 3f e0 e5 00 01 00 70 00 41 40 00 c0 11 40 36 01 25 00 +00 02 00 00 18 00 00 00 00 00 02 06 04 ab 04 20 00 07 80 b8 00 00 00 00 41 85 02 00 00 00 0e 03 14 00 10 00 80 6c 48 84 c0 +00 00 00 80 00 00 00 00 00 02 00 04 00 d0 f2 40 00 00 00 07 81 40 00 40 39 d0 a0 00 09 00 31 07 02 80 00 00 04 02 a6 01 25 00 +00 00 00 01 18 11 02 94 00 00 03 e0 05 aa 04 10 00 1f 98 18 00 00 00 07 14 e0 50 00 00 1f 81 d3 3d 40 00 20 20 00 68 84 c0 +00 00 20 80 00 08 b0 3f c0 02 00 04 03 40 fa c0 00 00 f1 83 02 00 00 00 40 20 05 00 08 00 70 fb 01 40 00 20 03 c0 36 01 24 04 +00 00 00 00 00 05 e2 85 08 00 00 00 44 af 50 00 00 09 9b 38 00 00 00 00 40 85 00 00 00 00 01 5f 34 40 80 00 80 00 c8 84 e0 +00 00 00 00 00 00 50 2d 50 00 00 00 20 00 f5 00 00 00 58 a9 02 00 00 00 25 d0 a0 10 00 00 f0 e7 81 40 80 00 e0 00 24 01 24 00 +00 00 00 00 00 0b 7a 81 00 00 00 60 34 ca 14 20 10 00 1e 38 00 00 02 00 16 e0 50 00 00 00 00 77 94 00 00 00 80 79 e8 84 e0 +00 00 00 80 00 00 54 3e b0 02 00 00 02 e0 7a 40 02 80 00 05 80 00 00 1c 00 20 05 00 00 00 90 00 01 40 00 00 14 00 36 01 24 00 +00 00 30 00 00 10 00 00 00 c0 00 00 04 aa f0 01 00 08 0e 78 00 06 00 07 81 85 00 00 01 a8 01 03 14 00 04 00 00 05 48 84 50 +00 00 02 00 00 08 00 00 00 08 00 00 00 00 af 00 30 00 71 0d 82 00 e0 00 41 c0 a0 00 02 00 f0 f7 42 80 00 40 00 03 c6 02 14 00 +00 00 80 00 01 eb b7 dc 02 00 00 00 2c aa 04 00 00 20 00 00 00 00 c0 00 0e bf f0 00 00 80 00 ba a9 40 00 00 20 03 5c f5 00 +08 00 20 00 00 00 1b 7f c4 00 00 00 02 40 fa c1 00 44 00 00 00 00 00 00 21 7b f7 10 00 00 00 01 03 d4 00 00 02 40 2d 05 00 00 +00 00 18 00 80 05 6b d4 00 a0 00 00 1d 8f 54 00 00 00 00 00 00 60 00 00 34 a3 c4 21 80 08 1e ba 8d 52 ca 00 00 00 00 00 00 +08 00 00 00 01 00 08 3d 40 08 4c 0c 28 c0 a0 c1 00 00 00 00 00 00 00 00 3e e0 3e 40 00 00 f1 07 80 c1 81 a0 02 c0 00 00 00 00 +00 00 00 00 01 8b a2 80 00 04 02 00 00 00 00 00 03 a0 00 00 00 40 01 e6 4c ea f0 11 00 01 9e 3f d4 1a 40 00 20 69 da f5 00 +00 00 00 00 00 00 bc 00 00 00 20 04 00 00 00 00 00 05 00 00 00 04 00 00 20 10 af 00 30 00 f0 05 62 e1 41 00 02 44 05 0a 00 00 +00 01 00 05 18 00 28 cd 08 00 00 60 00 00 00 00 00 00 00 00 00 00 00 07 01 ae f0 00 00 50 00 52 81 40 40 00 1c 60 cc f5 00 +00 00 00 80 20 00 04 0c d0 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 df df 00 00 02 00 00 80 14 00 14 02 c2 55 0a 00 00 +00 00 00 00 18 03 bd 8d 00 00 00 60 00 00 00 00 03 00 00 00 00 00 09 60 00 16 60 00 00 00 00 f6 30 40 00 04 3e 05 cc f5 10 +08 00 00 80 00 00 d6 30 d0 02 00 02 00 00 00 00 00 00 00 00 00 02 01 00 01 4b 99 00 08 00 00 03 fa 04 00 20 01 e3 06 0a 00 00 +00 00 00 00 19 95 69 55 00 00 00 00 01 aa 04 08 00 00 00 00 00 00 00 02 3e e0 04 20 00 01 81 7b bd 40 00 00 04 7b 6f 50 48 +80 00 00 00 07 08 f8 3c 10 00 00 00 00 c0 50 c0 00 00 00 00 00 00 00 00 02 e0 01 40 00 00 10 8f 83 fc 00 00 02 42 4d ad 14 04 +00 00 00 00 00 1b a0 15 00 00 00 60 00 00 00 00 00 20 00 00 00 00 01 60 0d d0 24 00 00 05 00 80 60 40 00 00 a4 24 ff 50 41 +08 00 00 00 00 08 bc 3e 90 02 00 00 00 00 00 00 00 01 00 00 00 00 00 00 21 5b 00 40 00 02 00 a1 3d 08 00 00 13 c7 f5 8e 24 00 +00 00 30 00 00 08 01 99 00 c8 08 00 00 00 00 00 00 00 00 00 00 c0 00 42 15 81 04 03 00 1f 08 3e 00 00 0c 00 44 07 fb e2 41 +00 00 01 00 00 00 b2 66 50 08 00 c0 00 00 00 00 00 00 00 00 00 0c 00 02 03 dc 00 40 30 06 10 cf 01 40 00 40 00 02 0d aa 06 00 +00 00 00 00 18 a3 22 bc 00 00 21 40 45 9e f0 00 00 00 00 00 00 00 01 40 0f 8a 04 00 00 40 00 d3 bc 00 00 08 26 68 5b 74 00 +00 00 00 00 00 90 0c 2b c0 00 00 1c 3c 4d ff 00 00 00 00 00 00 00 00 9c 02 e0 f5 40 00 00 00 03 c1 54 00 00 c3 c0 14 b2 40 00 +00 00 00 00 80 80 2a 80 00 62 01 c0 04 cf 70 00 00 00 00 00 00 60 00 e2 84 ca 54 00 00 00 00 07 01 40 06 00 00 02 4e a3 6a +00 00 00 00 01 10 34 14 00 00 40 00 03 4a ff 00 00 00 00 00 00 00 00 24 03 d0 55 40 00 00 00 0d 00 28 00 00 02 40 34 00 34 10 +00 00 00 00 18 a9 f3 fc 08 40 02 00 5e af 70 00 00 00 00 00 00 c0 02 00 45 af 54 00 00 00 00 bb 8c 00 8c 00 1c 05 68 30 60 +00 00 00 00 00 90 1c 3b c0 44 00 14 34 d8 ff 00 00 00 00 00 00 0c 00 04 3e c0 a0 41 00 00 d0 a5 40 d4 00 c0 00 22 07 eb 14 04 +00 02 00 00 00 01 b7 ec 00 00 00 40 1c ea 44 30 00 00 00 00 00 00 03 42 ad aa 04 00 00 03 80 7b a9 c0 80 00 26 62 fa 51 00 +00 00 00 00 00 00 13 ff c0 10 00 02 01 e0 00 40 00 00 00 00 00 00 00 04 69 e0 fa 40 00 00 08 07 82 88 00 00 01 43 7e da 10 00 +00 00 00 00 d8 c3 27 bc 00 00 00 00 05 8a 00 10 01 00 00 00 00 00 00 00 54 aa 04 00 00 00 00 d3 a8 00 00 00 06 7e ec c0 02 +00 00 20 00 01 00 5f 7f c0 00 00 1c 00 00 a0 00 00 00 00 00 00 00 00 00 36 d0 f5 40 00 20 70 07 c0 00 00 00 00 02 7c 0c f0 00 +00 00 00 00 01 93 ab d4 00 00 00 00 05 cf d0 30 00 00 00 00 00 00 00 66 16 c0 54 00 13 09 80 37 28 00 00 00 06 02 4e a3 63 +00 00 00 00 00 0a b8 3f c0 00 00 1c 33 40 ff 00 00 00 00 00 00 00 00 00 00 30 05 40 00 80 70 9d 43 d4 00 00 00 03 34 00 34 90 +00 00 00 00 00 09 32 94 48 00 00 62 95 8f 50 00 00 00 00 00 00 00 00 67 c7 cf 54 00 00 0d 81 d3 80 00 00 00 06 39 4e a5 00 +00 00 00 00 00 00 18 12 80 10 00 24 40 60 ff 00 00 01 00 00 00 00 00 00 6e e0 a0 41 00 30 10 a3 c0 14 00 00 00 22 2f ab 50 00 +00 00 00 00 00 15 73 fc 00 40 00 00 00 00 00 00 00 00 00 00 00 40 02 00 3c ca 54 00 01 85 98 7b a1 40 84 00 00 64 1a c0 02 +00 00 00 00 00 0a b6 7f 80 0c 00 1c 00 00 00 00 00 00 00 00 00 04 00 2c 03 50 55 40 00 00 00 05 03 54 00 40 00 06 00 0c 00 00 +00 00 00 00 99 89 23 fc 00 00 02 06 97 bf 70 00 00 00 00 00 00 00 00 00 3c 88 4c 00 08 05 80 3a 95 40 00 06 14 00 1c 0f 00 +00 00 00 00 01 8a 54 3e 80 00 00 5c 00 6d ff 08 00 40 00 00 00 00 01 00 03 c0 12 52 00 00 78 01 41 40 00 00 00 03 80 00 f0 00 +00 00 18 00 00 a1 78 3c 00 00 42 00 06 e0 41 00 00 00 00 00 00 60 00 63 ae 88 4c 00 00 31 81 da a9 40 06 06 34 00 00 00 00 +00 00 00 00 07 10 7c 2b c0 00 00 04 2a 6a 00 08 00 00 00 00 00 00 00 00 02 ec 12 40 00 02 38 d3 f6 2c 00 00 03 43 00 00 00 00 +00 00 00 00 10 01 fb fc 08 00 01 40 4e 8f e0 00 00 00 00 00 00 d0 00 02 f4 98 4c 00 00 21 89 16 b9 c0 84 00 14 70 40 a5 00 +00 00 00 00 00 80 1c 3d c0 00 00 14 34 1a fe 00 00 00 00 00 00 0d 00 00 23 ed 12 50 00 05 79 91 43 88 00 40 00 06 b4 0f f0 00 +00 02 00 00 d0 00 7b c1 00 00 02 00 06 e2 40 20 00 00 00 00 00 00 00 03 ee 98 4e 00 00 05 8e 17 68 80 00 00 0e 05 f8 50 4a +00 00 00 00 01 00 00 3c 10 00 00 1c 31 40 20 01 00 00 00 00 00 00 00 00 3e eb 12 40 00 00 09 cd 77 c4 00 00 00 22 1f 0b 04 00 +00 00 00 00 00 0f 6e c1 00 00 e0 e0 34 cf f0 00 00 00 00 00 00 10 00 60 3e 9b 7c 00 00 20 1d d6 03 00 80 00 00 00 00 00 00 +00 00 20 00 05 00 33 bc 50 00 00 02 36 60 fa 00 00 00 00 00 00 01 00 00 3f 4d de 40 00 05 01 8f 81 70 00 00 00 00 00 00 00 00 +00 00 00 00 18 0f f7 1d 00 02 00 60 4c ee 52 20 00 00 00 00 00 00 00 03 ae 98 44 80 00 01 09 32 b1 40 a0 00 06 03 4b ef 01 +00 00 00 00 03 00 53 30 90 00 0e 02 3f f0 f5 20 40 00 00 00 00 00 00 00 66 e8 12 40 00 00 01 80 83 14 00 00 00 40 06 bf f0 00 +00 00 00 00 00 05 f3 d4 40 00 00 e6 74 e0 00 10 00 00 00 00 00 00 a2 02 00 00 00 00 02 80 00 ba e1 40 00 00 96 02 0a f5 00 +00 00 00 00 05 00 30 3f c0 10 00 02 60 5e 08 00 00 00 00 00 00 00 00 04 40 00 00 00 00 00 00 01 67 54 00 00 10 40 15 0f a0 00 +00 00 10 00 39 b8 2f 80 40 00 00 00 06 ef d0 10 00 00 00 00 00 c0 02 43 b4 ca 04 00 00 00 18 9e b9 c0 0c 00 00 73 d8 a5 42 +00 00 01 00 00 0a 32 b4 00 00 00 00 03 eb ff 00 00 04 00 00 00 0c 00 04 42 70 f5 40 00 00 00 03 2a 2c 00 40 00 00 04 0a d4 80 +40 00 00 08 51 80 32 80 00 00 02 00 0d af 56 00 00 00 00 00 00 00 02 06 24 af 00 00 00 03 18 da f0 c0 60 00 00 61 e8 84 c0 +80 00 20 00 0d 8b 94 14 00 00 00 1c 00 00 f5 40 00 00 00 00 00 00 00 04 2c f0 5a 00 00 00 08 9d ff 8c 01 00 01 40 06 c1 24 20 +00 04 18 00 50 e1 62 00 08 60 02 00 0c a5 05 80 00 00 00 00 00 60 08 00 05 cf 00 01 80 20 00 7e 94 00 06 00 14 00 68 84 c0 +08 03 00 00 0d 98 10 00 00 00 00 3c 00 30 50 70 00 00 00 00 00 00 00 54 02 60 0f 00 00 21 f0 c0 c1 40 20 00 00 03 d6 c1 24 10 +60 00 30 01 79 99 eb f4 08 00 08 06 00 0a 54 00 00 40 00 00 00 4a 01 47 8c e7 80 21 00 18 00 87 28 10 0d 00 80 05 49 84 c0 +83 c0 03 00 20 9f d4 3f c8 00 01 00 03 40 5a 40 00 00 00 00 00 0c 00 00 6c 50 87 00 10 0a f0 cf 41 41 00 50 15 42 06 91 24 00 +00 03 00 02 b8 a7 a9 40 00 00 00 00 04 0a 54 00 02 80 00 00 00 00 41 e0 00 0c 34 20 00 08 0f b7 a9 50 00 00 14 04 68 84 c0 +00 00 00 01 9b 1b fc 00 00 00 00 3c 38 00 a5 40 00 20 00 00 00 00 00 00 30 00 c3 41 00 30 71 a7 c1 55 00 00 00 02 16 91 24 10 +00 00 04 01 01 d5 ab 94 0c 00 02 60 40 00 00 00 10 00 00 00 00 00 01 40 20 85 50 00 01 d0 01 92 3d 50 00 c0 a6 03 e9 b7 c0 +00 00 20 40 00 18 54 30 00 00 00 0c 20 00 00 00 00 02 00 00 00 00 00 00 00 d0 aa 00 00 00 00 89 41 41 00 00 14 43 d4 9d ec 10 +44 00 30 05 00 0f b2 81 40 00 00 06 00 00 00 00 00 10 00 00 00 00 c1 c0 35 9f 70 00 00 09 9d 3f a9 50 00 0a 06 60 69 84 c0 +00 c2 82 03 20 00 94 02 98 00 00 00 00 00 00 00 00 02 00 00 00 00 00 26 00 cb ff 10 00 00 11 85 41 55 00 00 04 00 16 c1 24 04 +00 00 00 00 00 8d a7 94 00 00 01 e0 1f a0 54 10 00 00 00 00 00 00 03 e0 2e ee 02 00 00 00 01 f7 3d 50 00 4c 00 01 69 84 c1 +08 02 c0 30 00 18 76 70 00 00 00 00 00 f0 af 40 00 00 00 00 00 00 0c 3e 28 4a f0 00 00 20 00 ff 82 81 00 02 00 00 06 91 24 00 +40 00 10 00 18 a7 aa 80 00 40 00 00 7c ca 54 04 00 00 00 00 00 44 00 07 be e0 21 25 00 08 1e bf a9 50 2c 00 3e 02 69 b7 c1 +00 00 03 00 00 00 fc 3c 00 04 00 00 22 c0 aa 40 00 00 00 00 00 0c 00 00 43 60 00 00 10 00 f0 05 c1 55 00 ca 00 42 06 dd ec 00 +00 00 +11 01 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 05 40 00 00 00 00 10 00 00 00 00 00 00 40 00 00 00 00 0d 01 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 +00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 10 00 00 83 42 81 00 c0 00 22 17 05 04 00 08 00 00 00 00 c0 00 02 2f 0a a4 03 00 00 8a 34 28 10 0c 00 3c 29 d0 a0 40 +00 00 01 00 05 81 7e bd 50 0c 00 1e 04 da f5 40 01 00 00 00 00 04 00 16 07 4c a5 40 30 00 71 b1 eb d5 00 c0 03 e7 f7 af 54 00 +00 00 00 00 00 05 41 41 00 00 00 02 35 05 04 00 00 00 00 00 00 00 01 c2 2d 0a 04 00 00 00 08 b8 2a 90 00 00 00 23 d0 a0 40 +00 00 00 00 01 80 b7 bd 50 00 00 06 04 5e f5 40 01 00 00 00 00 00 00 26 05 de f5 40 00 00 18 1f 32 95 00 00 00 00 75 af 54 00 +00 00 00 00 00 03 02 81 00 00 00 00 3e 05 04 00 00 00 00 00 00 00 00 00 0d 0a a6 00 00 00 08 30 28 10 00 00 00 01 e0 a0 40 +00 00 00 00 00 00 76 bd 50 00 00 00 02 da f5 40 00 02 00 00 00 00 00 06 63 cc a5 40 00 00 00 17 6b d5 00 00 00 00 2d af 54 00 +00 02 00 00 00 8d 01 41 00 02 00 02 ae 0a 06 00 00 00 00 00 00 00 00 02 ee 0a 04 00 00 01 08 10 14 10 00 00 00 3b e0 a0 40 +00 00 00 00 07 81 b6 bd 50 00 40 00 01 7a f5 40 00 00 00 00 00 00 00 00 00 fa f5 40 00 00 f8 13 6b d5 00 00 00 00 75 af 54 00 +00 00 00 00 10 0f 71 c9 00 00 00 43 7f 05 04 00 00 00 00 00 00 00 00 40 25 0a a4 00 00 01 00 3c 28 14 00 00 04 21 70 50 40 +00 00 20 00 09 98 82 ac 50 00 00 26 64 ca f5 40 00 00 00 00 00 00 00 3e 01 ec a5 40 00 00 99 87 ab d5 00 00 02 66 7e af 54 00 +00 00 00 00 10 0b 02 a9 00 00 00 40 1d 05 04 00 10 00 00 00 00 00 20 40 2f 0a 04 00 00 00 00 b0 2a 90 00 00 04 33 f0 f5 40 +00 00 00 00 08 18 5b 29 50 00 00 20 60 4e f5 40 02 85 00 00 00 00 00 20 61 ee f5 40 00 30 01 85 b2 95 00 00 03 e6 7d ea 05 00 +00 00 00 00 d0 03 82 81 00 00 00 00 06 0a 04 00 00 00 00 00 00 00 00 00 3e 05 04 00 00 05 00 30 28 10 00 00 00 01 e0 f5 48 +00 00 01 80 08 00 33 bd 50 06 00 00 01 6e f5 40 00 00 00 00 00 06 00 00 28 ce f5 40 18 00 80 03 3b d5 00 60 00 00 24 aa 06 00 +00 00 00 00 00 0d 01 41 00 00 00 04 2e 0a 04 00 00 10 00 00 00 00 00 00 2d 0f 54 00 00 05 00 38 2a 90 00 01 40 3f 40 50 40 +00 00 00 00 00 00 32 bd 52 00 00 04 38 4a f5 40 00 00 00 00 00 00 00 00 61 58 a0 40 00 00 80 07 b2 95 00 00 00 00 5e af 54 00 +00 00 30 00 f0 87 42 81 00 c0 00 02 17 0a 04 00 00 00 00 00 00 40 00 02 05 0a 04 01 00 0f 08 97 9c 90 0c 00 00 20 f0 f5 40 +00 00 01 00 01 81 9e bd 50 0c 00 04 07 5a f5 40 00 00 00 00 00 0c 00 00 05 da f5 40 10 00 00 18 6e c5 00 c0 00 40 56 aa 04 00 +00 00 00 00 00 87 41 41 00 00 00 02 35 05 04 00 23 80 00 00 00 00 01 c2 35 a7 24 00 00 00 08 74 14 10 00 00 00 20 d0 a0 40 +00 00 00 00 01 81 7f bd 50 00 0c 06 07 7e f5 40 00 00 00 00 00 00 00 26 04 1e b1 40 00 00 18 17 fb d5 00 00 00 60 77 ef 54 00 +00 00 00 00 00 07 43 d5 00 00 00 00 14 0a 04 00 00 00 00 00 00 00 00 40 14 05 04 00 00 01 00 70 28 10 00 00 3c 00 c0 a0 40 +00 00 00 00 00 00 fa a8 10 00 00 00 02 5a f5 40 00 00 00 00 00 00 00 00 01 5a f5 40 00 00 80 0b eb d5 00 00 02 00 05 af 54 00 +00 02 00 00 00 0d 01 41 00 00 00 00 06 0a a6 00 00 00 00 00 00 00 00 03 96 0a 04 00 00 00 00 38 2a 90 00 00 02 00 d0 f5 40 +00 00 00 00 00 00 fe bd 50 00 00 00 03 fa a5 40 00 00 00 00 00 00 00 00 05 fa f5 40 00 00 00 0f fa 95 00 00 01 e0 37 aa 06 00 +00 00 00 00 10 0f 79 c9 00 00 02 40 17 0a 04 00 00 00 00 00 00 00 00 40 07 0a 04 00 00 00 00 74 28 10 00 00 04 38 e0 f5 40 +00 00 20 00 0f 18 82 ec 50 00 00 06 62 6a f5 40 00 30 00 00 00 00 00 26 60 ca f5 40 00 00 19 8d ab d5 00 00 02 66 54 ea 04 00 +00 00 00 00 00 07 41 41 00 00 00 00 1d 05 04 00 01 00 00 00 00 00 00 60 15 a7 24 00 00 01 00 d4 14 10 00 00 04 01 50 50 40 +00 00 00 00 00 18 fb bd 50 00 00 00 61 6e f5 40 00 10 00 00 00 00 00 3e 62 0e b1 40 00 00 81 87 bb d5 00 00 02 06 2c ef 54 00 +00 00 00 00 50 05 39 c9 00 00 00 43 96 0a 04 00 00 00 00 00 00 00 00 00 14 05 04 00 00 0b 1b 78 28 10 00 00 00 03 c0 50 40 +00 00 01 80 00 00 83 ec 50 06 00 20 02 4e f5 40 00 00 00 00 00 06 00 00 03 4e f5 40 18 00 80 a9 bb d5 00 60 00 00 2e ef 54 00 +00 00 00 00 10 01 82 a9 00 00 00 42 86 0a a4 00 04 00 00 00 00 00 00 20 14 0a 04 00 00 00 00 d0 14 10 00 00 14 00 d0 f5 40 +40 00 00 00 08 00 77 a9 50 00 00 20 01 da a5 40 00 00 00 00 00 00 00 1e 01 ca f5 40 00 00 00 0f ab d5 00 00 00 00 34 ea 06 00 +00 00 10 00 00 03 42 81 00 c0 00 20 25 87 24 00 00 00 00 00 00 c0 00 00 00 00 00 01 00 00 18 bc 2a 90 04 00 00 62 f0 f5 40 +00 00 03 00 00 00 5e bd 50 0c 00 1c 02 1b b1 40 00 00 00 00 00 04 00 06 00 00 00 00 30 00 01 9f f2 95 00 40 00 07 56 ca 04 00 +00 00 00 00 10 0b 02 a9 00 02 00 02 2c 0a a4 00 00 00 00 00 00 00 00 00 25 d5 34 00 00 00 08 bc 28 10 00 20 00 60 f0 55 48 +00 00 00 00 09 80 bb 29 50 00 40 06 07 58 a5 40 02 80 00 00 00 00 00 00 00 09 a3 40 00 00 00 1b fb d5 00 00 00 07 7e ca 54 00 +00 00 00 00 30 83 02 81 00 00 00 02 06 0a 04 00 00 00 00 00 00 00 00 42 25 0f 54 00 00 03 0f 3c 2a 90 00 00 04 02 e0 a0 41 +00 00 00 00 0d 01 16 bd 50 00 00 00 06 fa f5 40 00 00 00 00 00 00 00 20 05 ea a0 40 00 00 99 89 72 95 00 00 02 00 15 af 54 00 +00 02 00 00 18 87 01 41 00 00 00 00 14 05 04 00 20 00 00 00 00 00 00 02 0d dc a4 00 00 00 00 b0 28 10 40 00 01 7b d0 55 40 +00 00 00 00 0f 01 36 bd 50 00 00 00 02 7a f5 40 00 00 00 00 00 00 00 00 06 09 c5 40 00 00 18 0b 6b d5 00 00 00 07 96 ca 54 00 +00 00 00 00 10 03 c2 81 00 00 00 40 05 0a 04 10 00 00 00 00 00 00 10 20 27 0f 54 00 00 01 00 fc 14 10 10 00 04 00 5d 72 40 +00 00 20 00 09 98 3a bd 50 00 00 26 62 6a f5 40 00 00 00 00 00 00 00 1c 01 4c a0 40 00 00 80 0b ab d5 00 00 02 66 20 ab 14 00 +00 00 00 00 d0 0b 02 a9 00 00 00 40 1d 05 04 00 00 40 00 00 00 00 02 c3 4d d5 34 00 00 01 00 b4 28 12 00 00 04 03 70 50 40 +00 00 00 00 00 18 73 29 50 00 00 20 60 6e f5 40 00 02 00 00 00 00 00 20 62 08 a3 40 00 00 81 89 3b d5 00 02 02 06 2c ef 54 00 +00 00 00 00 00 03 82 81 00 00 01 60 04 0a 04 00 00 00 00 00 00 00 00 00 36 0e 60 00 00 00 00 34 2a 90 00 00 24 00 00 00 00 +00 00 01 80 00 00 53 bd 50 06 00 04 6a 4e f5 40 00 30 00 00 00 06 00 00 00 fc c1 02 18 00 58 01 72 95 00 60 01 60 00 00 00 00 +00 00 00 00 50 03 02 a9 00 00 01 c0 34 05 04 00 01 00 00 00 00 00 00 06 ee bd 00 00 00 0d 8b b0 28 10 00 00 00 03 d0 55 40 +00 00 00 00 00 00 53 29 50 00 00 00 02 6a f5 40 00 00 00 00 00 00 00 00 79 4a d5 00 00 00 38 09 ab d5 00 00 00 00 34 ca 54 00 +00 00 10 00 f0 07 42 81 00 c0 00 62 1f 0a 04 00 00 00 00 00 00 40 00 02 3d 87 24 00 00 00 80 00 00 00 0c 00 02 02 d0 fa 40 +00 00 03 00 05 80 fe bd 50 0c 00 24 04 7a f5 41 00 00 00 00 00 0c 00 06 06 1a b1 40 00 00 51 e0 00 00 00 c0 00 40 2f ca 04 10 +00 00 00 00 00 8b 02 a9 00 00 02 42 2d 05 04 00 20 00 00 00 00 00 01 40 1d 05 04 00 00 00 00 54 39 80 00 00 00 62 d0 fa 40 +00 00 00 00 01 81 df a9 50 00 00 06 05 de f5 40 00 00 00 00 00 00 00 06 02 5e f5 40 00 00 19 eb 2b 04 0c 00 00 02 6c 8a 04 00 +00 00 00 00 78 80 ba c5 00 00 00 40 24 05 04 00 00 00 00 00 00 00 02 40 14 87 24 00 00 00 00 b0 3e 80 00 00 3c 22 70 c9 00 +00 00 00 00 03 81 3e ec 50 00 00 00 02 fa f5 40 00 00 00 00 00 00 00 00 02 1e b1 60 00 00 78 8d ba 04 08 00 02 06 4f ac 50 20 +00 02 08 00 00 01 02 a9 00 20 00 02 f4 05 04 00 02 80 00 00 00 20 00 02 24 05 04 00 80 00 80 d8 32 40 02 00 02 03 db 98 00 +00 00 00 00 00 00 bf a9 50 00 00 00 01 de f5 40 00 00 00 00 00 00 00 00 06 5a f5 40 00 00 50 89 f3 14 08 00 01 e0 17 de 50 00 +00 00 00 00 10 07 42 81 00 00 03 40 3d 05 04 00 00 00 00 00 00 00 00 43 86 0f 54 00 00 00 8a bf 26 00 00 00 34 02 48 ca 40 +00 00 00 00 09 98 da bd 50 00 00 06 60 ea f5 40 00 30 00 00 00 00 00 20 64 6e a0 60 00 00 71 b5 67 94 00 00 00 07 01 cc 54 00 +80 00 00 00 00 0d 41 41 00 00 00 40 0d 0a 04 00 00 40 00 00 00 00 00 00 2c 0f a4 00 00 05 18 13 a8 80 00 00 00 2c f0 a0 40 +00 00 00 00 00 18 fb bd 50 00 00 20 62 4e f5 40 00 10 00 00 00 00 20 00 00 4e a0 40 00 38 80 b5 76 9c 00 00 00 00 34 ef 54 00 +80 00 00 00 10 0f 39 c9 00 00 00 02 bc 05 04 10 00 00 00 00 00 00 00 07 c5 0f 54 00 00 05 1b 38 39 80 00 80 00 03 c8 53 40 +00 00 01 80 08 00 03 ec 50 06 00 00 2a ee f5 40 00 00 00 00 00 06 00 00 75 cc a0 40 00 00 80 af 63 04 08 60 00 00 01 ca 34 00 +10 02 00 00 10 01 02 a9 00 00 00 00 0c 0f 54 00 04 00 00 00 00 10 00 20 2f ed 00 00 40 0d 09 9b e2 80 00 00 00 03 db 98 00 +00 00 04 00 0d 00 17 a9 50 00 00 16 03 5a a0 40 00 00 00 00 00 00 00 1e 01 78 d5 00 04 00 00 05 f7 94 00 00 e0 66 04 fe 50 00 +00 00 11 00 00 00 00 00 00 c0 00 02 2c 0a a4 00 00 00 00 00 00 40 02 42 07 05 04 01 20 07 08 b4 3e 90 04 00 2e 3b d0 a0 40 +00 00 01 20 01 80 00 00 00 04 00 00 07 4c a5 40 00 00 00 00 00 04 00 00 06 7a f5 40 10 00 51 bb 22 81 00 c0 02 c0 77 af 56 00 +00 00 00 00 00 00 00 00 00 20 00 02 0d 0a 04 00 00 00 00 00 00 00 00 02 25 0a 04 00 00 00 08 dc 15 50 00 00 00 20 00 00 00 +00 00 00 00 01 80 00 00 00 00 00 06 04 7e f5 40 00 00 00 00 00 00 00 06 06 fe f5 60 00 00 59 ef b2 95 00 00 00 00 40 00 00 00 +00 00 00 00 08 03 82 81 00 04 00 00 0c 0a a4 00 00 00 00 00 00 00 00 00 0d 0a a4 00 00 00 00 10 39 88 00 00 3d 3b e0 a0 48 +00 00 00 00 17 00 d7 bd 50 00 20 06 62 4c a5 40 00 01 00 00 00 00 00 06 03 d8 a5 40 00 00 01 87 bb 04 08 00 02 00 75 af 54 00 +00 02 08 04 00 00 00 00 00 20 03 c0 0e 0a 04 00 10 10 00 00 00 20 a0 00 26 0a 05 14 80 07 18 50 39 c0 02 00 00 00 60 fa 40 +00 00 00 00 20 00 00 00 00 00 00 20 01 da f5 41 00 80 00 00 00 00 00 00 02 7a f5 40 00 00 98 e5 b2 80 08 00 00 00 3f ea 04 00 +00 00 00 18 08 00 00 00 00 20 00 60 00 00 00 00 00 40 00 00 00 00 00 43 df 05 04 00 01 07 00 fc 39 80 00 00 00 03 f0 50 40 +00 00 20 00 07 00 00 00 00 00 00 3e 00 00 00 00 00 02 00 00 00 00 00 20 62 6a f5 40 00 00 81 83 7b 04 08 00 00 66 0e af 54 00 +00 00 00 00 01 00 00 00 00 00 00 40 05 c7 24 00 00 00 00 00 00 00 00 40 35 97 24 00 00 00 80 f6 22 80 00 00 00 00 70 50 40 +00 00 00 00 00 0a 00 00 00 00 00 34 02 0e b1 40 01 00 00 00 00 00 00 20 60 0f b1 40 00 00 79 a7 bb 94 00 02 00 06 3e ef 54 00 +00 00 00 00 30 03 03 d5 00 00 03 c0 14 05 04 00 00 00 00 00 00 00 03 c3 87 0a a4 00 01 03 00 fc 39 80 00 00 04 01 d0 c9 00 +00 00 01 80 08 00 f6 a8 10 06 00 16 00 ce f5 40 00 00 00 00 00 06 00 34 2d 78 a5 40 18 00 80 05 23 04 08 60 02 00 26 8c 50 20 +00 00 00 00 00 00 00 00 00 00 03 40 0c 0a 04 00 00 00 00 00 00 00 00 00 26 0a 04 04 00 15 8a fe e2 80 00 00 00 39 f9 98 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 ea f5 40 00 00 00 00 00 00 00 06 03 6a f5 40 03 80 f8 17 bf 94 00 00 00 06 24 ee 50 00 +00 00 30 00 00 00 00 00 00 c0 02 42 00 00 00 00 00 00 00 00 00 40 00 00 04 0f 54 03 00 00 00 94 07 50 0c 00 00 21 40 1d 40 +04 00 01 00 00 00 00 00 00 0c 00 04 04 00 00 00 00 00 00 00 00 0c 00 1e 02 5e a0 40 10 00 01 c9 a8 69 08 c0 00 40 65 a1 a4 20 +80 00 00 00 00 00 00 00 00 00 00 00 15 05 04 00 00 00 00 00 00 00 00 02 00 00 00 00 00 29 00 38 03 c0 00 00 04 40 e0 0f 00 +00 00 00 00 00 00 00 00 00 00 00 06 03 fe f5 40 00 10 00 00 00 00 00 00 04 00 00 00 00 00 80 0d e3 c0 00 00 01 63 a4 ef 00 00 +08 00 00 00 00 00 00 00 00 00 00 00 1e 0a 04 00 00 00 00 00 00 00 00 44 14 05 04 00 00 09 88 7c 3e 90 00 00 14 23 c0 f3 40 +04 40 00 00 00 00 00 00 00 00 00 00 03 5a f5 40 00 00 00 00 00 00 00 00 3b 5a f5 40 00 00 98 13 ab f5 08 00 03 60 64 cf b4 20 +00 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 34 a7 24 00 00 00 8e 37 e2 00 00 00 14 20 d0 a1 00 +00 00 40 00 00 00 00 00 00 00 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1a b1 40 00 00 18 1b a6 ec 00 00 e2 00 15 ea 00 20 +00 00 00 00 50 00 00 00 00 00 00 00 1d 0a 04 00 00 00 00 00 00 00 00 40 3d 05 04 00 00 01 8a 74 28 40 00 00 04 00 50 00 00 +00 00 10 00 2f 00 00 00 00 00 00 06 03 4a f5 40 00 00 00 00 00 00 00 26 01 4a f5 40 00 00 b8 a1 f2 80 08 00 03 40 3c ea 00 00 +00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 e0 17 0a 04 01 00 00 0a d4 00 00 04 00 04 00 6e 0c 40 +00 00 00 00 00 00 00 00 00 00 00 14 60 00 00 00 00 10 00 00 00 00 00 1e 60 ee f5 40 70 10 01 8b 2a 80 00 c0 02 00 1f a5 e4 00 +80 00 00 00 00 00 00 00 00 00 00 00 3c e7 24 00 00 00 00 00 00 00 00 20 00 00 00 00 00 01 00 de 87 50 00 00 00 35 70 1d 40 +00 00 01 80 00 00 00 00 00 06 00 00 02 0f b1 40 00 00 00 00 00 06 00 04 00 00 00 00 18 00 d0 a3 ac 69 00 60 01 40 6e e1 a4 20 +80 02 00 00 00 00 03 c1 80 00 00 00 00 00 00 00 04 00 00 00 00 00 00 40 00 0f 04 00 00 00 00 d3 43 10 00 00 04 00 c9 88 00 +00 00 02 00 00 00 06 bc 10 00 00 00 00 00 00 00 00 00 00 00 00 02 00 20 00 0a f0 40 00 00 00 a3 6d 79 00 00 02 02 ae fb b0 00 +00 00 10 00 08 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 40 00 02 80 00 00 01 00 00 00 d8 03 c0 04 00 14 00 00 ff 21 +00 00 03 00 01 00 00 00 00 04 80 1c 00 00 00 00 00 00 00 00 00 04 00 00 04 00 00 00 30 00 00 03 ab c0 00 50 01 40 00 0f f0 00 +00 00 00 00 00 00 00 00 00 00 00 00 15 0f 54 80 00 00 00 00 00 00 00 00 01 00 f4 00 00 00 00 54 11 1a 01 00 2c 38 d0 f0 08 +00 00 00 00 00 00 00 00 00 00 00 00 02 ca a0 40 00 00 00 00 00 00 00 14 00 1e 0f 50 00 00 00 0b 22 ed 08 10 15 42 4e e0 f0 00 +00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 02 be bc c0 00 00 03 98 94 34 80 00 00 0c 02 50 0f 00 +00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 54 2e e9 33 00 00 00 99 90 2b 84 0c 00 00 40 1c cf 00 00 +00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 40 02 d9 60 04 00 0b 0f 04 38 40 00 00 3c 28 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 01 69 96 80 00 00 f0 01 2b 84 08 00 00 07 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 03 40 b9 60 00 00 01 00 04 03 c0 00 00 1e 35 cd 88 40 +00 00 20 00 00 00 00 00 00 00 00 0c 00 00 00 00 00 04 00 00 00 00 00 14 05 c9 96 80 00 00 d8 00 70 3c 00 00 00 40 7f ab b6 00 +00 00 00 00 00 07 01 69 00 00 00 02 80 00 00 00 00 00 00 00 00 00 00 00 02 a9 60 01 10 00 0a d3 5a 40 0c 00 14 74 6c ff 00 +00 00 00 00 00 00 80 29 50 00 00 00 04 00 00 00 00 00 00 00 00 00 00 14 00 e8 96 80 30 00 59 b0 6e 58 00 42 00 02 54 bf 70 00 +00 00 00 00 00 00 00 00 00 00 02 40 00 0f 04 00 00 00 00 00 00 00 0a 40 00 99 60 00 00 05 00 30 25 82 00 00 a4 39 f0 ff 00 +00 00 01 80 00 00 00 00 00 06 00 00 00 1e f0 40 00 00 00 00 00 06 00 40 28 c9 96 80 18 00 00 0b 60 f0 08 60 14 00 06 8f 70 a0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 a9 60 00 00 00 00 b8 03 c0 00 00 0c 23 d0 ff 00 +00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 40 00 00 e1 96 80 00 00 59 8b f3 c0 00 00 02 06 57 af 50 00 +00 28 30 00 10 09 80 49 00 80 00 00 01 0f 0c 08 00 00 00 00 00 4a 00 02 a6 b1 d4 00 00 81 08 12 a7 c0 04 00 00 00 00 00 00 +04 00 03 00 0f 00 da 21 10 0c 00 00 70 0c f0 40 80 00 00 00 00 0c 40 00 6d 78 25 40 00 00 f0 0f e3 f0 00 c0 00 00 00 00 00 00 +80 00 00 00 10 01 80 49 00 00 00 00 02 0f 50 00 00 00 00 00 00 00 01 40 2e a3 c0 00 00 03 8e 90 1b 00 00 00 00 00 00 00 00 +00 00 00 00 09 80 5a 21 30 00 00 00 00 ea f5 08 00 00 00 00 00 00 00 36 02 fc 96 00 00 00 70 0b fa 4c 08 00 00 00 00 00 00 00 +0c 00 00 00 00 09 00 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 42 9c 0f 34 00 00 00 08 10 03 00 00 86 24 00 00 00 00 +04 c0 00 00 00 00 da 21 30 00 01 40 60 00 00 00 00 00 00 00 00 00 00 06 61 6c ff 42 00 10 70 09 79 20 0c 04 00 00 00 00 00 00 +00 02 00 00 00 e1 00 49 00 00 00 02 c0 00 00 00 00 00 00 00 00 00 00 42 bf 03 00 00 00 20 10 b8 39 80 00 40 00 00 00 00 00 +00 00 00 00 00 00 7a 21 30 00 00 00 04 00 00 00 00 10 00 00 00 00 00 20 07 ea 70 02 00 00 01 cb 3b 04 08 08 00 00 00 00 00 00 +00 00 00 00 00 89 80 49 20 00 00 03 83 05 00 10 00 00 00 00 00 10 01 44 15 0c c0 00 00 20 0e d7 e2 80 00 00 00 40 00 00 00 +00 00 10 00 01 99 d2 21 30 00 00 00 71 78 50 00 00 00 00 00 00 00 00 06 23 cc 33 02 00 01 04 1f 77 94 00 00 00 02 80 00 00 00 +00 00 10 00 00 81 80 49 00 00 02 c3 00 00 00 00 00 20 00 00 00 40 00 02 ae aa 50 00 00 0d 00 76 4c 00 0c 01 40 78 00 00 00 +02 00 03 00 00 19 52 21 30 00 00 20 04 00 00 00 00 01 00 00 00 04 00 06 02 fc d2 00 00 00 00 0f bd e0 00 40 08 03 80 00 00 00 +80 00 00 00 01 09 00 49 00 80 00 03 40 00 00 00 00 00 00 00 00 00 00 40 3c 0c b4 00 20 01 0a 00 3d 40 00 00 00 00 00 00 00 +08 00 01 80 00 0e f2 21 30 0a 00 00 04 00 00 00 00 00 00 00 00 06 00 20 02 18 c7 42 00 00 d8 17 e3 d4 00 60 00 00 00 00 00 00 +10 42 00 00 f0 01 00 49 08 00 00 00 3f 05 a0 00 04 00 00 00 00 00 00 03 c3 05 00 00 00 0d 00 70 15 40 00 00 04 03 68 ed c4 +00 07 04 00 00 00 72 21 30 08 00 00 03 5a 05 20 00 00 00 00 00 00 00 00 65 48 50 00 00 00 00 08 7a a8 00 00 02 00 34 8b 74 00 +00 00 +11 02 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 00 00 80 00 00 00 00 00 02 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 08 0e 00 00 00 00 00 20 00 00 00 00 00 00 80 00 00 00 00 00 03 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 +00 00 00 e8 b1 fc 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 29 fe d8 00 00 02 01 69 17 00 24 00 00 00 29 ee 00 00 00 +00 00 00 02 c3 3a 40 38 00 00 00 00 00 00 90 00 00 00 00 00 08 00 03 ff 7d 50 90 00 04 06 90 40 06 00 00 20 02 82 00 09 00 00 +00 00 00 00 00 01 40 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 02 01 69 17 00 00 00 00 00 00 00 00 0a 00 +00 00 00 00 00 00 36 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 06 90 00 00 00 00 00 00 00 00 00 40 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0e 1f a8 00 00 00 01 69 12 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 41 f8 70 00 00 00 06 90 00 00 00 00 00 00 00 00 00 00 00 +00 02 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 07 00 1c 00 01 69 13 80 68 00 80 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 90 04 00 00 00 00 00 00 00 00 00 00 70 00 00 00 06 90 40 00 00 08 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 01 01 69 13 8e 00 00 00 02 94 fe 10 00 00 +00 00 20 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d0 00 00 00 06 90 40 00 00 00 00 01 40 8f 80 00 00 +00 00 00 00 00 00 00 00 00 00 21 5e 90 00 40 00 00 00 00 00 00 00 00 00 09 00 00 02 01 21 13 9c 00 00 01 03 ac dc 81 c0 00 +00 00 00 00 00 00 00 00 00 00 02 2f cb 00 08 00 00 00 00 00 00 00 00 00 00 18 00 00 00 04 80 38 03 40 00 00 3e c3 f1 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 2b ce a0 0e 08 00 00 69 13 0e 7c 00 00 00 14 ec 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 70 00 00 00 00 00 00 00 00 03 bd f8 00 00 00 20 06 90 41 e6 80 00 00 01 41 09 0b 00 00 +00 00 00 00 00 00 07 00 03 00 00 00 00 1c 00 00 00 00 00 00 00 10 12 8c 80 00 00 01 00 a5 da 00 00 00 00 00 00 00 80 00 00 +00 00 00 00 00 00 00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 02 01 28 30 70 00 00 00 02 5b 34 00 00 00 00 00 00 03 0f 00 00 +00 00 00 aa db aa 00 00 20 00 02 2f f7 98 00 00 00 00 00 00 00 00 00 96 bd 0b 00 01 08 00 3b 14 28 00 04 2a bc cb 00 c0 80 +00 00 00 0a 85 bb bc 3c 01 00 20 00 4e 08 00 00 00 00 00 00 00 00 00 95 fa 59 e1 00 00 84 01 78 26 c3 00 00 82 80 d0 0b 00 00 +00 00 00 0b d0 04 00 40 04 00 3b d7 f0 00 00 00 00 00 00 00 00 00 29 40 85 0a 00 00 00 00 00 00 00 01 00 2a bc c8 00 08 09 +00 00 00 00 7e f2 c0 3c 05 40 03 fe 4e 70 90 40 00 00 00 00 00 00 00 00 08 09 00 c8 00 00 00 00 00 01 22 01 82 82 f0 00 49 14 +00 00 04 2a d3 b8 03 c8 00 00 2b c4 10 00 01 40 00 00 00 00 00 00 12 96 d3 80 00 00 00 af 32 06 22 e0 00 0a bd cf 18 80 00 +00 00 00 0e 4a 0b 40 20 00 00 21 7c 2e 00 00 00 00 00 00 00 00 00 41 68 da 58 00 00 20 0a f0 80 00 00 00 00 81 42 c0 0b 00 00 +00 02 00 00 00 00 06 00 00 00 00 00 00 0a 00 00 00 00 00 10 00 00 19 04 c8 0d a0 80 00 af 72 00 00 00 80 0a 94 ea 98 80 00 +00 00 00 00 00 00 34 00 10 00 00 00 00 00 90 48 00 00 00 02 80 00 01 60 7f f1 e4 90 00 0a f0 80 00 00 08 00 aa 81 8f 00 04 00 +00 00 10 05 f7 6a 00 00 00 00 2b de 10 00 08 00 00 00 00 00 20 55 1f c7 c9 80 00 80 00 00 93 34 28 00 02 0a bd ea 80 80 00 +00 00 20 00 5f 0c 04 00 00 00 01 7c 0e b0 00 00 00 00 00 00 00 00 01 fc 30 78 b0 10 00 44 07 ea c0 00 00 02 82 80 bb 1f 00 00 +00 00 05 20 75 f6 60 00 00 10 3b cd d0 0a 00 20 00 00 00 20 00 20 2b de f1 00 00 00 00 05 32 16 2a 00 00 0a 94 ff 00 10 14 +00 00 00 0a 1f 07 44 00 00 00 02 14 3f f0 00 00 00 00 00 01 00 00 00 14 18 00 00 c0 00 00 00 b4 00 10 00 00 aa 80 bb 0a 40 80 +00 00 00 0f 07 00 06 40 00 10 0c 16 90 00 00 80 00 00 00 00 00 00 1e 04 85 8a a0 00 40 d0 32 14 68 00 00 4a bd eb 80 00 00 +00 00 00 00 f0 00 1c 34 00 00 42 d4 0d 00 00 14 00 00 00 00 50 00 03 e0 eb 19 01 80 00 08 00 2c 00 00 50 20 82 82 e1 08 00 00 +00 00 08 00 a5 20 00 00 02 00 00 67 80 08 0c 00 00 00 00 17 00 10 30 1c 00 1e 00 02 c0 02 7f d4 28 00 00 08 15 6d 81 90 10 +80 00 00 88 0a 04 00 00 02 20 20 03 e9 10 80 00 00 00 00 00 80 00 03 00 00 00 00 00 00 45 20 74 00 10 00 a0 97 c2 bb 0d 1c 2c +00 00 00 8e f5 f8 02 80 00 00 01 54 e0 00 00 00 00 00 00 00 00 00 10 15 dd 80 00 23 06 64 5a c0 04 40 04 00 00 fa 00 b0 00 +00 00 00 08 ff 57 40 40 00 00 00 14 10 00 00 00 00 00 00 01 0c 00 01 61 db 58 c0 00 20 a5 81 30 02 c0 10 00 14 01 ad 18 14 00 +00 00 00 a0 0b b4 00 00 05 11 00 5f f0 00 08 00 00 00 00 00 00 52 a1 54 c8 01 80 16 02 80 ba 40 3c 02 51 00 f0 00 00 10 01 +40 00 00 02 80 d6 b4 00 00 40 00 00 1f 30 00 00 00 00 00 00 02 02 1b bc 39 30 e4 01 01 6d a7 a0 07 00 44 00 0f 00 03 0d 00 14 +00 00 00 2a 50 00 62 80 00 02 15 4f b0 01 80 00 00 00 00 00 00 00 14 15 c3 9c 00 08 00 ff 5a a0 04 00 34 2a 35 c0 19 a0 00 +00 00 00 02 5a 02 c0 43 70 00 01 68 3b 00 e4 00 00 00 00 00 00 00 01 61 d8 01 b0 00 80 0a f0 e3 42 56 22 00 93 84 b0 10 40 00 +00 02 00 21 fd 2c 03 90 00 40 2b cf 8d 00 00 00 00 00 00 00 00 11 88 15 e1 0e 00 00 00 af 70 00 04 70 80 0a bd 59 18 10 c0 +00 00 00 02 0f 5b f4 6e c0 00 02 bc 30 10 04 06 00 00 00 00 00 08 4a d4 09 f0 00 00 08 05 f0 38 c3 80 08 00 81 43 af 09 00 00 +00 00 10 0a f7 a2 00 28 50 00 3b ef f8 00 40 00 00 00 00 00 00 00 14 15 c0 01 00 00 00 00 00 20 00 00 00 0a 95 7e 81 e0 14 +00 00 20 00 af 08 04 3d 02 02 03 fe 7d 70 08 00 00 00 00 00 10 00 01 61 df 70 f0 00 00 00 00 00 43 c0 00 00 aa 80 d3 10 00 80 +00 00 04 40 01 b6 00 40 08 00 06 f6 cf 80 00 80 00 00 00 28 00 10 88 07 c9 81 00 00 00 00 00 20 00 00 04 1a bc 49 00 a0 00 +00 00 00 00 04 0e 84 20 00 00 40 0e fa 70 00 10 00 00 00 01 00 0e 5a d4 29 f0 d0 00 00 00 00 01 43 40 00 00 82 82 e0 00 00 80 +00 00 00 2f 55 a4 00 20 50 00 29 55 e8 0c a0 00 00 00 00 00 00 00 0c 35 a7 18 00 00 00 00 00 00 6c 20 08 1a 94 09 00 e0 00 +00 00 00 03 0a 03 40 01 02 00 02 bc 1d 71 04 00 00 00 00 00 00 00 00 d3 de 08 00 00 00 00 00 00 02 10 00 00 99 84 b0 0e 00 00 +00 00 01 28 09 ae 00 00 02 11 17 d6 ff 9e 00 00 00 00 00 10 00 10 81 17 d1 88 00 08 00 00 00 00 04 00 20 08 29 7f 01 d0 00 +80 00 00 82 00 5b c4 00 00 30 00 b8 2d f0 01 00 00 00 00 02 00 04 19 78 1f 91 00 00 80 00 00 00 02 c0 02 00 91 ce a0 18 00 08 +00 00 00 88 07 ec 00 00 00 00 2b ce a5 1e 00 00 00 00 00 02 00 00 3b e6 e0 00 1c 04 00 87 37 46 20 70 04 2c 84 1c 00 10 00 +00 00 00 00 00 5e 00 00 00 00 00 14 28 00 d0 00 00 00 00 00 00 00 03 3e 4f 00 00 00 00 0e ff a9 46 80 00 02 92 05 a0 08 08 00 +00 00 00 25 51 aa 00 40 05 10 28 5e 80 18 00 00 00 00 00 07 00 40 00 dc 03 1d 20 14 40 e7 00 46 64 00 50 05 a4 58 00 b0 01 +40 00 00 13 55 00 0c 20 40 50 02 88 2c 01 00 00 00 00 00 00 00 02 00 0d e0 99 a4 01 00 0d b0 24 26 00 05 00 1a 41 05 0c 00 14 +00 00 10 00 55 80 66 00 00 00 01 4d 80 01 00 00 00 00 00 00 00 00 02 ac e5 8e 00 00 40 18 5e 1e 28 00 20 05 a4 58 00 aa 00 +00 00 00 00 0a 0a 80 28 70 00 00 14 20 00 b0 02 00 00 00 00 00 00 01 0a cf 79 00 00 00 02 50 28 00 00 02 00 1a 40 00 0e 00 00 +00 02 14 22 51 ac 60 40 00 00 22 cd e0 01 00 40 00 00 00 00 00 10 23 d7 9d 8a 01 80 00 af 5b 80 60 00 00 05 a4 5c 01 c0 90 +00 00 00 0a a7 0e 94 20 00 00 02 bc 5d f0 e0 08 00 00 00 00 00 00 02 28 2c 11 00 14 00 08 f1 74 06 40 00 20 1a 40 00 00 00 00 +00 00 00 25 a0 04 00 00 00 10 20 4f bf 9d 00 80 00 00 00 00 00 10 22 46 b7 89 00 00 c0 10 18 24 30 00 00 05 a4 5e 80 00 08 +00 00 20 93 a5 02 00 00 00 00 02 bc 1e b0 c0 04 00 00 00 00 00 00 03 1c 38 01 f0 00 00 42 00 a8 40 00 00 40 1a 40 03 00 01 00 +00 00 00 00 00 00 00 00 10 10 22 5d f3 1d 00 40 00 00 00 00 00 10 00 d4 00 1c 00 82 82 af 53 4c 60 00 00 05 a4 4c 50 10 00 +00 00 00 00 00 00 00 00 00 00 03 2c 0a 08 e0 08 00 00 00 00 00 00 00 0c 00 f1 90 0c 09 e4 73 f4 20 00 00 04 1a 41 00 0d 40 00 +00 00 00 20 57 a8 07 00 00 a0 3f e4 e8 18 00 00 00 00 00 00 00 10 a0 0c e3 81 40 00 00 ef 16 0e 70 00 00 05 a4 4a 01 c0 00 +00 00 00 03 5f 0a c0 40 00 00 03 7c fd 10 00 04 00 00 00 00 00 00 0b 80 3b 10 92 00 00 0f ff e8 00 00 00 04 1a 40 00 10 00 00 +00 00 08 aa d9 ee 07 40 03 20 28 1e 17 9e 40 00 00 00 00 00 00 00 90 b6 a0 00 00 2c c0 bc 1a 00 39 00 30 05 a4 58 00 00 00 +80 00 00 06 85 5f 84 6e 10 30 01 40 28 09 02 00 00 00 00 01 00 08 08 17 5d 00 01 42 a1 4b c0 00 00 08 03 04 1a 40 00 0c 00 0c +00 00 00 20 0b b8 60 00 01 00 01 4f b3 00 14 00 00 00 00 00 00 82 00 84 a1 00 00 00 00 a7 bb 00 00 00 00 01 a4 4e 00 10 00 +00 00 00 02 02 52 00 28 00 00 02 bc 1e 00 00 00 00 00 00 00 08 02 20 01 7c d8 80 00 00 02 61 6c 40 00 00 0c 1a 40 00 0a 00 00 +00 00 00 00 57 68 00 00 04 10 29 ce b8 00 40 80 00 00 00 00 20 50 a3 5c e0 00 00 90 40 89 5e 5e 00 80 88 01 1f 59 39 9a 00 +00 00 00 00 05 00 00 34 00 50 01 44 1e f0 0b 80 00 00 00 00 05 00 0a 34 10 d0 00 15 00 0c b0 b8 02 85 00 00 20 7e 8d 9d 40 00 +00 00 04 20 a3 ba 03 80 00 10 22 5f d1 0f 00 00 00 00 00 00 00 00 01 56 a8 0a 00 00 48 81 00 5e 6d 00 00 00 07 59 d8 00 00 +00 00 00 02 42 0a 14 00 80 00 03 1c 3c 09 c0 00 00 00 00 00 00 00 01 7c 3e 30 b0 04 00 04 20 3c 27 a8 00 00 16 c6 95 00 80 00 +00 02 00 20 47 a0 03 80 00 00 00 00 01 01 01 00 00 00 00 00 00 00 23 7f 88 00 a0 00 00 af 36 d6 28 00 08 01 1e 69 01 90 00 +00 00 00 02 1c 7b c0 40 00 00 00 00 00 d8 d0 08 00 00 00 00 00 00 01 35 fa 10 00 00 00 00 a0 3f c0 00 00 00 20 64 80 1d 00 00 +00 00 00 28 0f 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 10 22 5e fd 80 00 00 00 af 1b 4e 70 00 42 03 fc cf 78 a0 00 +00 00 20 02 e0 16 00 20 00 40 00 00 00 00 00 00 00 00 00 00 40 00 03 1c 3c f8 f0 01 00 00 50 a8 23 e0 04 00 17 c1 ed 10 00 10 +00 00 00 60 43 a4 66 00 20 00 01 46 ab 98 00 80 00 00 00 00 00 10 20 40 17 01 00 00 40 47 3f 3e 60 02 01 00 80 dc 00 f0 14 +00 00 00 02 1c 73 80 6c 60 00 02 bc 2f f8 90 14 00 00 00 00 00 00 01 08 0d 00 90 00 00 04 70 80 43 00 40 80 00 02 d0 0f 00 00 +00 00 00 00 55 06 02 80 00 00 11 e5 bf 00 00 00 00 00 00 00 00 00 83 56 cf 18 0c 00 00 af 3a 80 01 02 00 02 bd fd 30 00 00 +00 00 00 00 0a 0a 84 78 00 00 02 06 eb 78 00 00 00 00 00 00 80 00 09 3d 7f 10 00 00 00 00 50 a4 00 28 50 00 01 40 ff 0d 00 00 +00 00 04 20 a3 21 47 40 03 02 3f de e8 1d 00 00 00 00 00 00 00 00 29 4c 99 8f 40 0c 00 00 5a e4 04 30 01 02 2d db b0 b0 04 +00 00 00 02 81 03 82 20 00 32 01 7c 1a 10 f0 00 00 00 00 00 00 02 02 a8 3b b8 93 82 c0 00 a0 2d e3 80 00 00 02 82 ad 1e 58 80 +00 00 00 00 00 00 00 00 00 04 01 5f 91 00 00 00 00 00 00 10 20 00 09 06 e0 00 00 00 00 c7 bb 94 00 40 08 0a 0d cb 00 10 10 +00 00 00 00 00 00 00 00 00 00 01 7c 3c 00 e0 00 00 00 00 00 85 00 00 50 de b0 94 00 00 08 99 63 43 80 00 00 b8 c6 90 08 00 00 +00 00 00 00 00 00 00 00 04 00 11 56 a7 8c 40 00 00 00 00 00 50 00 ab 4e f7 9f 20 10 40 89 32 5e 78 81 00 0b 96 6e 81 e0 01 +00 00 00 00 00 00 00 00 00 50 01 3e e9 00 02 08 00 00 00 00 42 00 0a 15 e8 09 f0 81 00 4c b0 b5 c4 10 00 00 a1 46 f3 10 14 14 +00 00 00 00 00 00 07 40 00 00 31 e6 ab 88 a0 00 00 00 00 00 00 00 81 5c b7 01 00 00 00 8f 56 54 69 70 04 18 1f 6f 01 c0 08 +00 00 00 00 00 00 00 70 00 00 02 26 ca f1 b4 00 00 00 00 00 00 00 09 7c 2d 08 c0 14 00 04 57 fd e0 20 00 00 87 e5 a0 18 01 40 +00 02 00 00 00 00 07 00 00 10 22 5c b5 1e 00 00 00 00 00 00 00 00 28 14 e1 9c c0 20 04 05 53 8e 01 00 00 00 00 09 98 d0 00 +00 00 00 00 00 00 00 41 00 00 03 2c 0e 08 00 02 00 00 00 00 00 00 42 80 20 00 0a 00 00 05 f0 e4 20 2d 00 20 29 40 db 0f 08 00 +00 00 00 00 00 00 00 00 00 10 20 40 07 9c 00 00 00 00 00 04 00 01 b8 e7 98 00 00 00 00 05 32 a0 39 02 02 00 28 dc 31 81 48 +00 00 20 00 00 00 00 00 00 00 01 08 0b 09 00 c0 00 00 00 00 20 00 09 0c ed f0 e0 00 00 05 f0 6a 43 a8 40 00 02 81 00 08 81 00 +00 00 00 00 00 02 00 00 00 41 2b d6 88 00 20 00 00 00 00 14 10 04 ab 6e 98 19 a1 00 40 47 33 96 e0 00 00 0a 94 de 70 18 02 +00 00 00 00 00 00 0c 00 00 00 42 bc 00 30 d1 40 00 00 00 00 02 00 0e 16 78 30 80 08 00 04 70 40 20 00 00 00 aa 80 a0 8c 00 00 +00 00 00 00 00 00 00 00 00 00 2b d4 d0 1e 00 00 00 00 00 08 10 00 3c 67 c8 19 00 00 00 a5 56 6c 70 00 00 0a bd 6d 01 80 00 +00 00 00 00 00 00 00 34 00 00 00 14 2e 01 00 00 00 00 00 00 02 00 02 88 cd 10 b0 00 00 05 50 ac 44 00 20 44 82 83 e1 00 00 00 +00 00 01 68 53 f8 60 04 22 00 01 5e af 9f 20 00 00 00 00 00 00 00 ab 77 b0 00 00 08 48 47 13 9c 03 85 04 0a 94 db 01 80 00 +c0 00 00 02 ad 5f 80 00 04 b0 00 14 30 71 e0 00 00 00 00 00 00 04 1a 14 59 00 01 40 80 04 70 c0 20 3c 00 00 aa 81 80 00 00 08 +00 00 00 00 00 03 40 00 50 00 17 ff b1 08 00 00 00 00 00 10 00 04 14 46 9f 98 00 00 00 a1 7a 5c 01 f0 00 00 00 00 01 e0 00 +00 00 00 00 00 00 06 2c 02 00 02 07 cc 11 00 00 00 00 00 00 b8 00 02 9e 68 10 00 00 20 0e 2f f2 40 06 00 00 00 00 01 10 00 00 +00 00 00 0e e3 20 00 00 00 00 37 cf 90 00 21 00 00 00 00 00 00 00 a0 c6 e3 81 0c 14 0e fa 3b 80 00 00 60 00 a3 e8 00 10 01 +80 00 00 08 bb 7a 40 00 10 04 03 94 4a 00 b4 08 00 00 00 00 00 00 4f 8c 5c 08 e0 01 08 2f a0 40 00 00 00 00 00 37 c0 0d 00 00 +00 00 00 0e ef bc 62 a0 00 00 01 4c f8 00 00 00 00 00 00 00 40 00 b0 4c c1 00 40 00 00 af 32 c0 01 30 20 00 00 00 80 01 00 +c0 00 00 00 bb d7 74 41 00 00 02 bc 2e b0 00 00 00 00 00 00 00 00 1b 2e 6f 00 00 00 00 00 a0 74 40 20 02 00 00 00 07 00 00 08 +00 02 00 0e ed 69 42 80 00 00 3e ee d8 00 00 00 00 00 00 03 00 00 00 00 07 0f 20 00 00 8b b0 00 00 00 04 00 28 5e 80 00 00 +00 00 00 00 77 b3 42 40 00 00 02 9f 4a d0 80 00 00 00 00 02 00 00 00 00 00 08 84 00 00 04 77 ac 00 00 00 00 02 82 0f 00 00 00 +00 00 00 0c c3 ad 43 80 00 00 28 56 9f 01 00 00 00 00 00 00 00 00 81 f6 d7 1f 00 00 80 05 77 20 62 80 00 02 80 ca 81 90 00 +00 00 20 00 ff f7 be 00 70 02 01 5e 5c 70 e0 00 00 00 00 00 00 00 18 7c 4c 00 f0 00 00 00 50 c0 c0 10 50 00 28 01 07 1c 04 00 +00 00 04 0e f1 29 c2 e8 00 00 2b dd d7 81 40 00 00 00 00 28 00 02 a9 cf e0 01 1c 80 10 00 03 44 04 00 01 19 00 dc 80 00 00 +00 00 00 08 ff 0f 2c 74 00 00 00 28 0d 00 e2 00 00 00 00 00 00 00 08 96 cc 00 d0 00 00 0a 50 76 63 80 00 00 92 81 81 00 00 00 +00 00 00 00 00 00 e7 c0 00 10 11 dc a9 9e 00 00 00 00 00 00 00 00 3b fc 81 1d 0c 00 00 00 00 34 01 00 00 00 15 c0 78 10 00 +00 00 00 00 00 00 1e 70 00 00 01 1c 30 11 90 00 00 00 00 00 00 00 02 fd de 08 e0 00 00 00 00 00 c0 28 00 00 02 80 90 0e 14 00 +00 00 00 0a a3 b8 07 80 20 10 23 cc f9 0e 1c 80 00 00 00 02 00 30 3b d6 b0 18 60 08 08 af 78 5c 20 00 31 28 90 cf 58 e0 00 +80 00 00 08 aa 00 00 6c 05 00 01 14 3f f9 e0 00 00 00 00 00 00 06 03 fc 3e 00 f4 02 c8 05 f0 b6 42 40 03 00 8a 01 ff 10 00 08 +00 00 00 32 11 38 00 00 00 c0 80 37 db 81 80 00 00 00 00 10 00 00 2b de b8 0a 00 00 00 05 7b c0 01 00 00 02 80 60 50 00 00 +00 00 00 42 48 03 7c 02 80 08 38 12 7d 10 f4 00 00 00 00 00 80 04 00 14 0b 11 b0 00 01 0a f0 74 00 00 00 00 14 02 c1 8e 08 00 +00 00 00 32 11 38 00 00 06 00 00 00 08 19 1c 50 00 00 00 00 00 00 a9 40 15 81 00 18 00 42 80 00 7d 00 51 09 08 fb f9 da 05 +80 00 00 02 48 03 c0 00 00 00 00 00 00 b0 d0 19 00 00 00 00 00 00 09 68 0e 08 c0 04 00 08 1b 3c 07 a0 05 02 81 42 bb 9d 51 80 +00 00 00 32 11 2a 60 28 12 06 b0 d7 c0 00 20 00 00 00 00 10 00 00 83 cc 00 0a 00 00 00 a0 76 80 02 80 00 0b 81 69 30 b0 00 +80 00 00 02 48 07 44 00 02 20 0e 2e 6d 00 00 00 00 00 00 02 80 00 08 3c 00 d1 b1 80 00 0a 00 c2 40 00 00 02 a0 3f a0 1b 08 08 +00 02 00 32 11 2a 06 00 00 80 a2 c6 d1 9d 00 00 00 00 00 00 00 81 83 c4 07 00 14 00 00 0a 18 26 7c 02 00 18 22 cb 01 d0 00 +00 00 00 02 48 07 c4 00 00 00 0b 0e dc 10 80 00 00 00 00 00 00 04 48 3c 20 00 00 00 00 00 50 3f c3 40 40 00 a1 46 b5 1b 14 00 +00 00 00 32 11 78 00 00 00 00 83 57 d1 80 00 00 00 00 00 00 00 00 29 4e e0 18 00 00 00 a0 72 80 00 02 00 08 0b fa 80 00 00 +00 00 20 02 48 03 7c 00 00 00 0d 3e c8 10 00 00 00 00 00 00 00 08 02 a8 08 00 04 00 10 0f a0 fc 00 00 40 02 86 97 85 0d 00 00 +00 00 00 32 11 68 00 00 00 00 b0 fe db 9c 01 00 00 00 00 00 00 01 29 57 e0 1e 80 00 00 00 00 14 04 00 00 48 22 7f 80 00 04 +00 00 00 02 48 03 c0 00 02 02 09 1c 7c d9 08 08 00 00 00 00 00 00 02 a8 38 01 b4 00 00 00 00 02 42 c0 00 00 a1 47 b5 0f e0 00 +00 00 01 32 11 68 06 40 00 00 81 df d0 00 21 40 00 00 00 00 00 02 29 4f 80 01 00 00 00 af 5f ae 70 00 00 08 0b 5a 59 a0 14 +00 00 00 02 48 07 7c 20 00 04 2c 7e ef 00 04 08 00 00 00 00 00 00 02 a8 1a 00 f0 00 00 00 50 7d e4 10 20 01 86 95 e0 0f 00 00 +00 00 00 32 11 78 67 c0 03 00 8b f6 cf 80 40 08 00 00 00 00 00 00 29 57 c5 01 40 09 02 af 5f 40 01 40 22 03 bb 58 f8 00 00 +c0 00 00 02 48 07 c0 60 20 3c 08 2c f9 10 0a 00 c0 00 00 00 00 00 12 a8 2b 08 f8 00 81 20 a0 a1 4b 88 03 00 1d d6 e7 80 00 08 +00 00 +11 03 +01 01 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 02 00 00 00 00 00 00 00 +00 00 00 00 01 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 08 00 00 00 00 00 00 20 00 00 00 00 0c 00 00 00 00 00 40 30 00 00 00 00 00 00 40 00 00 00 00 00 03 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 40 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 08 00 00 00 00 80 00 20 00 00 00 00 00 00 80 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 02 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 02 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 03 04 93 8e 91 00 00 0c 00 00 00 00 00 00 b2 ac c1 10 00 08 10 67 02 d4 02 80 00 09 54 3d 19 00 00 +80 00 00 00 00 00 00 70 00 30 0a 35 61 80 00 00 80 00 00 00 00 00 0b 17 e1 80 e0 00 84 08 33 a3 66 90 00 00 a9 45 f9 8c 00 0c +00 00 00 00 00 00 00 00 00 04 82 82 81 00 00 00 00 00 00 00 00 02 81 43 e1 00 00 00 00 46 17 fc 00 00 00 09 38 6a 10 00 10 +00 00 00 00 00 00 0c 00 00 00 0a bd ec d9 80 00 00 00 00 00 00 00 0a bd fd 80 00 00 00 0c 7b 29 62 00 00 00 a3 5e 18 00 14 80 +00 00 00 09 30 a4 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 95 41 c0 00 00 00 00 00 00 00 28 00 00 08 28 0a 00 f0 00 +00 00 00 c0 a3 3a a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 95 eb 19 80 00 00 00 00 00 00 40 00 00 ab d6 91 80 00 00 +00 02 00 01 9b a0 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 81 41 e0 00 00 00 00 00 00 3c 6c 00 02 09 38 4b 00 00 00 +00 00 00 00 a7 d2 80 00 00 00 00 00 00 01 c0 00 00 00 00 00 00 00 0a bd 69 00 00 00 00 00 00 02 c3 80 00 00 a3 56 00 00 00 00 +00 00 00 25 f0 a4 00 00 00 40 ab c3 c0 10 00 00 00 00 00 00 00 00 82 82 f0 08 00 00 00 df 06 80 00 00 00 48 28 28 00 88 00 +00 00 20 02 05 76 00 00 00 02 08 15 6a 18 80 00 00 00 00 00 00 00 0a bd 5e 00 10 00 04 0c f7 69 e0 00 00 00 ab d4 80 19 00 00 +00 00 00 00 00 01 42 80 00 00 82 82 e0 00 e0 00 00 00 00 00 00 02 81 42 e0 08 00 00 00 47 9f 24 24 00 00 08 14 38 01 08 00 +00 00 00 00 00 00 20 6c 00 00 0a bd cc 18 0c 00 00 00 00 00 00 00 0a bd db 18 10 00 00 08 5f 30 00 00 00 00 ab dd c1 9c 40 00 +00 00 00 00 00 00 03 80 00 00 81 41 c0 00 00 20 00 00 00 00 00 00 00 00 00 0c 08 00 10 67 0a dc 3c 00 00 0b 28 6f 00 00 00 +00 00 00 00 00 00 00 04 00 60 0a bd ce 50 04 01 80 00 00 00 00 00 00 00 00 50 10 01 84 08 37 f8 00 40 00 00 b1 44 00 00 00 98 +00 00 00 00 00 00 03 c0 00 00 97 c2 80 08 00 00 00 00 00 00 00 04 ab c2 e0 80 00 00 00 46 1f 40 34 00 00 00 65 ea 70 f0 04 +00 00 00 00 00 00 06 04 00 00 08 15 cc 00 11 40 00 00 00 00 00 00 08 14 6b 30 00 00 00 0c 7f a8 00 00 00 00 29 fc 88 18 00 80 +00 00 00 00 00 00 44 00 03 20 81 42 e0 0e 00 0c 00 00 00 00 00 00 97 c2 d0 90 00 0c 00 00 00 04 00 00 30 00 00 00 01 00 00 +00 00 00 00 00 00 20 70 00 30 0a bd 7f 01 80 00 80 00 00 00 00 00 08 14 ed 71 a0 00 80 00 00 02 02 00 03 00 00 00 00 1c 00 00 +00 00 01 20 a0 ac 40 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 97 c2 d1 0f 00 00 02 af 06 84 3c 00 00 03 2c 09 08 90 00 +00 00 00 02 af 7e 20 60 00 00 00 00 00 80 00 00 00 00 00 00 00 00 08 14 4f 80 00 00 00 20 57 7e 00 40 00 10 22 4e 93 81 00 00 +00 00 00 00 00 00 00 00 00 00 82 80 90 00 00 00 00 00 00 00 00 80 24 c3 91 00 00 00 00 00 00 06 00 00 00 00 64 59 b0 00 00 +00 00 00 00 00 00 00 00 00 00 0a bd e8 00 00 00 00 00 00 00 00 01 02 8d fc 98 00 00 00 00 00 00 40 00 00 00 29 d4 a0 1e 00 00 +00 02 00 00 00 00 00 00 00 00 81 41 83 00 00 00 00 00 00 00 00 00 06 7e e0 0f 00 00 02 05 06 80 00 00 00 03 2c 0a 01 00 00 +00 00 00 00 00 00 00 00 00 00 0a bd 7a 80 00 00 00 00 00 00 00 00 02 9e eb 00 00 00 00 2a f5 fc 00 00 00 10 22 5c 90 1c 1c 00 +00 00 00 24 e1 bc 00 00 00 00 90 a4 fd 18 00 00 00 00 00 00 00 00 b2 a4 80 00 00 00 0a 0a 0b c0 20 00 00 00 1c d8 d8 00 00 +00 00 20 02 8d d0 00 00 00 00 0b 9c 08 19 d0 00 00 00 00 00 00 00 0b 14 c0 00 e0 00 00 2a f5 68 07 c0 00 00 2a c6 85 1a 00 00 +00 00 00 20 a0 b8 00 00 00 00 81 42 80 00 00 00 00 00 00 00 00 00 82 82 a0 0b 00 00 02 05 0a 80 00 00 04 00 ae db 00 b0 00 +00 00 00 02 af 76 06 00 05 00 0a bd da 00 00 00 00 00 00 00 00 00 0a bd ce 00 a0 00 00 2a f7 6c 68 00 00 00 09 f5 95 9a 00 00 +00 00 00 20 50 60 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 b2 84 f0 20 00 00 00 00 00 00 00 00 00 01 9c 18 51 e0 00 +00 00 00 02 af 72 40 78 00 60 00 00 00 02 00 01 80 00 00 00 00 00 0b 14 c0 00 00 01 80 00 00 00 00 00 06 10 20 de ed 8a 00 00 +00 00 00 00 00 00 c0 00 00 00 06 6f 90 0e 01 00 00 00 00 00 80 00 06 7e e0 00 00 00 00 57 df 40 00 00 00 00 66 d8 50 00 14 +00 00 00 00 00 00 20 00 00 00 02 9d c9 1a 00 00 00 00 00 00 00 00 02 9f c9 19 80 00 00 0a 13 bc 00 00 00 00 29 e7 bf 1c 00 00 +00 00 00 00 00 00 00 00 00 00 19 c2 8b 00 00 80 00 00 00 00 00 00 00 00 00 00 00 08 00 af 04 2c 2c 00 00 0a a8 1c 30 00 00 +80 00 00 00 00 00 00 00 00 01 02 0d da 80 00 00 00 00 00 80 60 00 00 00 00 00 00 00 c8 0a f7 6a 00 00 00 00 a9 55 b8 00 00 2c +00 00 08 09 30 bc 20 00 00 00 06 57 d5 00 00 00 00 00 00 00 00 00 97 c0 d0 00 00 00 10 67 0b 24 28 00 00 0a bc 1a 11 00 06 +00 00 00 40 a3 52 1e 00 00 00 02 9d f9 f0 00 00 00 00 00 00 00 00 28 14 ed 01 80 00 04 08 37 b6 07 80 00 00 81 57 a8 1a 00 a0 +00 00 00 01 9d 64 20 00 00 00 00 00 03 0d 00 00 00 00 00 00 00 81 81 41 c1 9c 00 00 00 46 bb f4 30 00 00 09 7c 2c 00 c0 02 +00 00 00 00 a7 1a de 00 00 00 00 00 00 80 10 00 00 00 00 00 00 00 0a bd 7c 98 90 00 00 0c 73 70 00 00 00 00 81 54 b0 19 00 00 +00 02 01 06 30 e8 00 00 00 00 13 cc 80 08 00 00 00 00 00 00 00 00 00 00 00 0e 00 00 00 d0 d3 9e 40 00 00 08 6d 68 11 00 00 +00 00 00 40 a3 57 40 00 00 00 01 17 49 10 00 00 00 00 00 00 02 00 00 00 00 01 e0 00 20 0e 0d 80 e2 80 00 00 89 d6 18 1a 00 00 +00 00 00 01 9d 64 00 00 00 00 17 c3 80 19 00 00 00 00 00 00 00 81 ab c1 c0 00 00 00 00 05 d2 f4 7a 00 00 08 28 2f 10 e0 00 +00 00 20 00 a7 52 54 2a 80 01 02 05 69 18 a0 00 00 00 00 00 00 00 08 14 ca 01 80 00 00 0e 79 a0 43 d0 00 00 ab d4 a9 80 00 00 +00 00 00 06 30 e4 c4 00 00 00 05 d7 85 8b 00 80 00 00 00 00 00 00 00 00 00 00 40 00 10 67 0b 34 38 00 00 09 39 68 00 00 00 +00 00 00 40 a3 52 4c 28 00 00 00 9d 4c 78 c0 14 00 00 00 00 00 00 00 00 00 18 02 00 04 08 31 7e 03 00 00 00 a3 5c 11 9e 00 00 +00 00 00 01 9d a7 42 a0 20 00 18 c3 a0 8b 00 00 00 00 00 00 00 00 81 40 c0 00 40 00 00 57 57 40 2c 00 00 02 4c 0b 00 80 00 +00 00 00 00 a7 5a 4e 00 04 01 12 8c 4b 11 c0 00 00 00 00 00 00 00 2a bd c8 00 08 01 80 0a 13 f0 00 00 00 10 28 dd 90 01 00 18 +00 00 00 00 00 03 62 80 00 00 11 4d 93 0d 00 00 00 00 00 00 00 00 97 c2 80 0f 00 00 00 4f 56 80 2c 00 00 00 2f 6d 02 00 08 +00 00 00 00 00 00 14 28 00 00 02 3c 6e 80 d0 00 00 00 00 00 00 00 18 14 ec 00 10 00 00 04 5f 28 60 00 00 00 2a de c0 00 15 40 +00 00 00 20 50 a0 00 00 02 00 97 c0 d1 10 00 0c 00 00 00 00 00 00 aa 81 c0 00 00 0c 02 0a 0b c4 40 00 30 00 00 00 08 e0 00 +00 00 00 02 af 5f 40 00 00 20 08 15 5b 81 c0 00 c0 00 00 00 00 00 0a 95 db 00 e0 00 c0 2a f5 e7 62 07 03 00 00 00 05 00 00 00 +00 00 00 00 00 00 00 00 00 00 ab c3 a0 00 00 00 00 00 00 00 00 00 ab c3 e1 00 00 00 02 05 0e 04 24 00 00 03 1c 0e d1 00 10 +00 60 00 00 00 00 00 60 00 00 08 14 ff 00 00 00 00 00 00 00 00 00 08 15 5a 81 e0 00 00 2a f7 f6 06 00 00 12 22 4c 80 08 00 00 +00 00 08 20 50 63 c3 40 00 04 05 e6 97 00 00 00 00 00 00 00 00 00 97 c2 c0 0e 00 00 02 0a 02 82 00 00 00 03 9c 0c 51 e0 00 +00 00 00 02 af 5f 40 04 00 00 00 9f 58 18 00 00 00 00 00 00 00 00 08 15 4f 01 90 00 00 2a f5 e5 40 00 00 10 01 4c 9d 8e 00 00 +00 02 00 20 a0 3b c0 00 04 00 00 00 00 00 01 10 00 00 00 00 00 00 86 de 80 00 00 10 02 05 06 00 00 00 40 02 4c 3a d0 a0 01 +00 00 00 06 af 5e 00 00 00 00 00 00 00 00 00 08 00 00 00 00 02 00 08 9d 61 00 c0 00 00 2a f5 a4 00 00 00 10 28 c5 9b 98 00 00 +00 00 00 00 00 00 02 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 82 82 f1 20 84 00 02 55 06 40 20 00 00 01 19 fd 01 00 00 +00 00 20 00 00 00 06 64 00 00 00 00 00 00 e0 00 00 00 00 00 00 00 0a bd 4e 98 00 00 00 2a 51 f8 66 40 00 00 31 ee d0 0a 00 80 +00 00 00 00 00 00 02 00 00 00 06 67 d0 80 a0 00 00 00 00 00 00 00 93 9e 85 00 00 00 02 4e 1b 80 20 00 00 00 5e df 00 a4 00 +00 00 00 00 00 00 00 04 00 00 02 9e ff 50 a0 00 00 00 00 00 00 00 0a 35 c1 98 00 00 00 28 df 00 00 40 00 00 09 d4 f0 01 80 00 +00 00 00 20 50 60 03 80 00 00 00 00 03 8b 00 00 00 00 00 00 20 00 24 c0 b0 08 00 00 02 0a 02 80 3c 00 00 02 4c 2d 58 a0 00 +00 00 00 02 af 73 40 78 00 60 00 00 00 b8 0a 01 80 00 00 00 01 01 02 8c f9 00 10 01 80 2a f7 60 00 40 06 10 28 cd 85 0a 00 00 +00 00 00 20 a0 2c 00 00 00 00 00 00 00 00 00 40 00 00 00 00 80 00 01 f5 c0 00 00 00 02 05 02 00 00 00 00 01 5e 6c 01 e0 00 +00 00 01 02 af 56 40 00 00 00 00 00 00 10 00 08 00 00 00 01 00 00 02 ac cf 00 00 00 00 2a f5 3c 60 00 00 00 28 65 93 8a 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c 00 00 00 00 00 01 19 c0 e0 8c 00 00 00 45 12 76 39 00 00 08 28 2c 11 08 0c +80 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 80 00 00 00 00 01 02 0c c8 18 10 00 00 0e 5d a7 e0 08 00 00 ab d6 d8 1a 01 08 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ee e3 98 00 00 80 67 06 44 00 00 00 09 38 ea 10 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 39 80 00 00 00 00 00 00 00 02 ad ce 50 a0 00 04 08 37 f2 06 00 00 20 a3 5e 18 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 80 00 00 00 00 00 00 34 ae e0 0b 00 00 00 19 d7 c0 34 00 00 08 28 0a 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 85 e1 00 08 00 00 0a 73 fd e0 40 00 00 ab d6 d0 0a 80 40 +00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 10 00 00 00 00 00 00 24 c0 9d 8b a0 10 00 99 d2 26 40 00 40 09 38 cb 00 c0 11 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 02 8c 69 18 00 00 00 06 68 06 66 00 00 00 a3 56 00 01 00 80 +00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 39 c2 80 10 18 00 80 96 03 40 40 00 02 08 28 28 00 80 80 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 01 00 15 6b 58 a2 00 04 06 91 81 42 03 00 00 ab d4 c1 99 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 24 c1 a0 10 00 00 00 4b 03 6c 00 00 00 09 38 eb 00 04 08 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 01 02 8d d9 01 c0 00 04 08 73 02 00 00 00 00 a3 5c 11 80 00 40 +00 00 00 00 00 00 00 00 00 80 82 81 a0 00 00 00 00 00 00 00 00 00 06 5e f7 90 00 00 08 f0 00 00 64 00 00 0b 28 4f 32 c0 00 +00 00 00 00 00 00 00 00 00 00 0a bd ce 00 00 01 80 00 00 00 00 00 02 9d dc d1 c0 00 00 0f 01 81 62 84 00 00 b1 4c 08 01 01 58 +00 00 00 00 00 00 00 00 00 20 99 bc d0 00 00 00 00 00 00 00 00 00 3c 01 f0 1e 00 00 00 0f 0f ac 28 00 00 00 65 e9 00 00 00 +00 00 00 00 00 00 00 00 00 00 0a 94 0b 00 00 00 00 00 00 00 00 00 00 3d ed 00 b0 00 00 4a 57 32 00 40 00 00 29 fc 90 18 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3c c3 87 10 a0 00 02 05 02 94 28 00 30 00 00 00 50 00 00 +c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 03 3c fa 00 e4 00 00 2a f5 b7 62 40 03 00 00 00 08 00 00 08 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c c3 d1 00 00 00 02 25 07 14 40 00 00 0b c0 20 08 01 c0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 a4 59 80 00 00 04 22 e5 fa 02 00 00 00 bc 0c 01 9a 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3c 01 fd 00 00 00 00 0c 07 86 00 00 00 00 ce dd 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3d 59 01 80 00 04 00 e3 7f c0 00 00 00 33 24 e5 80 00 00 +00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 21 c0 e0 00 00 00 00 33 0a 00 28 00 00 01 a7 d0 58 00 14 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 e0 dd 01 81 80 04 0c c7 34 06 c0 00 00 5a 45 c9 80 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 43 80 90 00 00 00 f0 16 c0 20 04 00 01 a6 c0 01 00 00 +00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 40 fa 70 a0 00 00 0e 17 70 06 40 20 00 5a 64 a0 1c 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 02 e0 00 00 00 02 25 32 86 00 00 30 01 a6 d0 00 04 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 78 5d 01 a0 00 00 22 e7 ef e0 00 02 00 5a 45 80 1a 80 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2b c3 05 80 00 00 02 7f b2 80 2c 00 00 01 a7 d0 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 bc fa f0 00 00 00 63 fd b4 08 00 06 00 5a 64 85 9a 00 18 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 1a 56 80 0b 00 00 00 f0 bb 80 00 00 00 01 a5 c0 50 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f3 cc 19 a0 00 00 46 9d 20 06 00 00 00 5a 41 88 00 01 04 +00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 0c 00 00 00 00 00 00 96 80 c0 00 40 08 00 00 00 00 00 00 30 0b c0 20 00 e0 00 +80 00 00 00 00 00 00 00 03 00 00 00 00 00 80 00 c0 00 00 00 00 00 0a 94 00 02 00 00 80 00 00 00 00 07 02 00 bc 14 00 19 00 0c +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 83 c0 00 00 00 00 00 00 00 04 2c 00 00 10 04 1a 00 e0 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 3c e0 00 00 00 00 00 00 02 06 40 00 10 01 dc d3 80 00 00 +00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 83 c2 00 00 00 00 00 00 00 00 00 00 80 01 4c 2c 01 c0 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 3d 60 01 80 00 00 00 00 00 00 00 00 10 28 dc 10 1d 00 00 +00 02 00 00 00 00 00 00 00 00 00 00 00 00 01 40 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 04 30 00 00 01 54 18 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 29 56 81 80 00 00 +00 00 00 00 00 00 02 88 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 40 00 00 01 4c 2a 00 a4 00 +00 00 20 00 00 00 1c 03 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 03 80 00 10 28 dc 00 0a 80 00 +00 00 00 07 7d 6c 20 00 00 00 00 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 02 12 0a 0b 00 7c 00 00 02 a8 19 00 e0 00 +00 00 00 10 ee 5e 5e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 6a f7 38 07 40 00 00 29 57 95 80 0c 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 2f 00 01 8a 05 07 80 00 80 50 41 05 cd d0 00 00 +00 00 00 00 00 00 14 00 00 00 00 00 00 00 02 01 00 00 00 00 00 00 00 00 00 00 10 01 80 2a f7 30 00 00 04 00 20 57 e1 80 00 18 +00 00 00 00 00 00 00 00 00 a0 c3 c0 00 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 02 8a 0a 02 00 30 00 00 0b c0 00 00 80 00 +00 00 00 00 00 00 00 00 00 00 08 3c 00 00 11 40 40 00 00 00 00 00 00 00 00 00 00 00 00 6a f5 38 00 40 00 00 bc 1e 03 01 00 00 +00 00 00 24 80 74 02 00 02 00 00 00 01 98 00 0c 00 00 00 00 00 40 87 e7 e0 0f 00 0c 02 0a 0b 9c 00 00 20 4a bc 28 19 00 00 +c0 00 00 02 21 16 80 7c 00 20 00 00 00 91 d0 c0 c0 00 00 00 00 00 08 1d 6f 00 e0 00 c8 2a f5 a2 02 00 02 00 81 57 93 9c 00 0c +00 00 01 24 80 78 00 00 00 21 87 e6 b0 0c 00 00 00 00 00 00 00 00 91 e4 f1 88 00 00 00 aa 0b 40 30 00 00 09 4e cf 00 00 00 +00 00 00 03 21 16 dc 60 80 00 08 1f e9 71 90 00 00 00 00 00 00 04 0b 0e ec b1 90 00 08 0a 55 f0 c0 00 00 80 a8 e6 10 00 00 00 +00 00 00 24 80 34 00 00 00 00 87 c7 b0 00 80 80 00 00 00 00 00 00 93 cd 93 08 00 00 82 aa 03 00 00 00 00 0a 67 4c 10 00 00 +00 00 00 03 21 16 80 00 00 0a 08 1c d8 01 a4 00 00 00 00 00 00 00 18 35 6f 00 80 00 00 2a 57 ec 06 00 00 00 a9 41 98 18 00 00 +00 02 00 24 80 38 20 00 00 04 87 e4 f7 00 00 00 00 00 00 00 00 00 82 fc d0 29 01 00 0a 8d 10 14 00 00 00 08 28 1f 08 00 10 +00 00 00 03 21 17 de 00 00 02 08 1f e8 00 00 00 00 00 00 00 04 00 18 bd 6d 00 c0 08 00 28 d5 e2 c6 00 00 00 ab d6 b7 00 00 80 +00 00 00 64 80 74 40 00 00 00 c3 f7 e0 09 00 00 00 00 00 10 10 00 a2 f5 cf 08 00 40 80 05 0e dc 60 00 80 00 14 3f 00 80 00 +00 00 20 03 21 12 a6 60 20 08 09 1d 5e 10 10 00 00 00 00 00 00 00 1b 0e ee 99 90 00 00 0a f1 2c 67 40 20 00 2b d6 91 81 00 00 +00 00 00 a4 80 78 43 c0 03 04 86 be 97 00 00 00 00 00 00 00 00 00 a8 45 f0 00 00 00 02 47 9b 80 00 00 00 02 a8 29 30 00 00 +00 00 00 03 21 12 e6 04 00 30 0a 9f 4e 18 e0 00 00 00 00 00 00 00 0a 9e ce 00 00 00 01 28 b3 05 e3 80 00 80 29 4d c8 0e 1c 00 +00 00 01 24 80 34 03 80 00 40 8b c5 e7 00 00 14 00 00 00 00 00 00 93 cd e1 0d 00 10 02 47 38 00 7c 00 50 00 14 2f 00 d0 09 +40 00 00 03 21 13 80 00 00 60 08 1d ce 00 00 01 00 00 00 00 00 00 08 35 cf f0 10 01 48 24 77 20 07 00 04 00 2b ce 90 0f 19 10 +00 00 02 24 80 38 00 00 00 20 1d e4 e1 00 00 00 00 00 00 00 80 00 a2 c4 f0 0e 05 40 00 aa 0a c4 24 00 00 22 a8 28 f0 f1 00 +00 00 00 07 21 12 c0 00 00 00 03 b9 7c 80 80 00 00 00 00 00 00 00 08 3d cc 70 00 08 08 0a 57 b2 00 00 00 00 29 4d a0 00 00 00 +00 00 +62 00 3f +72 00 80 +11 00 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +11 01 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +11 02 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +11 03 +82 00 00 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +82 00 80 +01 03 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +00 00 +22 +84 b1 +01 06 + diff --git a/fpga/readme.md b/fpga/readme.md index 870248fe..196d113a 100644 --- a/fpga/readme.md +++ b/fpga/readme.md @@ -16,13 +16,19 @@ Reference Design board (SX1301AP2-PCB_E336) flash memory. The different images contain the following features: -* SX1301_FPGA_125K_NOTCH_LBT_bitmap_v27.bin: - - 125K Notch filter for TX - - Listen-Before-Talk +* SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_863_v33.hex: + - 200KHz Notch filter for TX (not programmable) + - Listen-Before-Talk for 863+MHz frequency range + - Background Spectral Scan (limited) -* SX1301_FPGA_125K_NOTCH_SPECTRAL_SCAN_bitmap_v27.bin: - - 125K Notch filter for TX - - Background Spectral Scan +* SX1301_FPGA_200K_NOTCH_LBT_SPECTRAL_SCAN_915_v33.hex: + - 200KHz Notch filter for TX (not programmable) + - Listen-Before-Talk for 915+MHz frequency range + - Background Spectral Scan (limited) + +* SX1301_FPGA_NOTCH_PROG_SPECTRAL_SCAN_v31.hex: + - Programmable notch filter for TX + - Background Spectral Scan (full) 2. Usage -------- diff --git a/libloragw/inc/loragw_fpga.h b/libloragw/inc/loragw_fpga.h index 358607fe..82a763df 100644 --- a/libloragw/inc/loragw_fpga.h +++ b/libloragw/inc/loragw_fpga.h @@ -31,41 +31,60 @@ Maintainer: Michael Coracin #define LGW_REG_SUCCESS 0 #define LGW_REG_ERROR -1 +#define LGW_MIN_NOTCH_FREQ 126000U /* 126 KHz */ +#define LGW_MAX_NOTCH_FREQ 250000U /* 250 KHz */ +#define LGW_DEFAULT_NOTCH_FREQ 129000U /* 129 KHz */ + /* auto generated register mapping for C code this file contains autogenerated C struct used to access the FPGA registers this file is autogenerated from registers description */ + #define LGW_FPGA_SOFT_RESET 0 -#define LGW_FPGA_FPGA_FEATURE 1 -#define LGW_FPGA_VERSION 2 -#define LGW_FPGA_FPGA_STATUS 3 -#define LGW_FPGA_CTRL_FEATURE_START 4 -#define LGW_FPGA_CTRL_RADIO_RESET 5 -#define LGW_FPGA_CTRL_INPUT_SYNC_I 6 -#define LGW_FPGA_CTRL_INPUT_SYNC_Q 7 -#define LGW_FPGA_CTRL_OUTPUT_SYNC 8 -#define LGW_FPGA_CTRL_INVERT_IQ 9 -#define LGW_FPGA_HISTO_RAM_ADDR 10 -#define LGW_FPGA_HISTO_RAM_DATA 11 -#define LGW_FPGA_HISTO_TEMPO 12 -#define LGW_FPGA_HISTO_NB_READ 13 -#define LGW_FPGA_TIMESTAMP 14 -#define LGW_FPGA_LBT_TIMESTAMP_CH 15 -#define LGW_FPGA_LBT_TIMESTAMP_SELECT_CH 16 -#define LGW_FPGA_LBT_TIMESTAMP_NB_CH 17 -#define LGW_FPGA_SPI_MASTER_SPEED_DIVIDER 18 -#define LGW_FPGA_NB_READ_RSSI 19 -#define LGW_FPGA_PLL_LOCK_TIME 20 -#define LGW_FPGA_RSSI_TARGET 21 -#define LGW_FPGA_LSB_START_FREQ 22 -#define LGW_FPGA_SPI_MUX_CTRL 23 -#define LGW_FPGA_TOTALREGS 24 +#define LGW_FPGA_FEATURE 1 +#define LGW_FPGA_LBT_INITIAL_FREQ 2 +#define LGW_FPGA_VERSION 3 +#define LGW_FPGA_STATUS 4 +#define LGW_FPGA_CTRL_FEATURE_START 5 +#define LGW_FPGA_CTRL_RADIO_RESET 6 +#define LGW_FPGA_CTRL_INPUT_SYNC_I 7 +#define LGW_FPGA_CTRL_INPUT_SYNC_Q 8 +#define LGW_FPGA_CTRL_OUTPUT_SYNC 9 +#define LGW_FPGA_CTRL_INVERT_IQ 10 +#define LGW_FPGA_CTRL_ACCESS_HISTO_MEM 11 +#define LGW_FPGA_CTRL_CLEAR_HISTO_MEM 12 +#define LGW_FPGA_HISTO_RAM_ADDR 13 +#define LGW_FPGA_HISTO_RAM_DATA 14 +#define LGW_FPGA_HISTO_NB_READ 15 +#define LGW_FPGA_LBT_TIMESTAMP_CH 16 +#define LGW_FPGA_LBT_TIMESTAMP_SELECT_CH 17 +#define LGW_FPGA_LBT_CH0_FREQ_OFFSET 18 +#define LGW_FPGA_LBT_CH1_FREQ_OFFSET 19 +#define LGW_FPGA_LBT_CH2_FREQ_OFFSET 20 +#define LGW_FPGA_LBT_CH3_FREQ_OFFSET 21 +#define LGW_FPGA_LBT_CH4_FREQ_OFFSET 22 +#define LGW_FPGA_LBT_CH5_FREQ_OFFSET 23 +#define LGW_FPGA_LBT_CH6_FREQ_OFFSET 24 +#define LGW_FPGA_LBT_CH7_FREQ_OFFSET 25 +#define LGW_FPGA_SCAN_FREQ_OFFSET 26 +#define LGW_FPGA_LBT_SCAN_TIME_CH0 27 +#define LGW_FPGA_LBT_SCAN_TIME_CH1 28 +#define LGW_FPGA_LBT_SCAN_TIME_CH2 29 +#define LGW_FPGA_LBT_SCAN_TIME_CH3 30 +#define LGW_FPGA_LBT_SCAN_TIME_CH4 31 +#define LGW_FPGA_LBT_SCAN_TIME_CH5 32 +#define LGW_FPGA_LBT_SCAN_TIME_CH6 33 +#define LGW_FPGA_LBT_SCAN_TIME_CH7 34 +#define LGW_FPGA_RSSI_TARGET 35 +#define LGW_FPGA_HISTO_SCAN_FREQ 36 +#define LGW_FPGA_NOTCH_FREQ_OFFSET 37 +#define LGW_FPGA_TOTALREGS 38 /* -------------------------------------------------------------------------- */ /* --- PUBLIC FUNCTIONS PROTOTYPES ------------------------------------------ */ -int lgw_fpga_configure(void); +int lgw_fpga_configure(uint32_t tx_notch_freq); /** @brief LoRa concentrator FPGA register write diff --git a/libloragw/inc/loragw_hal.h b/libloragw/inc/loragw_hal.h index 5547dba1..d015d544 100644 --- a/libloragw/inc/loragw_hal.h +++ b/libloragw/inc/loragw_hal.h @@ -60,7 +60,7 @@ Maintainer: Sylvain Miermont /* concentrator chipset-specific parameters */ /* to use array parameters, declare a local const and use 'if_chain' as index */ #define LGW_IF_CHAIN_NB 10 /* number of IF+modem RX chains */ -#define LGW_PKT_FIFO_SIZE 8 /* depth of the RX packet FIFO */ +#define LGW_PKT_FIFO_SIZE 16 /* depth of the RX packet FIFO */ #define LGW_DATABUFF_SIZE 1024 /* size in bytes of the RX data buffer (contains payload & metadata) */ #define LGW_REF_BW 125000 /* typical bandwidth of data channel */ #define LGW_MULTI_NB 8 /* number of LoRa 'multi SF' chains */ @@ -152,6 +152,9 @@ Maintainer: Sylvain Miermont /* Maximum size of Tx gain LUT */ #define TX_GAIN_LUT_SIZE_MAX 16 +/* LBT constants */ +#define LBT_CHANNEL_FREQ_NB 8 /* Number of LBT channels */ + /* -------------------------------------------------------------------------- */ /* --- PUBLIC TYPES --------------------------------------------------------- */ @@ -172,8 +175,17 @@ enum lgw_radio_type_e { @brief Configuration structure for board specificities */ struct lgw_conf_board_s { - bool lorawan_public; /*!> Enable ONLY for *public* networks using the LoRa MAC protocol */ - uint8_t clksrc; /*!> Index of RF chain which provides clock to concentrator */ + bool lorawan_public; /*!> Enable ONLY for *public* networks using the LoRa MAC protocol */ + uint8_t clksrc; /*!> Index of RF chain which provides clock to concentrator */ +}; + +/** +@struct lgw_conf_lbt_chan_s +@brief Configuration structure for LBT channels +*/ +struct lgw_conf_lbt_chan_s { + uint32_t freq_hz; + uint16_t scan_time_us; }; /** @@ -181,13 +193,11 @@ struct lgw_conf_board_s { @brief Configuration structure for LBT specificities */ struct lgw_conf_lbt_s { - bool enable; /*!> enable or disable LBT */ - uint8_t rssi_target; /*!> RSSI threshold to detect if channel is busy or not */ - uint8_t nb_channel; /*!> number of LBT channels */ - uint16_t scan_time_us; /*!> channel activity scan duration, in microseconds */ - uint32_t start_freq; /*!> first LBT channel frequency */ - uint32_t tx_delay_1ch_us; /*!> maximum time allowed to send a packet since channel was free, when TX is on one channel only */ - uint32_t tx_delay_2ch_us; /*!> maximum time allowed to send a packet since channel was free, when TX is on two channels */ + bool enable; /*!> enable or disable LBT */ + int8_t rssi_target; /*!> RSSI threshold to detect if channel is busy or not (dBm) */ + uint8_t nb_channel; /*!> number of LBT channels */ + struct lgw_conf_lbt_chan_s channels[LBT_CHANNEL_FREQ_NB]; + int8_t rssi_offset; /*!> RSSI offset to be applied to SX127x RSSI values */ }; /** @@ -195,11 +205,12 @@ struct lgw_conf_lbt_s { @brief Configuration structure for a RF chain */ struct lgw_conf_rxrf_s { - bool enable; /*!> enable or disable that RF chain */ - uint32_t freq_hz; /*!> center frequency of the radio in Hz */ - float rssi_offset; /*!> Board-specific RSSI correction factor */ - enum lgw_radio_type_e type; /*!> Radio type for that RF chain (SX1255, SX1257....) */ - bool tx_enable; /*!> enable or disable TX on that RF chain */ + bool enable; /*!> enable or disable that RF chain */ + uint32_t freq_hz; /*!> center frequency of the radio in Hz */ + float rssi_offset; /*!> Board-specific RSSI correction factor */ + enum lgw_radio_type_e type; /*!> Radio type for that RF chain (SX1255, SX1257....) */ + bool tx_enable; /*!> enable or disable TX on that RF chain */ + uint32_t tx_notch_freq; /*!> TX notch filter frequency [126KHz..250KHz] */ }; /** @@ -385,10 +396,9 @@ const char* lgw_version_info(void); /** @brief Return time on air of given packet, in milliseconds @param packet is a pointer to the packet structure -@param isBeacon indicates if the packet is a beacon or not @return the packet time on air in milliseconds */ -uint32_t lgw_time_on_air(struct lgw_pkt_tx_s *packet, bool isBeacon); +uint32_t lgw_time_on_air(struct lgw_pkt_tx_s *packet); #endif diff --git a/libloragw/inc/loragw_lbt.h b/libloragw/inc/loragw_lbt.h index 48ae4601..a8ca1574 100644 --- a/libloragw/inc/loragw_lbt.h +++ b/libloragw/inc/loragw_lbt.h @@ -42,13 +42,9 @@ int lbt_setconf(struct lgw_conf_lbt_s * conf); /** @brief Configure the concentrator for LBT feature -@param rf_freq frequency in Hz of the first LBT channel -@param rssi_target RSSI threshold used to determine if LBT channel is busy or not -@param scan_time_us duration of channel activity scanning, in microseconds -@param nb_channel number of LBT channels @return LGW_LBT_ERROR id the operation failed, LGW_LBT_SUCCESS else */ -int lbt_setup(uint32_t rf_freq, uint8_t rssi_target, uint16_t scan_time_us, uint8_t nb_channel); +int lbt_setup(void); /** @brief Start the LBT FSM @@ -64,5 +60,11 @@ int lbt_start(void); */ int lbt_is_channel_free(struct lgw_pkt_tx_s * pkt_data, bool * tx_allowed); +/** +@brief Check if LBT is enabled +@return true if enabled, false otherwise +*/ +bool lbt_is_enabled(void); + #endif /* --- EOF ------------------------------------------------------------------ */ diff --git a/libloragw/inc/loragw_radio.h b/libloragw/inc/loragw_radio.h index 30831ce2..32d494bf 100644 --- a/libloragw/inc/loragw_radio.h +++ b/libloragw/inc/loragw_radio.h @@ -30,16 +30,44 @@ Maintainer: Michael Coracin #define SX125x_32MHz_FRAC 15625 /* irreductible fraction for PLL register caculation */ +/* -------------------------------------------------------------------------- */ +/* --- PUBLIC CONSTANTS ----------------------------------------------------- */ + +enum lgw_sx127x_rxbw_e { + LGW_SX127X_RXBW_2K6_HZ, + LGW_SX127X_RXBW_3K1_HZ, + LGW_SX127X_RXBW_3K9_HZ, + LGW_SX127X_RXBW_5K2_HZ, + LGW_SX127X_RXBW_6K3_HZ, + LGW_SX127X_RXBW_7K8_HZ, + LGW_SX127X_RXBW_10K4_HZ, + LGW_SX127X_RXBW_12K5_HZ, + LGW_SX127X_RXBW_15K6_HZ, + LGW_SX127X_RXBW_20K8_HZ, + LGW_SX127X_RXBW_25K_HZ, + LGW_SX127X_RXBW_31K3_HZ, + LGW_SX127X_RXBW_41K7_HZ, + LGW_SX127X_RXBW_50K_HZ, + LGW_SX127X_RXBW_62K5_HZ, + LGW_SX127X_RXBW_83K3_HZ, + LGW_SX127X_RXBW_100K_HZ, + LGW_SX127X_RXBW_125K_HZ, + LGW_SX127X_RXBW_166K7_HZ, + LGW_SX127X_RXBW_200K_HZ, + LGW_SX127X_RXBW_250K_HZ +}; + /* -------------------------------------------------------------------------- */ /* --- PUBLIC FUNCTIONS PROTOTYPES ------------------------------------------ */ -int setup_sx125x(uint8_t rf_chain, uint8_t rf_clkout, bool rf_enable, uint8_t rf_radio_type, uint32_t freq_hz); +int lgw_setup_sx125x(uint8_t rf_chain, uint8_t rf_clkout, bool rf_enable, uint8_t rf_radio_type, uint32_t freq_hz); + +int lgw_setup_sx127x(uint32_t frequency, uint8_t modulation, enum lgw_sx127x_rxbw_e rxbw_khz, int8_t rssi_offset); int lgw_sx127x_reg_w(uint8_t address, uint8_t reg_value); int lgw_sx127x_reg_r(uint8_t address, uint8_t *reg_value); -int lgw_setup_sx127x(uint32_t frequency, uint8_t modulation); #endif /* --- EOF ------------------------------------------------------------------ */ diff --git a/libloragw/inc/loragw_reg.h b/libloragw/inc/loragw_reg.h index d034b07e..2a944a76 100644 --- a/libloragw/inc/loragw_reg.h +++ b/libloragw/inc/loragw_reg.h @@ -394,9 +394,13 @@ this file is autogenerated from registers description /** @brief Connect LoRa concentrator by opening SPI link +@param spi_only indicates if we only want to create the SPI connexion to the +concentrator, or if we also want to reset it and configure the FPGA (if present) +@param tx_notch_filter TX notch filter frequency to be set in the FPGA (only +used with SX1301AP2 reference design). @return status of register operation (LGW_REG_SUCCESS/LGW_REG_ERROR) */ -int lgw_connect(void); +int lgw_connect(bool spi_only, uint32_t tx_notch_freq); /** @brief Disconnect LoRa concentrator by closing SPI link diff --git a/libloragw/readme.md b/libloragw/readme.md index 6cf66bf1..dcd1d693 100644 --- a/libloragw/readme.md +++ b/libloragw/readme.md @@ -178,78 +178,70 @@ This module is only required for SX1301AP2 reference design. ### 2.8. loragw_lbt ### This module contains functions to configure and use the "Listen-Before-Talk" -feature. It depends on the loragw_fpga and loragw_radio modules. +feature (refered as LBT below). It depends on the loragw_fpga and loragw_radio +modules. LBT feature is only available on SX1301AP2 reference design, which provides the FPGA and the SX127x radio required to accomplish the feature. -The FPGA implements the following Finite State Machine (FSM) to scan predefined -channels used for LBT, using the SX127x radio: +The FPGA implements the following Finite State Machine (FSM) to scan the defined +LBT channels (8 max), and also compute the RSSI histogram for spectral scan, +using the SX127x radio. +-------+ - | idle | - +-------+ - | - v - +---------+ - | set pll |<----+ - +---------+ | - | | - v | - +----------+ | - | wait pll | | - | lock | | - +----------+ | - | | - v | - +-----------+ | - +-->| read rssi | | - | +-----------+ | - The number of | | | - read defines the | v | The delay between 2 channel - CHANNEL_SCAN_TIME | +------------+ | scan is equal to - | | compare to | | PLL_LOCK_TIME + CHANNEL_SCAN_TIME - +---+ | | - | threshold | | - +------------+ | - | | - v | - +------------+ | - | update CH_n| | - | timestamp | | - +----------- + | - | | - v | - +-----------+ | - | update | | - | rf freq | | - +-----+-----+ | - | | - +----------+ - -In order to configure the LBT, the following parameters have to be set: - -SPI_MASTER_SPEED_DIVIDER: defines the internal SPI_MASTER SPI clock speed. - SPI_clock_freq = 32MHz / (SPI_MASTER_SPEED_DIVIDER*2) + +------------------>+ idle +------------------+ + | +-------+ v + | | +-----------+ + | | | clean mem | + | v +-----------+ + | +----------+ | + | | set freq |<---------------+ + | +----------+ + | | + | v + | +----------+ + | | wait pll | + | | lock | + | +----------+ + | | (SCAN_CHANNEL) + | v +-----------+ + | +-----------+ | | + | | +----------+ v + | +-->| read RSSI | +------------+ + | | | +<---------------+ calc histo | + | | +-----------+ SCANNING +------------+ + | | | | + | SCANNING | | (LBT_CHANNEL) | + | | v | + | | +-------------+ | + | | | compare | | + | +--+ with | | + | | RSSI_TARGET | HISTO_DONE | + | +-------------+ | + | | | + | SCAN DONE | | + | v | + | +------------+ | + | | increase | | + +-----------------+ +<--------------------+ + | freq | + +------------+ -NB_RSSI_READ: defines the number of SPI reads of SX127x RSSI value - register. -PLL_LOCK_TIME: defines the delay in 8µs step between frequency - programming and RX ready. -RSSI_TARGET: defines the signal strength target used to detect if - the channel is busy or not. - RSSI_TARGET_dBm = -RSSI_TARGET / 2 - -Based on those parameters we have: - -CHANNEL_SCAN_TIME (µs) = (NB_RSSI_READ + 1) * Tspi - with Tspi (µs) = (16*(2*(SPI_MASTER_SPEED_DIVIDER+1))/32) + 2 +In order to configure the LBT, the following parameters have to be set: +- RSSI_TARGET: signal strength target used to detect if the channel is clear + or not. + RSSI_TARGET_dBm = -RSSI_TARGET/2 +- LBT_CHx_FREQ_OFFSET: with x=[0..7], offset from the predefined LBT start + frequency (863MHz or 915MHz depending on FPGA image), + in 100KHz unit. +- LBT_SCAN_TIME_CHx: with x=[0..7], the channel scan time to be used for this + LBT channel: 128µs or 5000µs With this FSM, the FPGA keeps the last instant when each channel was free during -more than CHANNEL_SCAN_TIME µs. +more than LBT_SCAN_TIME_CHx µs. Then, the HAL, when receiving a downlink request, will first determine on which LBT channel this downlink is supposed to be sent and then checks if the channel @@ -266,8 +258,7 @@ In order to determine if a downlink is allowed or not, the HAL does: ALLOWED = FALSE endif where TX_MAX_TIME is the maximum time allowed to send a packet since the - last channel free time (this is given to the HAL as a configuration - parameter). + last channel free time (this depends on the channel scan time ). 3. Software build process diff --git a/libloragw/src/loragw_fpga.c b/libloragw/src/loragw_fpga.c index 717639b4..6051d663 100644 --- a/libloragw/src/loragw_fpga.c +++ b/libloragw/src/loragw_fpga.c @@ -54,29 +54,43 @@ this file is autogenerated from registers description */ const struct lgw_reg_s fpga_regs[LGW_FPGA_TOTALREGS] = { {-1,0,0,0,1,0,0}, /* SOFT_RESET */ - {-1,0,1,0,7,1,0}, /* FPGA_FEATURE */ + {-1,0,1,0,4,1,0}, /* FPGA_FEATURE */ + {-1,0,5,0,3,1,0}, /* LBT_INITIAL_FREQ */ {-1,1,0,0,8,1,0}, /* VERSION */ {-1,2,0,0,8,1,0}, /* FPGA_STATUS */ {-1,3,0,0,1,0,0}, /* FPGA_CTRL_FEATURE_START */ {-1,3,1,0,1,0,0}, /* FPGA_CTRL_RADIO_RESET */ - {-1,3,2,0,1,0,1}, /* FPGA_CTRL_INPUT_SYNC_I */ - {-1,3,3,0,1,0,1}, /* FPGA_CTRL_INPUT_SYNC_Q */ + {-1,3,2,0,1,0,0}, /* FPGA_CTRL_INPUT_SYNC_I */ + {-1,3,3,0,1,0,0}, /* FPGA_CTRL_INPUT_SYNC_Q */ {-1,3,4,0,1,0,0}, /* FPGA_CTRL_OUTPUT_SYNC */ - {-1,3,5,0,1,0,1}, /* FPGA_CTRL_INVERT_IQ */ + {-1,3,5,0,1,0,0}, /* FPGA_CTRL_INVERT_IQ */ + {-1,3,6,0,1,0,0}, /* FPGA_CTRL_ACCESS_HISTO_MEM */ + {-1,3,7,0,1,0,0}, /* FPGA_CTRL_CLEAR_HISTO_MEM */ {-1,4,0,0,8,0,0}, /* HISTO_RAM_ADDR */ {-1,5,0,0,8,1,0}, /* HISTO_RAM_DATA */ - {-1,6,0,0,16,0,32000}, /* HISTO_TEMPO */ {-1,8,0,0,16,0,1000}, /* HISTO_NB_READ */ - {-1,10,0,0,32,1,0}, /* TIMESTAMP */ - {-1,14,0,0,24,1,0}, /* LBT_TIMESTAMP_CH */ - {-1,17,0,0,8,0,0}, /* LBT_TIMESTAMP_SELECT_CH */ - {-1,18,0,0,8,0,8}, /* LBT_TIMESTAMP_NB_CH */ - {-1,19,0,0,8,0,7}, /* SPI_MASTER_SPEED_DIVIDER */ - {-1,20,0,0,8,0,10}, /* NB_READ_RSSI */ - {-1,21,0,0,8,0,10}, /* PLL_LOCK_TIME */ - {-1,22,0,0,8,0,160}, /* RSSI_TARGET */ - {-1,23,0,0,16,0,0}, /* LSB_START_FREQ */ - {-1,127,0,0,8,0,0} /* SPI_MUX_CTRL */ + {-1,14,0,0,16,1,0}, /* LBT_TIMESTAMP_CH */ + {-1,17,0,0,4,0,0}, /* LBT_TIMESTAMP_SELECT_CH */ + {-1,18,0,0,8,0,0}, /* LBT_CH0_FREQ_OFFSET */ + {-1,19,0,0,8,0,0}, /* LBT_CH1_FREQ_OFFSET */ + {-1,20,0,0,8,0,0}, /* LBT_CH2_FREQ_OFFSET */ + {-1,21,0,0,8,0,0}, /* LBT_CH3_FREQ_OFFSET */ + {-1,22,0,0,8,0,0}, /* LBT_CH4_FREQ_OFFSET */ + {-1,23,0,0,8,0,0}, /* LBT_CH5_FREQ_OFFSET */ + {-1,24,0,0,8,0,0}, /* LBT_CH6_FREQ_OFFSET */ + {-1,25,0,0,8,0,0}, /* LBT_CH7_FREQ_OFFSET */ + {-1,26,0,0,8,0,0}, /* SCAN_FREQ_OFFSET */ + {-1,28,0,0,1,0,0}, /* LBT_SCAN_TIME_CH0 */ + {-1,28,1,0,1,0,0}, /* LBT_SCAN_TIME_CH1 */ + {-1,28,2,0,1,0,0}, /* LBT_SCAN_TIME_CH2 */ + {-1,28,3,0,1,0,0}, /* LBT_SCAN_TIME_CH3 */ + {-1,28,4,0,1,0,0}, /* LBT_SCAN_TIME_CH4 */ + {-1,28,5,0,1,0,0}, /* LBT_SCAN_TIME_CH5 */ + {-1,28,6,0,1,0,0}, /* LBT_SCAN_TIME_CH6 */ + {-1,28,7,0,1,0,0}, /* LBT_SCAN_TIME_CH7 */ + {-1,30,0,0,8,0,160}, /* RSSI_TARGET */ + {-1,31,0,0,24,0,0}, /* HISTO_SCAN_FREQ */ + {-1,34,0,0,6,0,0} /* NOTCH_FREQ_OFFSET */ }; /* -------------------------------------------------------------------------- */ @@ -94,14 +108,20 @@ extern uint8_t lgw_spi_mux_mode; /*! current SPI mux mode used */ /* -------------------------------------------------------------------------- */ /* --- PUBLIC FUNCTIONS DEFINITION ------------------------------------------ */ -int lgw_fpga_configure(void) { +int lgw_fpga_configure(uint32_t tx_notch_freq) { int x; - int32_t val; + int32_t val, notch_offset_reg; bool tx_filter_support, spectral_scan_support, lbt_support; + /* Check input parameters */ + if ((tx_notch_freq < LGW_MIN_NOTCH_FREQ) || (tx_notch_freq > LGW_MAX_NOTCH_FREQ)) { + DEBUG_PRINTF("WARNING: FPGA TX notch frequency is out of range (%u - [%u..%u]), setting it to default (%u)\n", tx_notch_freq, LGW_MIN_NOTCH_FREQ, LGW_MAX_NOTCH_FREQ, LGW_DEFAULT_NOTCH_FREQ); + tx_notch_freq = LGW_DEFAULT_NOTCH_FREQ; + } + /* Get supported FPGA features */ printf("INFO: FPGA supported features:"); - lgw_fpga_reg_r(LGW_FPGA_FPGA_FEATURE, &val); + lgw_fpga_reg_r(LGW_FPGA_FEATURE, &val); tx_filter_support = TAKE_N_BITS_FROM((uint8_t)val, 0, 1); if (tx_filter_support) { printf(" [TX filter] "); @@ -116,16 +136,36 @@ int lgw_fpga_configure(void) { } printf("\n"); - /* Configure TX filter */ - x = lgw_fpga_reg_w(LGW_FPGA_CTRL_INPUT_SYNC_I, 0); - x |= lgw_fpga_reg_w(LGW_FPGA_CTRL_INPUT_SYNC_Q, 0); - x |= lgw_fpga_reg_w(LGW_FPGA_CTRL_OUTPUT_SYNC, 1); - if( x != LGW_REG_SUCCESS ) - { - DEBUG_MSG("ERROR: Failed to configure FPGA TX filter\n"); + x = lgw_fpga_reg_w(LGW_FPGA_CTRL_INPUT_SYNC_I, 1); + x |= lgw_fpga_reg_w(LGW_FPGA_CTRL_INPUT_SYNC_Q, 1); + x |= lgw_fpga_reg_w(LGW_FPGA_CTRL_OUTPUT_SYNC, 0); + if (x != LGW_REG_SUCCESS) { + DEBUG_MSG("ERROR: Failed to configure FPGA TX synchro\n"); return LGW_REG_ERROR; } + /* Configure TX notch filter */ + if (tx_filter_support == true) { + notch_offset_reg = (32E6 / (2*tx_notch_freq)) - 64; + x = lgw_fpga_reg_w(LGW_FPGA_NOTCH_FREQ_OFFSET, notch_offset_reg); + if (x != LGW_REG_SUCCESS) { + DEBUG_MSG("ERROR: Failed to configure FPGA TX notch filter\n"); + return LGW_REG_ERROR; + } + + /* Readback to check that notch frequency is programmable */ + x = lgw_fpga_reg_r(LGW_FPGA_NOTCH_FREQ_OFFSET, &val); + if (x != LGW_REG_SUCCESS) { + DEBUG_MSG("ERROR: Failed to read FPGA TX notch frequency\n"); + return LGW_REG_ERROR; + } + if (val != notch_offset_reg) { + DEBUG_MSG("WARNING: TX notch filter frequency is not programmable (check your FPGA image)\n"); + } else { + DEBUG_PRINTF("INFO: TX notch filter frequency set to %u (%i)\n", tx_notch_freq, notch_offset_reg); + } + } + return LGW_REG_SUCCESS; } diff --git a/libloragw/src/loragw_gps.c b/libloragw/src/loragw_gps.c index 7e20b613..c4ab7051 100644 --- a/libloragw/src/loragw_gps.c +++ b/libloragw/src/loragw_gps.c @@ -298,6 +298,7 @@ int lgw_gps_enable(char *tty_path, char *gps_familly, speed_t target_brate, int ttyopt.c_iflag |= ICRNL; /* map CR to NL */ ttyopt.c_iflag |= IGNCR; /* Ignore carriage return on input */ ttyopt.c_lflag |= ICANON; /* enable canonical input */ + ttyopt.c_lflag &= ~ECHO; /* disable input re-echoed as output */ /* set new serial ports parameters */ i = tcsetattr(gps_tty_dev, TCSANOW, &ttyopt); diff --git a/libloragw/src/loragw_hal.c b/libloragw/src/loragw_hal.c index e5f19286..1edbdb29 100644 --- a/libloragw/src/loragw_hal.c +++ b/libloragw/src/loragw_hal.c @@ -81,9 +81,14 @@ Maintainer: Sylvain Miermont #define RSSI_FSK_POLY_1 1.5351 #define RSSI_FSK_POLY_2 0.003 +/* Useful bandwidth of SX125x radios to consider depending on channel bandwidth */ +/* Note: the below values come from lab measurements. For any question, please contact Semtech support */ +#define LGW_RF_RX_BANDWIDTH_125KHZ 925000 /* for 125KHz channels */ +#define LGW_RF_RX_BANDWIDTH_250KHZ 1000000 /* for 250KHz channels */ +#define LGW_RF_RX_BANDWIDTH_500KHZ 1100000 /* for 500KHz channels */ + /* constant arrays defining hardware capability */ const uint8_t ifmod_config[LGW_IF_CHAIN_NB] = LGW_IFMODEM_CONFIG; -const uint32_t rf_rx_bandwidth[LGW_RF_CHAIN_NB] = LGW_RF_RX_BANDWIDTH; /* Version string, used to identify the library version/options once compiled */ const char lgw_version_string[] = "Version: " LIBLORAGW_VERSION ";"; @@ -110,6 +115,7 @@ static bool rf_enable[LGW_RF_CHAIN_NB]; static uint32_t rf_rx_freq[LGW_RF_CHAIN_NB]; /* absolute, in Hz */ static float rf_rssi_offset[LGW_RF_CHAIN_NB]; static bool rf_tx_enable[LGW_RF_CHAIN_NB]; +static uint32_t rf_tx_notch_freq[LGW_RF_CHAIN_NB]; static enum lgw_radio_type_e rf_radio_type[LGW_RF_CHAIN_NB]; static bool if_enable[LGW_IF_CHAIN_NB]; @@ -153,13 +159,6 @@ static int8_t cal_offset_a_q[8]; /* TX Q offset for radio A */ static int8_t cal_offset_b_i[8]; /* TX I offset for radio B */ static int8_t cal_offset_b_q[8]; /* TX Q offset for radio B */ -/* LBT variables - defined in loragw_lbt module */ -extern bool lbt_enable; -extern uint8_t lbt_rssi_target; -extern uint8_t lbt_nb_channel; -extern uint32_t lbt_first_channel_freq; -extern uint16_t lbt_scan_time_us; - /* -------------------------------------------------------------------------- */ /* --- PRIVATE FUNCTIONS DECLARATION ---------------------------------------- */ @@ -167,6 +166,9 @@ int load_firmware(uint8_t target, uint8_t *firmware, uint16_t size); void lgw_constant_adjust(void); +int32_t lgw_sf_getval(int x); +int32_t lgw_bw_getval(int x); + /* -------------------------------------------------------------------------- */ /* --- PRIVATE FUNCTIONS DEFINITION ----------------------------------------- */ @@ -343,6 +345,35 @@ void lgw_constant_adjust(void) { return; } +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int32_t lgw_bw_getval(int x) { + switch (x) { + case BW_500KHZ: return 500000; + case BW_250KHZ: return 250000; + case BW_125KHZ: return 125000; + case BW_62K5HZ: return 62500; + case BW_31K2HZ: return 31200; + case BW_15K6HZ: return 15600; + case BW_7K8HZ : return 7800; + default: return -1; + } +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int32_t lgw_sf_getval(int x) { + switch (x) { + case DR_LORA_SF7: return 7; + case DR_LORA_SF8: return 8; + case DR_LORA_SF9: return 9; + case DR_LORA_SF10: return 10; + case DR_LORA_SF11: return 11; + case DR_LORA_SF12: return 12; + default: return -1; + } +} + /* -------------------------------------------------------------------------- */ /* --- PUBLIC FUNCTIONS DEFINITION ------------------------------------------ */ @@ -405,14 +436,21 @@ int lgw_rxrf_setconf(uint8_t rf_chain, struct lgw_conf_rxrf_s conf) { return LGW_HAL_ERROR; } + /* check if TX notch filter frequency is supported */ + if ((conf.tx_enable == true) && ((conf.tx_notch_freq < LGW_MIN_NOTCH_FREQ) || (conf.tx_notch_freq > LGW_MAX_NOTCH_FREQ))) { + DEBUG_PRINTF("WARNING: NOT A VALID TX NOTCH FILTER FREQUENCY [%u..%u]Hz\n", LGW_MIN_NOTCH_FREQ, LGW_MAX_NOTCH_FREQ); + conf.tx_notch_freq = 0; + } + /* set internal config according to parameters */ rf_enable[rf_chain] = conf.enable; rf_rx_freq[rf_chain] = conf.freq_hz; rf_rssi_offset[rf_chain] = conf.rssi_offset; rf_radio_type[rf_chain] = conf.type; rf_tx_enable[rf_chain] = conf.tx_enable; + rf_tx_notch_freq[rf_chain] = conf.tx_notch_freq; - DEBUG_PRINTF("Note: rf_chain %d configuration; en:%d freq:%d rssi_offset:%f radio_type:%d tx_enable:%d\n", rf_chain, rf_enable[rf_chain], rf_rx_freq[rf_chain], rf_rssi_offset[rf_chain], rf_radio_type[rf_chain], rf_tx_enable[rf_chain]); + DEBUG_PRINTF("Note: rf_chain %d configuration; en:%d freq:%d rssi_offset:%f radio_type:%d tx_enable:%d tx_notch_freq:%u\n", rf_chain, rf_enable[rf_chain], rf_rx_freq[rf_chain], rf_rssi_offset[rf_chain], rf_radio_type[rf_chain], rf_tx_enable[rf_chain], rf_tx_notch_freq[rf_chain]); return LGW_HAL_SUCCESS; } @@ -420,6 +458,8 @@ int lgw_rxrf_setconf(uint8_t rf_chain, struct lgw_conf_rxrf_s conf) { /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ int lgw_rxif_setconf(uint8_t if_chain, struct lgw_conf_rxif_s conf) { + int32_t bw_hz; + uint32_t rf_rx_bandwidth; /* check if the concentrator is running */ if (lgw_is_started == true) { @@ -449,14 +489,27 @@ int lgw_rxif_setconf(uint8_t if_chain, struct lgw_conf_rxif_s conf) { DEBUG_MSG("ERROR: INVALID RF_CHAIN TO ASSOCIATE WITH A LORA_STD IF CHAIN\n"); return LGW_HAL_ERROR; } - if ((conf.freq_hz + LGW_REF_BW/2) > ((int32_t)rf_rx_bandwidth[conf.rf_chain] / 2)) { + /* check if IF frequency is optimal based on channel and radio bandwidths */ + switch (conf.bandwidth) { + case BW_250KHZ: + rf_rx_bandwidth = LGW_RF_RX_BANDWIDTH_250KHZ; /* radio bandwidth */ + break; + case BW_500KHZ: + rf_rx_bandwidth = LGW_RF_RX_BANDWIDTH_500KHZ; /* radio bandwidth */ + break; + default: + /* For 125KHz and below */ + rf_rx_bandwidth = LGW_RF_RX_BANDWIDTH_125KHZ; /* radio bandwidth */ + break; + } + bw_hz = lgw_bw_getval(conf.bandwidth); /* channel bandwidth */ + if ((conf.freq_hz + ((bw_hz==-1)?LGW_REF_BW:bw_hz)/2) > ((int32_t)rf_rx_bandwidth/2)) { DEBUG_PRINTF("ERROR: IF FREQUENCY %d TOO HIGH\n", conf.freq_hz); return LGW_HAL_ERROR; - } else if ((conf.freq_hz - LGW_REF_BW/2) < -((int32_t)rf_rx_bandwidth[conf.rf_chain] / 2)) { + } else if ((conf.freq_hz - ((bw_hz==-1)?LGW_REF_BW:bw_hz)/2) < -((int32_t)rf_rx_bandwidth/2)) { DEBUG_PRINTF("ERROR: IF FREQUENCY %d TOO LOW\n", conf.freq_hz); return LGW_HAL_ERROR; } - /* WARNING: if the channel is 250 or 500kHz wide, that check is insufficient */ /* check parameters according to the type of IF chain + modem, fill default if necessary, and commit configuration if everything is OK */ @@ -606,7 +659,7 @@ int lgw_txgain_setconf(struct lgw_tx_gain_lut_s *conf) { /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ int lgw_start(void) { - int i; + int i, err; int reg_stat; unsigned x; uint8_t radio_select; @@ -623,7 +676,7 @@ int lgw_start(void) { DEBUG_MSG("Note: LoRa concentrator already started, restarting it now\n"); } - reg_stat = lgw_connect(); + reg_stat = lgw_connect(false, rf_tx_notch_freq[rf_tx_enable[1]?1:0]); if (reg_stat == LGW_REG_ERROR) { DEBUG_MSG("ERROR: FAIL TO CONNECT BOARD\n"); return LGW_HAL_ERROR; @@ -645,22 +698,31 @@ int lgw_start(void) { lgw_reg_w(LGW_RADIO_RST,0); /* setup the radios */ - setup_sx125x(0, rf_clkout, rf_enable[0], rf_radio_type[0], rf_rx_freq[0]); - setup_sx125x(1, rf_clkout, rf_enable[1], rf_radio_type[1], rf_rx_freq[1]); + err = lgw_setup_sx125x(0, rf_clkout, rf_enable[0], rf_radio_type[0], rf_rx_freq[0]); + if (err != 0) { + DEBUG_MSG("ERROR: Failed to setup sx125x radio for RF chain 0\n"); + return LGW_HAL_ERROR; + } + err = lgw_setup_sx125x(1, rf_clkout, rf_enable[1], rf_radio_type[1], rf_rx_freq[1]); + if (err != 0) { + DEBUG_MSG("ERROR: Failed to setup sx125x radio for RF chain 0\n"); + return LGW_HAL_ERROR; + } /* 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); /* Configure LBT */ - if (lbt_enable == true) { + if (lbt_is_enabled() == true) { lgw_reg_w(LGW_CLK32M_EN, 1); - i = lbt_setup(lbt_first_channel_freq, lbt_rssi_target, lbt_scan_time_us, lbt_nb_channel); + i = lbt_setup(); if (i != LGW_LBT_SUCCESS) { DEBUG_MSG("ERROR: lbt_setup() did not return SUCCESS\n"); return LGW_HAL_ERROR; } + /* Start SX1301 counter and LBT FSM at the same time to be in sync */ lgw_reg_w(LGW_CLK32M_EN, 0); i = lbt_start(); if (i != LGW_LBT_SUCCESS) { @@ -706,9 +768,9 @@ int lgw_start(void) { /* Load the calibration firmware */ load_firmware(MCU_AGC, cal_firmware, MCU_AGC_FW_BYTE); - 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); + 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); @@ -719,13 +781,13 @@ int lgw_start(void) { 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 */ + 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 for calibration to end */ DEBUG_PRINTF("Note: calibration started (time: %u ms)\n", cal_time); wait_ms(cal_time); /* Wait for end of calibration */ - lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL,1); /* Take back control */ + lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL, 1); /* Take back control */ /* Get calibration status */ lgw_reg_r(LGW_MCU_AGC_STATUS, &read_val); @@ -737,8 +799,8 @@ int lgw_start(void) { 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 5: radio A TX DC Offset correction successful + bit 6: radio B TX DC Offset correction successful */ if ((cal_status & 0x81) != 0x81) { DEBUG_PRINTF("ERROR: CALIBRATION FAILURE (STATUS = %u)\n", cal_status); @@ -759,10 +821,10 @@ int lgw_start(void) { DEBUG_MSG("WARNING: problem in calibration of radio B for image rejection\n"); } if (rf_enable[0] && rf_tx_enable[0] && ((cal_status & 0x20) == 0)) { - DEBUG_MSG("WARNING: problem in calibration of radio A for TX imbalance\n"); + DEBUG_MSG("WARNING: problem in calibration of radio A for TX DC offset\n"); } if (rf_enable[1] && rf_tx_enable[1] && ((cal_status & 0x40) == 0)) { - DEBUG_MSG("WARNING: problem in calibration of radio B for TX imbalance\n"); + DEBUG_MSG("WARNING: problem in calibration of radio B for TX DC offset\n"); } /* Get TX DC offset values */ @@ -784,6 +846,12 @@ int lgw_start(void) { /* load adjusted parameters */ lgw_constant_adjust(); + /* Sanity check for RX frequency */ + if (rf_rx_freq[0] == 0) { + DEBUG_MSG("ERROR: wrong configuration, rf_rx_freq[0] is not set\n"); + return LGW_HAL_ERROR; + } + /* Freq-to-time-drift calculation */ x = 4096000000 / (rf_rx_freq[0] >> 1); /* dividend: (4*2048*1000000) >> 1, rescaled to avoid 32b overflow */ x = ( x > 63 ) ? 63 : x; /* saturation */ @@ -825,27 +893,27 @@ int lgw_start(void) { lgw_reg_w(LGW_PPM_OFFSET, 0x60); /* as the threshold is 16ms, use 0x60 to enable ppm_offset for SF12 and SF11 @125kHz*/ - lgw_reg_w(LGW_CONCENTRATOR_MODEM_ENABLE,1); /* default 0 */ + lgw_reg_w(LGW_CONCENTRATOR_MODEM_ENABLE, 1); /* default 0 */ /* configure LoRa 'stand-alone' modem (IF8) */ lgw_reg_w(LGW_IF_FREQ_8, IF_HZ_TO_REG(if_freq[8])); /* MBWSSF modem (default 0) */ if (if_enable[8] == true) { lgw_reg_w(LGW_MBWSSF_RADIO_SELECT, if_rf_chain[8]); switch(lora_rx_bw) { - case BW_125KHZ: lgw_reg_w(LGW_MBWSSF_MODEM_BW,0); break; - case BW_250KHZ: lgw_reg_w(LGW_MBWSSF_MODEM_BW,1); break; - case BW_500KHZ: lgw_reg_w(LGW_MBWSSF_MODEM_BW,2); break; + case BW_125KHZ: lgw_reg_w(LGW_MBWSSF_MODEM_BW, 0); break; + case BW_250KHZ: lgw_reg_w(LGW_MBWSSF_MODEM_BW, 1); break; + case BW_500KHZ: lgw_reg_w(LGW_MBWSSF_MODEM_BW, 2); break; default: DEBUG_PRINTF("ERROR: UNEXPECTED VALUE %d IN SWITCH STATEMENT\n", lora_rx_bw); return LGW_HAL_ERROR; } switch(lora_rx_sf) { - case DR_LORA_SF7: lgw_reg_w(LGW_MBWSSF_RATE_SF,7); break; - case DR_LORA_SF8: lgw_reg_w(LGW_MBWSSF_RATE_SF,8); break; - case DR_LORA_SF9: lgw_reg_w(LGW_MBWSSF_RATE_SF,9); break; - case DR_LORA_SF10: lgw_reg_w(LGW_MBWSSF_RATE_SF,10); break; - case DR_LORA_SF11: lgw_reg_w(LGW_MBWSSF_RATE_SF,11); break; - case DR_LORA_SF12: lgw_reg_w(LGW_MBWSSF_RATE_SF,12); break; + case DR_LORA_SF7: lgw_reg_w(LGW_MBWSSF_RATE_SF, 7); break; + case DR_LORA_SF8: lgw_reg_w(LGW_MBWSSF_RATE_SF, 8); break; + case DR_LORA_SF9: lgw_reg_w(LGW_MBWSSF_RATE_SF, 9); break; + case DR_LORA_SF10: lgw_reg_w(LGW_MBWSSF_RATE_SF, 10); break; + case DR_LORA_SF11: lgw_reg_w(LGW_MBWSSF_RATE_SF, 11); break; + case DR_LORA_SF12: lgw_reg_w(LGW_MBWSSF_RATE_SF, 12); break; default: DEBUG_PRINTF("ERROR: UNEXPECTED VALUE %d IN SWITCH STATEMENT\n", lora_rx_sf); return LGW_HAL_ERROR; @@ -865,11 +933,11 @@ int lgw_start(void) { lgw_reg_w(LGW_FSK_REF_PATTERN_MSB, (uint32_t)(0xFFFFFFFF & (fsk_sync_word_reg >> 32))); if (if_enable[9] == true) { lgw_reg_w(LGW_FSK_RADIO_SELECT, if_rf_chain[9]); - lgw_reg_w(LGW_FSK_BR_RATIO,LGW_XTAL_FREQU/fsk_rx_dr); /* setting the dividing ratio for datarate */ - lgw_reg_w(LGW_FSK_CH_BW_EXPO,fsk_rx_bw); - lgw_reg_w(LGW_FSK_MODEM_ENABLE,1); /* default 0 */ + lgw_reg_w(LGW_FSK_BR_RATIO, LGW_XTAL_FREQU/fsk_rx_dr); /* setting the dividing ratio for datarate */ + lgw_reg_w(LGW_FSK_CH_BW_EXPO, fsk_rx_bw); + lgw_reg_w(LGW_FSK_MODEM_ENABLE, 1); /* default 0 */ } else { - lgw_reg_w(LGW_FSK_MODEM_ENABLE,0); + lgw_reg_w(LGW_FSK_MODEM_ENABLE, 0); } /* Load firmware */ @@ -877,9 +945,9 @@ int lgw_start(void) { load_firmware(MCU_AGC, agc_firmware, MCU_AGC_FW_BYTE); /* gives the AGC MCU control over radio, RF front-end and filter gain */ - lgw_reg_w(LGW_FORCE_HOST_RADIO_CTRL,0); - lgw_reg_w(LGW_FORCE_HOST_FE_CTRL,0); - lgw_reg_w(LGW_FORCE_DEC_FILTER_GAIN,0); + lgw_reg_w(LGW_FORCE_HOST_RADIO_CTRL, 0); + lgw_reg_w(LGW_FORCE_HOST_FE_CTRL, 0); + lgw_reg_w(LGW_FORCE_DEC_FILTER_GAIN, 0); /* Get MCUs out of reset */ lgw_reg_w(LGW_RADIO_SELECT, 0); /* MUST not be = to 1 or 2 at firmware init */ @@ -976,7 +1044,7 @@ int lgw_start(void) { lgw_reg_w(LGW_GPS_EN, 1); /* */ - if (lbt_enable) { + if (lbt_is_enabled() == true) { printf("INFO: Configuring LBT, this may take few seconds, please wait...\n"); wait_ms(8400); } @@ -1016,7 +1084,7 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) { } /* check input variables */ - if (max_pkt <= 0) { + if ((max_pkt <= 0) || (max_pkt > LGW_PKT_FIFO_SIZE)) { DEBUG_PRINTF("ERROR: %d = INVALID MAX NUMBER OF PACKETS TO FETCH\n", max_pkt); return LGW_HAL_ERROR; } @@ -1033,13 +1101,23 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) { /* fetch all the RX FIFO data */ lgw_reg_rb(LGW_RX_PACKET_DATA_FIFO_NUM_STORED, buff, 5); + /* 0: number of packets available in RX data buffer */ + /* 1,2: start address of the current packet in RX data buffer */ + /* 3: CRC status of the current packet */ + /* 4: size of the current packet payload in byte */ /* how many packets are in the RX buffer ? Break if zero */ if (buff[0] == 0) { break; /* no more packets to fetch, exit out of FOR loop */ } - DEBUG_PRINTF("FIFO content: %x %x %x %x %x\n",buff[0],buff[1],buff[2],buff[3],buff[4]); + /* sanity check */ + if (buff[0] > LGW_PKT_FIFO_SIZE) { + DEBUG_PRINTF("WARNING: %u = INVALID NUMBER OF PACKETS TO FETCH, ABORTING\n", buff[0]); + break; + } + + DEBUG_PRINTF("FIFO content: %x %x %x %x %x\n", buff[0], buff[1], buff[2], buff[3], buff[4]); p->size = buff[4]; sz = p->size; @@ -1053,6 +1131,10 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) { /* process metadata */ p->if_chain = buff[sz+0]; + if (p->if_chain >= LGW_IF_CHAIN_NB) { + DEBUG_PRINTF("WARNING: %u NOT A VALID IF_CHAIN NUMBER, ABORTING\n", p->if_chain); + break; + } ifmod = ifmod_config[p->if_chain]; DEBUG_PRINTF("[%d %d]\n", p->if_chain, ifmod); @@ -1162,10 +1244,18 @@ int lgw_receive(uint8_t max_pkt, struct lgw_pkt_rx_s *pkt_data) { } else if (ifmod == IF_FSK_STD) { DEBUG_MSG("Note: FSK packet\n"); switch(stat_fifo & 0x07) { - case 5: p->status = STAT_CRC_OK; break; - case 7: p->status = STAT_CRC_BAD; break; - case 1: p->status = STAT_NO_CRC; break; - default: p->status = STAT_UNDEFINED; + case 5: + p->status = STAT_CRC_OK; + break; + case 7: + p->status = STAT_CRC_BAD; + break; + case 1: + p->status = STAT_NO_CRC; + break; + default: + p->status = STAT_UNDEFINED; + break; } p->modulation = MOD_FSK; p->snr = -128.0; @@ -1557,71 +1647,69 @@ const char* lgw_version_info() { /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -uint32_t lgw_time_on_air(struct lgw_pkt_tx_s *packet, bool isBeacon) { +uint32_t lgw_time_on_air(struct lgw_pkt_tx_s *packet) { + int32_t val; uint8_t SF, H, DE; uint16_t BW; uint32_t payloadSymbNb, Tpacket; - double Tsym, Tpreamble, Tpayload; + double Tsym, Tpreamble, Tpayload, Tfsk; if (packet == NULL) { DEBUG_MSG("ERROR: Failed to compute time on air, wrong parameter\n"); return 0; } - switch (packet->bandwidth) { - case BW_125KHZ: - BW = 125; - break; - case BW_250KHZ: - BW = 250; - break; - case BW_500KHZ: - BW = 500; - break; - default: - DEBUG_PRINTF("ERROR: Cannot compute time on air for this packet, unsupported bandwidth (%u)\n", packet->bandwidth); + if (packet->modulation == MOD_LORA) { + /* Get bandwidth */ + val = lgw_bw_getval(packet->bandwidth); + if (val != -1) { + BW = (uint16_t)(val / 1E3); + } else { + DEBUG_PRINTF("ERROR: Cannot compute time on air for this packet, unsupported bandwidth (0x%02X)\n", packet->bandwidth); return 0; - } + } - switch (packet->datarate) { - case DR_LORA_SF7: - SF = 7; - break; - case DR_LORA_SF8: - SF = 8; - break; - case DR_LORA_SF9: - SF = 9; - break; - case DR_LORA_SF10: - SF = 10; - break; - case DR_LORA_SF11: - SF = 11; - break; - case DR_LORA_SF12: - SF = 12; - break; - default: - DEBUG_PRINTF("ERROR: Cannot compute time on air for this packet, unsupported datarate (%u)\n", packet->datarate); + /* Get datarate */ + val = lgw_sf_getval(packet->datarate); + if (val != -1) { + SF = (uint8_t)val; + } else { + DEBUG_PRINTF("ERROR: Cannot compute time on air for this packet, unsupported datarate (0x%02X)\n", packet->datarate); return 0; - } + } + + /* Duration of 1 symbol */ + Tsym = pow(2, SF) / BW; - /* Duration of 1 symbol */ - Tsym = pow(2, SF) / BW; + /* Duration of preamble */ + Tpreamble = (8 + 4.25) * Tsym; /* 8 programmed symbols in preamble */ - /* Duration of preamble */ - Tpreamble = (8 + 4.25) * Tsym; /* 8 programmed symbols in preamble */ + /* Duration of payload */ + H = (packet->no_header==false) ? 0 : 1; /* header is always enabled, except for beacons */ + DE = (SF >= 11) ? 1 : 0; /* Low datarate optimization enabled for SF11 and SF12 */ - /* Duration of payload */ - H = (isBeacon==false) ? 0 : 1; /* header is always enabled, except for beacons */ - DE = (SF >= 11) ? 1 : 0; /* Low datarate optimization enabled for SF11 and SF12 */ + payloadSymbNb = 8 + (ceil((double)(8*packet->size - 4*SF + 28 + 16 - 20*H) / (double)(4*(SF - 2*DE))) * (packet->coderate + 4)); /* Explicitely cast to double to keep precision of the division */ - payloadSymbNb = 8 + (ceil((double)(8*packet->size - 4*SF + 28 + 16 - 20*H) / (double)(4*(SF - 2*DE))) * (packet->coderate + 4)); /* Explicitely cast to double to keep precision of the division */ + Tpayload = payloadSymbNb * Tsym; - Tpayload = payloadSymbNb * Tsym; + /* Duration of packet */ + Tpacket = Tpreamble + Tpayload; + } else if (packet->modulation == MOD_FSK) { + /* PREAMBLE + SYNC_WORD + PKT_LEN + PKT_PAYLOAD + CRC + PREAMBLE: default 5 bytes + SYNC_WORD: default 3 bytes + PKT_LEN: 1 byte (variable length mode) + PKT_PAYLOAD: x bytes + CRC: 0 or 2 bytes + */ + Tfsk = (8 * (double)(packet->preamble + fsk_sync_word_size + 1 + packet->size + ((packet->no_crc == true) ? 0 : 2)) / (double)packet->datarate) * 1E3; - Tpacket = Tpreamble + Tpayload; + /* Duration of packet */ + Tpacket = (uint32_t)Tfsk + 1; /* add margin for rounding */ + } else { + Tpacket = 0; + DEBUG_PRINTF("ERROR: Cannot compute time on air for this packet, unsupported modulation (0x%02X)\n", packet->modulation); + } return Tpacket; } diff --git a/libloragw/src/loragw_lbt.c b/libloragw/src/loragw_lbt.c index ff726f65..2b1bcf4b 100644 --- a/libloragw/src/loragw_lbt.c +++ b/libloragw/src/loragw_lbt.c @@ -20,6 +20,7 @@ Maintainer: Michael Coracin #include /* bool type */ #include /* printf fprintf */ #include /* abs, labs, llabs */ +#include /* memset */ #include "loragw_radio.h" #include "loragw_aux.h" @@ -42,7 +43,7 @@ Maintainer: Michael Coracin #endif #define TX_START_DELAY 1500 -#define LBT_TIMESTAMP_MASK 0x007FFC00 +#define LBT_TIMESTAMP_MASK 0x007FF000 /* 11-bits timestamp */ /* -------------------------------------------------------------------------- */ /* --- PRIVATE TYPES -------------------------------------------------------- */ @@ -50,52 +51,26 @@ Maintainer: Michael Coracin /* -------------------------------------------------------------------------- */ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ -#define LBT_CHANNEL_FREQ_NB 10 /* Number of LBT channels */ -#define LBT_CHANNEL_DELTA 200000 /* frequency delta between LBT channels, in Hz */ - /* -------------------------------------------------------------------------- */ -/* --- PRIVATE VARIABLES ---------------------------------------------------- */ +/* --- SHARED VARIABLES ---------------------------------------------------- */ extern void *lgw_spi_target; /*! generic pointer to the SPI device */ extern uint8_t lgw_spi_mux_mode; /*! current SPI mux mode used */ -/* LBT variables shared with loragw_hal module */ -bool lbt_enable; -uint8_t lbt_rssi_target = 160; /* -80 dBm */ -uint8_t lbt_nb_channel = 6; -uint32_t lbt_first_channel_freq = 863000000; -uint16_t lbt_scan_time_us = 220; +/* -------------------------------------------------------------------------- */ +/* --- PRIVATE VARIABLES ---------------------------------------------------- */ -/* LBT local variables */ -static uint32_t lbt_end_tx_delay_1ch_us = 400000; -static uint32_t lbt_end_tx_delay_2ch_us = 200000; -static uint32_t lbt_channel_freq[LBT_CHANNEL_FREQ_NB]; /* absolute, in Hz */ +static bool lbt_enable; +static uint8_t lbt_nb_active_channel; +static int8_t lbt_rssi_target_dBm; +static int8_t lbt_rssi_offset_dB; +static uint32_t lbt_start_freq; +static struct lgw_conf_lbt_chan_s lbt_channel_cfg[LBT_CHANNEL_FREQ_NB]; /* -------------------------------------------------------------------------- */ /* --- PRIVATE FUNCTIONS ---------------------------------------------------- */ -/* -------------------------------------------------------------------------- */ -/* --- PRIVATE FUNCTIONS DEFINITION ----------------------------------------- */ - -/* As given frequencies have been converted from float to integer, some aliasing -issues can appear, so we can't simply check for equality, but have to take some -margin */ -bool is_equal_freq(uint32_t a, uint32_t b) { - int64_t diff; - int64_t a64 = (int64_t)a; - int64_t b64 = (int64_t)b; - - /* Calculate the difference */ - diff = llabs(a64 - b64); - - /* Check for acceptable diff range */ - if( diff <= 10000 ) - { - return true; - } - - return false; -} +bool is_equal_freq(uint32_t a, uint32_t b); /* -------------------------------------------------------------------------- */ /* --- PUBLIC FUNCTIONS DEFINITION ------------------------------------------ */ @@ -104,50 +79,40 @@ int lbt_setconf(struct lgw_conf_lbt_s * conf) { int i; /* Check input parameters */ - if (conf == NULL ) { + if (conf == NULL) { + return LGW_LBT_ERROR; + } + if ((conf->nb_channel < 1) || (conf->nb_channel > LBT_CHANNEL_FREQ_NB)) { + DEBUG_PRINTF("ERROR: Number of defined LBT channels is out of range (%u)\n", conf->nb_channel); return LGW_LBT_ERROR; } - /* set internal config according to parameters */ + /* Initialize LBT channels configuration */ + memset(lbt_channel_cfg, 0, sizeof lbt_channel_cfg); + + /* Set internal LBT config according to parameters */ lbt_enable = conf->enable; - lbt_rssi_target = conf->rssi_target; - lbt_scan_time_us = conf->scan_time_us; - lbt_nb_channel = conf->nb_channel; - lbt_end_tx_delay_1ch_us = conf->tx_delay_1ch_us; - lbt_end_tx_delay_2ch_us = conf->tx_delay_2ch_us; - lbt_first_channel_freq = conf->start_freq; - - /* set derivated parameters */ - lbt_channel_freq[0] = lbt_first_channel_freq; - for (i=1; inb_channel; + lbt_rssi_target_dBm = conf->rssi_target; + lbt_rssi_offset_dB = conf->rssi_offset; - DEBUG_MSG("Note: LBT configuration:\n"); - DEBUG_PRINTF(" lbt_enable %d\n", lbt_enable ); - DEBUG_PRINTF(" lbt_rssi_target %d\n", lbt_rssi_target ); - DEBUG_PRINTF(" lbt_scan_time_us %d\n", lbt_scan_time_us ); - DEBUG_PRINTF(" lbt_nb_channel %d\n", lbt_nb_channel ); - DEBUG_PRINTF(" lbt_end_tx_delay_1ch_us %d\n", lbt_end_tx_delay_1ch_us ); - DEBUG_PRINTF(" lbt_end_tx_delay_2ch_us %d\n", lbt_end_tx_delay_2ch_us); - DEBUG_PRINTF(" lbt_first_channel_freq %d\n", lbt_first_channel_freq); + for (i=0; ichannels[i].freq_hz; + lbt_channel_cfg[i].scan_time_us = conf->channels[i].scan_time_us; + } return LGW_LBT_SUCCESS; } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int lbt_setup(uint32_t rf_freq, uint8_t rssi_target, uint16_t scan_time_us, uint8_t nb_channel) { - int x; +int lbt_setup(void) { + int x, i; int32_t val; - uint8_t spi_speed_div = 31; - uint16_t t_spi_us = 16*2*(spi_speed_div+1)/32 + 2; - uint8_t nb_point_calc = scan_time_us/t_spi_us - 1; - uint8_t pll_lock_time = 50; - uint16_t lsb_start_freq_int; + uint32_t freq_offset; /* Check if LBT feature is supported by FPGA */ - x = lgw_fpga_reg_r(LGW_FPGA_FPGA_FEATURE, &val); + x = lgw_fpga_reg_r(LGW_FPGA_FEATURE, &val); if (x != LGW_REG_SUCCESS) { DEBUG_MSG("ERROR: Failed to read FPGA Features register\n"); return LGW_LBT_ERROR; @@ -157,25 +122,79 @@ int lbt_setup(uint32_t rf_freq, uint8_t rssi_target, uint16_t scan_time_us, uint return LGW_LBT_ERROR; } + /* Get FPGA lowest frequency for LBT channels */ + x = lgw_fpga_reg_r(LGW_FPGA_LBT_INITIAL_FREQ, &val); + if (x != LGW_REG_SUCCESS) { + DEBUG_MSG("ERROR: Failed to read LBT initial frequency from FPGA\n"); + return LGW_LBT_ERROR; + } + switch(val) { + case 0: + lbt_start_freq = 915000000; + break; + case 1: + lbt_start_freq = 863000000; + break; + default: + DEBUG_PRINTF("ERROR: LBT start frequency %d is not supported\n", val); + return LGW_LBT_ERROR; + } + /* Configure SX127x for FSK */ - x = lgw_setup_sx127x(rf_freq, MOD_FSK); + x = lgw_setup_sx127x(lbt_start_freq, MOD_FSK, LGW_SX127X_RXBW_100K_HZ, lbt_rssi_offset_dB); /* 200KHz LBT channels */ if (x != LGW_REG_SUCCESS) { DEBUG_MSG("ERROR: Failed to configure SX127x for LBT\n"); return LGW_LBT_ERROR; } /* Configure FPGA for LBT */ - x = lgw_fpga_reg_w(LGW_FPGA_SPI_MASTER_SPEED_DIVIDER, (int32_t)spi_speed_div); - x |= lgw_fpga_reg_w(LGW_FPGA_NB_READ_RSSI, (int32_t)nb_point_calc); - x |= lgw_fpga_reg_w(LGW_FPGA_PLL_LOCK_TIME, (int32_t)pll_lock_time); - x |= lgw_fpga_reg_w(LGW_FPGA_RSSI_TARGET, (int32_t)rssi_target); - lsb_start_freq_int = (((uint64_t)rf_freq<<19)/(uint64_t)32000000); - x |= lgw_fpga_reg_w(LGW_FPGA_LSB_START_FREQ, (int32_t)lsb_start_freq_int); - x |= lgw_fpga_reg_w(LGW_FPGA_LBT_TIMESTAMP_NB_CH, (int32_t)(nb_channel-1)); + val = -2*lbt_rssi_target_dBm; /* Convert RSSI target in dBm to FPGA register format */ + x = lgw_fpga_reg_w(LGW_FPGA_RSSI_TARGET, val); if (x != LGW_REG_SUCCESS) { DEBUG_MSG("ERROR: Failed to configure FPGA for LBT\n"); return LGW_LBT_ERROR; } + /* Set default values for non-active LBT channels */ + for (i=lbt_nb_active_channel; itx_mode) { - case IMMEDIATE: - DEBUG_MSG("tx_mode = IMMEDIATE\n"); - tx_start_time = (fpga_time + TX_START_DELAY) & LBT_TIMESTAMP_MASK; /* 0x007FFC00: to align on LBT time format (TIMESTAMP_CH) */ - break; case TIMESTAMPED: DEBUG_MSG("tx_mode = TIMESTAMPED\n"); tx_start_time = pkt_data->count_us & LBT_TIMESTAMP_MASK; @@ -247,52 +258,60 @@ int lbt_is_channel_free(struct lgw_pkt_tx_s * pkt_data, bool * tx_allowed) { DEBUG_MSG("tx_mode = ON_GPS\n"); tx_start_time = (sx1301_time + TX_START_DELAY + 1000000) & LBT_TIMESTAMP_MASK; break; + case IMMEDIATE: + DEBUG_MSG("ERROR: tx_mode IMMEDIATE is not supported when LBT is enabled\n"); + /* FALLTHROUGH */ default: return LGW_LBT_ERROR; } /* Select LBT Channel corresponding to required TX frequency */ + lbt_channel_decod_1 = -1; + lbt_channel_decod_2 = -1; if (pkt_data->bandwidth == BW_125KHZ){ - tx_max_time = lbt_end_tx_delay_1ch_us; - lbt_channel_decod_1 = -1; - lbt_channel_decod_2 = -1; - for (i=0; ifreq_hz, lbt_channel_freq[i]) == true) { - DEBUG_PRINTF("LBT: select channel %d (%u Hz)\n", i, lbt_channel_freq[i]); + for (i=0; ifreq_hz, lbt_channel_cfg[i].freq_hz) == true) { + DEBUG_PRINTF("LBT: select channel %d (%u Hz)\n", i, lbt_channel_cfg[i].freq_hz); lbt_channel_decod_1 = i; lbt_channel_decod_2 = i; + if (lbt_channel_cfg[i].scan_time_us == 5000) { + tx_max_time = 4000000; /* 4 seconds */ + } else { /* scan_time_us = 128 */ + tx_max_time = 400000; /* 400 milliseconds */ + } break; } } } else if (pkt_data->bandwidth == BW_250KHZ) { - tx_max_time = lbt_end_tx_delay_2ch_us; - - /* In case of 250KHz, the TX freq has to be in between 2 channels of 200KHz BW. The TX can only be over 2 channels, not more */ - lbt_channel_decod_1 = -1; - lbt_channel_decod_2 = -1; - for (i=0; i<(LBT_CHANNEL_FREQ_NB-1); i++) { - if (is_equal_freq(pkt_data->freq_hz, (lbt_channel_freq[i]+lbt_channel_freq[i+1])/2) == true) { - DEBUG_PRINTF("LBT: select channels %d,%d (%u Hz)\n", i, i+1, (lbt_channel_freq[i]+lbt_channel_freq[i+1])/2); + /* In case of 250KHz, the TX freq has to be in between 2 consecutive channels of 200KHz BW. + The TX can only be over 2 channels, not more */ + for (i=0; i<(lbt_nb_active_channel-1); i++) { + if ((is_equal_freq(pkt_data->freq_hz, (lbt_channel_cfg[i].freq_hz+lbt_channel_cfg[i+1].freq_hz)/2) == true) && ((lbt_channel_cfg[i+1].freq_hz-lbt_channel_cfg[i].freq_hz)==200E3)) { + DEBUG_PRINTF("LBT: select channels %d,%d (%u Hz)\n", i, i+1, (lbt_channel_cfg[i].freq_hz+lbt_channel_cfg[i+1].freq_hz)/2); lbt_channel_decod_1 = i; lbt_channel_decod_2 = i+1; + if (lbt_channel_cfg[i].scan_time_us == 5000) { + tx_max_time = 4000000; /* 4 seconds */ + } else { /* scan_time_us = 128 */ + tx_max_time = 200000; /* 200 milliseconds */ + } break; } } } else { - lbt_channel_decod_1 = -1; - lbt_channel_decod_2 = -1; + /* Nothing to do for now */ } /* Get last time when selected channel was free */ if ((lbt_channel_decod_1 >= 0) && (lbt_channel_decod_2 >= 0)) { lgw_fpga_reg_w(LGW_FPGA_LBT_TIMESTAMP_SELECT_CH, (int32_t)lbt_channel_decod_1); lgw_fpga_reg_r(LGW_FPGA_LBT_TIMESTAMP_CH, &val); - lbt_time = lbt_time1 = (uint32_t)(val & 0x00FFFFFF) * 256; /* 24bits (1LSB = 256µs) */ + lbt_time = lbt_time1 = (uint32_t)(val & 0x0000FFFF) * 256; /* 16bits (1LSB = 256µs) */ if (lbt_channel_decod_1 != lbt_channel_decod_2 ) { lgw_fpga_reg_w(LGW_FPGA_LBT_TIMESTAMP_SELECT_CH, (int32_t)lbt_channel_decod_2); lgw_fpga_reg_r(LGW_FPGA_LBT_TIMESTAMP_CH, &val); - lbt_time2 = (uint32_t)(val & 0x00FFFFFF) * 256; /* 24bits (1LSB = 256µs) */ + lbt_time2 = (uint32_t)(val & 0x0000FFFF) * 256; /* 16bits (1LSB = 256µs) */ if (lbt_time2 < lbt_time1) { lbt_time = lbt_time2; @@ -302,7 +321,7 @@ int lbt_is_channel_free(struct lgw_pkt_tx_s * pkt_data, bool * tx_allowed) { lbt_time = 0; } - packet_duration = lgw_time_on_air(pkt_data, pkt_data->no_header) * 1000UL; + packet_duration = lgw_time_on_air(pkt_data) * 1000UL; tx_end_time = (tx_start_time + packet_duration) & LBT_TIMESTAMP_MASK; if (lbt_time < tx_end_time) { delta_time = tx_end_time - lbt_time; @@ -313,7 +332,6 @@ int lbt_is_channel_free(struct lgw_pkt_tx_s * pkt_data, bool * tx_allowed) { } DEBUG_PRINTF("sx1301_time = %u\n", sx1301_time & LBT_TIMESTAMP_MASK); - DEBUG_PRINTF("fpga_time = %u\n", fpga_time & LBT_TIMESTAMP_MASK); DEBUG_PRINTF("tx_freq = %u\n", pkt_data->freq_hz); DEBUG_MSG("------------------------------------------------\n"); DEBUG_PRINTF("packet_duration = %u\n", packet_duration); @@ -328,7 +346,7 @@ int lbt_is_channel_free(struct lgw_pkt_tx_s * pkt_data, bool * tx_allowed) { /* lbt_time: last time when channel was free */ /* tx_max_time: maximum time allowed to send packet since last free time */ /* 2048: some margin */ - if (((delta_time < (tx_max_time - 2048)) && (lbt_time != 0)) || (lbt_enable == false)) { + if ((delta_time < (tx_max_time - 2048)) && (lbt_time != 0)) { *tx_allowed = true; } else { DEBUG_MSG("ERROR: TX request rejected (LBT)\n"); @@ -342,4 +360,33 @@ int lbt_is_channel_free(struct lgw_pkt_tx_s * pkt_data, bool * tx_allowed) { return LGW_LBT_SUCCESS; } +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +bool lbt_is_enabled(void) { + return lbt_enable; +} + +/* -------------------------------------------------------------------------- */ +/* --- PRIVATE FUNCTIONS DEFINITION ----------------------------------------- */ + +/* As given frequencies have been converted from float to integer, some aliasing +issues can appear, so we can't simply check for equality, but have to take some +margin */ +bool is_equal_freq(uint32_t a, uint32_t b) { + int64_t diff; + int64_t a64 = (int64_t)a; + int64_t b64 = (int64_t)b; + + /* Calculate the difference */ + diff = llabs(a64 - b64); + + /* Check for acceptable diff range */ + if( diff <= 10000 ) + { + return true; + } + + return false; +} + /* --- EOF ------------------------------------------------------------------ */ diff --git a/libloragw/src/loragw_radio.c b/libloragw/src/loragw_radio.c index 90e4cfa9..b3046a9d 100644 --- a/libloragw/src/loragw_radio.c +++ b/libloragw/src/loragw_radio.c @@ -49,6 +49,16 @@ Maintainer: Michael Coracin /* -------------------------------------------------------------------------- */ /* --- PRIVATE TYPES -------------------------------------------------------- */ +/** +@struct lgw_radio_FSK_bandwidth_s +@brief Associate a bandwidth in kHz with its corresponding register values +*/ +struct lgw_sx127x_FSK_bandwidth_s { + uint32_t RxBwKHz; + uint8_t RxBwMant; + uint8_t RxBwExp; +}; + /** @struct lgw_radio_type_version_s @brief Associate a radio type with its corresponding expected version value @@ -64,6 +74,31 @@ struct lgw_radio_type_version_s { #define PLL_LOCK_MAX_ATTEMPTS 5 +const struct lgw_sx127x_FSK_bandwidth_s sx127x_FskBandwidths[] = +{ + { 2600 , 2, 7 }, /* LGW_SX127X_RXBW_2K6_HZ */ + { 3100 , 1, 7 }, /* LGW_SX127X_RXBW_3K1_HZ */ + { 3900 , 0, 7 }, /* ... */ + { 5200 , 2, 6 }, + { 6300 , 1, 6 }, + { 7800 , 0, 6 }, + { 10400 , 2, 5 }, + { 12500 , 1, 5 }, + { 15600 , 0, 5 }, + { 20800 , 2, 4 }, + { 25000 , 1, 4 }, /* ... */ + { 31300 , 0, 4 }, + { 41700 , 2, 3 }, + { 50000 , 1, 3 }, + { 62500 , 0, 3 }, + { 83333 , 2, 2 }, + { 100000, 1, 2 }, + { 125000, 0, 2 }, + { 166700, 2, 1 }, + { 200000, 1, 1 }, /* ... */ + { 250000, 0, 1 } /* LGW_SX127X_RXBW_250K_HZ */ +}; + /* -------------------------------------------------------------------------- */ /* --- PRIVATE VARIABLES ---------------------------------------------------- */ @@ -73,14 +108,10 @@ extern void *lgw_spi_target; /*! generic pointer to the SPI device */ /* --- PRIVATE FUNCTIONS ---------------------------------------------------- */ void sx125x_write(uint8_t channel, uint8_t addr, uint8_t data); - uint8_t sx125x_read(uint8_t channel, uint8_t addr); -int setup_sx1272_FSK(uint32_t frequency); - -int setup_sx1272_LoRa(uint32_t frequency); - -int setup_sx1276_FSK(uint32_t frequency); +int setup_sx1272_FSK(uint32_t frequency, enum lgw_sx127x_rxbw_e rxbw_khz, int8_t rssi_offset); +int setup_sx1276_FSK(uint32_t frequency, enum lgw_sx127x_rxbw_e rxbw_khz, int8_t rssi_offset); int reset_sx127x(enum lgw_radio_type_e radio_type); @@ -179,7 +210,7 @@ uint8_t sx125x_read(uint8_t channel, uint8_t addr) { /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int setup_sx1272_FSK(uint32_t frequency) { +int setup_sx1272_FSK(uint32_t frequency, enum lgw_sx127x_rxbw_e rxbw_khz, int8_t rssi_offset) { uint64_t freq_reg; uint8_t ModulationShaping = 0; uint8_t PllHop = 1; @@ -190,10 +221,10 @@ int setup_sx1272_FSK(uint32_t frequency) { uint8_t AdcLowPwr = 0; uint8_t AdcTrim = 6; uint8_t AdcTest = 0; - uint8_t RxBwExp = 2; - uint8_t RxBwMant = 1; + uint8_t RxBwExp = sx127x_FskBandwidths[rxbw_khz].RxBwExp; + uint8_t RxBwMant = sx127x_FskBandwidths[rxbw_khz].RxBwMant; uint8_t RssiSmoothing = 5; - uint8_t RssiOffset = 3; + uint8_t RssiOffsetReg; uint8_t reg_val; int x; @@ -225,8 +256,9 @@ int setup_sx1272_FSK(uint32_t frequency) { /* Config continues... */ x |= lgw_sx127x_reg_w(SX1272_REG_RXCONFIG, 0); /* Disable AGC */ - x |= lgw_sx127x_reg_w(SX1272_REG_RSSICONFIG, RssiSmoothing | (RssiOffset << 3)); /* Set RSSI smoothing to 64 samples, RSSI offset 3dB */ - x |= lgw_sx127x_reg_w(SX1272_REG_RXBW, RxBwExp | (RxBwMant << 3)); /* RX BW = 100kHz, Mant=20, Exp=2 */ + RssiOffsetReg = (rssi_offset >= 0) ? (uint8_t)rssi_offset : (uint8_t)(~(-rssi_offset)+1); /* 2's complement */ + x |= lgw_sx127x_reg_w(SX1272_REG_RSSICONFIG, RssiSmoothing | (RssiOffsetReg << 3)); /* Set RSSI smoothing to 64 samples, RSSI offset to given value */ + x |= lgw_sx127x_reg_w(SX1272_REG_RXBW, RxBwExp | (RxBwMant << 3)); x |= lgw_sx127x_reg_w(SX1272_REG_RXDELAY, 2); x |= lgw_sx127x_reg_w(SX1272_REG_PLL, 0x10); /* PLL BW set to 75 KHz */ x |= lgw_sx127x_reg_w(0x47, 1); /* optimize PLL start-up time */ @@ -247,75 +279,14 @@ int setup_sx1272_FSK(uint32_t frequency) { } wait_ms(500); - DEBUG_MSG("INFO: Successfully configured SX1272 for FSK modulation\n"); - - return LGW_REG_SUCCESS; -} - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -int setup_sx1272_LoRa(uint32_t frequency) { - uint64_t freq_reg; - uint8_t LoRaMode = 1; - uint8_t bw = 0; - uint8_t LowZin = 1; - uint8_t sf = 7; - uint8_t AgcAuto = 1; - uint8_t LnaGain = 1; - uint8_t TrimRxCrFo = 0; - uint8_t LnaBoost = 3; - uint8_t AdcBwAuto = 0; - uint8_t AdcBw = 7; - uint8_t AdcLowPwr = 0; - uint8_t AdcTrim = 6; - uint8_t AdcTest = 0; - uint8_t reg_val; - int x; - - /* Set in LoRa mode */ - x = lgw_sx127x_reg_w(SX1272_REG_LR_OPMODE, 0); - wait_ms(100); - x |= lgw_sx127x_reg_w(SX1272_REG_LR_OPMODE, 0 | (LoRaMode << 7)); /* Sleep mode, LoRa Mode */ - wait_ms(100); - x |= lgw_sx127x_reg_w(SX1272_REG_LR_OPMODE, 1 | (LoRaMode << 7)); /* Standby mode, LoRa Mode */ - wait_ms(100); - - /* Set RF carrier frequency */ - freq_reg = ((uint64_t)frequency << 19) / (uint64_t)32000000; - x |= lgw_sx127x_reg_w(SX1272_REG_LR_FRFMSB, (freq_reg >> 16) & 0xFF); - x |= lgw_sx127x_reg_w(SX1272_REG_LR_FRFMID, (freq_reg >> 8) & 0xFF); - x |= lgw_sx127x_reg_w(SX1272_REG_LR_FRFLSB, freq_reg & 0xFF); - - /* Config */ - x |= lgw_sx127x_reg_w(SX1272_REG_LR_MODEMCONFIG1, bw << 6); /* 125 KHz */ - x |= lgw_sx127x_reg_w(0x50, LowZin); - x |= lgw_sx127x_reg_w(SX1272_REG_LR_MODEMCONFIG2, (sf << 4) | (AgcAuto << 2)); - x |= lgw_sx127x_reg_w(SX1272_REG_LR_LNA, LnaBoost | (TrimRxCrFo << 3) | (LnaGain << 5)); - x |= lgw_sx127x_reg_w(0x68, AdcBw | (AdcBwAuto << 3)); - x |= lgw_sx127x_reg_w(0x69, AdcTest | (AdcTrim << 4) | (AdcLowPwr << 7)); - - if (x != LGW_REG_SUCCESS) { - DEBUG_MSG("ERROR: Failed to configure SX1272\n"); - return x; - } - - /* Set in Rx continuous mode */ - x = lgw_sx127x_reg_w(SX1272_REG_LR_OPMODE, 5 | (LoRaMode << 7)); /* Receiver mode, LoRa Mode */ - wait_ms(100); - x |= lgw_sx127x_reg_r(SX1272_REG_LR_OPMODE, ®_val); - if ((reg_val != (5 | (LoRaMode << 7))) || (x != LGW_REG_SUCCESS)) { - DEBUG_MSG("ERROR: SX1272 failed to enter RX continuous mode\n"); - return x; - } - - DEBUG_MSG("INFO: Successfully configured SX1272 for LoRa modulation\n"); + DEBUG_PRINTF("INFO: Successfully configured SX1272 for FSK modulation (rxbw=%d)\n", rxbw_khz); return LGW_REG_SUCCESS; } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int setup_sx1276_FSK(uint32_t frequency) { +int setup_sx1276_FSK(uint32_t frequency, enum lgw_sx127x_rxbw_e rxbw_khz, int8_t rssi_offset) { uint64_t freq_reg; uint8_t ModulationShaping = 0; uint8_t PllHop = 1; @@ -326,10 +297,10 @@ int setup_sx1276_FSK(uint32_t frequency) { uint8_t AdcLowPwr = 0; uint8_t AdcTrim = 6; uint8_t AdcTest = 0; - uint8_t RxBwExp = 2; - uint8_t RxBwMant = 1; + uint8_t RxBwExp = sx127x_FskBandwidths[rxbw_khz].RxBwExp; + uint8_t RxBwMant = sx127x_FskBandwidths[rxbw_khz].RxBwMant; uint8_t RssiSmoothing = 5; - uint8_t RssiOffset = 3; + uint8_t RssiOffsetReg; uint8_t reg_val; int x; @@ -361,8 +332,9 @@ int setup_sx1276_FSK(uint32_t frequency) { /* Config continues... */ x |= lgw_sx127x_reg_w(SX1276_REG_RXCONFIG, 0); /* Disable AGC */ - x |= lgw_sx127x_reg_w(SX1276_REG_RSSICONFIG, RssiSmoothing | (RssiOffset << 3)); /* Set RSSI smoothing to 64 samples, RSSI offset 3dB */ - x |= lgw_sx127x_reg_w(SX1276_REG_RXBW, RxBwExp | (RxBwMant << 3)); /* RX BW = 100kHz, Mant=20, Exp=2 */ + RssiOffsetReg = (rssi_offset >= 0) ? (uint8_t)rssi_offset : (uint8_t)(~(-rssi_offset)+1); /* 2's complement */ + x |= lgw_sx127x_reg_w(SX1276_REG_RSSICONFIG, RssiSmoothing | (RssiOffsetReg << 3)); /* Set RSSI smoothing to 64 samples, RSSI offset 3dB */ + x |= lgw_sx127x_reg_w(SX1276_REG_RXBW, RxBwExp | (RxBwMant << 3)); x |= lgw_sx127x_reg_w(SX1276_REG_RXDELAY, 2); x |= lgw_sx127x_reg_w(SX1276_REG_PLL, 0x10); /* PLL BW set to 75 KHz */ x |= lgw_sx127x_reg_w(0x43, 1); /* optimize PLL start-up time */ @@ -383,73 +355,13 @@ int setup_sx1276_FSK(uint32_t frequency) { } wait_ms(500); - DEBUG_MSG("INFO: Successfully configured SX1276 for FSK modulation\n"); + DEBUG_PRINTF("INFO: Successfully configured SX1276 for FSK modulation (rxbw=%d)\n", rxbw_khz); return LGW_REG_SUCCESS; } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int setup_sx1276_LoRa(uint32_t frequency) { - uint64_t freq_reg; - uint8_t LoRaMode = 1; - uint8_t bw = 7; - uint8_t codingRate = 1; - uint8_t LowZin = 1; - uint8_t sf = 7; - uint8_t AgcAuto = 1; - uint8_t LnaGain = 1; - uint8_t LnaBoost = 3; - uint8_t AdcBwAuto = 0; - uint8_t AdcBw = 7; - uint8_t AdcLowPwr = 0; - uint8_t AdcTrim = 6; - uint8_t AdcTest = 0; - uint8_t reg_val; - int x; - - /* Set in LoRa mode */ - x = lgw_sx127x_reg_w(SX1276_REG_LR_OPMODE, 0); - wait_ms(100); - x |= lgw_sx127x_reg_w(SX1276_REG_LR_OPMODE, 0 | (LoRaMode << 7)); /* Sleep mode, LoRa Mode */ - wait_ms(100); - x |= lgw_sx127x_reg_w(SX1276_REG_LR_OPMODE, 1 | (LoRaMode << 7)); /* Standby mode, LoRa Mode */ - wait_ms(100); - - /* Set RF carrier frequency */ - freq_reg = ((uint64_t)frequency << 19) / (uint64_t)32000000; - x |= lgw_sx127x_reg_w(SX1276_REG_LR_FRFMSB, (freq_reg >> 16) & 0xFF); - x |= lgw_sx127x_reg_w(SX1276_REG_LR_FRFMID, (freq_reg >> 8) & 0xFF); - x |= lgw_sx127x_reg_w(SX1276_REG_LR_FRFLSB, freq_reg & 0xFF); - - /* Config */ - x |= lgw_sx127x_reg_w(SX1276_REG_LR_MODEMCONFIG1, 0 | (codingRate << 1) | (bw << 4)); /* 125 KHz, 4/5 */ - x |= lgw_sx127x_reg_w(0x69, LowZin); - x |= lgw_sx127x_reg_w(SX1276_REG_LR_MODEMCONFIG2, sf << 4); - x |= lgw_sx127x_reg_w(SX1276_REG_LR_MODEMCONFIG3, AgcAuto << 2); - x |= lgw_sx127x_reg_w(SX1276_REG_LR_LNA, LnaBoost | (LnaGain << 5)); - x |= lgw_sx127x_reg_w(0x57, AdcBw | (AdcBwAuto << 3)); - x |= lgw_sx127x_reg_w(0x57, AdcTest | (AdcTrim << 4) | (AdcLowPwr << 7)); - - if (x != LGW_REG_SUCCESS) { - DEBUG_MSG("ERROR: Failed to configure SX1276\n"); - return x; - } - - /* Set in Rx continuous mode */ - x = lgw_sx127x_reg_w(SX1276_REG_LR_OPMODE, 5 | (LoRaMode << 7)); /* Receiver mode, LoRa Mode */ - wait_ms(100); - x |= lgw_sx127x_reg_r(SX1276_REG_LR_OPMODE, ®_val); - if ((reg_val != (5 | (LoRaMode << 7))) || (x != LGW_REG_SUCCESS)) { - DEBUG_MSG("ERROR: SX1276 failed to enter RX continuous mode\n"); - return x; - } - - DEBUG_MSG("INFO: Successfully configured SX1276 for LoRa modulation\n"); - - return LGW_REG_SUCCESS; -} - int reset_sx127x(enum lgw_radio_type_e radio_type) { int x; @@ -481,7 +393,7 @@ int reset_sx127x(enum lgw_radio_type_e radio_type) { /* -------------------------------------------------------------------------- */ /* --- PUBLIC FUNCTIONS DEFINITION ------------------------------------------ */ -int setup_sx125x(uint8_t rf_chain, uint8_t rf_clkout, bool rf_enable, uint8_t rf_radio_type, uint32_t freq_hz) { +int lgw_setup_sx125x(uint8_t rf_chain, uint8_t rf_clkout, bool rf_enable, uint8_t rf_radio_type, uint32_t freq_hz) { uint32_t part_int = 0; uint32_t part_frac = 0; int cpt_attempts = 0; @@ -578,7 +490,7 @@ int lgw_sx127x_reg_r(uint8_t address, uint8_t *reg_value) { /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int lgw_setup_sx127x(uint32_t frequency, uint8_t modulation) { +int lgw_setup_sx127x(uint32_t frequency, uint8_t modulation, enum lgw_sx127x_rxbw_e rxbw_khz, int8_t rssi_offset) { int x, i; uint8_t version; enum lgw_radio_type_e radio_type = LGW_RADIO_TYPE_NONE; @@ -588,10 +500,14 @@ int lgw_setup_sx127x(uint32_t frequency, uint8_t modulation) { }; /* Check parameters */ - if ((modulation != MOD_FSK) && (modulation != MOD_LORA)) { + if (modulation != MOD_FSK) { DEBUG_PRINTF("ERROR: modulation not supported for SX127x (%u)\n", modulation); return LGW_REG_ERROR; } + if (rxbw_khz > LGW_SX127X_RXBW_250K_HZ) { + DEBUG_PRINTF("ERROR: RX bandwidth not supported for SX127x (%u)\n", rxbw_khz); + return LGW_REG_ERROR; + } /* Probing radio type */ for (i = 0; i < (int)(sizeof supported_radio_type); i++) { @@ -624,18 +540,11 @@ int lgw_setup_sx127x(uint32_t frequency, uint8_t modulation) { /* Setup the radio */ switch (modulation) { - case MOD_LORA: - if (radio_type == LGW_RADIO_TYPE_SX1272) { - x = setup_sx1272_LoRa(frequency); - } else { - x = setup_sx1276_LoRa(frequency); - } - break; case MOD_FSK: if (radio_type == LGW_RADIO_TYPE_SX1272) { - x = setup_sx1272_FSK(frequency); + x = setup_sx1272_FSK(frequency, rxbw_khz, rssi_offset); } else { - x = setup_sx1276_FSK(frequency); + x = setup_sx1276_FSK(frequency, rxbw_khz, rssi_offset); } break; default: diff --git a/libloragw/src/loragw_reg.c b/libloragw/src/loragw_reg.c index 7fe0f67f..7e396bc9 100644 --- a/libloragw/src/loragw_reg.c +++ b/libloragw/src/loragw_reg.c @@ -48,7 +48,7 @@ Maintainer: Sylvain Miermont #define PAGE_ADDR 0x00 #define PAGE_MASK 0x03 -const uint8_t FPGA_VERSION[] = { 27 }; /* several versions could be supported */ +const uint8_t FPGA_VERSION[] = { 31, 33 }; /* several versions could be supported */ /* auto generated register mapping for C code : 11-Jul-2013 13:20:40 @@ -497,14 +497,17 @@ int reg_r_align32(void *spi_target, uint8_t spi_mux_mode, uint8_t spi_mux_target /* --- PUBLIC FUNCTIONS DEFINITION ------------------------------------------ */ /* Concentrator connect */ -int lgw_connect(void) { +int lgw_connect(bool spi_only, uint32_t tx_notch_freq) { int spi_stat = LGW_SPI_SUCCESS; uint8_t u = 0; + int x; + /* check SPI link status */ if (lgw_spi_target != NULL) { DEBUG_MSG("WARNING: concentrator was already connected\n"); lgw_spi_close(lgw_spi_target); } + /* open the SPI link */ spi_stat = lgw_spi_open(&lgw_spi_target); if (spi_stat != LGW_SPI_SUCCESS) { @@ -512,41 +515,51 @@ int lgw_connect(void) { return LGW_REG_ERROR; } - /* Detect if the gateway has an FPGA with SPI mux header support */ - /* First, we assume there is an FPGA, and try to read its version */ - spi_stat = lgw_spi_r(lgw_spi_target, LGW_SPI_MUX_MODE1, LGW_SPI_MUX_TARGET_FPGA, loregs[LGW_VERSION].addr, &u); - if (spi_stat != LGW_SPI_SUCCESS) { - DEBUG_MSG("ERROR READING VERSION REGISTER\n"); - return LGW_REG_ERROR; - } - if (check_fpga_version(u) != true) { - /* We failed to read expected FPGA version, so let's assume there is no FPGA */ - DEBUG_PRINTF("INFO: no FPGA detected or version not supported (v%u)\n", u); - lgw_spi_mux_mode = LGW_SPI_MUX_MODE0; - } else { - DEBUG_PRINTF("INFO: detected FPGA with SPI mux header (v%u)\n", u); - lgw_spi_mux_mode = LGW_SPI_MUX_MODE1; - /* FPGA Soft Reset */ - lgw_spi_w(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_FPGA, 0, 1); - lgw_spi_w(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_FPGA, 0, 0); - /* FPGA configure */ - lgw_fpga_configure(); - } + if (spi_only == false ) { + /* Detect if the gateway has an FPGA with SPI mux header support */ + /* First, we assume there is an FPGA, and try to read its version */ + spi_stat = lgw_spi_r(lgw_spi_target, LGW_SPI_MUX_MODE1, LGW_SPI_MUX_TARGET_FPGA, loregs[LGW_VERSION].addr, &u); + if (spi_stat != LGW_SPI_SUCCESS) { + DEBUG_MSG("ERROR READING VERSION REGISTER\n"); + return LGW_REG_ERROR; + } + if (check_fpga_version(u) != true) { + /* We failed to read expected FPGA version, so let's assume there is no FPGA */ + DEBUG_PRINTF("INFO: no FPGA detected or version not supported (v%u)\n", u); + lgw_spi_mux_mode = LGW_SPI_MUX_MODE0; + } else { + DEBUG_PRINTF("INFO: detected FPGA with SPI mux header (v%u)\n", u); + lgw_spi_mux_mode = LGW_SPI_MUX_MODE1; + /* FPGA Soft Reset */ + lgw_spi_w(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_FPGA, 0, 1); + lgw_spi_w(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_FPGA, 0, 0); + /* FPGA configure */ + x = lgw_fpga_configure(tx_notch_freq); + if (x != LGW_REG_SUCCESS) { + DEBUG_MSG("ERROR CONFIGURING FPGA\n"); + return LGW_REG_ERROR; + } + } - /* check SX1301 version */ - spi_stat |= lgw_spi_r(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_SX1301, loregs[LGW_VERSION].addr, &u); - if (u != loregs[LGW_VERSION].dflt) { - DEBUG_PRINTF("ERROR: NOT EXPECTED CHIP VERSION (v%u)\n", u); - return LGW_REG_ERROR; - } + /* check SX1301 version */ + spi_stat = lgw_spi_r(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_SX1301, loregs[LGW_VERSION].addr, &u); + if (spi_stat != LGW_SPI_SUCCESS) { + DEBUG_MSG("ERROR READING CHIP VERSION REGISTER\n"); + return LGW_REG_ERROR; + } + if (u != loregs[LGW_VERSION].dflt) { + DEBUG_PRINTF("ERROR: NOT EXPECTED CHIP VERSION (v%u)\n", u); + return LGW_REG_ERROR; + } - /* write 0 to the page/reset register */ - spi_stat = lgw_spi_w(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_SX1301, loregs[LGW_PAGE_REG].addr, 0); - if (spi_stat != LGW_SPI_SUCCESS) { - DEBUG_MSG("ERROR WRITING PAGE REGISTER\n"); - return LGW_REG_ERROR; - } else { - lgw_regpage = 0; + /* write 0 to the page/reset register */ + spi_stat = lgw_spi_w(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_SX1301, loregs[LGW_PAGE_REG].addr, 0); + if (spi_stat != LGW_SPI_SUCCESS) { + DEBUG_MSG("ERROR WRITING PAGE REGISTER\n"); + return LGW_REG_ERROR; + } else { + lgw_regpage = 0; + } } DEBUG_MSG("Note: success connecting the concentrator\n"); diff --git a/libloragw/tst/test_loragw_cal.c b/libloragw/tst/test_loragw_cal.c index 5853bb46..533d1891 100644 --- a/libloragw/tst/test_loragw_cal.c +++ b/libloragw/tst/test_loragw_cal.c @@ -45,14 +45,15 @@ Maintainer: Sylvain Miermont /* -------------------------------------------------------------------------- */ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ -#define DEFAULT_RSSI_OFFSET 0.0 -#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 +#define DEFAULT_TX_NOTCH_FREQ 129E3 +#define DEFAULT_RSSI_OFFSET 0.0 +#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 ---------------------------------------------------- */ @@ -262,7 +263,7 @@ int main(int argc, char **argv) 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(); + x = lgw_connect(false, DEFAULT_TX_NOTCH_FREQ); if (x == -1) { printf("ERROR: FAIL TO CONNECT BOARD\n"); return -1; @@ -283,8 +284,8 @@ int main(int argc, char **argv) lgw_reg_w(LGW_RADIO_RST,0); /* setup the radios */ - setup_sx125x(0, clocksource, true, radio_type, fa); - setup_sx125x(1, clocksource, false, radio_type, fb); + lgw_setup_sx125x(0, clocksource, true, radio_type, fa); + lgw_setup_sx125x(1, clocksource, false, radio_type, fb); /* Set GPIO 4 high for calibration */ lgw_reg_w(LGW_GPIO_MODE,31); /* Set all GPIOs as output */ diff --git a/libloragw/tst/test_loragw_hal.c b/libloragw/tst/test_loragw_hal.c index 2f337d55..e2fee5eb 100644 --- a/libloragw/tst/test_loragw_hal.c +++ b/libloragw/tst/test_loragw_hal.c @@ -44,6 +44,7 @@ Maintainer: Sylvain Miermont /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ #define DEFAULT_RSSI_OFFSET 0.0 +#define DEFAULT_NOTCH_FREQ 129000U /* -------------------------------------------------------------------------- */ /* --- PRIVATE VARIABLES ---------------------------------------------------- */ @@ -195,6 +196,7 @@ int main(int argc, char **argv) rfconf.rssi_offset = DEFAULT_RSSI_OFFSET; rfconf.type = radio_type; rfconf.tx_enable = true; + rfconf.tx_notch_freq = DEFAULT_NOTCH_FREQ; lgw_rxrf_setconf(0, rfconf); /* radio A, f0 */ rfconf.enable = true; diff --git a/libloragw/tst/test_loragw_reg.c b/libloragw/tst/test_loragw_reg.c index a43dc533..37a6f5a0 100644 --- a/libloragw/tst/test_loragw_reg.c +++ b/libloragw/tst/test_loragw_reg.c @@ -37,7 +37,7 @@ int main() printf("Beginning of test for loragw_reg.c\n"); - lgw_connect(); + lgw_connect(false, 129E3); /* 2 SPI transactions: -> 0x80 0x00 <- 0x00 0x00 forcing page 0 -> 0x01 0x00 <- 0x00 0x64 checking version diff --git a/readme.md b/readme.md index 22d60b6d..f285b695 100644 --- a/readme.md +++ b/readme.md @@ -70,6 +70,22 @@ chip through GPIO, before starting any application using the concentrator. 4. Changelog ------------- +### v4.1.0 ### + +* HAL: Reworked "Listen-Before-Talk" feature to have more flexibility to define +LBT channels frequency, and to be able to have spectral scan running in parallel +* HAL: Updated lgw_time_on_air() function for FSK packets +* HAL: Disabled GPS UART input being re-echoed as output to avoid sending wrong +commands to GPS module +* HAL: Fixed IF frequency configuration check issue for channel bandwidths 250K +and 500HKz. +* FPGA: Updated to v31 for new LBT and spectral scan design. +* util_spectral_scan: updated to match new spectral scan FPGA sequence +* util_lbt_test: updated to match LBT rework + +Note: The provided LBT feature has been validated for Japan only, and supports +8 downlink channels maximum. + ### v4.0.1 ### * HAL: SX1301AP2: Only FPGA v27 is supported, removed (v18,v19) from the list diff --git a/util_lbt_test/readme.md b/util_lbt_test/readme.md index 81472870..db6cd582 100644 --- a/util_lbt_test/readme.md +++ b/util_lbt_test/readme.md @@ -18,26 +18,27 @@ instant when the channel was free. 2. Dependencies ---------------- -- A SX1301AP2 Ref Design board with its FPGA programmed with LBT feature +A SX1301AP2 Ref Design board with its FPGA programmed with LBT feature 3. Usage --------- Before running the util_lbt_test application, the concentrator MUST be first -started with the HAL, using for example util_pkt_logger or the packet forwarder. +started with the HAL, using for example util_pkt_logger or the packet forwarder +with LBT feature disabled, as the util_lbt_test will configure it. For a description of the command line options available: ./util_lbt_test -h ex: -./util_lbt_test -f 867.1 -t 100 -n 14 -s 15 -p 50 -r 162 +./util_lbt_test -f 867.1 -r -80 -s 5000 -This will set 6 LBT channels, starting from 867.1 MHz, then each subsequent +This will set 8 LBT channels, starting from 867.1 MHz, then each subsequent channel being set to the frequency of the previous channel +200 KHz (867.3, 867.5, ...). -The above test will run for 100 iterations, with a CHANNEL_SCAN_TIME of 270µs -and a target RSSI of -81dBm. +The above test will run for ever, with a CHANNEL_SCAN_TIME of 5000µs +and a target RSSI of -80dBm. Please refer to the lora_gateway library readme.md to get more details on the LBT feature implementation and configuration. @@ -46,3 +47,4 @@ LBT feature implementation and configuration. ------------- 2016-03-03 v1.0 Initial version +2016-08-31 v1.1 LBT feature rework diff --git a/util_lbt_test/src/util_lbt_test.c b/util_lbt_test/src/util_lbt_test.c index 0f10e867..1c8b1850 100644 --- a/util_lbt_test/src/util_lbt_test.c +++ b/util_lbt_test/src/util_lbt_test.c @@ -39,11 +39,13 @@ Maintainer: Michael Coracin #include "loragw_fpga.h" /* -------------------------------------------------------------------------- */ -/* --- PRIVATE MACROS ------------------------------------------------------- */ +/* --- PRIVATE MACROS & CONSTANTS ------------------------------------------- */ #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define MSG(args...) fprintf(stderr, args) /* message that is destined to the user */ +#define DEFAULT_SX127X_RSSI_OFFSET -1 + /* -------------------------------------------------------------------------- */ /* --- PRIVATE VARIABLES (GLOBAL) ------------------------------------------- */ @@ -72,14 +74,12 @@ static void sig_handler(int sigio) { /* describe command line options */ void usage(void) { - printf( "Available options:\n"); - printf( " -h print this help\n"); - printf( " -f start frequency in MHz\n"); - printf( " -t number of read loops [1..32000]\n"); - printf( " -n number of spi access to SX127x RSSI instant register [0..255]\n"); - printf( " -s spi speed divider [0..255]\n"); - printf( " -p pll lock time: delay in 8 µsec step between frequency programming and RX ready [0..255]\n"); - printf( " -r target RSSI: signal strength target used to detect if the channel is clear or not [0..255]\n"); + printf("Available options:\n"); + printf(" -h print this help\n"); + printf(" -f frequency in MHz of the first LBT channel\n"); + printf(" -o offset in dB to be applied to the SX127x RSSI [-128..127]\n"); + printf(" -r target RSSI: signal strength target used to detect if the channel is clear or not [-128..0]\n"); + printf(" -s scan time in µs for all 8 LBT channels [128,5000]\n"); } /* -------------------------------------------------------------------------- */ @@ -92,21 +92,20 @@ int main(int argc, char **argv) /* in/out variables */ double f1 = 0.0; + uint32_t f_init = 0; /* in Hz */ uint32_t f_start = 0; /* in Hz */ uint16_t loop_cnt = 0; - uint16_t tempo = 100; - uint16_t nb_point = 14; - uint8_t spi_speed_div = 15; - uint8_t rssi_target = 162; - uint8_t pll_lock_time = 50; - uint16_t lsb_start_freq_int; + int8_t rssi_target_dBm = -80; + uint16_t scan_time_us = 128; uint32_t timestamp; uint8_t rssi_value; - int32_t val; + int8_t rssi_offset = DEFAULT_SX127X_RSSI_OFFSET; + int32_t val, val2; int channel; + uint32_t freq_offset; /* parse command line options */ - while ((i = getopt (argc, argv, "h:f:t:n:s:p:r:o:")) != -1) { + while ((i = getopt (argc, argv, "h:f:s:r:o:")) != -1) { switch (i) { case 'h': usage(); @@ -123,54 +122,34 @@ int main(int argc, char **argv) f_start = (uint32_t)((f1*1e6) + 0.5);/* .5 Hz offset to get rounding instead of truncating */ } break; - case 't': - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 1) || (xi > 32000)) { - MSG("ERROR: tempo must be b/w 1 & 32000 \n"); - usage(); - return EXIT_FAILURE; - } else { - tempo = xi; - } - break; - case 'n': - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 0) || (xi > 255)) { - MSG("ERROR: nb_point must be b/w 0 & 255 \n"); - usage(); - return EXIT_FAILURE; - } else { - nb_point = xi; - } - break; case 's': i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 0) || (xi > 255)) { - MSG("ERROR: spi_speed_div must be b/w 0 & 255 \n"); + if ((i != 1) || ((xi != 128) && (xi != 5000))) { + MSG("ERROR: scan_time_us must be 128 or 5000 \n"); usage(); return EXIT_FAILURE; } else { - spi_speed_div = xi; + scan_time_us = xi; } break; case 'r': i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 0) || (xi > 255)) { - MSG("ERROR: rssi_target must be b/w 0 & 255 \n"); + if ((i != 1) || ((xi < -128) && (xi > 0))) { + MSG("ERROR: rssi_target must be b/w -128 & 0 \n"); usage(); return EXIT_FAILURE; } else { - rssi_target = xi; + rssi_target_dBm = xi; } break; - case 'p': + case 'o': /* -o SX127x RSSI offset [-128..127] */ i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 0) || (xi > 255)) { - MSG("ERROR: pll_lock_time must be b/w 1 & 256 \n"); + if((i != 1) || (xi < -128) || (xi > 127)) { + MSG("ERROR: rssi_offset must be b/w -128 & 127\n"); usage(); return EXIT_FAILURE; } else { - pll_lock_time = xi; + rssi_offset = (int8_t)xi; } break; default: @@ -180,13 +159,6 @@ int main(int argc, char **argv) } } - /* Sanity check */ - if (f_start == 0) { - MSG("ERROR: LBT start frequency must be set\n"); - usage(); - return EXIT_FAILURE; - } - MSG("INFO: Starting LoRa Gateway v1.5 LBT test\n"); /* configure signal handling */ @@ -198,79 +170,88 @@ int main(int argc, char **argv) sigaction(SIGTERM, &sigact, NULL); /* Connect to concentrator */ - i = lgw_connect(); + i = lgw_connect(false, LGW_DEFAULT_NOTCH_FREQ); if (i != LGW_REG_SUCCESS) { MSG("ERROR: lgw_connect() did not return SUCCESS\n"); return EXIT_FAILURE; } /* Check if FPGA supports LBT */ - lgw_fpga_reg_r(LGW_FPGA_FPGA_FEATURE, &val); + lgw_fpga_reg_r(LGW_FPGA_FEATURE, &val); if (TAKE_N_BITS_FROM((uint8_t)val, 2, 1) != true) { - printf("ERROR: LBT is not supported (0x%x)\n", (uint8_t)val); + MSG("ERROR: LBT is not supported (0x%x)\n", (uint8_t)val); return EXIT_FAILURE; } + /* Get FPGA lowest frequency for LBT channels */ + lgw_fpga_reg_r(LGW_FPGA_LBT_INITIAL_FREQ, &val); + switch (val) { + case 0: + f_init = 915000000; + break; + case 1: + f_init = 863000000; + break; + default: + MSG("ERROR: LBT start frequency %d is not supported\n", val); + return EXIT_FAILURE; + } + + /* Initialize 1st LBT channel freq if not given by user */ + if (f_start == 0) { + f_start = f_init; + } else if (f_start < f_init) { + MSG("ERROR: LBT start frequency %u is not supported (f_init=%u)\n", f_start, f_init); + return EXIT_FAILURE; + } MSG("FREQ: %u\n", f_start); /* Configure SX127x and read few RSSI points */ - lgw_setup_sx127x(f_start, MOD_FSK); + lgw_setup_sx127x(f_init, MOD_FSK, LGW_SX127X_RXBW_100K_HZ, rssi_offset); /* 200KHz LBT channels */ for (i = 0; i < 100; i++) { lgw_sx127x_reg_r(0x11, &rssi_value); /* 0x11: RegRssiValue */ - MSG("SX127x RSSI:-%u dBm\n", rssi_value>>1); + MSG("SX127x RSSI:%i dBm\n", -(rssi_value/2)); wait_ms(10); } /* Configure LBT */ - lgw_fpga_reg_w(LGW_FPGA_SPI_MASTER_SPEED_DIVIDER, (int32_t)spi_speed_div); - lgw_fpga_reg_w(LGW_FPGA_NB_READ_RSSI, (int32_t)nb_point); - lgw_fpga_reg_w(LGW_FPGA_PLL_LOCK_TIME, (int32_t)pll_lock_time); - lgw_fpga_reg_w(LGW_FPGA_RSSI_TARGET, (int32_t)rssi_target); - lsb_start_freq_int = (((uint64_t)f_start<<19)/(uint64_t)32000000); - lgw_fpga_reg_w(LGW_FPGA_LSB_START_FREQ, (int32_t)lsb_start_freq_int); - lgw_fpga_reg_w(LGW_FPGA_LBT_TIMESTAMP_NB_CH, (6-1)); /* 6 channels */ - - /* Enable LBT FSM */ - lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 1); - - /* Read back LBT config */ - lgw_fpga_reg_r(LGW_FPGA_SPI_MASTER_SPEED_DIVIDER, &val); - MSG("spi_speed_div = %d\n", val); - if (val != spi_speed_div) { - return EXIT_FAILURE; - } - lgw_fpga_reg_r(LGW_FPGA_NB_READ_RSSI, &val); - MSG("nb_point = %d\n", val); - if (val != nb_point) { - return EXIT_FAILURE; - } - lgw_fpga_reg_r(LGW_FPGA_PLL_LOCK_TIME, &val); - MSG("PLL_LOCK = %d\n", val); - if (val != pll_lock_time) { - return EXIT_FAILURE; + val = -2*(rssi_target_dBm); + lgw_fpga_reg_w(LGW_FPGA_RSSI_TARGET, val); + for (i = 0; i < LBT_CHANNEL_FREQ_NB; i++) { + freq_offset = (f_start - f_init)/100E3 + i*2; /* 200KHz between each channel */ + lgw_fpga_reg_w(LGW_FPGA_LBT_CH0_FREQ_OFFSET+i, (int32_t)freq_offset); + if (scan_time_us == 5000) { /* configured to 128 by default */ + lgw_fpga_reg_w(LGW_FPGA_LBT_SCAN_TIME_CH0+i, 1); + } } + lgw_fpga_reg_r(LGW_FPGA_RSSI_TARGET, &val); MSG("RSSI_TARGET = %d\n", val); - if (val != rssi_target) { + if (val != (-2*rssi_target_dBm)) { + MSG("ERROR: failed to read back RSSI target register value\n"); return EXIT_FAILURE; } + for (i = 0; i < LBT_CHANNEL_FREQ_NB; i++) { + lgw_fpga_reg_r(LGW_FPGA_LBT_CH0_FREQ_OFFSET+i, &val); + lgw_fpga_reg_r(LGW_FPGA_LBT_SCAN_TIME_CH0+i, &val2); + MSG("CH_%i: freq=%u (offset=%i), scan_time=%u (%i)\n", i, (uint32_t)((val*100E3)+f_init), val, (val2==1)?5000:128, val2); + } lgw_fpga_reg_r(LGW_FPGA_VERSION, &val); MSG("FPGA VERSION = %d\n", val); - /* Start test */ - while (((quit_sig != 1) && (exit_sig != 1)) && (loop_cnt != tempo)) { - /* Get current FPGA timestamp (1MHz) */ - lgw_fpga_reg_r(LGW_FPGA_TIMESTAMP, &val); - timestamp = (uint32_t)val; - MSG(" TIMESTAMP = %u\n", timestamp); + /* Enable LBT FSM */ + lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 1); - for (channel = 0; channel <= 5; channel++) { + /* Start test */ + while ((quit_sig != 1) && (exit_sig != 1)) { + MSG("~~~~\n"); + for (channel = 0; channel < LBT_CHANNEL_FREQ_NB; channel++) { /* Select LBT channel */ lgw_fpga_reg_w(LGW_FPGA_LBT_TIMESTAMP_SELECT_CH, channel); /* Get last instant when the selected channel was free */ lgw_fpga_reg_r(LGW_FPGA_LBT_TIMESTAMP_CH, &val); - timestamp = (uint32_t)(val & 0x00FFFFFF) * 256; /* 24bits (1LSB = 256µs) */ + timestamp = (uint32_t)(val & 0x0000FFFF) * 256; /* 16bits (1LSB = 256µs) */ MSG(" TIMESTAMP_CH%u = %u\n", channel, timestamp); } diff --git a/util_pkt_logger/global_conf.json b/util_pkt_logger/global_conf.json index 1a841d46..a3f327a8 100644 --- a/util_pkt_logger/global_conf.json +++ b/util_pkt_logger/global_conf.json @@ -7,7 +7,7 @@ "type": "SX1257", "freq": 867500000, "rssi_offset": -166.0, - "tx_enable": true + "tx_enable": false }, "radio_1": { "enable": true, diff --git a/util_pkt_logger/inc/parson.h b/util_pkt_logger/inc/parson.h index ef218901..2669a18c 100644 --- a/util_pkt_logger/inc/parson.h +++ b/util_pkt_logger/inc/parson.h @@ -1,17 +1,17 @@ /* Parson ( http://kgabis.github.com/parson/ ) - Copyright (c) 2013 Krzysztof Gabis - + Copyright (c) 2012 - 2016 Krzysztof Gabis + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -27,49 +27,91 @@ #ifdef __cplusplus extern "C" { -#endif - -#include /* size_t */ +#endif + +#include /* size_t */ -#define PARSON_VERSION 20131130 - /* Types and enums */ typedef struct json_object_t JSON_Object; typedef struct json_array_t JSON_Array; typedef struct json_value_t JSON_Value; -typedef enum json_value_type { - JSONError = 0, +enum json_value_type { + JSONError = -1, JSONNull = 1, JSONString = 2, JSONNumber = 3, JSONObject = 4, JSONArray = 5, JSONBoolean = 6 -} JSON_Value_Type; +}; +typedef int JSON_Value_Type; + +enum json_result_t { + JSONSuccess = 0, + JSONFailure = -1 +}; +typedef int JSON_Status; + +typedef void * (*JSON_Malloc_Function)(size_t); +typedef void (*JSON_Free_Function)(void *); + +/* Call only once, before calling any other function from parson API. If not called, malloc and free + from stdlib will be used for all allocations */ +void json_set_allocation_functions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun); - /* Parses first JSON value in a file, returns NULL in case of error */ -JSON_Value * json_parse_file(const char *filename); +JSON_Value * json_parse_file(const char *filename); /* Parses first JSON value in a file and ignores comments (/ * * / and //), returns NULL in case of error */ -JSON_Value * json_parse_file_with_comments(const char *filename); - +JSON_Value * json_parse_file_with_comments(const char *filename); + /* Parses first JSON value in a string, returns NULL in case of error */ -JSON_Value * json_parse_string(const char *string); +JSON_Value * json_parse_string(const char *string); /* Parses first JSON value in a string and ignores comments (/ * * / and //), returns NULL in case of error */ -JSON_Value * json_parse_string_with_comments(const char *string); - -/* JSON Object */ +JSON_Value * json_parse_string_with_comments(const char *string); + +/* Serialization */ +size_t json_serialization_size(const JSON_Value *value); /* returns 0 on fail */ +JSON_Status json_serialize_to_buffer(const JSON_Value *value, char *buf, size_t buf_size_in_bytes); +JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename); +char * json_serialize_to_string(const JSON_Value *value); + +/* Pretty serialization */ +size_t json_serialization_size_pretty(const JSON_Value *value); /* returns 0 on fail */ +JSON_Status json_serialize_to_buffer_pretty(const JSON_Value *value, char *buf, size_t buf_size_in_bytes); +JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename); +char * json_serialize_to_string_pretty(const JSON_Value *value); + +void json_free_serialized_string(char *string); /* frees string from json_serialize_to_string and json_serialize_to_string_pretty */ + +/* Comparing */ +int json_value_equals(const JSON_Value *a, const JSON_Value *b); + +/* Validation + This is *NOT* JSON Schema. It validates json by checking if object have identically + named fields with matching types. + For example schema {"name":"", "age":0} will validate + {"name":"Joe", "age":25} and {"name":"Joe", "age":25, "gender":"m"}, + but not {"name":"Joe"} or {"name":"Joe", "age":"Cucumber"}. + In case of arrays, only first value in schema is checked against all values in tested array. + Empty objects ({}) validate all objects, empty arrays ([]) validate all arrays, + null validates values of every type. + */ +JSON_Status json_validate(const JSON_Value *schema, const JSON_Value *value); + +/* + * JSON Object + */ JSON_Value * json_object_get_value (const JSON_Object *object, const char *name); const char * json_object_get_string (const JSON_Object *object, const char *name); JSON_Object * json_object_get_object (const JSON_Object *object, const char *name); JSON_Array * json_object_get_array (const JSON_Object *object, const char *name); -double json_object_get_number (const JSON_Object *object, const char *name); -int json_object_get_boolean(const JSON_Object *object, const char *name); +double json_object_get_number (const JSON_Object *object, const char *name); /* returns 0 on fail */ +int json_object_get_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */ /* dotget functions enable addressing values with dot notation in nested objects, just like in structs or c++/java/c# objects (e.g. objectA.objectB.value). @@ -79,31 +121,100 @@ JSON_Value * json_object_dotget_value (const JSON_Object *object, const char * const char * json_object_dotget_string (const JSON_Object *object, const char *name); JSON_Object * json_object_dotget_object (const JSON_Object *object, const char *name); JSON_Array * json_object_dotget_array (const JSON_Object *object, const char *name); -double json_object_dotget_number (const JSON_Object *object, const char *name); -int json_object_dotget_boolean(const JSON_Object *object, const char *name); +double json_object_dotget_number (const JSON_Object *object, const char *name); /* returns 0 on fail */ +int json_object_dotget_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */ /* Functions to get available names */ size_t json_object_get_count(const JSON_Object *object); const char * json_object_get_name (const JSON_Object *object, size_t index); - -/* JSON Array */ + +/* Creates new name-value pair or frees and replaces old value with a new one. + * json_object_set_value does not copy passed value so it shouldn't be freed afterwards. */ +JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value); +JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string); +JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number); +JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean); +JSON_Status json_object_set_null(JSON_Object *object, const char *name); + +/* Works like dotget functions, but creates whole hierarchy if necessary. + * json_object_dotset_value does not copy passed value so it shouldn't be freed afterwards. */ +JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value); +JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string); +JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number); +JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean); +JSON_Status json_object_dotset_null(JSON_Object *object, const char *name); + +/* Frees and removes name-value pair */ +JSON_Status json_object_remove(JSON_Object *object, const char *name); + +/* Works like dotget function, but removes name-value pair only on exact match. */ +JSON_Status json_object_dotremove(JSON_Object *object, const char *key); + +/* Removes all name-value pairs in object */ +JSON_Status json_object_clear(JSON_Object *object); + +/* + *JSON Array + */ JSON_Value * json_array_get_value (const JSON_Array *array, size_t index); const char * json_array_get_string (const JSON_Array *array, size_t index); JSON_Object * json_array_get_object (const JSON_Array *array, size_t index); JSON_Array * json_array_get_array (const JSON_Array *array, size_t index); -double json_array_get_number (const JSON_Array *array, size_t index); -int json_array_get_boolean(const JSON_Array *array, size_t index); +double json_array_get_number (const JSON_Array *array, size_t index); /* returns 0 on fail */ +int json_array_get_boolean(const JSON_Array *array, size_t index); /* returns -1 on fail */ size_t json_array_get_count (const JSON_Array *array); -/* JSON Value */ +/* Frees and removes value at given index, does nothing and returns JSONFailure if index doesn't exist. + * Order of values in array may change during execution. */ +JSON_Status json_array_remove(JSON_Array *array, size_t i); + +/* Frees and removes from array value at given index and replaces it with given one. + * Does nothing and returns JSONFailure if index doesn't exist. + * json_array_replace_value does not copy passed value so it shouldn't be freed afterwards. */ +JSON_Status json_array_replace_value(JSON_Array *array, size_t i, JSON_Value *value); +JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string); +JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number); +JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean); +JSON_Status json_array_replace_null(JSON_Array *array, size_t i); + +/* Frees and removes all values from array */ +JSON_Status json_array_clear(JSON_Array *array); + +/* Appends new value at the end of array. + * json_array_append_value does not copy passed value so it shouldn't be freed afterwards. */ +JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value); +JSON_Status json_array_append_string(JSON_Array *array, const char *string); +JSON_Status json_array_append_number(JSON_Array *array, double number); +JSON_Status json_array_append_boolean(JSON_Array *array, int boolean); +JSON_Status json_array_append_null(JSON_Array *array); + +/* + *JSON Value + */ +JSON_Value * json_value_init_object (void); +JSON_Value * json_value_init_array (void); +JSON_Value * json_value_init_string (const char *string); /* copies passed string */ +JSON_Value * json_value_init_number (double number); +JSON_Value * json_value_init_boolean(int boolean); +JSON_Value * json_value_init_null (void); +JSON_Value * json_value_deep_copy (const JSON_Value *value); +void json_value_free (JSON_Value *value); + JSON_Value_Type json_value_get_type (const JSON_Value *value); JSON_Object * json_value_get_object (const JSON_Value *value); JSON_Array * json_value_get_array (const JSON_Value *value); const char * json_value_get_string (const JSON_Value *value); double json_value_get_number (const JSON_Value *value); int json_value_get_boolean(const JSON_Value *value); -void json_value_free (JSON_Value *value); - + +/* Same as above, but shorter */ +JSON_Value_Type json_type (const JSON_Value *value); +JSON_Object * json_object (const JSON_Value *value); +JSON_Array * json_array (const JSON_Value *value); +const char * json_string (const JSON_Value *value); +double json_number (const JSON_Value *value); +int json_boolean(const JSON_Value *value); + #ifdef __cplusplus } #endif diff --git a/util_pkt_logger/src/parson.c b/util_pkt_logger/src/parson.c index ecf733fa..16bb1588 100644 --- a/util_pkt_logger/src/parson.c +++ b/util_pkt_logger/src/parson.c @@ -1,6 +1,6 @@ /* Parson ( http://kgabis.github.com/parson/ ) - Copyright (c) 2013 Krzysztof Gabis + Copyright (c) 2012 - 2016 Krzysztof Gabis Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -20,6 +20,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif #include "parson.h" @@ -27,25 +30,30 @@ #include #include #include +#include -#define ERROR 0 -#define SUCCESS 1 #define STARTING_CAPACITY 15 #define ARRAY_MAX_CAPACITY 122880 /* 15*(2^13) */ #define OBJECT_MAX_CAPACITY 960 /* 15*(2^6) */ #define MAX_NESTING 19 -#define sizeof_token(a) (sizeof(a) - 1) -#define skip_char(str) ((*str)++) -#define skip_whitespaces(str) while (isspace(**str)) { skip_char(str); } +#define DOUBLE_SERIALIZATION_FORMAT "%f" + +#define SIZEOF_TOKEN(a) (sizeof(a) - 1) +#define SKIP_CHAR(str) ((*str)++) +#define SKIP_WHITESPACES(str) while (isspace(**str)) { SKIP_CHAR(str); } #define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define parson_malloc(a) malloc(a) -#define parson_free(a) free((void*)a) -#define parson_realloc(a, b) realloc(a, b) +#undef malloc +#undef free + +static JSON_Malloc_Function parson_malloc = malloc; +static JSON_Free_Function parson_free = free; + +#define IS_CONT(b) (((unsigned char)(b) & 0xC0) == 0x80) /* is utf-8 continuation byte */ /* Type definitions */ typedef union json_value_value { - const char *string; + char *string; double number; JSON_Object *object; JSON_Array *array; @@ -59,7 +67,7 @@ struct json_value_t { }; struct json_object_t { - const char **names; + char **names; JSON_Value **values; size_t count; size_t capacity; @@ -74,35 +82,35 @@ struct json_array_t { /* Various */ static char * read_file(const char *filename); static void remove_comments(char *string, const char *start_token, const char *end_token); -static int try_realloc(void **ptr, size_t new_size); static char * parson_strndup(const char *string, size_t n); -static int is_utf(const unsigned char *string); +static char * parson_strdup(const char *string); +static int is_utf16_hex(const unsigned char *string); +static int num_bytes_in_utf8_sequence(unsigned char c); +static int verify_utf8_sequence(const unsigned char *string, int *len); +static int is_valid_utf8(const char *string, size_t string_len); static int is_decimal(const char *string, size_t length); /* JSON Object */ static JSON_Object * json_object_init(void); -static int json_object_add(JSON_Object *object, const char *name, JSON_Value *value); -static int json_object_resize(JSON_Object *object, size_t capacity); +static JSON_Status json_object_add(JSON_Object *object, const char *name, JSON_Value *value); +static JSON_Status json_object_resize(JSON_Object *object, size_t new_capacity); static JSON_Value * json_object_nget_value(const JSON_Object *object, const char *name, size_t n); static void json_object_free(JSON_Object *object); /* JSON Array */ static JSON_Array * json_array_init(void); -static int json_array_add(JSON_Array *array, JSON_Value *value); -static int json_array_resize(JSON_Array *array, size_t capacity); +static JSON_Status json_array_add(JSON_Array *array, JSON_Value *value); +static JSON_Status json_array_resize(JSON_Array *array, size_t new_capacity); static void json_array_free(JSON_Array *array); /* JSON Value */ -static JSON_Value * json_value_init_object(void); -static JSON_Value * json_value_init_array(void); -static JSON_Value * json_value_init_string(const char *string); -static JSON_Value * json_value_init_number(double number); -static JSON_Value * json_value_init_boolean(int boolean); -static JSON_Value * json_value_init_null(void); +static JSON_Value * json_value_init_string_no_copy(char *string); /* Parser */ static void skip_quotes(const char **string); -static const char * get_processed_string(const char **string); +static int parse_utf_16(const char **unprocessed, char **processed); +static char * process_string(const char *input, size_t len); +static char * get_quoted_string(const char **string); static JSON_Value * parse_object_value(const char **string, size_t nesting); static JSON_Value * parse_array_value(const char **string, size_t nesting); static JSON_Value * parse_string_value(const char **string); @@ -111,15 +119,13 @@ static JSON_Value * parse_number_value(const char **string); static JSON_Value * parse_null_value(const char **string); static JSON_Value * parse_value(const char **string, size_t nesting); -/* Various */ -static int try_realloc(void **ptr, size_t new_size) { - void *reallocated_ptr = parson_realloc(*ptr, new_size); - if (!reallocated_ptr) - return ERROR; - *ptr = reallocated_ptr; - return SUCCESS; -} +/* Serialization */ +static int json_serialize_to_buffer_r(const JSON_Value *value, char *buf, int level, int is_pretty, char *num_buf); +static int json_serialize_string(const char *string, char *buf); +static int append_indent(char *buf, int level); +static int append_string(char *buf, const char *string); +/* Various */ static char * parson_strndup(const char *string, size_t n) { char *output_string = (char*)parson_malloc(n + 1); if (!output_string) @@ -129,10 +135,83 @@ static char * parson_strndup(const char *string, size_t n) { return output_string; } -static int is_utf(const unsigned char *s) { +static char * parson_strdup(const char *string) { + return parson_strndup(string, strlen(string)); +} + +static int is_utf16_hex(const unsigned char *s) { return isxdigit(s[0]) && isxdigit(s[1]) && isxdigit(s[2]) && isxdigit(s[3]); } +static int num_bytes_in_utf8_sequence(unsigned char c) { + if (c == 0xC0 || c == 0xC1 || c > 0xF4 || IS_CONT(c)) { + return 0; + } else if ((c & 0x80) == 0) { /* 0xxxxxxx */ + return 1; + } else if ((c & 0xE0) == 0xC0) { /* 110xxxxx */ + return 2; + } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx */ + return 3; + } else if ((c & 0xF8) == 0xF0) { /* 11110xxx */ + return 4; + } + return 0; /* won't happen */ +} + +static int verify_utf8_sequence(const unsigned char *string, int *len) { + unsigned int cp = 0; + *len = num_bytes_in_utf8_sequence(string[0]); + + if (*len == 1) { + cp = string[0]; + } else if (*len == 2 && IS_CONT(string[1])) { + cp = string[0] & 0x1F; + cp = (cp << 6) | (string[1] & 0x3F); + } else if (*len == 3 && IS_CONT(string[1]) && IS_CONT(string[2])) { + cp = ((unsigned char)string[0]) & 0xF; + cp = (cp << 6) | (string[1] & 0x3F); + cp = (cp << 6) | (string[2] & 0x3F); + } else if (*len == 4 && IS_CONT(string[1]) && IS_CONT(string[2]) && IS_CONT(string[3])) { + cp = string[0] & 0x7; + cp = (cp << 6) | (string[1] & 0x3F); + cp = (cp << 6) | (string[2] & 0x3F); + cp = (cp << 6) | (string[3] & 0x3F); + } else { + return 0; + } + + /* overlong encodings */ + if ((cp < 0x80 && *len > 1) || + (cp < 0x800 && *len > 2) || + (cp < 0x10000 && *len > 3)) { + return 0; + } + + /* invalid unicode */ + if (cp > 0x10FFFF) { + return 0; + } + + /* surrogate halves */ + if (cp >= 0xD800 && cp <= 0xDFFF) { + return 0; + } + + return 1; +} + +static int is_valid_utf8(const char *string, size_t string_len) { + int len = 0; + const char *string_end = string + string_len; + while (string < string_end) { + if (!verify_utf8_sequence((const unsigned char*)string, &len)) { + return 0; + } + string += len; + } + return 1; +} + static int is_decimal(const char *string, size_t length) { if (length > 1 && string[0] == '0' && string[1] != '.') return 0; @@ -147,11 +226,17 @@ static int is_decimal(const char *string, size_t length) { static char * read_file(const char * filename) { FILE *fp = fopen(filename, "r"); size_t file_size; + long pos; char *file_contents; if (!fp) return NULL; fseek(fp, 0L, SEEK_END); - file_size = ftell(fp); + pos = ftell(fp); + if (pos < 0) { + fclose(fp); + return NULL; + } + file_size = pos; rewind(fp); file_contents = (char*)parson_malloc(sizeof(char) * (file_size + 1)); if (!file_contents) { @@ -177,7 +262,7 @@ static void remove_comments(char *string, const char *start_token, const char *e size_t start_token_len = strlen(start_token); size_t end_token_len = strlen(end_token); if (start_token_len == 0 || end_token_len == 0) - return; + return; while ((current_char = *string) != '\0') { if (current_char == '\\' && !escaped) { escaped = 1; @@ -186,15 +271,15 @@ static void remove_comments(char *string, const char *start_token, const char *e } else if (current_char == '\"' && !escaped) { in_string = !in_string; } else if (!in_string && strncmp(string, start_token, start_token_len) == 0) { - for(i = 0; i < start_token_len; i++) + for(i = 0; i < start_token_len; i++) string[i] = ' '; - string = string + start_token_len; + string = string + start_token_len; ptr = strstr(string, end_token); if (!ptr) return; for (i = 0; i < (ptr - string) + end_token_len; i++) string[i] = ' '; - string = ptr + end_token_len - 1; + string = ptr + end_token_len - 1; } escaped = 0; string++; @@ -206,40 +291,66 @@ static JSON_Object * json_object_init(void) { JSON_Object *new_obj = (JSON_Object*)parson_malloc(sizeof(JSON_Object)); if (!new_obj) return NULL; - new_obj->names = (const char**)NULL; + new_obj->names = (char**)NULL; new_obj->values = (JSON_Value**)NULL; new_obj->capacity = 0; new_obj->count = 0; return new_obj; } -static int json_object_add(JSON_Object *object, const char *name, JSON_Value *value) { - size_t index; +static JSON_Status json_object_add(JSON_Object *object, const char *name, JSON_Value *value) { + size_t index = 0; + if (object == NULL || name == NULL || value == NULL) { + return JSONFailure; + } if (object->count >= object->capacity) { size_t new_capacity = MAX(object->capacity * 2, STARTING_CAPACITY); if (new_capacity > OBJECT_MAX_CAPACITY) - return ERROR; - if (json_object_resize(object, new_capacity) == ERROR) - return ERROR; + return JSONFailure; + if (json_object_resize(object, new_capacity) == JSONFailure) + return JSONFailure; } if (json_object_get_value(object, name) != NULL) - return ERROR; + return JSONFailure; index = object->count; - object->names[index] = parson_strndup(name, strlen(name)); - if (!object->names[index]) - return ERROR; + object->names[index] = parson_strdup(name); + if (object->names[index] == NULL) + return JSONFailure; object->values[index] = value; object->count++; - return SUCCESS; + return JSONSuccess; } -static int json_object_resize(JSON_Object *object, size_t capacity) { - if (try_realloc((void**)&object->names, capacity * sizeof(char*)) == ERROR) - return ERROR; - if (try_realloc((void**)&object->values, capacity * sizeof(JSON_Value*)) == ERROR) - return ERROR; - object->capacity = capacity; - return SUCCESS; +static JSON_Status json_object_resize(JSON_Object *object, size_t new_capacity) { + char **temp_names = NULL; + JSON_Value **temp_values = NULL; + + if ((object->names == NULL && object->values != NULL) || + (object->names != NULL && object->values == NULL) || + new_capacity == 0) { + return JSONFailure; /* Shouldn't happen */ + } + + temp_names = (char**)parson_malloc(new_capacity * sizeof(char*)); + if (temp_names == NULL) + return JSONFailure; + + temp_values = (JSON_Value**)parson_malloc(new_capacity * sizeof(JSON_Value*)); + if (temp_values == NULL) { + parson_free(temp_names); + return JSONFailure; + } + + if (object->names != NULL && object->values != NULL && object->count > 0) { + memcpy(temp_names, object->names, object->count * sizeof(char*)); + memcpy(temp_values, object->values, object->count * sizeof(JSON_Value*)); + } + parson_free(object->names); + parson_free(object->values); + object->names = temp_names; + object->values = temp_values; + object->capacity = new_capacity; + return JSONSuccess; } static JSON_Value * json_object_nget_value(const JSON_Object *object, const char *name, size_t n) { @@ -275,24 +386,35 @@ static JSON_Array * json_array_init(void) { return new_array; } -static int json_array_add(JSON_Array *array, JSON_Value *value) { +static JSON_Status json_array_add(JSON_Array *array, JSON_Value *value) { if (array->count >= array->capacity) { size_t new_capacity = MAX(array->capacity * 2, STARTING_CAPACITY); if (new_capacity > ARRAY_MAX_CAPACITY) - return ERROR; - if (!json_array_resize(array, new_capacity)) - return ERROR; + return JSONFailure; + if (json_array_resize(array, new_capacity) == JSONFailure) + return JSONFailure; } array->items[array->count] = value; array->count++; - return SUCCESS; + return JSONSuccess; } -static int json_array_resize(JSON_Array *array, size_t capacity) { - if (try_realloc((void**)&array->items, capacity * sizeof(JSON_Value*)) == ERROR) - return ERROR; - array->capacity = capacity; - return SUCCESS; +static JSON_Status json_array_resize(JSON_Array *array, size_t new_capacity) { + JSON_Value **new_items = NULL; + if (new_capacity == 0) { + return JSONFailure; + } + new_items = (JSON_Value**)parson_malloc(new_capacity * sizeof(JSON_Value*)); + if (new_items == NULL) { + return JSONFailure; + } + if (array->items != NULL && array->count > 0) { + memcpy(new_items, array->items, array->count * sizeof(JSON_Value*)); + } + parson_free(array->items); + array->items = new_items; + array->capacity = new_capacity; + return JSONSuccess; } static void json_array_free(JSON_Array *array) { @@ -303,33 +425,7 @@ static void json_array_free(JSON_Array *array) { } /* JSON Value */ -static JSON_Value * json_value_init_object(void) { - JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); - if (!new_value) - return NULL; - new_value->type = JSONObject; - new_value->value.object = json_object_init(); - if (!new_value->value.object) { - parson_free(new_value); - return NULL; - } - return new_value; -} - -static JSON_Value * json_value_init_array(void) { - JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); - if (!new_value) - return NULL; - new_value->type = JSONArray; - new_value->value.array = json_array_init(); - if (!new_value->value.array) { - parson_free(new_value); - return NULL; - } - return new_value; -} - -static JSON_Value * json_value_init_string(const char *string) { +static JSON_Value * json_value_init_string_no_copy(char *string) { JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); if (!new_value) return NULL; @@ -338,116 +434,128 @@ static JSON_Value * json_value_init_string(const char *string) { return new_value; } -static JSON_Value * json_value_init_number(double number) { - JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); - if (!new_value) - return NULL; - new_value->type = JSONNumber; - new_value->value.number = number; - return new_value; -} - -static JSON_Value * json_value_init_boolean(int boolean) { - JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); - if (!new_value) - return NULL; - new_value->type = JSONBoolean; - new_value->value.boolean = boolean; - return new_value; -} - -static JSON_Value * json_value_init_null(void) { - JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); - if (!new_value) - return NULL; - new_value->type = JSONNull; - return new_value; -} - /* Parser */ static void skip_quotes(const char **string) { - skip_char(string); + SKIP_CHAR(string); while (**string != '\"') { if (**string == '\0') return; if (**string == '\\') { - skip_char(string); + SKIP_CHAR(string); if (**string == '\0') return; } - skip_char(string); + SKIP_CHAR(string); } - skip_char(string); + SKIP_CHAR(string); } -/* Returns contents of a string inside double quotes and parses escaped - characters inside. - Example: "\u006Corem ipsum" -> lorem ipsum */ -static const char * get_processed_string(const char **string) { - const char *string_start = *string; - char *output, *processed_ptr, *unprocessed_ptr, current_char; - unsigned int utf_val; - skip_quotes(string); - if (**string == '\0') - return NULL; - output = parson_strndup(string_start + 1, *string - string_start - 2); - if (!output) - return NULL; - processed_ptr = unprocessed_ptr = output; - while (*unprocessed_ptr) { - current_char = *unprocessed_ptr; - if (current_char == '\\') { - unprocessed_ptr++; - current_char = *unprocessed_ptr; - switch (current_char) { - case '\"': case '\\': case '/': break; - case 'b': current_char = '\b'; break; - case 'f': current_char = '\f'; break; - case 'n': current_char = '\n'; break; - case 'r': current_char = '\r'; break; - case 't': current_char = '\t'; break; +static int parse_utf_16(const char **unprocessed, char **processed) { + unsigned int cp, lead, trail; + char *processed_ptr = *processed; + const char *unprocessed_ptr = *unprocessed; + unprocessed_ptr++; /* skips u */ + if (!is_utf16_hex((const unsigned char*)unprocessed_ptr) || sscanf(unprocessed_ptr, "%4x", &cp) == EOF) + return JSONFailure; + if (cp < 0x80) { + *processed_ptr = cp; /* 0xxxxxxx */ + } else if (cp < 0x800) { + *processed_ptr++ = ((cp >> 6) & 0x1F) | 0xC0; /* 110xxxxx */ + *processed_ptr = ((cp ) & 0x3F) | 0x80; /* 10xxxxxx */ + } else if (cp < 0xD800 || cp > 0xDFFF) { + *processed_ptr++ = ((cp >> 12) & 0x0F) | 0xE0; /* 1110xxxx */ + *processed_ptr++ = ((cp >> 6) & 0x3F) | 0x80; /* 10xxxxxx */ + *processed_ptr = ((cp ) & 0x3F) | 0x80; /* 10xxxxxx */ + } else if (cp >= 0xD800 && cp <= 0xDBFF) { /* lead surrogate (0xD800..0xDBFF) */ + lead = cp; + unprocessed_ptr += 4; /* should always be within the buffer, otherwise previous sscanf would fail */ + if (*unprocessed_ptr++ != '\\' || *unprocessed_ptr++ != 'u' || /* starts with \u? */ + !is_utf16_hex((const unsigned char*)unprocessed_ptr) || + sscanf(unprocessed_ptr, "%4x", &trail) == EOF || + trail < 0xDC00 || trail > 0xDFFF) { /* valid trail surrogate? (0xDC00..0xDFFF) */ + return JSONFailure; + } + cp = ((((lead-0xD800)&0x3FF)<<10)|((trail-0xDC00)&0x3FF))+0x010000; + *processed_ptr++ = (((cp >> 18) & 0x07) | 0xF0); /* 11110xxx */ + *processed_ptr++ = (((cp >> 12) & 0x3F) | 0x80); /* 10xxxxxx */ + *processed_ptr++ = (((cp >> 6) & 0x3F) | 0x80); /* 10xxxxxx */ + *processed_ptr = (((cp ) & 0x3F) | 0x80); /* 10xxxxxx */ + } else { /* trail surrogate before lead surrogate */ + return JSONFailure; + } + unprocessed_ptr += 3; + *processed = processed_ptr; + *unprocessed = unprocessed_ptr; + return JSONSuccess; +} + + +/* Copies and processes passed string up to supplied length. +Example: "\u006Corem ipsum" -> lorem ipsum */ +static char* process_string(const char *input, size_t len) { + const char *input_ptr = input; + size_t initial_size = (len + 1) * sizeof(char); + size_t final_size = 0; + char *output = (char*)parson_malloc(initial_size); + char *output_ptr = output; + char *resized_output = NULL; + while ((*input_ptr != '\0') && (size_t)(input_ptr - input) < len) { + if (*input_ptr == '\\') { + input_ptr++; + switch (*input_ptr) { + case '\"': *output_ptr = '\"'; break; + case '\\': *output_ptr = '\\'; break; + case '/': *output_ptr = '/'; break; + case 'b': *output_ptr = '\b'; break; + case 'f': *output_ptr = '\f'; break; + case 'n': *output_ptr = '\n'; break; + case 'r': *output_ptr = '\r'; break; + case 't': *output_ptr = '\t'; break; case 'u': - unprocessed_ptr++; - if (!is_utf((const unsigned char*)unprocessed_ptr) || - sscanf(unprocessed_ptr, "%4x", &utf_val) == EOF) { - parson_free(output); - return NULL; - } - if (utf_val < 0x80) { - current_char = utf_val; - } else if (utf_val < 0x800) { - *processed_ptr++ = (utf_val >> 6) | 0xC0; - current_char = ((utf_val | 0x80) & 0xBF); - } else { - *processed_ptr++ = (utf_val >> 12) | 0xE0; - *processed_ptr++ = (((utf_val >> 6) | 0x80) & 0xBF); - current_char = ((utf_val | 0x80) & 0xBF); - } - unprocessed_ptr += 3; + if (parse_utf_16(&input_ptr, &output_ptr) == JSONFailure) + goto error; break; default: - parson_free(output); - return NULL; - break; + goto error; } - } else if ((unsigned char)current_char < 0x20) { /* 0x00-0x19 are invalid characters for json string (http://www.ietf.org/rfc/rfc4627.txt) */ - parson_free(output); - return NULL; + } else if ((unsigned char)*input_ptr < 0x20) { + goto error; /* 0x00-0x19 are invalid characters for json string (http://www.ietf.org/rfc/rfc4627.txt) */ + } else { + *output_ptr = *input_ptr; } - *processed_ptr = current_char; - processed_ptr++; - unprocessed_ptr++; + output_ptr++; + input_ptr++; } - *processed_ptr = '\0'; - if (try_realloc((void**)&output, strlen(output) + 1) == ERROR) + *output_ptr = '\0'; + /* resize to new length */ + final_size = (size_t)(output_ptr-output) + 1; + resized_output = (char*)parson_malloc(final_size); + if (resized_output == NULL) + goto error; + memcpy(resized_output, output, final_size); + parson_free(output); + return resized_output; +error: + parson_free(output); + return NULL; +} + +/* Return processed contents of a string between quotes and + skips passed argument to a matching quote. */ +static char * get_quoted_string(const char **string) { + const char *string_start = *string; + size_t string_len = 0; + skip_quotes(string); + if (**string == '\0') return NULL; - return output; + string_len = *string - string_start - 2; /* length without quotes */ + return process_string(string_start + 1, string_len); } static JSON_Value * parse_value(const char **string, size_t nesting) { if (nesting > MAX_NESTING) return NULL; - skip_whitespaces(string); + SKIP_WHITESPACES(string); switch (**string) { case '{': return parse_object_value(string, nesting + 1); @@ -471,49 +579,49 @@ static JSON_Value * parse_value(const char **string, size_t nesting) { static JSON_Value * parse_object_value(const char **string, size_t nesting) { JSON_Value *output_value = json_value_init_object(), *new_value = NULL; JSON_Object *output_object = json_value_get_object(output_value); - const char *new_key = NULL; - if (!output_value) + char *new_key = NULL; + if (output_value == NULL) return NULL; - skip_char(string); - skip_whitespaces(string); + SKIP_CHAR(string); + SKIP_WHITESPACES(string); if (**string == '}') { /* empty object */ - skip_char(string); + SKIP_CHAR(string); return output_value; } while (**string != '\0') { - new_key = get_processed_string(string); - skip_whitespaces(string); - if (!new_key || **string != ':') { + new_key = get_quoted_string(string); + SKIP_WHITESPACES(string); + if (new_key == NULL || **string != ':') { json_value_free(output_value); return NULL; } - skip_char(string); + SKIP_CHAR(string); new_value = parse_value(string, nesting); - if (!new_value) { + if (new_value == NULL) { parson_free(new_key); json_value_free(output_value); return NULL; } - if(!json_object_add(output_object, new_key, new_value)) { + if(json_object_add(output_object, new_key, new_value) == JSONFailure) { parson_free(new_key); parson_free(new_value); json_value_free(output_value); return NULL; } parson_free(new_key); - skip_whitespaces(string); + SKIP_WHITESPACES(string); if (**string != ',') break; - skip_char(string); - skip_whitespaces(string); + SKIP_CHAR(string); + SKIP_WHITESPACES(string); } - skip_whitespaces(string); + SKIP_WHITESPACES(string); if (**string != '}' || /* Trim object after parsing is over */ - json_object_resize(output_object, json_object_get_count(output_object)) == ERROR) { - json_value_free(output_value); - return NULL; + json_object_resize(output_object, json_object_get_count(output_object)) == JSONFailure) { + json_value_free(output_value); + return NULL; } - skip_char(string); + SKIP_CHAR(string); return output_value; } @@ -522,10 +630,10 @@ static JSON_Value * parse_array_value(const char **string, size_t nesting) { JSON_Array *output_array = json_value_get_array(output_value); if (!output_value) return NULL; - skip_char(string); - skip_whitespaces(string); + SKIP_CHAR(string); + SKIP_WHITESPACES(string); if (**string == ']') { /* empty array */ - skip_char(string); + SKIP_CHAR(string); return output_value; } while (**string != '\0') { @@ -534,37 +642,43 @@ static JSON_Value * parse_array_value(const char **string, size_t nesting) { json_value_free(output_value); return NULL; } - if(json_array_add(output_array, new_array_value) == ERROR) { + if(json_array_add(output_array, new_array_value) == JSONFailure) { parson_free(new_array_value); json_value_free(output_value); return NULL; } - skip_whitespaces(string); + SKIP_WHITESPACES(string); if (**string != ',') break; - skip_char(string); - skip_whitespaces(string); + SKIP_CHAR(string); + SKIP_WHITESPACES(string); } - skip_whitespaces(string); + SKIP_WHITESPACES(string); if (**string != ']' || /* Trim array after parsing is over */ - json_array_resize(output_array, json_array_get_count(output_array)) == ERROR) { - json_value_free(output_value); - return NULL; + json_array_resize(output_array, json_array_get_count(output_array)) == JSONFailure) { + json_value_free(output_value); + return NULL; } - skip_char(string); + SKIP_CHAR(string); return output_value; } static JSON_Value * parse_string_value(const char **string) { - const char *new_string = get_processed_string(string); - if (!new_string) + JSON_Value *value = NULL; + char *new_string = get_quoted_string(string); + if (new_string == NULL) + return NULL; + value = json_value_init_string_no_copy(new_string); + if (value == NULL) { + parson_free(new_string); return NULL; - return json_value_init_string(new_string); + } + return value; } static JSON_Value * parse_boolean_value(const char **string) { - size_t true_token_size = sizeof_token("true"); - size_t false_token_size = sizeof_token("false"); + size_t true_token_size = SIZEOF_TOKEN("true"); + size_t false_token_size = SIZEOF_TOKEN("false"); if (strncmp("true", *string, true_token_size) == 0) { *string += true_token_size; return json_value_init_boolean(1); @@ -589,7 +703,7 @@ static JSON_Value * parse_number_value(const char **string) { } static JSON_Value * parse_null_value(const char **string) { - size_t token_size = sizeof_token("null"); + size_t token_size = SIZEOF_TOKEN("null"); if (strncmp("null", *string, token_size) == 0) { *string += token_size; return json_value_init_null(); @@ -597,11 +711,180 @@ static JSON_Value * parse_null_value(const char **string) { return NULL; } +/* Serialization */ +#define APPEND_STRING(str) do { written = append_string(buf, (str)); \ + if (written < 0) { return -1; } \ + if (buf != NULL) { buf += written; } \ + written_total += written; } while(0) + +#define APPEND_INDENT(level) do { written = append_indent(buf, (level)); \ + if (written < 0) { return -1; } \ + if (buf != NULL) { buf += written; } \ + written_total += written; } while(0) + +static int json_serialize_to_buffer_r(const JSON_Value *value, char *buf, int level, int is_pretty, char *num_buf) +{ + const char *key = NULL, *string = NULL; + JSON_Value *temp_value = NULL; + JSON_Array *array = NULL; + JSON_Object *object = NULL; + size_t i = 0, count = 0; + double num = 0.0; + int written = -1, written_total = 0; + + switch (json_value_get_type(value)) { + case JSONArray: + array = json_value_get_array(value); + count = json_array_get_count(array); + APPEND_STRING("["); + if (count > 0 && is_pretty) + APPEND_STRING("\n"); + for (i = 0; i < count; i++) { + if (is_pretty) + APPEND_INDENT(level+1); + temp_value = json_array_get_value(array, i); + written = json_serialize_to_buffer_r(temp_value, buf, level+1, is_pretty, num_buf); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + if (i < (count - 1)) + APPEND_STRING(","); + if (is_pretty) + APPEND_STRING("\n"); + } + if (count > 0 && is_pretty) + APPEND_INDENT(level); + APPEND_STRING("]"); + return written_total; + case JSONObject: + object = json_value_get_object(value); + count = json_object_get_count(object); + APPEND_STRING("{"); + if (count > 0 && is_pretty) + APPEND_STRING("\n"); + for (i = 0; i < count; i++) { + key = json_object_get_name(object, i); + if (is_pretty) + APPEND_INDENT(level+1); + written = json_serialize_string(key, buf); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + APPEND_STRING(":"); + if (is_pretty) + APPEND_STRING(" "); + temp_value = json_object_get_value(object, key); + written = json_serialize_to_buffer_r(temp_value, buf, level+1, is_pretty, num_buf); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + if (i < (count - 1)) + APPEND_STRING(","); + if (is_pretty) + APPEND_STRING("\n"); + } + if (count > 0 && is_pretty) + APPEND_INDENT(level); + APPEND_STRING("}"); + return written_total; + case JSONString: + string = json_value_get_string(value); + written = json_serialize_string(string, buf); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + return written_total; + case JSONBoolean: + if (json_value_get_boolean(value)) + APPEND_STRING("true"); + else + APPEND_STRING("false"); + return written_total; + case JSONNumber: + num = json_value_get_number(value); + if (buf != NULL) + num_buf = buf; + if (num == ((double)(int)num)) /* check if num is integer */ + written = sprintf(num_buf, "%d", (int)num); + else + written = sprintf(num_buf, DOUBLE_SERIALIZATION_FORMAT, num); + if (written < 0) + return -1; + if (buf != NULL) + buf += written; + written_total += written; + return written_total; + case JSONNull: + APPEND_STRING("null"); + return written_total; + case JSONError: + return -1; + default: + return -1; + } +} + +static int json_serialize_string(const char *string, char *buf) { + size_t i = 0, len = strlen(string); + char c = '\0'; + int written = -1, written_total = 0; + APPEND_STRING("\""); + for (i = 0; i < len; i++) { + c = string[i]; + switch (c) { + case '\"': APPEND_STRING("\\\""); break; + case '\\': APPEND_STRING("\\\\"); break; + case '/': APPEND_STRING("\\/"); break; /* to make json embeddable in xml\/html */ + case '\b': APPEND_STRING("\\b"); break; + case '\f': APPEND_STRING("\\f"); break; + case '\n': APPEND_STRING("\\n"); break; + case '\r': APPEND_STRING("\\r"); break; + case '\t': APPEND_STRING("\\t"); break; + default: + if (buf != NULL) { + buf[0] = c; + buf += 1; + } + written_total += 1; + break; + } + } + APPEND_STRING("\""); + return written_total; +} + +static int append_indent(char *buf, int level) { + int i; + int written = -1, written_total = 0; + for (i = 0; i < level; i++) { + APPEND_STRING(" "); + } + return written_total; +} + +static int append_string(char *buf, const char *string) { + if (buf == NULL) { + return (int)strlen(string); + } + return sprintf(buf, "%s", string); +} + +#undef APPEND_STRING +#undef APPEND_INDENT + /* Parser API */ JSON_Value * json_parse_file(const char *filename) { char *file_contents = read_file(filename); JSON_Value *output_value = NULL; - if (!file_contents) + if (file_contents == NULL) return NULL; output_value = json_parse_string(file_contents); parson_free(file_contents); @@ -611,7 +894,7 @@ JSON_Value * json_parse_file(const char *filename) { JSON_Value * json_parse_file_with_comments(const char *filename) { char *file_contents = read_file(filename); JSON_Value *output_value = NULL; - if (!file_contents) + if (file_contents == NULL) return NULL; output_value = json_parse_string_with_comments(file_contents); parson_free(file_contents); @@ -619,7 +902,10 @@ JSON_Value * json_parse_file_with_comments(const char *filename) { } JSON_Value * json_parse_string(const char *string) { - if (!string || (*string != '{' && *string != '[')) + if (string == NULL) + return NULL; + SKIP_WHITESPACES(&string); + if (*string != '{' && *string != '[') return NULL; return parse_value((const char**)&string, 0); } @@ -627,13 +913,13 @@ JSON_Value * json_parse_string(const char *string) { JSON_Value * json_parse_string_with_comments(const char *string) { JSON_Value *result = NULL; char *string_mutable_copy = NULL, *string_mutable_copy_ptr = NULL; - string_mutable_copy = parson_strndup(string, strlen(string)); - if (!string_mutable_copy) + string_mutable_copy = parson_strdup(string); + if (string_mutable_copy == NULL) return NULL; remove_comments(string_mutable_copy, "/*", "*/"); remove_comments(string_mutable_copy, "//", "\n"); string_mutable_copy_ptr = string_mutable_copy; - skip_whitespaces(&string_mutable_copy_ptr); + SKIP_WHITESPACES(&string_mutable_copy_ptr); if (*string_mutable_copy_ptr != '{' && *string_mutable_copy_ptr != '[') { parson_free(string_mutable_copy); return NULL; @@ -647,6 +933,8 @@ JSON_Value * json_parse_string_with_comments(const char *string) { /* JSON Object API */ JSON_Value * json_object_get_value(const JSON_Object *object, const char *name) { + if (object == NULL || name == NULL) + return NULL; return json_object_nget_value(object, name, strlen(name)); } @@ -780,3 +1068,698 @@ void json_value_free(JSON_Value *value) { } parson_free(value); } + +JSON_Value * json_value_init_object(void) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONObject; + new_value->value.object = json_object_init(); + if (!new_value->value.object) { + parson_free(new_value); + return NULL; + } + return new_value; +} + +JSON_Value * json_value_init_array(void) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONArray; + new_value->value.array = json_array_init(); + if (!new_value->value.array) { + parson_free(new_value); + return NULL; + } + return new_value; +} + +JSON_Value * json_value_init_string(const char *string) { + char *copy = NULL; + JSON_Value *value; + size_t string_len = 0; + if (string == NULL) + return NULL; + string_len = strlen(string); + if (!is_valid_utf8(string, string_len)) + return NULL; + copy = parson_strndup(string, string_len); + if (copy == NULL) + return NULL; + value = json_value_init_string_no_copy(copy); + if (value == NULL) + parson_free(copy); + return value; +} + +JSON_Value * json_value_init_number(double number) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONNumber; + new_value->value.number = number; + return new_value; +} + +JSON_Value * json_value_init_boolean(int boolean) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONBoolean; + new_value->value.boolean = boolean ? 1 : 0; + return new_value; +} + +JSON_Value * json_value_init_null(void) { + JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value)); + if (!new_value) + return NULL; + new_value->type = JSONNull; + return new_value; +} + +JSON_Value * json_value_deep_copy(const JSON_Value *value) { + size_t i = 0; + JSON_Value *return_value = NULL, *temp_value_copy = NULL, *temp_value = NULL; + const char *temp_string = NULL, *temp_key = NULL; + char *temp_string_copy = NULL; + JSON_Array *temp_array = NULL, *temp_array_copy = NULL; + JSON_Object *temp_object = NULL, *temp_object_copy = NULL; + + switch (json_value_get_type(value)) { + case JSONArray: + temp_array = json_value_get_array(value); + return_value = json_value_init_array(); + if (return_value == NULL) + return NULL; + temp_array_copy = json_value_get_array(return_value); + for (i = 0; i < json_array_get_count(temp_array); i++) { + temp_value = json_array_get_value(temp_array, i); + temp_value_copy = json_value_deep_copy(temp_value); + if (temp_value_copy == NULL) { + json_value_free(return_value); + return NULL; + } + if (json_array_add(temp_array_copy, temp_value_copy) == JSONFailure) { + json_value_free(return_value); + json_value_free(temp_value_copy); + return NULL; + } + } + return return_value; + case JSONObject: + temp_object = json_value_get_object(value); + return_value = json_value_init_object(); + if (return_value == NULL) + return NULL; + temp_object_copy = json_value_get_object(return_value); + for (i = 0; i < json_object_get_count(temp_object); i++) { + temp_key = json_object_get_name(temp_object, i); + temp_value = json_object_get_value(temp_object, temp_key); + temp_value_copy = json_value_deep_copy(temp_value); + if (temp_value_copy == NULL) { + json_value_free(return_value); + return NULL; + } + if (json_object_add(temp_object_copy, temp_key, temp_value_copy) == JSONFailure) { + json_value_free(return_value); + json_value_free(temp_value_copy); + return NULL; + } + } + return return_value; + case JSONBoolean: + return json_value_init_boolean(json_value_get_boolean(value)); + case JSONNumber: + return json_value_init_number(json_value_get_number(value)); + case JSONString: + temp_string = json_value_get_string(value); + temp_string_copy = parson_strdup(temp_string); + if (temp_string_copy == NULL) + return NULL; + return_value = json_value_init_string_no_copy(temp_string_copy); + if (return_value == NULL) + parson_free(temp_string_copy); + return return_value; + case JSONNull: + return json_value_init_null(); + case JSONError: + return NULL; + default: + return NULL; + } +} + +size_t json_serialization_size(const JSON_Value *value) { + char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */ + int res = json_serialize_to_buffer_r(value, NULL, 0, 0, num_buf); + return res < 0 ? 0 : (size_t)(res + 1); +} + +JSON_Status json_serialize_to_buffer(const JSON_Value *value, char *buf, size_t buf_size_in_bytes) { + int written = -1; + size_t needed_size_in_bytes = json_serialization_size(value); + if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) { + return JSONFailure; + } + written = json_serialize_to_buffer_r(value, buf, 0, 0, NULL); + if (written < 0) + return JSONFailure; + return JSONSuccess; +} + +JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename) { + JSON_Status return_code = JSONSuccess; + FILE *fp = NULL; + char *serialized_string = json_serialize_to_string(value); + if (serialized_string == NULL) { + return JSONFailure; + } + fp = fopen (filename, "w"); + if (fp != NULL) { + if (fputs (serialized_string, fp) == EOF) { + return_code = JSONFailure; + } + if (fclose (fp) == EOF) { + return_code = JSONFailure; + } + } + json_free_serialized_string(serialized_string); + return return_code; +} + +char * json_serialize_to_string(const JSON_Value *value) { + JSON_Status serialization_result = JSONFailure; + size_t buf_size_bytes = json_serialization_size(value); + char *buf = NULL; + if (buf_size_bytes == 0) { + return NULL; + } + buf = (char*)parson_malloc(buf_size_bytes); + if (buf == NULL) + return NULL; + serialization_result = json_serialize_to_buffer(value, buf, buf_size_bytes); + if (serialization_result == JSONFailure) { + json_free_serialized_string(buf); + return NULL; + } + return buf; +} + +size_t json_serialization_size_pretty(const JSON_Value *value) { + char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */ + int res = json_serialize_to_buffer_r(value, NULL, 0, 1, num_buf); + return res < 0 ? 0 : (size_t)(res + 1); +} + +JSON_Status json_serialize_to_buffer_pretty(const JSON_Value *value, char *buf, size_t buf_size_in_bytes) { + int written = -1; + size_t needed_size_in_bytes = json_serialization_size_pretty(value); + if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) + return JSONFailure; + written = json_serialize_to_buffer_r(value, buf, 0, 1, NULL); + if (written < 0) + return JSONFailure; + return JSONSuccess; +} + +JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename) { + JSON_Status return_code = JSONSuccess; + FILE *fp = NULL; + char *serialized_string = json_serialize_to_string_pretty(value); + if (serialized_string == NULL) { + return JSONFailure; + } + fp = fopen (filename, "w"); + if (fp != NULL) { + if (fputs (serialized_string, fp) == EOF) { + return_code = JSONFailure; + } + if (fclose (fp) == EOF) { + return_code = JSONFailure; + } + } + json_free_serialized_string(serialized_string); + return return_code; +} + +char * json_serialize_to_string_pretty(const JSON_Value *value) { + JSON_Status serialization_result = JSONFailure; + size_t buf_size_bytes = json_serialization_size_pretty(value); + char *buf = NULL; + if (buf_size_bytes == 0) { + return NULL; + } + buf = (char*)parson_malloc(buf_size_bytes); + if (buf == NULL) + return NULL; + serialization_result = json_serialize_to_buffer_pretty(value, buf, buf_size_bytes); + if (serialization_result == JSONFailure) { + json_free_serialized_string(buf); + return NULL; + } + return buf; +} + +void json_free_serialized_string(char *string) { + parson_free(string); +} + +JSON_Status json_array_remove(JSON_Array *array, size_t ix) { + JSON_Value *temp_value = NULL; + size_t last_element_ix = 0; + if (array == NULL || ix >= json_array_get_count(array)) { + return JSONFailure; + } + last_element_ix = json_array_get_count(array) - 1; + json_value_free(json_array_get_value(array, ix)); + if (ix != last_element_ix) { /* Replace value with one from the end of array */ + temp_value = json_array_get_value(array, last_element_ix); + if (temp_value == NULL) { + return JSONFailure; + } + array->items[ix] = temp_value; + } + array->count -= 1; + return JSONSuccess; +} + +JSON_Status json_array_replace_value(JSON_Array *array, size_t ix, JSON_Value *value) { + if (array == NULL || value == NULL || ix >= json_array_get_count(array)) { + return JSONFailure; + } + json_value_free(json_array_get_value(array, ix)); + array->items[ix] = value; + return JSONSuccess; +} + +JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string) { + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number) { + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean) { + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_replace_null(JSON_Array *array, size_t i) { + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_clear(JSON_Array *array) { + size_t i = 0; + if (array == NULL) + return JSONFailure; + for (i = 0; i < json_array_get_count(array); i++) { + json_value_free(json_array_get_value(array, i)); + } + array->count = 0; + return JSONSuccess; +} + +JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value) { + if (array == NULL || value == NULL) + return JSONFailure; + return json_array_add(array, value); +} + +JSON_Status json_array_append_string(JSON_Array *array, const char *string) { + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_append_number(JSON_Array *array, double number) { + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_append_boolean(JSON_Array *array, int boolean) { + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_array_append_null(JSON_Array *array) { + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value) { + size_t i = 0; + JSON_Value *old_value; + if (object == NULL || name == NULL || value == NULL) + return JSONFailure; + old_value = json_object_get_value(object, name); + if (old_value != NULL) { /* free and overwrite old value */ + json_value_free(old_value); + for (i = 0; i < json_object_get_count(object); i++) { + if (strcmp(object->names[i], name) == 0) { + object->values[i] = value; + return JSONSuccess; + } + } + } + /* add new key value pair */ + return json_object_add(object, name, value); +} + +JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string) { + return json_object_set_value(object, name, json_value_init_string(string)); +} + +JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number) { + return json_object_set_value(object, name, json_value_init_number(number)); +} + +JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean) { + return json_object_set_value(object, name, json_value_init_boolean(boolean)); +} + +JSON_Status json_object_set_null(JSON_Object *object, const char *name) { + return json_object_set_value(object, name, json_value_init_null()); +} + +JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value) { + const char *dot_pos = NULL; + char *current_name = NULL; + JSON_Object *temp_obj = NULL; + JSON_Value *new_value = NULL; + if (value == NULL || name == NULL || value == NULL) + return JSONFailure; + dot_pos = strchr(name, '.'); + if (dot_pos == NULL) { + return json_object_set_value(object, name, value); + } else { + current_name = parson_strndup(name, dot_pos - name); + temp_obj = json_object_get_object(object, current_name); + if (temp_obj == NULL) { + new_value = json_value_init_object(); + if (new_value == NULL) { + parson_free(current_name); + return JSONFailure; + } + if (json_object_add(object, current_name, new_value) == JSONFailure) { + json_value_free(new_value); + parson_free(current_name); + return JSONFailure; + } + temp_obj = json_object_get_object(object, current_name); + } + parson_free(current_name); + return json_object_dotset_value(temp_obj, dot_pos + 1, value); + } +} + +JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string) { + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number) { + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean) { + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_dotset_null(JSON_Object *object, const char *name) { + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; +} + +JSON_Status json_object_remove(JSON_Object *object, const char *name) { + size_t i = 0, last_item_index = 0; + if (object == NULL || json_object_get_value(object, name) == NULL) + return JSONFailure; + last_item_index = json_object_get_count(object) - 1; + for (i = 0; i < json_object_get_count(object); i++) { + if (strcmp(object->names[i], name) == 0) { + parson_free(object->names[i]); + json_value_free(object->values[i]); + if (i != last_item_index) { /* Replace key value pair with one from the end */ + object->names[i] = object->names[last_item_index]; + object->values[i] = object->values[last_item_index]; + } + object->count -= 1; + return JSONSuccess; + } + } + return JSONFailure; /* No execution path should end here */ +} + +JSON_Status json_object_dotremove(JSON_Object *object, const char *name) { + const char *dot_pos = strchr(name, '.'); + char *current_name = NULL; + JSON_Object *temp_obj = NULL; + if (dot_pos == NULL) { + return json_object_remove(object, name); + } else { + current_name = parson_strndup(name, dot_pos - name); + temp_obj = json_object_get_object(object, current_name); + if (temp_obj == NULL) { + parson_free(current_name); + return JSONFailure; + } + parson_free(current_name); + return json_object_dotremove(temp_obj, dot_pos + 1); + } +} + +JSON_Status json_object_clear(JSON_Object *object) { + size_t i = 0; + if (object == NULL) { + return JSONFailure; + } + for (i = 0; i < json_object_get_count(object); i++) { + parson_free(object->names[i]); + json_value_free(object->values[i]); + } + object->count = 0; + return JSONSuccess; +} + +JSON_Status json_validate(const JSON_Value *schema, const JSON_Value *value) { + JSON_Value *temp_schema_value = NULL, *temp_value = NULL; + JSON_Array *schema_array = NULL, *value_array = NULL; + JSON_Object *schema_object = NULL, *value_object = NULL; + JSON_Value_Type schema_type = JSONError, value_type = JSONError; + const char *key = NULL; + size_t i = 0, count = 0; + if (schema == NULL || value == NULL) + return JSONFailure; + schema_type = json_value_get_type(schema); + value_type = json_value_get_type(value); + if (schema_type != value_type && schema_type != JSONNull) /* null represents all values */ + return JSONFailure; + switch (schema_type) { + case JSONArray: + schema_array = json_value_get_array(schema); + value_array = json_value_get_array(value); + count = json_array_get_count(schema_array); + if (count == 0) + return JSONSuccess; /* Empty array allows all types */ + /* Get first value from array, rest is ignored */ + temp_schema_value = json_array_get_value(schema_array, 0); + for (i = 0; i < json_array_get_count(value_array); i++) { + temp_value = json_array_get_value(value_array, i); + if (json_validate(temp_schema_value, temp_value) == 0) { + return JSONFailure; + } + } + return JSONSuccess; + case JSONObject: + schema_object = json_value_get_object(schema); + value_object = json_value_get_object(value); + count = json_object_get_count(schema_object); + if (count == 0) + return JSONSuccess; /* Empty object allows all objects */ + else if (json_object_get_count(value_object) < count) + return JSONFailure; /* Tested object mustn't have less name-value pairs than schema */ + for (i = 0; i < count; i++) { + key = json_object_get_name(schema_object, i); + temp_schema_value = json_object_get_value(schema_object, key); + temp_value = json_object_get_value(value_object, key); + if (temp_value == NULL) + return JSONFailure; + if (json_validate(temp_schema_value, temp_value) == JSONFailure) + return JSONFailure; + } + return JSONSuccess; + case JSONString: case JSONNumber: case JSONBoolean: case JSONNull: + return JSONSuccess; /* equality already tested before switch */ + case JSONError: default: + return JSONFailure; + } +} + +JSON_Status json_value_equals(const JSON_Value *a, const JSON_Value *b) { + JSON_Object *a_object = NULL, *b_object = NULL; + JSON_Array *a_array = NULL, *b_array = NULL; + const char *a_string = NULL, *b_string = NULL; + const char *key = NULL; + size_t a_count = 0, b_count = 0, i = 0; + JSON_Value_Type a_type, b_type; + a_type = json_value_get_type(a); + b_type = json_value_get_type(b); + if (a_type != b_type) { + return 0; + } + switch (a_type) { + case JSONArray: + a_array = json_value_get_array(a); + b_array = json_value_get_array(b); + a_count = json_array_get_count(a_array); + b_count = json_array_get_count(b_array); + if (a_count != b_count) { + return 0; + } + for (i = 0; i < a_count; i++) { + if (!json_value_equals(json_array_get_value(a_array, i), + json_array_get_value(b_array, i))) { + return 0; + } + } + return 1; + case JSONObject: + a_object = json_value_get_object(a); + b_object = json_value_get_object(b); + a_count = json_object_get_count(a_object); + b_count = json_object_get_count(b_object); + if (a_count != b_count) { + return 0; + } + for (i = 0; i < a_count; i++) { + key = json_object_get_name(a_object, i); + if (!json_value_equals(json_object_get_value(a_object, key), + json_object_get_value(b_object, key))) { + return 0; + } + } + return 1; + case JSONString: + a_string = json_value_get_string(a); + b_string = json_value_get_string(b); + return strcmp(a_string, b_string) == 0; + case JSONBoolean: + return json_value_get_boolean(a) == json_value_get_boolean(b); + case JSONNumber: + return fabs(json_value_get_number(a) - json_value_get_number(b)) < 0.000001; /* EPSILON */ + case JSONError: + return 1; + case JSONNull: + return 1; + default: + return 1; + } +} + +JSON_Value_Type json_type(const JSON_Value *value) { + return json_value_get_type(value); +} + +JSON_Object * json_object (const JSON_Value *value) { + return json_value_get_object(value); +} + +JSON_Array * json_array (const JSON_Value *value) { + return json_value_get_array(value); +} + +const char * json_string (const JSON_Value *value) { + return json_value_get_string(value); +} + +double json_number (const JSON_Value *value) { + return json_value_get_number(value); +} + +int json_boolean(const JSON_Value *value) { + return json_value_get_boolean(value); +} + +void json_set_allocation_functions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun) { + parson_malloc = malloc_fun; + parson_free = free_fun; +} diff --git a/util_pkt_logger/src/util_pkt_logger.c b/util_pkt_logger/src/util_pkt_logger.c index d95b2e39..38a50f70 100644 --- a/util_pkt_logger/src/util_pkt_logger.c +++ b/util_pkt_logger/src/util_pkt_logger.c @@ -132,8 +132,9 @@ int parse_SX1301_configuration(const char * conf_file) { } MSG("INFO: lorawan_public %d, clksrc %d\n", boardconf.lorawan_public, boardconf.clksrc); /* all parameters parsed, submitting configuration to the HAL */ - if (lgw_board_setconf(boardconf) != LGW_HAL_SUCCESS) { - MSG("WARNING: Failed to configure board\n"); + if (lgw_board_setconf(boardconf) != LGW_HAL_SUCCESS) { + MSG("ERROR: Failed to configure board\n"); + return -1; } /* set configuration for RF chains */ @@ -173,14 +174,20 @@ int parse_SX1301_configuration(const char * conf_file) { val = json_object_dotget_value(conf, param_name); if (json_value_get_type(val) == JSONBoolean) { rfconf.tx_enable = (bool)json_value_get_boolean(val); + if (rfconf.tx_enable == true) { + /* tx notch filter frequency to be set */ + snprintf(param_name, sizeof param_name, "radio_%i.tx_notch_freq", i); + rfconf.tx_notch_freq = (uint32_t)json_object_dotget_number(conf, param_name); + } } else { rfconf.tx_enable = false; } - MSG("INFO: radio %i enabled (type %s), center frequency %u, RSSI offset %f, tx enabled %d\n", i, str, rfconf.freq_hz, rfconf.rssi_offset, rfconf.tx_enable); + MSG("INFO: radio %i enabled (type %s), center frequency %u, RSSI offset %f, tx enabled %d, tx_notch_freq %u\n", i, str, rfconf.freq_hz, rfconf.rssi_offset, rfconf.tx_enable, rfconf.tx_notch_freq); } /* all parameters parsed, submitting configuration to the HAL */ if (lgw_rxrf_setconf(i, rfconf) != LGW_HAL_SUCCESS) { - MSG("WARNING: invalid configuration for radio %i\n", i); + MSG("ERROR: invalid configuration for radio %i\n", i); + return -1; } } @@ -213,7 +220,8 @@ int parse_SX1301_configuration(const char * conf_file) { } /* all parameters parsed, submitting configuration to the HAL */ if (lgw_rxif_setconf(i, ifconf) != LGW_HAL_SUCCESS) { - MSG("WARNING: invalid configuration for LoRa multi-SF channel %i\n", i); + MSG("ERROR: invalid configuration for Lora multi-SF channel %i\n", i); + return -1; } } @@ -254,7 +262,8 @@ int parse_SX1301_configuration(const char * conf_file) { MSG("INFO: LoRa standard channel enabled, radio %i selected, IF %i Hz, %u Hz bandwidth, SF %u\n", ifconf.rf_chain, ifconf.freq_hz, bw, sf); } if (lgw_rxif_setconf(8, ifconf) != LGW_HAL_SUCCESS) { - MSG("WARNING: invalid configuration for LoRa standard channel\n"); + MSG("ERROR: invalid configuration for Lora standard channel\n"); + return -1; } } @@ -288,7 +297,8 @@ int parse_SX1301_configuration(const char * conf_file) { MSG("INFO: FSK channel enabled, radio %i selected, IF %i Hz, %u Hz bandwidth, %u bps datarate\n", ifconf.rf_chain, ifconf.freq_hz, bw, ifconf.datarate); } if (lgw_rxif_setconf(9, ifconf) != LGW_HAL_SUCCESS) { - MSG("WARNING: invalid configuration for FSK channel\n"); + MSG("ERROR: invalid configuration for FSK channel\n"); + return -1; } } json_value_free(root_val); diff --git a/util_spectral_scan/readme.md b/util_spectral_scan/readme.md index 2befdb7a..6bcd33eb 100644 --- a/util_spectral_scan/readme.md +++ b/util_spectral_scan/readme.md @@ -27,6 +27,11 @@ mode to optimize the matching impedance with SX127x. The 32MHz clock provided to the SX127x is available once SX1301 has enabled the two SX1257 radios, so the background RSSI scan must be launched after the packet forwarder. +Note: if the FPGA running the spectral scan also supports Listen-Before-Talk +feature (LBT), the LBT feature has to be enabled and running before launching +util_spectral_scan. For example, if the lora_pkt_fwd runs in background, it has +to use a global_conf.json file with "lbt_cfg.enable" set to true. + 2. Command line options ------------------------ @@ -37,33 +42,38 @@ will display a short help Frequency vector to scan in MHz: start:step:stop Valid range: start > 800, step > 0.005, stop < 1000 +`-b` +Channel bandwidth to be used to configure the SX1272x radio for scanning in KHz +Valid values: [25,50,100,125,200,250,500] + `-n` Total number of RSSI points. -Valid range: [1,65535] - -`-r` -Divide factor of RSSI sampling rate, which is 32MHz/(div+1030) -Valid range: [1,65535] +Valid range: [1..65535] `-l` Log file name +Note: For FPGA image that provides LBT support, the spectral scan gets less +flexible. The following parameters have constraints: + - Frequency step: has to be multiple of 100KHz + - Channel bandwidth: hardcoded to 200KHz + - Number of RSSI points: 16641 -3. Use -------- +3. Usage +--------- The format of the log file is the following: Freq_1, RSSI_1, histo_1, ...., RSSI_128, histo_128 Freq_2, RSSI_1, histo_1, ...., RSSI_128, histo_128 ... -RSSI_n is the nth value of RSSI in dBm, starting at -142 dBm +RSSI_n is the nth value of RSSI in dBm Default setup: - freq 863 : 0.2 : 870 - 65535 RSSI points in total at 32kHz rate -- FTDI SPI interface +- 125KHz channel bandwidth -Example with frequencies from 865 MHz to 870 MHz, by step of 1MHz, -2500 RSSI points processed at 10kHz rate, saved in "log.csv": -./util_spectral_scan -f 865:1:870 -n 2500 -r 20170 -l "log" +Example with frequencies from 865 MHz to 870 MHz, by step of 100KHz, BW 200KHz +10000 RSSI points processed at 10kHz rate, saved in "log.csv": +./util_spectral_scan -f 865:0.1:870 -n 10000 -b 200 -l "log" diff --git a/util_spectral_scan/src/util_spectral_scan.c b/util_spectral_scan/src/util_spectral_scan.c index 71239ed2..d2aecda7 100644 --- a/util_spectral_scan/src/util_spectral_scan.c +++ b/util_spectral_scan/src/util_spectral_scan.c @@ -11,7 +11,7 @@ SX1301 spectral scan License: Revised BSD License, see LICENSE.TXT file include in the project -Maintainer: Matthieu Leurent +Maintainer: Michael Coracin */ @@ -42,19 +42,26 @@ Maintainer: Matthieu Leurent #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) -#define DEFAULT_START_FREQ 863000000 /* start frequency, Hz */ -#define DEFAULT_STOP_FREQ 870000000 /* stop frequency, Hz */ -#define DEFAULT_STEP_FREQ 200000 /* frequency step, Hz */ -#define DEFAULT_RSSI_PTS 65535 /* number of RSSI reads */ -#define DEFAULT_RSSI_RATE_DIV 1 /* RSSI sampling rate = 32MHz/(div+1030)*/ -#define DEFAULT_LOG_NAME "rssi_histogram" +#define DEFAULT_START_FREQ 863000000 /* start frequency, Hz */ +#define DEFAULT_STOP_FREQ 870000000 /* stop frequency, Hz */ +#define DEFAULT_STEP_FREQ 200000 /* frequency step, Hz */ +#define DEFAULT_RSSI_PTS 65535 /* number of RSSI reads */ +#define DEFAULT_CHAN_BW LGW_SX127X_RXBW_62K5_HZ /* channel bandwidth */ +#define DEFAULT_LOG_NAME "rssi_histogram" +#define DEFAULT_SX127X_RSSI_OFFSET -4 -#define RSSI_RANGE 256 -#define RSSI_OFFSET -135 +#define RSSI_RANGE 256 -#define MAX_FREQ 1000000000 -#define MIN_FREQ 800000000 -#define MIN_STEP_FREQ 5000 +#define MAX_FREQ 1000000000 +#define MIN_FREQ 800000000 +#define MIN_STEP_FREQ 5000 + +#define FPGA_FEATURE_SPECTRAL_SCAN 1 +#define FPGA_FEATURE_LBT 2 + +/* When FPGA supports LBT, there are few more constraints on above constants */ +#define LBT_DEFAULT_RSSI_PTS 129*129 /* number of RSSI reads, hard-coded in FPGA*/ +#define LBT_MIN_STEP_FREQ 100000 /* -------------------------------------------------------------------------- */ /* --- GLOBAL VARIABLES ----------------------------------------------------- */ @@ -71,19 +78,25 @@ int main( int argc, char ** argv ) /* Parameter parsing */ double arg_lf[3] = {0,0,0}; unsigned arg_u = 0; + int arg_i = 0; char arg_s[64]; /* Application parameters */ + uint32_t init_freq = DEFAULT_START_FREQ; uint32_t start_freq = DEFAULT_START_FREQ; uint32_t stop_freq = DEFAULT_STOP_FREQ; uint32_t step_freq = DEFAULT_STEP_FREQ; uint16_t rssi_pts = DEFAULT_RSSI_PTS; - uint16_t rssi_rate_div = DEFAULT_RSSI_RATE_DIV; + int8_t rssi_offset = DEFAULT_SX127X_RSSI_OFFSET; + enum lgw_sx127x_rxbw_e channel_bw_khz = DEFAULT_CHAN_BW; char log_file_name[64] = DEFAULT_LOG_NAME; FILE * log_file = NULL; /* Local var */ + bool lbt_support = false; + int freq_idx; int freq_nb; + uint64_t freq_reg; uint32_t freq; uint8_t read_burst[RSSI_RANGE*2]; uint16_t rssi_histo; @@ -91,182 +104,295 @@ int main( int argc, char ** argv ) float rssi_thresh[] = {0.1,0.3,0.5,0.8,1}; /* Parse command line options */ - while( (i = getopt( argc, argv, "hud::f:n:r:l:" )) != -1 ) - { - switch( i ) - { + while((i = getopt(argc, argv, "hf:n:b:l:o:")) != -1) { + switch (i) { case 'h': - printf( "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" ); - printf( " -f :: Frequency vector to scan in MHz (start:step:stop)\n" ); - printf( " start>%3.3f step>%1.3f stop<%3.3f\n", MIN_FREQ/1e6, MIN_STEP_FREQ/1e6, MAX_FREQ/1e6 ); - printf( " -n Total number of RSSI points, [1,65535]\n" ); - printf( " -r Divide factor of RSSI sampling rate, 32MHz/(div+1030), [1,65535]\n" ); - printf( " -l Log file name\n" ); - printf( "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" ); + printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); + printf(" -f :: Frequency vector to scan in MHz (start:step:stop)\n"); + printf(" start>%3.3f step>%1.3f stop<%3.3f\n", MIN_FREQ/1e6, MIN_STEP_FREQ/1e6, MAX_FREQ/1e6); + printf(" -b Channel bandwidth in KHz [25,50,100,125,200,250,500]\n"); + printf(" -n Total number of RSSI points [1..65535]\n"); + printf(" -o Offset in dB to be applied to the SX127x RSSI [-128..127]\n"); + printf(" -l Log file name\n"); + printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); return EXIT_SUCCESS; - break; case 'f': /* -f :: Frequency vector to scan in MHz, start:step:stop */ - j = sscanf( optarg, "%lf:%lf:%lf", &arg_lf[0], &arg_lf[1], &arg_lf[2] ); - if( (j!=3) || (arg_lf[0] < MIN_FREQ/1e6) || (arg_lf[0] > MAX_FREQ/1e6) || (arg_lf[1] < MIN_STEP_FREQ/1e6) || (arg_lf[2] < MIN_FREQ/1e6) || (arg_lf[2] > MAX_FREQ/1e6) ) - { - printf( "ERROR: argument parsing of -f argument. -h for help.\n" ); + j = sscanf(optarg, "%lf:%lf:%lf", &arg_lf[0], &arg_lf[1], &arg_lf[2]); + if ((j!=3) || (arg_lf[0] < MIN_FREQ/1e6) || (arg_lf[0] > MAX_FREQ/1e6) || (arg_lf[1] < MIN_STEP_FREQ/1e6) || (arg_lf[2] < MIN_FREQ/1e6) || (arg_lf[2] > MAX_FREQ/1e6)) { + printf("ERROR: argument parsing of -f argument. -h for help.\n"); return EXIT_FAILURE; - } - else - { + } else { start_freq = (uint32_t)((arg_lf[0] * 1e6) + 0.5); /* .5 Hz offset to get rounding instead of truncating */ step_freq = (uint32_t)((arg_lf[1] * 1e6) + 0.5); /* .5 Hz offset to get rounding instead of truncating */ stop_freq = (uint32_t)((arg_lf[2] * 1e6) + 0.5); /* .5 Hz offset to get rounding instead of truncating */ } break; - case 'n': /* -n Total number of RSSI points, [1,65535] */ - j = sscanf( optarg, "%i", &arg_u ); - if( (j != 1) || (arg_u < 1) || (arg_u > 65535) ) - { - printf( "ERROR: argument parsing of -n argument. -h for help.\n" ); + case 'b': /* -b Channel bandwidth in KHz [25,50,100,125,200,250,500] */ + j = sscanf(optarg, "%u", &arg_u); + if (j != 1) { + printf("ERROR: argument parsing of -b argument. -h for help.\n"); return EXIT_FAILURE; + } else { + switch (arg_u) { + case 25: + channel_bw_khz = LGW_SX127X_RXBW_12K5_HZ; + break; + case 50: + channel_bw_khz = LGW_SX127X_RXBW_25K_HZ; + break; + case 100: + channel_bw_khz = LGW_SX127X_RXBW_50K_HZ; + break; + case 125: + channel_bw_khz = LGW_SX127X_RXBW_62K5_HZ; + break; + case 200: + channel_bw_khz = LGW_SX127X_RXBW_100K_HZ; + break; + case 250: + channel_bw_khz = LGW_SX127X_RXBW_125K_HZ; + break; + case 500: + channel_bw_khz = LGW_SX127X_RXBW_250K_HZ; + break; + default: + printf("ERROR: argument parsing of -b argument. -h for help.\n"); + return EXIT_FAILURE; + } } - else - { + break; + + case 'n': /* -n Total number of RSSI points [1..65535] */ + j = sscanf(optarg, "%u", &arg_u); + if ((j != 1) || (arg_u < 1) || (arg_u > 65535)) { + printf("ERROR: argument parsing of -n argument. -h for help.\n"); + return EXIT_FAILURE; + } else { rssi_pts = (uint16_t)arg_u; } break; - case 'r': /* -r Divide factor of RSSI sampling rate, 32MHz/(div+1030), [1,65535] */ - j = sscanf( optarg, "%i", &arg_u ); - if( (j != 1) || (arg_u < 1) || (arg_u > 65535) ) - { - printf( "ERROR: argument parsing of -r argument. -h for help.\n" ); + case 'o': /* -o SX127x RSSI offset [-128..127] */ + j = sscanf(optarg, "%i", &arg_i); + if ((j != 1) || (arg_i < -128) || (arg_i > 127)) { + printf("ERROR: argument parsing of -o argument. -h for help.\n"); return EXIT_FAILURE; - } - else - { - rssi_rate_div = (uint16_t)arg_u; + } else { + rssi_offset = (int8_t)arg_i; } break; case 'l': /* -l Log file name */ - j = sscanf( optarg, "%s", arg_s ); - if( j != 1 ) - { - printf( "ERROR: argument parsing of -l argument. -h for help.\n" ); + j = sscanf(optarg, "%s", arg_s); + if (j != 1) { + printf("ERROR: argument parsing of -l argument. -h for help.\n"); return EXIT_FAILURE; - } - else - { + } else { sprintf(log_file_name, "%s", arg_s); } break; default: - printf( "ERROR: argument parsing options. -h for help.\n" ); + printf("ERROR: argument parsing options. -h for help.\n"); return EXIT_FAILURE; } } /* Start message */ - printf( "+++ Start spectral scan of LoRa gateway channels +++\n" ); + printf("+++ Start spectral scan of LoRa gateway channels +++\n"); - x = lgw_connect( ); - if( x != 0 ) - { - printf( "ERROR: Failed to connect to FPGA\n" ); + x = lgw_connect(true, 0); /* SPI only, no FPGA reset/configure (for now) */ + if(x != 0) { + printf("ERROR: Failed to connect to FPGA\n"); return EXIT_FAILURE; } /* Check if FPGA supports Spectral Scan */ - lgw_fpga_reg_r(LGW_FPGA_FPGA_FEATURE, ®_val); - if (TAKE_N_BITS_FROM((uint8_t)reg_val, 1, 1) != true) { + lgw_fpga_reg_r(LGW_FPGA_FEATURE, ®_val); + if (TAKE_N_BITS_FROM((uint8_t)reg_val, FPGA_FEATURE_SPECTRAL_SCAN, 1) != true) { printf("ERROR: Spectral Scan is not supported (0x%x)\n", (uint8_t)reg_val); return EXIT_FAILURE; } - /* Configure FPGA */ - x = lgw_fpga_reg_w(LGW_FPGA_HISTO_TEMPO, rssi_rate_div); - x |= lgw_fpga_reg_w(LGW_FPGA_HISTO_NB_READ, rssi_pts); - if( x != LGW_REG_SUCCESS ) - { - printf( "ERROR: Failed to configure FPGA\n" ); - return EXIT_FAILURE; + /* Check if FPGA supports LBT, in order to apply proper constraints on spectral scan parameters */ + lgw_fpga_reg_r(LGW_FPGA_FEATURE, ®_val); + if (TAKE_N_BITS_FROM((uint8_t)reg_val, FPGA_FEATURE_LBT, 1) == true) { + printf("WARNING: The FPGA supports LBT, so running spectral scan with specific constraints\n"); + printf(" => Check the parameters summary below\n"); + /* Get start frequency from FPGA */ + lgw_fpga_reg_r(LGW_FPGA_LBT_INITIAL_FREQ, ®_val); + switch (reg_val) { + case 0: + init_freq = 915000000; + break; + case 1: + init_freq = 863000000; + break; + default: + printf("ERROR: init frequency %d is not supported\n", reg_val); + return EXIT_FAILURE; + } + + /* Check parameters based on LBT constraints */ + if (start_freq < init_freq) { + printf("ERROR: start frequency %d is not supported, should be >=%d\n", start_freq, init_freq); + return EXIT_FAILURE; + } + if (stop_freq > (init_freq + 255*LBT_MIN_STEP_FREQ)) { + printf("ERROR: stop frequency %d is not supported, should be <%d\n", stop_freq, init_freq + 255*LBT_MIN_STEP_FREQ); + return EXIT_FAILURE; + } + if (step_freq < LBT_MIN_STEP_FREQ) { + printf("ERROR: step frequency %d is not supported, should be >=%d\n", step_freq, LBT_MIN_STEP_FREQ); + return EXIT_FAILURE; + } else { + /* Ensure the given step is a multiple of LBT_MIN_STEP_FREQ */ + step_freq = (step_freq / LBT_MIN_STEP_FREQ) * LBT_MIN_STEP_FREQ; + } + + /* Overload hard-coded spectral scan parameters */ + rssi_pts = LBT_DEFAULT_RSSI_PTS; + + /* Spectral scan sequence is slightly different depending if LBT is there or not */ + lbt_support = true; + } else { + /* Reconnect to FPGA with sw reset and configure */ + x = lgw_disconnect(); + if(x != 0) { + printf("ERROR: Failed to disconnect from FPGA\n"); + return EXIT_FAILURE; + } + x = lgw_connect(false, LGW_DEFAULT_NOTCH_FREQ); /* FPGA reset/configure */ + if(x != 0) { + printf("ERROR: Failed to connect to FPGA\n"); + return EXIT_FAILURE; + } + /* Some spectral scan options are only available when there is no LBT support */ + x = lgw_fpga_reg_w(LGW_FPGA_HISTO_NB_READ, rssi_pts-1); + if( x != LGW_REG_SUCCESS ) + { + printf( "ERROR: Failed to configure FPGA\n" ); + return EXIT_FAILURE; + } + + /* Initialize frequency */ + freq_reg = ((uint64_t)start_freq << 19) / (uint64_t)32000000; + lgw_fpga_reg_w(LGW_FPGA_HISTO_SCAN_FREQ, (int32_t)freq_reg); } /* create log file */ strcat(log_file_name,".csv"); log_file = fopen(log_file_name, "w"); - if (log_file == NULL) - { - printf( "ERROR: impossible to create log file %s\n", log_file_name ); + if (log_file == NULL) { + printf("ERROR: impossible to create log file %s\n", log_file_name); return EXIT_FAILURE; } - printf( "Writing to file: %s\n", log_file_name ); + printf("Writing to file: %s\n", log_file_name); /* Number of frequency steps */ - freq_nb = (int)( (stop_freq - start_freq) / step_freq ) + 1; - printf( "Scanning frequencies:\nstart: %d Hz\nstop : %d Hz\nstep : %d Hz\nnb : %d\n", start_freq, stop_freq, step_freq, freq_nb ); + freq_nb = (int)((stop_freq - start_freq) / step_freq) + 1; + printf("Scanning frequencies:\nstart: %d Hz\nstop : %d Hz\nstep : %d Hz\nnb : %d\n", start_freq, stop_freq, step_freq, freq_nb); /* Main loop */ - for( j = 0; j < freq_nb; j++ ) - { + for(j = 0; j < freq_nb; j++) { /* Current frequency */ freq = start_freq + j * step_freq; - printf( "%d", freq ); + printf("%d", freq); - /* Set SX127x */ - x = lgw_setup_sx127x( freq, MOD_LORA ); - if( x != 0 ) - { - printf( "ERROR: SX127x setup failed\n" ); - return EXIT_FAILURE; + if (lbt_support == false) { + /* Set SX127x */ + x = lgw_setup_sx127x(freq, MOD_FSK, channel_bw_khz, rssi_offset); + if( x != 0 ) + { + printf( "ERROR: SX127x setup failed\n" ); + return EXIT_FAILURE; + } + + /* Start FPGA state machine for spectral scal */ + lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 1); + } else { + /* Do Nothing */ + /* LBT setup has already done the necessary */ } - /* Start histogram */ - lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 1); + /* Clean histogram */ + lgw_fpga_reg_w(LGW_FPGA_CTRL_CLEAR_HISTO_MEM, 1); - /* Wait until rssi_pts have been processed */ - do - { - wait_ms(1000); - lgw_fpga_reg_r(LGW_FPGA_FPGA_STATUS, ®_val); + /* Wait for histogram clean to start */ + do { + wait_ms(10); + lgw_fpga_reg_r(LGW_FPGA_STATUS, ®_val); + } + while((TAKE_N_BITS_FROM((uint8_t)reg_val, 0, 5)) != 1); /* Clear has started */ + + /* Set scan frequency during clear process */ + if (lbt_support == false) { + /* We can directly set the scan frequency */ + freq_reg = ((uint64_t)freq << 19) / (uint64_t)32000000; + lgw_fpga_reg_w(LGW_FPGA_HISTO_SCAN_FREQ, (int32_t)freq_reg); + } else { + /* The possible scan frequencies are hard-coded in FPGA, we give an offset from init_freq */ + freq_idx = (freq - init_freq) / LBT_MIN_STEP_FREQ; + printf(" (idx=%i) ", freq_idx); + lgw_fpga_reg_w(LGW_FPGA_SCAN_FREQ_OFFSET, freq_idx); } - while( (reg_val & 0x0F) != 8 ); - /* Stop histogram */ - lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 0); + /* Release FPGA state machine */ + lgw_fpga_reg_w(LGW_FPGA_CTRL_CLEAR_HISTO_MEM, 0); + + /* Wait for histogram ready */ + do { + wait_ms(1000); + lgw_fpga_reg_r(LGW_FPGA_STATUS, ®_val); + } + while((TAKE_N_BITS_FROM((uint8_t)reg_val, 5, 1)) != 1); + + if (lbt_support == false) { + /* Stop FPGA state machine for spectral scan */ + lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 0); + } else { + /* Do Nothing */ + /* LBT is running */ + } /* Read histogram */ + lgw_fpga_reg_w(LGW_FPGA_CTRL_ACCESS_HISTO_MEM, 1); /* HOST gets access to FPGA RAM */ lgw_fpga_reg_w(LGW_FPGA_HISTO_RAM_ADDR, 0); lgw_fpga_reg_rb(LGW_FPGA_HISTO_RAM_DATA, read_burst, RSSI_RANGE*2); + lgw_fpga_reg_w(LGW_FPGA_CTRL_ACCESS_HISTO_MEM, 0); /* FPGA gets access to RAM back */ - fprintf( log_file, "%d", freq ); + /* Write data to CSV */ + fprintf(log_file, "%d", freq); rssi_cumu = 0; k = 0; - for( i = 0; i < RSSI_RANGE; i++ ) - { + for (i = 0; i < RSSI_RANGE; i++) { rssi_histo = (uint16_t)read_burst[2*i] | ((uint16_t)read_burst[2*i+1] << 8); - fprintf(log_file, ",%d,%d", i+RSSI_OFFSET, rssi_histo); + fprintf(log_file, ",%.1f,%d", -i/2.0, rssi_histo); rssi_cumu += rssi_histo; - if( rssi_cumu > rssi_thresh[k]*rssi_pts ) - { - printf( " %d%%<%4d", (uint16_t)(rssi_thresh[k]*100), i+RSSI_OFFSET ); + if (rssi_cumu > rssi_pts) { + printf(" - WARNING: number of RSSI points higher than expected (%u,%u)", rssi_cumu, rssi_pts); + rssi_cumu = rssi_pts; + } + if (rssi_cumu > rssi_thresh[k]*rssi_pts) { + printf(" %d%%<%.1f", (uint16_t)(rssi_thresh[k]*100), -i/2.0); k++; } } - fprintf( log_file, "\n" ); - printf( "\n" ); + fprintf(log_file, "\n"); + printf("\n"); } - fclose( log_file ); + fclose(log_file); /* Close SPI */ - x = lgw_disconnect( ); - if( x != 0 ) - { - printf( "ERROR: Failed to disconnect FPGA\n" ); + x = lgw_disconnect(); + if(x != 0) { + printf("ERROR: Failed to disconnect FPGA\n"); return EXIT_FAILURE; } - printf( "+++ Exiting Spectral scan program +++\n" ); + printf("+++ Exiting Spectral scan program +++\n"); return EXIT_SUCCESS; } diff --git a/util_spi_stress/src/util_spi_stress.c b/util_spi_stress/src/util_spi_stress.c index ba0d811b..6cc5f049 100644 --- a/util_spi_stress/src/util_spi_stress.c +++ b/util_spi_stress/src/util_spi_stress.c @@ -43,9 +43,10 @@ Maintainer: Sylvain Miermont /* -------------------------------------------------------------------------- */ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ -#define VERS 103 -#define READS_WHEN_ERROR 16 /* number of times a read is repeated if there is a read error */ -#define BUFF_SIZE 1024 /* maximum number of bytes that we can write in sx1301 RX data buffer */ +#define VERS 103 +#define READS_WHEN_ERROR 16 /* number of times a read is repeated if there is a read error */ +#define BUFF_SIZE 1024 /* maximum number of bytes that we can write in sx1301 RX data buffer */ +#define DEFAULT_TX_NOTCH_FREQ 129E3 /* -------------------------------------------------------------------------- */ /* --- PRIVATE VARIABLES (GLOBAL) ------------------------------------------- */ @@ -139,7 +140,7 @@ int main(int argc, char **argv) sigaction(SIGTERM, &sigact, NULL); /* start SPI link */ - i = lgw_connect(); + i = lgw_connect(false, DEFAULT_TX_NOTCH_FREQ); if (i != LGW_REG_SUCCESS) { MSG("ERROR: lgw_connect() did not return SUCCESS"); return EXIT_FAILURE; diff --git a/util_tx_continuous/src/util_tx_continuous.c b/util_tx_continuous/src/util_tx_continuous.c index 31f45ac9..b081cce5 100644 --- a/util_tx_continuous/src/util_tx_continuous.c +++ b/util_tx_continuous/src/util_tx_continuous.c @@ -58,6 +58,7 @@ Maintainer: Matthieu Leurent #define DEFAULT_BR_KBPS 50 #define DEFAULT_FDEV_KHZ 25 #define DEFAULT_BT 2 +#define DEFAULT_NOTCH_FREQ 129000U /* -------------------------------------------------------------------------- */ /* --- GLOBAL VARIABLES ----------------------------------------------------- */ @@ -93,6 +94,7 @@ int main(int argc, char **argv) {"br", 1, 0, 0}, {"fdev", 1, 0, 0}, {"bt", 1, 0, 0}, + {"notch", 1, 0, 0}, {0, 0, 0, 0} }; unsigned int arg_u; @@ -111,6 +113,7 @@ int main(int argc, char **argv) float br_kbps = DEFAULT_BR_KBPS; uint8_t fdev_khz = DEFAULT_FDEV_KHZ; uint8_t bt = DEFAULT_BT; + uint32_t tx_notch_freq = DEFAULT_NOTCH_FREQ; int32_t offset_i, offset_q; @@ -129,19 +132,20 @@ int main(int argc, char **argv) printf("~~~ Library version string~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf(" %s\n", lgw_version_info()); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); - printf(" -f Tx RF frequency in MHz [800:1000]\n"); - printf(" -r Radio type (SX1255:1255, SX1257:1257)\n"); - printf(" --dig Digital gain trim, [0:3]\n"); + printf(" -f Tx RF frequency in MHz [800:1000]\n"); + printf(" -r Radio type (SX1255:1255, SX1257:1257)\n"); + printf(" --notch Tx notch filter frequency in KhZ [126..250]\n"); + printf(" --dig Digital gain trim, [0:3]\n"); printf(" 0:1, 1:7/8, 2:3/4, 3:1/2\n"); - printf(" --mix Radio Tx mixer gain trim, [0:15]\n"); + printf(" --mix Radio Tx mixer gain trim, [0:15]\n"); printf(" 15 corresponds to maximum gain, 1 LSB corresponds to 2dB step\n"); - printf(" --pa PA gain trim, [0:3]\n"); - printf(" --mod Modulation type ['LORA','FSK','CW']\n"); - printf(" --sf LoRa Spreading Factor, [7:12]\n"); - printf(" --bw LoRa bandwidth in kHz, [125,250,500]\n"); - printf(" --br FSK bitrate in kbps, [0.5:250]\n"); - printf(" --fdev FSK frequency deviation in kHz, [1:250]\n"); - printf(" --bt FSK gaussian filter BT trim, [0:3]\n"); + printf(" --pa PA gain trim, [0:3]\n"); + printf(" --mod Modulation type ['LORA','FSK','CW']\n"); + printf(" --sf LoRa Spreading Factor, [7:12]\n"); + printf(" --bw LoRa bandwidth in kHz, [125,250,500]\n"); + printf(" --br FSK bitrate in kbps, [0.5:250]\n"); + printf(" --fdev FSK frequency deviation in kHz, [1:250]\n"); + printf(" --bt FSK gaussian filter BT trim, [0:3]\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); return EXIT_SUCCESS; break; @@ -248,6 +252,16 @@ int main(int argc, char **argv) bt = (uint8_t)arg_u; } } + else if (strcmp(long_options[option_index].name,"notch") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || ((arg_u < 126) || (arg_u > 250))) { + printf("ERROR: argument parsing of --notch argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + tx_notch_freq = (uint32_t)arg_u * 1000U; + } + } else { printf("ERROR: argument parsing options. Use -h to print help\n"); return EXIT_FAILURE; @@ -307,6 +321,7 @@ int main(int argc, char **argv) rfconf.rssi_offset = DEFAULT_RSSI_OFFSET; rfconf.type = radio_type; rfconf.tx_enable = true; + rfconf.tx_notch_freq = tx_notch_freq; lgw_rxrf_setconf(TX_RF_CHAIN, rfconf); /* Tx gain LUT */ diff --git a/util_tx_test/src/util_tx_test.c b/util_tx_test/src/util_tx_test.c index e27b7872..74c163fd 100644 --- a/util_tx_test/src/util_tx_test.c +++ b/util_tx_test/src/util_tx_test.c @@ -35,6 +35,7 @@ Maintainer: Sylvain Miermont #include /* getopt_long */ #include "loragw_hal.h" +#include "loragw_reg.h" #include "loragw_aux.h" /* -------------------------------------------------------------------------- */ @@ -46,11 +47,13 @@ Maintainer: Sylvain Miermont /* -------------------------------------------------------------------------- */ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ -#define TX_RF_CHAIN 0 /* TX only supported on radio A */ -#define DEFAULT_RSSI_OFFSET 0.0 -#define DEFAULT_MODULATION "LORA" -#define DEFAULT_BR_KBPS 50 -#define DEFAULT_FDEV_KHZ 25 +#define TX_RF_CHAIN 0 /* TX only supported on radio A */ +#define DEFAULT_RSSI_OFFSET 0.0 +#define DEFAULT_MODULATION "LORA" +#define DEFAULT_BR_KBPS 50 +#define DEFAULT_FDEV_KHZ 25 +#define DEFAULT_NOTCH_FREQ 129000U /* 129 kHz */ +#define DEFAULT_SX127X_RSSI_OFFSET -4 /* dB */ /* -------------------------------------------------------------------------- */ /* --- PRIVATE VARIABLES (GLOBAL) ------------------------------------------- */ @@ -125,6 +128,7 @@ void usage(void) { printf("Available options:\n"); printf(" -h print this help\n"); printf(" -r radio type (SX1255:1255, SX1257:1257)\n"); + printf(" -n TX notch filter frequency in kHz [126..250]\n"); printf(" -f target frequency in MHz\n"); printf(" -k concentrator clock source (0:Radio A, 1:Radio B)\n"); printf(" -m modulation type ['LORA', 'FSK']\n"); @@ -143,11 +147,11 @@ void usage(void) { printf(" -i send packet using inverted modulation polarity\n"); printf(" -t pause between packets (ms)\n"); printf(" -x nb of times the sequence is repeated (-1 loop until stopped)\n"); - printf(" --lbt-freq lbt first channel frequency in MHz\n"); - printf(" --lbt-sctm lbt scan time in usec\n"); - printf(" --lbt-max lbt max tx duration in usec\n"); - printf(" --lbt-rssi lbt rssi target (to be divided by -2)\n"); - printf(" --lbt-nbch lbt nb channel\n"); + printf(" --lbt-freq lbt first channel frequency in MHz\n"); + printf(" --lbt-nbch lbt number of channels [1..8]\n"); + printf(" --lbt-sctm lbt scan time in usec to be applied to all channels [128, 5000]\n"); + printf(" --lbt-rssi lbt rssi target in dBm [-128..0]\n"); + printf(" --lbt-rssi-offset rssi offset in dB to be applied to SX127x RSSI [-128..127]\n"); } /* -------------------------------------------------------------------------- */ @@ -181,10 +185,12 @@ int main(int argc, char **argv) uint8_t fdev_khz = DEFAULT_FDEV_KHZ; bool lbt_enable = false; uint32_t lbt_f_target = 0; - uint32_t lbt_tx_max_time = 4000000; uint32_t lbt_sc_time = 5000; - uint8_t lbt_rssi_target = 160; + int8_t lbt_rssi_target_dBm = -80; + int8_t lbt_rssi_offset_dB = DEFAULT_SX127X_RSSI_OFFSET; uint8_t lbt_nb_channel = 1; + uint32_t sx1301_count_us; + uint32_t tx_notch_freq = DEFAULT_NOTCH_FREQ; /* RF configuration (TX fail if RF chain is not enabled) */ enum lgw_radio_type_e radio_type = LGW_RADIO_TYPE_NONE; @@ -204,14 +210,14 @@ int main(int argc, char **argv) static struct option long_options[] = { {"lbt-freq", required_argument, 0, 0}, {"lbt-sctm", required_argument, 0, 0}, - {"lbt-max", required_argument, 0, 0}, {"lbt-rssi", required_argument, 0, 0}, {"lbt-nbch", required_argument, 0, 0}, + {"lbt-rssi-offset", required_argument, 0, 0}, {0, 0, 0, 0} }; /* parse command line options */ - while ((i = getopt_long (argc, argv, "hif:m:b:s:c:p:l:z:t:x:r:k:d:q:", long_options, &option_index)) != -1) { + while ((i = getopt_long (argc, argv, "hif:n:m:b:s:c:p:l:z:t:x:r:k:d:q:", long_options, &option_index)) != -1) { switch (i) { case 'h': usage(); @@ -229,6 +235,17 @@ int main(int argc, char **argv) } break; + case 'n': /* TX notch filter frequency in kHz */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || ((xi < 126) || (xi > 250))) { + MSG("ERROR: invalid TX notch filter frequency\n"); + usage(); + return EXIT_FAILURE; + } else { + tx_notch_freq = xi*1000; + } + break; + case 'm': /* Modulation type */ i = sscanf(optarg, "%s", arg_s); if ((i != 1) || ((strcmp(arg_s,"LORA") != 0) && (strcmp(arg_s,"FSK")))) { @@ -410,42 +427,42 @@ int main(int argc, char **argv) } else if( strcmp(long_options[option_index].name, "lbt-rssi") == 0 ) { /* LBT RSSI target */ if (lbt_enable == true) { i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 0)) { + if ((i != 1) || ((xi < -128) && (xi > 0))) { MSG("ERROR: invalid LBT RSSI target\n"); usage(); return EXIT_FAILURE; } else { - lbt_rssi_target = xi; + lbt_rssi_target_dBm = xi; } } else { MSG("ERROR: invalid parameter, LBT start frequency must be set\n"); usage(); return EXIT_FAILURE; } - } else if( strcmp(long_options[option_index].name, "lbt-nbch") == 0 ) { /* LBT number of channels */ + } else if( strcmp(long_options[option_index].name, "lbt-rssi-offset") == 0 ) { /* LBT RSSI offset */ if (lbt_enable == true) { i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 0)) { - MSG("ERROR: invalid LBT number of channels\n"); + if ((i != 1) || ((xi < -128) && (xi > 127))) { + MSG("ERROR: invalid LBT RSSI offset\n"); usage(); return EXIT_FAILURE; } else { - lbt_nb_channel = xi; + lbt_rssi_offset_dB = xi; } } else { MSG("ERROR: invalid parameter, LBT start frequency must be set\n"); usage(); return EXIT_FAILURE; } - } else if( strcmp(long_options[option_index].name, "lbt-max") == 0 ) { /* LBT max tx duration in usec */ + } else if( strcmp(long_options[option_index].name, "lbt-nbch") == 0 ) { /* LBT number of channels */ if (lbt_enable == true) { i = sscanf(optarg, "%i", &xi); if ((i != 1) || (xi < 0)) { - MSG("ERROR: invalid LBT max TX duration\n"); + MSG("ERROR: invalid LBT number of channels\n"); usage(); return EXIT_FAILURE; } else { - lbt_tx_max_time = xi; + lbt_nb_channel = xi; } } else { MSG("ERROR: invalid parameter, LBT start frequency must be set\n"); @@ -497,12 +514,15 @@ int main(int argc, char **argv) if (lbt_enable) { memset(&lbtconf, 0, sizeof(lbtconf)); lbtconf.enable = true; - lbtconf.rssi_target = lbt_rssi_target; - lbtconf.scan_time_us = lbt_sc_time; lbtconf.nb_channel = lbt_nb_channel; - lbtconf.start_freq = lbt_f_target; - lbtconf.tx_delay_1ch_us = lbt_tx_max_time; - lbtconf.tx_delay_2ch_us = lbt_tx_max_time; + lbtconf.rssi_target = lbt_rssi_target_dBm; + lbtconf.rssi_offset = lbt_rssi_offset_dB; + lbtconf.channels[0].freq_hz = lbt_f_target; + lbtconf.channels[0].scan_time_us = lbt_sc_time; + for (i=1; i> 8); /* MSB */ txpkt.payload[5] = (uint8_t)(cycle_count & 0x00FF); /* LSB */ + /* When LBT is enabled, immediate send is not allowed, so we need + to set a timestamp to the packet */ + if (lbt_enable == true) { + /* Get the current SX1301 time */ + lgw_reg_w(LGW_GPS_EN, 0); + lgw_get_trigcnt(&sx1301_count_us); + lgw_reg_w(LGW_GPS_EN, 1); + + /* Set packet timestamp to current time + few milliseconds */ + txpkt.count_us = sx1301_count_us + 50E3; + } + /* send packet */ printf("Sending packet number %u ...", cycle_count); i = lgw_send(txpkt); /* non-blocking scheduling of TX packet */